36 . IFLOW, IBUF, ELEM, SHELL_GA,
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 , NFUNCT, PYTHON,WFEXT)
49#include "implicit_f.inc"
59 INTEGER NDIM, NNO, NEL, NBGAUGE, NSENSOR, NFUNCT
60 INTEGER IFLOW(*), IBUF(*), ELEM(NDIM,*), SHELL_GA(*), NPC(*), LGAUGE(3,*)
61 INTEGER IGRV(NIGRV,*), IPIV(*)
62 my_real X(3,*), V(3,*), A(3,*), TF(*), RFLOW(*)
63 my_real NORMAL(3,*), TA(*), AREAF(*), COSG(*), DIST(*), PM(*), ACCF(*), PTI(*)
64 my_real mfle(nel,*), gauge(llgauge,*),agrv(lfacgrv,*)
66 TYPE (SENSOR_STR_) ,
DIMENSION(NSENSOR) :: SENSOR_TAB
67 TYPE (PYTHON_),
INTENT(INOUT) :: PYTHON
68 DOUBLE PRECISION,
INTENT(INOUT) :: WFEXT
72#if defined(MYREAL8) && !defined(WITHOUT_LINALG)
73 INTEGER I, J, K, I1, I2, I3, I4, I5, N1, N2, N3, N4, II, JJ, KK
74 INTEGER IFPRES, JFORM, KFORM, IPRES, IWAVE, INTEGR, FREESURF, AFTERFLOW
75 INTEGER GRAV_ID, IFUNC, ISENS, LENBUF, NNO_L, NEL_L, NELMAX, INFO,ISMOOTH
76 my_real X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4,
77 . X0, Y0, Z0, X12, Y12, Z12, X13, Y13, Z13, X24, Y24, Z24,
78 . nrx, nry, nrz, area2, wf(2), wi(4,2),
79 . pm1, dsc, vx0, vy0, vz0
80 my_real rho, ssp, rhoc, tta, dydx, ff, sfpres, dppdt, pmax, theta,
norm, fac1, ts, gravity
81 my_real dirwix, dirwiy, dirwiz, dirwrx, dirwry, dirwrz
82 my_real off(nel), pp(nel), vi(nel), ps(nel), fel(nel), pr(nel), vr(nel)
83 my_real dpidt(nel), dprdt(nel), dpmdt(nel), hh(nel)
84 my_real xa, ya, za, fcx, fcy, pmin, ptot
85 my_real apmax, atheta, ratio
87 my_real finter,finter_smooth
88 EXTERNAL finter,finter_smooth
89 my_real vect(nel), vect1(nel), vel(nel)
90 my_real xl(3,nno), vl(3,nno)
109 afterflow = iflow(26)
147 area2 = sqrt(nrx**2+nry**2+nrz**2)
148 normal(1,i) = nrx/area2
149 normal(2,i) = nry/area2
150 normal(3,i) = nrz/area2
151 areaf(i) = half*area2
154 x0=third*x1+third*x2+third*x3
155 y0=third*y1+third*y2+third*y3
156 z0=third*z1+third*z2+third*z3
160 norm=sqrt(dirwix**2+dirwiy**2+dirwiz**2)
164 IF(freesurf == 2)
THEN
168 norm=sqrt(dirwrx**2+dirwry**2+dirwrz**2)
172 cosg(i+nel)=normal(1,i)*dirwrx+normal(2,i)*dirwry+normal(3,i)*dirwrz
177 hh(i)=
max(zero,(xa-x0)*rflow(19)+(ya-y0)*rflow(20)+(za-z0)*rflow(21))
179 ELSEIF(iwave == 2)
THEN
187 cosg(i)=normal(1,i)*dirwix+normal(2,i)*dirwiy+normal(3,i)*dirwiz
189 vx0 = third*vl(1,i1)+third*vl(1,i2)+third*vl(1,i3)
190 vy0 = third*vl(2,i1)+third*vl(2,i2)+third*vl(2,i3)
191 vz0 = third*vl(3,i1)+third*vl(3,i2)+third*vl(3,i3)
192 vel(i) = vx0*normal(1,i)+vy0*normal(2,i)+vz0*normal(3,i)
194 ELSEIF(jform == 2)
THEN
232 normal(2,i) = nry/area2
233 normal(3,i) = nrz/area2
234 areaf(i) = half*area2
237 x0=wi(1,i5)*x1+wi(2,i5)*x2+wi(3,i5)*x3
238 y0=wi(1,i5)*y1+wi(2,i5
239 z0=wi(1,i5)*z1+wi(2,i5)*z2+wi(3,i5)*z3+wi(4,i5)*z4
243 norm=sqrt(dirwix**2+dirwiy**2+dirwiz**2)
247 IF(freesurf == 2)
THEN
251 norm=sqrt(dirwrx**2+dirwry**2+dirwrz**2)
255 cosg(i+nel)=normal(1,i)*dirwrx+normal(2,i)*dirwry+normal(3,i)*dirwrz
260 hh(i)=
max(zero,(xa-x0)*rflow(19)+(ya-y0)*rflow(20)+(za-z0)*rflow(21))
262 ELSEIF(iwave == 2)
THEN
270 cosg(i)=normal(1,i)*dirwix+normal(2,i)*dirwiy+normal(3,i)*dirwiz
272 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)
273 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)
274 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)
275 vel(i) = vx0*normal(1,i)+vy0*normal(2,i)+vz0*normal(3,i)
285 IF(tta > zero) off(i) = one
292 pmax = rflow(6)*ratio
293 theta = rflow(7)*ratio**atheta
294 pp(i) = pmax*exp(-tta/theta)*off(i)
295 dpidt(i) = -pp(i)*cosg(i)/theta
297 ELSEIF(iwave == 2)
THEN
302 pp(i) = pmax*exp(-tta/theta)*off(i)
303 dpidt(i) = -pp(i)*cosg(i)/theta
306 ELSEIF(ipres == 2)
THEN
314 ismooth = npc(2*nfunct+ifpres+1)
316 IF (ismooth == 0)
THEN
317 pp(i) = sfpres*finter(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
318 ELSE IF(ismooth > 0)
THEN
319 pp(i) = sfpres*finter_smooth(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
322 CALL python_call_funct1d(python, ismooth,tta,pp(i))
323 pp(i) = pp(i)*sfpres*ratio*off(i)
324 CALL python_deriv_funct1d(python, ismooth,tta,dppdt)
326 dpidt(i) = dppdt*cosg(i)*ratio*off(i)
328 pp(i) = sfpres*ratio*off(i)
332 ELSEIF(iwave == 2)
THEN
336 ismooth = npc(2*nfunct+ifpres+1)
338 IF (ismooth == 0)
THEN
339 pp(i) = sfpres*finter(ifpres,tta,npc,tf,dppdt)*off(i)
340 ELSE IF (ismooth > 0)
THEN
341 pp(i) = sfpres*finter_smooth(ifpres,tta,npc,tf,dppdt)*off(i)
344 CALL python_call_funct1d(python, ismooth,tta,pp(i))
345 pp(i) = pp(i)*sfpres*off(i)
346 CALL python_deriv_funct1d(python, ismooth,tta,dppdt)
348 dpidt(i) = dppdt*cosg(i)*off(i)
350 pp(i) = sfpres*off(i)
360 vi(i)=pp(i)*cosg(i)/rhoc
362 IF(afterflow == 2)
THEN
368 pmax = rflow(6)*ratio**apmax
369 theta = rflow(7)*ratio**atheta
370 vi(i) = vi(i) + (pmax-pp(i))*cosg(i)*theta/(rho*dist(i))
372 ELSEIF(ipres == 2)
THEN
374 pti(i) = pti(i) + pp(i)*dt1
375 vi(i) = vi(i) + pti(i)*cosg(i)/(rho*dist(i))
383 IF(freesurf == 2)
THEN
387 IF(tta > zero) off(i) = one
396 pr(i) = -pmax*exp(-tta/theta)*off(i)
397 dprdt(i) = -pr(i)*cosg(j)/theta
399 ELSEIF(ipres == 2)
THEN
405 ismooth = npc(2*nfunct+ifpres+1)
407 IF (ismooth == 0)
THEN
408 pr(i) = -sfpres*finter(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
409 ELSE IF (ismooth > 0)
THEN
410 pr(i) = -sfpres*finter_smooth(ifpres,tta,npc,tf,dppdt)*ratio*off(i)
413 CALL python_call_funct1d(python, ismooth,tta,pr(i))
414 pr(i) = -pr(i)*sfpres*ratio*off(i)
415 CALL python_deriv_funct1d(python, ismooth,tta,dppdt)
417 dprdt(i) = dppdt*cosg(j)*off(i)
419 pr(i) = -sfpres*ratio*off(i)
428 vr(i)=pr(i)*cosg(i+nel)/rhoc
442 IF(nel < nelmax)
THEN
444 dpmdt(i) = rhoc*accf(i)
445 vect(i) = rhoc*areaf(i)*(pm(i)-rhoc*(vi(i)+vr(i)))
447 vect(1:nel) = matmul(mfle(1:nel, 1:nel), vect(1:nel))
449 dpmdt(i) = dpmdt(i) - vect(i)
453 pm(i) = pm(i) + dpmdt(i)*dt1
454 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
457 ELSEIF(integr == 2)
THEN
460 ps(i) = pm(i) + dpmdt(i)*dt1*half - rhoc*(vi(i)+vr(i))
464 dpmdt(i) = rhoc*accf(i)
465 vect(i) = rhoc*areaf(i)*ps(i)
467 vect(1:nel) = matmul(mfle(1:nel, 1:nel), vect(1:nel))
469 dpmdt(i) = dpmdt(i) - vect(i)
472 pm(i) = pm(i) + dpmdt(i)*dt1
473 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
480 CALL dgetrf(nel, nel, mfle, nel, ipiv, info)
483 vect(i) = two*ssp*(rhoc*(vi(i)+vr(i))-pm(i))
485 CALL dgemv(
'T',nel, nel, one, cbem, nel, vect, 1, zero, vect1, 1)
487 CALL dgetrs(
'N', nel, 1, mfle, nel, ipiv, vect1, nel, info)
488 vect(1:nel) = matmul(cbem(1:nel,1:nel), vect1(1:nel))
490 IF(pp(i) /= zero)
THEN
491 dpmdt(i) = rhoc*accf(i) + vect(i)
498 pm(i) = pm(i) + dpmdt(i)*dt1
499 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
502 ELSEIF(integr == 2)
THEN
505 ps(i) = pm(i) + dpmdt(i)*dt1*half - rhoc*(vi(i)+vr(i))
509 vect(i) = -two*ssp*ps(i)
511 CALL dgemv(
'T',nel, nel, one, cbem, nel, vect, 1, zero, vect1, 1)
513 CALL dgetrs(
'N', nel, 1, mfle, nel, ipiv, vect1, nel, info)
514 vect(1:nel) = matmul(cbem(1:nel,1:nel), vect1(1:nel))
516 dpmdt(i) = rhoc*accf(i) + vect(i)
519 pm(i) = pm(i) + dpmdt(i)*dt1
520 ps(i) = pm(i) - rhoc*(vi(i)+vr(i))
525 ELSEIF(kform == 2)
THEN
528 dpmdt(i) = rhoc*accf(i)
531 pm(i) = pm(i) + dpmdt(i)*dt1
532 ps(i) = pm(i) - rhoc*vi(i)
535 ELSEIF(kform == 3)
THEN
540 ps(i) = ps(i) + mfle(i,j)*(accf(j)-(dpidt(j)+dprdt(j))/rhoc)
542 ps(i) = ps(i)/areaf(i)
550 fcy = agrv(1,grav_id)
551 fcx = agrv(2,grav_id)
552 ifunc = igrv(3,grav_id)
555 IF(igrv(6,grav_id) == sensor_tab(k)%SENS_ID) isens=k
560 ts = tt-sensor_tab(isens)%TSTART
564 ismooth = npc(2*nfunct+ifunc+1)
566 IF (ismooth == 0)
THEN
567 gravity = fcy*finter(ifunc,ts*fcx,npc,tf,dydx
568 ELSE IF(ismooth > 0)
THEN
569 gravity = fcy*finter_smooth(ifunc,ts*fcx,npc,tf,dydx)
572 CALL python_call_funct1d(python, ismooth,ts*fcx,gravity)
573 gravity = gravity*fcy
583 ptot = pp(i)+ps(i)+pr(i)+rho*hh(i)*abs(gravity)
584 fel(i) = areaf(i)*
max(ptot,pmin)
598 ff = fac1*third*fel(i)
599 wfext = wfext-fel(i)*vel(i)*dt1
600 a(1,n1) = a(1,n1) + ff*nrx
601 a(2,n1) = a(2,n1) + ff*nry
602 a(3,n1) = a(3,n1) + ff*nrz
603 a(1,n2) = a(1,n2) + ff*nrx
604 a(2,n2) = a(2,n2) + ff*nry
605 a(3,n2) = a(3,n2) + ff*nrz
606 a(1,n3) = a(1,n3) + ff*nrx
607 a(2,n3) = a(2,n3) + ff*nry
608 a(3,n3) = a(3,n3) + ff*nrz
610 ELSEIF(jform == 2)
THEN
627 wfext = wfext-fel(i)*vel(i)*dt1
628 a(1,n1) = a(1,n1) + ff*nrx
629 a(2,n1) = a(2,n1) + ff*nry
630 a(3,n1) = a(3,n1) + ff*nrz
631 a(1,n2) = a(1,n2) + ff*nrx
632 a(2,n2) = a(2,n2) + ff*nry
633 a(3,n2) = a(3,n2) + ff*nrz
634 a(1,n3) = a(1,n3) + ff*nrx
635 a(2,n3) = a(2,n3) + ff*nry
636 a(3,n3) = a(3,n3) + ff*nrz
638 a(1,n4) = a(1,n4) + ff*nrx
639 a(2,n4) = a(2,n4) + ff*nry
640 a(3,n4) = a(3,n4) + ff*nrz
649 IF(lgauge(1,i) == 0 .AND. lgauge(3,i) < 0 )
THEN
652 ptot=pp(i1)+ps(i1)+pr(i1)+rho*hh(i1)*abs(gravity)
653 gauge(30,i)=
max(ptot,pmin)