Changeset 495 for LMDZ.3.3/branches/rel-LF/libf/phylmd/clouds_gno.F
- Timestamp:
- Mar 4, 2004, 4:11:16 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ.3.3/branches/rel-LF/libf/phylmd/clouds_gno.F
r418 r495 48 48 REAL xx(klon), aux(klon), coeff(klon), block(klon) 49 49 REAL dist(klon), fprime(klon), det(klon) 50 REAL pi, u(klon), v(klon), erf u(klon), erfv(klon)50 REAL pi, u(klon), v(klon), erfcu(klon), erfcv(klon) 51 51 REAL xx1(klon), xx2(klon) 52 52 real erf,kkk 53 real sqrtpi,sqrt2,zx1,zx2,exdel 53 54 c lconv = true si le calcul a converge (entre autre si qsub < min_q) 54 55 LOGICAL lconv(klon) … … 56 57 57 58 pi = ACOS(-1.) 59 sqrtpi=sqrt(pi) 60 sqrt2=sqrt(2.) 58 61 59 62 ptconv=.false. … … 123 126 xx(i) = -0.0001 124 127 else 125 xx1(i)=-SQRT(2.)*vmax(i)*(1.0-SQRT(1.0+delta(i)/(vmax(i)**2.))) 126 xx2(i)=-SQRT(2.)*vmax(i)*(1.0+SQRT(1.0+delta(i)/(vmax(i)**2.))) 128 zx1=-sqrt2*vmax(i) 129 zx2=SQRT(1.0+delta(i)/(vmax(i)**2.)) 130 xx1(i)=zx1*(1.0-zx2) 131 xx2(i)=zx1*(1.0+zx2) 127 132 xx(i) = 1.01 * xx1(i) 128 133 if ( xx1(i) .GE. 0.0 ) xx(i) = 0.5*xx2(i) … … 143 148 if (.not.lconv(i)) then 144 149 145 u(i) = delta(i)/(xx(i)*sqrt (2.)) + xx(i)/(2.*sqrt(2.))146 v(i) = delta(i)/(xx(i)*sqrt (2.)) - xx(i)/(2.*sqrt(2.))150 u(i) = delta(i)/(xx(i)*sqrt2) + xx(i)/(2.*sqrt2) 151 v(i) = delta(i)/(xx(i)*sqrt2) - xx(i)/(2.*sqrt2) 147 152 148 153 IF ( v(i) .GT. vmax(i) ) THEN … … 153 158 c -- use asymptotic expression of erf for u and v large: 154 159 c ( -> analytic solution for xx ) 155 156 aux(i) = 2.0*delta(i)*(1.- beta(i)*EXP(delta(i)))157 : /(1.+ beta(i)*EXP(delta(i)))160 exdel=beta(i)*EXP(delta(i)) 161 aux(i) = 2.0*delta(i)*(1.-exdel) 162 : /(1.+exdel) 158 163 if (aux(i).lt.0.) then 159 print*,'AUX(',i,',',k,')<0',aux(i),delta(i),beta(i)164 c print*,'AUX(',i,',',k,')<0',aux(i),delta(i),beta(i) 160 165 aux(i)=0. 161 166 endif 162 167 xx(i) = -SQRT(aux(i)) 163 block(i) = EXP(-v(i)*v(i)) / v(i) / SQRT(pi)168 block(i) = EXP(-v(i)*v(i)) / v(i) / sqrtpi 164 169 dist(i) = 0.0 165 170 fprime(i) = 1.0 … … 169 174 c -- erfv -> 1.0, use an asymptotic expression of erfv for v large: 170 175 171 erf u(i) =ERF(u(i))176 erfcu(i) = 1.0-ERF(u(i)) 172 177 c !!! ATTENTION : rajout d'un seuil pour l'exponentiel 173 aux(i) = SQRT(pi)*(1.0-erfu(i))*EXP(min(v(i)*v(i),100.))178 aux(i) = sqrtpi*erfcu(i)*EXP(min(v(i)*v(i),100.)) 174 179 coeff(i) = 1.0 - 1./2./(v(i)**2.) + 3./4./(v(i)**4.) 175 block(i) = coeff(i) * EXP(-v(i)*v(i)) / v(i) / SQRT(pi)180 block(i) = coeff(i) * EXP(-v(i)*v(i)) / v(i) / sqrtpi 176 181 dist(i) = v(i) * aux(i) / coeff(i) - beta(i) 177 182 fprime(i) = 2.0 / xx(i) * (v(i)**2.) … … 185 190 c -- general case: 186 191 187 erf u(i) =ERF(u(i))188 erf v(i) =ERF(v(i))189 block(i) = 1.0-erfv(i)190 dist(i) = (1.0 - erfu(i)) / (1.0 - erfv(i)) - beta(i)192 erfcu(i) = 1.0-ERF(u(i)) 193 erfcv(i) = 1.0-ERF(v(i)) 194 block(i) = erfcv(i) 195 dist(i) = erfcu(i) / erfcv(i) - beta(i) 191 196 zu2(i)=u(i)*u(i) 192 197 zv2(i)=v(i)*v(i) 193 198 if(zu2(i).gt.20..or. zv2(i).gt.20.) then 194 print*,'ATTENTION !!! xx(',i,') =', xx(i)195 print*,'ATTENTION !!! klon,ND,R,RS,QSUB,PTCONV,RATQSC,CLDF',196 .klon,ND,R(i,k),RS(i,k),QSUB(i,k),PTCONV(i,k),RATQSC(i,k),197 .CLDF(i,k)198 print*,'ATTENTION !!! zu2 zv2 =',zu2(i),zv2(i)199 c print*,'ATTENTION !!! xx(',i,') =', xx(i) 200 c print*,'ATTENTION !!! klon,ND,R,RS,QSUB,PTCONV,RATQSC,CLDF', 201 c .klon,ND,R(i,k),RS(i,k),QSUB(i,k),PTCONV(i,k),RATQSC(i,k), 202 c .CLDF(i,k) 203 c print*,'ATTENTION !!! zu2 zv2 =',zu2(i),zv2(i) 199 204 zu2(i)=20. 200 205 zv2(i)=20. 201 206 fprime(i) = 0. 202 207 else 203 fprime(i) = 2. / SQRT(pi) /xx(i) /(1.0-erfv(i))**2.204 : * ( (1.0-erfv(i))*v(i)*EXP(-zu2(i))205 : - (1.0-erfu(i))*u(i)*EXP(-zv2(i)) )208 fprime(i) = 2. /sqrtpi /xx(i) /erfcv(i)**2. 209 : * ( erfcv(i)*v(i)*EXP(-zu2(i)) 210 : - erfcu(i)*u(i)*EXP(-zv2(i)) ) 206 211 endif 207 212 ENDIF ! x … … 219 224 ratqsc(i,k)=sqrt(exp(ratqsc(i,k))-1.) 220 225 CLDF(i,K) = 0.5 * block(i) 221 cccccccccccccccccccccccc222 c kkk=-sqrt(log(1.+ratqsc(i,k)**2))223 c u(i)=delta(i)/(kkk*sqrt(2.))-kkk/(2.*sqrt(2.))224 c v(i)=delta(i)/(kkk*sqrt(2.))+kkk/(2.*sqrt(2.))225 c erfu(i)=erf(u(i))226 c erfv(i)=erf(v(i))227 c print*,'SIG ',k,qsub(i,k)228 c s ,mu(i)*((1.-erfv(i))/(1.-erfu(i))-qsat(i)/mu(i))229 c s ,0.5*erfu(i)230 cccccccccccccccccccccccc231 226 else 232 227 xx(i) = xx(i) - dist(i)/fprime(i)
Note: See TracChangeset
for help on using the changeset viewer.