/[lmdze]/trunk/libf/dyn3d/prather.f
ViewVC logotype

Annotation of /trunk/libf/dyn3d/prather.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (hide annotations)
Thu Apr 1 14:59:19 2010 UTC (14 years, 1 month ago) by guez
File size: 10981 byte(s)
Split "vlsplt.f" in single-procedure files. Gathered the files in
directory "dyn3d/Vlsplt".

Defined "pbarum(:, 1, :)" and "pbarum(:, jjm + 1, :)" in procedure
"groupe".

1 guez 3 !
2     ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/prather.F,v 1.1.1.1 2004/05/19 12:53:07 lmdzadmin Exp $
3     !
4     SUBROUTINE prather (q,w,masse,pbaru,pbarv,nt,dt)
5     use dimens_m
6     use paramet_m
7     use comconst
8     use comvert
9     use comgeom
10     IMPLICIT NONE
11    
12     c=======================================================================
13     c Adaptation LMDZ: A.Armengaud (LGGE)
14     c ----------------
15     c
16     c ************************************************
17     c Transport des traceurs par la methode de prather
18     c Ref :
19     c
20     c ************************************************
21     c q,w,pext,pbaru et pbarv : arguments d'entree pour le s-pg
22     c
23     c=======================================================================
24    
25    
26    
27     c Arguments:
28     c ----------
29     INTEGER iq,nt
30 guez 31 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm )
31 guez 3 REAL masse(iip1,jjp1,llm)
32     REAL q( iip1,jjp1,llm,0:9)
33     REAL w( ip1jmp1,llm )
34     integer ordre,ilim
35    
36     c Local:
37     c ------
38     LOGICAL limit
39     real zq(iip1,jjp1,llm)
40     REAL sm ( iip1,jjp1, llm )
41     REAL s0( iip1,jjp1,llm ), sx( iip1,jjp1,llm )
42     REAL sy( iip1,jjp1,llm ), sz( iip1,jjp1,llm )
43     REAL sxx( iip1,jjp1,llm)
44     REAL sxy( iip1,jjp1,llm)
45     REAL sxz( iip1,jjp1,llm)
46     REAL syy( iip1,jjp1,llm )
47     REAL syz( iip1,jjp1,llm )
48     REAL szz( iip1,jjp1,llm ),zz
49     INTEGER i,j,l,indice
50     real sxn(iip1),sxs(iip1)
51    
52     real sinlon(iip1),sinlondlon(iip1)
53     real coslon(iip1),coslondlon(iip1)
54     real qmin,qmax
55     save qmin,qmax
56     save sinlon,coslon,sinlondlon,coslondlon
57     real dyn1,dyn2,dys1,dys2,qpn,qps,dqzpn,dqzps
58     real masn,mass
59     c
60     REAL SSUM
61     integer ismax,ismin
62     EXTERNAL SSUM, convflu,ismin,ismax
63     logical first
64     save first
65     EXTERNAL advxp,advyp,advzp
66    
67    
68     data first/.true./
69     data qmin,qmax/-1.e33,1.e33/
70    
71    
72     c==========================================================================
73     c==========================================================================
74     c MODIFICATION POUR PAS DE TEMPS ADAPTATIF, dtvr remplace par dt
75     c==========================================================================
76     c==========================================================================
77     REAL dt
78     c==========================================================================
79     limit = .TRUE.
80    
81     if(first) then
82     print*,'SCHEMA PRATHER'
83     first=.false.
84     do i=2,iip1
85     coslon(i)=cos(rlonv(i))
86     sinlon(i)=sin(rlonv(i))
87     coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
88     sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
89     enddo
90     coslon(1)=coslon(iip1)
91     coslondlon(1)=coslondlon(iip1)
92     sinlon(1)=sinlon(iip1)
93     sinlondlon(1)=sinlondlon(iip1)
94    
95     DO l = 1,llm
96     DO j = 1,jjp1
97     DO i = 1,iip1
98     q( i,j,l,1 )=0.
99     q( i,j,l,2)=0.
100     q( i,j,l,3)=0.
101     q( i,j,l,4)=0.
102     q( i,j,l,5)=0.
103     q( i,j,l,6)=0.
104     q( i,j,l,7)=0.
105     q( i,j,l,8)=0.
106     q( i,j,l,9)=0.
107     ENDDO
108     ENDDO
109     ENDDO
110     endif
111     c Fin modif Fred
112    
113     c *** On calcule la masse d'air en kg
114    
115     DO l = 1,llm
116     DO j = 1,jjp1
117     DO i = 1,iip1
118     sm( i,j,llm+1-l ) =masse(i,j,l)
119     ENDDO
120     ENDDO
121     ENDDO
122    
123     c *** q contient les qqtes de traceur avant l'advection
124    
125     c *** Affectation des tableaux S a partir de Q
126    
127     DO l = 1,llm
128     DO j = 1,jjp1
129     DO i = 1,iip1
130     s0( i,j,l) = q ( i,j,llm+1-l,0 )*sm(i,j,l)
131     sx( i,j,l) = q( i,j,llm+1-l,1 )*sm(i,j,l)
132     sy( i,j,l) = q( i,j,llm+1-l,2)*sm(i,j,l)
133     sz( i,j,l) = q( i,j,llm+1-l,3)*sm(i,j,l)
134     sxx( i,j,l) = q( i,j,llm+1-l,4)*sm(i,j,l)
135     sxy( i,j,l) = q( i,j,llm+1-l,5)*sm(i,j,l)
136     sxz( i,j,l) = q( i,j,llm+1-l,6)*sm(i,j,l)
137     syy( i,j,l) = q( i,j,llm+1-l,7)*sm(i,j,l)
138     syz( i,j,l) = q( i,j,llm+1-l,8)*sm(i,j,l)
139     szz( i,j,l) = q( i,j,llm+1-l,9)*sm(i,j,l)
140     ENDDO
141     ENDDO
142     ENDDO
143     c *** Appel des subroutines d'advection en X, en Y et en Z
144     c *** Advection avec "time-splitting"
145    
146     c-----------------------------------------------------------
147     do indice =1,nt
148     call advxp( limit,0.5*dt,pbaru,sm,s0,sx,sy,sz
149     . ,sxx,sxy,sxz,syy,syz,szz,1 )
150     end do
151     do l=1,llm
152     do i=1,iip1
153     sy(i,1,l)=0.
154     sy(i,jjp1,l)=0.
155     enddo
156     enddo
157     c---------------------------------------------------------
158     call advyp( limit,.5*dt*nt,pbarv,sm,s0,sx,sy,sz
159     . ,sxx,sxy,sxz,syy,syz,szz,1 )
160     c---------------------------------------------------------
161    
162     c---------------------------------------------------------
163     do j=1,jjp1
164     do i=1,iip1
165     sz(i,j,1)=0.
166     sz(i,j,llm)=0.
167     sxz(i,j,1)=0.
168     sxz(i,j,llm)=0.
169     syz(i,j,1)=0.
170     syz(i,j,llm)=0.
171     szz(i,j,1)=0.
172     szz(i,j,llm)=0.
173     enddo
174     enddo
175     call advzp( limit,dt*nt,w,sm,s0,sx,sy,sz
176     . ,sxx,sxy,sxz,syy,syz,szz,1 )
177     do l=1,llm
178     do i=1,iip1
179     sy(i,1,l)=0.
180     sy(i,jjp1,l)=0.
181     enddo
182     enddo
183    
184     c---------------------------------------------------------
185    
186     c---------------------------------------------------------
187     call advyp( limit,.5*dt*nt,pbarv,sm,s0,sx,sy,sz
188     . ,sxx,sxy,sxz,syy,syz,szz,1 )
189     c---------------------------------------------------------
190     DO l = 1,llm
191     DO j = 1,jjp1
192     s0( iip1,j,l)=s0( 1,j,l )
193     sx( iip1,j,l)=sx( 1,j,l )
194     sy( iip1,j,l)=sy( 1,j,l )
195     sz( iip1,j,l)=sz( 1,j,l )
196     sxx( iip1,j,l)=sxx( 1,j,l )
197     sxy( iip1,j,l)=sxy( 1,j,l)
198     sxz( iip1,j,l)=sxz( 1,j,l )
199     syy( iip1,j,l)=syy( 1,j,l )
200     syz( iip1,j,l)=syz( 1,j,l)
201     szz( iip1,j,l)=szz( 1,j,l )
202     ENDDO
203     ENDDO
204     do indice=1,nt
205     call advxp( limit,0.5*dt,pbaru,sm,s0,sx,sy,sz
206     . ,sxx,sxy,sxz,syy,syz,szz,1 )
207     end do
208     c---------------------------------------------------------
209     c---------------------------------------------------------
210     c *** On repasse les S dans la variable qpr
211     c *** On repasse les S dans la variable q directement 14/10/94
212    
213     DO l = 1,llm
214     DO j = 1,jjp1
215     DO i = 1,iip1
216     q( i,j,llm+1-l,0 )=s0( i,j,l )/sm(i,j,l)
217     q( i,j,llm+1-l,1 ) = sx( i,j,l )/sm(i,j,l)
218     q( i,j,llm+1-l,2 ) = sy( i,j,l )/sm(i,j,l)
219     q( i,j,llm+1-l,3 ) = sz( i,j,l )/sm(i,j,l)
220     q( i,j,llm+1-l,4 ) = sxx( i,j,l )/sm(i,j,l)
221     q( i,j,llm+1-l,5 ) = sxy( i,j,l )/sm(i,j,l)
222     q( i,j,llm+1-l,6 ) = sxz( i,j,l )/sm(i,j,l)
223     q( i,j,llm+1-l,7 ) = syy( i,j,l )/sm(i,j,l)
224     q( i,j,llm+1-l,8 ) = syz( i,j,l )/sm(i,j,l)
225     q( i,j,llm+1-l,9 ) = szz( i,j,l )/sm(i,j,l)
226     ENDDO
227     ENDDO
228     ENDDO
229    
230     c---------------------------------------------------------
231     c go to 777
232     c filtrages aux poles
233    
234     c Traitements specifiques au pole
235    
236     c filtrages aux poles
237     DO l=1,llm
238     c filtrages aux poles
239     masn=ssum(iim,sm(1,1,l),1)
240     mass=ssum(iim,sm(1,jjp1,l),1)
241     qpn=ssum(iim,s0(1,1,l),1)/masn
242     qps=ssum(iim,s0(1,jjp1,l),1)/mass
243     dqzpn=ssum(iim,sz(1,1,l),1)/masn
244     dqzps=ssum(iim,sz(1,jjp1,l),1)/mass
245     do i=1,iip1
246     q( i,1,llm+1-l,3)=dqzpn
247     q( i,jjp1,llm+1-l,3)=dqzps
248     q( i,1,llm+1-l,0)=qpn
249     q( i,jjp1,llm+1-l,0)=qps
250     enddo
251     c enddo
252     c print*,'qpn',qpn,'qps',qps
253     c print*,'dqzpn',dqzpn,'dqzps',dqzps
254     c enddo
255     dyn1=0.
256     dys1=0.
257     dyn2=0.
258     dys2=0.
259     do i=1,iim
260     zz=s0(i,2,l)/sm(i,2,l)-q(i,1,llm+1-l,0)
261     dyn1=dyn1+sinlondlon(i)*zz
262     dyn2=dyn2+coslondlon(i)*zz
263     zz=q(i,jjp1,llm+1-l,0)-s0(i,jjm,l)/sm(i,jjm,l)
264     dys1=dys1+sinlondlon(i)*zz
265     dys2=dys2+coslondlon(i)*zz
266     enddo
267     do i=1,iim
268     q(i,1,llm+1-l,2)=
269     $ (sinlon(i)*dyn1+coslon(i)*dyn2)/2.
270     q(i,1,llm+1-l,0)=q(i,1,llm+1-l,0)
271     $ +q(i,1,llm+1-l,2)
272     q(i,jjp1,llm+1-l,2)=
273     $ (sinlon(i)*dys1+coslon(i)*dys2)/2.
274     q(i,jjp1,llm+1-l,0)=q(i,jjp1,llm+1-l,0)
275     $ -q(i,jjp1,llm+1-l,2)
276     enddo
277     q(iip1,1,llm+1-l,0)=q(1,1,llm+1-l,0)
278     q(iip1,jjp1,llm+1-l,0)=q(1,jjp1,llm+1-l,0)
279     do i=1,iim
280     sxn(i)=q(i+1,1,llm+1-l,0)-q(i,1,llm+1-l,0)
281     sxs(i)=q(i+1,jjp1,llm+1-l,0)-q(i,jjp1,llm+1-l,0)
282     enddo
283     sxn(iip1)=sxn(1)
284     sxs(iip1)=sxs(1)
285     do i=1,iim
286     q(i+1,1,llm+1-l,1)=0.25*(sxn(i)+sxn(i+1))
287     q(i+1,jjp1,llm+1-l,1)=0.25*(sxs(i)+sxs(i+1))
288     END DO
289     q(1,1,llm+1-l,1)=q(iip1,1,llm+1-l,1)
290     q(1,jjp1,llm+1-l,1)=
291     $ q(iip1,jjp1,llm+1-l,1)
292     enddo
293     do l=1,llm
294     do i=1,iim
295     q( i,1,llm+1-l,4)=0.
296     q( i,jjp1,llm+1-l,4)=0.
297     q( i,1,llm+1-l,5)=0.
298     q( i,jjp1,llm+1-l,5)=0.
299     q( i,1,llm+1-l,6)=0.
300     q( i,jjp1,llm+1-l,6)=0.
301     q( i,1,llm+1-l,7)=0.
302     q( i,jjp1,llm+1-l,7)=0.
303     q( i,1,llm+1-l,8)=0.
304     q( i,jjp1,llm+1-l,8)=0.
305     q( i,1,llm+1-l,9)=0.
306     q( i,jjp1,llm+1-l,9)=0.
307     enddo
308     ENDDO
309    
310     777 continue
311     c
312     c bouclage en longitude
313     do l=1,llm
314     do j=1,jjp1
315     q(iip1,j,l,0)=q(1,j,l,0)
316     q(iip1,j,llm+1-l,0)=q(1,j,llm+1-l,0)
317     q(iip1,j,llm+1-l,1)=q(1,j,llm+1-l,1)
318     q(iip1,j,llm+1-l,2)=q(1,j,llm+1-l,2)
319     q(iip1,j,llm+1-l,3)=q(1,j,llm+1-l,3)
320     q(iip1,j,llm+1-l,4)=q(1,j,llm+1-l,4)
321     q(iip1,j,llm+1-l,5)=q(1,j,llm+1-l,5)
322     q(iip1,j,llm+1-l,6)=q(1,j,llm+1-l,6)
323     q(iip1,j,llm+1-l,7)=q(1,j,llm+1-l,7)
324     q(iip1,j,llm+1-l,8)=q(1,j,llm+1-l,8)
325     q(iip1,j,llm+1-l,9)=q(1,j,llm+1-l,9)
326     enddo
327     enddo
328     DO l = 1,llm
329     DO j = 2,jjm
330     DO i = 1,iip1
331     IF (q(i,j,l,0).lt.0.) THEN
332     PRINT*,'------------ BIP-----------'
333     PRINT*,'S0(',i,j,l,')=',q(i,j,l,0),
334     $ q(i,j-1,l,0)
335     PRINT*,'SX(',i,j,l,')=',q(i,j,l,1)
336     PRINT*,'SY(',i,j,l,')=',q(i,j,l,2),
337     $ q(i,j-1,l,2)
338     PRINT*,'SZ(',i,j,l,')=',q(i,j,l,3)
339     c PRINT*,' PBL EN SORTIE D'' ADVZP'
340     q(i,j,l,0)=0.
341     c STOP
342     ENDIF
343     ENDDO
344     ENDDO
345     do j=1,jjp1,jjm
346     do i=1,iip1
347     IF (q(i,j,l,0).lt.0.) THEN
348     PRINT*,'------------ BIP 2-----------'
349     PRINT*,'S0(',i,j,l,')=',q(i,j,l,0)
350     PRINT*,'SX(',i,j,l,')=',q(i,j,l,1)
351     PRINT*,'SY(',i,j,l,')=',q(i,j,l,2)
352     PRINT*,'SZ(',i,j,l,')=',q(i,j,l,3)
353    
354     q(i,j,l,0)=0.
355     c STOP
356     ENDIF
357     enddo
358     enddo
359     ENDDO
360     RETURN
361     END

  ViewVC Help
Powered by ViewVC 1.1.21