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

Last change on this file since 5272 was 5272, checked in by abarral, 23 hours ago

Turn paramet.h into a module

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