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

Last change on this file since 5080 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
RevLine 
[524]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
[2600]11C  Source : Pascal Simon ( Meteo, CNRM )                         C
12C  Adaptation : A.A. (LGGE)                                      C
[524]13C  Derniere Modif : 15/12/94 LAST
[2600]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
[524]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
[2600]28      include "dimensions.h"
29      include "paramet.h"
30      include "comgeom2.h"
[524]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
[5079]123      DO L=1,NIV
[524]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
[5079]130      DO JV=1,NTRA
131      DO K=1,LAT
132      DO I=1,LON
[524]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))
[5079]135      END DO
136      END DO
137      END DO
[524]138C
139 11   CONTINUE
140C
141C  le flux a travers le pole Nord est traite separement
142C
143      SM0=0.
[5079]144      DO JV=1,NTRA
[524]145         S00(JV)=0.
[5079]146      END DO
[524]147C
[5079]148      DO I=1,LON
[524]149C
[5079]150         IF(VGRI(I,0,L)<=0.) THEN
[524]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
[5079]161      END DO
[524]162C
[5079]163      DO JV=1,NTRA
164      DO I=1,LON
[524]165C
[5079]166         IF(VGRI(I,0,L)<=0.) THEN
[524]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
[5079]179      END DO
180      END DO
[524]181C
[5079]182      DO I=1,LON
183         IF(VGRI(I,0,L)>0.) THEN
[524]184           FM(I,0)=VGRI(I,0,L)*DTY
185           ALF(I,0)=FM(I,0)/SM0
186         ENDIF
[5079]187      END DO
[524]188C
[5079]189      DO JV=1,NTRA
190      DO I=1,LON
191         IF(VGRI(I,0,L)>0.) THEN
[524]192           F0(I,0,JV)=ALF(I,0)*S00(JV)
193         ENDIF
[5079]194      END DO
195      END DO
[524]196C
197C  puts the temporary moments Fi into appropriate neighboring boxes
198C
[5079]199      DO I=1,LON
[524]200C
[5079]201         IF(VGRI(I,0,L)>0.) THEN
[524]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
[5079]208      END DO
[524]209C
[5079]210      DO JV=1,NTRA
211      DO I=1,LON
[524]212C
[5079]213         IF(VGRI(I,0,L)>0.) THEN
[524]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
[5079]221      END DO
222      END DO
[524]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
[5079]230      DO K=1,LAT-1
[524]231      KP=K+1
[5079]232      DO I=1,LON
[524]233C
[5079]234         IF(VGRI(I,K,L)<0.) THEN
[524]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
[5079]248      END DO
249      END DO
[524]250C
[5079]251      DO JV=1,NTRA
252      DO K=1,LAT-1
[524]253      KP=K+1
[5079]254      DO I=1,LON
[524]255C
[5079]256         IF(VGRI(I,K,L)<0.) THEN
[524]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
[5079]284      END DO
285      END DO
286      END DO
[524]287C
288C  puts the temporary moments Fi into appropriate neighboring boxes
289C
[5079]290      DO K=1,LAT-1
[524]291      KP=K+1
[5079]292      DO I=1,LON
[524]293C
[5079]294         IF(VGRI(I,K,L)<0.) THEN
[524]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
[5079]304      END DO
305      END DO
[524]306C
[5079]307      DO JV=1,NTRA
308      DO K=1,LAT-1
[524]309      KP=K+1
[5079]310      DO I=1,LON
[524]311C
[5079]312         IF(VGRI(I,K,L)<0.) THEN
[524]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
[5079]332      END DO
333      END DO
334      END DO
[524]335C
336C  traitement special pour le pole Sud (idem pole Nord)
337C
338      K=LAT
339C
340      SM0=0.
[5079]341      DO JV=1,NTRA
[524]342         S00(JV)=0.
[5079]343      END DO
[524]344C
[5079]345      DO I=1,LON
[524]346C
[5079]347         IF(VGRI(I,K,L)>=0.) THEN
[524]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
[5079]358      END DO
[524]359C
[5079]360      DO JV=1,NTRA
361      DO I=1,LON
[524]362C
[5079]363         IF(VGRI(I,K,L)>=0.) THEN
[524]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
[5079]374      END DO
375      END DO
[524]376C
[5079]377      DO I=1,LON
378         IF(VGRI(I,K,L)<0.) THEN
[524]379           FM(I,K)=-VGRI(I,K,L)*DTY
380           ALF(I,K)=FM(I,K)/SM0
381         ENDIF
[5079]382      END DO
[524]383C
[5079]384      DO JV=1,NTRA
385      DO I=1,LON
386         IF(VGRI(I,K,L)<0.) THEN
[524]387           F0(I,K,JV)=ALF(I,K)*S00(JV)
388         ENDIF
[5079]389      END DO
390      END DO
[524]391C
392C  puts the temporary moments Fi into appropriate neighboring boxes
393C
[5079]394      DO I=1,LON
[524]395C
[5079]396         IF(VGRI(I,K,L)<0.) THEN
[524]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
[5079]403      END DO
[524]404C
[5079]405      DO JV=1,NTRA
406      DO I=1,LON
[524]407C
[5079]408         IF(VGRI(I,K,L)<0.) THEN
[524]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
[5079]416      END DO
417      END DO
[524]418C
[5079]419      END DO
[524]420C
421      RETURN
422      END
423
Note: See TracBrowser for help on using the repository browser.