source: LMDZ6/trunk/libf/dyn3d_common/advy.f90 @ 5271

Last change on this file since 5271 was 5271, checked in by abarral, 26 hours ago

Move dimensions.h into a module
Nb: doesn't compile yet

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