Tracer modules now also comply with Fortran 2018 deletions
This commit is contained in:
1 parent
aadc35669d
commit
d9afd3b908
2 files changed
+335
-271
No files matched your search
@@ -336,23 +336,23 @@
|
||||
js(k) = j1
|
||||
jn(k) = j2
|
||||
|
||||
do 111 j=js0,j1+1,-1
|
||||
do 111 i=1,im
|
||||
outer1: do j=js0,j1+1,-1
|
||||
do i=1,im
|
||||
if(abs(crx(i,j,k)) .gt. 1.) then
|
||||
js(k) = j
|
||||
go to 112
|
||||
exit outer1
|
||||
endif
|
||||
111 continue
|
||||
112 continue
|
||||
enddo
|
||||
enddo outer1
|
||||
|
||||
do 122 j=jn0,j2-1
|
||||
do 122 i=1,im
|
||||
outer2: do j=jn0,j2-1
|
||||
do i=1,im
|
||||
if(abs(crx(i,j,k)) .gt. 1.) then
|
||||
jn(k) = j
|
||||
go to 133
|
||||
exit outer2
|
||||
endif
|
||||
122 continue
|
||||
133 continue
|
||||
enddo
|
||||
enddo outer2
|
||||
|
||||
enddo !vertical layer loop
|
||||
|
||||
@@ -590,14 +590,18 @@
|
||||
wk(:,:,1) = q(:,:,k,ic) + 0.5*wk(:,:,1)
|
||||
|
||||
! N-S advective cross term
|
||||
do 66 j=j1,j2
|
||||
do 66 i=1,im
|
||||
do j=j1,j2
|
||||
do i=1,im
|
||||
jt = float(j) - v(i,j,k)
|
||||
66 wk(i,j,2) = v(i,j,k) * (q(i,jt,k,ic) - q(i,jt+1,k,ic))
|
||||
wk(i,j,2) = v(i,j,k) * (q(i,jt,k,ic) - q(i,jt+1,k,ic))
|
||||
enddo
|
||||
enddo
|
||||
|
||||
do 77 j=j1,j2
|
||||
do 77 i=1,im
|
||||
77 wk(i,j,2) = q(i,j,k,ic) + 0.5*wk(i,j,2)
|
||||
do j=j1,j2
|
||||
do i=1,im
|
||||
wk(i,j,2) = q(i,j,k,ic) + 0.5*wk(i,j,2)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
! compute flux in E-W direction
|
||||
@@ -616,19 +620,23 @@
|
||||
! vertical transport operator FZPPM
|
||||
! Note: DQ contains only first order upwind contribution.
|
||||
|
||||
do 88 j=1,JM
|
||||
do 88 i=1,IM
|
||||
88 qz(i,j,k) = DQ(i,j,k) / delp(i,j,k)
|
||||
do j=1,JM
|
||||
do i=1,IM
|
||||
qz(i,j,k) = DQ(i,j,k) / delp(i,j,k)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
else
|
||||
|
||||
do 99 j=1,JM
|
||||
do 99 i=1,IM
|
||||
99 qz(i,j,k) = q(i,j,k,IC)
|
||||
do j=1,JM
|
||||
do i=1,IM
|
||||
qz(i,j,k) = q(i,j,k,IC)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
endif
|
||||
|
||||
2500 continue ! k-loop
|
||||
enddo ! k-loop
|
||||
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
! Compute fluxes in the vertical direction
|
||||
@@ -647,15 +655,17 @@
|
||||
|
||||
DO k=1,NL
|
||||
|
||||
DO 560 j=1,JM
|
||||
DO 560 i=1,IM
|
||||
560 qlow(i,j,k) = DQ(i,j,k) / delp2(i,j,k)
|
||||
DO j=1,JM
|
||||
DO i=1,IM
|
||||
qlow(i,j,k) = DQ(i,j,k) / delp2(i,j,k)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
if(j1.ne.2) then
|
||||
DO 561 i=1,IM
|
||||
DO i=1,IM
|
||||
qlow(i, 2,k) = qlow(i, 1,k)
|
||||
qlow(i,jm-1,k) = qlow(i,jm,k)
|
||||
561 CONTINUE
|
||||
enddo
|
||||
endif
|
||||
|
||||
enddo
|
||||
@@ -672,15 +682,15 @@
|
||||
!MIC$ do all autoscope
|
||||
!MIC$* private(i,j,k,sum1,sum2)
|
||||
|
||||
do 101 k=1,NL
|
||||
do k=1,NL
|
||||
|
||||
do 425 j=j1,j2
|
||||
do 425 i=1,IM
|
||||
do j=j1,j2
|
||||
do i=1,IM
|
||||
DQ(i,j,k) = DQ(i,j,k) + fx(i,j,k) - fx(i+1,j,k) &
|
||||
+ (fy(i,j,k) - fy(i,j+1,k))*acosp(j)/dlat(j) &
|
||||
+ fz(i,j,k) - fz(i,j,k+1)
|
||||
425 continue
|
||||
|
||||
enddo
|
||||
enddo
|
||||
! poles:
|
||||
sum1 = fy(IM,j1 ,k)
|
||||
sum2 = fy(IM,J2+1,k)
|
||||
@@ -698,7 +708,7 @@
|
||||
DQ(i,JM,k) = DQ(1,JM,k)
|
||||
enddo
|
||||
|
||||
101 continue
|
||||
enddo
|
||||
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
if(FILL) call qckxyz(DQ,DG2,IM,JM,NL,j1,j2,cosp,acosp,IC)
|
||||
@@ -724,7 +734,7 @@
|
||||
q(:,:,:,IC) = DQ(:,:,:) / delp2dyn(:,:,:)
|
||||
end select
|
||||
|
||||
5000 continue !tracer loop
|
||||
enddo !tracer loop
|
||||
|
||||
if (debug) then
|
||||
write(nud,*) '* Leaving routine tpcore'
|
||||
@@ -766,7 +776,7 @@
|
||||
!MIC$* shared(im,j1,j2,km,CRX,CRY,adx,ady,Qmax,Qmin)
|
||||
!MIC$* private(i,j,k,IT,JT,PS1,PS2,PN1,PN2)
|
||||
|
||||
DO 1000 k=1,km
|
||||
DO k=1,km
|
||||
do j=j1,j2
|
||||
DO i=1,IM
|
||||
|
||||
@@ -797,9 +807,9 @@
|
||||
Qmax(i,JM,k) = PN1
|
||||
Qmin(i,JM,k) = PN2
|
||||
enddo
|
||||
1000 continue
|
||||
enddo
|
||||
|
||||
123 continue
|
||||
! 123 continue
|
||||
! Flux Limiter
|
||||
|
||||
!MIC$ do all autoscope
|
||||
@@ -807,7 +817,7 @@
|
||||
!MIC$* private(wkx,wkn)
|
||||
!MIC$* private(i,j,k,ain,aou,bin,bou,cin,cou,btop,bdon)
|
||||
|
||||
DO 2000 k=1,km
|
||||
DO k=1,km
|
||||
|
||||
DO j=j1,j2
|
||||
DO i=1,IM
|
||||
@@ -960,13 +970,14 @@
|
||||
ady(i,JM1,k) = ady(i,JM,k)
|
||||
enddo
|
||||
endif
|
||||
2000 continue
|
||||
|
||||
enddo
|
||||
|
||||
!MIC$ do all autoscope
|
||||
!MIC$* shared(fz,adx,ady,im,jm,km)
|
||||
!MIC$* private(i,j,k)
|
||||
|
||||
DO 3000 k=1,km
|
||||
DO k=1,km
|
||||
DO j=j1,j2
|
||||
do i=2,IM
|
||||
if(fx(i,j,k) .gt. 0.) then
|
||||
@@ -1009,7 +1020,7 @@
|
||||
enddo
|
||||
endif
|
||||
|
||||
3000 continue
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
||||
@@ -1037,18 +1048,22 @@
|
||||
if(JORD.eq.1) then
|
||||
! upwind scheme
|
||||
|
||||
do 1000 j=2,jnp
|
||||
do 1000 i=1,imr
|
||||
do j=2,jnp
|
||||
do i=1,imr
|
||||
if ( c(i,j).le.0. ) then
|
||||
jt = j
|
||||
else
|
||||
jt = j-1
|
||||
endif
|
||||
1000 fy1(i,j) = p(i,jt)
|
||||
fy1(i,j) = p(i,jt)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
do 1050 j=j1,j2+1
|
||||
do 1050 i=1,imr
|
||||
1050 fy2(i,j) = 0.
|
||||
do j=j1,j2+1
|
||||
do i=1,imr
|
||||
fy2(i,j) = 0.
|
||||
enddo
|
||||
enddo
|
||||
|
||||
else
|
||||
|
||||
@@ -1062,27 +1077,33 @@
|
||||
|
||||
else
|
||||
! van Leer
|
||||
do 1200 j=2,jnp
|
||||
do 1200 i=1,imr
|
||||
do j=2,jnp
|
||||
do i=1,imr
|
||||
if ( c(i,j).le.0. ) then
|
||||
jt = j
|
||||
else
|
||||
jt = j-1
|
||||
endif
|
||||
fy1(i,j) = p(i,jt)
|
||||
1200 fy2(i,j) = (sign(1.,C(i,j))-C(i,j)/dlat(jt))*DC2(i,jt)
|
||||
fy2(i,j) = (sign(1.,C(i,j))-C(i,j)/dlat(jt))*DC2(i,jt)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
endif ! van Leer or PPM
|
||||
endif ! upwind or higher order
|
||||
|
||||
do 1300 j=2,jnp
|
||||
do 1300 i=1,imr
|
||||
do j=2,jnp
|
||||
do i=1,imr
|
||||
fy1(i,j) = fy1(i,j)*ymass(i,j)
|
||||
1300 fy2(i,j) = fy2(i,j)*ymass(i,j)
|
||||
fy2(i,j) = fy2(i,j)*ymass(i,j)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
DO 1400 j=j1,j2
|
||||
DO 1400 i=1,IMR
|
||||
1400 DQ(i,j) = DQ(i,j) + (fy1(i,j) - fy1(i,j+1)) * acosp(j)/dlat(j)
|
||||
DO j=j1,j2
|
||||
DO i=1,IMR
|
||||
DQ(i,j) = DQ(i,j) + (fy1(i,j) - fy1(i,j+1)) * acosp(j)/dlat(j)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
! Poles
|
||||
sum1 = fy1(IMR,j1 )
|
||||
@@ -1133,18 +1154,19 @@
|
||||
imh = imr / 2
|
||||
jmr = jnp - 1
|
||||
|
||||
do 10 j=2,jmr
|
||||
do 10 i=1,imr
|
||||
do j=2,jmr
|
||||
do i=1,imr
|
||||
tmp = 0.25*(p(i,j+1) - p(i,j-1))
|
||||
pmax = max(p(i,j-1),p(i,j),p(i,j+1)) - p(i,j)
|
||||
pmin = p(i,j) - min(p(i,j-1),p(i,j),p(i,j+1))
|
||||
dc(i,j) = sign(min(abs(tmp),pmin,pmax),tmp)
|
||||
10 continue
|
||||
enddo
|
||||
enddo
|
||||
!
|
||||
! Poles:
|
||||
! Determine slopes in polar caps for scalars!
|
||||
|
||||
do 20 i=1,IMH
|
||||
do i=1,IMH
|
||||
! South
|
||||
tmp = 0.25*(p(i,2) - p(i+imh,2))
|
||||
Pmax = max(p(i,2),p(i,1), p(i+imh,2)) - p(i,1)
|
||||
@@ -1155,13 +1177,13 @@
|
||||
Pmax = max(p(i+imh,JMR),p(i,jnp), p(i,JMR)) - p(i,JNP)
|
||||
Pmin = p(i,JNP) - min(p(i+imh,JMR),p(i,jnp), p(i,JMR))
|
||||
DC(i,JNP) = sign(min(abs(tmp),Pmax,pmin),tmp)
|
||||
20 continue
|
||||
enddo
|
||||
|
||||
! Scalars:
|
||||
do 25 i=imh+1,IMR
|
||||
do i=imh+1,IMR
|
||||
DC(i, 1) = - DC(i-imh, 1)
|
||||
DC(i,JNP) = - DC(i-imh,JNP)
|
||||
25 continue
|
||||
enddo
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
!MIC$* shared(P,Qmax,Qmin,im,jm,j1,j2)
|
||||
!MIC$* private(k,bt,bd)
|
||||
|
||||
DO 1000 k=1,km
|
||||
DO k=1,km
|
||||
call hilo(P(1,1,k),im,jm,j1,j2,Qmax(1,1,k),Qmin(1,1,k),bt,bd)
|
||||
1000 continue
|
||||
enddo
|
||||
|
||||
km1 = km-1
|
||||
km2 = km-2
|
||||
@@ -20,8 +20,8 @@
|
||||
!MIC$* shared(Pmax,Pmin,Qmax,Qmin,im,jm,km,km1,km2)
|
||||
!MIC$* private(i,j)
|
||||
|
||||
DO 2000 j=1,jm
|
||||
DO 2000 i=1,im
|
||||
DO j=1,jm
|
||||
DO i=1,im
|
||||
! k=1 and k=km
|
||||
Pmax(i,j, 1) = max(Qmax(i,j, 2),Qmax(i,j, 1))
|
||||
Pmin(i,j, 1) = min(Qmin(i,j, 2),Qmin(i,j, 1))
|
||||
@@ -32,18 +32,21 @@
|
||||
Pmin(i,j, 2) = min(Qmin(i,j, 3),Pmin(i,j, 1))
|
||||
Pmax(i,j,km1) = max(Qmax(i,j,km2),Pmax(i,j,km))
|
||||
Pmin(i,j,km1) = min(Qmin(i,j,km2),Pmin(i,j,km))
|
||||
2000 continue
|
||||
enddo
|
||||
enddo
|
||||
|
||||
!MIC$ do all autoscope
|
||||
!MIC$* shared(Pmax,Pmin,Qmax,Qmin,im,jm,km,km1,km2)
|
||||
!MIC$* private(i,j,k)
|
||||
|
||||
DO 3000 k=3,km2
|
||||
DO 3000 j=1,jm
|
||||
DO 3000 i=1,im
|
||||
DO k=3,km2
|
||||
DO j=1,jm
|
||||
DO i=1,im
|
||||
Pmax(i,j,k) = max(Qmax(i,j,k-1),Qmax(i,j,k),Qmax(i,j,k+1))
|
||||
Pmin(i,j,k) = min(Qmin(i,j,k-1),Qmin(i,j,k),Qmin(i,j,k+1))
|
||||
3000 continue
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
return
|
||||
end
|
||||
|
||||
@@ -148,18 +151,22 @@
|
||||
!MIC$* private(i,j,k,c1,c2,tmp,qmax,qmin,A1,A2,d1,d2,qm,dp,c3)
|
||||
!MIC$* private(cmax,cmin,DC,delq,AR,AL,A6,CM,CP)
|
||||
|
||||
do 4000 j=1,JNP
|
||||
do j=1,JNP
|
||||
|
||||
do 500 k=2,km
|
||||
do 500 i=1,IMR
|
||||
500 A6(i,k) = delp(i,j,k-1) + delp(i,j,k)
|
||||
do k=2,km
|
||||
do i=1,IMR
|
||||
A6(i,k) = delp(i,j,k-1) + delp(i,j,k)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
do 1000 k=1,km1
|
||||
do 1000 i=1,IMR
|
||||
1000 delq(i,k) = P(i,j,k+1) - P(i,j,k)
|
||||
do k=1,km1
|
||||
do i=1,IMR
|
||||
delq(i,k) = P(i,j,k+1) - P(i,j,k)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
DO 1220 k=2,km1
|
||||
DO 1220 I=1,IMR
|
||||
DO k=2,km1
|
||||
DO I=1,IMR
|
||||
c1 = (delp(i,j,k-1)+0.5*delp(i,j,k))/A6(i,k+1)
|
||||
c2 = (delp(i,j,k+1)+0.5*delp(i,j,k))/A6(i,k)
|
||||
tmp = delp(i,j,k)*(c1*delq(i,k) + c2*delq(i,k-1)) &
|
||||
@@ -167,7 +174,8 @@
|
||||
Qmax = max(P(i,j,k-1),P(i,j,k),P(i,j,k+1)) - P(i,j,k)
|
||||
Qmin = P(i,j,k) - min(P(i,j,k-1),P(i,j,k),P(i,j,k+1))
|
||||
DC(i,k) = sign(min(abs(tmp),Qmax,Qmin), tmp)
|
||||
1220 CONTINUE
|
||||
enddo
|
||||
enddo
|
||||
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
! Compute the first guess at cell interface
|
||||
@@ -176,19 +184,20 @@
|
||||
|
||||
! Interior.
|
||||
|
||||
DO 12 k=3,km1
|
||||
DO 12 i=1,IMR
|
||||
DO k=3,km1
|
||||
DO i=1,IMR
|
||||
c1 = delq(i,k-1)*delp(i,j,k-1) / A6(i,k)
|
||||
A1 = A6(i,k-1) / (A6(i,k) + delp(i,j,k-1))
|
||||
A2 = A6(i,k+1) / (A6(i,k) + delp(i,j,k))
|
||||
AL(i,k) = P(i,j,k-1) + c1 + 2./(A6(i,k-1)+A6(i,k+1)) * &
|
||||
( delp(i,j,k )*(c1*(A1 - A2)+A2*DC(i,k-1)) - &
|
||||
delp(i,j,k-1)*A1*DC(i,k ) )
|
||||
12 CONTINUE
|
||||
enddo
|
||||
enddo
|
||||
|
||||
! Area preserving cubic with 2nd deriv. = 0 at the boundaries
|
||||
! Top
|
||||
DO 10 i=1,IMR
|
||||
DO i=1,IMR
|
||||
d1 = delp(i,j,1)
|
||||
d2 = delp(i,j,2)
|
||||
qm = (d2*P(i,j,1)+d1*P(i,j,2)) / (d1+d2)
|
||||
@@ -205,10 +214,11 @@
|
||||
Cmin = min(P(i,j,1), P(i,j,2))
|
||||
AL(i,2) = max(Cmin,AL(i,2))
|
||||
AL(i,2) = min(Cmax,AL(i,2))
|
||||
10 continue
|
||||
enddo
|
||||
|
||||
|
||||
! Bottom
|
||||
DO 15 i=1,IMR
|
||||
DO i=1,IMR
|
||||
d1 = delp(i,j,km )
|
||||
d2 = delp(i,j,km1)
|
||||
qm = (d2*P(i,j,km)+d1*P(i,j,km1)) / (d1+d2)
|
||||
@@ -225,19 +235,21 @@
|
||||
AL(i,km) = min(Cmax,AL(i,km))
|
||||
AR(i,km) = max(Bmin,AR(i,km))
|
||||
AR(i,km) = min(Bmax,AR(i,km))
|
||||
15 continue
|
||||
enddo
|
||||
|
||||
do 20 k=1,km1
|
||||
do 20 i=1,IMR
|
||||
do k=1,km1
|
||||
do i=1,IMR
|
||||
AR(i,k) = AL(i,k+1)
|
||||
20 continue
|
||||
enddo
|
||||
enddo
|
||||
|
||||
! f(s) = AL + s*[(AR-AL) + A6*(1-s)] ( 0 <= s <= 1 )
|
||||
|
||||
do 30 k=1,NL
|
||||
do 30 i=1,IMR
|
||||
do k=1,NL
|
||||
do i=1,IMR
|
||||
A6(i,k) = 3.*(P(i,j,k)+P(i,j,k) - (AL(i,k)+AR(i,k)))
|
||||
30 continue
|
||||
enddo
|
||||
enddo
|
||||
|
||||
! Top
|
||||
call lmtppm(DC(1,1),A6(1,1),AR(1,1),AL(1,1),P(1,j,1), &
|
||||
@@ -253,8 +265,8 @@
|
||||
enddo
|
||||
endif
|
||||
|
||||
DO 140 k=2,NL
|
||||
DO 140 i=1,IMR
|
||||
DO k=2,NL
|
||||
DO i=1,IMR
|
||||
IF(WZ(i,j,k-1).GT.0.) then
|
||||
CM = WZ(i,j,k-1) / delp(i,j,k-1)
|
||||
DC(i,k) = P(i,j,k-1)
|
||||
@@ -266,26 +278,30 @@
|
||||
fz(i,j,k) = AL(i,k)+0.5*CP*(AL(i,k)-AR(i,k)- &
|
||||
A6(i,k)*(1.+R23*CP))
|
||||
endif
|
||||
140 continue
|
||||
enddo
|
||||
enddo
|
||||
|
||||
DO 250 k=2,NL
|
||||
DO 250 i=1,IMR
|
||||
DO k=2,NL
|
||||
DO i=1,IMR
|
||||
fz(i,j,k) = WZ(i,j,k-1) * (fz(i,j,k) - DC(i,k))
|
||||
DC(i,k) = WZ(i,j,k-1) * DC(i,k)
|
||||
250 continue
|
||||
enddo
|
||||
enddo
|
||||
|
||||
do 350 i=1,IMR
|
||||
do i=1,IMR
|
||||
fz(i,j, 1) = 0.
|
||||
fz(i,j,NL+1) = 0.
|
||||
DQ(i,j, 1) = DQ(i,j, 1) - DC(i, 2)
|
||||
DQ(i,j,NL) = DQ(i,j,NL) + DC(i,NL)
|
||||
350 continue
|
||||
enddo
|
||||
|
||||
do 360 k=2,km1
|
||||
do 360 i=1,IMR
|
||||
360 DQ(i,j,k) = DQ(i,j,k) + DC(i,k) - DC(i,k+1)
|
||||
do k=2,km1
|
||||
do i=1,IMR
|
||||
DQ(i,j,k) = DQ(i,j,k) + DC(i,k) - DC(i,k+1)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
4000 continue
|
||||
enddo
|
||||
return
|
||||
end
|
||||
|
||||
@@ -305,121 +321,128 @@
|
||||
j1vl = j1+jvan
|
||||
j2vl = j2-jvan
|
||||
!
|
||||
do 1310 j=j1,j2
|
||||
do j=j1,j2
|
||||
!
|
||||
do i=1,IMR
|
||||
qtmp(i) = q(i,j)
|
||||
enddo
|
||||
!
|
||||
if(j.ge.JN .or. j.le.JS) goto 2222
|
||||
if(j.ge.JN .or. j.le.JS) then
|
||||
!
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
! *** Conservative (flux-form) Semi-Lagrangian transport ***
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
!
|
||||
do i=-IML,0
|
||||
qtmp(i) = q(IMR+i,j)
|
||||
qtmp(IMP-i) = q(1-i,j)
|
||||
enddo
|
||||
!
|
||||
IF(IORD.eq.1 .or. j.eq.j1 .or. j.eq.j2) THEN
|
||||
DO i=1,IMR
|
||||
itmp = INT(c(i,j))
|
||||
ISAVE(i) = i - itmp
|
||||
iu = i - c(i,j)
|
||||
fx1(i) = (c(i,j) - itmp)*qtmp(iu)
|
||||
ENDDO
|
||||
!
|
||||
! Zero high order contribution
|
||||
DO i=1,IMR
|
||||
fx2(i,j) = 0.
|
||||
enddo
|
||||
ELSE
|
||||
call xmist(IMR,IML,Qtmp,DC)
|
||||
!
|
||||
do i=-IML,0
|
||||
DC(i) = DC(IMR+i)
|
||||
DC(IMP-i) = DC(1-i)
|
||||
enddo
|
||||
!
|
||||
DO i=1,IMR
|
||||
itmp = INT(c(i,j))
|
||||
rut = c(i,j) - itmp
|
||||
ISAVE(i) = i - itmp
|
||||
iu = i - c(i,j)
|
||||
fx1(i ) = rut*qtmp(iu)
|
||||
fx2(i,j) = rut*DC(iu)*(sign(1.,rut) - rut)
|
||||
ENDDO
|
||||
ENDIF
|
||||
!
|
||||
do i=1,IMR
|
||||
IF(c(i,j).GT.1.) then
|
||||
!DIR$ NOVECTOR
|
||||
do ist = ISAVE(i),i-1
|
||||
fx1(i) = fx1(i) + qtmp(ist)
|
||||
enddo
|
||||
elseIF(c(i,j).LT.-1.) then
|
||||
!DIR$ NOVECTOR
|
||||
do ist = i,ISAVE(i)-1
|
||||
fx1(i) = fx1(i) - qtmp(ist)
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
!DIR$ VECTOR
|
||||
do i=1,IMR
|
||||
fx1(i) = PU(i,j)*fx1(i)
|
||||
fx2(i,j) = PU(i,j)*fx2(i,j)
|
||||
enddo
|
||||
|
||||
else
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
! *** Eulerian ***
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
!
|
||||
qtmp(0) = q(IMR,J)
|
||||
qtmp(-1) = q(IMR-1,J)
|
||||
qtmp(IMP) = q(1,J)
|
||||
qtmp(IMP+1) = q(2,J)
|
||||
qtmp(0) = q(IMR,J)
|
||||
qtmp(-1) = q(IMR-1,J)
|
||||
qtmp(IMP) = q(1,J)
|
||||
qtmp(IMP+1) = q(2,J)
|
||||
!
|
||||
IF(IORD.eq.1 .or. j.eq.j1 .or. j.eq.j2) THEN
|
||||
DO i=1,IMR
|
||||
iu = float(i) - c(i,j)
|
||||
fx1(i) = qtmp(iu)
|
||||
ENDDO
|
||||
!
|
||||
! Zero high order contribution
|
||||
DO i=1,IMR
|
||||
fx2(i,j) = 0.
|
||||
enddo
|
||||
ELSE
|
||||
call xmist(IMR,IML,Qtmp,DC)
|
||||
DC(0) = DC(IMR)
|
||||
!
|
||||
if(IORD.eq.2 .or. j.le.j1vl .or. j.ge.j2vl) then
|
||||
DO i=1,IMR
|
||||
iu = float(i) - c(i,j)
|
||||
fx1(i ) = qtmp(iu)
|
||||
fx2(i,j) = DC(iu)*(sign(1.,c(i,j))-c(i,j))
|
||||
ENDDO
|
||||
else
|
||||
call fxppm(IMR,IML,C(1,j),Qtmp,DC,fx1,fx2(1,j),IORD)
|
||||
endif
|
||||
!
|
||||
ENDIF
|
||||
!
|
||||
DO i=1,IMR
|
||||
fx1(i ) = fx1(i )*xmass(i,j)
|
||||
fx2(i,j) = fx2(i,j)*xmass(i,j)
|
||||
ENDDO
|
||||
!
|
||||
IF(IORD.eq.1 .or. j.eq.j1 .or. j.eq.j2) THEN
|
||||
DO 1406 i=1,IMR
|
||||
iu = float(i) - c(i,j)
|
||||
1406 fx1(i) = qtmp(iu)
|
||||
!
|
||||
! Zero high order contribution
|
||||
DO i=1,IMR
|
||||
fx2(i,j) = 0.
|
||||
enddo
|
||||
ELSE
|
||||
call xmist(IMR,IML,Qtmp,DC)
|
||||
DC(0) = DC(IMR)
|
||||
!
|
||||
if(IORD.eq.2 .or. j.le.j1vl .or. j.ge.j2vl) then
|
||||
DO 1408 i=1,IMR
|
||||
iu = float(i) - c(i,j)
|
||||
fx1(i ) = qtmp(iu)
|
||||
1408 fx2(i,j) = DC(iu)*(sign(1.,c(i,j))-c(i,j))
|
||||
else
|
||||
call fxppm(IMR,IML,C(1,j),Qtmp,DC,fx1,fx2(1,j),IORD)
|
||||
endif
|
||||
!
|
||||
ENDIF
|
||||
!
|
||||
DO 1506 i=1,IMR
|
||||
fx1(i ) = fx1(i )*xmass(i,j)
|
||||
1506 fx2(i,j) = fx2(i,j)*xmass(i,j)
|
||||
!
|
||||
goto 1309
|
||||
!
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
! *** Conservative (flux-form) Semi-Lagrangian transport ***
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
!
|
||||
2222 continue
|
||||
!
|
||||
do i=-IML,0
|
||||
qtmp(i) = q(IMR+i,j)
|
||||
qtmp(IMP-i) = q(1-i,j)
|
||||
enddo
|
||||
!
|
||||
IF(IORD.eq.1 .or. j.eq.j1 .or. j.eq.j2) THEN
|
||||
DO 1306 i=1,IMR
|
||||
itmp = INT(c(i,j))
|
||||
ISAVE(i) = i - itmp
|
||||
iu = i - c(i,j)
|
||||
1306 fx1(i) = (c(i,j) - itmp)*qtmp(iu)
|
||||
!
|
||||
! Zero high order contribution
|
||||
DO i=1,IMR
|
||||
fx2(i,j) = 0.
|
||||
enddo
|
||||
ELSE
|
||||
call xmist(IMR,IML,Qtmp,DC)
|
||||
!
|
||||
do i=-IML,0
|
||||
DC(i) = DC(IMR+i)
|
||||
DC(IMP-i) = DC(1-i)
|
||||
enddo
|
||||
!
|
||||
DO 1307 i=1,IMR
|
||||
itmp = INT(c(i,j))
|
||||
rut = c(i,j) - itmp
|
||||
ISAVE(i) = i - itmp
|
||||
iu = i - c(i,j)
|
||||
fx1(i ) = rut*qtmp(iu)
|
||||
1307 fx2(i,j) = rut*DC(iu)*(sign(1.,rut) - rut)
|
||||
ENDIF
|
||||
!
|
||||
do 1308 i=1,IMR
|
||||
IF(c(i,j).GT.1.) then
|
||||
!DIR$ NOVECTOR
|
||||
do ist = ISAVE(i),i-1
|
||||
fx1(i) = fx1(i) + qtmp(ist)
|
||||
enddo
|
||||
elseIF(c(i,j).LT.-1.) then
|
||||
!DIR$ NOVECTOR
|
||||
do ist = i,ISAVE(i)-1
|
||||
fx1(i) = fx1(i) - qtmp(ist)
|
||||
enddo
|
||||
endif
|
||||
1308 continue
|
||||
!DIR$ VECTOR
|
||||
do i=1,IMR
|
||||
fx1(i) = PU(i,j)*fx1(i)
|
||||
fx2(i,j) = PU(i,j)*fx2(i,j)
|
||||
enddo
|
||||
!
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
!
|
||||
1309 fx1(IMP ) = fx1(1 )
|
||||
fx1(IMP ) = fx1(1 )
|
||||
fx2(IMP,j) = fx2(1,j)
|
||||
! Update using low order fluxes.
|
||||
DO 1215 i=1,IMR
|
||||
1215 DQ(i,j) = DQ(i,j) + fx1(i)-fx1(i+1)
|
||||
DO i=1,IMR
|
||||
DQ(i,j) = DQ(i,j) + fx1(i)-fx1(i+1)
|
||||
ENDDO
|
||||
!
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
!
|
||||
1310 continue
|
||||
enddo
|
||||
return
|
||||
end
|
||||
|
||||
@@ -432,15 +455,18 @@
|
||||
|
||||
LMT = IORD - 3
|
||||
|
||||
DO 10 i=1,IMR
|
||||
10 AL(i) = 0.5*(p(i-1)+p(i)) + (DC(i-1) - DC(i))*R3
|
||||
DO i=1,IMR
|
||||
AL(i) = 0.5*(p(i-1)+p(i)) + (DC(i-1) - DC(i))*R3
|
||||
ENDDO
|
||||
|
||||
do 20 i=1,IMR-1
|
||||
20 AR(i) = AL(i+1)
|
||||
do i=1,IMR-1
|
||||
AR(i) = AL(i+1)
|
||||
enddo
|
||||
AR(IMR) = AL(1)
|
||||
|
||||
do 30 i=1,IMR
|
||||
30 A6(i) = 3.*(p(i)+p(i) - (AL(i)+AR(i)))
|
||||
do i=1,IMR
|
||||
A6(i) = 3.*(p(i)+p(i) - (AL(i)+AR(i)))
|
||||
enddo
|
||||
|
||||
if(LMT.LE.2) call lmtppm(DC(1),A6(1),AR(1),AL(1),P(1),IMR,LMT)
|
||||
|
||||
@@ -481,10 +507,10 @@
|
||||
len = IMR*(J2-J1+3)
|
||||
LMT = JORD - 3
|
||||
|
||||
DO 10 i=1,IMR*JMR
|
||||
DO i=1,IMR*JMR
|
||||
AL(i,2) = 0.5*(p(i,1)+p(i,2)) + (DC(i,1) - DC(i,2))*R3
|
||||
AR(i,1) = AL(i,2)
|
||||
10 CONTINUE
|
||||
ENDDO
|
||||
!
|
||||
! Poles:
|
||||
!
|
||||
@@ -496,13 +522,14 @@
|
||||
AR(i+IMH,JNP) = AR(i,JMR)
|
||||
enddo
|
||||
!
|
||||
do 30 i=1,len
|
||||
30 A6(i,j11) = 3.*(p(i,j11)+p(i,j11) - (AL(i,j11)+AR(i,j11)))
|
||||
do i=1,len
|
||||
A6(i,j11) = 3.*(p(i,j11)+p(i,j11) - (AL(i,j11)+AR(i,j11)))
|
||||
enddo
|
||||
|
||||
if(LMT.le.2) call lmtppm(DC(1,j11),A6(1,j11),AR(1,j11), &
|
||||
AL(1,j11),P(1,j11),len,LMT)
|
||||
|
||||
DO 140 i=1,IMJM1
|
||||
DO i=1,IMJM1
|
||||
IF(C(i,j1).GT.0.) then
|
||||
fy1(i,j1) = P(i,j11)
|
||||
fy2(i,j1) = AR(i,j11) + 0.5*C(i,j1)*(AL(i,j11) - AR(i,j11) + &
|
||||
@@ -512,7 +539,7 @@
|
||||
fy2(i,j1) = AL(i,j1) - 0.5*C(i,j1)*(AR(i,j1) - AL(i,j1) + &
|
||||
A6(i,j1)*(1.+R23*C(i,j1)))
|
||||
endif
|
||||
140 continue
|
||||
ENDDO
|
||||
|
||||
DO i=1,IMJM1
|
||||
fy2(i,j1) = fy2(i,j1) - fy1(i,j1)
|
||||
@@ -526,8 +553,8 @@
|
||||
REAL p(IMR,JNP),adx(IMR,JNP),qtmp(-IMR:IMR+IMR),UA(IMR,JNP)
|
||||
|
||||
JMR = JNP-1
|
||||
do 1309 j=j1,j2
|
||||
if(J.GT.JS .and. J.LT.JN) GO TO 1309
|
||||
outer: do j=j1,j2
|
||||
if(J.GT.JS .and. J.LT.JN) EXIT outer
|
||||
|
||||
do i=1,IMR
|
||||
qtmp(i) = p(i,j)
|
||||
@@ -552,7 +579,7 @@
|
||||
do i=1,IMR
|
||||
adx(i,j) = adx(i,j) - p(i,j)
|
||||
enddo
|
||||
1309 continue
|
||||
enddo outer
|
||||
|
||||
! Eulerian upwind
|
||||
|
||||
@@ -593,11 +620,12 @@
|
||||
!
|
||||
! 2nd order version.
|
||||
!
|
||||
do 10 i=1,IMR
|
||||
do i=1,IMR
|
||||
tmp = 0.25*(p(i+1) - p(i-1))
|
||||
Pmax = max(P(i-1), p(i), p(i+1)) - p(i)
|
||||
Pmin = p(i) - min(P(i-1), p(i), p(i+1))
|
||||
10 DC(i) = sign(min(abs(tmp),Pmax,Pmin), tmp)
|
||||
DC(i) = sign(min(abs(tmp),Pmax,Pmin), tmp)
|
||||
enddo
|
||||
return
|
||||
end
|
||||
|
||||
@@ -623,7 +651,7 @@
|
||||
|
||||
if(LMT.eq.0) then
|
||||
! Full constraint
|
||||
do 100 i=1,IM
|
||||
do i=1,IM
|
||||
if(DC(i).eq.0.) then
|
||||
AR(i) = p(i)
|
||||
AL(i) = p(i)
|
||||
@@ -640,11 +668,12 @@
|
||||
AL(i) = AR(i) - A6(i)
|
||||
endif
|
||||
endif
|
||||
100 continue
|
||||
elseif(LMT.eq.1) then
|
||||
enddo
|
||||
|
||||
else if(LMT.eq.1) then
|
||||
! Semi-monotonic constraint
|
||||
do 150 i=1,IM
|
||||
if(abs(AR(i)-AL(i)) .GE. -A6(i)) go to 150
|
||||
outer1: do i=1,IM
|
||||
if(abs(AR(i)-AL(i)) .GE. -A6(i)) exit outer1
|
||||
if(p(i).lt.AR(i) .and. p(i).lt.AL(i)) then
|
||||
AR(i) = p(i)
|
||||
AL(i) = p(i)
|
||||
@@ -656,12 +685,13 @@
|
||||
A6(i) = 3.*(AR(i)-p(i))
|
||||
AL(i) = AR(i) - A6(i)
|
||||
endif
|
||||
150 continue
|
||||
elseif(LMT.eq.2) then
|
||||
do 250 i=1,IM
|
||||
if(abs(AR(i)-AL(i)) .GE. -A6(i)) go to 250
|
||||
enddo outer1
|
||||
|
||||
else if(LMT.eq.2) then
|
||||
outer2: do i=1,IM
|
||||
if(abs(AR(i)-AL(i)) .GE. -A6(i)) exit outer2
|
||||
fmin = p(i) + 0.25*(AR(i)-AL(i))**2/A6(i) + A6(i)*R12
|
||||
if(fmin.ge.0.) go to 250
|
||||
if(fmin.ge.0.) exit outer2
|
||||
if(p(i).lt.AR(i) .and. p(i).lt.AL(i)) then
|
||||
AR(i) = p(i)
|
||||
AL(i) = p(i)
|
||||
@@ -673,7 +703,7 @@
|
||||
A6(i) = 3.*(AR(i)-p(i))
|
||||
AL(i) = AR(i) - A6(i)
|
||||
endif
|
||||
250 continue
|
||||
enddo outer2
|
||||
endif
|
||||
return
|
||||
end
|
||||
@@ -683,20 +713,23 @@
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
REAL cosp(*),cose(*),sine(JM)
|
||||
|
||||
do 10 j=2,JM
|
||||
do j=2,JM
|
||||
ph5 = -0.5*PI + (float(j-1)-0.5)*DP
|
||||
10 sine(j) = SIN(ph5)
|
||||
sine(j) = SIN(ph5)
|
||||
enddo
|
||||
|
||||
do 80 J=2,JM-1
|
||||
80 cosp(J) = (sine(j+1)-sine(j))/DP
|
||||
do J=2,JM-1
|
||||
cosp(J) = (sine(j+1)-sine(j))/DP
|
||||
enddo
|
||||
|
||||
cosp( 1) = 0.
|
||||
cosp(JM) = 0.
|
||||
|
||||
! Define cosine at edges..
|
||||
|
||||
do 90 j=2,JM
|
||||
90 cose(j) = 0.5 * (cosp(j-1)+cosp(j))
|
||||
do j=2,JM
|
||||
cose(j) = 0.5 * (cosp(j-1)+cosp(j))
|
||||
enddo
|
||||
cose(1) = cose(2)
|
||||
return
|
||||
end
|
||||
@@ -706,19 +739,20 @@
|
||||
!****6***0*********0*********0*********0*********0*********0**********72
|
||||
REAL cosp(*),cose(*)
|
||||
phi = -0.5*PI
|
||||
do 55 j=2,JNP-1
|
||||
phi = phi + DP
|
||||
55 cosp(j) = cos(phi)
|
||||
do j=2,JNP-1
|
||||
phi = phi + DP
|
||||
cosp(j) = cos(phi)
|
||||
enddo
|
||||
cosp( 1) = 0.
|
||||
cosp(JNP) = 0.
|
||||
|
||||
do 66 j=2,JNP
|
||||
cose(j) = 0.5*(cosp(j)+cosp(j-1))
|
||||
66 CONTINUE
|
||||
do j=2,JNP
|
||||
cose(j) = 0.5*(cosp(j)+cosp(j-1))
|
||||
enddo
|
||||
|
||||
do 77 j=2,JNP-1
|
||||
cosp(j) = 0.5*(cose(j)+cose(j+1))
|
||||
77 CONTINUE
|
||||
do j=2,JNP-1
|
||||
cosp(j) = 0.5*(cose(j)+cose(j+1))
|
||||
enddo
|
||||
return
|
||||
end
|
||||
|
||||
@@ -728,9 +762,10 @@
|
||||
REAL a(*)
|
||||
Pmax = a(n)
|
||||
Pmin = a(n)
|
||||
do 10 i=1,n-1
|
||||
Pmax = amax1(Pmax,a(i))
|
||||
10 Pmin = amin1(Pmin,a(i))
|
||||
do i=1,n-1
|
||||
Pmax = amax1(Pmax,a(i))
|
||||
Pmin = amin1(Pmin,a(i))
|
||||
enddo
|
||||
return
|
||||
end
|
||||
|
||||
@@ -750,11 +785,11 @@
|
||||
!MIC$ do all autoscope
|
||||
!MIC$* private(i,j,L,qtmp)
|
||||
|
||||
do 1000 L=1,NLAY
|
||||
do L=1,NLAY
|
||||
call filns(q(1,1,L),IMR,JNP,j1,j2,cosp,acosp,ip(L),tiny)
|
||||
if(ip(L).ne.0) &
|
||||
call filew(q(1,1,L),qtmp,IMR,JNP,j1,j2,ip(L),tiny)
|
||||
1000 continue
|
||||
enddo
|
||||
|
||||
ipz = 0
|
||||
do L=1,NLAY
|
||||
@@ -780,7 +815,7 @@
|
||||
!MIC$ do all autoscope
|
||||
!MIC$* private(i,j,L,qup,qly,dup)
|
||||
|
||||
do 2000 j=j1,j2
|
||||
do j=j1,j2
|
||||
|
||||
if(ipz .eq. 1) then
|
||||
! Top layer
|
||||
@@ -792,7 +827,7 @@
|
||||
enddo
|
||||
endif
|
||||
|
||||
DO 225 L = lpz,NLM1
|
||||
DO L = lpz,NLM1
|
||||
do i=1,IMR
|
||||
IF( Q(i,j,L).LT.0.) THEN
|
||||
! From above
|
||||
@@ -806,7 +841,7 @@
|
||||
Q(i,j,L) = 0.
|
||||
ENDIF
|
||||
enddo
|
||||
225 CONTINUE
|
||||
enddo
|
||||
|
||||
! BOTTOM LAYER
|
||||
L = NLAY
|
||||
@@ -824,7 +859,7 @@
|
||||
Q(i,j,L) = 0.
|
||||
ENDIF
|
||||
enddo
|
||||
2000 continue
|
||||
enddo
|
||||
|
||||
RETURN
|
||||
END
|
||||
@@ -844,8 +879,8 @@
|
||||
endif
|
||||
|
||||
ipy = 0
|
||||
do 55 j=j1+1,j2-1
|
||||
DO 55 i=1,IMR
|
||||
do j=j1+1,j2-1
|
||||
DO i=1,IMR
|
||||
IF(q(i,j).LT.0.) THEN
|
||||
ipy = 1
|
||||
dq = - q(i,j)*cosp(j)
|
||||
@@ -862,7 +897,8 @@
|
||||
q(i,j-1) = (ds - d2)*acosp(j-1)
|
||||
q(i,j) = (d2 - dq)*acosp(j) + tiny
|
||||
endif
|
||||
55 continue
|
||||
enddo
|
||||
enddo
|
||||
|
||||
do i=1,imr
|
||||
IF(q(i,j1).LT.0.) THEN
|
||||
@@ -920,12 +956,14 @@
|
||||
|
||||
ipx = 0
|
||||
! Copy & swap direction for vectorization.
|
||||
do 25 i=1,imr
|
||||
do 25 j=j1,j2
|
||||
25 qtmp(j,i) = q(i,j)
|
||||
do i=1,imr
|
||||
do j=j1,j2
|
||||
qtmp(j,i) = q(i,j)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
do 55 i=2,imr-1
|
||||
do 55 j=j1,j2
|
||||
do i=2,imr-1
|
||||
do j=j1,j2
|
||||
if(qtmp(j,i).lt.0.) then
|
||||
ipx = 1
|
||||
! west
|
||||
@@ -939,10 +977,11 @@
|
||||
qtmp(j,i+1) = qtmp(j,i+1) - d2
|
||||
qtmp(j,i) = qtmp(j,i) + d2 + tiny
|
||||
endif
|
||||
55 continue
|
||||
enddo
|
||||
enddo
|
||||
|
||||
i=1
|
||||
do 65 j=j1,j2
|
||||
do j=j1,j2
|
||||
if(qtmp(j,i).lt.0.) then
|
||||
ipx = 1
|
||||
! west
|
||||
@@ -957,9 +996,10 @@
|
||||
|
||||
qtmp(j,i) = qtmp(j,i) + d2 + tiny
|
||||
endif
|
||||
65 continue
|
||||
enddo
|
||||
|
||||
i=IMR
|
||||
do 75 j=j1,j2
|
||||
do j=j1,j2
|
||||
if(qtmp(j,i).lt.0.) then
|
||||
ipx = 1
|
||||
! west
|
||||
@@ -974,12 +1014,14 @@
|
||||
|
||||
qtmp(j,i) = qtmp(j,i) + d2 + tiny
|
||||
endif
|
||||
75 continue
|
||||
enddo
|
||||
|
||||
if(ipx.ne.0) then
|
||||
do 85 j=j1,j2
|
||||
do 85 i=1,imr
|
||||
85 q(i,j) = qtmp(j,i)
|
||||
do j=j1,j2
|
||||
do i=1,imr
|
||||
q(i,j) = qtmp(j,i)
|
||||
enddo
|
||||
enddo
|
||||
else
|
||||
|
||||
! Pole
|
||||
|
||||
Reference in new issue
Block a user