/[lmdze]/trunk/dyn3d/advz.f
ViewVC logotype

Annotation of /trunk/dyn3d/advz.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 82 - (hide annotations)
Wed Mar 5 14:57:53 2014 UTC (10 years, 3 months ago) by guez
File size: 7706 byte(s)
Changed all ".f90" suffixes to ".f".
1 guez 3
2 guez 81 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/advz.F,v 1.2 2005/05/25 13:10:09
3     ! fairhead Exp $
4 guez 3
5 guez 81 SUBROUTINE advz(limit, dtz, w, sm, s0, sx, sy, sz)
6     USE dimens_m
7     USE paramet_m
8     USE comconst
9     USE disvert_m
10     IMPLICIT NONE
11 guez 3
12 guez 81 ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
13     ! C
14     ! first-order moments (FOM) advection of tracer in Z direction C
15     ! C
16     ! Source : Pascal Simon (Meteo,CNRM) C
17     ! Adaptation : A.Armengaud (LGGE) juin 94 C
18     ! C
19     ! C
20     ! sont des arguments d'entree pour le s-pg... C
21     ! C
22     ! dq est l'argument de sortie pour le s-pg C
23     ! C
24     ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
25 guez 3
26 guez 81 ! parametres principaux du modele
27 guez 3
28    
29 guez 81 ! Arguments :
30     ! -----------
31     ! dtz : frequence fictive d'appel du transport
32     ! w : flux de masse en z en Pa.m2.s-1
33 guez 3
34 guez 81 INTEGER ntra
35     PARAMETER (ntra=1)
36 guez 3
37 guez 81 REAL, INTENT (IN) :: dtz
38     REAL w(iip1, jjp1, llm)
39 guez 3
40 guez 81 ! moments: SM total mass in each grid box
41     ! S0 mass of tracer in each grid box
42     ! Si 1rst order moment in i direction
43 guez 3
44 guez 81 REAL sm(iip1, jjp1, llm), s0(iip1, jjp1, llm, ntra)
45     REAL sx(iip1, jjp1, llm, ntra), sy(iip1, jjp1, llm, ntra), &
46     sz(iip1, jjp1, llm, ntra)
47 guez 3
48    
49 guez 81 ! Local :
50     ! -------
51 guez 3
52 guez 81 ! mass fluxes across the boundaries (UGRI,VGRI,WGRI)
53     ! mass fluxes in kg
54     ! declaration :
55 guez 3
56 guez 81 REAL wgri(iip1, jjp1, 0:llm)
57 guez 3
58    
59 guez 81 ! the moments F are used as temporary storage for
60     ! portions of grid boxes in transit at the current latitude
61 guez 3
62 guez 81 REAL fm(iim, llm)
63     REAL f0(iim, llm, ntra), fx(iim, llm, ntra)
64     REAL fy(iim, llm, ntra), fz(iim, llm, ntra)
65    
66     ! work arrays
67    
68     REAL alf(iim), alf1(iim), alfq(iim), alf1q(iim)
69     REAL temptm ! Just temporal variable
70     REAL sqi, sqf
71    
72     LOGICAL limit
73     INTEGER lon, lat, niv
74     INTEGER i, j, jv, k, l, lp
75    
76     lon = iim
77     lat = jjp1
78     niv = llm
79    
80     ! *** Test : diag de la qqtite totale de traceur
81     ! dans l'atmosphere avant l'advection en z
82     sqi = 0.
83     sqf = 0.
84    
85     DO l = 1, llm
86     DO j = 1, jjp1
87     DO i = 1, iim
88     ! IM 240305 sqi = sqi + S0(i,j,l,9)
89     sqi = sqi + s0(i, j, l, ntra)
90     END DO
91     END DO
92     END DO
93     PRINT *, '-------- DIAG DANS ADVZ - ENTREE ---------'
94     PRINT *, 'sqi=', sqi
95    
96     ! -----------------------------------------------------------------
97     ! Interface : adaptation nouveau modele
98     ! -------------------------------------
99    
100     ! Conversion du flux de masse en kg.s-1
101    
102     DO l = 1, llm
103     DO j = 1, jjp1
104     DO i = 1, iip1
105     ! wgri (i,j,llm+1-l) = w (i,j,l) / g
106     wgri(i, j, llm+1-l) = w(i, j, l)
107     ! wgri (i,j,0) = 0. ! a detruire ult.
108     ! wgri (i,j,l) = 0.1 ! w (i,j,l)
109     ! wgri (i,j,llm) = 0. ! a detruire ult.
110     END DO
111     END DO
112     END DO
113     DO j = 1, jjp1
114     DO i = 1, iip1
115     wgri(i, j, 0) = 0.
116     END DO
117     END DO
118    
119     ! -----------------------------------------------------------------
120    
121     ! start here
122     ! boucle sur les latitudes
123    
124     DO k = 1, lat
125    
126     ! place limits on appropriate moments before transport
127     ! (if flux-limiting is to be applied)
128    
129     IF (.NOT. limit) GO TO 101
130    
131     DO jv = 1, ntra
132     DO l = 1, niv
133     DO i = 1, lon
134     sz(i, k, l, jv) = sign(amin1(amax1(s0(i,k,l,jv), &
135     0.),abs(sz(i,k,l,jv))), sz(i,k,l,jv))
136     END DO
137     END DO
138     END DO
139    
140     101 CONTINUE
141    
142     ! boucle sur les niveaux intercouches de 1 a NIV-1
143     ! (flux nul au sommet L=0 et a la base L=NIV)
144    
145     ! calculate flux and moments between adjacent boxes
146     ! (flux from LP to L if WGRI(L).lt.0, from L to LP if WGRI(L).gt.0)
147     ! 1- create temporary moments/masses for partial boxes in transit
148     ! 2- reajusts moments remaining in the box
149    
150     DO l = 1, niv - 1
151     lp = l + 1
152    
153     DO i = 1, lon
154    
155     IF (wgri(i,k,l)<0.) THEN
156     fm(i, l) = -wgri(i, k, l)*dtz
157     alf(i) = fm(i, l)/sm(i, k, lp)
158     sm(i, k, lp) = sm(i, k, lp) - fm(i, l)
159     ELSE
160     fm(i, l) = wgri(i, k, l)*dtz
161     alf(i) = fm(i, l)/sm(i, k, l)
162     sm(i, k, l) = sm(i, k, l) - fm(i, l)
163     END IF
164    
165     alfq(i) = alf(i)*alf(i)
166     alf1(i) = 1. - alf(i)
167     alf1q(i) = alf1(i)*alf1(i)
168    
169     END DO
170    
171     DO jv = 1, ntra
172     DO i = 1, lon
173    
174     IF (wgri(i,k,l)<0.) THEN
175    
176     f0(i, l, jv) = alf(i)*(s0(i,k,lp,jv)-alf1(i)*sz(i,k,lp,jv))
177     fz(i, l, jv) = alfq(i)*sz(i, k, lp, jv)
178     fx(i, l, jv) = alf(i)*sx(i, k, lp, jv)
179     fy(i, l, jv) = alf(i)*sy(i, k, lp, jv)
180    
181     s0(i, k, lp, jv) = s0(i, k, lp, jv) - f0(i, l, jv)
182     sz(i, k, lp, jv) = alf1q(i)*sz(i, k, lp, jv)
183     sx(i, k, lp, jv) = sx(i, k, lp, jv) - fx(i, l, jv)
184     sy(i, k, lp, jv) = sy(i, k, lp, jv) - fy(i, l, jv)
185    
186     ELSE
187    
188     f0(i, l, jv) = alf(i)*(s0(i,k,l,jv)+alf1(i)*sz(i,k,l,jv))
189     fz(i, l, jv) = alfq(i)*sz(i, k, l, jv)
190     fx(i, l, jv) = alf(i)*sx(i, k, l, jv)
191     fy(i, l, jv) = alf(i)*sy(i, k, l, jv)
192    
193     s0(i, k, l, jv) = s0(i, k, l, jv) - f0(i, l, jv)
194     sz(i, k, l, jv) = alf1q(i)*sz(i, k, l, jv)
195     sx(i, k, l, jv) = sx(i, k, l, jv) - fx(i, l, jv)
196     sy(i, k, l, jv) = sy(i, k, l, jv) - fy(i, l, jv)
197    
198     END IF
199    
200     END DO
201     END DO
202    
203     END DO
204    
205     ! puts the temporary moments Fi into appropriate neighboring boxes
206    
207     DO l = 1, niv - 1
208     lp = l + 1
209    
210     DO i = 1, lon
211    
212     IF (wgri(i,k,l)<0.) THEN
213     sm(i, k, l) = sm(i, k, l) + fm(i, l)
214     alf(i) = fm(i, l)/sm(i, k, l)
215     ELSE
216     sm(i, k, lp) = sm(i, k, lp) + fm(i, l)
217     alf(i) = fm(i, l)/sm(i, k, lp)
218     END IF
219    
220     alf1(i) = 1. - alf(i)
221     alfq(i) = alf(i)*alf(i)
222     alf1q(i) = alf1(i)*alf1(i)
223    
224     END DO
225    
226     DO jv = 1, ntra
227     DO i = 1, lon
228    
229     IF (wgri(i,k,l)<0.) THEN
230    
231     temptm = -alf(i)*s0(i, k, l, jv) + alf1(i)*f0(i, l, jv)
232     s0(i, k, l, jv) = s0(i, k, l, jv) + f0(i, l, jv)
233     sz(i, k, l, jv) = alf(i)*fz(i, l, jv) + alf1(i)*sz(i, k, l, jv) + &
234     3.*temptm
235     sx(i, k, l, jv) = sx(i, k, l, jv) + fx(i, l, jv)
236     sy(i, k, l, jv) = sy(i, k, l, jv) + fy(i, l, jv)
237    
238     ELSE
239    
240     temptm = alf(i)*s0(i, k, lp, jv) - alf1(i)*f0(i, l, jv)
241     s0(i, k, lp, jv) = s0(i, k, lp, jv) + f0(i, l, jv)
242     sz(i, k, lp, jv) = alf(i)*fz(i, l, jv) + &
243     alf1(i)*sz(i, k, lp, jv) + 3.*temptm
244     sx(i, k, lp, jv) = sx(i, k, lp, jv) + fx(i, l, jv)
245     sy(i, k, lp, jv) = sy(i, k, lp, jv) + fy(i, l, jv)
246    
247     END IF
248    
249     END DO
250     END DO
251    
252     END DO
253    
254     ! fin de la boucle principale sur les latitudes
255    
256     END DO
257    
258     ! *** ------------------- bouclage cyclique en X ------------
259    
260     ! DO l = 1,llm
261     ! DO j = 1,jjp1
262     ! SM(iip1,j,l) = SM(1,j,l)
263     ! S0(iip1,j,l,ntra) = S0(1,j,l,ntra)
264     ! sx(iip1,j,l,ntra) = sx(1,j,l,ntra)
265     ! sy(iip1,j,l,ntra) = sy(1,j,l,ntra)
266     ! sz(iip1,j,l,ntra) = sz(1,j,l,ntra)
267     ! ENDDO
268     ! ENDDO
269    
270     ! -------------------------------------------------------------
271     ! *** Test : diag de la qqtite totale de traceur
272     ! dans l'atmosphere avant l'advection en z
273     DO l = 1, llm
274     DO j = 1, jjp1
275     DO i = 1, iim
276     ! IM 240305 sqf = sqf + S0(i,j,l,9)
277     sqf = sqf + s0(i, j, l, ntra)
278     END DO
279     END DO
280     END DO
281     PRINT *, '-------- DIAG DANS ADVZ - SORTIE ---------'
282     PRINT *, 'sqf=', sqf
283    
284     ! -------------------------------------------------------------
285     RETURN
286     END SUBROUTINE advz
287     ! _______________________________________________________________
288     ! _______________________________________________________________

  ViewVC Help
Powered by ViewVC 1.1.21