source: LMDZ6/trunk/libf/dyn3d_common/advy.F @ 5160

Last change on this file since 5160 was 5084, checked in by Laurent Fairhead, 4 months ago

Reverting to r4065. Updating fortran standard broke too much stuff. Will do it by smaller chunks
AB, LF

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 KB
Line 
1!
2! $Header$
3!
4      SUBROUTINE advy(limit,dty,pbarv,sm,s0,sx,sy,sz)
5      IMPLICIT NONE
6
7CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
8C                                                                C
9C  first-order moments (SOM) advection of tracer in Y direction  C
10C                                                                C
11C  Source : Pascal Simon ( Meteo, CNRM )                         C
12C  Adaptation : A.A. (LGGE)                                      C
13C  Derniere Modif : 15/12/94 LAST
14C                                                                C
15C  sont les arguments d'entree pour le s-pg                      C
16C                                                                C
17C  argument de sortie du s-pg                                    C
18C                                                                C
19CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
20CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
21C
22C  Rem : Probleme aux poles il faut reecrire ce cas specifique
23C        Attention au sens de l'indexation
24C
25C  parametres principaux du modele
26C
27C
28      include "dimensions.h"
29      include "paramet.h"
30      include "comgeom2.h"
31 
32C  Arguments :
33C  ----------
34C  dty : frequence fictive d'appel du transport
35C  parbu,pbarv : flux de masse en x et y en Pa.m2.s-1
36
37      INTEGER lon,lat,niv
38      INTEGER i,j,jv,k,kp,l
39      INTEGER ntra
40      PARAMETER (ntra = 1)
41
42      REAL dty
43      REAL pbarv ( iip1,jjm, llm )
44
45C  moments: SM  total mass in each grid box
46C           S0  mass of tracer in each grid box
47C           Si  1rst order moment in i direction
48C
49      REAL SM(iip1,jjp1,llm)
50     +    ,S0(iip1,jjp1,llm,ntra)
51      REAL sx(iip1,jjp1,llm,ntra)
52     +    ,sy(iip1,jjp1,llm,ntra)
53     +    ,sz(iip1,jjp1,llm,ntra)
54
55
56C  Local :
57C  -------
58
59C  mass fluxes across the boundaries (UGRI,VGRI,WGRI)
60C  mass fluxes in kg
61C  declaration :
62
63      REAL VGRI(iip1,0:jjp1,llm)
64
65C  Rem : UGRI et WGRI ne sont pas utilises dans
66C  cette subroutine ( advection en y uniquement )
67C  Rem 2 :le dimensionnement de VGRI depend de celui de pbarv
68C
69C  the moments F are similarly defined and used as temporary
70C  storage for portions of the grid boxes in transit
71C
72      REAL F0(iim,0:jjp1,ntra),FM(iim,0:jjp1)
73      REAL FX(iim,jjm,ntra),FY(iim,jjm,ntra)
74      REAL FZ(iim,jjm,ntra)
75      REAL S00(ntra)
76      REAL SM0             ! Just temporal variable
77C
78C  work arrays
79C
80      REAL ALF(iim,0:jjp1),ALF1(iim,0:jjp1)
81      REAL ALFQ(iim,0:jjp1),ALF1Q(iim,0:jjp1)
82      REAL TEMPTM          ! Just temporal variable
83c
84C  Special pour poles
85c
86      REAL sbms,sfms,sfzs,sbmn,sfmn,sfzn
87      REAL sns0(ntra),snsz(ntra),snsm
88      REAL s1v(llm),slatv(llm)
89      REAL qy1(iim,llm,ntra),qylat(iim,llm,ntra)
90      REAL cx1(llm,ntra), cxLAT(llm,ntra)
91      REAL cy1(llm,ntra), cyLAT(llm,ntra)
92      REAL z1(iim), zcos(iim), zsin(iim)
93      real smpn,smps,s0pn,s0ps
94      REAL SSUM
95      EXTERNAL SSUM
96C
97      REAL sqi,sqf
98      LOGICAL LIMIT
99
100      lon = iim         ! rem : Il est possible qu'un pbl. arrive ici
101      lat = jjp1        ! a cause des dim. differentes entre les
102      niv=llm
103
104C
105C  the moments Fi are used as temporary storage for
106C  portions of the grid boxes in transit at the current level
107C
108C  work arrays
109C
110
111      DO l = 1,llm
112         DO j = 1,jjm
113            DO i = 1,iip1 
114            vgri (i,j,llm+1-l)=-1.*pbarv(i,j,l) 
115            enddo
116         enddo
117         do i=1,iip1
118             vgri(i,0,l) = 0.
119             vgri(i,jjp1,l) = 0.
120         enddo
121      enddo
122
123      DO 1 L=1,NIV
124C
125C  place limits on appropriate moments before transport
126C      (if flux-limiting is to be applied)
127C
128      IF(.NOT.LIMIT) GO TO 11
129C
130      DO 10 JV=1,NTRA
131      DO 10 K=1,LAT
132      DO 100 I=1,LON
133         sy(I,K,L,JV)=SIGN(AMIN1(AMAX1(S0(I,K,L,JV),0.),
134     +                           ABS(sy(I,K,L,JV))),sy(I,K,L,JV))
135 100  CONTINUE
136 10   CONTINUE
137C
138 11   CONTINUE
139C
140C  le flux a travers le pole Nord est traite separement
141C
142      SM0=0.
143      DO 20 JV=1,NTRA
144         S00(JV)=0.
145 20   CONTINUE
146C
147      DO 21 I=1,LON
148C
149         IF(VGRI(I,0,L).LE.0.) THEN
150           FM(I,0)=-VGRI(I,0,L)*DTY
151           ALF(I,0)=FM(I,0)/SM(I,1,L)
152           SM(I,1,L)=SM(I,1,L)-FM(I,0)
153           SM0=SM0+FM(I,0)
154         ENDIF
155C
156         ALFQ(I,0)=ALF(I,0)*ALF(I,0)
157         ALF1(I,0)=1.-ALF(I,0)
158         ALF1Q(I,0)=ALF1(I,0)*ALF1(I,0)
159C
160 21   CONTINUE
161C
162      DO 22 JV=1,NTRA
163      DO 220 I=1,LON
164C
165         IF(VGRI(I,0,L).LE.0.) THEN
166C
167           F0(I,0,JV)=ALF(I,0)*
168     +               ( S0(I,1,L,JV)-ALF1(I,0)*sy(I,1,L,JV) )
169C
170           S00(JV)=S00(JV)+F0(I,0,JV)
171           S0(I,1,L,JV)=S0(I,1,L,JV)-F0(I,0,JV)
172           sy(I,1,L,JV)=ALF1Q(I,0)*sy(I,1,L,JV)
173           sx(I,1,L,JV)=ALF1 (I,0)*sx(I,1,L,JV)
174           sz(I,1,L,JV)=ALF1 (I,0)*sz(I,1,L,JV)
175C
176         ENDIF
177C
178 220  CONTINUE
179 22   CONTINUE
180C
181      DO 23 I=1,LON
182         IF(VGRI(I,0,L).GT.0.) THEN
183           FM(I,0)=VGRI(I,0,L)*DTY
184           ALF(I,0)=FM(I,0)/SM0
185         ENDIF
186 23   CONTINUE
187C
188      DO 24 JV=1,NTRA
189      DO 240 I=1,LON
190         IF(VGRI(I,0,L).GT.0.) THEN
191           F0(I,0,JV)=ALF(I,0)*S00(JV)
192         ENDIF
193 240  CONTINUE
194 24   CONTINUE
195C
196C  puts the temporary moments Fi into appropriate neighboring boxes
197C
198      DO 25 I=1,LON
199C
200         IF(VGRI(I,0,L).GT.0.) THEN
201           SM(I,1,L)=SM(I,1,L)+FM(I,0)
202           ALF(I,0)=FM(I,0)/SM(I,1,L)
203         ENDIF
204C
205         ALF1(I,0)=1.-ALF(I,0)
206C
207 25   CONTINUE
208C
209      DO 26 JV=1,NTRA
210      DO 260 I=1,LON
211C
212         IF(VGRI(I,0,L).GT.0.) THEN
213C
214         TEMPTM=ALF(I,0)*S0(I,1,L,JV)-ALF1(I,0)*F0(I,0,JV)
215         S0(I,1,L,JV)=S0(I,1,L,JV)+F0(I,0,JV)
216         sy(I,1,L,JV)=ALF1(I,0)*sy(I,1,L,JV)+3.*TEMPTM
217C
218         ENDIF
219C
220 260  CONTINUE
221 26   CONTINUE
222C
223C  calculate flux and moments between adjacent boxes
224C  1- create temporary moments/masses for partial boxes in transit
225C  2- reajusts moments remaining in the box
226C
227C  flux from KP to K if V(K).lt.0 and from K to KP if V(K).gt.0
228C
229      DO 30 K=1,LAT-1
230      KP=K+1
231      DO 300 I=1,LON
232C
233         IF(VGRI(I,K,L).LT.0.) THEN
234           FM(I,K)=-VGRI(I,K,L)*DTY
235           ALF(I,K)=FM(I,K)/SM(I,KP,L)
236           SM(I,KP,L)=SM(I,KP,L)-FM(I,K)
237         ELSE
238           FM(I,K)=VGRI(I,K,L)*DTY
239           ALF(I,K)=FM(I,K)/SM(I,K,L)
240           SM(I,K,L)=SM(I,K,L)-FM(I,K)
241         ENDIF
242C
243         ALFQ(I,K)=ALF(I,K)*ALF(I,K)
244         ALF1(I,K)=1.-ALF(I,K)
245         ALF1Q(I,K)=ALF1(I,K)*ALF1(I,K)
246C
247 300  CONTINUE
248 30   CONTINUE
249C
250      DO 31 JV=1,NTRA
251      DO 31 K=1,LAT-1
252      KP=K+1
253      DO 310 I=1,LON
254C
255         IF(VGRI(I,K,L).LT.0.) THEN
256C
257           F0(I,K,JV)=ALF (I,K)*
258     +                ( S0(I,KP,L,JV)-ALF1(I,K)*sy(I,KP,L,JV) )
259           FY(I,K,JV)=ALFQ(I,K)*sy(I,KP,L,JV)
260           FX(I,K,JV)=ALF (I,K)*sx(I,KP,L,JV)
261           FZ(I,K,JV)=ALF (I,K)*sz(I,KP,L,JV)
262C
263           S0(I,KP,L,JV)=S0(I,KP,L,JV)-F0(I,K,JV)
264           sy(I,KP,L,JV)=ALF1Q(I,K)*sy(I,KP,L,JV)
265           sx(I,KP,L,JV)=sx(I,KP,L,JV)-FX(I,K,JV)
266           sz(I,KP,L,JV)=sz(I,KP,L,JV)-FZ(I,K,JV)
267C
268         ELSE
269C
270           F0(I,K,JV)=ALF (I,K)*
271     +               ( S0(I,K,L,JV)+ALF1(I,K)*sy(I,K,L,JV) )
272           FY(I,K,JV)=ALFQ(I,K)*sy(I,K,L,JV)
273           FX(I,K,JV)=ALF(I,K)*sx(I,K,L,JV)
274           FZ(I,K,JV)=ALF(I,K)*sz(I,K,L,JV)
275C
276           S0(I,K,L,JV)=S0(I,K,L,JV)-F0(I,K,JV)
277           sy(I,K,L,JV)=ALF1Q(I,K)*sy(I,K,L,JV)
278           sx(I,K,L,JV)=sx(I,K,L,JV)-FX(I,K,JV)
279           sz(I,K,L,JV)=sz(I,K,L,JV)-FZ(I,K,JV)
280C
281         ENDIF
282C
283 310  CONTINUE
284 31   CONTINUE
285C
286C  puts the temporary moments Fi into appropriate neighboring boxes
287C
288      DO 32 K=1,LAT-1
289      KP=K+1
290      DO 320 I=1,LON
291C
292         IF(VGRI(I,K,L).LT.0.) THEN
293           SM(I,K,L)=SM(I,K,L)+FM(I,K)
294           ALF(I,K)=FM(I,K)/SM(I,K,L)
295         ELSE
296           SM(I,KP,L)=SM(I,KP,L)+FM(I,K)
297           ALF(I,K)=FM(I,K)/SM(I,KP,L)
298         ENDIF
299C
300         ALF1(I,K)=1.-ALF(I,K)
301C
302 320  CONTINUE
303 32   CONTINUE
304C
305      DO 33 JV=1,NTRA
306      DO 33 K=1,LAT-1
307      KP=K+1
308      DO 330 I=1,LON
309C
310         IF(VGRI(I,K,L).LT.0.) THEN
311C
312         TEMPTM=-ALF(I,K)*S0(I,K,L,JV)+ALF1(I,K)*F0(I,K,JV)
313         S0(I,K,L,JV)=S0(I,K,L,JV)+F0(I,K,JV)
314         sy(I,K,L,JV)=ALF(I,K)*FY(I,K,JV)+ALF1(I,K)*sy(I,K,L,JV)
315     +               +3.*TEMPTM
316         sx(I,K,L,JV)=sx(I,K,L,JV)+FX(I,K,JV)
317         sz(I,K,L,JV)=sz(I,K,L,JV)+FZ(I,K,JV)
318C
319         ELSE
320C
321         TEMPTM=ALF(I,K)*S0(I,KP,L,JV)-ALF1(I,K)*F0(I,K,JV)
322         S0(I,KP,L,JV)=S0(I,KP,L,JV)+F0(I,K,JV)
323         sy(I,KP,L,JV)=ALF(I,K)*FY(I,K,JV)+ALF1(I,K)*sy(I,KP,L,JV)
324     +                +3.*TEMPTM
325         sx(I,KP,L,JV)=sx(I,KP,L,JV)+FX(I,K,JV)
326         sz(I,KP,L,JV)=sz(I,KP,L,JV)+FZ(I,K,JV)
327C
328         ENDIF
329C
330 330  CONTINUE
331 33   CONTINUE
332C
333C  traitement special pour le pole Sud (idem pole Nord)
334C
335      K=LAT
336C
337      SM0=0.
338      DO 40 JV=1,NTRA
339         S00(JV)=0.
340 40   CONTINUE
341C
342      DO 41 I=1,LON
343C
344         IF(VGRI(I,K,L).GE.0.) THEN
345           FM(I,K)=VGRI(I,K,L)*DTY
346           ALF(I,K)=FM(I,K)/SM(I,K,L)
347           SM(I,K,L)=SM(I,K,L)-FM(I,K)
348           SM0=SM0+FM(I,K)
349         ENDIF
350C
351         ALFQ(I,K)=ALF(I,K)*ALF(I,K)
352         ALF1(I,K)=1.-ALF(I,K)
353         ALF1Q(I,K)=ALF1(I,K)*ALF1(I,K)
354C
355 41   CONTINUE
356C
357      DO 42 JV=1,NTRA
358      DO 420 I=1,LON
359C
360         IF(VGRI(I,K,L).GE.0.) THEN
361           F0 (I,K,JV)=ALF(I,K)*
362     +                ( S0(I,K,L,JV)+ALF1(I,K)*sy(I,K,L,JV) )
363           S00(JV)=S00(JV)+F0(I,K,JV)
364C
365           S0(I,K,L,JV)=S0 (I,K,L,JV)-F0 (I,K,JV)
366           sy(I,K,L,JV)=ALF1Q(I,K)*sy(I,K,L,JV)
367           sx(I,K,L,JV)=ALF1(I,K)*sx(I,K,L,JV)
368           sz(I,K,L,JV)=ALF1(I,K)*sz(I,K,L,JV)
369         ENDIF
370C
371 420  CONTINUE
372 42   CONTINUE
373C
374      DO 43 I=1,LON
375         IF(VGRI(I,K,L).LT.0.) THEN
376           FM(I,K)=-VGRI(I,K,L)*DTY
377           ALF(I,K)=FM(I,K)/SM0
378         ENDIF
379 43   CONTINUE
380C
381      DO 44 JV=1,NTRA
382      DO 440 I=1,LON
383         IF(VGRI(I,K,L).LT.0.) THEN
384           F0(I,K,JV)=ALF(I,K)*S00(JV)
385         ENDIF
386 440  CONTINUE
387 44   CONTINUE
388C
389C  puts the temporary moments Fi into appropriate neighboring boxes
390C
391      DO 45 I=1,LON
392C
393         IF(VGRI(I,K,L).LT.0.) THEN
394           SM(I,K,L)=SM(I,K,L)+FM(I,K)
395           ALF(I,K)=FM(I,K)/SM(I,K,L)
396         ENDIF
397C
398         ALF1(I,K)=1.-ALF(I,K)
399C
400 45   CONTINUE
401C
402      DO 46 JV=1,NTRA
403      DO 460 I=1,LON
404C
405         IF(VGRI(I,K,L).LT.0.) THEN
406C
407         TEMPTM=-ALF(I,K)*S0(I,K,L,JV)+ALF1(I,K)*F0(I,K,JV)
408         S0(I,K,L,JV)=S0(I,K,L,JV)+F0(I,K,JV)
409         sy(I,K,L,JV)=ALF1(I,K)*sy(I,K,L,JV)+3.*TEMPTM
410C
411         ENDIF
412C
413 460  CONTINUE
414 46   CONTINUE
415C
416 1    CONTINUE
417C
418      RETURN
419      END
420
Note: See TracBrowser for help on using the repository browser.