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

Contents of /trunk/dyn3d/vlspltqs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 43 - (show annotations)
Fri Apr 8 12:43:31 2011 UTC (13 years, 1 month ago) by guez
Original Path: trunk/libf/dyn3d/vlspltqs.f90
File size: 4353 byte(s)
"start_init_phys" is now called directly by "etat0" instead of through
"start_init_dyn". "qsol_2d" is no longer a variable of module
"start_init_phys_m", it is an argument of
"start_init_phys". "start_init_dyn" now receives "tsol_2d" from
"etat0".

Split file "vlspltqs.f" into "vlspltqs.f90", "vlxqs.f90" and
""vlyqs.f90".

In "start_init_orog", replaced calls to "flin*" by calls to NetCDF95.

1 !
2 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/vlspltqs.F,v 1.2 2005/02/24 12:16:57 fairhead Exp $
3 !
4 SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt, &
5 p,pk,teta )
6 !
7 ! Auteurs: P.Le Van, F.Hourdin, F.Forget, F.Codron
8 !
9 ! ********************************************************************
10 ! Shema d'advection " pseudo amont " .
11 ! + test sur humidite specifique: Q advecte< Qsat aval
12 ! (F. Codron, 10/99)
13 ! ********************************************************************
14 ! q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg ....
15 !
16 ! pente_max facteur de limitation des pentes: 2 en general
17 ! 0 pour un schema amont
18 ! pbaru,pbarv,w flux de masse en u ,v ,w
19 ! pdt pas de temps
20 !
21 ! teta temperature potentielle, p pression aux interfaces,
22 ! pk exner au milieu des couches necessaire pour calculer Qsat
23 ! --------------------------------------------------------------------
24 use dimens_m
25 use paramet_m
26 use comconst
27 use comvert
28 use logic
29 IMPLICIT NONE
30 !
31
32 !
33 ! Arguments:
34 ! ----------
35 REAL masse(ip1jmp1,llm),pente_max
36 REAL, intent(in):: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
37 REAL q(ip1jmp1,llm)
38 REAL w(ip1jmp1,llm)
39 real, intent(in):: pdt
40 REAL, intent(in):: p(ip1jmp1,llmp1)
41 real teta(ip1jmp1,llm),pk(ip1jmp1,llm)
42 !
43 ! Local
44 ! ---------
45 !
46 INTEGER i,ij,l,j,ii
47 !
48 REAL qsat(ip1jmp1,llm)
49 REAL zm(ip1jmp1,llm)
50 REAL mu(ip1jmp1,llm)
51 REAL mv(ip1jm,llm)
52 REAL mw(ip1jmp1,llm+1)
53 REAL zq(ip1jmp1,llm)
54 REAL temps1,temps2,temps3
55 REAL zzpbar, zzw
56 LOGICAL testcpu
57 SAVE testcpu
58 SAVE temps1,temps2,temps3
59
60 REAL qmin,qmax
61 DATA qmin,qmax/0.,1.e33/
62 DATA testcpu/.false./
63 DATA temps1,temps2,temps3/0.,0.,0./
64
65 !--pour rapport de melange saturant--
66
67 REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
68 REAL ptarg,pdelarg,foeew,zdelta
69 REAL tempe(ip1jmp1)
70
71 ! fonction psat(T)
72
73 FOEEW ( PTARG,PDELARG ) = EXP ( &
74 (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT) &
75 / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
76
77 r2es = 380.11733
78 r3les = 17.269
79 r3ies = 21.875
80 r4les = 35.86
81 r4ies = 7.66
82 retv = 0.6077667
83 rtt = 273.16
84
85 !-- Calcul de Qsat en chaque point
86 !-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
87 ! pour eviter une exponentielle.
88 DO l = 1, llm
89 DO ij = 1, ip1jmp1
90 tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
91 ENDDO
92 DO ij = 1, ip1jmp1
93 zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
94 play = 0.5*(p(ij,l)+p(ij,l+1))
95 qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
96 qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
97 ENDDO
98 ENDDO
99
100 zzpbar = 0.5 * pdt
101 zzw = pdt
102 DO l=1,llm
103 DO ij = iip2,ip1jm
104 mu(ij,l)=pbaru(ij,l) * zzpbar
105 ENDDO
106 DO ij=1,ip1jm
107 mv(ij,l)=pbarv(ij,l) * zzpbar
108 ENDDO
109 DO ij=1,ip1jmp1
110 mw(ij,l)=w(ij,l) * zzw
111 ENDDO
112 ENDDO
113
114 DO ij=1,ip1jmp1
115 mw(ij,llm+1)=0.
116 ENDDO
117
118 CALL SCOPY(ijp1llm,q,1,zq,1)
119 CALL SCOPY(ijp1llm,masse,1,zm,1)
120
121 ! call minmaxq(zq,qmin,qmax,'avant vlxqs ')
122 call vlxqs(zq,pente_max,zm,mu,qsat)
123
124
125 ! call minmaxq(zq,qmin,qmax,'avant vlyqs ')
126
127 call vlyqs(zq,pente_max,zm,mv,qsat)
128
129
130 ! call minmaxq(zq,qmin,qmax,'avant vlz ')
131
132 call vlz(zq,pente_max,zm,mw)
133
134
135 ! call minmaxq(zq,qmin,qmax,'avant vlyqs ')
136 ! call minmaxq(zm,qmin,qmax,'M avant vlyqs ')
137
138 call vlyqs(zq,pente_max,zm,mv,qsat)
139
140
141 ! call minmaxq(zq,qmin,qmax,'avant vlxqs ')
142 ! call minmaxq(zm,qmin,qmax,'M avant vlxqs ')
143
144 call vlxqs(zq,pente_max,zm,mu,qsat)
145
146 ! call minmaxq(zq,qmin,qmax,'apres vlxqs ')
147 ! call minmaxq(zm,qmin,qmax,'M apres vlxqs ')
148
149
150 DO l=1,llm
151 DO ij=1,ip1jmp1
152 q(ij,l)=zq(ij,l)
153 ENDDO
154 DO ij=1,ip1jm+1,iip1
155 q(ij+iim,l)=q(ij,l)
156 ENDDO
157 ENDDO
158
159 RETURN
160 END

  ViewVC Help
Powered by ViewVC 1.1.21