source: LMDZ6/branches/Amaury_dev/libf/dyn3d_common/advz.F @ 5086

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