Changeset 5117 for LMDZ6/branches/Amaury_dev/libf/dyn3d_common/ppm3d.f90
- Timestamp:
- Jul 24, 2024, 4:23:34 PM (2 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/ppm3d.f90
r5116 r5117 269 269 ! User modifiable parameters 270 270 ! 271 integer,parameter :: Jmax = 361, kmax = 150271 INTEGER,parameter :: Jmax = 361, kmax = 150 272 272 ! 273 273 ! ****6***0*********0*********0*********0*********0*********0**********72 … … 282 282 INTEGER :: IMRD2 283 283 REAL :: PT 284 logical:: cross, fill, dum284 LOGICAL :: cross, fill, dum 285 285 ! 286 286 ! Local dynamic arrays … … 327 327 WRITE(6,*) 'NLAY must be >= 6' 328 328 stop 329 endif330 if(JNP<NLAY) THEN329 ENDIF 330 IF (JNP<NLAY) THEN 331 331 WRITE(6,*) 'JNP must be >= NLAY' 332 332 stop 333 endif333 ENDIF 334 334 IMRD2=mod(IMR,2) 335 if (j1==2.and.IMRD2/=0) THEN335 IF (j1==2.AND.IMRD2/=0) THEN 336 336 WRITE(6,*) 'if j1=2 IMR must be an even integer' 337 337 stop 338 endif339 340 ! 341 IF(Jmax<JNP . or. Kmax<NLAY) THEN338 ENDIF 339 340 ! 341 IF(Jmax<JNP .OR. Kmax<NLAY) THEN 342 342 WRITE(6,*) 'Jmax or Kmax is too small' 343 343 stop 344 endif344 ENDIF 345 345 ! 346 346 DO k=1,NLAY … … 359 359 ! Define cosine consistent with GEOS-GCM (using dycore2.0 or later) 360 360 CALL cosc(cosp,cose,JNP,PI,DP) 361 endif361 ENDIF 362 362 ! 363 363 do J=2,JMR … … 370 370 acosp(1) = RCAP 371 371 acosp(JNP) = RCAP 372 endif372 ENDIF 373 373 ! 374 374 IF(NDT0 /= NDT) THEN … … 384 384 IF(MaxDT < abs(NDT)) THEN 385 385 WRITE(6,*) 'Warning!!! NDT maybe too large!' 386 endif386 ENDIF 387 387 ! 388 388 IF(CR1>=0.95) THEN … … 398 398 IML = min(6*JS0/(J1-1)+2, 4*IMR/5) 399 399 JN0 = JNP-JS0+1 400 endif400 ENDIF 401 401 ! 402 402 ! … … 414 414 ! 415 415 ! WRITE(6,*) 'J1=',J1,' J2=', J2 416 endif416 ENDIF 417 417 ! 418 418 ! *********** End Initialization ********************** … … 438 438 END DO 439 439 END DO 440 endif440 ENDIF 441 441 ! 442 442 ! Compute "tracer density" … … 472 472 CRY(i,2) = DTDY*V(i,1,k) 473 473 END DO 474 endif474 ENDIF 475 475 ! 476 476 ! Determine JS and JN … … 483 483 JS = j 484 484 go to 2222 485 endif485 ENDIF 486 486 enddo 487 487 enddo … … 493 493 JN = j 494 494 go to 2233 495 endif495 ENDIF 496 496 enddo 497 497 enddo … … 503 503 DPI(i,JMR,k) = 0. 504 504 enddo 505 endif505 ENDIF 506 506 ! 507 507 ! ******* Compute horizontal mass fluxes ************ … … 596 596 VA(IMR,1)=VA(1,1) 597 597 VA(IMR,JNP)=VA(1,JNP) 598 endif598 ENDIF 599 599 ! 600 600 ! ****6***0*********0*********0*********0*********0*********0**********72 … … 608 608 ! E-W advective cross term 609 609 do j=J1,J2 610 IF(J>JS . and. J<JN) GO TO 250610 IF(J>JS .AND. J<JN) GO TO 250 611 611 ! 612 612 do i=1,IMR … … 627 627 else 628 628 wk1(i,j,1) = qtmp(iiu)+ru*(qtmp(iiu)-qtmp(iiu+1)) 629 endif629 ENDIF 630 630 wk1(i,j,1) = wk1(i,j,1) - qtmp(i) 631 631 END DO … … 648 648 enddo 649 649 enddo 650 endif650 ENDIF 651 651 ! ****6***0*********0*********0*********0*********0*********0**********72 652 652 ! Contribution from the N-S advection … … 681 681 enddo 682 682 enddo 683 endif683 ENDIF 684 684 ! 685 685 CALL xtp(IMR,JNP,IML,j1,j2,JN,JS,PU,DQ(1,1,k,IC),wk1(1,1,2) & … … 773 773 END DO 774 774 END DO 775 endif775 ENDIF 776 776 END DO 777 777 ! … … 783 783 END DO 784 784 END DO 785 endif785 ENDIF 786 786 ! 787 787 RETURN … … 792 792 flux,wk1,wk2,wz2,delp,KORD) 793 793 IMPLICIT NONE 794 integer,parameter :: kmax = 150795 real,parameter :: R23 = 2./3., R3 = 1./3.794 INTEGER,parameter :: kmax = 150 795 REAL,parameter :: R23 = 2./3., R3 = 1./3. 796 796 INTEGER :: IMR,JNP,NLAY,J1,KORD 797 797 REAL :: WZ(IMR,JNP,NLAY),P(IMR,JNP,NLAY),DC(IMR,JNP,NLAY), & … … 838 838 ! 839 839 DO j=1,JNP 840 if((j==2 .or. j==JMR) .and. j1/=2) goto 2000840 IF((j==2 .OR. j==JMR) .AND. j1/=2) goto 2000 841 841 ! 842 842 DO k=1,NLAY … … 942 942 flux(i,2) = AL(i,2)+0.5*CP*(AL(i,2)-AR(i,2)-A6(i,2)*(1.+R23*CP)) 943 943 ! print *,'test2',i, AL(i,2),AR(i,2),A6(i,2),R23 944 endif944 ENDIF 945 945 END DO 946 946 ! … … 990 990 enddo 991 991 ! 992 IF(j>=JN . or. j<=JS) goto 2222992 IF(j>=JN .OR. j<=JS) goto 2222 993 993 ! ************* Eulerian ********** 994 994 ! … … 998 998 qtmp(IMP+1) = q(2,J) 999 999 ! 1000 IF(IORD==1 . or. j==j1 .or. j==j2) THEN1000 IF(IORD==1 .OR. j==j1 .OR. j==j2) THEN 1001 1001 DO i=1,IMR 1002 1002 iu = REAL(i) - uc(i,j) … … 1007 1007 DC(0) = DC(IMR) 1008 1008 ! 1009 IF(IORD==2 . or. j<=j1vl .or. j>=j2vl) THEN1009 IF(IORD==2 .OR. j<=j1vl .OR. j>=j2vl) THEN 1010 1010 DO i=1,IMR 1011 1011 iu = REAL(i) - uc(i,j) … … 1014 1014 else 1015 1015 CALL fxppm(IMR,IML,UC(1,j),Qtmp,DC,fx1,IORD) 1016 endif1016 ENDIF 1017 1017 ! 1018 1018 ENDIF … … 1033 1033 enddo 1034 1034 ! 1035 IF(IORD==1 . or. j==j1 .or. j==j2) THEN1035 IF(IORD==1 .OR. j==j1 .OR. j==j2) THEN 1036 1036 DO i=1,IMR 1037 1037 itmp = INT(uc(i,j)) … … 1068 1068 enddo 1069 1069 !DIR$ VECTOR 1070 endif1070 ENDIF 1071 1071 END DO 1072 1072 do i=1,IMR … … 1091 1091 INTEGER :: IMR,IML,IORD 1092 1092 REAL :: UT,P,DC,flux 1093 real,parameter :: R3 = 1./3., R23 = 2./3.1093 REAL,parameter :: R3 = 1./3., R23 = 2./3. 1094 1094 DIMENSION UT(*),flux(*),P(-IML:IMR+IML+1),DC(-IML:IMR+IML+1) 1095 1095 REAL :: AR(0:IMR),AL(0:IMR),A6(0:IMR) 1096 1096 INTEGER :: LMT,IMP,JLVL,i 1097 ! logicalfirst1097 ! LOGICAL first 1098 1098 ! data first /.TRUE./ 1099 1099 ! SAVE LMT … … 1112 1112 ! else 1113 1113 ! LMT = IORD - 3 1114 ! endif1114 ! ENDIF 1115 1115 ! 1116 1116 LMT = IORD - 3 1117 1117 ! WRITE(6,*) 'PPM option in E-W direction = ', LMT 1118 1118 ! first = .FALSE. 1119 ! endif1119 ! END IF 1120 1120 ! 1121 1121 DO i=1,IMR … … 1145 1145 flux(i) = AL(i) - 0.5*UT(i)*(AR(i) - AL(i) + & 1146 1146 A6(i)*(1.+R23*UT(i))) 1147 endif1147 ENDIF 1148 1148 enddo 1149 1149 RETURN … … 1153 1153 IMPLICIT NONE 1154 1154 INTEGER :: IMR,IML 1155 real,parameter :: R24 = 1./24.1155 REAL,parameter :: R24 = 1./24. 1156 1156 REAL :: P(-IML:IMR+1+IML),DC(-IML:IMR+1+IML) 1157 1157 INTEGER :: i … … 1191 1191 CALL ymist(IMR,JNP,j1,P,DC2,4) 1192 1192 ! 1193 IF(JORD<=0 . or. JORD>=3) THEN1193 IF(JORD<=0 .OR. JORD>=3) THEN 1194 1194 CALL fyppm(VC,P,DC2,fx,IMR,JNP,j1,j2,A6,AR,AL,JORD) 1195 1195 … … 1199 1199 fx(i,j1) = p(i,JT) + (sign(1.,VC(i,j1))-VC(i,j1))*DC2(i,JT) 1200 1200 END DO 1201 endif1202 endif1201 ENDIF 1202 ENDIF 1203 1203 ! 1204 1204 DO i=1,len … … 1232 1232 DQ(i,JMR) = sum2 1233 1233 enddo 1234 endif1234 ENDIF 1235 1235 ! 1236 1236 RETURN … … 1240 1240 IMPLICIT NONE 1241 1241 INTEGER :: IMR,JNP,j1,ID 1242 real,parameter :: R24 = 1./24.1242 REAL,parameter :: R24 = 1./24. 1243 1243 REAL :: P(IMR,JNP),DC(IMR,JNP) 1244 1244 INTEGER :: iimh,jmr,ijm3,imh,i … … 1315 1315 DC(i,JNP) = - DC(i-imh,JNP) 1316 1316 END DO 1317 endif1317 ENDIF 1318 1318 RETURN 1319 1319 END SUBROUTINE ymist … … 1322 1322 IMPLICIT NONE 1323 1323 INTEGER :: IMR,JNP,j1,j2,JORD 1324 real,parameter :: R3 = 1./3., R23 = 2./3.1324 REAL,parameter :: R3 = 1./3., R23 = 2./3. 1325 1325 REAL :: VC(IMR,*),flux(IMR,*),P(IMR,*),DC(IMR,*) 1326 1326 ! Local work arrays. … … 1328 1328 INTEGER :: LMT,i 1329 1329 INTEGER :: IMH,JMR,j11,IMJM1,len 1330 ! logicalfirst1330 ! LOGICAL first 1331 1331 ! data first /.TRUE./ 1332 1332 ! SAVE LMT … … 1348 1348 ! else 1349 1349 ! LMT = JORD - 3 1350 ! endif1350 ! END IF 1351 1351 ! 1352 1352 ! first = .FALSE. 1353 ! endif1353 ! ENDIF 1354 1354 ! 1355 1355 ! modifs pour pouvoir choisir plusieurs schemas PPM … … 1394 1394 flux(i,j1) = AL(i,j1) - 0.5*VC(i,j1)*(AR(i,j1) - AL(i,j1) + & 1395 1395 A6(i,j1)*(1.+R23*VC(i,j1))) 1396 endif1396 ENDIF 1397 1397 END DO 1398 1398 RETURN … … 1498 1498 JMR = JNP-1 1499 1499 do j=j1,j2 1500 IF(J>JS . and. J<JN) GO TO 13091500 IF(J>JS .AND. J<JN) GO TO 1309 1501 1501 ! 1502 1502 do i=1,IMR … … 1527 1527 else 1528 1528 adx(i,j) = qtmp(iiu)+ru*(qtmp(iiu)-qtmp(iiu+1)) 1529 endif1529 ENDIF 1530 1530 enddo 1531 1531 ENDIF … … 1598 1598 ! LMT = 2: POSITIVE-DEFINITE CONSTRAINT 1599 1599 ! 1600 real,parameter :: R12 = 1./12.1600 REAL,parameter :: R12 = 1./12. 1601 1601 REAL :: A6(IM),AR(IM),AL(IM),P(IM),DC(IM) 1602 1602 INTEGER :: IM,LMT … … 1621 1621 A6(i) = 3.*(AR(i)-p(i)) 1622 1622 AL(i) = AR(i) - A6(i) 1623 endif1624 endif1623 ENDIF 1624 ENDIF 1625 1625 END DO 1626 1626 elseif(LMT==1) THEN … … 1628 1628 do i=1,IM 1629 1629 IF(abs(AR(i)-AL(i)) >= -A6(i)) go to 150 1630 IF(p(i)<AR(i) . and. p(i)<AL(i)) THEN1630 IF(p(i)<AR(i) .AND. p(i)<AL(i)) THEN 1631 1631 AR(i) = p(i) 1632 1632 AL(i) = p(i) … … 1638 1638 A6(i) = 3.*(AR(i)-p(i)) 1639 1639 AL(i) = AR(i) - A6(i) 1640 endif1640 ENDIF 1641 1641 150 continue 1642 1642 END DO … … 1646 1646 fmin = p(i) + 0.25*(AR(i)-AL(i))**2/A6(i) + A6(i)*R12 1647 1647 IF(fmin>=0.) go to 250 1648 IF(p(i)<AR(i) . and. p(i)<AL(i)) THEN1648 IF(p(i)<AR(i) .AND. p(i)<AL(i)) THEN 1649 1649 AR(i) = p(i) 1650 1650 AL(i) = p(i) … … 1656 1656 A6(i) = 3.*(AR(i)-p(i)) 1657 1657 AL(i) = AR(i) - A6(i) 1658 endif1658 ENDIF 1659 1659 250 continue 1660 1660 END DO 1661 endif1661 ENDIF 1662 1662 RETURN 1663 1663 END SUBROUTINE lmtppm … … 1708 1708 cose(j) = cose(JNP+2-j) 1709 1709 enddo 1710 endif1710 ENDIF 1711 1711 ! 1712 1712 do j=2,JMR … … 1746 1746 cross,IC,NSTEP) 1747 1747 ! 1748 real,parameter :: tiny = 1.E-601748 REAL,parameter :: tiny = 1.E-60 1749 1749 INTEGER :: IMR,JNP,NLAY,j1,j2,IC,NSTEP 1750 1750 REAL :: Q(IMR,JNP,NLAY),qtmp(IMR,JNP),cosp(*),acosp(*) 1751 logical:: cross1751 LOGICAL :: cross 1752 1752 INTEGER :: NLAYM1,len,ip,L,icr,ipy,ipx,i 1753 1753 REAL :: qup,qly,dup,sum … … 1767 1767 IF(cross) THEN 1768 1768 CALL filcr(q(1,1,L),IMR,JNP,j1,j2,cosp,acosp,icr,tiny) 1769 endif1769 ENDIF 1770 1770 IF(icr==0) goto 50 1771 1771 ! … … 1776 1776 Q(i,j1,2) = Q(i,j1,2) + Q(i,j1,1) 1777 1777 Q(i,j1,1) = 0. 1778 endif1778 ENDIF 1779 1779 enddo 1780 1780 ! … … 1789 1789 IF(cross) THEN 1790 1790 CALL filcr(q(1,1,L),IMR,JNP,j1,j2,cosp,acosp,icr,tiny) 1791 endif1791 ENDIF 1792 1792 IF(icr==0) goto 225 1793 1793 ! … … 1843 1843 WRITE(6,*) 'IC=',IC,' STEP=',NSTEP, & 1844 1844 ' Vertical filling pts=',ip 1845 endif1845 ENDIF 1846 1846 ! 1847 1847 IF(sum>1.e-25) THEN 1848 1848 WRITE(6,*) IC,NSTEP,' Mass source from the ground=',sum 1849 endif1849 ENDIF 1850 1850 RETURN 1851 1851 END SUBROUTINE qckxyz … … 1875 1875 q(i+1,j-1) = (ds - d2)*acosp(j-1) 1876 1876 q(i,j) = (d2 - dq)*acosp(j) + tiny 1877 endif1878 END DO 1879 IF(icr==0 . and. q(IMR,j)>=0.) goto 651877 ENDIF 1878 END DO 1879 IF(icr==0 .AND. q(IMR,j)>=0.) goto 65 1880 1880 DO i=2,IMR 1881 1881 IF(q(i,j)<0.) THEN … … 1894 1894 q(i-1,j-1) = (ds - d2)*acosp(j-1) 1895 1895 q(i,j) = (d2 - dq)*acosp(j) + tiny 1896 endif1896 ENDIF 1897 1897 END DO 1898 1898 ! ***************************************** … … 1914 1914 q(IMR,j-1) = (ds - d2)*acosp(j-1) 1915 1915 q(i,j) = (d2 - dq)*acosp(j) + tiny 1916 endif1916 ENDIF 1917 1917 ! ***************************************** 1918 1918 ! i=IMR … … 1933 1933 q(1,j-1) = (ds - d2)*acosp(j-1) 1934 1934 q(i,j) = (d2 - dq)*acosp(j) + tiny 1935 endif1935 ENDIF 1936 1936 ! ***************************************** 1937 1937 65 continue … … 1939 1939 ! 1940 1940 do i=1,IMR 1941 IF(q(i,j1)<0. . or. q(i,j2)<0.) THEN1941 IF(q(i,j1)<0. .OR. q(i,j2)<0.) THEN 1942 1942 icr = 1 1943 1943 goto 80 1944 endif1944 ENDIF 1945 1945 enddo 1946 1946 ! 1947 1947 80 continue 1948 1948 ! 1949 IF(q(1,1)<0. . or. q(1,jnp)<0.) THEN1949 IF(q(1,1)<0. .OR. q(1,jnp)<0.) THEN 1950 1950 icr = 1 1951 endif1951 ENDIF 1952 1952 ! 1953 1953 RETURN … … 1960 1960 REAL :: DP,CAP1,dq,dn,d0,d1,ds,d2 1961 1961 INTEGER :: i,j 1962 ! logicalfirst1962 ! LOGICAL first 1963 1963 ! data first /.TRUE./ 1964 1964 ! save cap1 … … 1968 1968 CAP1 = IMR*(1.-COS((j1-1.5)*DP))/DP 1969 1969 ! first = .FALSE. 1970 ! endif1970 ! END IF 1971 1971 ! 1972 1972 ipy = 0 … … 1988 1988 q(i,j-1) = (ds - d2)*acosp(j-1) 1989 1989 q(i,j) = (d2 - dq)*acosp(j) + tiny 1990 endif1990 ENDIF 1991 1991 END DO 1992 1992 END DO … … 2002 2002 q(i,j1+1) = (dn - d1)*acosp(j1+1) 2003 2003 q(i,j1) = (d1 - dq)*acosp(j1) + tiny 2004 endif2004 ENDIF 2005 2005 enddo 2006 2006 ! … … 2016 2016 q(i,j-1) = (ds - d2)*acosp(j-1) 2017 2017 q(i,j) = (d2 - dq)*acosp(j) + tiny 2018 endif2018 ENDIF 2019 2019 enddo 2020 2020 ! … … 2027 2027 IF(q(i,j1)<0.) ipy = 1 2028 2028 enddo 2029 endif2029 ENDIF 2030 2030 ! 2031 2031 IF(q(1,JNP)<0.) THEN … … 2036 2036 IF(q(i,j2)<0.) ipy = 1 2037 2037 enddo 2038 endif2038 ENDIF 2039 2039 ! 2040 2040 RETURN … … 2070 2070 qtmp(j,i+1) = qtmp(j,i+1) - d2 2071 2071 qtmp(j,i) = qtmp(j,i) + d2 + tiny 2072 endif2072 ENDIF 2073 2073 END DO 2074 2074 END DO … … 2089 2089 ! 2090 2090 qtmp(j,i) = qtmp(j,i) + d2 + tiny 2091 endif2091 ENDIF 2092 2092 END DO 2093 2093 i=IMR … … 2106 2106 ! 2107 2107 qtmp(j,i) = qtmp(j,i) + d2 + tiny 2108 endif2108 ENDIF 2109 2109 END DO 2110 2110 ! … … 2118 2118 ! 2119 2119 ! Poles. 2120 IF(q(1,1)<0 . or. q(1,JNP)<0.) ipx = 12121 endif2120 IF(q(1,1)<0 .OR. q(1,JNP)<0.) ipx = 1 2121 ENDIF 2122 2122 RETURN 2123 2123 END SUBROUTINE filew
Note: See TracChangeset
for help on using the changeset viewer.