source: LMDZ6/branches/Amaury_dev/libf/dyn3d_common/advy.F @ 5095

Last change on this file since 5095 was 5079, checked in by abarral, 2 months ago

[coherence with Fortran standards]
Replace obsolete DO with shared termination
(minor) replace obsolete bool operators

  • 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.2 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 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 JV=1,NTRA
131      DO K=1,LAT
132      DO 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      END DO
136      END DO
137      END DO
138C
139 11   CONTINUE
140C
141C  le flux a travers le pole Nord est traite separement
142C
143      SM0=0.
144      DO JV=1,NTRA
145         S00(JV)=0.
146      END DO
147C
148      DO I=1,LON
149C
150         IF(VGRI(I,0,L)<=0.) THEN
151           FM(I,0)=-VGRI(I,0,L)*DTY
152           ALF(I,0)=FM(I,0)/SM(I,1,L)
153           SM(I,1,L)=SM(I,1,L)-FM(I,0)
154           SM0=SM0+FM(I,0)
155         ENDIF
156C
157         ALFQ(I,0)=ALF(I,0)*ALF(I,0)
158         ALF1(I,0)=1.-ALF(I,0)
159         ALF1Q(I,0)=ALF1(I,0)*ALF1(I,0)
160C
161      END DO
162C
163      DO JV=1,NTRA
164      DO I=1,LON
165C
166         IF(VGRI(I,0,L)<=0.) THEN
167C
168           F0(I,0,JV)=ALF(I,0)*
169     +               ( S0(I,1,L,JV)-ALF1(I,0)*sy(I,1,L,JV) )
170C
171           S00(JV)=S00(JV)+F0(I,0,JV)
172           S0(I,1,L,JV)=S0(I,1,L,JV)-F0(I,0,JV)
173           sy(I,1,L,JV)=ALF1Q(I,0)*sy(I,1,L,JV)
174           sx(I,1,L,JV)=ALF1 (I,0)*sx(I,1,L,JV)
175           sz(I,1,L,JV)=ALF1 (I,0)*sz(I,1,L,JV)
176C
177         ENDIF
178C
179      END DO
180      END DO
181C
182      DO I=1,LON
183         IF(VGRI(I,0,L)>0.) THEN
184           FM(I,0)=VGRI(I,0,L)*DTY
185           ALF(I,0)=FM(I,0)/SM0
186         ENDIF
187      END DO
188C
189      DO JV=1,NTRA
190      DO I=1,LON
191         IF(VGRI(I,0,L)>0.) THEN
192           F0(I,0,JV)=ALF(I,0)*S00(JV)
193         ENDIF
194      END DO
195      END DO
196C
197C  puts the temporary moments Fi into appropriate neighboring boxes
198C
199      DO I=1,LON
200C
201         IF(VGRI(I,0,L)>0.) THEN
202           SM(I,1,L)=SM(I,1,L)+FM(I,0)
203           ALF(I,0)=FM(I,0)/SM(I,1,L)
204         ENDIF
205C
206         ALF1(I,0)=1.-ALF(I,0)
207C
208      END DO
209C
210      DO JV=1,NTRA
211      DO I=1,LON
212C
213         IF(VGRI(I,0,L)>0.) THEN
214C
215         TEMPTM=ALF(I,0)*S0(I,1,L,JV)-ALF1(I,0)*F0(I,0,JV)
216         S0(I,1,L,JV)=S0(I,1,L,JV)+F0(I,0,JV)
217         sy(I,1,L,JV)=ALF1(I,0)*sy(I,1,L,JV)+3.*TEMPTM
218C
219         ENDIF
220C
221      END DO
222      END DO
223C
224C  calculate flux and moments between adjacent boxes
225C  1- create temporary moments/masses for partial boxes in transit
226C  2- reajusts moments remaining in the box
227C
228C  flux from KP to K if V(K).lt.0 and from K to KP if V(K).gt.0
229C
230      DO K=1,LAT-1
231      KP=K+1
232      DO I=1,LON
233C
234         IF(VGRI(I,K,L)<0.) THEN
235           FM(I,K)=-VGRI(I,K,L)*DTY
236           ALF(I,K)=FM(I,K)/SM(I,KP,L)
237           SM(I,KP,L)=SM(I,KP,L)-FM(I,K)
238         ELSE
239           FM(I,K)=VGRI(I,K,L)*DTY
240           ALF(I,K)=FM(I,K)/SM(I,K,L)
241           SM(I,K,L)=SM(I,K,L)-FM(I,K)
242         ENDIF
243C
244         ALFQ(I,K)=ALF(I,K)*ALF(I,K)
245         ALF1(I,K)=1.-ALF(I,K)
246         ALF1Q(I,K)=ALF1(I,K)*ALF1(I,K)
247C
248      END DO
249      END DO
250C
251      DO JV=1,NTRA
252      DO K=1,LAT-1
253      KP=K+1
254      DO I=1,LON
255C
256         IF(VGRI(I,K,L)<0.) THEN
257C
258           F0(I,K,JV)=ALF (I,K)*
259     +                ( S0(I,KP,L,JV)-ALF1(I,K)*sy(I,KP,L,JV) )
260           FY(I,K,JV)=ALFQ(I,K)*sy(I,KP,L,JV)
261           FX(I,K,JV)=ALF (I,K)*sx(I,KP,L,JV)
262           FZ(I,K,JV)=ALF (I,K)*sz(I,KP,L,JV)
263C
264           S0(I,KP,L,JV)=S0(I,KP,L,JV)-F0(I,K,JV)
265           sy(I,KP,L,JV)=ALF1Q(I,K)*sy(I,KP,L,JV)
266           sx(I,KP,L,JV)=sx(I,KP,L,JV)-FX(I,K,JV)
267           sz(I,KP,L,JV)=sz(I,KP,L,JV)-FZ(I,K,JV)
268C
269         ELSE
270C
271           F0(I,K,JV)=ALF (I,K)*
272     +               ( S0(I,K,L,JV)+ALF1(I,K)*sy(I,K,L,JV) )
273           FY(I,K,JV)=ALFQ(I,K)*sy(I,K,L,JV)
274           FX(I,K,JV)=ALF(I,K)*sx(I,K,L,JV)
275           FZ(I,K,JV)=ALF(I,K)*sz(I,K,L,JV)
276C
277           S0(I,K,L,JV)=S0(I,K,L,JV)-F0(I,K,JV)
278           sy(I,K,L,JV)=ALF1Q(I,K)*sy(I,K,L,JV)
279           sx(I,K,L,JV)=sx(I,K,L,JV)-FX(I,K,JV)
280           sz(I,K,L,JV)=sz(I,K,L,JV)-FZ(I,K,JV)
281C
282         ENDIF
283C
284      END DO
285      END DO
286      END DO
287C
288C  puts the temporary moments Fi into appropriate neighboring boxes
289C
290      DO K=1,LAT-1
291      KP=K+1
292      DO I=1,LON
293C
294         IF(VGRI(I,K,L)<0.) THEN
295           SM(I,K,L)=SM(I,K,L)+FM(I,K)
296           ALF(I,K)=FM(I,K)/SM(I,K,L)
297         ELSE
298           SM(I,KP,L)=SM(I,KP,L)+FM(I,K)
299           ALF(I,K)=FM(I,K)/SM(I,KP,L)
300         ENDIF
301C
302         ALF1(I,K)=1.-ALF(I,K)
303C
304      END DO
305      END DO
306C
307      DO JV=1,NTRA
308      DO K=1,LAT-1
309      KP=K+1
310      DO I=1,LON
311C
312         IF(VGRI(I,K,L)<0.) THEN
313C
314         TEMPTM=-ALF(I,K)*S0(I,K,L,JV)+ALF1(I,K)*F0(I,K,JV)
315         S0(I,K,L,JV)=S0(I,K,L,JV)+F0(I,K,JV)
316         sy(I,K,L,JV)=ALF(I,K)*FY(I,K,JV)+ALF1(I,K)*sy(I,K,L,JV)
317     +               +3.*TEMPTM
318         sx(I,K,L,JV)=sx(I,K,L,JV)+FX(I,K,JV)
319         sz(I,K,L,JV)=sz(I,K,L,JV)+FZ(I,K,JV)
320C
321         ELSE
322C
323         TEMPTM=ALF(I,K)*S0(I,KP,L,JV)-ALF1(I,K)*F0(I,K,JV)
324         S0(I,KP,L,JV)=S0(I,KP,L,JV)+F0(I,K,JV)
325         sy(I,KP,L,JV)=ALF(I,K)*FY(I,K,JV)+ALF1(I,K)*sy(I,KP,L,JV)
326     +                +3.*TEMPTM
327         sx(I,KP,L,JV)=sx(I,KP,L,JV)+FX(I,K,JV)
328         sz(I,KP,L,JV)=sz(I,KP,L,JV)+FZ(I,K,JV)
329C
330         ENDIF
331C
332      END DO
333      END DO
334      END DO
335C
336C  traitement special pour le pole Sud (idem pole Nord)
337C
338      K=LAT
339C
340      SM0=0.
341      DO JV=1,NTRA
342         S00(JV)=0.
343      END DO
344C
345      DO I=1,LON
346C
347         IF(VGRI(I,K,L)>=0.) THEN
348           FM(I,K)=VGRI(I,K,L)*DTY
349           ALF(I,K)=FM(I,K)/SM(I,K,L)
350           SM(I,K,L)=SM(I,K,L)-FM(I,K)
351           SM0=SM0+FM(I,K)
352         ENDIF
353C
354         ALFQ(I,K)=ALF(I,K)*ALF(I,K)
355         ALF1(I,K)=1.-ALF(I,K)
356         ALF1Q(I,K)=ALF1(I,K)*ALF1(I,K)
357C
358      END DO
359C
360      DO JV=1,NTRA
361      DO I=1,LON
362C
363         IF(VGRI(I,K,L)>=0.) THEN
364           F0 (I,K,JV)=ALF(I,K)*
365     +                ( S0(I,K,L,JV)+ALF1(I,K)*sy(I,K,L,JV) )
366           S00(JV)=S00(JV)+F0(I,K,JV)
367C
368           S0(I,K,L,JV)=S0 (I,K,L,JV)-F0 (I,K,JV)
369           sy(I,K,L,JV)=ALF1Q(I,K)*sy(I,K,L,JV)
370           sx(I,K,L,JV)=ALF1(I,K)*sx(I,K,L,JV)
371           sz(I,K,L,JV)=ALF1(I,K)*sz(I,K,L,JV)
372         ENDIF
373C
374      END DO
375      END DO
376C
377      DO I=1,LON
378         IF(VGRI(I,K,L)<0.) THEN
379           FM(I,K)=-VGRI(I,K,L)*DTY
380           ALF(I,K)=FM(I,K)/SM0
381         ENDIF
382      END DO
383C
384      DO JV=1,NTRA
385      DO I=1,LON
386         IF(VGRI(I,K,L)<0.) THEN
387           F0(I,K,JV)=ALF(I,K)*S00(JV)
388         ENDIF
389      END DO
390      END DO
391C
392C  puts the temporary moments Fi into appropriate neighboring boxes
393C
394      DO I=1,LON
395C
396         IF(VGRI(I,K,L)<0.) THEN
397           SM(I,K,L)=SM(I,K,L)+FM(I,K)
398           ALF(I,K)=FM(I,K)/SM(I,K,L)
399         ENDIF
400C
401         ALF1(I,K)=1.-ALF(I,K)
402C
403      END DO
404C
405      DO JV=1,NTRA
406      DO I=1,LON
407C
408         IF(VGRI(I,K,L)<0.) THEN
409C
410         TEMPTM=-ALF(I,K)*S0(I,K,L,JV)+ALF1(I,K)*F0(I,K,JV)
411         S0(I,K,L,JV)=S0(I,K,L,JV)+F0(I,K,JV)
412         sy(I,K,L,JV)=ALF1(I,K)*sy(I,K,L,JV)+3.*TEMPTM
413C
414         ENDIF
415C
416      END DO
417      END DO
418C
419      END DO
420C
421      RETURN
422      END
423
Note: See TracBrowser for help on using the repository browser.