3 ims, ime, jms, jme, icmask , &
4 its, ite, jts, jte, nf, xstag, ystag )
6 INTEGER ims, ime, jms, jme, &
9 LOGICAL icmask( ims:ime, jms:jme )
14 PARAMETER(one12=1./12.,one24=1./24.)
17 REAL XF(ims:ime,jms:jme,NF)
19 REAL Y(ims:ime,jms:jme,-IOR:IOR), &
20 Z(ims:ime,jms:jme,-IOR:IOR), &
21 F(ims:ime,jms:jme,0:1)
24 INTEGER N2STAR, N2END, N1STAR, N1END
28 REAL W(ims:ime,jms:jme),OV(ims:ime,jms:jme),UN(ims:ime,jms:jme)
29 REAL MXM(ims:ime,jms:jme),MN(ims:ime,jms:jme)
30 REAL FL(ims:ime,jms:jme,0:1)
31 REAL XIG(NF*NF), XJG(NF*NF) ! NF is parent to child grid refinement ratio
40 DONOR(Y1,Y2,A)=(Y1*AMAX1(0.,SIGN(1.,A))-Y2*AMIN1(0.,SIGN(1.,A)))*A
41 REAL tr4, ym1, y0, yp1, yp2
42 TR4(YM1,Y0,YP1,YP2,A)=A*ONE12*(7.*(YP1+Y0)-(YP2+YM1)) &
43 -A*A*ONE24*(15.*(YP1-Y0)-(YP2-YM1))-A*A*A*ONE12*((YP1+Y0) &
44 -(YP2+YM1))+A*A*A*A*ONE24*(3.*(YP1-Y0)-(YP2-YM1))
49 rr = nint(sqrt(float(nf)))
50 !! write(6,*) ' nf, rr are ',nf,rr
54 if(xstag .and. (mod(rr,2) .eq. 0)) rioff = 1.
55 if(ystag .and. (mod(rr,2) .eq. 0)) rjoff = 1.
59 XIG(J+(I-1)*rr)=(float(rr)-1.-rioff)/float(2*rr)-FLOAT(J-1)*1./float(rr)
60 XJG(J+(I-1)*rr)=(float(rr)-1.-rjoff)/float(2*rr)-FLOAT(I-1)*1./float(rr)
72 ! HERE STARTS RESIDUAL ADVECTION
74 DO 9000 JJ=N2STAR,N2END
78 DO 511 II=N1STAR,N1END
79 IF ( icmask(II,JJ) ) Y(II,JJ,I)=XF(II+I,JJ+J,IIM)
83 DO 811 II=N1STAR,N1END
84 IF ( icmask(II,JJ) ) THEN
85 FL(II,JJ,0)=DONOR(Y(II,JJ,-1),Y(II,JJ,0),XIG(IIM))
86 FL(II,JJ,1)=DONOR(Y(II,JJ,0),Y(II,JJ,1),XIG(IIM))
89 DO 812 II=N1STAR,N1END
90 IF ( icmask(II,JJ) ) W(II,JJ)=Y(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
92 DO 813 II=N1STAR,N1END
93 IF ( icmask(II,JJ) ) THEN
95 AMAX1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1), &
97 MN(II,JJ)=AMIN1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),W(II,JJ))
100 DO 312 II=N1STAR,N1END
101 IF ( icmask(II,JJ) ) THEN
103 TR4(Y(II,JJ,-2),Y(II,JJ,-1),Y(II,JJ,0), &
106 TR4(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),Y(II,JJ,2),&
110 DO 822 II=N1STAR,N1END
111 IF ( icmask(II,JJ) ) THEN
112 F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
113 F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
116 DO 823 II=N1STAR,N1END
117 IF ( icmask(II,JJ) ) THEN
118 OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
120 UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))- &
124 DO 824 II=N1STAR,N1END
125 IF ( icmask(II,JJ) ) THEN
126 F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+ &
127 PN(F(II,JJ,0))*AMIN1(1.,UN(II,JJ))
128 F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+ &
129 PN(F(II,JJ,1))*AMIN1(1.,OV(II,JJ))
132 DO 825 II=N1STAR,N1END
133 IF ( icmask(II,JJ) ) THEN
134 Y(II,JJ,0)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))
137 DO 361 II=N1STAR,N1END
138 IF ( icmask(II,JJ) ) Z(II,JJ,J)=Y(II,JJ,0)
141 ! END IF FIRST J LOOP
146 DO 911 II=N1STAR,N1END
147 IF ( icmask(II,JJ) ) THEN
148 FL(II,JJ,0)=DONOR(Z(II,JJ,-1),Z(II,JJ,0),XJG(IIM))
149 FL(II,JJ,1)=DONOR(Z(II,JJ,0),Z(II,JJ,1),XJG(IIM))
152 DO 912 II=N1STAR,N1END
153 IF ( icmask(II,JJ) ) W(II,JJ)=Z(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
155 DO 913 II=N1STAR,N1END
156 IF ( icmask(II,JJ) ) THEN
157 MXM(II,JJ)=AMAX1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
158 MN(II,JJ)=AMIN1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
161 DO 412 II=N1STAR,N1END
162 IF ( icmask(II,JJ) ) THEN
164 TR4(Z(II,JJ,-2),Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1)&
167 TR4(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),Z(II,JJ,2), &
171 DO 922 II=N1STAR,N1END
172 IF ( icmask(II,JJ) ) THEN
173 F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
174 F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
177 DO 923 II=N1STAR,N1END
178 IF ( icmask(II,JJ) ) THEN
179 OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
181 UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-PN(F(II,JJ,0))+ &
185 DO 924 II=N1STAR,N1END
186 IF ( icmask(II,JJ) ) THEN
187 F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+PN(F(II,JJ,0)) &
189 F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+PN(F(II,JJ,1)) &
194 DO 925 JJ=N2STAR,N2END
195 DO 925 II=N1STAR,N1END
196 IF ( icmask(II,JJ) ) XF(II,JJ,IIM)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))
204 ! Version of sint that replaces mask with detailed ranges for avoiding boundaries
205 ! may help performance by getting the conditionals out of innner loops
207 SUBROUTINE SINTB(XF1, XF , &
208 ims, ime, jms, jme, icmask , &
209 its, ite, jts, jte, nf, xstag, ystag )
211 INTEGER ims, ime, jms, jme, &
214 LOGICAL icmask( ims:ime, jms:jme )
218 REAL one12, one24, ep
219 PARAMETER(one12=1./12.,one24=1./24.)
222 REAL XF(ims:ime,jms:jme,NF)
223 REAL XF1(ims:ime,jms:jme,NF)
225 REAL Y(ims:ime,jms:jme,-IOR:IOR), &
226 Z(ims:ime,jms:jme,-IOR:IOR), &
227 F(ims:ime,jms:jme,0:1)
229 INTEGER I,J,II,JJ,IIM
230 INTEGER N2STAR, N2END, N1STAR, N1END
235 ! PARAMETER(N1OS=N1*NONOS+1-NONOS,N2OS=N2*NONOS+1-NONOS)
237 REAL W(ims:ime,jms:jme),OV(ims:ime,jms:jme),UN(ims:ime,jms:jme)
238 REAL MXM(ims:ime,jms:jme),MN(ims:ime,jms:jme)
239 REAL FL(ims:ime,jms:jme,0:1)
240 REAL XIG(NF*NF), XJG(NF*NF) ! NF is the parent to child grid refinement ratio
243 COMMON /DEPAR2B/ IFRST
248 REAL donor, y1, y2, a
249 DONOR(Y1,Y2,A)=(Y1*AMAX1(0.,SIGN(1.,A))-Y2*AMIN1(0.,SIGN(1.,A)))*A
250 REAL tr4, ym1, y0, yp1, yp2
251 TR4(YM1,Y0,YP1,YP2,A)=A*ONE12*(7.*(YP1+Y0)-(YP2+YM1)) &
252 -A*A*ONE24*(15.*(YP1-Y0)-(YP2-YM1))-A*A*A*ONE12*((YP1+Y0) &
253 -(YP2+YM1))+A*A*A*A*ONE24*(3.*(YP1-Y0)-(YP2-YM1))
258 rr = nint(sqrt(float(nf)))
262 if(xstag .and. (mod(rr,2) .eq. 0)) rioff = 1.
263 if(ystag .and. (mod(rr,2) .eq. 0)) rjoff = 1.
267 XIG(J+(I-1)*rr)=(float(rr)-1.-rioff)/float(2*rr)-FLOAT(J-1)*1./float(rr)
268 XJG(J+(I-1)*rr)=(float(rr)-1.-rjoff)/float(2*rr)-FLOAT(I-1)*1./float(rr)
280 ! HERE STARTS RESIDUAL ADVECTION
282 DO 9000 JJ=N2STAR,N2END
288 DO 511 II=N1STAR,N1END
289 Y(II,JJ,I)=XF1(II+I,JJ+J,IIM)
293 DO 811 II=N1STAR,N1END
294 FL(II,JJ,0)=DONOR(Y(II,JJ,-1),Y(II,JJ,0),XIG(IIM))
295 FL(II,JJ,1)=DONOR(Y(II,JJ,0),Y(II,JJ,1),XIG(IIM))
297 DO 812 II=N1STAR,N1END
298 W(II,JJ)=Y(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
300 DO 813 II=N1STAR,N1END
302 AMAX1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1), &
304 MN(II,JJ)=AMIN1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),W(II,JJ))
306 DO 312 II=N1STAR,N1END
308 TR4(Y(II,JJ,-2),Y(II,JJ,-1),Y(II,JJ,0), &
311 TR4(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),Y(II,JJ,2),&
314 DO 822 II=N1STAR,N1END
315 F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
316 F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
318 DO 823 II=N1STAR,N1END
319 OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
321 UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))- &
324 DO 824 II=N1STAR,N1END
325 F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+ &
326 PN(F(II,JJ,0))*AMIN1(1.,UN(II,JJ))
327 F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+ &
328 PN(F(II,JJ,1))*AMIN1(1.,OV(II,JJ))
330 DO 825 II=N1STAR,N1END
331 Y(II,JJ,0)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))
333 DO 361 II=N1STAR,N1END
334 Z(II,JJ,J)=Y(II,JJ,0)
337 ! END IF FIRST J LOOP
342 DO 911 II=N1STAR,N1END
343 FL(II,JJ,0)=DONOR(Z(II,JJ,-1),Z(II,JJ,0),XJG(IIM))
344 FL(II,JJ,1)=DONOR(Z(II,JJ,0),Z(II,JJ,1),XJG(IIM))
346 DO 912 II=N1STAR,N1END
347 W(II,JJ)=Z(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))
349 DO 913 II=N1STAR,N1END
350 MXM(II,JJ)=AMAX1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
351 MN(II,JJ)=AMIN1(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),W(II,JJ))
353 DO 412 II=N1STAR,N1END
355 TR4(Z(II,JJ,-2),Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1)&
358 TR4(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),Z(II,JJ,2), &
361 DO 922 II=N1STAR,N1END
362 F(II,JJ,0)=F(II,JJ,0)-FL(II,JJ,0)
363 F(II,JJ,1)=F(II,JJ,1)-FL(II,JJ,1)
365 DO 923 II=N1STAR,N1END
366 OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+ &
368 UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-PN(F(II,JJ,0))+ &
371 DO 924 II=N1STAR,N1END
372 F(II,JJ,0)=PP(F(II,JJ,0))*AMIN1(1.,OV(II,JJ))+PN(F(II,JJ,0)) &
374 F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+PN(F(II,JJ,1)) &
378 DO 925 JJ=N2STAR,N2END
379 DO 925 II=N1STAR,N1END
380 XF(II,JJ,IIM)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))