36 . IFLOW, IBUF, ELEM, IBUFL, SHELL_GA, CNP,
37 . RFLOW, NORMAL, TA, AREAF, COSG, DIST,
38 . MFLE, ACCF, PM, PTI, X, V, A, NPC, TF,
39 . NBGAUGE,LGAUGE, GAUGE, NSENSOR, SENSOR_TAB, IGRV, AGRV,
40 . CBEM ,IPIV_L, MFLE_L,IBUFELR, IBUFELC,NFUNCT,
50#include "implicit_f.inc"
60 INTEGER NDIM, NNO, NEL, NBGAUGE, NSENSOR, ,NFUNCT
61 INTEGER IFLOW(*), IBUF(*), ELEM(NDIM,*), SHELL_GA(*), NPC(*), LGAUGE(3,*)
62 INTEGER IBUFL(*), CNP(*), IGRV(NIGRV,*)
63 INTEGER IPIV_L(*), IBUFELR(NEL), IBUFELC(NEL)
64 my_real X(3,*), V(3,*), A(3,*), TF(*), RFLOW(*)
65 my_real NORMAL(3,*), TA(*), AREAF(*), COSG(*), DIST(*), PM(*), ACCF(*), PTI(*)
66 my_real mfle(nel,*), gauge(llgauge,*), agrv(lfacgrv,*)
67 my_real cbem(nel,*), mfle_l(nel_loc,*)
68 TYPE (SENSOR_STR_) ,
DIMENSION(NSENSOR) :: SENSOR_TAB
69 TYPE (PYTHON_),
INTENT(INOUT) :: PYTHON
70 DOUBLE PRECISION,
INTENT(INOUT) :: WFEXT
74 INTEGER I, J, K, L, I1, I2, I3, I4, I5, N1, N2, N3, N4, II, JJ, KK
75 INTEGER IFPRES, JFORM, KFORM, IPRES, IWAVE, INTEGR, FREESURF, AFTERFLOW
76 INTEGER GRAV_ID, IFUNC, ISENS, LENBUF, NNO_L, NEL_L, NELMAX, INFO,ISMOOTH
78 INTEGER NBLOC, NPROW, NPCOL, ICTXT, DESCA(9), DESCB(9), MYROW, MYCOL, MXLLDM, NUMROC
80 my_real x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4,
81 . x0, y0, z0, x12, y12, z12, x13, y13, z13, x24, y24, z24,
82 . nrx, nry, nrz, area2, wf(2), wi(4,2),
83 . pm1, dsc, vx0, vy0, vz0
84 my_real rho, ssp, rhoc, tta, dydx, ff, sfpres, dppdt, pmax, theta,
norm, fac1, ts, gravity
85 my_real dirwix, dirwiy, dirwiz, dirwrx, dirwry, dirwrz
86 my_real off(nel), pp(nel), vi(nel), ps(nel), fel(nel), pr(nel), vr(nel)
87 my_real dpidt(nel), dprdt(nel), dpmdt(nel), hh(nel)
88 my_real xa, ya, za, fcx, fcy, pmin, ptot
89 my_real apmax, atheta, ratio
90 my_real finter,finter_smooth
91 EXTERNAL finter,finter_smooth
92 my_real vect(nel), vect1(nel), vel(nel)
93 my_real xl(3,nno), vl(3,nno)
94 my_real,
ALLOCATABLE :: sbuf(:), rbuf(:)
96#if defined(MPI) && defined(MYREAL8) && !defined(WITHOUT_LINALG)
100 ALLOCATE(sbuf(lenbuf), rbuf(lenbuf))
107 sbuf(kk+1)=x(1,jj)/cnp(ii)
108 sbuf(kk+2)=x(2,jj)/cnp(ii)
109 sbuf(kk+3)=x(3,jj)/cnp(ii)
110 sbuf(kk+4)=v(1,jj)/cnp(ii)
111 sbuf(kk+5)=v(2,jj)/cnp(ii)
112 sbuf(kk+6)=v(3,jj)/cnp(ii)
126 DEALLOCATE(sbuf, rbuf)
137 afterflow = iflow(26)
175 area2 = sqrt(nrx**2+nry**2+nrz**2)
176 normal(1,i) = nrx/area2
177 normal(2,i) = nry/area2
178 normal(3,i) = nrz/area2
179 areaf(i) = half*area2
182 x0=third*x1+third*x2+third*x3
183 y0=third*y1+third*y2+third*y3
184 z0=third*z1+third*z2+third*z3
188 norm=sqrt(dirwix**2+dirwiy**2+dirwiz**2)
192 IF(freesurf == 2)
THEN
196 norm=sqrt(dirwrx**2+dirwry**2+dirwrz**2)
200 cosg(i+nel)=normal(1,i)*dirwrx+normal(2,i)*dirwry+normal(3,i)*dirwrz
205 hh(i)=
max(zero,(xa-x0)*rflow(19)+(ya-y0)*rflow(20)+(za-z0)*rflow(21))
207 ELSEIF(iwave == 2)
THEN
215 cosg(i)=normal(1,i)*dirwix+normal(2,i)*dirwiy+normal(3,i)*dirwiz
217 vx0 = third*vl(1,i1)+third*vl(1,i2)+third*vl(1,i3)
218 vy0 = third*vl(2,i1)+third*vl(2,i2)+third*vl(2,i3)
219 vz0 = third*vl(3,i1)+third*vl(3,i2)+third*vl(3,i3)
220 vel(i) = vx0*normal(1,i)+vy0*normal(2,i)+vz0*normal(3,i)
222 ELSEIF(jform == 2)
THEN
258 area2 = sqrt(nrx**2+nry**2+nrz**2)
259 normal(1,i) = nrx/area2
260 normal(2,i) = nry/area2
261 normal(3,i) = nrz/area2
262 areaf(i) = half*area2
265 x0=wi(1,i5)*x1+wi(2,i5)*x2+wi(3,i5)*x3+wi(4,i5)*x4
266 y0=wi(1,i5)*y1+wi(2,i5)*y2+wi(3,i5)*y3+wi(4,i5)*y4
267 z0=wi(1,i5)*z1+wi(2,i5)*z2+wi(3,i5)*z3+wi(4,i5)*z4
271 norm=sqrt(dirwix**2+dirwiy**2+dirwiz**2)
275 IF(freesurf == 2)
THEN
279 norm=sqrt(dirwrx**2+dirwry**2+dirwrz**2)
283 cosg(i+nel)=normal(1,i)*dirwrx+normal(2,i)*dirwry+normal
288 hh(i)=
max(zero,(xa-x0)*rflow(19)+(ya-y0)*rflow(20)+(za-z0)*rflow(21))
290 ELSEIF(iwave == 2)
THEN
298 cosg(i)=normal(1,i)*dirwix+normal(2,i)*dirwiy+normal(3,i)*dirwiz
300 vx0 = wi(1,i5)*vl(1,i1)+wi(2,i5)*vl(1,i2)+wi(3,i5)*vl(1,i3)+wi(4,i5)*vl(1,i4)
301 vy0 = wi(1,i5)*vl(2,i1)+wi(2,i5)*vl(2,i2)+wi(3,i5)*vl(2,i3)+wi(4,i5)*vl(2,i4)
302 vz0 = wi(1,i5)*vl(3,i1)+wi(2,i5)*vl(3,i2)+wi(3,i5)*vl(3,i3)+wi(4,i5)*vl(3,i4)
303 vel(i) = vx0*normal(1,i)+vy0*normal(2,i)+vz0*normal(3,i)
313 IF(tta > zero) off(i) = one
320 pmax = rflow(6)*ratio**apmax
321 theta = rflow(7)*ratio**atheta
322 pp(i) = pmax*exp(-tta/theta)*off(i)
323 dpidt(i) = -pp(i)*cosg(i)/theta
325 ELSEIF(iwave == 2)
THEN
330 pp(i) = pmax*exp(-tta/theta)*off(i)
331 dpidt(i) = -pp(i)*cosg(i)/theta
334 ELSEIF(ipres == 2)
THEN
342 ismooth = npc(2*nfunct+ifpres+1)
344 IF (ismooth == 0)
THEN
345 pp(i) = sfpres*finter(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
346 ELSE IF(ismooth > 0)
THEN
347 pp(i) = sfpres*finter_smooth(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
350 CALL python_call_funct1d(python, ismooth,tta,pp(i))
351 pp(i) = pp(i)*sfpres*ratio*off(i)
352 CALL python_deriv_funct1d(python, ismooth,tta,dppdt)
354 dpidt(i) = dppdt*cosg(i)*ratio*off(i)
356 pp(i) = sfpres*ratio*off(i)
360 ELSEIF(iwave == 2)
THEN
364 ismooth = npc(2*nfunct+ifpres+1)
366 IF (ismooth == 0)
THEN
367 pp(i) = sfpres*finter(ifpres,tta,npc,tf,dppdt)*off(i)
368 ELSE IF (ismooth > 0)
THEN
369 pp(i) = sfpres*finter_smooth(ifpres,tta,npc,tf,dppdt)*off(i)
372 CALL python_call_funct1d(python, ismooth,tta,pp(i))
373 pp(i) = pp(i)*sfpres*off(i)
374 CALL python_deriv_funct1d(python, ismooth,tta,dppdt)
376 dpidt(i) = dppdt*cosg(i)*off(i)
378 pp(i) = sfpres*off(i)
388 vi(i)=pp(i)*cosg(i)/rhoc
390 IF(afterflow == 2)
THEN
396 pmax = rflow(6)*ratio**apmax
397 theta = rflow(7)*ratio**atheta
398 vi(i) = vi(i) + (pmax-pp(i))*cosg(i)*theta/(rho*dist(i))
400 ELSEIF(ipres == 2)
THEN
402 pti(i) = pti(i) + pp(i)*dt1
403 vi(i) = vi(i) + pti(i)*cosg(i)/(rho*dist(i))
411 IF(freesurf == 2)
THEN
415 IF(tta > zero) off(i) = one
422 pmax = rflow(6)*ratio**apmax
423 theta = rflow(7)*ratio**atheta
424 pr(i) = -pmax*exp(-tta/theta)*off(i)
425 dprdt(i) = -pr(i)*cosg(j)/theta
427 ELSEIF(ipres == 2)
THEN
433 ismooth = npc(2*nfunct+ifpres+1)
435 IF (ismooth == 0)
THEN
436 pr(i) = -sfpres*finter(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
437 ELSE IF (ismooth > 0)
THEN
438 pr(i) = -sfpres*finter_smooth(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
441 CALL python_call_funct1d(python, ismooth,tta,pr(i))
442 pr(i) = -pr(i)*sfpres*ratio*off(i)
443 CALL python_deriv_funct1d(python, ismooth,tta,dppdt)
445 dprdt(i) = dppdt*cosg(j)*off(i)
447 pr(i) = -sfpres*ratio*off(i)
456 vr(i)=pr(i)*cosg(i+nel)/rhoc
470 IF(nel < nelmax)
THEN
472 dpmdt(i) = rhoc*accf(i)
473 vect(i) = rhoc*areaf(i)*(pm(i)-rhoc*(vi(i)+vr(i)))
475 vect(1:nel) = matmul(mfle(1:nel, 1:nel), vect(1:nel))
477 dpmdt(i) = dpmdt(i) - vect(i)
481 pm(i) = pm(i) + dpmdt(i)*dt1
482 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
485 ELSEIF(integr == 2)
THEN
488 ps(i) = pm(i) + dpmdt(i)*dt1*half - rhoc*(vi(i)+vr(i))
492 dpmdt(i) = rhoc*accf(i)
493 vect(i) = rhoc*areaf(i)*ps(i)
495 vect(1:nel) = matmul(mfle(1:nel, 1:nel), vect(1:nel))
497 dpmdt(i) = dpmdt(i) - vect(i)
500 pm(i) = pm(i) + dpmdt(i)*dt1
501 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
507 CALL sl_init(ictxt, nprow, npcol)
511 CALL descinit(desca, nel, nel, nbloc, nbloc, 0, 0, ictxt, mxlldm, info)
512 CALL descinit(descb, nel, 1, nbloc, nbloc, 0, 0, ictxt, mxlldm, info)
518 IF(ibufelr(i) == 0) cycle
522 IF(ibufelc(j) == 0) cycle
524 mfle_l(k,l) = mfle(i,j)
528 CALL pdgetrf(nel, nel, mfle_l, 1, 1, desca, ipiv_l, info)
532 vect(i) = two*ssp*(rhoc*(vi(i)+vr(i))-pm(i))
534 CALL dgemv(
'T',nel, nel, one, cbem, nel, vect, 1, zero, vect1, 1)
537 IF(ibufelc(1) > 0)
THEN
540 IF(ibufelr(i) == 0) cycle
547 CALL pdgetrs(
'N', nel, 1, mfle_l, 1, 1, desca, ipiv_l, vect, 1, 1, descb, info
550 ALLOCATE(sbuf(nel), rbuf(nel))
553 IF(ibufelc(1) > 0)
THEN
556 IF(ibufelr(i) == 0) cycle
566 vect1(1:nel) = matmul(cbem(1:nel,1:nel), vect(1:nel))
568 IF(pp(i) /= zero)
THEN
569 dpmdt(i) = rhoc*accf(i) + vect(i)
576 DEALLOCATE(sbuf, rbuf)
578 pm(i) = pm(i) + dpmdt(i)*dt1
579 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
582 ELSEIF(integr == 2)
THEN
585 ps(i) = pm(i) + dpmdt(i)*dt1*half - rhoc*(vi(i)+vr(i))
589 vect(i) = -two*ssp*ps(i)
591 CALL dgemv(
'T',nel, nel, one, cbem, nel, vect, 1, zero, vect1, 1)
593 IF(ibufelc(1) > 0)
THEN
596 IF(ibufelr(i) == 0) cycle
603 CALL pdgetrs(
'N', nel, 1, mfle_l, 1, 1, desca, ipiv_l, vect, 1, 1, descb, info)
607 IF(ibufelc(1) > 0)
THEN
610 IF(ibufelr(i) == 0) cycle
619 DEALLOCATE(sbuf, rbuf)
621 vect1(1:nel) = matmul(cbem(1:nel,1:nel), vect(1:nel))
623 dpmdt(i) = rhoc*accf(i) + vect1(i)
626 pm(i) = pm(i) + dpmdt(i)*dt1
627 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
634 ELSEIF(kform == 2)
THEN
637 dpmdt(i) = rhoc*accf(i)
640 pm(i) = pm(i) + dpmdt(i)*dt1
641 ps(i) = pm(i) - rhoc*vi(i)
644 ELSEIF(kform == 3)
THEN
649 ps(i) = ps(i) + mfle(i,j)*(accf(j)-(dpidt(j)+dprdt(j))/rhoc)
651 ps(i) = ps(i)/areaf(i)
659 fcy = agrv(1,grav_id)
660 fcx = agrv(2,grav_id)
661 ifunc = igrv(3,grav_id)
664 IF(igrv(6,grav_id) == sensor_tab(k)%SENS_ID) isens=k
669 ts = tt-sensor_tab(isens)%TSTART
673 ismooth = npc(2*nfunct+ifunc+1)
675 IF (ismooth == 0)
THEN
676 gravity = fcy*finter(ifunc,ts*fcx,npc,tf,dydx)
677 ELSE IF(ismooth > 0)
THEN
678 gravity = fcy*finter_smooth(ifunc,ts*fcx,npc,tf,dydx)
681 CALL python_call_funct1d(python, ismooth,tta,gravity)
682 gravity = gravity*fcy
692 ptot = pp(i)+ps(i)+pr(i)+rho*hh(i)*abs(gravity)
693 fel(i) = areaf(i)*
max(ptot,pmin)
705 IF(n1/=0.OR.n2/=0.OR.n3/=0)
THEN
721 ff = fac1*third*fel(i)
723 a(1,n1) = a(1,n1) + ff*nrx
724 a(2,n1) = a(2,n1) + ff*nry
725 a(3,n1) = a(3,n1) + ff*nrz
726 wfext = wfext+ff*dt1*(nrx*v(1,n1)+nry*v(2,n1)+nrz*v(3,n1))/cnp(i1)
729 a(1,n2) = a(1,n2) + ff*nrx
730 a(2,n2) = a(2,n2) + ff*nry
731 a(3,n2) = a(3,n2) + ff*nrz
732 wfext = wfext+ff*dt1*(nrx*v(1,n2)+nry*v(2,n2)+nrz*v(3,n2))/cnp(i2)
735 a(1,n3) = a(1,n3) + ff*nrx
736 a(2,n3) = a(2,n3) + ff*nry
737 a(3,n3) = a(3,n3) + ff*nrz
738 wfext = wfext+ff*dt1*(nrx*v(1,n3)+nry*v(2,n3)+nrz*v(3,n3))/cnp(i3)
741 ELSEIF(jform == 2)
THEN
752 IF(n1/=0.OR.n2/=0.OR.n3/=0.OR.n4/=0)
THEN
775 a(1,n1) = a(1,n1) + ff*nrx
776 a(2,n1) = a(2,n1) + ff*nry
777 a(3,n1) = a(3,n1) + ff*nrz
778 wfext = wfext+ff*dt1*(nrx*v(1,n1)+nry*v(2,n1)+nrz*v(3,n1))/cnp(i1)
781 a(1,n2) = a(1,n2) + ff*nrx
782 a(2,n2) = a(2,n2) + ff*nry
783 a(3,n2) = a(3,n2) + ff*nrz
784 wfext = wfext+ff*dt1*(nrx*v(1,n2)+nry*v(2,n2)+nrz*v(3,n2))/cnp(i2)
787 a(1,n3) = a(1,n3) + ff*nrx
788 a(2,n3) = a(2,n3) + ff*nry
789 a(3,n3) = a(3,n3) + ff*nrz
790 wfext = wfext+ff*dt1*(nrx*v(1,n3)+nry*v(2,n3)+nrz*v(3,n3))/cnp(i3)
792 IF(n4/=0.AND.i5==1)
THEN
793 a(1,n4) = a(1,n4) + ff*nrx
794 a(2,n4) = a(2,n4) + ff*nry
795 a(3,n4) = a(3,n4) + ff*nrz
796 wfext = wfext+ff*dt1*(nrx*v(1,n4)+nry*v(2,n4)+nrz*v(3,n4))/cnp(i4)
806 IF(lgauge(1,i) == 0 .AND. lgauge(3,i) < 0 )
THEN
809 ptot=pp(i1)+ps(i1)+pr(i1)+rho*hh(i1)*abs(gravity)
810 gauge(30,i)=
max(ptot,pmin)