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

Last change on this file since 5456 was 5285, checked in by abarral, 2 months ago

As discussed internally, remove generic ONLY: ... for new _mod_h modules

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