merge standard release WRF/WPS V3.0.1.1 into wrffire
[wrffire.git] / wrfv2_fire / share / sint.F
blob5d9a6ab9c27019290feb875f717b8b8825318ebd
2       SUBROUTINE SINT(XF,                        &
3                    ims, ime, jms, jme, icmask ,  &
4                    its, ite, jts, jte, nf, xstag, ystag )
5       IMPLICIT NONE
6       INTEGER ims, ime, jms, jme, &
7               its, ite, jts, jte
9       LOGICAL icmask( ims:ime, jms:jme )
10       LOGICAL xstag, ystag
12       INTEGER nf, ior
13       REAL    one12, one24, ep
14       PARAMETER(one12=1./12.,one24=1./24.)                              
15       PARAMETER(ior=2)                        
16 !                                                                       
17       REAL XF(ims:ime,jms:jme,NF)
18 !                                                                       
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)                                       
23       INTEGER I,J,II,JJ,IIM
24       INTEGER N2STAR, N2END, N1STAR, N1END
25 !                                                                       
26       DATA  EP/ 1.E-10/                                                 
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
32       INTEGER IFRST
33       integer rr
34       COMMON /DEPAR2/ IFRST
35       DATA IFRST /1/
37       REAL rioff, rjoff
38 !                                                                       
39       REAL donor, y1, y2, a
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))                
45       REAL pp, pn, x
46       PP(X)=AMAX1(0.,X)                                                 
47       PN(X)=AMIN1(0.,X)                                                 
49       rr = nint(sqrt(float(nf)))
50 !!      write(6,*) ' nf, rr are ',nf,rr
52       rioff = 0
53       rjoff = 0
54       if(xstag .and. (mod(rr,2) .eq. 0)) rioff = 1.
55       if(ystag .and. (mod(rr,2) .eq. 0)) rjoff = 1.
57       DO I=1,rr
58         DO J=1,rr
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)   
61         ENDDO
62       ENDDO
63       IFRST = 0
65       N2STAR = jts
66       N2END  = jte
67       N1STAR = its
68       N1END  = ite
70       DO 2000 IIM=1,NF                                                  
71 !                                                                       
72 !  HERE STARTS RESIDUAL ADVECTION                                       
73 !                                                                       
74         DO 9000 JJ=N2STAR,N2END                                         
75           DO 50 J=-IOR,IOR                                              
77             DO 51 I=-IOR,IOR                                            
78               DO 511 II=N1STAR,N1END                                    
79                 IF ( icmask(II,JJ) ) Y(II,JJ,I)=XF(II+I,JJ+J,IIM)              
80   511         CONTINUE
81    51       CONTINUE                                                    
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))           
87               ENDIF
88   811         CONTINUE
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))               
91   812         CONTINUE
92             DO 813 II=N1STAR,N1END                                      
93               IF ( icmask(II,JJ) ) THEN
94                 MXM(II,JJ)=                                             &
95                          AMAX1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),       &
96                          W(II,JJ))                                      
97                 MN(II,JJ)=AMIN1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),W(II,JJ)) 
98               ENDIF
99   813         CONTINUE
100             DO 312 II=N1STAR,N1END                                      
101               IF ( icmask(II,JJ) ) THEN
102                 F(II,JJ,0)=                                               &
103                            TR4(Y(II,JJ,-2),Y(II,JJ,-1),Y(II,JJ,0),        &
104                            Y(II,JJ,1),XIG(IIM))                           
105                 F(II,JJ,1)=                                                 &
106                          TR4(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),Y(II,JJ,2),&
107                          XIG(IIM))                                        
108                 ENDIF
109   312         CONTINUE
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)                           
114               ENDIF
115   822         CONTINUE
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))+         &
119                         PP(F(II,JJ,0))+EP)                              
120                 UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-             &
121                       PN(F(II,JJ,0))+EP)                                
122               ENDIF
123   823         CONTINUE
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))             
130               ENDIF                                                    
131   824         CONTINUE                                                    
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))                 
135               ENDIF
136   825         CONTINUE
137             DO 361 II=N1STAR,N1END                                      
138               IF ( icmask(II,JJ) ) Z(II,JJ,J)=Y(II,JJ,0)                                       
139   361         CONTINUE
140 !                                                                       
141 !  END IF FIRST J LOOP                                                  
142 !                                                                       
143  8000       CONTINUE                                                    
144    50     CONTINUE                                                      
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))             
150             ENDIF
151   911       CONTINUE
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))                 
154   912       CONTINUE
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))   
159             ENDIF
160   913       CONTINUE
161           DO 412 II=N1STAR,N1END                                        
162             IF ( icmask(II,JJ) ) THEN
163               F(II,JJ,0)=                                                 &
164                          TR4(Z(II,JJ,-2),Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1)&
165                          ,XJG(IIM))                                       
166               F(II,JJ,1)=                                                   &
167                          TR4(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),Z(II,JJ,2),  &
168                          XJG(IIM))                                          
169             ENDIF
170   412       CONTINUE
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)                             
175             ENDIF
176   922       CONTINUE
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))+           &
180                         PP(F(II,JJ,0))+EP)                                
181               UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-PN(F(II,JJ,0))+ &
182                       EP)                                                 
183             ENDIF
184   923       CONTINUE
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))  &
188                          *AMIN1(1.,UN(II,JJ))                             
189               F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+PN(F(II,JJ,1))  &
190                          *AMIN1(1.,OV(II,JJ))                             
191             ENDIF
192   924     CONTINUE                                                      
193  9000   CONTINUE                                                        
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))                
197   925     CONTINUE
198                                                                         
199 !                                                                       
200  2000 CONTINUE                                                          
201       RETURN                                                            
202       END                                                               
203                                                                         
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 )
210       IMPLICIT NONE
211       INTEGER ims, ime, jms, jme, &
212               its, ite, jts, jte
214       LOGICAL icmask( ims:ime, jms:jme )
215       LOGICAL xstag, ystag
217       INTEGER nf, ior
218       REAL    one12, one24, ep
219       PARAMETER(one12=1./12.,one24=1./24.)                              
220       PARAMETER(ior=2)                        
221 !                                                                       
222       REAL XF(ims:ime,jms:jme,NF)
223       REAL XF1(ims:ime,jms:jme,NF)
224 !                                                                       
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
231 !                                                                       
232       DATA  EP/ 1.E-10/                                                 
233 !                                                                       
234 !      PARAMETER(NONOS=1)                                                
235 !      PARAMETER(N1OS=N1*NONOS+1-NONOS,N2OS=N2*NONOS+1-NONOS)            
236 !                                                                       
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
241       INTEGER IFRST
242       integer rr
243       COMMON /DEPAR2B/ IFRST
244       DATA IFRST /1/
246       REAL rioff, rjoff
247 !                                                                       
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))                
254       REAL pp, pn, x
255       PP(X)=AMAX1(0.,X)                                                 
256       PN(X)=AMIN1(0.,X)                                                 
258       rr = nint(sqrt(float(nf)))
260       rioff = 0
261       rjoff = 0
262       if(xstag .and. (mod(rr,2) .eq. 0)) rioff = 1.
263       if(ystag .and. (mod(rr,2) .eq. 0)) rjoff = 1.
265       DO I=1,rr
266         DO J=1,rr
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)   
269         ENDDO
270       ENDDO
271       IFRST = 0
273       N2STAR = jts
274       N2END  = jte
275       N1STAR = its
276       N1END  = ite
278       DO 2000 IIM=1,NF                                                  
279 !                                                                       
280 !  HERE STARTS RESIDUAL ADVECTION                                       
281 !                                                                       
282         DO 9000 JJ=N2STAR,N2END                                         
283 !cdir unroll=5
284           DO 50 J=-IOR,IOR                                              
286 !cdir unroll=5
287             DO 51 I=-IOR,IOR                                            
288               DO 511 II=N1STAR,N1END                                    
289                 Y(II,JJ,I)=XF1(II+I,JJ+J,IIM)              
290   511         CONTINUE
291    51       CONTINUE                                                    
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))           
296   811         CONTINUE
297             DO 812 II=N1STAR,N1END                                      
298               W(II,JJ)=Y(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))               
299   812         CONTINUE
300             DO 813 II=N1STAR,N1END                                      
301               MXM(II,JJ)=                                             &
302                        AMAX1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),       &
303                        W(II,JJ))                                      
304               MN(II,JJ)=AMIN1(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),W(II,JJ)) 
305   813         CONTINUE
306             DO 312 II=N1STAR,N1END                                      
307               F(II,JJ,0)=                                               &
308                          TR4(Y(II,JJ,-2),Y(II,JJ,-1),Y(II,JJ,0),        &
309                          Y(II,JJ,1),XIG(IIM))                           
310               F(II,JJ,1)=                                                 &
311                        TR4(Y(II,JJ,-1),Y(II,JJ,0),Y(II,JJ,1),Y(II,JJ,2),&
312                        XIG(IIM))                                        
313   312         CONTINUE
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)                           
317   822         CONTINUE
318             DO 823 II=N1STAR,N1END                                      
319               OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+         &
320                       PP(F(II,JJ,0))+EP)                              
321               UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-             &
322                     PN(F(II,JJ,0))+EP)                                
323   823         CONTINUE
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))             
329   824         CONTINUE                                                    
330             DO 825 II=N1STAR,N1END                                      
331               Y(II,JJ,0)=W(II,JJ)-(F(II,JJ,1)-F(II,JJ,0))                 
332   825         CONTINUE
333             DO 361 II=N1STAR,N1END                                      
334               Z(II,JJ,J)=Y(II,JJ,0)                                       
335   361         CONTINUE
336 !                                                                       
337 !  END IF FIRST J LOOP                                                  
338 !                                                                       
339  8000       CONTINUE                                                    
340    50     CONTINUE                                                      
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))             
345   911       CONTINUE
346           DO 912 II=N1STAR,N1END                                        
347             W(II,JJ)=Z(II,JJ,0)-(FL(II,JJ,1)-FL(II,JJ,0))                 
348   912       CONTINUE
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))   
352   913       CONTINUE
353           DO 412 II=N1STAR,N1END                                        
354             F(II,JJ,0)=                                                 &
355                        TR4(Z(II,JJ,-2),Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1)&
356                        ,XJG(IIM))                                       
357             F(II,JJ,1)=                                                   &
358                        TR4(Z(II,JJ,-1),Z(II,JJ,0),Z(II,JJ,1),Z(II,JJ,2),  &
359                        XJG(IIM))                                          
360   412       CONTINUE
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)                             
364   922       CONTINUE
365           DO 923 II=N1STAR,N1END                                        
366             OV(II,JJ)=(MXM(II,JJ)-W(II,JJ))/(-PN(F(II,JJ,1))+           &
367                       PP(F(II,JJ,0))+EP)                                
368             UN(II,JJ)=(W(II,JJ)-MN(II,JJ))/(PP(F(II,JJ,1))-PN(F(II,JJ,0))+ &
369                     EP)                                                 
370   923       CONTINUE
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))  &
373                        *AMIN1(1.,UN(II,JJ))                             
374             F(II,JJ,1)=PP(F(II,JJ,1))*AMIN1(1.,UN(II,JJ))+PN(F(II,JJ,1))  &
375                        *AMIN1(1.,OV(II,JJ))                             
376   924     CONTINUE                                                      
377  9000   CONTINUE                                                        
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))                
381   925     CONTINUE
382                                                                         
383 !                                                                       
384  2000 CONTINUE                                                          
385       RETURN                                                            
386       END                                                               
387