119 REAL,
PRIVATE,
PARAMETER:: TRNMIN = 0.95
136 SUBROUTINE w3psmc ( ISP, DTG, VQ )
251 USE w3gdatmd,
ONLY:
nk,
nth,
dth,
xfr,
esin,
ecos,
sig,
nx,
ny, &
275 INTEGER,
INTENT(IN) :: ISP
276 REAL,
INTENT(IN) :: DTG
277 REAL,
INTENT(INOUT) :: VQ(NSEA)
282 INTEGER :: ITH, IK, NTLOC, ITLOC, ISEA, IXY, &
283 IY, IY0, IP, IBI, LvR
284 INTEGER :: i, j, k, L, M, N, LL, MM, NN, LMN, &
285 iuf, juf, ivf, jvf, icl, jcl
287 INTEGER,
SAVE :: IENT = 0
289 REAL :: CG0, CGA, CGN, CGX, CGY, FMR, RD1, &
290 RD2, CXMIN, CXMAX, CYMIN, CYMAX, &
291 CXC, CYC, DTLDX, DTLDY
292 REAL :: DTLOC, CGCOS, CGSIN, FUTRN, FVTRN, &
293 DFRR, DX0I, DY0I, CGD, DSSD, &
294 DNND, DCELL, XWIND, TFAC, DSS, DNN
295 REAL :: PCArea, ARCTH
300 REAL,
Dimension(-9:NCel) :: FCNt, AFCN, BCNt, UCFL, VCFL, CQ, &
302 REAL,
Dimension( NUFc) :: FUMD, FUDIFX, ULCFLX
303 REAL,
Dimension( NVFc) :: FVMD, FVDIFY, VLCFLY
308 CALL strace (ient,
'W3PSMC')
314 ith = 1 + mod(isp-1,nth)
319 cg0 = 0.6 *
grav / sig(1)
320 cga = 0.6 *
grav / sig(ik)
326 cgx = cga * ecos(ith)
327 cgy = cga * esin(ith)
331 cxmin = minval(
cx(1:nsea) )
332 cxmax = maxval(
cx(1:nsea) )
333 cymin = minval(
cy(1:nsea) )
334 cymax = maxval(
cy(1:nsea) )
335 IF ( abs(cgx+cxmin) .GT. abs(cgx+cxmax) )
THEN
340 IF ( abs(cgy+cymin) .GT. abs(cgy+cymax) )
THEN
345 cxc = max( abs(cxmin) , abs(cxmax) )
346 cyc = max( abs(cymin) , abs(cymax) )
360 cgn = 0.9999 * max( abs(cgx), abs(cgy), cxc, cyc, 0.001*cg0 )
361 dtloc = dtcfl*cg0/cgn
362 ntloc = 1 + int(dtg/dtloc - 0.001)
363 dtloc = dtg / real(ntloc)
374 yfirst = mod(
itime,2) .EQ. 0
380 IF ( dtms .GT. 0. )
THEN
382 cgd = 0.5 *
grav / sig(ik)
383 dnn = ((dth*cgd)**2)*dtms / 12.
384 dnnd = dnn*dtloc*(dx0i*dx0i)
385 dssd = dnn*dtloc*(dy0i*dy0i)
406 cq(isea) = vq(isea)/
cg(ik,isea)
408 IF( .NOT. (cq(isea) .EQ. cq(isea)) ) cq(isea) = 0.0
420 cxtot(isea) = (cgcos *
cg(ik,isea) +
cx(isea))
421 cytot(isea) = (cgsin *
cg(ik,isea) +
cy(isea))
432 cxtot(isea) = cgcos *
cg(ik,isea)
433 cytot(isea) = cgsin *
cg(ik,isea)
446 cxc = cxtot(isea)*cos(arcth) + cytot(isea)*sin(arcth)
447 cyc = cytot(isea)*cos(arcth) - cxtot(isea)*sin(arcth)
452 pcarea = dy0i/(mrfct*
pi*dx0i*float(ijkcel(4,nsea)))
464 ucfl(isea) = dtldx*cxtot(isea)/clats(isea)
465 vcfl(isea) = dtldy*cytot(isea)
487 IF ( nrlv .EQ. 1 )
THEN
490 CALL smcxuno3r(1, nufc, cq, ucfl, ulcflx, dnnd, fumd, fudifx)
493 CALL smcxuno2r(1, nufc, cq, ucfl, ulcflx, dnnd, fumd, fudifx)
503 futrn = fumd(i)*ulcflx(i) - fudifx(i)
511 IF( (ctrnx(m)+ctrnx(n)) .GE. 1.96 )
THEN
515 fcnt(m) = fcnt(m) - futrn
516 ELSE IF( ulcflx(i) .GE. 0.0 )
THEN
520 fcnt(m) = fcnt(m) - futrn*ctrnx(m)
525 fcnt(m) = fcnt(m) - futrn*ctrnx(n)*ctrnx(m)
533 afcn(m) = afcn(m) - (fumd(i)*ucfl(m) - fudifx(i))
537 IF( (ctrnx(m)+ctrnx(n)) .GE. 1.96 )
THEN
541 fcnt(n) = fcnt(n) + futrn
542 ELSE IF( ulcflx(i) .GE. 0.0 )
THEN
546 fcnt(n) = fcnt(n) + futrn*ctrnx(m)*ctrnx(n)
551 fcnt(n) = fcnt(n) + futrn*ctrnx(n)
557 afcn(n) = afcn(n) + (fumd(i)*ucfl(n) - fudifx(i))
573 cqa(n)=cq(n) + fcnt(n)/float(ijkcel3(n))
574 cq(n)=cq(n) + afcn(n)/float(ijkcel3(n))
583 CALL smcyuno3r(1, nvfc, cq, vcfl, vlcfly, dssd, fvmd, fvdify)
586 CALL smcyuno2r(1, nvfc, cq, vcfl, vlcfly, dssd, fvmd, fvdify)
595 fvtrn = fvmd(j)*vlcfly(j) - fvdify(j)
603 IF( (ctrny(m)+ctrny(n)) .GE. 1.96 )
THEN
607 bcnt(m) = bcnt(m) - fvtrn
608 ELSE IF( vlcfly(j) .GE. 0.0 )
THEN
612 bcnt(m) = bcnt(m) - fvtrn*ctrny(m)
617 bcnt(m) = bcnt(m) - fvtrn*ctrny(n)*ctrny(m)
621 IF( (ctrny(m)+ctrny(n)) .GE. 1.96 )
THEN
625 bcnt(n) = bcnt(n) + fvtrn
626 ELSE IF( vlcfly(j) .GE. 0.0 )
THEN
630 bcnt(n) = bcnt(n) + fvtrn*ctrny(m)*ctrny(n)
635 bcnt(n) = bcnt(n) + fvtrn*ctrny(n)
651 cq(n)=cqa(n) + bcnt(n)/( clats(n)*float(ijkcel3(n)) )
657 IF(
arctc ) cq(nsea) = cqa(nsea) + bcnt(nsea)*pcarea
676 IF( mod(lmn, lvr) .EQ. 0 )
THEN
688 CALL smcxuno3(iuf, juf, cq, ucfl, ulcflx, dnnd, fumd, fudifx, fmr)
691 CALL smcxuno2(iuf, juf, cq, ucfl, ulcflx, dnnd, fumd, fudifx, fmr)
701 futrn = fumd(i)*ulcflx(i) - fudifx(i)
707 IF( (ctrnx(m)+ctrnx(l)) .GE. 1.96 )
THEN
711 fcnt(l) = fcnt(l) - futrn
712 ELSE IF( ulcflx(i) .GE. 0.0 )
THEN
716 fcnt(l) = fcnt(l) - futrn*ctrnx(l)
721 fcnt(l) = fcnt(l) - futrn*ctrnx(l)*ctrnx(m)
728 afcn(l) = afcn(l) - (fumd(i)*ucfl(l)*fmr - fudifx(i))
732 IF( (ctrnx(m)+ctrnx(l)) .GE. 1.96 )
THEN
736 fcnt(m) = fcnt(m) + futrn
737 ELSE IF( ulcflx(i) .GE. 0.0 )
THEN
741 fcnt(m) = fcnt(m) + futrn*ctrnx(m)*ctrnx(l)
746 fcnt(m) = fcnt(m) + futrn*ctrnx(m)
751 afcn(m) = afcn(m) + (fumd(i)*ucfl(m)*fmr - fudifx(i))
766 cqa(n)=cq(n) + fcnt(n)/float( ijkcel3(n)*ijkcel4(n) )
767 cq(n)=cq(n) + afcn(n)/float( ijkcel3(n)*ijkcel4(n) )
777 CALL smcyuno3(ivf, jvf, cq, vcfl, vlcfly, dssd, fvmd, fvdify, fmr)
780 CALL smcyuno2(ivf, jvf, cq, vcfl, vlcfly, dssd, fvmd, fvdify, fmr)
790 fvtrn = fvmd(j)*vlcfly(j) - fvdify(j)
796 IF( (ctrny(m)+ctrny(l)) .GE. 1.96 )
THEN
800 bcnt(l) = bcnt(l) - fvtrn
801 ELSE IF( vlcfly(j) .GE. 0.0 )
THEN
805 bcnt(l) = bcnt(l) - fvtrn*ctrny(l)
810 bcnt(l) = bcnt(l) - fvtrn*ctrny(l)*ctrny(m)
815 IF( (ctrny(m)+ctrny(l)) .GE. 1.96 )
THEN
819 bcnt(m) = bcnt(m) + fvtrn
820 ELSE IF( vlcfly(j) .GE. 0.0 )
THEN
824 bcnt(m) = bcnt(m) + fvtrn*ctrny(m)*ctrny(l)
829 bcnt(m) = bcnt(m) + fvtrn*ctrny(m)
846 cq(n)=cqa(n) + bcnt(n)/( clats(n)* &
847 & float( ijkcel3(n)*ijkcel4(n) ) )
854 IF(
arctc .AND. jcl .EQ. nsea )
THEN
855 cq(nsea) = cqa(nsea) + bcnt(nsea)*pcarea
875 IF ( rd2 .GT. 0.001 )
THEN
876 rd2 = min(1.,max(0.,rd1/rd2))
884 cq(isea) = (rd1*
bbpi0(isp,ibi) + rd2*
bbpin(isp,ibi)) &
902 vq(isea) = max( 0. , cq(isea)*
cg(ik,isea) )
913 9001
FORMAT (
' TEST W3PSMC : ISP, ITH, IK, COS-SIN :',i8,2i4,2f7.3)
914 9003
FORMAT (
' TEST W3PSMC : NO DISPERSION CORRECTION ')
915 9010
FORMAT (
' TEST W3PSMC : INITIALIZE ARRAYS')
916 9020
FORMAT (
' TEST W3PSMC : CALCULATING LCFLX/Y AND DSS/NN (NSEA=', &
920 9021
FORMAT (1x,i6,2i5,e12.4,2f7.3)
923 9022
FORMAT (
' TEST W3PSMC : CORRECTING FOR CURRENT')
924 9040
FORMAT (
' TEST W3PSMC : FIELD AFTER PROP. (NSEA=',i6,
')')
927 9041
FORMAT (1x,i6,2i5,e12.4)
966 SUBROUTINE w3krtn ( ISEA, FACTH, FACK, CTHG0, CG, WN, DEPTH, &
967 DDDX, DDDY, ALFLMT, CX, CY, DCXDX, DCXDY, &
968 DCYDX, DCYDY, DCDX, DCDY, VA )
1090 INTEGER,
INTENT(IN) :: ISEA
1092 INTEGER,
SAVE :: IENT = 0
1094 REAL,
INTENT(IN) :: FACTH, FACK, CTHG0, CG(0:NK+1), &
1095 WN(0:NK+1), DEPTH, DDDX, DDDY, &
1096 ALFLMT(NTH), CX, CY, DCXDX, DCXDY, &
1097 DCYDX, DCYDY, DCDX(0:NK+1), DCDY(0:NK+1)
1098 REAL,
INTENT(INOUT) :: VA(NSPEC)
1103 INTEGER :: ITH, IK, ISP
1104 REAL :: FGC, FKD, FKS, FRK(NK), FRG(NK), DDNorm(NTH), &
1105 FKC(NTH), VQ(NSPEC), VCFLT(NSPEC), DEPTH30, &
1106 DB(0:NK+1), DM(-1:NK+1), CFLK(NTH,0:NK), &
1115 CALL strace (ient,
'W3KRTN')
1121 depth30=max(30.0, depth)
1133 sigsnh(ik) =
sig(ik)/sinh(min(2.0*wn(ik)*depth30,50.0))
1156 frk(ik) = facth * sigsnh(ik)
1158 frg(ik) = fgc * cg(ik)
1166 fgc = facth*( dcydx*
es2(ith) - dcxdy*
ec2(ith) + &
1167 (dcxdx - dcydy)*
esc(ith) )
1168 fkc(ith) = sign( min(abs(fgc),
ctmax), fgc )
1177 ddnorm(ith)=
esin(ith)*dddx-
ecos(ith)*dddy
1179 isp = (ik-1)*nth + ith
1181 vcflt(isp)=frg(ik)*
ecos(ith) + fkc(ith) + &
1182 sign( min(abs(frk(ik)*ddnorm(ith)), alflmt(ith)), &
1202 fkc(ith) = -dcxdx*
ec2(ith) -dcydy*
es2(ith) &
1203 -(dcxdy + dcydx)*
esc(ith)
1205 fkd = cx*dddx + cy*dddy
1215 db(ik) =
dsip(ik) / cg(ik)
1216 dm(ik) = wn(ik+1) - wn(ik)
1218 db(nk+1) =
dsip(nk+1) / cg(nk+1)
1231 fks = max( 0.0, cg(ik)*wn(ik)-0.5*
sig(ik) )*fkd / &
1234 cflk(ith,ik) = fack*( fks + fkc(ith)*wn(ik) )
1243 IF ( mod(
itime,2) .EQ. 0 )
THEN
1290 SUBROUTINE smcxuno2(NUA, NUB, CF, UC, UFLX, AKDif, FU, FX, FTS)
1298 INTEGER,
INTENT( IN):: NUA, NUB
1299 REAL,
INTENT( IN):: CF(-9:NCel), UC(-9:NCel), AKDif, FTS
1300 REAL,
INTENT(Out):: UFLX(NUFc), FU(NUFc), FX(NUFc)
1302 INTEGER :: i, j, k, L, M, N, ij
1303 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6, CNST8, CNST9
1338 cnst5=(cf(m)-cf(l))/( cnst2 + cnst3 )
1341 cnst6=0.5*( uc(l)+uc(m) )*fts
1345 cnst8 = float(
ijkufc(3,i) )
1355 IF(cnst6 >= 0.0)
THEN
1358 IF( m .LE. 0) uflx(i) = uc(l)*fts
1362 cnst4=(cf(l)-cf(k))/( cnst2 + cnst1 )
1365 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1368 fu(i)=(cf(l) + cnst*(cnst2 - uflx(i)))*cnst8
1374 IF( l .LE. 0) uflx(i) = uc(m)*fts
1378 cnst4=(cf(n)-cf(m))/( cnst1 + cnst3 )
1381 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1384 fu(i)=(cf(m) - cnst*(cnst3+uflx(i)))*cnst8
1389 fx(i)=cnst0*cnst5*cnst8*cnst9
1417 SUBROUTINE smcyuno2(NVA, NVB, CF, VC, VFLY, AKDif, FV, FY, FTS)
1424 INTEGER,
INTENT( IN):: NVA, NVB
1425 REAL,
INTENT( IN):: CF(-9:NCel), VC(-9:NCel), AKDif, FTS
1426 REAL,
INTENT(Out):: VFLY(NVFc), FV(NVFc), FY(NVFc)
1427 INTEGER :: i, j, k, L, M, N, ij
1428 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6, CNST8
1438 cnst0=akdif*fts*fts*2.0
1459 cnst5=(cf(m)-cf(l))/( cnst2 + cnst3 )
1463 cnst6=0.5*( vc(l)+vc(m) )*fts
1471 IF(cnst6 >= 0.0)
THEN
1484 cnst4=(cf(l)-cf(k))/( cnst2 + cnst1 )
1487 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1490 fv(j)=( cf(l) + cnst*(cnst2 - vfly(j)) )*cnst8
1505 cnst4=(cf(n)-cf(m))/( cnst1 + cnst3 )
1508 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1511 fv(j)=( cf(m) - cnst*(cnst3 + vfly(j)) )*cnst8
1517 fy(j)=cnst0*cnst5*cnst8
1544 SUBROUTINE smcxuno2r(NUA, NUB, CF, UC, UFLX, AKDif, FU, FX)
1552 INTEGER,
INTENT( IN):: NUA, NUB
1553 REAL,
INTENT( IN):: CF(-9:NCel), UC(-9:NCel), AKDif
1554 REAL,
INTENT(Out):: UFLX(NUFc), FU(NUFc), FX(NUFc)
1556 INTEGER :: i, j, k, L, M, N, ij
1557 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6
1586 cnst6= 0.5*( uc(l)+uc(m) )
1592 cnst0 = 2.0/( clats(ij)*clats(ij) )
1595 IF(cnst6 >= 0.0)
THEN
1598 IF( m .LE. 0) uflx(i) = uc(l)
1604 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
1607 fu(i)=(cf(l) + cnst*(1.0-uflx(i)/cnst2))
1613 IF( l .LE. 0) uflx(i) = uc(m)
1619 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
1622 fu(i)=(cf(m) - cnst*(1.0+uflx(i)/cnst3))
1627 fx(i)=akdif*cnst0*cnst5/(cnst2 + cnst3)
1654 SUBROUTINE smcyuno2r(NVA, NVB, CF, VC, VFLY, AKDif, FV, FY)
1661 INTEGER,
INTENT( IN):: NVA, NVB
1662 REAL,
INTENT( IN):: CF(-9:NCel), VC(-9:NCel), AKDif
1663 REAL,
INTENT(Out):: VFLY(NVFc), FV(NVFc), FY(NVFc)
1664 INTEGER :: i, j, k, L, M, N, ij
1665 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6, CNST8
1689 cnst6=0.5*( vc(l)+vc(m) )
1697 IF(cnst6 >= 0.0)
THEN
1700 IF( m .LE. 0 ) vfly(j) = vc(l)
1706 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
1709 fv(j)=( cf(l) + cnst*(1.0-vfly(j)) )*cnst8
1715 IF( l .LE. 0 ) vfly(j) = vc(m)
1721 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
1724 fv(j)=( cf(m) - cnst*(1.0+vfly(j)) )*cnst8
1729 fy(j)=akdif*cnst5*cnst8
1757 SUBROUTINE smcxuno3(NUA, NUB, CF, UC, UFLX, AKDif, FU, FX, FTS)
1765 INTEGER,
INTENT( IN):: NUA, NUB
1766 REAL,
INTENT( IN):: CF(-9:NCel), UC(-9:NCel), AKDif, FTS
1767 REAL,
INTENT(Out):: UFLX(NUFc), FU(NUFc), FX(NUFc)
1769 INTEGER :: i, j, k, L, M, N, ij
1770 REAL :: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6, &
1780 cnst0=akdif*fts*fts*2.0
1803 cnst5=(cf(m)-cf(l))/( cnst2 + cnst3 )
1806 cnst6=0.5*( uc(l)+uc(m) )*fts
1810 cnst8 = float( ijkufc(3,i) )
1819 IF(cnst6 >= 0.0)
THEN
1822 IF( m .LE. 0) uflx(i) = uc(l)*fts
1826 cnst4=(cf(l)-cf(k))/( cnst2 + cnst1 )
1829 cnst7 = cnst5 - cnst4
1830 cnst9 = 2.0/( cnst3+cnst2+cnst2+cnst1 )
1833 IF( abs(cnst7) .LT. 0.6*cnst9*abs(cf(m)-cf(k)) )
THEN
1834 cnst= cnst5 - ( cnst3+uflx(i) )*cnst7*cnst9/1.5
1837 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
1838 cnst=sign(2.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1842 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1847 fu(i)=(cf(l) + cnst*(cnst2 - uflx(i)))*cnst8
1853 IF( l .LE. 0) uflx(i) = uc(m)*fts
1857 cnst4=(cf(n)-cf(m))/( cnst1 + cnst3 )
1860 cnst7 = cnst4 - cnst5
1861 cnst9 = 2.0/( cnst2+cnst3+cnst3+cnst1 )
1864 IF( abs(cnst7) .LT. 0.6*cnst9*abs(cf(n)-cf(l)) )
THEN
1865 cnst= cnst5 + ( cnst2-uflx(i) )*cnst7*cnst9/1.5
1868 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
1869 cnst=sign(2.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1873 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1878 fu(i)=(cf(m) - cnst*(cnst3+uflx(i)))*cnst8
1883 fx(i)=cnst0*cnst5*cnst8/( clats( ij )*clats( ij ) )
1912 SUBROUTINE smcyuno3(NVA, NVB, CF, VC, VFLY, AKDif, FV, FY, FTS)
1920 INTEGER,
INTENT( IN):: NVA, NVB
1921 REAL,
INTENT( IN):: CF(-9:NCel), VC(-9:NCel), AKDif, FTS
1922 REAL,
INTENT(Out):: VFLY(NVFc), FV(NVFc), FY(NVFc)
1923 INTEGER :: i, j, k, L, M, N, ij
1924 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6, &
1935 cnst0=akdif*fts*fts*2.0
1956 cnst5=(cf(m)-cf(l))/( cnst2 + cnst3 )
1960 cnst6=0.5*( vc(l)+vc(m) )*fts
1965 cnst8=clatf(j)*float( ijkvfc(3,j) )
1968 IF(cnst6 >= 0.0)
THEN
1981 cnst4=(cf(l)-cf(k))/( cnst2 + cnst1 )
1984 cnst7 = cnst5 - cnst4
1985 cnst9 = 2.0/( cnst3+cnst2+cnst2+cnst1 )
1988 IF( abs(cnst7) .LT. 0.6*cnst9*abs(cf(m)-cf(k)) )
THEN
1989 cnst= cnst5 - ( cnst3+vfly(j) )*cnst7*cnst9/1.5
1992 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
1993 cnst=sign(2.0, cnst5)*min( abs(cnst4), abs(cnst5) )
1998 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
2003 fv(j)=( cf(l) + cnst*(cnst2 - vfly(j)) )*cnst8
2018 cnst4=(cf(n)-cf(m))/( cnst1 + cnst3 )
2021 cnst7 = cnst4 - cnst5
2022 cnst9 = 2.0/( cnst2+cnst3+cnst3+cnst1 )
2025 IF( abs(cnst7) .LT. 0.6*cnst9*abs(cf(n)-cf(l)) )
THEN
2026 cnst= cnst5 + ( cnst2-vfly(j) )*cnst7*cnst9/1.5
2029 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
2030 cnst=sign(2.0, cnst5)*min( abs(cnst4), abs(cnst5) )
2035 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
2040 fv(j)=( cf(m) - cnst*(cnst3 + vfly(j)) )*cnst8
2046 fy(j)=cnst0*cnst5*cnst8
2073 SUBROUTINE smcxuno3r(NUA, NUB, CF, UC, UFLX, AKDif, FU, FX)
2081 INTEGER,
INTENT( IN):: NUA, NUB
2082 REAL,
INTENT( IN):: CF(-9:NCel), UC(-9:NCel), AKDif
2083 REAL,
INTENT(Out):: UFLX(NUFc), FU(NUFc), FX(NUFc)
2085 INTEGER :: i, j, k, L, M, N, ij
2086 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6, &
2115 cnst6= 0.5*( uc(l)+uc(m) )
2121 cnst0 = 2.0/( clats(ij)*clats(ij) )
2124 IF(cnst6 >= 0.0)
THEN
2127 IF( m .LE. 0) uflx(i) = uc(l)
2134 IF( abs(cnst9) <= 0.6*abs(cnst8) )
THEN
2136 cnst=0.5*cnst5 - (1.0+uflx(i)/cnst2)*cnst9/6.0
2137 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
2139 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
2142 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
2145 fu(i)=(cf(l) + cnst*(1.0-uflx(i)/cnst2))
2151 IF( l .LE. 0) uflx(i) = uc(m)
2158 IF( abs(cnst9) <= 0.6*abs(cnst8) )
THEN
2160 cnst=0.5*cnst5 + (1.0-uflx(i)/cnst3)*cnst9/6.0
2161 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
2163 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
2166 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
2170 fu(i)=(cf(m) - cnst*(1.0+uflx(i)/cnst3))
2175 fx(i)=akdif*cnst0*cnst5/(cnst2 + cnst3)
2204 SUBROUTINE smcyuno3r(NVA, NVB, CF, VC, VFLY, AKDif, FV, FY)
2211 INTEGER,
INTENT( IN):: NVA, NVB
2212 REAL,
INTENT( IN):: CF(-9:NCel), VC(-9:NCel), AKDif
2213 REAL,
INTENT(Out):: VFLY(NVFc), FV(NVFc), FY(NVFc)
2214 INTEGER :: i, j, k, L, M, N, ij
2215 REAL :: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6, &
2240 cnst6=0.5*( vc(l)+vc(m) )
2248 IF(cnst6 >= 0.0)
THEN
2251 IF( m .LE. 0 ) vfly(j) = vc(l)
2260 IF( abs(cnst9) <= 0.6*abs(cnst8) )
THEN
2262 cnst=0.5*cnst5-(1.0+vfly(j))*cnst9/6.0
2263 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
2265 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
2268 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
2272 fv(j)=( cf(l) + cnst*(1.0-vfly(j)) )*cnst7
2278 IF( l .LE. 0 ) vfly(j) = vc(m)
2287 IF( abs(cnst9) <= 0.6*abs(cnst8) )
THEN
2289 cnst=0.5*cnst5+(1.0-vfly(j))*cnst9/6.0
2290 ELSE IF( dble(cnst4)*dble(cnst5) .GT. 0.d0 )
THEN
2292 cnst=sign(1.0, cnst5)*min( abs(cnst4), abs(cnst5) )
2295 cnst=sign(0.5, cnst5)*min( abs(cnst4), abs(cnst5) )
2298 fv(j)=( cf(m) - cnst*(1.0+vfly(j)) )*cnst7
2303 fy(j)=akdif*cnst5*cnst7
2334 SUBROUTINE smcgradn(CVQ, GrdX, GrdY, L0r1)
2346 REAL,
INTENT( IN):: CVQ(NSEA)
2347 REAL,
INTENT(Out):: GrdX(NSEA), GrdY(NSEA)
2348 INTEGER,
INTENT( IN):: L0r1
2350 INTEGER :: I, J, K, L, M, N
2351 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6
2355 REAL,
Dimension(-9:NSEA):: CVF, AUN, AVN
2360 cvf(1:nsea)=cvq(1:nsea)
2388 IF( l0r1 .EQ. 0 .OR. (l > 0 .AND. m > 0) )
THEN
2391 cnst1=float( ijkufc(3,i) )
2394 cnst2=float( ijkcel(3,l) )
2395 cnst3=float( ijkcel(3,m) )
2399 cnst5=cnst1*(cvf(m)-cvf(l))/(cnst2+cnst3)
2400 #if defined W3_B4B && defined W3_OMPG
2401 cnst5=int(cnst5 * 1.0e6)
2412 aun(l) = aun(l) + cnst5
2418 aun(m) = aun(m) + cnst5
2429 #if defined W3_B4B && defined W3_OMPG
2447 grdx(n)=dx0i*aun(n)/( clats(n)*ijkcel(4,n) )
2464 IF( l0r1 .EQ. 0 .OR. (l > 0 .AND. m > 0) )
THEN
2467 cnst1=real( ijkvfc(3,j) )
2470 cnst2=real( ijkcel(4,l) )
2471 cnst3=real( ijkcel(4,m) )
2475 cnst6=cnst1*(cvf(m)-cvf(l))/(cnst2+cnst3)
2476 #if defined W3_B4B && defined W3_OMPG
2477 cnst6 = int(cnst6 * 1.0e6)
2488 avn(l) = avn(l) + cnst6
2494 avn(m) = avn(m) + cnst6
2505 #if defined W3_B4B && defined W3_OMPG
2519 grdy(n)=dy0i*avn(n)/real( ijkcel(3,n) )
2529 IF(
arctc ) grdy(nsea) = 0.0
2552 REAL,
INTENT(INOUT) :: CVQ(-9:NSEA)
2554 INTEGER :: I, J, K, L, M, N
2555 REAL :: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6
2558 REAL,
Dimension(-9:NSEA) :: CVF, AUN, AVN
2585 cnst5=real( ijkufc(3,i) )*(cvf(m)+cvf(l))
2598 aun(l) = aun(l) + cnst5
2604 aun(m) = aun(m) + cnst5
2614 #if defined W3_B4B && defined W3_OMPG
2632 cnst6=real( ijkvfc(3,j) )*(cvf(m)+cvf(l))
2633 #if defined W3_B4B && defined W3_OMPG
2634 cnst6=int(cnst6 * 1e6)
2645 avn(l) = avn(l) + cnst6
2651 avn(m) = avn(m) + cnst6
2661 #if defined W3_B4B && defined W3_OMPG
2674 cnst3=0.125/real( ijkcel(3,n) )
2675 cnst4=0.125/real( ijkcel(4,n) )
2678 cvq(n)= aun(n)*cnst4 + avn(n)*cnst3
2688 IF(
arctc ) cvq(nsea) = cnst0
2715 REAL,
INTENT(IN) :: CoRfr(NTH, NK)
2716 REAL,
INTENT(INOUT):: SpeTHK(NTH, NK)
2717 INTEGER :: I, J, K, L, M, N
2718 REAL,
Dimension(NTH):: SpeGCT, Spectr
2719 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6
2725 spectr=spethk(1:nth,n)
2737 k= mod( int(cnst5), nth )
2740 cnst1=cnst5 - float( int(cnst5) )
2744 IF(cnst6 > 0.0)
THEN
2749 IF( l .GT. nth ) l = l - nth
2750 IF( m .GT. nth ) m = m - nth
2753 spegct(l)=spegct(l)+spectr(j)*cnst2
2754 spegct(m)=spegct(m)+spectr(j)*cnst1
2762 IF( l .LT. 1 ) l = l + nth
2763 IF( m .LT. 1 ) m = m + nth
2766 spegct(l)=spegct(l)+spectr(j)*cnst2
2767 spegct(m)=spegct(m)+spectr(j)*cnst1
2775 spethk(1:nth,n) = spegct
2814 SUBROUTINE smckuno2(CoRfr, SpeTHK, DKC, DKS)
2820 REAL,
INTENT(IN) :: CoRfr(NTH, 0:NK), DKC(0:NK+1), DKS(-1:NK+1)
2821 REAL,
INTENT(INOUT):: SpeTHK(NTH, NK)
2822 INTEGER :: I, J, K, L, M, N
2823 REAL,
Dimension(-1:NK+2):: SpeRfr, Spectr, SpeFlx
2824 REAL:: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6
2833 spectr(1:nk)=spethk(n,1:nk)
2834 spectr(nk+1)=spectr(nk )*cnst
2835 spectr(nk+2)=spectr(nk+1)*cnst
2840 sperfr(j)=(spectr(j+1)-spectr(j))/dks(j)
2851 IF(cnst6 > 0.0)
THEN
2853 cnst0 = min(
ctmax*dkc(j), cnst6 )
2854 speflx(j) = cnst0*( spectr(j) + sign(0.5, sperfr(j))*(dkc(j)-cnst0) &
2855 *min( abs(sperfr(j-1)), abs(sperfr(j)) ) )
2860 cnst0 = min(
ctmax*dkc(j+1), -cnst6 )
2861 speflx(j) = -cnst0*( spectr(j+1) - sign(0.5, sperfr(j))*(dkc(j+1)-cnst0) &
2862 *min( abs(sperfr(j+1)), abs(sperfr(j)) ) )
2874 spethk(n, j) = max( 0.0, spectr(j)+(speflx(j-1)-speflx(j))/dkc(j) )
2906 INTEGER :: I, J, K, L, M, N
2907 REAL :: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6
2908 REAL,
Dimension(NSEA) :: HCel, GrHx, GrHy
2914 hcel(1:nsea)=
dw(1:nsea)
2921 IF(
dw(k) .LT. dmin) hcel(k)=dmin
2948 IF( abs(
dhdx(n) ) .GT. 0.1)
dhdx(n)=sign( 0.1,
dhdx(n) )
2949 IF( abs(
dhdy(n) ) .GT. 0.1)
dhdy(n)=sign( 0.1,
dhdy(n) )
2952 i= ijkcel(1,n)/mrfct + 1
2953 j= ijkcel(2,n)/mrfct + 1
2954 k= max(1, ijkcel(3,n)/mrfct)
2955 m= max(1, ijkcel(4,n)/mrfct)
2963 cnst1 =
dhdx(n)*cos(cnst0) -
dhdy(n)*sin(cnst0)
2964 cnst2 =
dhdx(n)*sin(cnst0) +
dhdy(n)*cos(cnst0)
2988 IF ( cnst4 .GT. 1.0e-5 )
THEN
2990 #if defined W3_T && defined W3_OMPG
2994 #if defined W3_T && defined W3_OMPG
3001 cnst6 = acos(-(
dhdx(n)*ecos(i)+
dhdy(n)*esin(i))/cnst4 )
3003 dhlmt(i,n)=min(refran, 0.75*min(cnst6,abs(
pi-cnst6)))/dth
3007 IF( mod(n, 1000) .EQ. 0 ) &
3008 WRITE(
ndst,
'(i8,18F5.1)' ) n, (
dhlmt(i,n), i=1,18)
3021 WRITE(
ndst,*)
' No. Refraction points =', l
3025 999 print*,
' Sub SMCDHXY ended.'
3050 INTEGER :: I, J, K, L, M, N
3051 REAL :: CNST, CNST0, CNST1, CNST2, CNST3, CNST4, CNST5, CNST6
3052 REAL,
Dimension(NSEA) :: CXCY, GrHx, GrHy
3059 cxcy(1:nsea)=
cx(1:nsea)
3075 IF( abs( grhx(n) ) .GT. 0.01) grhx(n)=sign( 0.01, grhx(n) )
3076 IF( abs( grhy(n) ) .GT. 0.01) grhy(n)=sign( 0.01, grhy(n) )
3082 cnst1 = grhx(n)*cos(cnst0) - grhy(n)*sin(cnst0)
3083 cnst2 = grhx(n)*sin(cnst0) + grhy(n)*cos(cnst0)
3089 i= ijkcel(1,n)/mrfct + 1
3090 j= ijkcel(2,n)/mrfct + 1
3091 k= max(1, ijkcel(3,n)/mrfct)
3092 m= max(1, ijkcel(4,n)/mrfct)
3093 dcxdx(j:j+m-1,i:i+k-1) = grhx(n)
3094 dcxdy(j:j+m-1,i:i+k-1) = grhy(n)
3105 cxcy(1:nsea)=
cy(1:nsea)
3121 IF( abs( grhx(n) ) .GT. 0.01) grhx(n)=sign( 0.01, grhx(n) )
3122 IF( abs( grhy(n) ) .GT. 0.01) grhy(n)=sign( 0.01, grhy(n) )
3128 cnst1 = grhx(n)*cos(cnst0) - grhy(n)*sin(cnst0)
3129 cnst2 = grhx(n)*sin(cnst0) + grhy(n)*cos(cnst0)
3135 i= ijkcel(1,n)/mrfct + 1
3136 j= ijkcel(2,n)/mrfct + 1
3137 k= max(1, ijkcel(3,n)/mrfct)
3138 m= max(1, ijkcel(4,n)/mrfct)
3139 dcydx(j:j+m-1,i:i+k-1) = grhx(n)
3140 dcydy(j:j+m-1,i:i+k-1) = grhy(n)
3148 999 print*,
' Sub SMCDCXY ended.'
3289 INTEGER,
INTENT(IN) :: ISPEC
3290 REAL,
INTENT(OUT) :: FIELD(NCel)
3296 INTEGER :: ISEA, IXY
3299 INTEGER :: STATUS(MPI_STATUS_SIZE,NSPEC), &
3300 IOFF, IERR_MPI, JSEA, ISEA, &
3301 IXY, IS0, IB0, NPST, J
3304 INTEGER,
SAVE :: IENT
3310 CALL strace (ient,
'W3GATH')
3319 field(isea) = a(ispec,isea)
3338 IF (
nrqsg2 .GT. 0 )
CALL &
3350 IF (
nrqsg2 .GT. 0 )
CALL &
3363 IF (
nrqsg2 .GT. 0 )
CALL &
3364 mpi_waitall (
nrqsg2,
irqsg2(ioff,1), status, ierr_mpi )
3379 IF ( is0 .GT.
nsploc )
EXIT
3380 ib0 = 1 + mod(ib0,
mpibuf)
3381 IF (
bstat(ib0) .EQ. 0 )
THEN
3384 ioff = 1 + (is0-1)*
nrqsg2
3385 IF (
nrqsg2 .GT. 0 )
CALL &
3389 IF ( npst .GE. 2 )
EXIT
3419 SUBROUTINE w3scatsmc ( ISPEC, MAPSTA, FIELD )
3520 INTEGER,
INTENT(IN) :: ISPEC, MAPSTA(NY*NX)
3521 REAL,
INTENT(IN) :: FIELD(NCel)
3527 INTEGER :: ISEA, IXY
3530 INTEGER :: ISEA, IXY, IOFF, IERR_MPI, J, &
3531 STATUS(MPI_STATUS_SIZE,NSPEC), &
3535 INTEGER,
SAVE :: IENT
3544 CALL strace (ient,
'W3SCAT')
3552 IF ( mapsta(ixy) .GE. 1 ) a(ispec,isea) = field(isea)
3566 IF ( mapsta(ixy) .GE. 1 )
sstore(isea,
ibfloc) = field(isea)
3572 IF (
nrqsg2 .GT. 0 )
CALL &
3580 isea = min( iaproc+(jsea-1)*naproc,
nsea )
3589 ib0 = 1 + mod(ib0,
mpibuf)
3590 IF (
bstat(ib0) .EQ. 2 )
THEN
3592 IF (
nrqsg2 .GT. 0 )
THEN
3598 IF ( done .AND.
nrqsg2.GT.0 )
CALL &
3613 IF (
bstat(ib0) .EQ. 2 )
THEN
3615 IF (
nrqsg2 .GT. 0 )
CALL &
3659 SUBROUTINE w3smcell( IMOD, NC, IDCl, XLon, YLat )
3724 INTEGER,
INTENT(IN) :: IMOD, NC
3725 INTEGER,
INTENT(in),
Dimension(NC):: IDCl
3726 REAL ,
INTENT(out),
Dimension(NC):: XLon, YLat
3730 REAL :: XI0, YJ0, DXG, DYG, DX1, DY1
3731 INTEGER :: I1, I3, J2, J4, MRF, ij, ijp, NSEM
3734 CALL strace (ient,
'W3SMCELL')
3738 dxg =
grids(imod)%SX
3739 dyg =
grids(imod)%SY
3740 xi0 =
grids(imod)%X0 - 0.5*dxg
3741 yj0 =
grids(imod)%Y0 - 0.5*dyg
3742 mrf =
grids(imod)%MRFct
3745 nsem =
grids(imod)%NSEA
3756 IF( ijp < 1 .OR. ijp > nsem )
THEN
3761 i1=
grids(imod)%IJKCel(1, ijp)
3762 j2=
grids(imod)%IJKCel(2, ijp)
3763 i3=
grids(imod)%IJKCel(3, ijp)
3764 j4=
grids(imod)%IJKCel(4, ijp)
3767 xlon(ij) = xi0 + ( float(i1) + 0.5*float(i3) )*dx1
3768 ylat(ij) = yj0 + ( float(j2) + 0.5*float(j4) )*dy1
3776 WHERE( xlon < 0.0 ) xlon = xlon + 360.0
3803 SUBROUTINE w3smcgmp( IMOD, NC, XLon, YLat, IDCl )
3865 INTEGER,
INTENT(IN) :: IMOD, NC
3866 REAL ,
INTENT(in),
Dimension(NC):: XLon, YLat
3867 INTEGER,
INTENT(out),
Dimension(NC):: IDCl
3870 INTEGER,
Dimension(NC) :: IX1, JY1
3871 REAL :: XI0, YJ0, DXG, DYG, DX1, DY1, XLow(NC)
3872 INTEGER :: I1, I3, J2, J4, ij, ijp, MRF, NSEM, NFund
3875 CALL strace (ient,
'W3SMCGMP')
3879 dxg =
grids(imod)%SX
3880 dyg =
grids(imod)%SY
3881 xi0 =
grids(imod)%X0 - 0.5*dxg
3882 yj0 =
grids(imod)%Y0 - 0.5*dyg
3883 mrf =
grids(imod)%MRFct
3886 nsem =
grids(imod)%NSEA
3890 WHERE( xlow < xi0 ) xlow = xlow + 360.0
3893 ix1 = floor( (xlow - xi0)/dx1 )
3894 jy1 = floor( (ylat - yj0)/dy1 )
3902 DO WHILE( ij < nsem .AND. nfund < nc )
3904 i1=
grids(imod)%IJKCel(1, ij)
3905 j2=
grids(imod)%IJKCel(2, ij)
3906 i3=
grids(imod)%IJKCel(3, ij)
3907 j4=
grids(imod)%IJKCel(4, ij)
3908 lpnbis:
DO ijp = 1, nc
3909 IF( idcl(ijp) .EQ. 0 )
THEN
3911 IF((ix1(ijp) .GE. i1) .AND. (ix1(ijp) .LT. i1+i3) .AND. &
3912 (jy1(ijp) .GE. j2) .AND. (jy1(ijp) .LT. j2+j4))
THEN