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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 32 - (hide annotations)
Tue Apr 6 17:52:58 2010 UTC (14 years, 2 months ago) by guez
File size: 10800 byte(s)
Split "stringop.f90" into single-procedure files. Gathered files in directory
"IOIPSL/Stringop".

Split "flincom.f90" into "flincom.f90" and "flinget.f90". Removed
unused procedures from module "flincom". Removed unused argument
"filename" of procedure "flinopen_nozoom".

Removed unused files.

Split "grid_change.f90" into "grid_change.f90" and
"gr_phy_write_3d.f90".

Removed unused procedures from modules "calendar", "ioipslmpp",
"grid_atob", "gath_cpl" and "getincom". Removed unused procedures in
files "ppm3d.f" and "thermcell.f".

Split "mathelp.f90" into "mathelp.f90" and "mathop.f90".

Removed unused variable "dpres" of module "comvert".

Use argument "itau" instead of local variables "iadvtr" and "first" to
control algorithm in procedure "fluxstokenc".

Removed unused arguments of procedure "integrd".

Removed useless computations at the end of procedure "leapfrog".

Merged common block "matrfil" into module "parafilt".

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     dyn1=0.
252     dys1=0.
253     dyn2=0.
254     dys2=0.
255     do i=1,iim
256     zz=s0(i,2,l)/sm(i,2,l)-q(i,1,llm+1-l,0)
257     dyn1=dyn1+sinlondlon(i)*zz
258     dyn2=dyn2+coslondlon(i)*zz
259     zz=q(i,jjp1,llm+1-l,0)-s0(i,jjm,l)/sm(i,jjm,l)
260     dys1=dys1+sinlondlon(i)*zz
261     dys2=dys2+coslondlon(i)*zz
262     enddo
263     do i=1,iim
264     q(i,1,llm+1-l,2)=
265     $ (sinlon(i)*dyn1+coslon(i)*dyn2)/2.
266     q(i,1,llm+1-l,0)=q(i,1,llm+1-l,0)
267     $ +q(i,1,llm+1-l,2)
268     q(i,jjp1,llm+1-l,2)=
269     $ (sinlon(i)*dys1+coslon(i)*dys2)/2.
270     q(i,jjp1,llm+1-l,0)=q(i,jjp1,llm+1-l,0)
271     $ -q(i,jjp1,llm+1-l,2)
272     enddo
273     q(iip1,1,llm+1-l,0)=q(1,1,llm+1-l,0)
274     q(iip1,jjp1,llm+1-l,0)=q(1,jjp1,llm+1-l,0)
275     do i=1,iim
276     sxn(i)=q(i+1,1,llm+1-l,0)-q(i,1,llm+1-l,0)
277     sxs(i)=q(i+1,jjp1,llm+1-l,0)-q(i,jjp1,llm+1-l,0)
278     enddo
279     sxn(iip1)=sxn(1)
280     sxs(iip1)=sxs(1)
281     do i=1,iim
282     q(i+1,1,llm+1-l,1)=0.25*(sxn(i)+sxn(i+1))
283     q(i+1,jjp1,llm+1-l,1)=0.25*(sxs(i)+sxs(i+1))
284     END DO
285     q(1,1,llm+1-l,1)=q(iip1,1,llm+1-l,1)
286     q(1,jjp1,llm+1-l,1)=
287     $ q(iip1,jjp1,llm+1-l,1)
288     enddo
289     do l=1,llm
290     do i=1,iim
291     q( i,1,llm+1-l,4)=0.
292     q( i,jjp1,llm+1-l,4)=0.
293     q( i,1,llm+1-l,5)=0.
294     q( i,jjp1,llm+1-l,5)=0.
295     q( i,1,llm+1-l,6)=0.
296     q( i,jjp1,llm+1-l,6)=0.
297     q( i,1,llm+1-l,7)=0.
298     q( i,jjp1,llm+1-l,7)=0.
299     q( i,1,llm+1-l,8)=0.
300     q( i,jjp1,llm+1-l,8)=0.
301     q( i,1,llm+1-l,9)=0.
302     q( i,jjp1,llm+1-l,9)=0.
303     enddo
304     ENDDO
305    
306     777 continue
307     c
308     c bouclage en longitude
309     do l=1,llm
310     do j=1,jjp1
311     q(iip1,j,l,0)=q(1,j,l,0)
312     q(iip1,j,llm+1-l,0)=q(1,j,llm+1-l,0)
313     q(iip1,j,llm+1-l,1)=q(1,j,llm+1-l,1)
314     q(iip1,j,llm+1-l,2)=q(1,j,llm+1-l,2)
315     q(iip1,j,llm+1-l,3)=q(1,j,llm+1-l,3)
316     q(iip1,j,llm+1-l,4)=q(1,j,llm+1-l,4)
317     q(iip1,j,llm+1-l,5)=q(1,j,llm+1-l,5)
318     q(iip1,j,llm+1-l,6)=q(1,j,llm+1-l,6)
319     q(iip1,j,llm+1-l,7)=q(1,j,llm+1-l,7)
320     q(iip1,j,llm+1-l,8)=q(1,j,llm+1-l,8)
321     q(iip1,j,llm+1-l,9)=q(1,j,llm+1-l,9)
322     enddo
323     enddo
324     DO l = 1,llm
325     DO j = 2,jjm
326     DO i = 1,iip1
327     IF (q(i,j,l,0).lt.0.) THEN
328     PRINT*,'------------ BIP-----------'
329     PRINT*,'S0(',i,j,l,')=',q(i,j,l,0),
330     $ q(i,j-1,l,0)
331     PRINT*,'SX(',i,j,l,')=',q(i,j,l,1)
332     PRINT*,'SY(',i,j,l,')=',q(i,j,l,2),
333     $ q(i,j-1,l,2)
334     PRINT*,'SZ(',i,j,l,')=',q(i,j,l,3)
335     q(i,j,l,0)=0.
336     ENDIF
337     ENDDO
338     ENDDO
339     do j=1,jjp1,jjm
340     do i=1,iip1
341     IF (q(i,j,l,0).lt.0.) THEN
342     PRINT*,'------------ BIP 2-----------'
343     PRINT*,'S0(',i,j,l,')=',q(i,j,l,0)
344     PRINT*,'SX(',i,j,l,')=',q(i,j,l,1)
345     PRINT*,'SY(',i,j,l,')=',q(i,j,l,2)
346     PRINT*,'SZ(',i,j,l,')=',q(i,j,l,3)
347    
348     q(i,j,l,0)=0.
349     c STOP
350     ENDIF
351     enddo
352     enddo
353     ENDDO
354     RETURN
355     END

  ViewVC Help
Powered by ViewVC 1.1.21