source: LMDZ6/trunk/libf/dyn3d_common/advz.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: 8.7 KB
Line 
1!
2! $Header$
3!
4SUBROUTINE advz(limit,dtz,w,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 (FOM) advection of tracer in Z direction  C
13  !                                                                C
14  !  Source : Pascal Simon (Meteo,CNRM)                            C
15  !  Adaptation : A.Armengaud (LGGE) juin 94                       C
16  !                                                                C
17  !                                                                C
18  !  sont des arguments d'entree pour le s-pg...                   C
19  !                                                                C
20  !  dq est l'argument de sortie pour le s-pg                      C
21  !                                                                C
22  !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
23  !
24  !  parametres principaux du modele
25  !
26
27
28
29  ! INCLUDE "traceur.h"
30
31  !  Arguments :
32  !  -----------
33  !  dtz : frequence fictive d'appel du transport
34  !  w : flux de masse en z en Pa.m2.s-1
35
36  INTEGER :: ntra
37  PARAMETER (ntra = 1)
38
39  REAL :: dtz
40  REAL :: w ( iip1,jjp1,llm )
41
42  !  moments: SM  total mass in each grid box
43        ! S0  mass of tracer in each grid box
44        ! Si  1rst order moment in i direction
45  !
46  REAL :: SM(iip1,jjp1,llm) &
47        ,S0(iip1,jjp1,llm,ntra)
48  REAL :: sx(iip1,jjp1,llm,ntra) &
49        ,sy(iip1,jjp1,llm,ntra) &
50        ,sz(iip1,jjp1,llm,ntra)
51
52
53  !  Local :
54  !  -------
55
56  !  mass fluxes across the boundaries (UGRI,VGRI,WGRI)
57  !  mass fluxes in kg
58  !  declaration :
59
60  REAL :: WGRI(iip1,jjp1,0:llm)
61
62  !
63  !  the moments F are used as temporary  storage for
64  !  portions of grid boxes in transit at the current latitude
65  !
66  REAL :: FM(iim,llm)
67  REAL :: F0(iim,llm,ntra),FX(iim,llm,ntra)
68  REAL :: FY(iim,llm,ntra),FZ(iim,llm,ntra)
69  !
70  !  work arrays
71  !
72  REAL :: ALF(iim),ALF1(iim),ALFQ(iim),ALF1Q(iim)
73  REAL :: TEMPTM            ! Just temporal variable
74  REAL :: sqi,sqf
75  !
76  LOGICAL :: LIMIT
77  INTEGER :: lon,lat,niv
78  INTEGER :: i,j,jv,k,l,lp
79
80  lon = iim
81  lat = jjp1
82  niv = llm
83
84  ! *** Test de passage d'arguments ******
85
86  ! DO 399 l = 1, llm
87  ! DO 399 j = 1, jjp1
88  ! DO 399 i = 1, iip1
89  !    IF (S0(i,j,l,ntra) .lt. 0. ) THEN
90  !       PRINT*,'S0(',i,j,l,')=',S0(i,j,l,ntra)
91  !       print*, 'sx(',i,j,l,')=',sx(i,j,l,ntra)
92  !       print*, 'sy(',i,j,l,')=',sy(i,j,l,ntra)
93  !       print*, 'sz(',i,j,l,')=',sz(i,j,l,ntra)
94  !       PRINT*, 'AIE !! debut ADVZ - pbl arg. passage dans ADVZ'
95  !        STOP
96  !    ENDIF
97  399   CONTINUE
98
99  !-----------------------------------------------------------------
100  ! *** Test : diag de la qqtite totale de traceur
101         ! dans l'atmosphere avant l'advection en z
102  sqi = 0.
103  sqf = 0.
104
105  DO l = 1,llm
106     DO j = 1,jjp1
107        DO i = 1,iim
108  !IM 240305            sqi = sqi + S0(i,j,l,9)
109           sqi = sqi + S0(i,j,l,ntra)
110        ENDDO
111     ENDDO
112  ENDDO
113  PRINT*,'-------- DIAG DANS ADVZ - ENTREE ---------'
114  PRINT*,'sqi=',sqi
115
116  !-----------------------------------------------------------------
117  !  Interface : adaptation nouveau modele
118  !  -------------------------------------
119  !
120  !  Conversion du flux de masse en kg.s-1
121
122  DO l = 1,llm
123     DO j = 1,jjp1
124        DO i = 1,iip1
125         ! wgri (i,j,llm+1-l) =  w (i,j,l) / g
126           wgri (i,j,llm+1-l) =  w (i,j,l)
127          ! wgri (i,j,0) = 0.                ! a detruire ult.
128          ! wgri (i,j,l) = 0.1               !    w (i,j,l)
129          ! wgri (i,j,llm) = 0.              ! a detruire ult.
130        END DO
131     END DO
132  END DO
133     DO  j = 1,jjp1
134        DO i = 1,iip1
135           wgri(i,j,0)=0.
136        enddo
137     enddo
138
139  !-----------------------------------------------------------------
140
141  !  start here
142  !  boucle sur les latitudes
143  !
144  DO K=1,LAT
145  !
146  !  place limits on appropriate moments before transport
147  !  (if flux-limiting is to be applied)
148  !
149  IF(.NOT.LIMIT) GO TO 101
150  !
151  DO JV=1,NTRA
152  DO L=1,NIV
153     DO I=1,LON
154        sz(I,K,L,JV)=SIGN(AMIN1(AMAX1(S0(I,K,L,JV),0.), &
155              ABS(sz(I,K,L,JV))),sz(I,K,L,JV))
156     END DO
157  END DO
158  END DO
159  !
160 101   CONTINUE
161  !
162  !  boucle sur les niveaux intercouches de 1 a NIV-1
163  !   (flux nul au sommet L=0 et a la base L=NIV)
164  !
165  !  calculate flux and moments between adjacent boxes
166  ! (flux from LP to L if WGRI(L).lt.0, from L to LP if WGRI(L).gt.0)
167  !  1- create temporary moments/masses for partial boxes in transit
168  !  2- reajusts moments remaining in the box
169  !
170  DO L=1,NIV-1
171  LP=L+1
172  !
173  DO I=1,LON
174  !
175     IF(WGRI(I,K,L).LT.0.) THEN
176       FM(I,L)=-WGRI(I,K,L)*DTZ
177       ALF(I)=FM(I,L)/SM(I,K,LP)
178       SM(I,K,LP)=SM(I,K,LP)-FM(I,L)
179     ELSE
180       FM(I,L)=WGRI(I,K,L)*DTZ
181       ALF(I)=FM(I,L)/SM(I,K,L)
182       SM(I,K,L)=SM(I,K,L)-FM(I,L)
183     ENDIF
184  !
185     ALFQ (I)=ALF(I)*ALF(I)
186     ALF1 (I)=1.-ALF(I)
187     ALF1Q(I)=ALF1(I)*ALF1(I)
188  !
189  END DO
190  !
191  DO JV=1,NTRA
192  DO I=1,LON
193  !
194     IF(WGRI(I,K,L).LT.0.) THEN
195  !
196       F0(I,L,JV)=ALF (I)*( S0(I,K,LP,JV)-ALF1(I)*sz(I,K,LP,JV) )
197       FZ(I,L,JV)=ALFQ(I)*sz(I,K,LP,JV)
198       FX(I,L,JV)=ALF (I)*sx(I,K,LP,JV)
199       FY(I,L,JV)=ALF (I)*sy(I,K,LP,JV)
200  !
201       S0(I,K,LP,JV)=S0(I,K,LP,JV)-F0(I,L,JV)
202       sz(I,K,LP,JV)=ALF1Q(I)*sz(I,K,LP,JV)
203       sx(I,K,LP,JV)=sx(I,K,LP,JV)-FX(I,L,JV)
204       sy(I,K,LP,JV)=sy(I,K,LP,JV)-FY(I,L,JV)
205  !
206     ELSE
207  !
208       F0(I,L,JV)=ALF (I)*(S0(I,K,L,JV)+ALF1(I)*sz(I,K,L,JV) )
209       FZ(I,L,JV)=ALFQ(I)*sz(I,K,L,JV)
210       FX(I,L,JV)=ALF (I)*sx(I,K,L,JV)
211       FY(I,L,JV)=ALF (I)*sy(I,K,L,JV)
212  !
213       S0(I,K,L,JV)=S0(I,K,L,JV)-F0(I,L,JV)
214       sz(I,K,L,JV)=ALF1Q(I)*sz(I,K,L,JV)
215       sx(I,K,L,JV)=sx(I,K,L,JV)-FX(I,L,JV)
216       sy(I,K,L,JV)=sy(I,K,L,JV)-FY(I,L,JV)
217  !
218     ENDIF
219  !
220  END DO
221  END DO
222  !
223  END DO
224  !
225  !  puts the temporary moments Fi into appropriate neighboring boxes
226  !
227  DO L=1,NIV-1
228  LP=L+1
229  !
230  DO I=1,LON
231  !
232     IF(WGRI(I,K,L).LT.0.) THEN
233       SM(I,K,L)=SM(I,K,L)+FM(I,L)
234       ALF(I)=FM(I,L)/SM(I,K,L)
235     ELSE
236       SM(I,K,LP)=SM(I,K,LP)+FM(I,L)
237       ALF(I)=FM(I,L)/SM(I,K,LP)
238     ENDIF
239  !
240     ALF1(I)=1.-ALF(I)
241     ALFQ(I)=ALF(I)*ALF(I)
242     ALF1Q(I)=ALF1(I)*ALF1(I)
243  !
244  END DO
245  !
246  DO JV=1,NTRA
247  DO I=1,LON
248  !
249     IF(WGRI(I,K,L).LT.0.) THEN
250  !
251       TEMPTM=-ALF(I)*S0(I,K,L,JV)+ALF1(I)*F0(I,L,JV)
252       S0(I,K,L,JV)=S0(I,K,L,JV)+F0(I,L,JV)
253       sz(I,K,L,JV)=ALF(I)*FZ(I,L,JV)+ALF1(I)*sz(I,K,L,JV)+3.*TEMPTM
254       sx(I,K,L,JV)=sx(I,K,L,JV)+FX(I,L,JV)
255       sy(I,K,L,JV)=sy(I,K,L,JV)+FY(I,L,JV)
256  !
257     ELSE
258  !
259       TEMPTM=ALF(I)*S0(I,K,LP,JV)-ALF1(I)*F0(I,L,JV)
260       S0(I,K,LP,JV)=S0(I,K,LP,JV)+F0(I,L,JV)
261       sz(I,K,LP,JV)=ALF(I)*FZ(I,L,JV)+ALF1(I)*sz(I,K,LP,JV) &
262             +3.*TEMPTM
263       sx(I,K,LP,JV)=sx(I,K,LP,JV)+FX(I,L,JV)
264       sy(I,K,LP,JV)=sy(I,K,LP,JV)+FY(I,L,JV)
265  !
266     ENDIF
267  !
268  END DO
269  END DO
270  !
271  END DO
272  !
273  !  fin de la boucle principale sur les latitudes
274  !
275  END DO
276  !
277  !-------------------------------------------------------------
278  !
279  ! ----------- AA Test en fin de ADVX ------ Controle des S*
280
281  ! DO 9999 l = 1, llm
282  ! DO 9999 j = 1, jjp1
283  ! DO 9999 i = 1, iip1
284  !    IF (S0(i,j,l,ntra).lt.0..and.LIMIT) THEN
285  !       PRINT*, '-------------------'
286  !       PRINT*, 'En fin de ADVZ'
287  !       PRINT*,'S0(',i,j,l,')=',S0(i,j,l,ntra)
288  !       print*, 'sx(',i,j,l,')=',sx(i,j,l,ntra)
289  !       print*, 'sy(',i,j,l,')=',sy(i,j,l,ntra)
290  !       print*, 'sz(',i,j,l,')=',sz(i,j,l,ntra)
291  !       WRITE (*,*) 'On arrete !! - pbl en fin de ADVZ1'
292  !        STOP
293  !    ENDIF
294 9999   CONTINUE
295
296  ! *** ------------------- bouclage cyclique  en X ------------
297
298   ! DO l = 1,llm
299   !    DO j = 1,jjp1
300   !       SM(iip1,j,l) = SM(1,j,l)
301   !       S0(iip1,j,l,ntra) = S0(1,j,l,ntra)
302   !       sx(iip1,j,l,ntra) = sx(1,j,l,ntra)
303   !       sy(iip1,j,l,ntra) = sy(1,j,l,ntra)
304   !       sz(iip1,j,l,ntra) = sz(1,j,l,ntra)
305   !    ENDDO
306   ! ENDDO
307
308  !-------------------------------------------------------------
309  ! *** Test : diag de la qqtite totale de traceur
310   !       dans l'atmosphere avant l'advection en z
311  DO l = 1,llm
312     DO j = 1,jjp1
313        DO i = 1,iim
314  !IM 240305            sqf = sqf + S0(i,j,l,9)
315           sqf = sqf + S0(i,j,l,ntra)
316        ENDDO
317     ENDDO
318  ENDDO
319  PRINT*,'-------- DIAG DANS ADVZ - SORTIE ---------'
320  PRINT*,'sqf=', sqf
321
322  !-------------------------------------------------------------
323  RETURN
324END SUBROUTINE advz
325!_______________________________________________________________
326!_______________________________________________________________
Note: See TracBrowser for help on using the repository browser.