/[lmdze]/trunk/dyn3d/Vlsplt/vly.f
ViewVC logotype

Annotation of /trunk/dyn3d/Vlsplt/vly.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
Original Path: trunk/libf/dyn3d/Vlsplt/vly.f90
File size: 9040 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 31 SUBROUTINE vly(q,pente_max,masse,masse_adv_v)
2     !
3     ! Auteurs: P.Le Van, F.Hourdin, F.Forget
4     !
5     ! ***********************************************************
6     ! Shema d'advection " pseudo amont " .
7     ! *************************************************************
8     ! q,masse_adv_v,w sont des arguments d'entree pour le s-pg ....
9     ! dq sont des arguments de sortie pour le s-pg ....
10     !
11     !
12     ! ----------------------------------------------------------------
13     use dimens_m
14     use paramet_m
15     use comconst
16     use comvert
17     use logic
18     use comgeom
19     IMPLICIT NONE
20     !
21     !
22     !
23     ! Arguments:
24     ! ----------
25     REAL masse(ip1jmp1,llm),pente_max
26     REAL masse_adv_v( ip1jm,llm)
27     REAL q(ip1jmp1,llm), dq( ip1jmp1,llm)
28     !
29     ! Local
30     ! ---------
31     !
32     INTEGER i,ij,l
33     !
34     REAL airej2,airejjm,airescb(iim),airesch(iim)
35     REAL dyq(ip1jmp1,llm),dyqv(ip1jm),zdvm(ip1jmp1,llm)
36     REAL adyqv(ip1jm),dyqmax(ip1jmp1)
37     REAL qbyv(ip1jm,llm)
38    
39     REAL qpns,qpsn,apn,aps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
40     ! REAL newq,oldmasse
41     Logical extremum,first,testcpu
42     REAL temps0,temps1,temps2,temps3,temps4,temps5,second
43     SAVE temps0,temps1,temps2,temps3,temps4,temps5
44     SAVE first,testcpu
45    
46     REAL convpn,convps,convmpn,convmps
47     real massepn,masseps,qpn,qps
48     REAL sinlon(iip1),sinlondlon(iip1)
49     REAL coslon(iip1),coslondlon(iip1)
50     SAVE sinlon,coslon,sinlondlon,coslondlon
51     SAVE airej2,airejjm
52     !
53     !
54     REAL SSUM
55    
56     DATA first,testcpu/.true.,.false./
57     DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
58    
59     IF(first) THEN
60     PRINT*,'Shema Amont nouveau appele dans Vanleer '
61     first=.false.
62     do i=2,iip1
63     coslon(i)=cos(rlonv(i))
64     sinlon(i)=sin(rlonv(i))
65     coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi
66     sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
67     ENDDO
68     coslon(1)=coslon(iip1)
69     coslondlon(1)=coslondlon(iip1)
70     sinlon(1)=sinlon(iip1)
71     sinlondlon(1)=sinlondlon(iip1)
72     airej2 = SSUM( iim, aire(iip2), 1 )
73     airejjm= SSUM( iim, aire(ip1jm -iim), 1 )
74     ENDIF
75    
76     !
77     !PRINT*,'CALCUL EN LATITUDE'
78    
79     DO l = 1, llm
80     !
81     ! --------------------------------
82     ! CALCUL EN LATITUDE
83     ! --------------------------------
84    
85     ! On commence par calculer la valeur du traceur moyenne sur le
86     ! premier cercle
87     ! de latitude autour du pole (qpns pour le pole nord et qpsn pour
88     ! le pole nord) qui sera utilisee pour evaluer les pentes au pole.
89    
90     DO i = 1, iim
91     airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
92     airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
93     ENDDO
94     qpns = SSUM( iim, airescb ,1 ) / airej2
95     qpsn = SSUM( iim, airesch ,1 ) / airejjm
96    
97     ! calcul des pentes aux points v
98    
99     DO ij=1,ip1jm
100     dyqv(ij)=q(ij,l)-q(ij+iip1,l)
101     adyqv(ij)=abs(dyqv(ij))
102     ENDDO
103    
104     ! calcul des pentes aux points scalaires
105    
106     DO ij=iip2,ip1jm
107     dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))
108     dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))
109     dyqmax(ij)=pente_max*dyqmax(ij)
110     ENDDO
111    
112     ! calcul des pentes aux poles
113    
114     DO ij=1,iip1
115     dyq(ij,l)=qpns-q(ij+iip1,l)
116     dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
117     ENDDO
118    
119     ! filtrage de la derivee
120     dyn1=0.
121     dys1=0.
122     dyn2=0.
123     dys2=0.
124     DO ij=1,iim
125     dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)
126     dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)
127     dyn2=dyn2+coslondlon(ij)*dyq(ij,l)
128     dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)
129     ENDDO
130     DO ij=1,iip1
131     dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)
132     dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)
133     ENDDO
134    
135     ! calcul des pentes limites aux poles
136    
137     goto 8888
138     fn=1.
139     fs=1.
140     DO ij=1,iim
141     IF(pente_max*adyqv(ij).lt.abs(dyq(ij,l))) THEN
142     fn=min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)
143     ENDIF
144     IF(pente_max*adyqv(ij+ip1jm-iip1).lt.abs(dyq(ij+ip1jm,l))) THEN
145     fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)
146     ENDIF
147     ENDDO
148     DO ij=1,iip1
149     dyq(ij,l)=fn*dyq(ij,l)
150     dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)
151     ENDDO
152     8888 continue
153     DO ij=1,iip1
154     dyq(ij,l)=0.
155     dyq(ip1jm+ij,l)=0.
156     ENDDO
157    
158     !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
159     ! En memoire de dIFferents tests sur la
160     ! limitation des pentes aux poles.
161     !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
162     ! PRINT*,dyq(1)
163     ! PRINT*,dyqv(iip1+1)
164     ! apn=abs(dyq(1)/dyqv(iip1+1))
165     ! PRINT*,dyq(ip1jm+1)
166     ! PRINT*,dyqv(ip1jm-iip1+1)
167     ! aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))
168     ! DO ij=2,iim
169     ! apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)
170     ! aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)
171     ! ENDDO
172     ! apn=min(pente_max/apn,1.)
173     ! aps=min(pente_max/aps,1.)
174     !
175     !
176     ! cas ou on a un extremum au pole
177     !
178     ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
179     ! & apn=0.
180     ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
181     ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
182     ! & aps=0.
183     !
184     ! limitation des pentes aux poles
185     ! DO ij=1,iip1
186     ! dyq(ij)=apn*dyq(ij)
187     ! dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
188     ! ENDDO
189     !
190     ! test
191     ! DO ij=1,iip1
192     ! dyq(iip1+ij)=0.
193     ! dyq(ip1jm+ij-iip1)=0.
194     ! ENDDO
195     ! DO ij=1,ip1jmp1
196     ! dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
197     ! ENDDO
198     !
199     ! changement 10 07 96
200     ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
201     ! & THEN
202     ! DO ij=1,iip1
203     ! dyqmax(ij)=0.
204     ! ENDDO
205     ! ELSE
206     ! DO ij=1,iip1
207     ! dyqmax(ij)=pente_max*abs(dyqv(ij))
208     ! ENDDO
209     ! ENDIF
210     !
211     ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
212     ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
213     ! &THEN
214     ! DO ij=ip1jm+1,ip1jmp1
215     ! dyqmax(ij)=0.
216     ! ENDDO
217     ! ELSE
218     ! DO ij=ip1jm+1,ip1jmp1
219     ! dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))
220     ! ENDDO
221     ! ENDIF
222     ! fin changement 10 07 96
223     !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
224    
225     ! calcul des pentes limitees
226    
227     DO ij=iip2,ip1jm
228     IF(dyqv(ij)*dyqv(ij-iip1).gt.0.) THEN
229     dyq(ij,l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))
230     ELSE
231     dyq(ij,l)=0.
232     ENDIF
233     ENDDO
234    
235     ENDDO
236    
237     DO l=1,llm
238     DO ij=1,ip1jm
239     IF(masse_adv_v(ij,l).gt.0) THEN
240     qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)* &
241     & 0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))
242     ELSE
243     qbyv(ij,l)=q(ij,l)-dyq(ij,l)* &
244     & 0.5*(1.+masse_adv_v(ij,l)/masse(ij,l))
245     ENDIF
246     qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l)
247     ENDDO
248     ENDDO
249    
250    
251     DO l=1,llm
252     DO ij=iip2,ip1jm
253     newmasse=masse(ij,l) &
254     & +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
255     q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l)) &
256     & /newmasse
257     masse(ij,l)=newmasse
258     ENDDO
259     !.-. ancienne version
260     ! convpn=SSUM(iim,qbyv(1,l),1)/apoln
261     ! convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
262    
263     convpn=SSUM(iim,qbyv(1,l),1)
264     convmpn=ssum(iim,masse_adv_v(1,l),1)
265     massepn=ssum(iim,masse(1,l),1)
266     qpn=0.
267     do ij=1,iim
268     qpn=qpn+masse(ij,l)*q(ij,l)
269     enddo
270     qpn=(qpn+convpn)/(massepn+convmpn)
271     do ij=1,iip1
272     q(ij,l)=qpn
273     enddo
274    
275     ! convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
276     ! convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)/apols
277    
278     convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
279     convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
280     masseps=ssum(iim, masse(ip1jm+1,l),1)
281     qps=0.
282     do ij = ip1jm+1,ip1jmp1-1
283     qps=qps+masse(ij,l)*q(ij,l)
284     enddo
285     qps=(qps+convps)/(masseps+convmps)
286     do ij=ip1jm+1,ip1jmp1
287     q(ij,l)=qps
288     enddo
289    
290     !.-. fin ancienne version
291    
292     !._. nouvelle version
293     ! convpn=SSUM(iim,qbyv(1,l),1)
294     ! convmpn=ssum(iim,masse_adv_v(1,l),1)
295     ! oldmasse=ssum(iim,masse(1,l),1)
296     ! newmasse=oldmasse+convmpn
297     ! newq=(q(1,l)*oldmasse+convpn)/newmasse
298     ! newmasse=newmasse/apoln
299     ! DO ij = 1,iip1
300     ! q(ij,l)=newq
301     ! masse(ij,l)=newmasse*aire(ij)
302     ! ENDDO
303     ! convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
304     ! convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
305     ! oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
306     ! newmasse=oldmasse+convmps
307     ! newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
308     ! newmasse=newmasse/apols
309     ! DO ij = ip1jm+1,ip1jmp1
310     ! q(ij,l)=newq
311     ! masse(ij,l)=newmasse*aire(ij)
312     ! ENDDO
313     !._. fin nouvelle version
314     ENDDO
315    
316     RETURN
317     END

  ViewVC Help
Powered by ViewVC 1.1.21