Changeset 2056 for LMDZ5/branches/testing/libf/phylmd/cv3_routines.F90
- Timestamp:
- Jun 11, 2014, 3:46:46 PM (10 years ago)
- Location:
- LMDZ5/branches/testing
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/branches/testing
- Property svn:mergeinfo changed
/LMDZ5/trunk merged: 1998,2000-2023,2025-2029,2032,2034,2036-2049,2051-2055
- Property svn:mergeinfo changed
-
LMDZ5/branches/testing/libf/phylmd/cv3_routines.F90
r1999 r2056 7 7 IMPLICIT NONE 8 8 9 !------------------------------------------------------------10 !Set parameters for convectL for iflag_con = 311 !------------------------------------------------------------12 13 14 !*** PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE ***15 !*** PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO ***16 !*** PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. ***17 !*** EFFICIENCY IS ASSUMED TO BE UNITY ***18 !*** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT ***19 !*** SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE ***20 !*** OF CLOUD ***21 22 ![TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA]23 !*** ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF ***24 !*** APPROACH TO QUASI-EQUILIBRIUM ***25 !*** (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) ***26 !*** (BETA MUST BE LESS THAN OR EQUAL TO 1) ***27 28 !*** DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE ***29 !*** APPROACH TO QUASI-EQUILIBRIUM ***30 !*** IT MUST BE LESS THAN 0 ***9 !------------------------------------------------------------ 10 !Set parameters for convectL for iflag_con = 3 11 !------------------------------------------------------------ 12 13 14 !*** PBCRIT IS THE CRITICAL CLOUD DEPTH (MB) BENEATH WHICH THE *** 15 !*** PRECIPITATION EFFICIENCY IS ASSUMED TO BE ZERO *** 16 !*** PTCRIT IS THE CLOUD DEPTH (MB) ABOVE WHICH THE PRECIP. *** 17 !*** EFFICIENCY IS ASSUMED TO BE UNITY *** 18 !*** SIGD IS THE FRACTIONAL AREA COVERED BY UNSATURATED DNDRAFT *** 19 !*** SPFAC IS THE FRACTION OF PRECIPITATION FALLING OUTSIDE *** 20 !*** OF CLOUD *** 21 22 ![TAU: CHARACTERISTIC TIMESCALE USED TO COMPUTE ALPHA & BETA] 23 !*** ALPHA AND BETA ARE PARAMETERS THAT CONTROL THE RATE OF *** 24 !*** APPROACH TO QUASI-EQUILIBRIUM *** 25 !*** (THEIR STANDARD VALUES ARE 1.0 AND 0.96, RESPECTIVELY) *** 26 !*** (BETA MUST BE LESS THAN OR EQUAL TO 1) *** 27 28 !*** DTCRIT IS THE CRITICAL BUOYANCY (K) USED TO ADJUST THE *** 29 !*** APPROACH TO QUASI-EQUILIBRIUM *** 30 !*** IT MUST BE LESS THAN 0 *** 31 31 32 32 include "cv3param.h" … … 41 41 42 42 LOGICAL, SAVE :: first = .TRUE. 43 44 45 !noff: integer limit for convection (nd-noff)46 47 48 43 !$OMP THREADPRIVATE(first) 44 45 !glb noff: integer limit for convection (nd-noff) 46 ! minorig: First level of convection 47 48 ! -- limit levels for convection: 49 49 50 50 noff = 1 … … 56 56 IF (first) THEN 57 57 58 58 ! -- "microphysical" parameters: 59 59 sigdz = 0.01 60 60 spfac = 0.15 61 61 pbcrit = 150.0 62 62 ptcrit = 500.0 63 63 ! IM beg: ajout fis. reglage ep 64 64 flag_epkeorig = 1 65 65 elcrit = 0.0003 66 66 tlcrit = -55.0 67 67 ! IM lu dans physiq.def via conf_phys.F90 epmax = 0.993 68 68 69 69 omtrain = 45.0 ! used also for snow (no disctinction rain/snow) 70 70 71 71 ! -- misc: 72 72 73 73 dtovsh = -0.2 ! dT for overshoot 74 74 dpbase = -40. ! definition cloud base (400m above LCL) 75 75 ! cc dttrig = 5. ! (loose) condition for triggering 76 76 dttrig = 10. ! (loose) condition for triggering 77 77 flag_wb = 1 78 78 wbmax = 6. ! (m/s) adiab updraught speed at LFC (used in cv3p1_closure) 79 79 80 80 ! -- rate of approach to quasi-equilibrium: 81 81 82 82 dtcrit = -2.0 83 83 tau = 8000. 84 84 85 85 ! -- interface cloud parameterization: 86 86 87 87 delta = 0.01 ! cld 88 88 89 89 ! -- interface with boundary-layer (gust factor): (sb) 90 90 91 91 betad = 10.0 ! original value (from convect 4.3) 92 92 93 OPEN (99, FILE='conv_param.data', STATUS='old', FORM='formatted', & 94 ERR=9999) 93 OPEN (99, FILE='conv_param.data', STATUS='old', FORM='formatted', ERR=9999) 95 94 READ (99, *, END=9998) dpbase 96 95 READ (99, *, END=9998) pbcrit … … 113 112 WRITE (*, *) 'wbmax =', wbmax 114 113 115 114 ! IM Lecture du fichier ep_param.data 116 115 OPEN (79, FILE='ep_param.data', STATUS='old', FORM='formatted', ERR=7999) 117 116 READ (79, *, END=7998) flag_epkeorig … … 124 123 WRITE (*, *) 'elcrit=', elcrit 125 124 WRITE (*, *) 'tlcrit=', tlcrit 126 125 ! IM end: ajout fis. reglage ep 127 126 128 127 first = .FALSE. 129 END IF 130 128 129 END IF ! (first) 130 131 ! print*,'tau=',tau 131 132 beta = 1.0 - delt/tau 132 133 alpha1 = 1.5E-3 133 ! jygCorrection bug alpha134 !JYG Correction bug alpha 134 135 alpha1 = alpha1*1.5 135 136 alpha = alpha1*delt/tau 136 ! jygBug137 138 137 !JYG Bug 138 ! cc increase alpha to compensate W decrease: 139 ! c alpha = alpha*1.5 139 140 140 141 RETURN 141 142 END SUBROUTINE cv3_param 142 143 143 SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, lv, lf, cpn, tv, gz, h, hm,&144 th)144 SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, & 145 lv, lf, cpn, tv, gz, h, hm, th) 145 146 IMPLICIT NONE 146 147 147 148 149 150 151 152 153 148 ! ===================================================================== 149 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY 150 ! "ori": from convect4.3 (vectorized) 151 ! "convect3": to be exactly consistent with convect3 152 ! ===================================================================== 153 154 ! inputs: 154 155 INTEGER len, nd, ndp1 155 156 REAL t(len, nd), q(len, nd), p(len, nd), ph(len, ndp1) 156 157 157 158 ! outputs: 158 159 REAL lv(len, nd), lf(len, nd), cpn(len, nd), tv(len, nd) 159 160 REAL gz(len, nd), h(len, nd), hm(len, nd) 160 161 REAL th(len, nd) 161 162 162 163 ! local variables: 163 164 INTEGER k, i 164 165 REAL rdcp … … 170 171 171 172 172 173 173 ! ori do 110 k=1,nlp 174 ! abderr do 110 k=1,nl ! convect3 174 175 DO k = 1, nlp 175 176 176 177 DO i = 1, len 177 178 ! debug lv(i,k)= lv0-clmcpv*(t(i,k)-t0) 178 179 lv(i, k) = lv0 - clmcpv*(t(i,k)-273.15) 179 180 lf(i, k) = lf0 - clmci*(t(i,k)-273.15) 180 181 cpn(i, k) = cpd*(1.0-q(i,k)) + cpv*q(i, k) 181 182 cpx(i, k) = cpd*(1.0-q(i,k)) + cl*q(i, k) 182 183 ! ori tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1) 183 184 tv(i, k) = t(i, k)*(1.0+q(i,k)/eps-q(i,k)) 184 185 rdcp = (rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i, k) … … 187 188 END DO 188 189 189 190 ! gz = phi at the full levels (same as p). 190 191 191 192 DO i = 1, len 192 193 gz(i, 1) = 0.0 193 194 END DO 194 195 ! ori do 140 k=2,nlp 195 196 DO k = 2, nl ! convect3 196 197 DO i = 1, len 197 tvx = t(i, k)*(1.+q(i,k)/eps-q(i,k)) !convect3198 tvy = t(i, k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3199 gz(i, k) = gz(i, k-1) + 0.5*rrd*(tvx+tvy) & !convect3200 *(p(i,k-1)-p(i,k))/ph(i, k)!convect3201 202 203 204 205 206 END DO 207 END DO 208 209 210 211 212 198 tvx = t(i, k)*(1.+q(i,k)/eps-q(i,k)) !convect3 199 tvy = t(i, k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3 200 gz(i, k) = gz(i, k-1) + 0.5*rrd*(tvx+tvy)* & !convect3 201 (p(i,k-1)-p(i,k))/ph(i, k) !convect3 202 203 ! c print *,' gz(',k,')',gz(i,k),' tvx',tvx,' tvy ',tvy 204 205 ! ori gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k)) 206 ! ori & *(p(i,k-1)-p(i,k))/ph(i,k) 207 END DO 208 END DO 209 210 ! h = phi + cpT (dry static energy). 211 ! hm = phi + cp(T-Tbase)+Lq 212 213 ! ori do 170 k=1,nlp 213 214 DO k = 1, nl ! convect3 214 215 DO i = 1, len … … 221 222 END SUBROUTINE cv3_prelim 222 223 223 SUBROUTINE cv3_feed(len, nd, t, q, u, v, p, ph, hm, gz, p1feed, p2feed, wght, & 224 wghti, tnk, thnk, qnk, qsnk, unk, vnk, cpnk, hnk, nk, icb, icbmax, iflag, & 225 gznk, plcl) 224 SUBROUTINE cv3_feed(len, nd, ok_conserv_q, & 225 t, q, u, v, p, ph, hm, gz, & 226 p1feed, p2feed, wght, & 227 wghti, tnk, thnk, qnk, qsnk, unk, vnk, & 228 cpnk, hnk, nk, icb, icbmax, iflag, gznk, plcl) 226 229 IMPLICIT NONE 227 230 228 229 230 231 232 233 234 235 236 237 238 239 240 231 ! ================================================================ 232 ! Purpose: CONVECTIVE FEED 233 234 ! Main differences with cv_feed: 235 ! - ph added in input 236 ! - here, nk(i)=minorig 237 ! - icb defined differently (plcl compared with ph instead of p) 238 239 ! Main differences with convect3: 240 ! - we do not compute dplcldt and dplcldr of CLIFT anymore 241 ! - values iflag different (but tests identical) 242 ! - A,B explicitely defined (!...) 243 ! ================================================================ 241 244 242 245 include "cv3param.h" 243 246 include "cvthermo.h" 244 247 245 !inputs:248 !inputs: 246 249 INTEGER len, nd 250 LOGICAL ok_conserv_q 247 251 REAL t(len, nd), q(len, nd), p(len, nd) 248 252 REAL u(len, nd), v(len, nd) … … 250 254 REAL ph(len, nd+1) 251 255 REAL p1feed(len) 252 256 ! , wght(len) 253 257 REAL wght(nd) 254 !input-output258 !input-output 255 259 REAL p2feed(len) 256 !outputs:260 !outputs: 257 261 INTEGER iflag(len), nk(len), icb(len), icbmax 258 !real wghti(len)262 ! real wghti(len) 259 263 REAL wghti(len, nd) 260 264 REAL tnk(len), thnk(len), qnk(len), qsnk(len) … … 263 267 REAL plcl(len) 264 268 265 !local variables:269 !local variables: 266 270 INTEGER i, k, iter, niter 267 271 INTEGER ihmin(len) … … 269 273 REAL pup(len), plo(len), pfeed(len) 270 274 REAL plclup(len), plcllo(len), plclfeed(len) 275 REAL pfeedmin(len) 271 276 REAL posit(len) 272 277 LOGICAL nocond(len) 273 278 274 ! ------------------------------------------------------------------- 275 ! --- Origin level of ascending parcels for convect3: 276 ! ------------------------------------------------------------------- 279 !jyg20140217< 280 INTEGER iostat 281 LOGICAL, SAVE :: first 282 LOGICAL, SAVE :: ok_new_feed 283 REAL, SAVE :: dp_lcl_feed 284 !$OMP THREADPRIVATE (first,ok_new_feed,dp_lcl_feed) 285 DATA first/.TRUE./ 286 DATA dp_lcl_feed/2./ 287 288 IF (first) THEN 289 !$OMP MASTER 290 ok_new_feed = ok_conserv_q 291 OPEN (98, FILE='cv3feed_param.data', STATUS='old', FORM='formatted', IOSTAT=iostat) 292 IF (iostat==0) THEN 293 READ (98, *, END=998) ok_new_feed 294 998 CONTINUE 295 CLOSE (98) 296 END IF 297 PRINT *, ' ok_new_feed: ', ok_new_feed 298 first = .FALSE. 299 !$OMP END MASTER 300 END IF 301 !jyg> 302 ! ------------------------------------------------------------------- 303 ! --- Origin level of ascending parcels for convect3: 304 ! ------------------------------------------------------------------- 277 305 278 306 DO i = 1, len … … 281 309 END DO 282 310 283 284 285 286 287 288 289 290 291 292 ! 1.a- LCL associated top2feed311 ! ------------------------------------------------------------------- 312 ! --- Adjust feeding layer thickness so that lifting up to the top of 313 ! --- the feeding layer does not induce condensation (i.e. so that 314 ! --- plcl < p2feed). 315 ! --- Method : iterative secant method. 316 ! ------------------------------------------------------------------- 317 318 ! 1- First bracketing of the solution : ph(nk+1), p2feed 319 320 ! 1.a- LCL associated with p2feed 293 321 DO i = 1, len 294 322 pup(i) = p2feed(i) 295 323 END DO 296 CALL cv3_vertmix(len, nd, iflag, p1feed, pup, p, ph, t, q, u, v, wght, & 297 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclup) 298 ! 1.b- LCL associated to ph(nk+1) 324 CALL cv3_vertmix(len, nd, iflag, p1feed, pup, p, ph, & 325 t, q, u, v, wght, & 326 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclup) 327 ! 1.b- LCL associated with ph(nk+1) 299 328 DO i = 1, len 300 329 plo(i) = ph(i, nk(i)+1) 301 330 END DO 302 CALL cv3_vertmix(len, nd, iflag, p1feed, plo, p, ph, t, q, u, v, wght, & 303 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo) 304 ! 2- Iterations 331 CALL cv3_vertmix(len, nd, iflag, p1feed, plo, p, ph, & 332 t, q, u, v, wght, & 333 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plcllo) 334 ! 2- Iterations 305 335 niter = 5 306 336 DO iter = 1, niter … … 314 344 pfeed(i) = pup(i) 315 345 ELSE 316 pfeed(i) = (pup(i)*(plo(i)-plcllo(i))+plo(i)*(plclup(i)-pup(i)))/ & 317 (plo(i)-plcllo(i)+plclup(i)-pup(i)) 346 !JYG20140217< 347 IF (ok_new_feed) THEN 348 pfeed(i) = (pup(i)*(plo(i)-plcllo(i)-dp_lcl_feed)+ & 349 plo(i)*(plclup(i)-pup(i)+dp_lcl_feed))/ & 350 (plo(i)-plcllo(i)+plclup(i)-pup(i)) 351 ELSE 352 pfeed(i) = (pup(i)*(plo(i)-plcllo(i))+ & 353 plo(i)*(plclup(i)-pup(i)))/ & 354 (plo(i)-plcllo(i)+plclup(i)-pup(i)) 355 END IF 356 !JYG> 318 357 END IF 319 358 END DO 320 CALL cv3_vertmix(len, nd, iflag, p1feed, pfeed, p, ph, t, q, u, v, wght, & 321 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed) 359 !jyg20140217< 360 ! For the last iteration, make sure that the top of the feeding layer 361 ! and LCL are not in the same layer: 362 IF (ok_new_feed) THEN 363 IF (iter==niter) THEN 364 DO k = minorig, nd 365 DO i = 1, len 366 IF (ph(i,k)>=plclfeed(i)) pfeedmin(i) = ph(i, k) 367 END DO 368 END DO 369 DO i = 1, len 370 pfeed(i) = max(pfeedmin(i), pfeed(i)) 371 END DO 372 END IF 373 END IF 374 !jyg> 375 376 CALL cv3_vertmix(len, nd, iflag, p1feed, pfeed, p, ph, & 377 t, q, u, v, wght, & 378 wghti, nk, tnk, thnk, qnk, qsnk, unk, vnk, plclfeed) 379 !jyg20140217< 380 IF (ok_new_feed) THEN 381 DO i = 1, len 382 posit(i) = (sign(1.,plclfeed(i)-pfeed(i)+dp_lcl_feed)+1.)*0.5 383 IF (plclfeed(i)-pfeed(i)+dp_lcl_feed==0.) posit(i) = 1. 384 END DO 385 ELSE 386 DO i = 1, len 387 posit(i) = (sign(1.,plclfeed(i)-pfeed(i))+1.)*0.5 388 IF (plclfeed(i)==pfeed(i)) posit(i) = 1. 389 END DO 390 END IF 391 !jyg> 322 392 DO i = 1, len 323 posit(i) = (sign(1.,plclfeed(i)-pfeed(i))+1.)*0.5 324 IF (plclfeed(i)==pfeed(i)) posit(i) = 1. 325 ! - posit = 1 when lcl is below top of feeding layer (plclfeed>pfeed) 326 ! - => pup=pfeed 327 ! - posit = 0 when lcl is above top of feeding layer (plclfeed<pfeed) 328 ! - => plo=pfeed 393 ! - posit = 1 when lcl is below top of feeding layer (plclfeed>pfeed) 394 ! - => pup=pfeed 395 ! - posit = 0 when lcl is above top of feeding layer (plclfeed<pfeed) 396 ! - => plo=pfeed 329 397 pup(i) = posit(i)*pfeed(i) + (1.-posit(i))*pup(i) 330 398 plo(i) = (1.-posit(i))*pfeed(i) + posit(i)*plo(i) … … 343 411 END DO 344 412 345 346 347 348 413 ! ------------------------------------------------------------------- 414 ! --- Check whether parcel level temperature and specific humidity 415 ! --- are reasonable 416 ! ------------------------------------------------------------------- 349 417 DO i = 1, len 350 418 IF (((tnk(i)<250.0) .OR. (qnk(i)<=0.0)) .AND. (iflag(i)==0)) iflag(i) = 7 351 419 END DO 352 420 353 354 355 356 357 !@ do 270 i=1,len358 !@ icb(i)=nlm359 !@ 270 continue360 !@c361 !@ do 290 k=minorig,nl362 !@ do 280 i=1,len363 !@ if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i)))364 !@ & icb(i)=min(icb(i),k)365 !@ 280 continue366 !@ 290 continue367 !@c368 !@ do 300 i=1,len369 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9370 !@ 300 continue421 ! ------------------------------------------------------------------- 422 ! --- Calculate first level above lcl (=icb) 423 ! ------------------------------------------------------------------- 424 425 !@ do 270 i=1,len 426 !@ icb(i)=nlm 427 !@ 270 continue 428 !@c 429 !@ do 290 k=minorig,nl 430 !@ do 280 i=1,len 431 !@ if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i))) 432 !@ & icb(i)=min(icb(i),k) 433 !@ 280 continue 434 !@ 290 continue 435 !@c 436 !@ do 300 i=1,len 437 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9 438 !@ 300 continue 371 439 372 440 DO i = 1, len … … 374 442 END DO 375 443 376 377 378 !@ do 290 k=minorig,nl444 ! la modification consiste a comparer plcl a ph et non a p: 445 ! icb est defini par : ph(icb)<plcl<ph(icb-1) 446 !@ do 290 k=minorig,nl 379 447 DO k = 3, nl - 1 ! modif pour que icb soit sup/egal a 2 380 448 DO i = 1, len … … 384 452 385 453 386 387 388 454 ! print*,'icb dans cv3_feed ' 455 ! write(*,'(64i2)') icb(2:len-1) 456 ! call dump2d(64,43,'plcl dans cv3_feed ',plcl(2:len-1)) 389 457 390 458 DO i = 1, len 391 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9459 !@ if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9 392 460 IF ((icb(i)==nlm) .AND. (iflag(i)==0)) iflag(i) = 9 393 461 END DO … … 397 465 END DO 398 466 399 467 ! Compute icbmax. 400 468 401 469 icbmax = 2 402 470 DO i = 1, len 403 !! icbmax=max(icbmax,icb(i))404 IF (iflag(i)<7) icbmax = max(icbmax, icb(i)) ! sb Jun7th02471 !! icbmax=max(icbmax,icb(i)) 472 IF (iflag(i)<7) icbmax = max(icbmax, icb(i)) ! sb Jun7th02 405 473 END DO 406 474 … … 409 477 410 478 SUBROUTINE cv3_undilute1(len, nd, t, qs, gz, plcl, p, icb, tnk, qnk, gznk, & 411 tp, tvp, clw, icbs)479 tp, tvp, clw, icbs) 412 480 IMPLICIT NONE 413 481 414 415 416 417 418 !- specify plcl in input419 !- icbs is the first level above LCL (may differ from icb)420 !- in the iterations, used x(icbs) instead x(icb)421 !- many minor differences in the iterations422 !- tvp is computed in only one time423 !- icbs: first level above Plcl (IMIN de TLIFT) in output424 !- if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1)425 482 ! ---------------------------------------------------------------- 483 ! Equivalent de TLIFT entre NK et ICB+1 inclus 484 485 ! Differences with convect4: 486 ! - specify plcl in input 487 ! - icbs is the first level above LCL (may differ from icb) 488 ! - in the iterations, used x(icbs) instead x(icb) 489 ! - many minor differences in the iterations 490 ! - tvp is computed in only one time 491 ! - icbs: first level above Plcl (IMIN de TLIFT) in output 492 ! - if icbs=icb, compute also tp(icb+1),tvp(icb+1) & clw(icb+1) 493 ! ---------------------------------------------------------------- 426 494 427 495 include "cvthermo.h" 428 496 include "cv3param.h" 429 497 430 498 ! inputs: 431 499 INTEGER len, nd 432 500 INTEGER icb(len) … … 436 504 REAL plcl(len) ! convect3 437 505 438 506 ! outputs: 439 507 REAL tp(len, nd), tvp(len, nd), clw(len, nd) 440 508 441 509 ! local variables: 442 510 INTEGER i, k 443 511 INTEGER icb1(len), icbs(len), icbsmax2 ! convect3 … … 448 516 REAL cpinv(len) ! convect3 449 517 450 451 452 453 454 !cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.455 456 457 458 518 ! ------------------------------------------------------------------- 519 ! --- Calculates the lifted parcel virtual temperature at nk, 520 ! --- the actual temperature, and the adiabatic 521 ! --- liquid water content. The procedure is to solve the equation. 522 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 523 ! ------------------------------------------------------------------- 524 525 526 ! *** Calculate certain parcel quantities, including static energy *** 459 527 460 528 DO i = 1, len 461 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)- & 462 273.15)) + gznk(i) 529 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) + qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i) 463 530 cpp(i) = cpd*(1.-qnk(i)) + qnk(i)*cpv 464 531 cpinv(i) = 1./cpp(i) 465 532 END DO 466 533 467 ! *** Calculate lifted parcel quantities below cloud base *** 534 ! *** Calculate lifted parcel quantities below cloud base *** 535 536 DO i = 1, len !convect3 537 icb1(i) = max(icb(i), 2) !convect3 538 icb1(i) = min(icb(i), nl) !convect3 539 ! if icb is below LCL, start loop at ICB+1: 540 ! (icbs est le premier niveau au-dessus du LCL) 541 icbs(i) = icb1(i) !convect3 542 IF (plcl(i)<p(i,icb1(i))) THEN 543 icbs(i) = min(icbs(i)+1, nl) !convect3 544 END IF 545 END DO !convect3 468 546 469 547 DO i = 1, len !convect3 470 icb1(i) = max(icb(i), 2) !convect3 471 icb1(i) = min(icb(i), nl) !convect3 472 ! if icb is below LCL, start loop at ICB+1: 473 ! (icbs est le premier niveau au-dessus du LCL) 474 icbs(i) = icb1(i) !convect3 475 IF (plcl(i)<p(i,icb1(i))) THEN 476 icbs(i) = min(icbs(i)+1, nl) !convect3 477 END IF 548 ticb(i) = t(i, icbs(i)) !convect3 549 gzicb(i) = gz(i, icbs(i)) !convect3 550 qsicb(i) = qs(i, icbs(i)) !convect3 478 551 END DO !convect3 479 552 480 DO i = 1, len !convect3 481 ticb(i) = t(i, icbs(i)) !convect3 482 gzicb(i) = gz(i, icbs(i)) !convect3 483 qsicb(i) = qs(i, icbs(i)) !convect3 484 END DO !convect3 485 486 487 ! Re-compute icbsmax (icbsmax2): !convect3 488 ! !convect3 489 icbsmax2 = 2 !convect3 490 DO i = 1, len !convect3 491 icbsmax2 = max(icbsmax2, icbs(i)) !convect3 492 END DO !convect3 493 494 ! initialization outputs: 495 496 DO k = 1, icbsmax2 ! convect3 497 DO i = 1, len ! convect3 498 tp(i, k) = 0.0 ! convect3 499 tvp(i, k) = 0.0 ! convect3 500 clw(i, k) = 0.0 ! convect3 501 END DO ! convect3 502 END DO ! convect3 503 504 ! tp and tvp below cloud base: 553 554 ! Re-compute icbsmax (icbsmax2): !convect3 555 ! !convect3 556 icbsmax2 = 2 !convect3 557 DO i = 1, len !convect3 558 icbsmax2 = max(icbsmax2, icbs(i)) !convect3 559 END DO !convect3 560 561 ! initialization outputs: 562 563 DO k = 1, icbsmax2 ! convect3 564 DO i = 1, len ! convect3 565 tp(i, k) = 0.0 ! convect3 566 tvp(i, k) = 0.0 ! convect3 567 clw(i, k) = 0.0 ! convect3 568 END DO ! convect3 569 END DO ! convect3 570 571 ! tp and tvp below cloud base: 505 572 506 573 DO k = minorig, icbsmax2 - 1 507 574 DO i = 1, len 508 575 tp(i, k) = tnk(i) - (gz(i,k)-gznk(i))*cpinv(i) 509 tvp(i, k) = tp(i, k)*(1.+qnk(i)/eps-qnk(i)) !whole thing (convect3)510 END DO 511 END DO 512 513 576 tvp(i, k) = tp(i, k)*(1.+qnk(i)/eps-qnk(i)) !whole thing (convect3) 577 END DO 578 END DO 579 580 ! *** Find lifted parcel quantities above cloud base *** 514 581 515 582 DO i = 1, len 516 583 tg = ticb(i) 517 584 ! ori qg=qs(i,icb(i)) 518 585 qg = qsicb(i) ! convect3 519 586 ! debug alv=lv0-clmcpv*(ticb(i)-t0) 520 587 alv = lv0 - clmcpv*(ticb(i)-273.15) 521 588 522 523 524 525 s = cpd*(1.-qnk(i)) + cl*qnk(i) &! convect3526 +alv*alv*qg/(rrv*ticb(i)*ticb(i))! convect3589 ! First iteration. 590 591 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 592 s = cpd*(1.-qnk(i)) + cl*qnk(i) + & ! convect3 593 alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3 527 594 s = 1./s 528 595 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 529 596 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 530 597 tg = tg + s*(ah0(i)-ahg) 531 532 598 ! ori tg=max(tg,35.0) 599 ! debug tc=tg-t0 533 600 tc = tg - 273.15 534 601 denom = 243.5 + tc 535 602 denom = max(denom, 1.0) ! convect3 536 603 ! ori if(tc.ge.0.0)then 537 604 es = 6.112*exp(17.67*tc/denom) 538 539 540 541 605 ! ori else 606 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 607 ! ori endif 608 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 542 609 qg = eps*es/(p(i,icbs(i))-es*(1.-eps)) 543 610 544 545 546 547 548 549 611 ! Second iteration. 612 613 614 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 615 ! ori s=1./s 616 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 550 617 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 551 618 tg = tg + s*(ah0(i)-ahg) 552 553 619 ! ori tg=max(tg,35.0) 620 ! debug tc=tg-t0 554 621 tc = tg - 273.15 555 622 denom = 243.5 + tc 556 denom = max(denom, 1.0) ! convect3557 623 denom = max(denom, 1.0) ! convect3 624 ! ori if(tc.ge.0.0)then 558 625 es = 6.112*exp(17.67*tc/denom) 559 560 561 562 626 ! ori else 627 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 628 ! ori end if 629 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 563 630 qg = eps*es/(p(i,icbs(i))-es*(1.-eps)) 564 631 565 632 alv = lv0 - clmcpv*(ticb(i)-273.15) 566 633 567 568 569 570 571 634 ! ori c approximation here: 635 ! ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i) 636 ! ori & -gz(i,icb(i))-alv*qg)/cpd 637 638 ! convect3: no approximation: 572 639 tp(i, icbs(i)) = (ah0(i)-gz(i,icbs(i))-alv*qg)/(cpd+(cl-cpd)*qnk(i)) 573 640 574 575 641 ! ori clw(i,icb(i))=qnk(i)-qg 642 ! ori clw(i,icb(i))=max(0.0,clw(i,icb(i))) 576 643 clw(i, icbs(i)) = qnk(i) - qg 577 644 clw(i, icbs(i)) = max(0.0, clw(i,icbs(i))) 578 645 579 646 rg = qg/(1.-qnk(i)) 580 581 582 tvp(i, icbs(i)) = tp(i, icbs(i))*(1.+qg/eps-qnk(i)) !whole thing583 584 END DO 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 647 ! ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi) 648 ! convect3: (qg utilise au lieu du vrai mixing ratio rg) 649 tvp(i, icbs(i)) = tp(i, icbs(i))*(1.+qg/eps-qnk(i)) !whole thing 650 651 END DO 652 653 ! ori do 380 k=minorig,icbsmax2 654 ! ori do 370 i=1,len 655 ! ori tvp(i,k)=tvp(i,k)-tp(i,k)*qnk(i) 656 ! ori 370 continue 657 ! ori 380 continue 658 659 660 ! -- The following is only for convect3: 661 662 ! * icbs is the first level above the LCL: 663 ! if plcl<p(icb), then icbs=icb+1 664 ! if plcl>p(icb), then icbs=icb 665 666 ! * the routine above computes tvp from minorig to icbs (included). 667 668 ! * to compute buoybase (in cv3_trigger.F), both tvp(icb) and tvp(icb+1) 669 ! must be known. This is the case if icbs=icb+1, but not if icbs=icb. 670 671 ! * therefore, in the case icbs=icb, we compute tvp at level icb+1 672 ! (tvp at other levels will be computed in cv3_undilute2.F) 606 673 607 674 … … 615 682 tg = ticb(i) 616 683 qg = qsicb(i) ! convect3 617 684 ! debug alv=lv0-clmcpv*(ticb(i)-t0) 618 685 alv = lv0 - clmcpv*(ticb(i)-273.15) 619 686 620 621 622 623 s = cpd*(1.-qnk(i)) + cl*qnk(i) & ! convect3624 +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3687 ! First iteration. 688 689 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 690 s = cpd*(1.-qnk(i)) + cl*qnk(i) & ! convect3 691 +alv*alv*qg/(rrv*ticb(i)*ticb(i)) ! convect3 625 692 s = 1./s 626 627 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3693 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 694 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 628 695 tg = tg + s*(ah0(i)-ahg) 629 630 696 ! ori tg=max(tg,35.0) 697 ! debug tc=tg-t0 631 698 tc = tg - 273.15 632 699 denom = 243.5 + tc 633 denom = max(denom, 1.0) ! convect3634 700 denom = max(denom, 1.0) ! convect3 701 ! ori if(tc.ge.0.0)then 635 702 es = 6.112*exp(17.67*tc/denom) 636 637 638 639 703 ! ori else 704 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 705 ! ori endif 706 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 640 707 qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps)) 641 708 642 643 644 645 646 647 648 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3709 ! Second iteration. 710 711 712 ! ori s=cpd+alv*alv*qg/(rrv*ticb(i)*ticb(i)) 713 ! ori s=1./s 714 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*ticb(i)+alv*qg+gzicb(i) 715 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gzicb(i) ! convect3 649 716 tg = tg + s*(ah0(i)-ahg) 650 651 717 ! ori tg=max(tg,35.0) 718 ! debug tc=tg-t0 652 719 tc = tg - 273.15 653 720 denom = 243.5 + tc 654 denom = max(denom, 1.0) ! convect3655 721 denom = max(denom, 1.0) ! convect3 722 ! ori if(tc.ge.0.0)then 656 723 es = 6.112*exp(17.67*tc/denom) 657 658 659 660 724 ! ori else 725 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 726 ! ori end if 727 ! ori qg=eps*es/(p(i,icb(i))-es*(1.-eps)) 661 728 qg = eps*es/(p(i,icb(i)+1)-es*(1.-eps)) 662 729 663 730 alv = lv0 - clmcpv*(ticb(i)-273.15) 664 731 665 666 667 668 669 732 ! ori c approximation here: 733 ! ori tp(i,icb(i))=(ah0(i)-(cl-cpd)*qnk(i)*ticb(i) 734 ! ori & -gz(i,icb(i))-alv*qg)/cpd 735 736 ! convect3: no approximation: 670 737 tp(i, icb(i)+1) = (ah0(i)-gz(i,icb(i)+1)-alv*qg)/(cpd+(cl-cpd)*qnk(i)) 671 738 672 673 739 ! ori clw(i,icb(i))=qnk(i)-qg 740 ! ori clw(i,icb(i))=max(0.0,clw(i,icb(i))) 674 741 clw(i, icb(i)+1) = qnk(i) - qg 675 742 clw(i, icb(i)+1) = max(0.0, clw(i,icb(i)+1)) 676 743 677 744 rg = qg/(1.-qnk(i)) 678 679 680 tvp(i, icb(i)+1) = tp(i, icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing745 ! ori tvp(i,icb(i))=tp(i,icb(i))*(1.+rg*epsi) 746 ! convect3: (qg utilise au lieu du vrai mixing ratio rg) 747 tvp(i, icb(i)+1) = tp(i, icb(i)+1)*(1.+qg/eps-qnk(i)) !whole thing 681 748 682 749 END DO … … 685 752 END SUBROUTINE cv3_undilute1 686 753 687 SUBROUTINE cv3_trigger(len, nd, icb, plcl, p, th, tv, tvp, thnk, pbase,&688 buoybase, iflag, sig, w0)754 SUBROUTINE cv3_trigger(len, nd, icb, plcl, p, th, tv, tvp, thnk, & 755 pbase, buoybase, iflag, sig, w0) 689 756 IMPLICIT NONE 690 757 691 692 693 694 695 696 697 698 699 700 701 702 703 704 758 ! ------------------------------------------------------------------- 759 ! --- TRIGGERING 760 761 ! - computes the cloud base 762 ! - triggering (crude in this version) 763 ! - relaxation of sig and w0 when no convection 764 765 ! Caution1: if no convection, we set iflag=4 766 ! (it used to be 0 in convect3) 767 768 ! Caution2: at this stage, tvp (and thus buoy) are know up 769 ! through icb only! 770 ! -> the buoyancy below cloud base not (yet) set to the cloud base buoyancy 771 ! ------------------------------------------------------------------- 705 772 706 773 include "cv3param.h" 707 774 708 775 ! input: 709 776 INTEGER len, nd 710 777 INTEGER icb(len) … … 713 780 REAL thnk(len) 714 781 715 782 ! output: 716 783 REAL pbase(len), buoybase(len) 717 784 718 785 ! input AND output: 719 786 INTEGER iflag(len) 720 787 REAL sig(len, nd), w0(len, nd) 721 788 722 789 ! local variables: 723 790 INTEGER i, k 724 791 REAL tvpbase, tvbase, tdif, ath, ath1 725 792 726 793 727 794 ! *** set cloud base buoyancy at (plcl+dpbase) level buoyancy 728 795 729 796 DO i = 1, len 730 797 pbase(i) = plcl(i) + dpbase 731 tvpbase = tvp(i, icb(i))*(pbase(i)-p(i,icb(i)+1))/ & 732 (p(i,icb(i))-p(i,icb(i)+1)) + tvp(i, icb(i)+1)*(p(i,icb(i))-pbase(i))/( & 733 p(i,icb(i))-p(i,icb(i)+1)) 734 tvbase = tv(i, icb(i))*(pbase(i)-p(i,icb(i)+1))/ & 735 (p(i,icb(i))-p(i,icb(i)+1)) + tv(i, icb(i)+1)*(p(i,icb(i))-pbase(i))/(p & 736 (i,icb(i))-p(i,icb(i)+1)) 798 tvpbase = tvp(i, icb(i)) *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + & 799 tvp(i, icb(i)+1)*(p(i,icb(i))-pbase(i)) /(p(i,icb(i))-p(i,icb(i)+1)) 800 tvbase = tv(i, icb(i)) *(pbase(i)-p(i,icb(i)+1))/(p(i,icb(i))-p(i,icb(i)+1)) + & 801 tv(i, icb(i)+1)*(p(i,icb(i))-pbase(i)) /(p(i,icb(i))-p(i,icb(i)+1)) 737 802 buoybase(i) = tvpbase - tvbase 738 803 END DO 739 804 740 805 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 806 ! *** make sure that column is dry adiabatic between the surface *** 807 ! *** and cloud base, and that lifted air is positively buoyant *** 808 ! *** at cloud base *** 809 ! *** if not, return to calling program after resetting *** 810 ! *** sig(i) and w0(i) *** 811 812 813 ! oct3 do 200 i=1,len 814 ! oct3 815 ! oct3 tdif = buoybase(i) 816 ! oct3 ath1 = th(i,1) 817 ! oct3 ath = th(i,icb(i)-1) - dttrig 818 ! oct3 819 ! oct3 if (tdif.lt.dtcrit .or. ath.gt.ath1) then 820 ! oct3 do 60 k=1,nl 821 ! oct3 sig(i,k) = beta*sig(i,k) - 2.*alpha*tdif*tdif 822 ! oct3 sig(i,k) = AMAX1(sig(i,k),0.0) 823 ! oct3 w0(i,k) = beta*w0(i,k) 824 ! oct3 60 continue 825 ! oct3 iflag(i)=4 ! pour version vectorisee 826 ! oct3c convect3 iflag(i)=0 827 ! oct3cccc return 828 ! oct3 endif 829 ! oct3 830 ! oct3200 continue 831 832 ! -- oct3: on reecrit la boucle 200 (pour la vectorisation) 768 833 769 834 DO k = 1, nl … … 779 844 w0(i, k) = beta*w0(i, k) 780 845 iflag(i) = 4 ! pour version vectorisee 781 846 ! convect3 iflag(i)=0 782 847 END IF 783 848 … … 785 850 END DO 786 851 787 852 ! fin oct3 -- 788 853 789 854 RETURN 790 855 END SUBROUTINE cv3_trigger 791 856 792 SUBROUTINE cv3_compress(len, nloc, ncum, nd, ntra, iflag1, nk1, icb1, icbs1, & 793 plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, t1, q1, qs1, u1, v1, gz1, & 794 th1, tra1, h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, sig1, w01, & 795 iflag, nk, icb, icbs, plcl, tnk, qnk, gznk, pbase, buoybase, t, q, qs, u, & 796 v, gz, th, tra, h, lv, cpn, p, ph, tv, tp, tvp, clw, sig, w0) 857 SUBROUTINE cv3_compress(len, nloc, ncum, nd, ntra, & 858 iflag1, nk1, icb1, icbs1, & 859 plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, & 860 t1, q1, qs1, u1, v1, gz1, th1, & 861 tra1, & 862 h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, & 863 sig1, w01, & 864 iflag, nk, icb, icbs, & 865 plcl, tnk, qnk, gznk, pbase, buoybase, & 866 t, q, qs, u, v, gz, th, & 867 tra, & 868 h, lv, cpn, p, ph, tv, tp, tvp, clw, & 869 sig, w0) 797 870 IMPLICIT NONE 798 871 … … 800 873 include 'iniprint.h' 801 874 802 !inputs:875 !inputs: 803 876 INTEGER len, ncum, nd, ntra, nloc 804 877 INTEGER iflag1(len), nk1(len), icb1(len), icbs1(len) … … 813 886 REAL tra1(len, nd, ntra) 814 887 815 !outputs:816 888 !outputs: 889 ! en fait, on a nloc=len pour l'instant (cf cv_driver) 817 890 INTEGER iflag(nloc), nk(nloc), icb(nloc), icbs(nloc) 818 891 REAL plcl(nloc), tnk(nloc), qnk(nloc), gznk(nloc) … … 826 899 REAL tra(nloc, nd, ntra) 827 900 828 !local variables:901 !local variables: 829 902 INTEGER i, k, nn, j 830 903 … … 859 932 END DO 860 933 861 !AC! do 121 j=1,ntra862 !AC!ccccc do 111 k=1,nl+1863 !AC! do 111 k=1,nd864 !AC! nn=0865 !AC! do 101 i=1,len866 !AC! if(iflag1(i).eq.0)then867 !AC! nn=nn+1868 !AC! tra(nn,k,j)=tra1(i,k,j)869 !AC! endif870 !AC! 101 continue871 !AC! 111 continue872 !AC! 121 continue934 !AC! do 121 j=1,ntra 935 !AC!ccccc do 111 k=1,nl+1 936 !AC! do 111 k=1,nd 937 !AC! nn=0 938 !AC! do 101 i=1,len 939 !AC! if(iflag1(i).eq.0)then 940 !AC! nn=nn+1 941 !AC! tra(nn,k,j)=tra1(i,k,j) 942 !AC! endif 943 !AC! 101 continue 944 !AC! 111 continue 945 !AC! 121 continue 873 946 874 947 IF (nn/=ncum) THEN … … 902 975 903 976 904 !JAM--------------------------------------------------------------------905 906 977 !JAM-------------------------------------------------------------------- 978 ! Calcul de la quantité d'eau sous forme de glace 979 ! -------------------------------------------------------------------- 907 980 REAL qi(len, nl) 908 981 REAL t(len, nl), clw(len, nl) … … 922 995 END IF 923 996 END IF 924 997 ! print*,t(i,k),qi(i,k),'temp,testglace' 925 998 END DO 926 999 END DO … … 930 1003 END SUBROUTINE icefrac 931 1004 932 SUBROUTINE cv3_undilute2(nloc, ncum, nd, icb, icbs, nk, tnk, qnk, gznk, hnk, & 933 t, q, qs, gz, p, h, tv, lv, lf, pbase, buoybase, plcl, inb, tp, tvp, clw, & 934 hp, ep, sigp, buoy, frac) 1005 SUBROUTINE cv3_undilute2(nloc, ncum, nd, icb, icbs, nk, & 1006 tnk, qnk, gznk, hnk, t, q, qs, gz, & 1007 p, h, tv, lv, lf, pbase, buoybase, plcl, & 1008 inb, tp, tvp, clw, hp, ep, sigp, buoy, frac) 935 1009 IMPLICIT NONE 936 1010 937 938 939 940 941 942 943 944 945 946 947 !- icbs (input) is the first level above LCL (may differ from icb)948 !- many minor differences in the iterations949 !- condensed water not removed from tvp in convect3950 !- vertical profile of buoyancy computed here (use of buoybase)951 !- the determination of inb is different952 !- no inb1, only inb in output953 1011 ! --------------------------------------------------------------------- 1012 ! Purpose: 1013 ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 1014 ! & 1015 ! COMPUTE THE PRECIPITATION EFFICIENCIES AND THE 1016 ! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD 1017 ! & 1018 ! FIND THE LEVEL OF NEUTRAL BUOYANCY 1019 1020 ! Main differences convect3/convect4: 1021 ! - icbs (input) is the first level above LCL (may differ from icb) 1022 ! - many minor differences in the iterations 1023 ! - condensed water not removed from tvp in convect3 1024 ! - vertical profile of buoyancy computed here (use of buoybase) 1025 ! - the determination of inb is different 1026 ! - no inb1, only inb in output 1027 ! --------------------------------------------------------------------- 954 1028 955 1029 include "cvthermo.h" … … 958 1032 include "cvflag.h" 959 1033 960 !inputs:1034 !inputs: 961 1035 INTEGER ncum, nd, nloc, j 962 1036 INTEGER icb(nloc), icbs(nloc), nk(nloc) … … 968 1042 REAL pbase(nloc), buoybase(nloc), plcl(nloc) 969 1043 970 !outputs:1044 !outputs: 971 1045 INTEGER inb(nloc) 972 1046 REAL tp(nloc, nd), tvp(nloc, nd), clw(nloc, nd) … … 974 1048 REAL buoy(nloc, nd) 975 1049 976 !local variables:1050 !local variables: 977 1051 INTEGER i, k 978 1052 REAL tg, qg, ahg, alv, alf, s, tc, es, esi, denom, rg, tca, elacrit … … 986 1060 REAL fracg 987 1061 988 989 990 1062 ! ===================================================================== 1063 ! --- SOME INITIALIZATIONS 1064 ! ===================================================================== 991 1065 992 1066 DO k = 1, nl … … 998 1072 END DO 999 1073 1000 1001 1002 1003 1004 1005 !cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk.1006 1007 1074 ! ===================================================================== 1075 ! --- FIND THE REST OF THE LIFTED PARCEL TEMPERATURES 1076 ! ===================================================================== 1077 1078 ! --- The procedure is to solve the equation. 1079 ! cp*tp+L*qp+phi=cp*tnk+L*qnk+gznk. 1080 1081 ! *** Calculate certain parcel quantities, including static energy *** 1008 1082 1009 1083 1010 1084 DO i = 1, ncum 1011 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i) & ! debug &1012 ! +qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i)1013 +qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i)1014 END DO 1015 1016 1017 1085 ah0(i) = (cpd*(1.-qnk(i))+cl*qnk(i))*tnk(i)+ & 1086 ! debug qnk(i)*(lv0-clmcpv*(tnk(i)-t0))+gznk(i) 1087 qnk(i)*(lv0-clmcpv*(tnk(i)-273.15)) + gznk(i) 1088 END DO 1089 1090 1091 ! *** Find lifted parcel quantities above cloud base *** 1018 1092 1019 1093 1020 1094 DO k = minorig + 1, nl 1021 1095 DO i = 1, ncum 1022 1023 IF (k>=(icbs(i)+1)) THEN ! convect31096 ! ori if(k.ge.(icb(i)+1))then 1097 IF (k>=(icbs(i)+1)) THEN ! convect3 1024 1098 tg = t(i, k) 1025 1099 qg = qs(i, k) 1026 1100 ! debug alv=lv0-clmcpv*(t(i,k)-t0) 1027 1101 alv = lv0 - clmcpv*(t(i,k)-273.15) 1028 1102 1029 1030 1031 1032 s = cpd*(1.-qnk(i)) + cl*qnk(i) &! convect31033 +alv*alv*qg/(rrv*t(i,k)*t(i,k))! convect31103 ! First iteration. 1104 1105 ! ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k)) 1106 s = cpd*(1.-qnk(i)) + cl*qnk(i) + & ! convect3 1107 alv*alv*qg/(rrv*t(i,k)*t(i,k)) ! convect3 1034 1108 s = 1./s 1035 1109 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k) 1036 1110 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3 1037 1111 tg = tg + s*(ah0(i)-ahg) 1038 1039 1112 ! ori tg=max(tg,35.0) 1113 ! debug tc=tg-t0 1040 1114 tc = tg - 273.15 1041 1115 denom = 243.5 + tc 1042 denom = max(denom, 1.0) ! convect31043 1116 denom = max(denom, 1.0) ! convect3 1117 ! ori if(tc.ge.0.0)then 1044 1118 es = 6.112*exp(17.67*tc/denom) 1045 1046 1047 1119 ! ori else 1120 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 1121 ! ori endif 1048 1122 qg = eps*es/(p(i,k)-es*(1.-eps)) 1049 1123 1050 1051 1052 1053 1054 1124 ! Second iteration. 1125 1126 ! ori s=cpd+alv*alv*qg/(rrv*t(i,k)*t(i,k)) 1127 ! ori s=1./s 1128 ! ori ahg=cpd*tg+(cl-cpd)*qnk(i)*t(i,k)+alv*qg+gz(i,k) 1055 1129 ahg = cpd*tg + (cl-cpd)*qnk(i)*tg + alv*qg + gz(i, k) ! convect3 1056 1130 tg = tg + s*(ah0(i)-ahg) 1057 1058 1131 ! ori tg=max(tg,35.0) 1132 ! debug tc=tg-t0 1059 1133 tc = tg - 273.15 1060 1134 denom = 243.5 + tc 1061 denom = max(denom, 1.0) ! convect31062 1135 denom = max(denom, 1.0) ! convect3 1136 ! ori if(tc.ge.0.0)then 1063 1137 es = 6.112*exp(17.67*tc/denom) 1064 1065 1066 1138 ! ori else 1139 ! ori es=exp(23.33086-6111.72784/tg+0.15215*log(tg)) 1140 ! ori endif 1067 1141 qg = eps*es/(p(i,k)-es*(1.-eps)) 1068 1142 1069 1143 ! debug alv=lv0-clmcpv*(t(i,k)-t0) 1070 1144 alv = lv0 - clmcpv*(t(i,k)-273.15) 1071 ! print*,'cpd dans convect2 ',cpd 1072 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd' 1073 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd 1074 1075 ! ori c approximation here: 1076 ! ori 1077 ! tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd 1078 1079 ! convect3: no approximation: 1145 ! print*,'cpd dans convect2 ',cpd 1146 ! print*,'tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd' 1147 ! print*,tp(i,k),ah0(i),cl,cpd,qnk(i),t(i,k),gz(i,k),alv,qg,cpd 1148 1149 ! ori c approximation here: 1150 ! ori tp(i,k)=(ah0(i)-(cl-cpd)*qnk(i)*t(i,k)-gz(i,k)-alv*qg)/cpd 1151 1152 ! convect3: no approximation: 1080 1153 IF (cvflag_ice) THEN 1081 1154 tp(i, k) = max(0., (ah0(i)-gz(i,k)-alv*qg)/(cpd+(cl-cpd)*qnk(i))) … … 1087 1160 clw(i, k) = max(0.0, clw(i,k)) 1088 1161 rg = qg/(1.-qnk(i)) 1089 1090 1162 ! ori tvp(i,k)=tp(i,k)*(1.+rg*epsi) 1163 ! convect3: (qg utilise au lieu du vrai mixing ratio rg): 1091 1164 tvp(i, k) = tp(i, k)*(1.+qg/eps-qnk(i)) ! whole thing 1092 1165 IF (cvflag_ice) THEN … … 1099 1172 1100 1173 IF (cvflag_ice) THEN 1101 !CR:attention boucle en klon dans Icefrac1102 1174 !CR:attention boucle en klon dans Icefrac 1175 ! Call Icefrac(t,clw,qi,nl,nloc) 1103 1176 IF (t(i,k)>263.15) THEN 1104 1177 qi(i, k) = 0. … … 1111 1184 END IF 1112 1185 END IF 1113 !CR: fin test1186 !CR: fin test 1114 1187 IF (t(i,k)<263.15) THEN 1115 !CR: on commente les calculs d'Arnaud car division par zero1116 1117 !alv=lv0-clmcpv*(t(i,k)-273.15)1118 !alf=lf0-clmci*(t(i,k)-273.15)1119 !tg=tp(i,k)1120 !tc=tp(i,k)-273.151121 !denom=243.5+tc1122 !do j=1,31123 1124 1125 1126 !tbis=t(i,k)+(tp(i,k)-tg)1127 ! esi=exp(23.33086-(6111.72784/tbis) 1128 ! : +0.15215*log(tbis))1129 !qsat_new=eps*esi/(p(i,k)-esi*(1.-eps))1130 ! snew=cpd*(1.-qnk(i))+cl*qnk(i)+alv*alv*qsat_new/ 1131 ! :(rrv*tbis*tbis)1132 !snew=1./snew1133 !print*,esi,qsat_new,snew,'esi,qsat,snew'1134 !tp(i,k)=tg+(alf*qi(i,k)+alv*qg*(1.-(esi/es)))*snew1135 !print*,k,tp(i,k),qnk(i),'avec glace'1136 !print*,'tpNAN',tg,alf,qi(i,k),alv,qg,esi,es,snew1137 !enddo1188 !CR: on commente les calculs d'Arnaud car division par zero 1189 ! nouveau calcul propose par JYG 1190 ! alv=lv0-clmcpv*(t(i,k)-273.15) 1191 ! alf=lf0-clmci*(t(i,k)-273.15) 1192 ! tg=tp(i,k) 1193 ! tc=tp(i,k)-273.15 1194 ! denom=243.5+tc 1195 ! do j=1,3 1196 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1197 ! il faudra que esi vienne en argument de la convection 1198 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1199 ! tbis=t(i,k)+(tp(i,k)-tg) 1200 ! esi=exp(23.33086-(6111.72784/tbis) + & 1201 ! 0.15215*log(tbis)) 1202 ! qsat_new=eps*esi/(p(i,k)-esi*(1.-eps)) 1203 ! snew=cpd*(1.-qnk(i))+cl*qnk(i)+alv*alv*qsat_new/ & 1204 ! (rrv*tbis*tbis) 1205 ! snew=1./snew 1206 ! print*,esi,qsat_new,snew,'esi,qsat,snew' 1207 ! tp(i,k)=tg+(alf*qi(i,k)+alv*qg*(1.-(esi/es)))*snew 1208 ! print*,k,tp(i,k),qnk(i),'avec glace' 1209 ! print*,'tpNAN',tg,alf,qi(i,k),alv,qg,esi,es,snew 1210 ! enddo 1138 1211 1139 1212 alv = lv0 - clmcpv*(t(i,k)-273.15) … … 1145 1218 esi = exp(23.33086-(6111.72784/tp(i,k))+0.15215*log(tp(i,k))) 1146 1219 qsat_new = eps*esi/(p(i,k)-esi*(1.-eps)) 1147 snew = cpd*(1.-qnk(i)) + cl*qnk(i) + alv*als*qsat_new/ (rrv*tp(i,k&1148 )*tp(i,k))1220 snew = cpd*(1.-qnk(i)) + cl*qnk(i) + alv*als*qsat_new/ & 1221 (rrv*tp(i,k)*tp(i,k)) 1149 1222 snew = 1./snew 1150 ! c print*,esi,qsat_new,snew,'esi,qsat,snew' 1151 tp(i, k) = tp(i, k) + ((cpd*(1.-qnk(i))+cl*qnk(i))*(tg-tp(i, & 1152 k))+alv*(qg-qsat_new)+alf*qi(i,k))*snew 1153 ! print*,k,tp(i,k),qsat_new,qnk(i),qi(i,k), 1154 ! : 'k,tp,q,qt,qi avec glace' 1223 ! c print*,esi,qsat_new,snew,'esi,qsat,snew' 1224 tp(i, k) = tp(i, k) + & 1225 ((cpd*(1.-qnk(i))+cl*qnk(i))*(tg-tp(i,k)) + & 1226 alv*(qg-qsat_new)+alf*qi(i,k))*snew 1227 ! print*,k,tp(i,k),qsat_new,qnk(i),qi(i,k), & 1228 ! 'k,tp,q,qt,qi avec glace' 1155 1229 END DO 1156 1230 1157 !CR:reprise du code AJ1231 !CR:reprise du code AJ 1158 1232 clw(i, k) = qnk(i) - qsat_new 1159 1233 clw(i, k) = max(0.0, clw(i,k)) 1160 1234 tvp(i, k) = max(0., tp(i,k)*(1.+qsat_new/eps-qnk(i))) 1161 1235 ! print*,tvp(i,k),'tvp' 1162 1236 END IF 1163 1237 IF (clw(i,k)<1.E-11) THEN … … 1170 1244 END DO 1171 1245 1172 1173 1174 1175 1176 1246 ! ===================================================================== 1247 ! --- SET THE PRECIPITATION EFFICIENCIES AND THE FRACTION OF 1248 ! --- PRECIPITATION FALLING OUTSIDE OF CLOUD 1249 ! --- THESE MAY BE FUNCTIONS OF TP(I), P(I) AND CLW(I) 1250 ! ===================================================================== 1177 1251 1178 1252 IF (flag_epkeorig/=1) THEN … … 1205 1279 END DO 1206 1280 END IF 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 DO i = 1, ncum ! convect31230 tp(i, nlp) = tp(i, nl) ! convect31231 END DO ! convect31232 1233 1234 1235 1236 1237 1238 1239 1281 ! ===================================================================== 1282 ! --- CALCULATE VIRTUAL TEMPERATURE AND LIFTED PARCEL 1283 ! --- VIRTUAL TEMPERATURE 1284 ! ===================================================================== 1285 1286 ! dans convect3, tvp est calcule en une seule fois, et sans retirer 1287 ! l'eau condensee (~> reversible CAPE) 1288 1289 ! ori do 340 k=minorig+1,nl 1290 ! ori do 330 i=1,ncum 1291 ! ori if(k.ge.(icb(i)+1))then 1292 ! ori tvp(i,k)=tvp(i,k)*(1.0-qnk(i)+ep(i,k)*clw(i,k)) 1293 ! oric print*,'i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k)' 1294 ! oric print*, i,k,tvp(i,k),qnk(i),ep(i,k),clw(i,k) 1295 ! ori endif 1296 ! ori 330 continue 1297 ! ori 340 continue 1298 1299 ! ori do 350 i=1,ncum 1300 ! ori tvp(i,nlp)=tvp(i,nl)-(gz(i,nlp)-gz(i,nl))/cpd 1301 ! ori 350 continue 1302 1303 DO i = 1, ncum ! convect3 1304 tp(i, nlp) = tp(i, nl) ! convect3 1305 END DO ! convect3 1306 1307 ! ===================================================================== 1308 ! --- EFFECTIVE VERTICAL PROFILE OF BUOYANCY (convect3 only): 1309 ! ===================================================================== 1310 1311 ! -- this is for convect3 only: 1312 1313 ! first estimate of buoyancy: 1240 1314 1241 1315 DO i = 1, ncum … … 1245 1319 END DO 1246 1320 1247 1248 1321 ! set buoyancy=buoybase for all levels below base 1322 ! for safety, set buoy(icb)=buoybase 1249 1323 1250 1324 DO i = 1, ncum … … 1254 1328 END IF 1255 1329 END DO 1256 !buoy(icb(i),k)=buoybase(i)1330 ! buoy(icb(i),k)=buoybase(i) 1257 1331 buoy(i, icb(i)) = buoybase(i) 1258 1332 END DO 1259 1333 1260 1261 1262 1263 1264 1265 1266 1267 1334 ! -- end convect3 1335 1336 ! ===================================================================== 1337 ! --- FIND THE FIRST MODEL LEVEL (INB) ABOVE THE PARCEL'S 1338 ! --- LEVEL OF NEUTRAL BUOYANCY 1339 ! ===================================================================== 1340 1341 ! -- this is for convect3 only: 1268 1342 1269 1343 DO i = 1, ncum … … 1273 1347 1274 1348 1275 1349 ! -- iposit(i) = first level, above icb, with positive buoyancy 1276 1350 DO k = 1, nl - 1 1277 1351 DO i = 1, ncum … … 1296 1370 END DO 1297 1371 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 !do 530 k=minorig+1,nl-11310 !do 520 i=1,ncum1311 !if(k.ge.(icb(i)+1))then1312 !by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)1313 !byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)1314 !cape(i)=cape(i)+by1315 !if(by.ge.0.0)inb1(i)=k+11316 !if(cape(i).gt.0.0)then1317 !inb(i)=k+11318 !capem(i)=cape(i)1319 !endif1320 !endif1321 !520 continue1322 !530 continue1323 !do 540 i=1,ncum1324 !byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl)1325 !cape(i)=capem(i)+byp1326 !defrac=capem(i)-cape(i)1327 !defrac=max(defrac,0.001)1328 !frac(i)=-cape(i)/defrac1329 !frac(i)=min(frac(i),1.0)1330 !frac(i)=max(frac(i),0.0)1331 !540 continue1332 1333 !K Emanuel fix1334 1335 !call zilch(byp,ncum)1336 !do 530 k=minorig+1,nl-11337 !do 520 i=1,ncum1338 !if(k.ge.(icb(i)+1))then1339 !by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k)1340 !cape(i)=cape(i)+by1341 !if(by.ge.0.0)inb1(i)=k+11342 !if(cape(i).gt.0.0)then1343 !inb(i)=k+11344 !capem(i)=cape(i)1345 !byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1)1346 !endif1347 !endif1348 !520 continue1349 !530 continue1350 !do 540 i=1,ncum1351 !inb(i)=max(inb(i),inb1(i))1352 !cape(i)=capem(i)+byp(i)1353 !defrac=capem(i)-cape(i)1354 !defrac=max(defrac,0.001)1355 !frac(i)=-cape(i)/defrac1356 !frac(i)=min(frac(i),1.0)1357 !frac(i)=max(frac(i),0.0)1358 !540 continue1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1372 ! -- end convect3 1373 1374 ! ori do 510 i=1,ncum 1375 ! ori cape(i)=0.0 1376 ! ori capem(i)=0.0 1377 ! ori inb(i)=icb(i)+1 1378 ! ori inb1(i)=inb(i) 1379 ! ori 510 continue 1380 1381 ! Originial Code 1382 1383 ! do 530 k=minorig+1,nl-1 1384 ! do 520 i=1,ncum 1385 ! if(k.ge.(icb(i)+1))then 1386 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 1387 ! byp=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 1388 ! cape(i)=cape(i)+by 1389 ! if(by.ge.0.0)inb1(i)=k+1 1390 ! if(cape(i).gt.0.0)then 1391 ! inb(i)=k+1 1392 ! capem(i)=cape(i) 1393 ! endif 1394 ! endif 1395 !520 continue 1396 !530 continue 1397 ! do 540 i=1,ncum 1398 ! byp=(tvp(i,nl)-tv(i,nl))*dph(i,nl)/p(i,nl) 1399 ! cape(i)=capem(i)+byp 1400 ! defrac=capem(i)-cape(i) 1401 ! defrac=max(defrac,0.001) 1402 ! frac(i)=-cape(i)/defrac 1403 ! frac(i)=min(frac(i),1.0) 1404 ! frac(i)=max(frac(i),0.0) 1405 !540 continue 1406 1407 ! K Emanuel fix 1408 1409 ! call zilch(byp,ncum) 1410 ! do 530 k=minorig+1,nl-1 1411 ! do 520 i=1,ncum 1412 ! if(k.ge.(icb(i)+1))then 1413 ! by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 1414 ! cape(i)=cape(i)+by 1415 ! if(by.ge.0.0)inb1(i)=k+1 1416 ! if(cape(i).gt.0.0)then 1417 ! inb(i)=k+1 1418 ! capem(i)=cape(i) 1419 ! byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 1420 ! endif 1421 ! endif 1422 !520 continue 1423 !530 continue 1424 ! do 540 i=1,ncum 1425 ! inb(i)=max(inb(i),inb1(i)) 1426 ! cape(i)=capem(i)+byp(i) 1427 ! defrac=capem(i)-cape(i) 1428 ! defrac=max(defrac,0.001) 1429 ! frac(i)=-cape(i)/defrac 1430 ! frac(i)=min(frac(i),1.0) 1431 ! frac(i)=max(frac(i),0.0) 1432 !540 continue 1433 1434 ! J Teixeira fix 1435 1436 ! ori call zilch(byp,ncum) 1437 ! ori do 515 i=1,ncum 1438 ! ori lcape(i)=.true. 1439 ! ori 515 continue 1440 ! ori do 530 k=minorig+1,nl-1 1441 ! ori do 520 i=1,ncum 1442 ! ori if(cape(i).lt.0.0)lcape(i)=.false. 1443 ! ori if((k.ge.(icb(i)+1)).and.lcape(i))then 1444 ! ori by=(tvp(i,k)-tv(i,k))*dph(i,k)/p(i,k) 1445 ! ori byp(i)=(tvp(i,k+1)-tv(i,k+1))*dph(i,k+1)/p(i,k+1) 1446 ! ori cape(i)=cape(i)+by 1447 ! ori if(by.ge.0.0)inb1(i)=k+1 1448 ! ori if(cape(i).gt.0.0)then 1449 ! ori inb(i)=k+1 1450 ! ori capem(i)=cape(i) 1451 ! ori endif 1452 ! ori endif 1453 ! ori 520 continue 1454 ! ori 530 continue 1455 ! ori do 540 i=1,ncum 1456 ! ori cape(i)=capem(i)+byp(i) 1457 ! ori defrac=capem(i)-cape(i) 1458 ! ori defrac=max(defrac,0.001) 1459 ! ori frac(i)=-cape(i)/defrac 1460 ! ori frac(i)=min(frac(i),1.0) 1461 ! ori frac(i)=max(frac(i),0.0) 1462 ! ori 540 continue 1463 1464 ! ===================================================================== 1465 ! --- CALCULATE LIQUID WATER STATIC ENERGY OF LIFTED PARCEL 1466 ! ===================================================================== 1393 1467 1394 1468 DO k = 1, nd … … 1405 1479 frac(i, k) = 1. - (t(i,k)-243.15)/(263.15-243.15) 1406 1480 frac(i, k) = min(max(frac(i,k),0.0), 1.0) 1407 hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* ep&1408 (i, k)*clw(i, k)1481 hp(i, k) = hnk(i) + (lv(i,k)+(cpd-cpv)*t(i,k)+frac(i,k)*lf(i,k))* & 1482 ep(i, k)*clw(i, k) 1409 1483 1410 1484 ELSE … … 1419 1493 END SUBROUTINE cv3_undilute2 1420 1494 1421 SUBROUTINE cv3_closure(nloc, ncum, nd, icb, inb, pbase, p, ph, tv, buoy, sig, & 1422 w0, cape, m, iflag) 1495 SUBROUTINE cv3_closure(nloc, ncum, nd, icb, inb, & 1496 pbase, p, ph, tv, buoy, & 1497 sig, w0, cape, m, iflag) 1423 1498 IMPLICIT NONE 1424 1499 1425 1426 1427 1428 1429 1500 ! =================================================================== 1501 ! --- CLOSURE OF CONVECT3 1502 ! 1503 ! vectorization: S. Bony 1504 ! =================================================================== 1430 1505 1431 1506 include "cvthermo.h" 1432 1507 include "cv3param.h" 1433 1508 1434 !input:1509 !input: 1435 1510 INTEGER ncum, nd, nloc 1436 1511 INTEGER icb(nloc), inb(nloc) … … 1439 1514 REAL tv(nloc, nd), buoy(nloc, nd) 1440 1515 1441 !input/output:1516 !input/output: 1442 1517 REAL sig(nloc, nd), w0(nloc, nd) 1443 1518 INTEGER iflag(nloc) 1444 1519 1445 !output:1520 !output: 1446 1521 REAL cape(nloc) 1447 1522 REAL m(nloc, nd) 1448 1523 1449 !local variables:1524 !local variables: 1450 1525 INTEGER i, j, k, icbmax 1451 1526 REAL deltap, fac, w, amu … … 1454 1529 1455 1530 1456 1457 1458 1531 ! ------------------------------------------------------- 1532 ! -- Initialization 1533 ! ------------------------------------------------------- 1459 1534 1460 1535 DO k = 1, nl … … 1464 1539 END DO 1465 1540 1466 1467 1468 1469 1470 1541 ! ------------------------------------------------------- 1542 ! -- Reset sig(i) and w0(i) for i>inb and i<icb 1543 ! ------------------------------------------------------- 1544 1545 ! update sig and w0 above LNB: 1471 1546 1472 1547 DO k = 1, nl - 1 1473 1548 DO i = 1, ncum 1474 1549 IF ((inb(i)<(nl-1)) .AND. (k>=(inb(i)+1))) THEN 1475 sig(i, k) = beta*sig(i, k) + 2.*alpha*buoy(i, inb(i))*abs(buoy(i,inb(&1476 i)))1550 sig(i, k) = beta*sig(i, k) + & 1551 2.*alpha*buoy(i, inb(i))*abs(buoy(i,inb(i))) 1477 1552 sig(i, k) = amax1(sig(i,k), 0.0) 1478 1553 w0(i, k) = beta*w0(i, k) … … 1481 1556 END DO 1482 1557 1483 1558 ! compute icbmax: 1484 1559 1485 1560 icbmax = 2 … … 1488 1563 END DO 1489 1564 1490 1565 ! update sig and w0 below cloud base: 1491 1566 1492 1567 DO k = 1, icbmax 1493 1568 DO i = 1, ncum 1494 1569 IF (k<=icb(i)) THEN 1495 sig(i, k) = beta*sig(i, k) - 2.*alpha*buoy(i, icb(i))*buoy(i, icb(i)) 1570 sig(i, k) = beta*sig(i, k) - & 1571 2.*alpha*buoy(i, icb(i))*buoy(i, icb(i)) 1496 1572 sig(i, k) = max(sig(i,k), 0.0) 1497 1573 w0(i, k) = beta*w0(i, k) … … 1500 1576 END DO 1501 1577 1502 !! if(inb.lt.(nl-1))then1503 !! do 85 i=inb+1,nl-11504 !! sig(i)=beta*sig(i)+2.*alpha*buoy(inb)*1505 !! 1 abs(buoy(inb))1506 !! sig(i)=max(sig(i),0.0)1507 !! w0(i)=beta*w0(i)1508 !! 85 continue1509 !! end if1510 1511 !! do 87 i=1,icb1512 !! sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb)1513 !! sig(i)=max(sig(i),0.0)1514 !! w0(i)=beta*w0(i)1515 !! 87 continue1516 1517 1518 1519 1520 1578 !! if(inb.lt.(nl-1))then 1579 !! do 85 i=inb+1,nl-1 1580 !! sig(i)=beta*sig(i)+2.*alpha*buoy(inb)* 1581 !! 1 abs(buoy(inb)) 1582 !! sig(i)=max(sig(i),0.0) 1583 !! w0(i)=beta*w0(i) 1584 !! 85 continue 1585 !! end if 1586 1587 !! do 87 i=1,icb 1588 !! sig(i)=beta*sig(i)-2.*alpha*buoy(icb)*buoy(icb) 1589 !! sig(i)=max(sig(i),0.0) 1590 !! w0(i)=beta*w0(i) 1591 !! 87 continue 1592 1593 ! ------------------------------------------------------------- 1594 ! -- Reset fractional areas of updrafts and w0 at initial time 1595 ! -- and after 10 time steps of no convection 1596 ! ------------------------------------------------------------- 1521 1597 1522 1598 DO k = 1, nl - 1 … … 1529 1605 END DO 1530 1606 1531 1532 1533 1534 1535 1607 ! ------------------------------------------------------------- 1608 ! -- Calculate convective available potential energy (cape), 1609 ! -- vertical velocity (w), fractional area covered by 1610 ! -- undilute updraft (sig), and updraft mass flux (m) 1611 ! ------------------------------------------------------------- 1536 1612 1537 1613 DO i = 1, ncum … … 1539 1615 END DO 1540 1616 1541 1617 ! compute dtmin (minimum buoyancy between ICB and given level k): 1542 1618 1543 1619 DO i = 1, ncum … … 1550 1626 DO k = 1, nl 1551 1627 DO j = minorig, nl 1552 IF ((k>=(icb(i)+1)) .AND. (k<=inb(i)) .AND. (j>=icb(i)) .AND. (j<=(k- & 1553 1))) THEN 1628 IF ((k>=(icb(i)+1)) .AND. (k<=inb(i)) .AND. (j>=icb(i)) .AND. (j<=(k-1))) THEN 1554 1629 dtmin(i, k) = amin1(dtmin(i,k), buoy(i,j)) 1555 1630 END IF … … 1558 1633 END DO 1559 1634 1560 1635 ! the interval on which cape is computed starts at pbase : 1561 1636 1562 1637 DO k = 1, nl … … 1570 1645 sigold(i, k) = sig(i, k) 1571 1646 1572 1573 1574 1575 1647 ! dtmin(i,k)=100.0 1648 ! do 97 j=icb(i),k-1 ! mauvaise vectorisation 1649 ! dtmin(i,k)=AMIN1(dtmin(i,k),buoy(i,j)) 1650 ! 97 continue 1576 1651 1577 1652 sig(i, k) = beta*sig(i, k) + alpha*dtmin(i, k)*abs(dtmin(i,k)) … … 1590 1665 DO i = 1, ncum 1591 1666 w0(i, icb(i)) = 0.5*w0(i, icb(i)+1) 1592 m(i, icb(i)) = 0.5*m(i, icb(i)+1)*(ph(i,icb(i))-ph(i,icb(i)+1))/ & 1593 (ph(i,icb(i)+1)-ph(i,icb(i)+2)) 1667 m(i, icb(i)) = 0.5*m(i, icb(i)+1)*(ph(i,icb(i))-ph(i,icb(i)+1))/(ph(i,icb(i)+1)-ph(i,icb(i)+2)) 1594 1668 sig(i, icb(i)) = sig(i, icb(i)+1) 1595 1669 sig(i, icb(i)-1) = sig(i, icb(i)) 1596 1670 END DO 1597 1671 1598 ! ccc 3. Compute final cloud base mass flux and set iflag to 3 if 1599 ! ccc cloud base mass flux is exceedingly small and is decreasing (i.e. 1600 ! if 1601 ! ccc the final mass flux (cbmflast) is greater than the target mass 1602 ! flux 1603 ! ccc (cbmf) ??). 1604 ! cc 1605 ! c do i = 1,ncum 1606 ! c cbmflast(i) = 0. 1607 ! c enddo 1608 ! cc 1609 ! c do k= 1,nl 1610 ! c do i = 1,ncum 1611 ! c IF (k .ge. icb(i) .and. k .le. inb(i)) THEN 1612 ! c cbmflast(i) = cbmflast(i)+M(i,k) 1613 ! c ENDIF 1614 ! c enddo 1615 ! c enddo 1616 ! cc 1617 ! c do i = 1,ncum 1618 ! c IF (cbmflast(i) .lt. 1.e-6) THEN 1619 ! c iflag(i) = 3 1620 ! c ENDIF 1621 ! c enddo 1622 ! cc 1623 ! c do k= 1,nl 1624 ! c do i = 1,ncum 1625 ! c IF (iflag(i) .ge. 3) THEN 1626 ! c M(i,k) = 0. 1627 ! c sig(i,k) = 0. 1628 ! c w0(i,k) = 0. 1629 ! c ENDIF 1630 ! c enddo 1631 ! c enddo 1632 ! cc 1633 ! ! cape=0.0 1634 ! ! do 98 i=icb+1,inb 1635 ! ! deltap = min(pbase,ph(i-1))-min(pbase,ph(i)) 1636 ! ! cape=cape+rrd*buoy(i-1)*deltap/p(i-1) 1637 ! ! dcape=rrd*buoy(i-1)*deltap/p(i-1) 1638 ! ! dlnp=deltap/p(i-1) 1639 ! ! cape=max(0.0,cape) 1640 ! ! sigold=sig(i) 1641 1642 ! ! dtmin=100.0 1643 ! ! do 97 j=icb,i-1 1644 ! ! dtmin=amin1(dtmin,buoy(j)) 1645 ! ! 97 continue 1646 1647 ! ! sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin) 1648 ! ! sig(i)=max(sig(i),0.0) 1649 ! ! sig(i)=amin1(sig(i),0.01) 1650 ! ! fac=amin1(((dtcrit-dtmin)/dtcrit),1.0) 1651 ! ! w=(1.-beta)*fac*sqrt(cape)+beta*w0(i) 1652 ! ! amu=0.5*(sig(i)+sigold)*w 1653 ! ! m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i) 1654 ! ! w0(i)=w 1655 ! ! 98 continue 1656 ! ! w0(icb)=0.5*w0(icb+1) 1657 ! ! m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2)) 1658 ! ! sig(icb)=sig(icb+1) 1659 ! ! sig(icb-1)=sig(icb) 1672 ! ccc 3. Compute final cloud base mass flux and set iflag to 3 if 1673 ! ccc cloud base mass flux is exceedingly small and is decreasing (i.e. if 1674 ! ccc the final mass flux (cbmflast) is greater than the target mass flux 1675 ! ccc (cbmf) ??). 1676 ! cc 1677 ! c do i = 1,ncum 1678 ! c cbmflast(i) = 0. 1679 ! c enddo 1680 ! cc 1681 ! c do k= 1,nl 1682 ! c do i = 1,ncum 1683 ! c IF (k .ge. icb(i) .and. k .le. inb(i)) THEN 1684 ! c cbmflast(i) = cbmflast(i)+M(i,k) 1685 ! c ENDIF 1686 ! c enddo 1687 ! c enddo 1688 ! cc 1689 ! c do i = 1,ncum 1690 ! c IF (cbmflast(i) .lt. 1.e-6) THEN 1691 ! c iflag(i) = 3 1692 ! c ENDIF 1693 ! c enddo 1694 ! cc 1695 ! c do k= 1,nl 1696 ! c do i = 1,ncum 1697 ! c IF (iflag(i) .ge. 3) THEN 1698 ! c M(i,k) = 0. 1699 ! c sig(i,k) = 0. 1700 ! c w0(i,k) = 0. 1701 ! c ENDIF 1702 ! c enddo 1703 ! c enddo 1704 ! cc 1705 !! cape=0.0 1706 !! do 98 i=icb+1,inb 1707 !! deltap = min(pbase,ph(i-1))-min(pbase,ph(i)) 1708 !! cape=cape+rrd*buoy(i-1)*deltap/p(i-1) 1709 !! dcape=rrd*buoy(i-1)*deltap/p(i-1) 1710 !! dlnp=deltap/p(i-1) 1711 !! cape=max(0.0,cape) 1712 !! sigold=sig(i) 1713 1714 !! dtmin=100.0 1715 !! do 97 j=icb,i-1 1716 !! dtmin=amin1(dtmin,buoy(j)) 1717 !! 97 continue 1718 1719 !! sig(i)=beta*sig(i)+alpha*dtmin*abs(dtmin) 1720 !! sig(i)=max(sig(i),0.0) 1721 !! sig(i)=amin1(sig(i),0.01) 1722 !! fac=amin1(((dtcrit-dtmin)/dtcrit),1.0) 1723 !! w=(1.-beta)*fac*sqrt(cape)+beta*w0(i) 1724 !! amu=0.5*(sig(i)+sigold)*w 1725 !! m(i)=amu*0.007*p(i)*(ph(i)-ph(i+1))/tv(i) 1726 !! w0(i)=w 1727 !! 98 continue 1728 !! w0(icb)=0.5*w0(icb+1) 1729 !! m(icb)=0.5*m(icb+1)*(ph(icb)-ph(icb+1))/(ph(icb+1)-ph(icb+2)) 1730 !! sig(icb)=sig(icb+1) 1731 !! sig(icb-1)=sig(icb) 1660 1732 1661 1733 RETURN 1662 1734 END SUBROUTINE cv3_closure 1663 1735 1664 SUBROUTINE cv3_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, ph, t, rr, rs, & 1665 u, v, tra, h, lv, lf, frac, qnk, unk, vnk, hp, tv, tvp, ep, clw, m, sig, & 1666 ment, qent, uent, vent, nent, sij, elij, ments, qents, traent) 1736 SUBROUTINE cv3_mixing(nloc, ncum, nd, na, ntra, icb, nk, inb, & 1737 ph, t, rr, rs, u, v, tra, h, lv, lf, frac, qnk, & 1738 unk, vnk, hp, tv, tvp, ep, clw, m, sig, & 1739 ment, qent, uent, vent, nent, sij, elij, ments, qents, traent) 1667 1740 IMPLICIT NONE 1668 1741 1669 1670 1671 1672 1742 ! --------------------------------------------------------------------- 1743 ! a faire: 1744 ! - vectorisation de la partie normalisation des flux (do 789...) 1745 ! --------------------------------------------------------------------- 1673 1746 1674 1747 include "cvthermo.h" … … 1676 1749 include "cvflag.h" 1677 1750 1678 !inputs:1751 !inputs: 1679 1752 INTEGER ncum, nd, na, ntra, nloc 1680 1753 INTEGER icb(nloc), inb(nloc), nk(nloc) … … 1690 1763 REAL m(nloc, na) ! input of convect3 1691 1764 1692 !outputs:1765 !outputs: 1693 1766 REAL ment(nloc, na, na), qent(nloc, na, na) 1694 1767 REAL uent(nloc, na, na), vent(nloc, na, na) … … 1699 1772 INTEGER nent(nloc, nd) 1700 1773 1701 !local variables:1774 !local variables: 1702 1775 INTEGER i, j, k, il, im, jm 1703 1776 INTEGER num1, num2 … … 1710 1783 LOGICAL lwork(nloc) 1711 1784 1712 1713 1714 1715 1716 1785 ! ===================================================================== 1786 ! --- INITIALIZE VARIOUS ARRAYS USED IN THE COMPUTATIONS 1787 ! ===================================================================== 1788 1789 ! ori do 360 i=1,ncum*nlp 1717 1790 DO j = 1, nl 1718 1791 DO i = 1, ncum 1719 1792 nent(i, j) = 0 1720 1721 1722 END DO 1723 END DO 1724 1725 1726 1793 ! in convect3, m is computed in cv3_closure 1794 ! ori m(i,1)=0.0 1795 END DO 1796 END DO 1797 1798 ! ori do 400 k=1,nlp 1799 ! ori do 390 j=1,nlp 1727 1800 DO j = 1, nl 1728 1801 DO k = 1, nl … … 1732 1805 vent(i, k, j) = v(i, j) 1733 1806 elij(i, k, j) = 0.0 1734 !ym ment(i,k,j)=0.01735 !ym sij(i,k,j)=0.01807 !ym ment(i,k,j)=0.0 1808 !ym sij(i,k,j)=0.0 1736 1809 END DO 1737 1810 END DO 1738 1811 END DO 1739 1812 1740 !ym1813 !ym 1741 1814 ment(1:ncum, 1:nd, 1:nd) = 0.0 1742 1815 sij(1:ncum, 1:nd, 1:nd) = 0.0 1743 1816 1744 !AC! do k=1,ntra1745 !AC! do j=1,nd ! instead nlp1746 !AC! do i=1,nd ! instead nlp1747 !AC! do il=1,ncum1748 !AC! traent(il,i,j,k)=tra(il,j,k)1749 !AC! enddo1750 !AC! enddo1751 !AC! enddo1752 !AC! enddo1817 !AC! do k=1,ntra 1818 !AC! do j=1,nd ! instead nlp 1819 !AC! do i=1,nd ! instead nlp 1820 !AC! do il=1,ncum 1821 !AC! traent(il,i,j,k)=tra(il,j,k) 1822 !AC! enddo 1823 !AC! enddo 1824 !AC! enddo 1825 !AC! enddo 1753 1826 zm(:, :) = 0. 1754 1827 1755 1756 1757 1758 1759 1828 ! ===================================================================== 1829 ! --- CALCULATE ENTRAINED AIR MASS FLUX (ment), TOTAL WATER MIXING 1830 ! --- RATIO (QENT), TOTAL CONDENSED WATER (elij), AND MIXING 1831 ! --- FRACTION (sij) 1832 ! ===================================================================== 1760 1833 1761 1834 DO i = minorig + 1, nl … … 1763 1836 DO j = minorig, nl 1764 1837 DO il = 1, ncum 1765 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)- & 1766 1)) .AND. (j<=inb(il))) THEN 1838 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (j>=(icb(il)-1)) .AND. (j<=inb(il))) THEN 1767 1839 1768 1840 rti = qnk(il) - ep(il, i)*clw(il, i) … … 1771 1843 1772 1844 IF (cvflag_ice) THEN 1773 1845 ! print*,cvflag_ice,'cvflag_ice dans do 700' 1774 1846 IF (t(il,j)<=263.15) THEN 1775 bf2 = 1. + (lf(il,j)+lv(il,j))*(lv(il,j)+frac(il,j)* lf(il,j))*&1776 rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd)1847 bf2 = 1. + (lf(il,j)+lv(il,j))*(lv(il,j)+frac(il,j)* & 1848 lf(il,j))*rs(il, j)/(rrv*t(il,j)*t(il,j)*cpd) 1777 1849 END IF 1778 1850 END IF … … 1791 1863 1792 1864 IF (cvflag_ice) THEN 1793 anum = anum - (lv(il,j)+frac(il,j)*lf(il,j))*(rti-rs(il,j)-cwat & 1794 *bf2) 1865 anum = anum - (lv(il,j)+frac(il,j)*lf(il,j))*(rti-rs(il,j)-cwat*bf2) 1795 1866 denom = denom + (lv(il,j)+frac(il,j)*lf(il,j))*(rr(il,i)-rti) 1796 1867 ELSE … … 1801 1872 IF (abs(denom)<0.01) denom = 0.01 1802 1873 sij(il, i, j) = anum/denom 1803 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - & 1804 rs(il, j) 1874 altem = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti - rs(il, j) 1805 1875 altem = altem - (bf2-1.)*cwat 1806 1876 END IF 1807 1877 IF (sij(il,i,j)>0.0 .AND. sij(il,i,j)<0.95) THEN 1808 1878 qent(il, i, j) = sij(il, i, j)*rr(il, i) + (1.-sij(il,i,j))*rti 1809 uent(il, i, j) = sij(il, i, j)*u(il, i) + & 1810 (1.-sij(il,i,j))*unk(il) 1811 vent(il, i, j) = sij(il, i, j)*v(il, i) + & 1812 (1.-sij(il,i,j))*vnk(il) 1813 ! !!! do k=1,ntra 1814 ! !!! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1815 ! !!! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1816 ! !!! end do 1879 uent(il, i, j) = sij(il, i, j)*u(il, i) + (1.-sij(il,i,j))*unk(il) 1880 vent(il, i, j) = sij(il, i, j)*v(il, i) + (1.-sij(il,i,j))*vnk(il) 1881 !!!! do k=1,ntra 1882 !!!! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1883 !!!! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1884 !!!! end do 1817 1885 elij(il, i, j) = altem 1818 1886 elij(il, i, j) = max(0.0, elij(il,i,j)) … … 1826 1894 END DO 1827 1895 1828 ! AC! do k=1,ntra 1829 ! AC! do j=minorig,nl 1830 ! AC! do il=1,ncum 1831 ! AC! if( (i.ge.icb(il)).and.(i.le.inb(il)).and. 1832 ! AC! : (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then 1833 ! AC! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1834 ! AC! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1835 ! AC! endif 1836 ! AC! enddo 1837 ! AC! enddo 1838 ! AC! enddo 1839 1840 1841 ! *** if no air can entrain at level i assume that updraft detrains 1842 ! *** 1843 ! *** at that level and calculate detrained air flux and properties 1844 ! *** 1845 1846 1847 ! @ do 170 i=icb(il),inb(il) 1896 !AC! do k=1,ntra 1897 !AC! do j=minorig,nl 1898 !AC! do il=1,ncum 1899 !AC! if( (i.ge.icb(il)).and.(i.le.inb(il)).and. 1900 !AC! : (j.ge.(icb(il)-1)).and.(j.le.inb(il)))then 1901 !AC! traent(il,i,j,k)=sij(il,i,j)*tra(il,i,k) 1902 !AC! : +(1.-sij(il,i,j))*tra(il,nk(il),k) 1903 !AC! endif 1904 !AC! enddo 1905 !AC! enddo 1906 !AC! enddo 1907 1908 1909 ! *** if no air can entrain at level i assume that updraft detrains *** 1910 ! *** at that level and calculate detrained air flux and properties *** 1911 1912 1913 ! @ do 170 i=icb(il),inb(il) 1848 1914 1849 1915 DO il = 1, ncum 1850 1916 IF ((i>=icb(il)) .AND. (i<=inb(il)) .AND. (nent(il,i)==0)) THEN 1851 1917 ! @ if(nent(il,i).eq.0)then 1852 1918 ment(il, i, i) = m(il, i) 1853 1919 qent(il, i, i) = qnk(il) - ep(il, i)*clw(il, i) … … 1855 1921 vent(il, i, i) = vnk(il) 1856 1922 elij(il, i, i) = clw(il, i) 1857 1923 ! MAF sij(il,i,i)=1.0 1858 1924 sij(il, i, i) = 0.0 1859 1925 END IF … … 1861 1927 END DO 1862 1928 1863 ! AC! do j=1,ntra 1864 ! AC! do i=minorig+1,nl 1865 ! AC! do il=1,ncum 1866 ! AC! if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) 1867 ! then 1868 ! AC! traent(il,i,i,j)=tra(il,nk(il),j) 1869 ! AC! endif 1870 ! AC! enddo 1871 ! AC! enddo 1872 ! AC! enddo 1929 !AC! do j=1,ntra 1930 !AC! do i=minorig+1,nl 1931 !AC! do il=1,ncum 1932 !AC! if (i.ge.icb(il) .and. i.le.inb(il) .and. nent(il,i).eq.0) then 1933 !AC! traent(il,i,i,j)=tra(il,nk(il),j) 1934 !AC! endif 1935 !AC! enddo 1936 !AC! enddo 1937 !AC! enddo 1873 1938 1874 1939 DO j = minorig, nl 1875 1940 DO i = minorig, nl 1876 1941 DO il = 1, ncum 1877 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. (i>=icb(il)) .AND. (i<= & 1878 inb(il))) THEN 1942 IF ((j>=(icb(il)-1)) .AND. (j<=inb(il)) .AND. (i>=icb(il)) .AND. (i<=inb(il))) THEN 1879 1943 sigij(il, i, j) = sij(il, i, j) 1880 1944 END IF … … 1882 1946 END DO 1883 1947 END DO 1884 1885 1886 1887 1888 1889 1890 1891 1948 ! @ enddo 1949 1950 ! @170 continue 1951 1952 ! ===================================================================== 1953 ! --- NORMALIZE ENTRAINED AIR MASS FLUXES 1954 ! --- TO REPRESENT EQUAL PROBABILITIES OF MIXING 1955 ! ===================================================================== 1892 1956 1893 1957 CALL zilch(asum, nloc*nd) … … 1915 1979 IF (cvflag_ice) THEN 1916 1980 1917 anum = h(il, i) - hp(il, i) - (lv(il,i)+frac(il,i)*lf(il,i))* (qp-rs&1918 (il,i)) + (cpv-cpd)*t(il, i)*(qp-rr(il,i))1919 denom = h(il, i) - hp(il, i) + (lv(il,i)+frac(il,i)*lf(il,i))* (rr(&1920 il,i)-qp) + (cpd-cpv)*t(il, i)*(rr(il,i)-qp)1981 anum = h(il, i) - hp(il, i) - (lv(il,i)+frac(il,i)*lf(il,i))* & 1982 (qp-rs(il,i)) + (cpv-cpd)*t(il, i)*(qp-rr(il,i)) 1983 denom = h(il, i) - hp(il, i) + (lv(il,i)+frac(il,i)*lf(il,i))* & 1984 (rr(il,i)-qp) + (cpd-cpv)*t(il, i)*(rr(il,i)-qp) 1921 1985 ELSE 1922 1986 1923 1987 anum = h(il, i) - hp(il, i) - lv(il, i)*(qp-rs(il,i)) + & 1924 (cpv-cpd)*t(il, i)*(qp-rr(il,i))1988 (cpv-cpd)*t(il, i)*(qp-rr(il,i)) 1925 1989 denom = h(il, i) - hp(il, i) + lv(il, i)*(rr(il,i)-qp) + & 1926 (cpd-cpv)*t(il, i)*(rr(il,i)-qp)1990 (cpd-cpv)*t(il, i)*(rr(il,i)-qp) 1927 1991 END IF 1928 1992 … … 1940 2004 num2 = 0 1941 2005 DO il = 1, ncum 1942 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 1943 il)-1) .AND. j<=inb(il) .AND. lwork(il)) num2 = num2 + 1 2006 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 2007 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 2008 lwork(il)) num2 = num2 + 1 1944 2009 END DO 1945 2010 IF (num2<=0) GO TO 175 1946 2011 1947 2012 DO il = 1, ncum 1948 IF (i>=icb(il) .AND. i<=inb(il) .AND. j>=(icb( & 1949 il)-1) .AND. j<=inb(il) .AND. lwork(il)) THEN 2013 IF (i>=icb(il) .AND. i<=inb(il) .AND. & 2014 j>=(icb(il)-1) .AND. j<=inb(il) .AND. & 2015 lwork(il)) THEN 1950 2016 1951 2017 IF (sij(il,i,j)>1.0E-16 .AND. sij(il,i,j)<0.95) THEN … … 1988 2054 DO j = minorig, nl 1989 2055 DO il = 1, ncum 1990 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&1991 il)-1) .AND. j<=inb(il)) THEN2056 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2057 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 1992 2058 ment(il, i, j) = ment(il, i, j)*asij(il) 1993 2059 END IF … … 1997 2063 DO j = minorig, nl 1998 2064 DO il = 1, ncum 1999 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&2000 il)-1) .AND. j<=inb(il)) THEN2065 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2066 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 2001 2067 asum(il, i) = asum(il, i) + ment(il, i, j) 2002 2068 ment(il, i, j) = ment(il, i, j)*sig(il, j) … … 2015 2081 DO j = minorig, nl 2016 2082 DO il = 1, ncum 2017 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&2018 il)-1) .AND. j<=inb(il)) THEN2083 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2084 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 2019 2085 ment(il, i, j) = ment(il, i, j)*asum(il, i)*bsum(il, i) 2020 2086 END IF … … 2024 2090 DO j = minorig, nl 2025 2091 DO il = 1, ncum 2026 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. j>=(icb(&2027 il)-1) .AND. j<=inb(il)) THEN2092 IF (i>=icb(il) .AND. i<=inb(il) .AND. lwork(il) .AND. & 2093 j>=(icb(il)-1) .AND. j<=inb(il)) THEN 2028 2094 csum(il, i) = csum(il, i) + ment(il, i, j) 2029 2095 END IF … … 2040 2106 vent(il, i, i) = vnk(il) 2041 2107 elij(il, i, i) = clw(il, i) 2042 2108 ! MAF sij(il,i,i)=1.0 2043 2109 sij(il, i, i) = 0.0 2044 2110 END IF 2045 2111 END DO ! il 2046 2112 2047 !AC! do j=1,ntra2048 !AC! do il=1,ncum2049 !AC! if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il)2050 !AC! : .and. csum(il,i).lt.m(il,i) ) then2051 !AC! traent(il,i,i,j)=tra(il,nk(il),j)2052 !AC! endif2053 !AC! enddo2054 !AC! enddo2113 !AC! do j=1,ntra 2114 !AC! do il=1,ncum 2115 !AC! if ( i.ge.icb(il) .and. i.le.inb(il) .and. lwork(il) 2116 !AC! : .and. csum(il,i).lt.m(il,i) ) then 2117 !AC! traent(il,i,i,j)=tra(il,nk(il),j) 2118 !AC! endif 2119 !AC! enddo 2120 !AC! enddo 2055 2121 789 END DO 2056 2122 2057 2123 ! MAF: renormalisation de MENT 2058 2124 CALL zilch(zm, nloc*na) 2059 2125 DO jm = 1, nd … … 2087 2153 END SUBROUTINE cv3_mixing 2088 2154 2089 SUBROUTINE cv3_unsat(nloc, ncum, nd, na, ntra, icb, inb, iflag, t, rr, rs, & 2090 gz, u, v, tra, p, ph, th, tv, lv, lf, cpn, ep, sigp, clw, m, ment, elij, & 2091 delt, plcl, coef_clos, mp, rp, up, vp, trap, wt, water, evap, fondue, & 2092 ice, faci, b, sigd, wdtraina, wdtrainm) ! RomP 2155 SUBROUTINE cv3_unsat(nloc, ncum, nd, na, ntra, icb, inb, iflag, & 2156 t, rr, rs, gz, u, v, tra, p, ph, & 2157 th, tv, lv, lf, cpn, ep, sigp, clw, & 2158 m, ment, elij, delt, plcl, coef_clos, & 2159 mp, rp, up, vp, trap, wt, water, evap, fondue, ice, & 2160 faci, b, sigd, & 2161 wdtrainA, wdtrainM) ! RomP 2093 2162 IMPLICIT NONE 2094 2163 … … 2098 2167 include "cvflag.h" 2099 2168 2100 !inputs:2169 !inputs: 2101 2170 INTEGER ncum, nd, na, ntra, nloc 2102 2171 INTEGER icb(nloc), inb(nloc) … … 2112 2181 REAL coef_clos(nloc) 2113 2182 2114 !input/output2183 !input/output 2115 2184 INTEGER iflag(nloc) 2116 2185 2117 !outputs:2186 !outputs: 2118 2187 REAL mp(nloc, na), rp(nloc, na), up(nloc, na), vp(nloc, na) 2119 2188 REAL water(nloc, na), evap(nloc, na), wt(nloc, na) … … 2121 2190 REAL trap(nloc, na, ntra) 2122 2191 REAL b(nloc, na), sigd(nloc) 2123 2124 ! lascendance adiabatique et des flux melanges Pa et Pm.2125 2126 2127 REAL wdtrain a(nloc, na), wdtrainm(nloc, na)2128 2129 !local variables2192 ! 25/08/10 - RomP---- ajout des masses precipitantes ejectees 2193 ! de l ascendance adiabatique et des flux melanges Pa et Pm. 2194 ! Distinction des wdtrain 2195 ! Pa = wdtrainA Pm = wdtrainM 2196 REAL wdtrainA(nloc, na), wdtrainM(nloc, na) 2197 2198 !local variables 2130 2199 INTEGER i, j, k, il, num1, ndp1 2131 2200 REAL tinv, delti, coef … … 2143 2212 2144 2213 2145 2214 ! ------------------------------------------------------ 2146 2215 2147 2216 delti = 1./delt … … 2170 2239 END DO 2171 2240 END DO 2172 !AC! do k=1,ntra2173 !AC! do i=1,nd2174 !AC! do il=1,ncum2175 !AC! trap(il,i,k)=tra(il,i,k)2176 !AC! enddo2177 !AC! enddo2178 !AC! enddo2179 !! RomP >>>2241 !AC! do k=1,ntra 2242 !AC! do i=1,nd 2243 !AC! do il=1,ncum 2244 !AC! trap(il,i,k)=tra(il,i,k) 2245 !AC! enddo 2246 !AC! enddo 2247 !AC! enddo 2248 !! RomP >>> 2180 2249 DO i = 1, nd 2181 2250 DO il = 1, ncum 2182 wdtrain a(il, i) = 0.02183 wdtrain m(il, i) = 0.02184 END DO 2185 END DO 2186 !! RomP <<<2187 2188 2189 2251 wdtrainA(il, i) = 0.0 2252 wdtrainM(il, i) = 0.0 2253 END DO 2254 END DO 2255 !! RomP <<< 2256 2257 ! *** check whether ep(inb)=0, if so, skip precipitating *** 2258 ! *** downdraft calculation *** 2190 2259 2191 2260 2192 2261 DO il = 1, ncum 2193 !! lwork(il)=.TRUE.2194 !! if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE.2262 !! lwork(il)=.TRUE. 2263 !! if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE. 2195 2264 lwork(il) = ep(il, inb(il)) >= 0.0001 2196 2265 END DO 2197 2266 2198 2267 ! *** Set the fractionnal area sigd of precipitating downdraughts 2199 2268 DO il = 1, ncum 2200 2269 sigd(il) = sigdz*coef_clos(il) … … 2202 2271 2203 2272 2204 2205 2206 2207 2208 2273 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2274 ! 2275 ! *** begin downdraft loop *** 2276 ! 2277 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2209 2278 2210 2279 DO i = nl + 1, 1, -1 … … 2219 2288 2220 2289 2221 2222 2223 2224 2225 2290 ! *** integrate liquid water equation to find condensed water *** 2291 ! *** and condensed water flux *** 2292 ! 2293 ! 2294 ! *** calculate detrained precipitation *** 2226 2295 2227 2296 DO il = 1, ncum … … 2229 2298 IF (cvflag_grav) THEN 2230 2299 wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i) 2231 wdtrain a(il, i) = wdtrain(il)/grav! Pa RomP2300 wdtrainA(il, i) = wdtrain(il)/grav ! Pa RomP 2232 2301 ELSE 2233 2302 wdtrain(il) = 10.0*ep(il, i)*m(il, i)*clw(il, i) 2234 wdtrain a(il, i) = wdtrain(il)/10.! Pa RomP2303 wdtrainA(il, i) = wdtrain(il)/10. ! Pa RomP 2235 2304 END IF 2236 2305 END IF … … 2245 2314 IF (cvflag_grav) THEN 2246 2315 wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i) 2247 wdtrain m(il, i) = wdtrain(il)/grav - wdtraina(il, i)! Pm RomP2316 wdtrainM(il, i) = wdtrain(il)/grav - wdtrainA(il, i) ! Pm RomP 2248 2317 ELSE 2249 2318 wdtrain(il) = wdtrain(il) + 10.0*awat*ment(il, j, i) 2250 wdtrain m(il, i) = wdtrain(il)/10. - wdtraina(il, i)! Pm RomP2319 wdtrainM(il, i) = wdtrain(il)/10. - wdtrainA(il, i) ! Pm RomP 2251 2320 END IF 2252 2321 END IF … … 2256 2325 2257 2326 2258 2259 2327 ! *** find rain water and evaporation using provisional *** 2328 ! *** estimates of rp(i)and rp(i-1) *** 2260 2329 2261 2330 … … 2283 2352 END IF 2284 2353 2285 rp(il, i) = rp(il, i+1) + (cpd*(t(il,i+1)-t(il,&2286 i))+gz(il,i+1)-gz(il,i))/lv(il, i)2354 rp(il, i) = rp(il, i+1) + & 2355 (cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il, i) 2287 2356 rp(il, i) = 0.5*(rp(il,i)+rr(il,i)) 2288 2357 END IF … … 2296 2365 afac = p(il, 1)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1)) 2297 2366 IF (cvflag_ice) THEN 2298 afac1 = p(il, i)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il, & 2299 1)) 2367 afac1 = p(il, i)*(rs(il,1)-rp(il,1))/(1.0E4+2000.0*p(il,1)*rs(il,1)) 2300 2368 END IF 2301 2369 ELSE 2302 rp(il, i-1) = rp(il, i) + (cpd*(t(il,i)-t(il, & 2303 i-1))+gz(il,i)-gz(il,i-1))/lv(il, i) 2370 rp(il, i-1) = rp(il, i) + (cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il, i) 2304 2371 rp(il, i-1) = 0.5*(rp(il,i-1)+rr(il,i-1)) 2305 2372 rp(il, i-1) = amin1(rp(il,i-1), rs(il,i-1)) 2306 2373 rp(il, i-1) = max(rp(il,i-1), 0.0) 2307 afac1 = p(il, i)*(rs(il,i)-rp(il,i))/(1.0E4+2000.0*p(il,i)*rs(il,i) & 2308 ) 2309 afac2 = p(il, i-1)*(rs(il,i-1)-rp(il,i-1))/ & 2310 (1.0E4+2000.0*p(il,i-1)*rs(il,i-1)) 2374 afac1 = p(il, i)*(rs(il,i)-rp(il,i))/(1.0E4+2000.0*p(il,i)*rs(il,i)) 2375 afac2 = p(il, i-1)*(rs(il,i-1)-rp(il,i-1))/(1.0E4+2000.0*p(il,i-1)*rs(il,i-1)) 2311 2376 afac = 0.5*(afac1+afac2) 2312 2377 END IF … … 2315 2380 bfac = 1./(sigd(il)*wt(il,i)) 2316 2381 2317 ! jyg12318 2319 2320 2321 2322 2323 2324 2325 2326 2382 !JYG1 2383 ! cc sigt=1.0 2384 ! cc if(i.ge.icb)sigt=sigp(i) 2385 ! prise en compte de la variation progressive de sigt dans 2386 ! les couches icb et icb-1: 2387 ! pour plcl<ph(i+1), pr1=0 & pr2=1 2388 ! pour plcl>ph(i), pr1=1 & pr2=0 2389 ! pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval 2390 ! sur le nuage, et pr2 est la proportion sous la base du 2391 ! nuage. 2327 2392 pr1 = (plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1)) 2328 2393 pr1 = max(0., min(1.,pr1)) … … 2330 2395 pr2 = max(0., min(1.,pr2)) 2331 2396 sigt = sigp(il, i)*pr1 + pr2 2332 ! jyg2 2333 2334 ! jyg---- 2335 ! b6 = bfac*100.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2336 ! c6 = water(il,i+1) + wdtrain(il)*bfac 2337 ! c6 = prec(il,i+1) + wdtrain(il)*bfac 2338 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 2339 ! evap(il,i)=sigt*afac*revap 2340 ! water(il,i)=revap*revap 2341 ! prec(il,i)=revap*revap 2342 ! c print *,' i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) 2343 ! ', 2344 ! c $ i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) 2345 ! c---end jyg--- 2346 2347 ! --------retour à la formulation originale d'Emanuel. 2397 !JYG2 2398 2399 !JYG---- 2400 ! b6 = bfac*100.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2401 ! c6 = water(il,i+1) + wdtrain(il)*bfac 2402 ! c6 = prec(il,i+1) + wdtrain(il)*bfac 2403 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 2404 ! evap(il,i)=sigt*afac*revap 2405 ! water(il,i)=revap*revap 2406 ! prec(il,i)=revap*revap 2407 !! print *,' i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) ', & 2408 !! i,b6,c6,revap,evap(il,i),water(il,i),wdtrain(il) 2409 !!---end jyg--- 2410 2411 ! --------retour à la formulation originale d'Emanuel. 2348 2412 IF (cvflag_ice) THEN 2349 2413 2350 !b6=bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac2351 ! c6=prec(il,i+1)+bfac*wdtrain(il) 2352 ! :-50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)2353 !if(c6.gt.0.0)then2354 !revap=0.5*(-b6+sqrt(b6*b6+4.*c6))2355 2356 !JAM Attention: evap=sigt*E2357 !Modification: evap devient l'évaporation en milieu de couche2358 !car nécessaire dans cv3_yield2359 !Du coup, il faut modifier pas mal d'équations...2360 !et l'expression de afac qui devient afac12361 !revap=sqrt((prec(i+1)+prec(i))/2)2414 ! b6=bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2415 ! c6=prec(il,i+1)+bfac*wdtrain(il) & 2416 ! -50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1) 2417 ! if(c6.gt.0.0)then 2418 ! revap=0.5*(-b6+sqrt(b6*b6+4.*c6)) 2419 2420 !JAM Attention: evap=sigt*E 2421 ! Modification: evap devient l'évaporation en milieu de couche 2422 ! car nécessaire dans cv3_yield 2423 ! Du coup, il faut modifier pas mal d'équations... 2424 ! et l'expression de afac qui devient afac1 2425 ! revap=sqrt((prec(i+1)+prec(i))/2) 2362 2426 2363 2427 b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac1 2364 2428 c6 = prec(il, i+1) + 0.5*bfac*wdtrain(il) 2365 2366 2367 2429 ! print *,'bfac,sigd(il),sigt,afac1 ',bfac,sigd(il),sigt,afac1 2430 ! print *,'prec(il,i+1),wdtrain(il) ',prec(il,i+1),wdtrain(il) 2431 ! print *,'b6,c6,b6*b6+4.*c6 ',b6,c6,b6*b6+4.*c6 2368 2432 IF (c6>b6*b6+1.E-20) THEN 2369 2433 revap = 2.*c6/(b6+sqrt(b6*b6+4.*c6)) … … 2372 2436 END IF 2373 2437 prec(il, i) = max(0., 2.*revap*revap-prec(il,i+1)) 2374 ! print*,prec(il,i),'neige' 2375 2376 ! jyg Dans sa formulation originale, Emanuel calcule 2377 ! l'evaporation par: 2378 ! c evap(il,i)=sigt*afac*revap 2379 ! ce qui n'est pas correct. Dans cv_routines, la formulation a été 2380 ! modifiee. 2381 ! Ici,l'evaporation evap est simplement calculee par l'equation de 2382 ! conservation. 2383 ! prec(il,i)=revap*revap 2384 ! else 2385 ! jyg---- Correction : si c6 <= 0, water(il,i)=0. 2386 ! prec(il,i)=0. 2387 ! endif 2388 2389 ! jyg--- Dans tous les cas, evaporation = [tt ce qui entre dans 2390 ! la couche i] 2391 ! moins [tt ce qui sort de la couche i] 2392 ! print *, 'evap avec ice' 2393 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(prec(il,i+1)-prec(il, & 2394 i)))/(sigd(il)*(ph(il,i)-ph(il,i+1))*100.) 2395 2396 d6 = bfac*wdtrain(il) - 100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))* & 2397 evap(il, i) 2438 ! print*,prec(il,i),'neige' 2439 2440 !JYG Dans sa formulation originale, Emanuel calcule l'evaporation par: 2441 ! c evap(il,i)=sigt*afac*revap 2442 ! ce qui n'est pas correct. Dans cv_routines, la formulation a été modifiee. 2443 ! Ici,l'evaporation evap est simplement calculee par l'equation de 2444 ! conservation. 2445 ! prec(il,i)=revap*revap 2446 ! else 2447 !JYG---- Correction : si c6 <= 0, water(il,i)=0. 2448 ! prec(il,i)=0. 2449 ! endif 2450 2451 !JYG--- Dans tous les cas, evaporation = [tt ce qui entre dans la couche i] 2452 ! moins [tt ce qui sort de la couche i] 2453 ! print *, 'evap avec ice' 2454 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(prec(il,i+1)-prec(il,i))) / & 2455 (sigd(il)*(ph(il,i)-ph(il,i+1))*100.) 2456 2457 d6 = bfac*wdtrain(il) - 100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i) 2398 2458 e6 = bfac*wdtrain(il) 2399 2459 f6 = -100.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i) … … 2415 2475 END IF 2416 2476 2417 !water(il,i)=water(il,i+1)+(1.-fraci(il,i))*e6+(1.-faci(il,i))*f62418 !water(il,i)=max(water(il,i),0.)2419 !ice(il,i)=ice(il,i+1)+fraci(il,i)*e6+faci(il,i)*f62420 !ice(il,i)=max(ice(il,i),0.)2421 !fondue(il,i)=ice(il,i)*thaw2422 !water(il,i)=water(il,i)+fondue(il,i)2423 !ice(il,i)=ice(il,i)-fondue(il,i)2424 2425 !if((water(il,i)+ice(il,i)).lt.1.e-30)then2426 !faci(il,i)=0.2427 !else2428 !faci(il,i)=ice(il,i)/(water(il,i)+ice(il,i))2429 !endif2477 ! water(il,i)=water(il,i+1)+(1.-fraci(il,i))*e6+(1.-faci(il,i))*f6 2478 ! water(il,i)=max(water(il,i),0.) 2479 ! ice(il,i)=ice(il,i+1)+fraci(il,i)*e6+faci(il,i)*f6 2480 ! ice(il,i)=max(ice(il,i),0.) 2481 ! fondue(il,i)=ice(il,i)*thaw 2482 ! water(il,i)=water(il,i)+fondue(il,i) 2483 ! ice(il,i)=ice(il,i)-fondue(il,i) 2484 2485 ! if((water(il,i)+ice(il,i)).lt.1.e-30)then 2486 ! faci(il,i)=0. 2487 ! else 2488 ! faci(il,i)=ice(il,i)/(water(il,i)+ice(il,i)) 2489 ! endif 2430 2490 2431 2491 ELSE 2432 2492 b6 = bfac*50.*sigd(il)*(ph(il,i)-ph(il,i+1))*sigt*afac 2433 c6 = water(il, i+1) + bfac*wdtrain(il) - 50.*sigd(il)*bfac*(ph(il,i&2434 )-ph(il,i+1))*evap(il, i+1)2493 c6 = water(il, i+1) + bfac*wdtrain(il) - & 2494 50.*sigd(il)*bfac*(ph(il,i)-ph(il,i+1))*evap(il, i+1) 2435 2495 IF (c6>0.0) THEN 2436 2496 revap = 0.5*(-b6+sqrt(b6*b6+4.*c6)) … … 2439 2499 water(il, i) = 0. 2440 2500 END IF 2441 2442 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(water(il, &2443 i+1)-water(il,i)))/(sigd(il)*(ph(il,i)-ph(il,i+1))*100.)2501 ! print *, 'evap sans ice' 2502 evap(il, i) = (wdtrain(il)+sigd(il)*wt(il,i)*(water(il,i+1)-water(il,i)))/ & 2503 (sigd(il)*(ph(il,i)-ph(il,i+1))*100.) 2444 2504 2445 2505 END IF 2446 2506 END IF !(i.le.inb(il) .and. lwork(il)) 2447 2507 END DO 2448 2449 2450 2451 2452 2508 ! ---------------------------------------------------------------- 2509 2510 ! cc 2511 ! *** calculate precipitating downdraft mass flux under *** 2512 ! *** hydrostatic approximation *** 2453 2513 2454 2514 DO il = 1, ncum … … 2459 2519 IF (cvflag_ice) THEN 2460 2520 IF (cvflag_grav) THEN 2461 mp(il, i) = 100.*ginv*(lvcp(il,i)*sigd(il)*tevap(il)*(p(il, & 2462 i-1)-p(il,i))/delth+lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)*(p & 2463 (il,i-1)-p(il,i))/delth+lfcp(il,i)*sigd(il)*wt(il,i)/100.* & 2464 fondue(il,i)*(p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2521 mp(il, i) = 100.*ginv*(lvcp(il,i)*sigd(il)*tevap(il)* & 2522 (p(il,i-1)-p(il,i))/delth + & 2523 lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* & 2524 (p(il,i-1)-p(il,i))/delth + & 2525 lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* & 2526 (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2465 2527 ELSE 2466 mp(il, i) = 10.*(lvcp(il,i)*sigd(il)*tevap(il)*(p(il,i-1)-p(il, & 2467 i))/delth+lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)*(p(il, & 2468 i-1)-p(il,i))/delth+lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il & 2469 ,i)*(p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2528 mp(il, i) = 10.*(lvcp(il,i)*sigd(il)*tevap(il)* & 2529 (p(il,i-1)-p(il,i))/delth + & 2530 lfcp(il,i)*sigd(il)*faci(il,i)*tevap(il)* & 2531 (p(il,i-1)-p(il,i))/delth + & 2532 lfcp(il,i)*sigd(il)*wt(il,i)/100.*fondue(il,i)* & 2533 (p(il,i-1)-p(il,i))/delth/(ph(il,i)-ph(il,i+1))) 2470 2534 2471 2535 END IF … … 2473 2537 IF (cvflag_grav) THEN 2474 2538 mp(il, i) = 100.*ginv*lvcp(il, i)*sigd(il)*tevap(il)* & 2475 (p(il,i-1)-p(il,i))/delth2539 (p(il,i-1)-p(il,i))/delth 2476 2540 ELSE 2477 2541 mp(il, i) = 10.*lvcp(il, i)*sigd(il)*tevap(il)* & 2478 (p(il,i-1)-p(il,i))/delth2542 (p(il,i-1)-p(il,i))/delth 2479 2543 END IF 2480 2544 … … 2483 2547 END IF !(i.le.inb(il) .and. lwork(il) .and. i.ne.1) 2484 2548 END DO 2485 2486 2487 2488 2489 2549 ! ---------------------------------------------------------------- 2550 2551 ! *** if hydrostatic assumption fails, *** 2552 ! *** solve cubic difference equation for downdraft theta *** 2553 ! *** and mass flux from two simultaneous differential eqns *** 2490 2554 2491 2555 DO il = 1, ncum … … 2493 2557 2494 2558 amfac = sigd(il)*sigd(il)*70.0*ph(il, i)*(p(il,i-1)-p(il,i))* & 2495 (th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))2559 (th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i)) 2496 2560 amp2 = abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i)) 2497 2561 2498 2562 IF (amp2>(0.1*amfac)) THEN 2499 2563 xf = 100.0*sigd(il)*sigd(il)*sigd(il)*(ph(il,i)-ph(il,i+1)) 2500 tf = b(il, i) - 5.0*(th(il,i)-th(il,i-1))*t(il, i) /(lvcp(il,i)*sigd&2501 (il)*th(il,i))2564 tf = b(il, i) - 5.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2565 (lvcp(il,i)*sigd(il)*th(il,i)) 2502 2566 af = xf*tf + mp(il, i+1)*mp(il, i+1)*tinv 2503 2567 2504 2568 IF (cvflag_ice) THEN 2505 2569 bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + & 2506 50.*(p(il,i-1)-p(il,i))*xf*(tevap(il)*(1.+(lf(il,i)/lv(il,i))* & 2507 faci(il,i))+(lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i)/(ph( & 2508 il,i)-ph(il,i+1))) 2570 50.*(p(il,i-1)-p(il,i))*xf*(tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + & 2571 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il,i+1))) 2509 2572 ELSE 2510 2573 2511 2574 bf = 2.*(tinv*mp(il,i+1))**3 + tinv*mp(il, i+1)*xf*tf + & 2512 50.*(p(il,i-1)-p(il,i))*xf*tevap(il)2575 50.*(p(il,i-1)-p(il,i))*xf*tevap(il) 2513 2576 END IF 2514 2577 … … 2522 2585 IF ((0.5*bf-sru)<0.0) fac = -1.0 2523 2586 mp(il, i) = mp(il, i+1)*tinv + (0.5*bf+sru)**tinv + & 2524 fac*(abs(0.5*bf-sru))**tinv2587 fac*(abs(0.5*bf-sru))**tinv 2525 2588 ELSE 2526 2589 d = atan(2.*sqrt(-ur)/(bf+1.0E-28)) … … 2532 2595 IF (cvflag_ice) THEN 2533 2596 IF (cvflag_grav) THEN 2534 ! jyg : il y a vraisemblablement une erreur dans la ligne 2 2535 ! suivante: 2536 ! il faut diviser par (mp(il,i)*sigd(il)*grav) et non par 2537 ! (mp(il,i)+sigd(il)*0.1).2538 ! Et il faut bien revoir les facteurs 100.2539 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*(tevap(il)*(&2540 1.+(lf(il,i)/lv(il,i))*faci(il,i))+(lf(il,i)/lv(il,&2541 i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il,&2542 i+1)))/(mp(il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t&2543 (il, i)/(lvcp(il,i)*sigd(il)*th(il,i))2597 !JYG : il y a vraisemblablement une erreur dans la ligne 2 suivante: 2598 ! il faut diviser par (mp(il,i)*sigd(il)*grav) et non par (mp(il,i)+sigd(il)*0.1). 2599 ! Et il faut bien revoir les facteurs 100. 2600 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))* & 2601 (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + & 2602 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / & 2603 (ph(il,i)-ph(il,i+1))) / & 2604 (mp(il,i)+sigd(il)*0.1) - & 2605 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2606 (lvcp(il,i)*sigd(il)*th(il,i)) 2544 2607 ELSE 2545 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*(tevap(il)*( & 2546 1.+(lf(il,i)/lv(il,i))*faci(il,i))+(lf(il,i)/lv(il, & 2547 i))*wt(il,i)/100.*fondue(il,i)/(ph(il,i)-ph(il, & 2548 i+1)))/(mp(il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t & 2549 (il, i)/(lvcp(il,i)*sigd(il)*th(il,i)) 2608 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*& 2609 (tevap(il)*(1.+(lf(il,i)/lv(il,i))*faci(il,i)) + & 2610 (lf(il,i)/lv(il,i))*wt(il,i)/100.*fondue(il,i) / & 2611 (ph(il,i)-ph(il,i+1))) / & 2612 (mp(il,i)+sigd(il)*0.1) - & 2613 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2614 (lvcp(il,i)*sigd(il)*th(il,i)) 2550 2615 END IF 2551 2616 ELSE 2552 2617 IF (cvflag_grav) THEN 2553 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il)/(mp & 2554 (il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t(il, i)/( & 2555 lvcp(il,i)*sigd(il)*th(il,i)) 2618 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / & 2619 (mp(il,i)+sigd(il)*0.1) - & 2620 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2621 (lvcp(il,i)*sigd(il)*th(il,i)) 2556 2622 ELSE 2557 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il)/(mp & 2558 (il,i)+sigd(il)*0.1) - 10.0*(th(il,i)-th(il,i-1))*t(il, i)/( & 2559 lvcp(il,i)*sigd(il)*th(il,i)) 2623 b(il, i-1) = b(il, i) + 100.0*(p(il,i-1)-p(il,i))*tevap(il) / & 2624 (mp(il,i)+sigd(il)*0.1) - & 2625 10.0*(th(il,i)-th(il,i-1))*t(il, i) / & 2626 (lvcp(il,i)*sigd(il)*th(il,i)) 2560 2627 END IF 2561 2628 END IF … … 2564 2631 END IF !(amp2.gt.(0.1*amfac)) 2565 2632 2566 2633 ! *** limit magnitude of mp(i) to meet cfl condition *** 2567 2634 2568 2635 ampmax = 2.0*(ph(il,i)-ph(il,i+1))*delti … … 2571 2638 mp(il, i) = min(mp(il,i), ampmax) 2572 2639 2573 ! *** force mp to decrease linearly to zero *** 2574 ! *** between cloud base and the surface *** 2575 2576 2577 ! c if(p(il,i).gt.p(il,icb(il)))then 2578 ! c 2579 ! mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il))) 2580 ! c endif 2640 ! *** force mp to decrease linearly to zero *** 2641 ! *** between cloud base and the surface *** 2642 2643 2644 ! c if(p(il,i).gt.p(il,icb(il)))then 2645 ! c mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il))) 2646 ! c endif 2581 2647 IF (ph(il,i)>0.9*plcl(il)) THEN 2582 2648 mp(il, i) = mp(il, i)*(ph(il,1)-ph(il,i))/(ph(il,1)-0.9*plcl(il)) … … 2585 2651 END IF ! (i.le.inb(il) .and. lwork(il) .and. i.ne.1) 2586 2652 END DO 2587 2588 2589 2653 ! ---------------------------------------------------------------- 2654 2655 ! *** find mixing ratio of precipitating downdraft *** 2590 2656 2591 2657 DO il = 1, ncum … … 2603 2669 2604 2670 IF (cvflag_grav) THEN 2605 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i & 2606 +1)) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+ & 2607 1)+evap(il,i)) 2671 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + & 2672 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i)) 2608 2673 ELSE 2609 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i & 2610 +1)) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il, & 2611 i)) 2674 rp(il, i) = rp(il, i+1)*mp(il, i+1) + rr(il, i)*(mp(il,i)-mp(il,i+1)) + & 2675 5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(evap(il,i+1)+evap(il,i)) 2612 2676 END IF 2613 2677 rp(il, i) = rp(il, i)/mp(il, i) 2614 up(il, i) = up(il, i+1)*mp(il, i+1) + u(il, i)*(mp(il,i)-mp(il,i+1) & 2615 ) 2678 up(il, i) = up(il, i+1)*mp(il, i+1) + u(il, i)*(mp(il,i)-mp(il,i+1)) 2616 2679 up(il, i) = up(il, i)/mp(il, i) 2617 vp(il, i) = vp(il, i+1)*mp(il, i+1) + v(il, i)*(mp(il,i)-mp(il,i+1) & 2618 ) 2680 vp(il, i) = vp(il, i+1)*mp(il, i+1) + v(il, i)*(mp(il,i)-mp(il,i+1)) 2619 2681 vp(il, i) = vp(il, i)/mp(il, i) 2620 2682 … … 2623 2685 IF (mp(il,i+1)>1.0E-16) THEN 2624 2686 IF (cvflag_grav) THEN 2625 rp(il, i) = rp(il, i+1) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(&2626 il,i+1))*(evap(il,i+1)+evap(il,i))/mp(il,i+1)2687 rp(il, i) = rp(il,i+1) + 100.*ginv*0.5*sigd(il)*(ph(il,i)-ph(il,i+1)) * & 2688 (evap(il,i+1)+evap(il,i))/mp(il,i+1) 2627 2689 ELSE 2628 rp(il, i) = rp(il, i+1) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1))*(&2629 evap(il,i+1)+evap(il,i))/mp(il, i+1)2690 rp(il, i) = rp(il,i+1) + 5.*sigd(il)*(ph(il,i)-ph(il,i+1)) * & 2691 (evap(il,i+1)+evap(il,i))/mp(il, i+1) 2630 2692 END IF 2631 2693 up(il, i) = up(il, i+1) … … 2639 2701 END IF ! (i.lt.inb(il) .and. lwork(il)) 2640 2702 END DO 2641 2642 2643 2644 2645 !AC! do j=1,ntra2646 !AC! do il = 1,ncum2647 !AC! if (i.lt.inb(il) .and. lwork(il)) then2648 !AC!c2649 !AC! if(mplus(il))then2650 !AC! trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1)2651 !AC! : +trap(il,i,j)*(mp(il,i)-mp(il,i+1))2652 !AC! trap(il,i,j)=trap(il,i,j)/mp(il,i)2653 !AC! else ! if (mplus(il))2654 !AC! if(mp(il,i+1).gt.1.0e-16)then2655 !AC! trap(il,i,j)=trap(il,i+1,j)2656 !AC! endif2657 !AC! endif ! (mplus(il)) else if (.not.mplus(il))2658 !AC!c2659 !AC! endif ! (i.lt.inb(il) .and. lwork(il))2660 !AC! enddo2661 !AC! end do2703 ! ---------------------------------------------------------------- 2704 2705 ! *** find tracer concentrations in precipitating downdraft *** 2706 2707 !AC! do j=1,ntra 2708 !AC! do il = 1,ncum 2709 !AC! if (i.lt.inb(il) .and. lwork(il)) then 2710 !AC!c 2711 !AC! if(mplus(il))then 2712 !AC! trap(il,i,j)=trap(il,i+1,j)*mp(il,i+1) 2713 !AC! : +trap(il,i,j)*(mp(il,i)-mp(il,i+1)) 2714 !AC! trap(il,i,j)=trap(il,i,j)/mp(il,i) 2715 !AC! else ! if (mplus(il)) 2716 !AC! if(mp(il,i+1).gt.1.0e-16)then 2717 !AC! trap(il,i,j)=trap(il,i+1,j) 2718 !AC! endif 2719 !AC! endif ! (mplus(il)) else if (.not.mplus(il)) 2720 !AC!c 2721 !AC! endif ! (i.lt.inb(il) .and. lwork(il)) 2722 !AC! enddo 2723 !AC! end do 2662 2724 2663 2725 400 END DO 2664 2665 2666 2667 2668 2726 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2727 2728 ! *** end of downdraft loop *** 2729 2730 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2669 2731 2670 2732 … … 2672 2734 END SUBROUTINE cv3_unsat 2673 2735 2674 SUBROUTINE cv3_yield(nloc, ncum, nd, na, ntra, icb, inb, delt, t, rr, t_wake, & 2675 rr_wake, s_wake, u, v, tra, gz, p, ph, h, hp, lv, lf, cpn, th, th_wake, & 2676 ep, clw, m, tp, mp, rp, up, vp, trap, wt, water, ice, evap, fondue, faci, & 2677 b, sigd, ment, qent, hent, iflag_mix, uent, vent, nent, elij, traent, & 2678 sig, tv, tvp, wghti, iflag, precip, vprecip, ft, fr, fu, fv, ftra, cbmf, & 2679 upwd, dnwd, dnwd0, ma, mip, tls, tps, qcondc, wd, ftd, fqd) 2736 SUBROUTINE cv3_yield(nloc, ncum, nd, na, ntra, ok_conserv_q, & 2737 icb, inb, delt, & 2738 t, rr, t_wake, rr_wake, s_wake, u, v, tra, & 2739 gz, p, ph, h, hp, lv, lf, cpn, th, th_wake, & 2740 ep, clw, m, tp, mp, rp, up, vp, trap, & 2741 wt, water, ice, evap, fondue, faci, b, sigd, & 2742 ment, qent, hent, iflag_mix, uent, vent, & 2743 nent, elij, traent, sig, & 2744 tv, tvp, wghti, & 2745 iflag, precip, Vprecip, ft, fr, fu, fv, ftra, & 2746 cbmf, upwd, dnwd, dnwd0, ma, mip, & 2747 tls, tps, qcondc, wd, & 2748 ftd, fqd) 2680 2749 2681 2750 IMPLICIT NONE … … 2686 2755 include "conema3.h" 2687 2756 2688 ! inputs: 2689 ! print*,'cv3_yield apres include' 2690 INTEGER iflag_mix 2691 INTEGER ncum, nd, na, ntra, nloc 2692 INTEGER icb(nloc), inb(nloc) 2693 REAL delt 2694 REAL t(nloc, nd), rr(nloc, nd), u(nloc, nd), v(nloc, nd) 2695 REAL t_wake(nloc, nd), rr_wake(nloc, nd) 2696 REAL s_wake(nloc) 2697 REAL tra(nloc, nd, ntra), sig(nloc, nd) 2698 REAL gz(nloc, na), ph(nloc, nd+1), h(nloc, na), hp(nloc, na) 2699 REAL th(nloc, na), p(nloc, nd), tp(nloc, na) 2700 REAL lv(nloc, na), cpn(nloc, na), ep(nloc, na), clw(nloc, na) 2701 REAL lf(nloc, na) 2702 REAL m(nloc, na), mp(nloc, na), rp(nloc, na), up(nloc, na) 2703 REAL vp(nloc, na), wt(nloc, nd), trap(nloc, nd, ntra) 2704 REAL water(nloc, na), evap(nloc, na), b(nloc, na), sigd(nloc) 2705 REAL fondue(nloc, na), faci(nloc, na), ice(nloc, na) 2706 REAL ment(nloc, na, na), qent(nloc, na, na), uent(nloc, na, na) 2707 REAL hent(nloc, na, na) 2708 ! IM bug real vent(nloc,na,na), nent(nloc,na), elij(nloc,na,na) 2709 REAL vent(nloc, na, na), elij(nloc, na, na) 2710 INTEGER nent(nloc, nd) 2711 REAL traent(nloc, na, na, ntra) 2712 REAL tv(nloc, nd), tvp(nloc, nd), wghti(nloc, nd) 2713 ! print*,'cv3_yield declarations 1' 2714 ! input/output: 2715 INTEGER iflag(nloc) 2716 2717 ! outputs: 2718 REAL precip(nloc) 2719 REAL ft(nloc, nd), fr(nloc, nd), fu(nloc, nd), fv(nloc, nd) 2720 REAL ftd(nloc, nd), fqd(nloc, nd) 2721 REAL ftra(nloc, nd, ntra) 2722 REAL upwd(nloc, nd), dnwd(nloc, nd), ma(nloc, nd) 2723 REAL dnwd0(nloc, nd), mip(nloc, nd) 2724 REAL vprecip(nloc, nd+1) 2725 REAL tls(nloc, nd), tps(nloc, nd) 2726 REAL qcondc(nloc, nd) ! cld 2727 REAL wd(nloc) ! gust 2728 REAL cbmf(nloc) 2729 ! print*,'cv3_yield declarations 2' 2730 ! local variables: 2731 INTEGER i, k, il, n, j, num1 2732 REAL rat, delti 2733 REAL ax, bx, cx, dx, ex 2734 REAL cpinv, rdcp, dpinv 2735 REAL awat(nloc) 2736 REAL lvcp(nloc, na), lfcp(nloc, na), mke(nloc, na) 2737 REAL am(nloc), work(nloc), ad(nloc), amp1(nloc) 2738 ! !! real up1(nloc), dn1(nloc) 2739 REAL up1(nloc, nd, nd), dn1(nloc, nd, nd) 2740 REAL asum(nloc), bsum(nloc), csum(nloc), dsum(nloc) 2741 REAL esum(nloc), fsum(nloc), gsum(nloc), hsum(nloc) 2742 REAL th_wake(nloc, nd) 2743 REAL alpha_qpos(nloc), alpha_qpos1(nloc) 2744 REAL qcond(nloc, nd), nqcond(nloc, nd), wa(nloc, nd) ! cld 2745 REAL siga(nloc, nd), sax(nloc, nd), mac(nloc, nd) ! cld 2746 2747 ! print*,'cv3_yield declarations 3' 2748 ! ------------------------------------------------------------- 2749 2750 ! initialization: 2757 !inputs: 2758 INTEGER iflag_mix 2759 INTEGER ncum, nd, na, ntra, nloc 2760 LOGICAL ok_conserv_q 2761 INTEGER icb(nloc), inb(nloc) 2762 REAL delt 2763 REAL t(nloc, nd), rr(nloc, nd), u(nloc, nd), v(nloc, nd) 2764 REAL t_wake(nloc, nd), rr_wake(nloc, nd) 2765 REAL s_wake(nloc) 2766 REAL tra(nloc, nd, ntra), sig(nloc, nd) 2767 REAL gz(nloc, na), ph(nloc, nd+1), h(nloc, na), hp(nloc, na) 2768 REAL th(nloc, na), p(nloc, nd), tp(nloc, na) 2769 REAL lv(nloc, na), cpn(nloc, na), ep(nloc, na), clw(nloc, na) 2770 REAL lf(nloc, na) 2771 REAL m(nloc, na), mp(nloc, na), rp(nloc, na), up(nloc, na) 2772 REAL vp(nloc, na), wt(nloc, nd), trap(nloc, nd, ntra) 2773 REAL water(nloc, na), evap(nloc, na), b(nloc, na), sigd(nloc) 2774 REAL fondue(nloc, na), faci(nloc, na), ice(nloc, na) 2775 REAL ment(nloc, na, na), qent(nloc, na, na), uent(nloc, na, na) 2776 REAL hent(nloc, na, na) 2777 !IM bug real vent(nloc,na,na), nent(nloc,na), elij(nloc,na,na) 2778 REAL vent(nloc, na, na), elij(nloc, na, na) 2779 INTEGER nent(nloc, nd) 2780 REAL traent(nloc, na, na, ntra) 2781 REAL tv(nloc, nd), tvp(nloc, nd), wghti(nloc, nd) 2782 ! 2783 !input/output: 2784 INTEGER iflag(nloc) 2785 ! 2786 !outputs: 2787 REAL precip(nloc) 2788 REAL ft(nloc, nd), fr(nloc, nd), fu(nloc, nd), fv(nloc, nd) 2789 REAL ftd(nloc, nd), fqd(nloc, nd) 2790 REAL ftra(nloc, nd, ntra) 2791 REAL upwd(nloc, nd), dnwd(nloc, nd), ma(nloc, nd) 2792 REAL dnwd0(nloc, nd), mip(nloc, nd) 2793 REAL Vprecip(nloc, nd+1) 2794 REAL tls(nloc, nd), tps(nloc, nd) 2795 REAL qcondc(nloc, nd) ! cld 2796 REAL wd(nloc) ! gust 2797 REAL cbmf(nloc) 2798 ! 2799 !local variables: 2800 INTEGER i, k, il, n, j, num1 2801 REAL rat, delti 2802 REAL ax, bx, cx, dx, ex 2803 REAL cpinv, rdcp, dpinv 2804 REAL awat(nloc) 2805 REAL lvcp(nloc, na), lfcp(nloc, na), mke(nloc, na) 2806 REAL am(nloc), work(nloc), ad(nloc), amp1(nloc) 2807 !! real up1(nloc), dn1(nloc) 2808 REAL up1(nloc, nd, nd), dn1(nloc, nd, nd) 2809 REAL asum(nloc), bsum(nloc), csum(nloc), dsum(nloc) 2810 REAL esum(nloc), fsum(nloc), gsum(nloc), hsum(nloc) 2811 REAL th_wake(nloc, nd) 2812 REAL alpha_qpos(nloc), alpha_qpos1(nloc) 2813 REAL qcond(nloc, nd), nqcond(nloc, nd), wa(nloc, nd) ! cld 2814 REAL siga(nloc, nd), sax(nloc, nd), mac(nloc, nd) ! cld 2815 2816 REAL sumdq !jyg 2817 ! 2818 ! ------------------------------------------------------------- 2819 2820 ! initialization: 2751 2821 2752 2822 delti = 1.0/delt 2753 ! print*,'cv3_yield initialisation delt', delt 2754 ! precip,Vprecip,ft,fr,fu,fv,ftra 2755 ! : ,cbmf,upwd,dnwd,dnwd0,ma,mip 2756 ! : ,tls,tps,qcondc,wd 2757 ! : ,ftd,fqd ) 2823 ! print*,'cv3_yield initialisation delt', delt 2824 ! 2758 2825 DO il = 1, ncum 2759 2826 precip(il) = 0.0 2760 vprecip(il, nd+1) = 0.02827 Vprecip(il, nd+1) = 0.0 2761 2828 wd(il) = 0.0 ! gust 2762 2829 END DO … … 2764 2831 DO i = 1, nd 2765 2832 DO il = 1, ncum 2766 vprecip(il, i) = 0.02833 Vprecip(il, i) = 0.0 2767 2834 ft(il, i) = 0.0 2768 2835 fr(il, i) = 0.0 … … 2780 2847 END DO 2781 2848 END DO 2782 2783 !AC! do j=1,ntra2784 !AC! do i=1,nd2785 !AC! do il=1,ncum2786 !AC! ftra(il,i,j)=0.02787 !AC! enddo2788 !AC! enddo2789 !AC! enddo2790 2849 ! print*,'cv3_yield initialisation 2' 2850 !AC! do j=1,ntra 2851 !AC! do i=1,nd 2852 !AC! do il=1,ncum 2853 !AC! ftra(il,i,j)=0.0 2854 !AC! enddo 2855 !AC! enddo 2856 !AC! enddo 2857 ! print*,'cv3_yield initialisation 3' 2791 2858 DO i = 1, nl 2792 2859 DO il = 1, ncum … … 2798 2865 2799 2866 2800 2867 ! *** calculate surface precipitation in mm/day *** 2801 2868 2802 2869 DO il = 1, ncum 2803 2870 IF (ep(il,inb(il))>=0.0001 .AND. iflag(il)<=1) THEN 2804 2871 IF (cvflag_ice) THEN 2805 IF (cvflag_grav) THEN 2806 precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1))*86400.* & 2807 1000./(rowl*grav) 2808 ELSE 2809 precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1))*8640. 2810 END IF 2872 precip(il) = wt(il, 1)*sigd(il)*(water(il,1)+ice(il,1)) & 2873 *86400.*1000./(rowl*grav) 2811 2874 ELSE 2812 IF (cvflag_grav) THEN 2813 precip(il) = wt(il, 1)*sigd(il)*water(il, 1)*86400.*1000./ & 2814 (rowl*grav) 2815 ELSE 2816 precip(il) = wt(il, 1)*sigd(il)*water(il, 1)*8640. 2817 END IF 2875 precip(il) = wt(il, 1)*sigd(il)*water(il, 1) & 2876 *86400.*1000./(rowl*grav) 2818 2877 END IF 2819 2878 END IF 2820 2879 END DO 2821 2822 2823 2824 2880 ! print*,'cv3_yield apres calcul precip' 2881 2882 2883 ! === calculate vertical profile of precipitation in kg/m2/s === 2825 2884 2826 2885 DO i = 1, nl … … 2828 2887 IF (ep(il,inb(il))>=0.0001 .AND. i<=inb(il) .AND. iflag(il)<=1) THEN 2829 2888 IF (cvflag_ice) THEN 2830 IF (cvflag_grav) THEN 2831 vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/grav 2832 ELSE 2833 vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/10. 2834 END IF 2889 Vprecip(il, i) = wt(il, i)*sigd(il)*(water(il,i)+ice(il,i))/grav 2835 2890 ELSE 2836 IF (cvflag_grav) THEN 2837 vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/grav 2838 ELSE 2839 vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/10. 2840 END IF 2891 Vprecip(il, i) = wt(il, i)*sigd(il)*water(il, i)/grav 2841 2892 END IF 2842 2893 END IF … … 2845 2896 2846 2897 2847 2848 2849 2850 !! do il=1,ncum2851 ! ! wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il)) 2852 ! ! :/(sigd(il)*p(il,icb(il)))2853 !! enddo2854 2855 2856 2857 2898 ! *** Calculate downdraft velocity scale *** 2899 ! *** NE PAS UTILISER POUR L'INSTANT *** 2900 2901 !! do il=1,ncum 2902 !! wd(il)=betad*abs(mp(il,icb(il)))*0.01*rrd*t(il,icb(il)) & 2903 !! /(sigd(il)*p(il,icb(il))) 2904 !! enddo 2905 2906 2907 ! *** calculate tendencies of lowest level potential temperature *** 2908 ! *** and mixing ratio *** 2858 2909 2859 2910 DO il = 1, ncum … … 2870 2921 END DO 2871 2922 2872 !print*,'cv3_yield avant ft'2873 ! AMis the part of cbmf taken from the first level2923 ! print*,'cv3_yield avant ft' 2924 ! am is the part of cbmf taken from the first level 2874 2925 DO il = 1, ncum 2875 2926 am(il) = cbmf(il)*wghti(il, 1) … … 2878 2929 DO il = 1, ncum 2879 2930 IF (iflag(il)<=1) THEN 2880 ! convect3 if((0.1*dpinv*am).ge.delti)iflag(il)=4 2881 ! jyg Correction pour conserver l'eau 2882 ! cc ft(il,1)=-0.5*lvcp(il,1)*sigd(il)*(evap(il,1)+evap(il,2)) 2883 ! !precip 2931 ! convect3 if((0.1*dpinv*am).ge.delti)iflag(il)=4 2932 !JYG Correction pour conserver l'eau 2933 ! cc ft(il,1)=-0.5*lvcp(il,1)*sigd(il)*(evap(il,1)+evap(il,2)) !precip 2884 2934 IF (cvflag_ice) THEN 2885 2935 ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1) - & 2886 lfcp(il, 1)*sigd(il)*evap(il, 1)*faci(il, 1) - &2887 lfcp(il, 1)*sigd(il)*(fondue(il,1)*wt(il,1))/(100.*(ph(il,1)-ph(il,&2888 2)))!precip2936 lfcp(il, 1)*sigd(il)*evap(il, 1)*faci(il, 1) - & 2937 lfcp(il, 1)*sigd(il)*(fondue(il,1)*wt(il,1)) / & 2938 (100.*(ph(il,1)-ph(il,2))) !precip 2889 2939 ELSE 2890 2940 ft(il, 1) = -lvcp(il, 1)*sigd(il)*evap(il, 1) 2891 2941 END IF 2892 2942 2893 IF (cvflag_grav) THEN 2894 ft(il, 1) = ft(il, 1) - 0.009*grav*sigd(il)*mp(il, 2)*t_wake(il, 1)*b & 2895 (il, 1)*work(il) 2943 ft(il, 1) = ft(il, 1) - 0.009*grav*sigd(il)*mp(il, 2)*t_wake(il, 1)*b(il, 1)*work(il) 2944 2945 IF (cvflag_ice) THEN 2946 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * & 2947 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) + & 2948 0.01*sigd(il)*wt(il, 1)*(ci-cpd)*ice(il, 2) * & 2949 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2896 2950 ELSE 2897 ft(il, 1) = ft(il, 1) - 0.09*sigd(il)*mp(il, 2)*t_wake(il, 1)*b(il, 1&2898 )*work(il)2951 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) * & 2952 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2899 2953 END IF 2900 2954 2901 IF (cvflag_ice) THEN 2902 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) & 2903 *(t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) + & 2904 0.01*sigd(il)*wt(il, 1)*(ci-cpd)*ice(il, 2)* & 2905 (t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2906 ELSE 2907 ft(il, 1) = ft(il, 1) + 0.01*sigd(il)*wt(il, 1)*(cl-cpd)*water(il, 2) & 2908 *(t_wake(il,2)-t_wake(il,1))*work(il)/cpn(il, 1) 2909 END IF 2910 2911 ftd(il, 1) = ft(il, 1) ! fin precip 2912 2913 IF (cvflag_grav) THEN !sature 2914 IF ((0.01*grav*work(il)*am(il))>=delti) iflag(il) = 1 !consist vect 2915 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*am(il)*(t(il,2)-t(il,1)+( & 2916 gz(il,2)-gz(il,1))/cpn(il,1)) 2917 ELSE 2918 IF ((0.1*work(il)*am(il))>=delti) iflag(il) = 1 !consistency vect 2919 ft(il, 1) = ft(il, 1) + 0.1*work(il)*am(il)*(t(il,2)-t(il,1)+(gz(il, & 2920 2)-gz(il,1))/cpn(il,1)) 2921 END IF 2955 ftd(il, 1) = ft(il, 1) ! fin precip 2956 2957 IF ((0.01*grav*work(il)*am(il))>=delti) iflag(il) = 1 !consist vect 2958 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*am(il) * & 2959 (t(il,2)-t(il,1)+(gz(il,2)-gz(il,1))/cpn(il,1)) 2922 2960 END IF ! iflag 2923 2961 END DO … … 2927 2965 IF (iflag_mix>0) THEN 2928 2966 DO il = 1, ncum 2929 2967 ! FH WARNING a modifier : 2930 2968 cpinv = 0. 2931 2969 ! cpinv=1.0/cpn(il,1) 2932 2970 IF (j<=inb(il) .AND. iflag(il)<=1) THEN 2933 IF (cvflag_grav) THEN 2934 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(hent( & 2935 il,j,1)-h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j, & 2936 1)))*cpinv 2937 ELSE 2938 ft(il, 1) = ft(il, 1) + 0.1*work(il)*ment(il, j, 1)*(hent(il,j,1) & 2939 -h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j,1)))*cpinv 2940 END IF ! cvflag_grav 2971 ft(il, 1) = ft(il, 1) + 0.01*grav*work(il)*ment(il, j, 1) * & 2972 (hent(il,j,1)-h(il,1)+t(il,1)*(cpv-cpd)*(rr(il,1)-qent(il,j,1)))*cpinv 2941 2973 END IF ! j 2942 2974 END DO 2943 2975 END IF 2944 2976 END DO 2945 2977 ! fin sature 2946 2978 2947 2979 2948 2980 DO il = 1, ncum 2949 2981 IF (iflag(il)<=1) THEN 2950 IF (cvflag_grav) THEN 2951 ! jyg1 Correction pour mieux conserver l'eau (conformite avec 2952 ! CONVECT4.3) 2953 fr(il, 1) = 0.01*grav*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + & 2954 sigd(il)*evap(il, 1) 2955 ! cc : +sigd(il)*0.5*(evap(il,1)+evap(il,2)) 2956 2957 fqd(il, 1) = fr(il, 1) !precip 2958 2959 fr(il, 1) = fr(il, 1) + 0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il) !sature 2960 2961 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il, & 2962 1))+am(il)*(u(il,2)-u(il,1))) 2963 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il, & 2964 1))+am(il)*(v(il,2)-v(il,1))) 2965 ELSE ! cvflag_grav 2966 fr(il, 1) = 0.1*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + & 2967 sigd(il)*evap(il, 1) 2968 ! cc : +sigd(il)*0.5*(evap(il,1)+evap(il,2)) 2969 fqd(il, 1) = fr(il, 1) !precip 2970 fr(il, 1) = fr(il, 1) + 0.1*am(il)*(rr(il,2)-rr(il,1))*work(il) 2971 fu(il, 1) = fu(il, 1) + 0.1*work(il)*(mp(il,2)*(up(il,2)-u(il, & 2972 1))+am(il)*(u(il,2)-u(il,1))) 2973 fv(il, 1) = fv(il, 1) + 0.1*work(il)*(mp(il,2)*(vp(il,2)-v(il, & 2974 1))+am(il)*(v(il,2)-v(il,1))) 2975 END IF ! cvflag_grav 2982 !JYG1 Correction pour mieux conserver l'eau (conformite avec CONVECT4.3) 2983 fr(il, 1) = 0.01*grav*mp(il, 2)*(rp(il,2)-rr_wake(il,1))*work(il) + & 2984 sigd(il)*evap(il, 1) 2985 !!! sigd(il)*0.5*(evap(il,1)+evap(il,2)) 2986 2987 fqd(il, 1) = fr(il, 1) !precip 2988 2989 fr(il, 1) = fr(il, 1) + 0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il) !sature 2990 2991 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(up(il,2)-u(il,1)) + & 2992 am(il)*(u(il,2)-u(il,1))) 2993 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*(mp(il,2)*(vp(il,2)-v(il,1)) + & 2994 am(il)*(v(il,2)-v(il,1))) 2976 2995 END IF ! iflag 2977 2996 END DO ! il 2978 2997 2979 2998 2980 !AC! do j=1,ntra2981 !AC! do il=1,ncum2982 !AC! if (iflag(il) .le. 1) then2983 !AC! if (cvflag_grav) then2984 !AC! ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il)2985 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))2986 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j)))2987 !AC! else2988 !AC! ftra(il,1,j)=ftra(il,1,j)+0.1*work(il)2989 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j))2990 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j)))2991 !AC! endif2992 !AC! endif ! iflag2993 !AC! enddo2994 !AC! enddo2999 !AC! do j=1,ntra 3000 !AC! do il=1,ncum 3001 !AC! if (iflag(il) .le. 1) then 3002 !AC! if (cvflag_grav) then 3003 !AC! ftra(il,1,j)=ftra(il,1,j)+0.01*grav*work(il) 3004 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j)) 3005 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j))) 3006 !AC! else 3007 !AC! ftra(il,1,j)=ftra(il,1,j)+0.1*work(il) 3008 !AC! : *(mp(il,2)*(trap(il,2,j)-tra(il,1,j)) 3009 !AC! : +am(il)*(tra(il,2,j)-tra(il,1,j))) 3010 !AC! endif 3011 !AC! endif ! iflag 3012 !AC! enddo 3013 !AC! enddo 2995 3014 2996 3015 DO j = 2, nl 2997 3016 DO il = 1, ncum 2998 3017 IF (j<=inb(il) .AND. iflag(il)<=1) THEN 2999 IF (cvflag_grav) THEN 3000 fr(il, 1) = fr(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(qent(il, & 3001 j,1)-rr(il,1)) 3002 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(uent(il, & 3003 j,1)-u(il,1)) 3004 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(vent(il, & 3005 j,1)-v(il,1)) 3006 ELSE ! cvflag_grav 3007 fr(il, 1) = fr(il, 1) + 0.1*work(il)*ment(il, j, 1)*(qent(il,j,1)- & 3008 rr(il,1)) 3009 fu(il, 1) = fu(il, 1) + 0.1*work(il)*ment(il, j, 1)*(uent(il,j,1)-u & 3010 (il,1)) 3011 fv(il, 1) = fv(il, 1) + 0.1*work(il)*ment(il, j, 1)*(vent(il,j,1)-v & 3012 (il,1)) ! fin sature 3013 END IF ! cvflag_grav 3018 fr(il, 1) = fr(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(qent(il,j,1)-rr(il,1)) 3019 fu(il, 1) = fu(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(uent(il,j,1)-u(il,1)) 3020 fv(il, 1) = fv(il, 1) + 0.01*grav*work(il)*ment(il, j, 1)*(vent(il,j,1)-v(il,1)) 3014 3021 END IF ! j 3015 3022 END DO 3016 3023 END DO 3017 3024 3018 !AC! do k=1,ntra3019 !AC! do j=2,nl3020 !AC! do il=1,ncum3021 !AC! if (j.le.inb(il) .and. iflag(il) .le. 1) then3022 !AC!3023 !AC! if (cvflag_grav) then3024 !AC! ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1)3025 !AC! : *(traent(il,j,1,k)-tra(il,1,k))3026 !AC! else3027 !AC! ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1)3028 !AC! : *(traent(il,j,1,k)-tra(il,1,k))3029 !AC! endif3030 !AC!3031 !AC! endif3032 !AC! enddo3033 !AC! enddo3034 !AC! enddo3035 3036 3037 3038 3039 3040 3041 3025 !AC! do k=1,ntra 3026 !AC! do j=2,nl 3027 !AC! do il=1,ncum 3028 !AC! if (j.le.inb(il) .and. iflag(il) .le. 1) then 3029 !AC! 3030 !AC! if (cvflag_grav) then 3031 !AC! ftra(il,1,k)=ftra(il,1,k)+0.01*grav*work(il)*ment(il,j,1) 3032 !AC! : *(traent(il,j,1,k)-tra(il,1,k)) 3033 !AC! else 3034 !AC! ftra(il,1,k)=ftra(il,1,k)+0.1*work(il)*ment(il,j,1) 3035 !AC! : *(traent(il,j,1,k)-tra(il,1,k)) 3036 !AC! endif 3037 !AC! 3038 !AC! endif 3039 !AC! enddo 3040 !AC! enddo 3041 !AC! enddo 3042 ! print*,'cv3_yield apres ft' 3043 3044 ! *** calculate tendencies of potential temperature and mixing ratio *** 3045 ! *** at levels above the lowest level *** 3046 3047 ! *** first find the net saturated updraft and downdraft mass fluxes *** 3048 ! *** through each level *** 3042 3049 3043 3050 … … 3060 3067 END IF 3061 3068 ELSE 3062 3069 ! AMP1 is the part of cbmf taken from layers I and lower 3063 3070 IF (k<=i) THEN 3064 3071 amp1(il) = amp1(il) + cbmf(il)*wghti(il, k) … … 3093 3100 cpinv = 1.0/cpn(il, i) 3094 3101 3095 ! convect3 if((0.1*dpinv*amp1).ge.delti)iflag(il)=4 3096 IF (cvflag_grav) THEN 3097 IF ((0.01*grav*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto 3098 ELSE 3099 IF ((0.1*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto 3100 END IF 3101 3102 ! precip 3103 ! cc ft(il,i)= 3104 ! -0.5*sigd(il)*lvcp(il,i)*(evap(il,i)+evap(il,i+1)) 3102 ! convect3 if((0.1*dpinv*amp1).ge.delti)iflag(il)=4 3103 IF ((0.01*grav*dpinv*amp1(il))>=delti) iflag(il) = 1 ! vecto 3104 3105 ! precip 3106 ! cc ft(il,i)= -0.5*sigd(il)*lvcp(il,i)*(evap(il,i)+evap(il,i+1)) 3105 3107 IF (cvflag_ice) THEN 3106 3108 ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) - & 3107 sigd(il)*lfcp(il, i)*evap(il, i)*faci(il, i) - & 3108 sigd(il)*lfcp(il, i)*fondue(il, i)*wt(il, i)/(100.*(p(il, & 3109 i-1)-p(il,i))) 3109 sigd(il)*lfcp(il, i)*evap(il, i)*faci(il, i) - & 3110 sigd(il)*lfcp(il, i)*fondue(il, i)*wt(il, i)/(100.*(p(il,i-1)-p(il,i))) 3110 3111 ELSE 3111 3112 ft(il, i) = -sigd(il)*lvcp(il, i)*evap(il, i) … … 3114 3115 rat = cpn(il, i-1)*cpinv 3115 3116 3116 IF (cvflag_grav) THEN 3117 ft(il, i) = ft(il, i) - 0.009*grav*sigd(il)*(mp(il,i+1)*t_wake(il,i & 3118 )*b(il,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv 3119 IF (cvflag_ice) THEN 3120 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3121 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + & 3122 0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1)* & 3123 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3124 ELSE 3125 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3126 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3127 END IF 3128 3129 ftd(il, i) = ft(il, i) 3130 ! fin precip 3131 3132 ! sature 3133 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*(amp1(il)*(t(il,i+1)-t(il, & 3134 i)+(gz(il,i+1)-gz(il,i))*cpinv)-ad(il)*(t(il,i)-t(il, & 3135 i-1)+(gz(il,i)-gz(il,i-1))*cpinv)) 3136 3137 3138 IF (iflag_mix==0) THEN 3139 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, i, i)*(hp(il,i)- & 3140 h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv 3141 END IF 3142 3143 ELSE ! cvflag_grav 3144 ft(il, i) = ft(il, i) - 0.09*sigd(il)*(mp(il,i+1)*t_wake(il,i)*b(il & 3145 ,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv 3146 3147 IF (cvflag_ice) THEN 3148 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3149 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + & 3150 0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1)* & 3151 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3152 ELSE 3153 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il & 3154 , i+1)*(t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3155 END IF 3156 3157 ftd(il, i) = ft(il, i) 3158 ! fin precip 3159 3160 ! sature 3161 ft(il, i) = ft(il, i) + 0.1*dpinv*(amp1(il)*(t(il,i+1)-t(il, & 3162 i)+(gz(il,i+1)-gz(il,i))*cpinv)-ad(il)*(t(il,i)-t(il, & 3163 i-1)+(gz(il,i)-gz(il,i-1))*cpinv)) 3164 3165 3166 IF (iflag_mix==0) THEN 3167 ft(il, i) = ft(il, i) + 0.1*dpinv*ment(il, i, i)*(hp(il,i)-h(il,i & 3168 )+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv 3169 END IF 3170 END IF ! cvflag_grav 3171 3172 3173 IF (cvflag_grav) THEN 3174 ! sb: on ne fait pas encore la correction permettant de mieux 3175 ! conserver l'eau: 3176 ! jyg: correction permettant de mieux conserver l'eau: 3177 ! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1)) 3178 fr(il, i) = sigd(il)*evap(il, i) + 0.01*grav*(mp(il,i+1)*(rp(il, & 3179 i+1)-rr_wake(il,i))-mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv 3180 fqd(il, i) = fr(il, i) ! precip 3181 3182 fu(il, i) = 0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il, & 3183 i))-mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv 3184 fv(il, i) = 0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il, & 3185 i))-mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv 3186 ELSE ! cvflag_grav 3187 ! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1)) 3188 fr(il, i) = sigd(il)*evap(il, i) + 0.1*(mp(il,i+1)*(rp(il, & 3189 i+1)-rr_wake(il,i))-mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv 3190 fqd(il, i) = fr(il, i) ! precip 3191 3192 fu(il, i) = 0.1*(mp(il,i+1)*(up(il,i+1)-u(il,i))-mp(il,i)*(up(il, & 3193 i)-u(il,i-1)))*dpinv 3194 fv(il, i) = 0.1*(mp(il,i+1)*(vp(il,i+1)-v(il,i))-mp(il,i)*(vp(il, & 3195 i)-v(il,i-1)))*dpinv 3196 END IF ! cvflag_grav 3197 3198 3199 IF (cvflag_grav) THEN 3200 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*(amp1(il)*(rr(il, & 3201 i+1)-rr(il,i))-ad(il)*(rr(il,i)-rr(il,i-1))) 3202 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il, & 3203 i))-ad(il)*(u(il,i)-u(il,i-1))) 3204 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il, & 3205 i))-ad(il)*(v(il,i)-v(il,i-1))) 3206 ELSE ! cvflag_grav 3207 fr(il, i) = fr(il, i) + 0.1*dpinv*(amp1(il)*(rr(il,i+1)-rr(il, & 3208 i))-ad(il)*(rr(il,i)-rr(il,i-1))) 3209 fu(il, i) = fu(il, i) + 0.1*dpinv*(amp1(il)*(u(il,i+1)-u(il, & 3210 i))-ad(il)*(u(il,i)-u(il,i-1))) 3211 fv(il, i) = fv(il, i) + 0.1*dpinv*(amp1(il)*(v(il,i+1)-v(il, & 3212 i))-ad(il)*(v(il,i)-v(il,i-1))) 3213 END IF ! cvflag_grav 3117 ft(il, i) = ft(il, i) - 0.009*grav*sigd(il) * & 3118 (mp(il,i+1)*t_wake(il,i)*b(il,i)-mp(il,i)*t_wake(il,i-1)*rat*b(il,i-1))*dpinv 3119 IF (cvflag_ice) THEN 3120 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * & 3121 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv + & 3122 0.01*sigd(il)*wt(il, i)*(ci-cpd)*ice(il, i+1) * & 3123 (t_wake(il,i+1)-t_wake(il,i))*dpinv*cpinv 3124 ELSE 3125 ft(il, i) = ft(il, i) + 0.01*sigd(il)*wt(il, i)*(cl-cpd)*water(il, i+1) * & 3126 (t_wake(il,i+1)-t_wake(il,i))*dpinv* & 3127 cpinv 3128 END IF 3129 3130 ftd(il, i) = ft(il, i) 3131 ! fin precip 3132 3133 ! sature 3134 ft(il, i) = ft(il, i) + 0.01*grav*dpinv * & 3135 (amp1(il)*(t(il,i+1)-t(il,i) + (gz(il,i+1)-gz(il,i))*cpinv) - & 3136 ad(il)*(t(il,i)-t(il,i-1)+(gz(il,i)-gz(il,i-1))*cpinv)) 3137 3138 3139 IF (iflag_mix==0) THEN 3140 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, i, i)*(hp(il,i)-h(il,i) + & 3141 t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,i,i)))*cpinv 3142 END IF 3143 3144 3145 3146 ! sb: on ne fait pas encore la correction permettant de mieux 3147 ! conserver l'eau: 3148 !JYG: correction permettant de mieux conserver l'eau: 3149 ! cc fr(il,i)=0.5*sigd(il)*(evap(il,i)+evap(il,i+1)) 3150 fr(il, i) = sigd(il)*evap(il, i) + 0.01*grav*(mp(il,i+1)*(rp(il,i+1)-rr_wake(il,i)) - & 3151 mp(il,i)*(rp(il,i)-rr_wake(il,i-1)))*dpinv 3152 fqd(il, i) = fr(il, i) ! precip 3153 3154 fu(il, i) = 0.01*grav*(mp(il,i+1)*(up(il,i+1)-u(il,i)) - & 3155 mp(il,i)*(up(il,i)-u(il,i-1)))*dpinv 3156 fv(il, i) = 0.01*grav*(mp(il,i+1)*(vp(il,i+1)-v(il,i)) - & 3157 mp(il,i)*(vp(il,i)-v(il,i-1)))*dpinv 3158 3159 3160 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i)) - & 3161 ad(il)*(rr(il,i)-rr(il,i-1))) 3162 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*(amp1(il)*(u(il,i+1)-u(il,i)) - & 3163 ad(il)*(u(il,i)-u(il,i-1))) 3164 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*(amp1(il)*(v(il,i+1)-v(il,i)) - & 3165 ad(il)*(v(il,i)-v(il,i-1))) 3214 3166 3215 3167 END IF ! i 3216 3168 END DO 3217 3169 3218 !AC! do k=1,ntra3219 !AC! do il=1,ncum3220 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then3221 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3222 !AC! cpinv=1.0/cpn(il,i)3223 !AC! if (cvflag_grav) then3224 !AC! ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv3225 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))3226 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))3227 !AC! else3228 !AC! ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv3229 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k))3230 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k)))3231 !AC! endif3232 !AC! endif3233 !AC! enddo3234 !AC! enddo3170 !AC! do k=1,ntra 3171 !AC! do il=1,ncum 3172 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then 3173 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3174 !AC! cpinv=1.0/cpn(il,i) 3175 !AC! if (cvflag_grav) then 3176 !AC! ftra(il,i,k)=ftra(il,i,k)+0.01*grav*dpinv 3177 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k)) 3178 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k))) 3179 !AC! else 3180 !AC! ftra(il,i,k)=ftra(il,i,k)+0.1*dpinv 3181 !AC! : *(amp1(il)*(tra(il,i+1,k)-tra(il,i,k)) 3182 !AC! : -ad(il)*(tra(il,i,k)-tra(il,i-1,k))) 3183 !AC! endif 3184 !AC! endif 3185 !AC! enddo 3186 !AC! enddo 3235 3187 3236 3188 DO k = 1, i - 1 … … 3246 3198 dpinv = 1.0/(ph(il,i)-ph(il,i+1)) 3247 3199 cpinv = 1.0/cpn(il, i) 3248 IF (cvflag_grav) THEN 3249 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(hent(il & 3250 ,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k, & 3251 i)))*cpinv 3252 3253 3254 3255 ELSE 3256 ft(il, i) = ft(il, i) + 0.1*dpinv*ment(il, k, i)*(hent(il,k,i)- & 3257 h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k, & 3258 i)))*cpinv 3259 END IF !cvflag_grav 3200 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & 3201 (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)+awat(il)-qent(il,k,i)))*cpinv 3202 ! 3203 ! 3260 3204 END IF ! i 3261 3205 END DO … … 3266 3210 dpinv = 1.0/(ph(il,i)-ph(il,i+1)) 3267 3211 cpinv = 1.0/cpn(il, i) 3268 IF (cvflag_grav) THEN 3269 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k & 3270 ,i)-awat(il)-rr(il,i)) 3271 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k & 3272 ,i)-u(il,i)) 3273 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k & 3274 ,i)-v(il,i)) 3275 ELSE ! cvflag_grav 3276 fr(il, i) = fr(il, i) + 0.1*dpinv*ment(il, k, i)*(qent(il,k,i)- & 3277 awat(il)-rr(il,i)) 3278 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k & 3279 ,i)-u(il,i)) 3280 fv(il, i) = fv(il, i) + 0.1*dpinv*ment(il, k, i)*(vent(il,k,i)-v( & 3281 il,i)) 3282 END IF ! cvflag_grav 3283 3284 ! (saturated updrafts resulting from mixing) ! cld 3285 qcond(il, i) = qcond(il, i) + (elij(il,k,i)-awat(il)) ! cld 3212 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & 3213 (qent(il,k,i)-awat(il)-rr(il,i)) 3214 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i)) 3215 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i)) 3216 3217 ! (saturated updrafts resulting from mixing) ! cld 3218 qcond(il, i) = qcond(il, i) + (elij(il,k,i)-awat(il)) ! cld 3286 3219 nqcond(il, i) = nqcond(il, i) + 1. ! cld 3287 3220 END IF ! i … … 3289 3222 END DO 3290 3223 3291 !AC! do j=1,ntra3292 !AC! do k=1,i-13293 !AC! do il=1,ncum3294 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then3295 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3296 !AC! cpinv=1.0/cpn(il,i)3297 !AC! if (cvflag_grav) then3298 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)3299 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3300 !AC! else3301 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)3302 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3303 !AC! endif3304 !AC! endif3305 !AC! enddo3306 !AC! enddo3307 !AC! enddo3224 !AC! do j=1,ntra 3225 !AC! do k=1,i-1 3226 !AC! do il=1,ncum 3227 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then 3228 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3229 !AC! cpinv=1.0/cpn(il,i) 3230 !AC! if (cvflag_grav) then 3231 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i) 3232 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3233 !AC! else 3234 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i) 3235 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3236 !AC! endif 3237 !AC! endif 3238 !AC! enddo 3239 !AC! enddo 3240 !AC! enddo 3308 3241 3309 3242 DO k = i, nl + 1 … … 3314 3247 dpinv = 1.0/(ph(il,i)-ph(il,i+1)) 3315 3248 cpinv = 1.0/cpn(il, i) 3316 IF (cvflag_grav) THEN 3317 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(hent(il & 3318 ,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k, & 3319 i)))*cpinv 3320 3321 3322 ELSE 3323 ft(il, i) = ft(il, i) + 0.1*dpinv*ment(il, k, i)*(hent(il,k,i)- & 3324 h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k,i)))*cpinv 3325 END IF !cvflag_grav 3249 ft(il, i) = ft(il, i) + 0.01*grav*dpinv*ment(il, k, i) * & 3250 (hent(il,k,i)-h(il,i)+t(il,i)*(cpv-cpd)*(rr(il,i)-qent(il,k,i)))*cpinv 3251 3252 3326 3253 END IF ! i 3327 3254 END DO … … 3333 3260 cpinv = 1.0/cpn(il, i) 3334 3261 3335 IF (cvflag_grav) THEN 3336 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k & 3337 ,i)-rr(il,i)) 3338 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k & 3339 ,i)-u(il,i)) 3340 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k & 3341 ,i)-v(il,i)) 3342 ELSE ! cvflag_grav 3343 fr(il, i) = fr(il, i) + 0.1*dpinv*ment(il, k, i)*(qent(il,k,i)-rr & 3344 (il,i)) 3345 fu(il, i) = fu(il, i) + 0.1*dpinv*ment(il, k, i)*(uent(il,k,i)-u( & 3346 il,i)) 3347 fv(il, i) = fv(il, i) + 0.1*dpinv*ment(il, k, i)*(vent(il,k,i)-v( & 3348 il,i)) 3349 END IF ! cvflag_grav 3262 fr(il, i) = fr(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(qent(il,k,i)-rr(il,i)) 3263 fu(il, i) = fu(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(uent(il,k,i)-u(il,i)) 3264 fv(il, i) = fv(il, i) + 0.01*grav*dpinv*ment(il, k, i)*(vent(il,k,i)-v(il,i)) 3350 3265 END IF ! i and k 3351 3266 END DO 3352 3267 END DO 3353 3268 3354 !AC! do j=1,ntra3355 !AC! do k=i,nl+13356 !AC! do il=1,ncum3357 !AC! if (i.le.inb(il) .and. k.le.inb(il)3358 !AC! $ .and. iflag(il) .le. 1) then3359 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3360 !AC! cpinv=1.0/cpn(il,i)3361 !AC! if (cvflag_grav) then3362 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i)3363 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3364 !AC! else3365 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i)3366 !AC! : *(traent(il,k,i,j)-tra(il,i,j))3367 !AC! endif3368 !AC! endif ! i and k3369 !AC! enddo3370 !AC! enddo3371 !AC! enddo3372 3373 ! sb: interface with the cloud parameterization:! cld3269 !AC! do j=1,ntra 3270 !AC! do k=i,nl+1 3271 !AC! do il=1,ncum 3272 !AC! if (i.le.inb(il) .and. k.le.inb(il) 3273 !AC! $ .and. iflag(il) .le. 1) then 3274 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3275 !AC! cpinv=1.0/cpn(il,i) 3276 !AC! if (cvflag_grav) then 3277 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv*ment(il,k,i) 3278 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3279 !AC! else 3280 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv*ment(il,k,i) 3281 !AC! : *(traent(il,k,i,j)-tra(il,i,j)) 3282 !AC! endif 3283 !AC! endif ! i and k 3284 !AC! enddo 3285 !AC! enddo 3286 !AC! enddo 3287 3288 ! sb: interface with the cloud parameterization: ! cld 3374 3289 3375 3290 DO k = i + 1, nl 3376 3291 DO il = 1, ncum 3377 IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld3378 ! (saturated downdrafts resulting from mixing)! cld3379 qcond(il, i) = qcond(il, i) + elij(il, k, i) ! cld3292 IF (k<=inb(il) .AND. i<=inb(il) .AND. iflag(il)<=1) THEN ! cld 3293 ! (saturated downdrafts resulting from mixing) ! cld 3294 qcond(il, i) = qcond(il, i) + elij(il, k, i) ! cld 3380 3295 nqcond(il, i) = nqcond(il, i) + 1. ! cld 3381 3296 END IF ! cld … … 3383 3298 END DO ! cld 3384 3299 3385 ! (particular case: no detraining level is found)! cld3386 DO il = 1, ncum ! cld3387 IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld3388 qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld3389 nqcond(il, i) = nqcond(il, i) + 1. ! cld3390 END IF ! cld3391 END DO ! cld3392 3393 DO il = 1, ncum ! cld3394 IF (i<=inb(il) .AND. nqcond(il,i)/=0 .AND. iflag(il)<=1) THEN ! cld3395 qcond(il, i) = qcond(il, i)/nqcond(il, i) ! cld3396 END IF ! cld3397 END DO 3398 3399 !AC! do j=1,ntra3400 !AC! do il=1,ncum3401 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then3402 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1))3403 !AC! cpinv=1.0/cpn(il,i)3404 !AC!3405 !AC! if (cvflag_grav) then3406 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv3407 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))3408 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))3409 !AC! else3410 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv3411 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j))3412 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j)))3413 !AC! endif3414 !AC! endif ! i3415 !AC! enddo3416 !AC! enddo3300 ! (particular case: no detraining level is found) ! cld 3301 DO il = 1, ncum ! cld 3302 IF (i<=inb(il) .AND. nent(il,i)==0 .AND. iflag(il)<=1) THEN ! cld 3303 qcond(il, i) = qcond(il, i) + (1.-ep(il,i))*clw(il, i) ! cld 3304 nqcond(il, i) = nqcond(il, i) + 1. ! cld 3305 END IF ! cld 3306 END DO ! cld 3307 3308 DO il = 1, ncum ! cld 3309 IF (i<=inb(il) .AND. nqcond(il,i)/=0 .AND. iflag(il)<=1) THEN ! cld 3310 qcond(il, i) = qcond(il, i)/nqcond(il, i) ! cld 3311 END IF ! cld 3312 END DO 3313 3314 !AC! do j=1,ntra 3315 !AC! do il=1,ncum 3316 !AC! if (i.le.inb(il) .and. iflag(il) .le. 1) then 3317 !AC! dpinv=1.0/(ph(il,i)-ph(il,i+1)) 3318 !AC! cpinv=1.0/cpn(il,i) 3319 !AC! 3320 !AC! if (cvflag_grav) then 3321 !AC! ftra(il,i,j)=ftra(il,i,j)+0.01*grav*dpinv 3322 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j)) 3323 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j))) 3324 !AC! else 3325 !AC! ftra(il,i,j)=ftra(il,i,j)+0.1*dpinv 3326 !AC! : *(mp(il,i+1)*(trap(il,i+1,j)-tra(il,i,j)) 3327 !AC! : -mp(il,i)*(trap(il,i,j)-trap(il,i-1,j))) 3328 !AC! endif 3329 !AC! endif ! i 3330 !AC! enddo 3331 !AC! enddo 3417 3332 3418 3333 3419 3334 500 END DO 3420 3335 3421 3422 ! *** move the detrainment at level inb down to level inb-1 *** 3423 ! *** in such a way as to preserve the vertically *** 3424 ! *** integrated enthalpy and water tendencies *** 3425 3426 ! Correction bug le 18-03-09 3336 !JYG< 3337 !Conservation de l'eau 3338 ! sumdq = 0. 3339 ! DO k = 1, nl 3340 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 3341 ! END DO 3342 ! PRINT *, 'cv3_yield, apres 500, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 3343 !JYG> 3344 ! *** move the detrainment at level inb down to level inb-1 *** 3345 ! *** in such a way as to preserve the vertically *** 3346 ! *** integrated enthalpy and water tendencies *** 3347 3348 ! Correction bug le 18-03-09 3427 3349 DO il = 1, ncum 3428 3350 IF (iflag(il)<=1) THEN 3429 IF (cvflag_grav) THEN 3430 ax = 0.01*grav*ment(il, inb(il), inb(il))*(hp(il,inb(il))-h(il,inb(il & 3431 ))+t(il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il), & 3432 inb(il))))/(cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))) 3433 ft(il, inb(il)) = ft(il, inb(il)) - ax 3434 ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il, & 3435 inb(il))-ph(il,inb(il)+1))/(cpn(il,inb(il)-1)*(ph(il, & 3436 inb(il)-1)-ph(il,inb(il)))) 3437 3438 bx = 0.01*grav*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))- & 3439 rr(il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3440 fr(il, inb(il)) = fr(il, inb(il)) - bx 3441 fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb( & 3442 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3443 3444 cx = 0.01*grav*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u & 3445 (il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3446 fu(il, inb(il)) = fu(il, inb(il)) - cx 3447 fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb( & 3448 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3449 3450 dx = 0.01*grav*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v & 3451 (il,inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3452 fv(il, inb(il)) = fv(il, inb(il)) - dx 3453 fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb( & 3454 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3455 ELSE 3456 ax = 0.1*ment(il, inb(il), inb(il))*(hp(il,inb(il))-h(il,inb(il))+t( & 3457 il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il), & 3458 inb(il))))/(cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))) 3459 ft(il, inb(il)) = ft(il, inb(il)) - ax 3460 ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il, & 3461 inb(il))-ph(il,inb(il)+1))/(cpn(il,inb(il)-1)*(ph(il, & 3462 inb(il)-1)-ph(il,inb(il)))) 3463 3464 bx = 0.1*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))-rr(il, & 3465 inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3466 fr(il, inb(il)) = fr(il, inb(il)) - bx 3467 fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb( & 3468 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3469 3470 cx = 0.1*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u(il, & 3471 inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3472 fu(il, inb(il)) = fu(il, inb(il)) - cx 3473 fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb( & 3474 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3475 3476 dx = 0.1*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v(il, & 3477 inb(il)))/(ph(il,inb(il))-ph(il,inb(il)+1)) 3478 fv(il, inb(il)) = fv(il, inb(il)) - dx 3479 fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb( & 3480 il)+1))/(ph(il,inb(il)-1)-ph(il,inb(il))) 3481 END IF 3351 ax = 0.01*grav*ment(il, inb(il), inb(il))* & 3352 (hp(il,inb(il))-h(il,inb(il))+t(il,inb(il))*(cpv-cpd)*(rr(il,inb(il))-qent(il,inb(il),inb(il))))/ & 3353 (cpn(il,inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))) 3354 ft(il, inb(il)) = ft(il, inb(il)) - ax 3355 ft(il, inb(il)-1) = ft(il, inb(il)-1) + ax*cpn(il, inb(il))*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3356 (cpn(il,inb(il)-1)*(ph(il,inb(il)-1)-ph(il,inb(il)))) 3357 3358 bx = 0.01*grav*ment(il, inb(il), inb(il))*(qent(il,inb(il),inb(il))-rr(il,inb(il)))/ & 3359 (ph(il,inb(il))-ph(il,inb(il)+1)) 3360 fr(il, inb(il)) = fr(il, inb(il)) - bx 3361 fr(il, inb(il)-1) = fr(il, inb(il)-1) + bx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3362 (ph(il,inb(il)-1)-ph(il,inb(il))) 3363 3364 cx = 0.01*grav*ment(il, inb(il), inb(il))*(uent(il,inb(il),inb(il))-u(il,inb(il)))/ & 3365 (ph(il,inb(il))-ph(il,inb(il)+1)) 3366 fu(il, inb(il)) = fu(il, inb(il)) - cx 3367 fu(il, inb(il)-1) = fu(il, inb(il)-1) + cx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3368 (ph(il,inb(il)-1)-ph(il,inb(il))) 3369 3370 dx = 0.01*grav*ment(il, inb(il), inb(il))*(vent(il,inb(il),inb(il))-v(il,inb(il)))/ & 3371 (ph(il,inb(il))-ph(il,inb(il)+1)) 3372 fv(il, inb(il)) = fv(il, inb(il)) - dx 3373 fv(il, inb(il)-1) = fv(il, inb(il)-1) + dx*(ph(il,inb(il))-ph(il,inb(il)+1))/ & 3374 (ph(il,inb(il)-1)-ph(il,inb(il))) 3482 3375 END IF !iflag 3483 3376 END DO 3484 3377 3485 ! AC! do j=1,ntra 3486 ! AC! do il=1,ncum 3487 ! AC! IF (iflag(il) .le. 1) THEN 3488 ! AC! IF (cvflag_grav) then 3489 ! AC! ex=0.01*grav*ment(il,inb(il),inb(il)) 3490 ! AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3491 ! AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3492 ! AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3493 ! AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3494 ! AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3495 ! AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3496 ! AC! else 3497 ! AC! ex=0.1*ment(il,inb(il),inb(il)) 3498 ! AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3499 ! AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3500 ! AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3501 ! AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3502 ! AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3503 ! AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3504 ! AC! ENDIF !cvflag grav 3505 ! AC! ENDIF !iflag 3506 ! AC! enddo 3507 ! AC! enddo 3508 3509 3510 ! *** homogenize tendencies below cloud base *** 3378 !JYG< 3379 !Conservation de l'eau 3380 ! sumdq = 0. 3381 ! DO k = 1, nl 3382 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 3383 ! END DO 3384 ! PRINT *, 'cv3_yield, apres 503, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 3385 !JYG> 3386 3387 !AC! do j=1,ntra 3388 !AC! do il=1,ncum 3389 !AC! IF (iflag(il) .le. 1) THEN 3390 !AC! IF (cvflag_grav) then 3391 !AC! ex=0.01*grav*ment(il,inb(il),inb(il)) 3392 !AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3393 !AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3394 !AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3395 !AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3396 !AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3397 !AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3398 !AC! else 3399 !AC! ex=0.1*ment(il,inb(il),inb(il)) 3400 !AC! : *(traent(il,inb(il),inb(il),j)-tra(il,inb(il),j)) 3401 !AC! : /(ph(i l,inb(il))-ph(il,inb(il)+1)) 3402 !AC! ftra(il,inb(il),j)=ftra(il,inb(il),j)-ex 3403 !AC! ftra(il,inb(il)-1,j)=ftra(il,inb(il)-1,j) 3404 !AC! : +ex*(ph(il,inb(il))-ph(il,inb(il)+1)) 3405 !AC! : /(ph(il,inb(il)-1)-ph(il,inb(il))) 3406 !AC! ENDIF !cvflag grav 3407 !AC! ENDIF !iflag 3408 !AC! enddo 3409 !AC! enddo 3410 3411 3412 ! *** homogenize tendencies below cloud base *** 3511 3413 3512 3414 … … 3522 3424 END DO 3523 3425 3524 !do i=1,nl3525 !do il=1,ncum3526 !th_wake(il,i)=t_wake(il,i)*(1000.0/p(il,i))**rdcp3527 !enddo3528 !enddo3426 !do i=1,nl 3427 !do il=1,ncum 3428 !th_wake(il,i)=t_wake(il,i)*(1000.0/p(il,i))**rdcp 3429 !enddo 3430 !enddo 3529 3431 3530 3432 DO i = 1, nl 3531 3433 DO il = 1, ncum 3532 3434 IF (i<=(icb(il)-1) .AND. iflag(il)<=1) THEN 3533 !jyg Saturated part : use T profile3435 !jyg Saturated part : use T profile 3534 3436 asum(il) = asum(il) + (ft(il,i)-ftd(il,i))*(ph(il,i)-ph(il,i+1)) 3535 bsum(il) = bsum(il) + (fr(il,i)-fqd(il,i))*(lv(il,i)+(cl-cpd)*(t(il, & 3536 i)-t(il,1)))*(ph(il,i)-ph(il,i+1)) 3537 csum(il) = csum(il) + (lv(il,i)+(cl-cpd)*(t(il,i)-t(il, & 3538 1)))*(ph(il,i)-ph(il,i+1)) 3437 !jyg<20140311 3438 !Correction pour conserver l eau 3439 IF (ok_conserv_q) THEN 3440 bsum(il) = bsum(il) + (fr(il,i)-fqd(il,i))*(ph(il,i)-ph(il,i+1)) 3441 csum(il) = csum(il) + (ph(il,i)-ph(il,i+1)) 3442 3443 ELSE 3444 bsum(il)=bsum(il)+(fr(il,i)-fqd(il,i))*(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* & 3445 (ph(il,i)-ph(il,i+1)) 3446 csum(il)=csum(il)+(lv(il,i)+(cl-cpd)*(t(il,i)-t(il,1)))* & 3447 (ph(il,i)-ph(il,i+1)) 3448 ENDIF ! (ok_conserv_q) 3449 !jyg> 3539 3450 dsum(il) = dsum(il) + t(il, i)*(ph(il,i)-ph(il,i+1))/th(il, i) 3540 !jyg Unsaturated part : use T_wake profile3451 !jyg Unsaturated part : use T_wake profile 3541 3452 esum(il) = esum(il) + ftd(il, i)*(ph(il,i)-ph(il,i+1)) 3542 fsum(il) = fsum(il) + fqd(il, i)*(lv(il,i)+(cl-cpd)*(t_wake(il, & 3543 i)-t_wake(il,1)))*(ph(il,i)-ph(il,i+1)) 3544 gsum(il) = gsum(il) + (lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il, & 3545 1)))*(ph(il,i)-ph(il,i+1)) 3546 hsum(il) = hsum(il) + t_wake(il, i)*(ph(il,i)-ph(il,i+1))/th_wake(il, & 3547 i) 3453 !jyg<20140311 3454 !Correction pour conserver l eau 3455 IF (ok_conserv_q) THEN 3456 fsum(il) = fsum(il) + fqd(il, i)*(ph(il,i)-ph(il,i+1)) 3457 gsum(il) = gsum(il) + (ph(il,i)-ph(il,i+1)) 3458 ELSE 3459 fsum(il)=fsum(il)+fqd(il,i)*(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* & 3460 (ph(il,i)-ph(il,i+1)) 3461 gsum(il)=gsum(il)+(lv(il,i)+(cl-cpd)*(t_wake(il,i)-t_wake(il,1)))* & 3462 (ph(il,i)-ph(il,i+1)) 3463 ENDIF ! (ok_conserv_q) 3464 !jyg> 3465 hsum(il) = hsum(il) + t_wake(il, i)*(ph(il,i)-ph(il,i+1))/th_wake(il, i) 3548 3466 END IF 3549 3467 END DO 3550 3468 END DO 3551 3469 3552 !!!! do 700 i=1,icb(il)-13470 !!!! do 700 i=1,icb(il)-1 3553 3471 DO i = 1, nl 3554 3472 DO il = 1, ncum … … 3562 3480 END DO 3563 3481 3564 3565 ! *** Check that moisture stays positive. If not, scale tendencies 3566 ! in order to ensure moisture positivity 3482 !jyg< 3483 !Conservation de l'eau 3484 !! sumdq = 0. 3485 !! DO k = 1, nl 3486 !! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 3487 !! END DO 3488 !! PRINT *, 'cv3_yield, apres hom, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 3489 !jyg> 3490 3491 3492 ! *** Check that moisture stays positive. If not, scale tendencies 3493 ! in order to ensure moisture positivity 3567 3494 DO il = 1, ncum 3568 3495 alpha_qpos(il) = 1. 3569 3496 IF (iflag(il)<=1) THEN 3570 3497 IF (fr(il,1)<=0.) THEN 3571 alpha_qpos(il) = max(alpha_qpos(il), (-delt*fr(il, & 3572 1))/(s_wake(il)*rr_wake(il,1)+(1.-s_wake(il))*rr(il,1))) 3498 alpha_qpos(il) = max(alpha_qpos(il), (-delt*fr(il,1))/(s_wake(il)*rr_wake(il,1)+(1.-s_wake(il))*rr(il,1))) 3573 3499 END IF 3574 3500 END IF … … 3578 3504 IF (iflag(il)<=1) THEN 3579 3505 IF (fr(il,i)<=0.) THEN 3580 alpha_qpos1(il) = max(1., (-delt*fr(il,i))/(s_wake(il)*rr_wake(il, & 3581 i)+(1.-s_wake(il))*rr(il,i))) 3582 IF (alpha_qpos1(il)>=alpha_qpos(il)) alpha_qpos(il) & 3583 = alpha_qpos1(il) 3506 alpha_qpos1(il) = max(1., (-delt*fr(il,i))/(s_wake(il)*rr_wake(il,i)+(1.-s_wake(il))*rr(il,i))) 3507 IF (alpha_qpos1(il)>=alpha_qpos(il)) alpha_qpos(il) = alpha_qpos1(il) 3584 3508 END IF 3585 3509 END IF … … 3608 3532 m(il, i) = m(il, i)/alpha_qpos(il) 3609 3533 mp(il, i) = mp(il, i)/alpha_qpos(il) 3610 vprecip(il, i) = vprecip(il, i)/alpha_qpos(il)3534 Vprecip(il, i) = vprecip(il, i)/alpha_qpos(il) 3611 3535 END IF 3612 3536 END DO … … 3622 3546 END DO 3623 3547 3624 !AC! DO j = 1,ntra3625 !AC! DO i = 1,nl3626 !AC! DO il = 1,ncum3627 !AC! IF (iflag(il) .le. 1) THEN3628 !AC! ftra(il,i,j) = ftra(il,i,j)/alpha_qpos(il)3629 !AC! ENDIF3630 !AC! ENDDO3631 !AC! ENDDO3632 !AC! ENDDO3633 3634 3635 3548 !AC! DO j = 1,ntra 3549 !AC! DO i = 1,nl 3550 !AC! DO il = 1,ncum 3551 !AC! IF (iflag(il) .le. 1) THEN 3552 !AC! ftra(il,i,j) = ftra(il,i,j)/alpha_qpos(il) 3553 !AC! ENDIF 3554 !AC! ENDDO 3555 !AC! ENDDO 3556 !AC! ENDDO 3557 3558 3559 ! *** reset counter and return *** 3636 3560 3637 3561 DO il = 1, ncum … … 3702 3626 END IF 3703 3627 END IF 3704 3628 ! c print *,'cbmf',il,i,k,cbmf(il),wghti(il,k) 3705 3629 END DO 3706 3630 END DO … … 3710 3634 DO k = i, nl 3711 3635 DO il = 1, ncum 3712 ! test if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) 3713 ! then 3636 ! test if (i.ge.icb(il).and.i.le.inb(il).and.k.le.inb(il)) then 3714 3637 IF (i<=inb(il) .AND. k<=inb(il)) THEN 3715 3638 upwd(il, i) = upwd(il, i) + up1(il, k, i) 3716 3639 dnwd(il, i) = dnwd(il, i) + dn1(il, k, i) 3717 3640 END IF 3718 ! c print 3719 ! *,'upwd',il,i,k,inb(il),upwd(il,i),m(il,k),up1(il,k,i) 3641 ! c print *,'upwd',il,i,k,inb(il),upwd(il,i),m(il,k),up1(il,k,i) 3720 3642 END DO 3721 3643 END DO … … 3723 3645 3724 3646 3725 !!!! DO il=1,ncum3726 !!!! do i=icb(il),inb(il)3727 !!!!3728 !!!! upwd(il,i)=0.03729 !!!! dnwd(il,i)=0.03730 !!!! do k=i,inb(il)3731 !!!! up1=0.03732 !!!! dn1=0.03733 !!!! do n=1,i-13734 !!!! up1=up1+ment(il,n,k)3735 !!!! dn1=dn1-ment(il,k,n)3736 !!!! enddo3737 !!!! upwd(il,i)=upwd(il,i)+m(il,k)+up13738 !!!! dnwd(il,i)=dnwd(il,i)+dn13739 !!!! enddo3740 !!!! enddo3741 !!!!3742 !!!! ENDDO3743 3744 3745 3746 3747 3647 !!!! DO il=1,ncum 3648 !!!! do i=icb(il),inb(il) 3649 !!!! 3650 !!!! upwd(il,i)=0.0 3651 !!!! dnwd(il,i)=0.0 3652 !!!! do k=i,inb(il) 3653 !!!! up1=0.0 3654 !!!! dn1=0.0 3655 !!!! do n=1,i-1 3656 !!!! up1=up1+ment(il,n,k) 3657 !!!! dn1=dn1-ment(il,k,n) 3658 !!!! enddo 3659 !!!! upwd(il,i)=upwd(il,i)+m(il,k)+up1 3660 !!!! dnwd(il,i)=dnwd(il,i)+dn1 3661 !!!! enddo 3662 !!!! enddo 3663 !!!! 3664 !!!! ENDDO 3665 3666 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3667 ! determination de la variation de flux ascendant entre 3668 ! deux niveau non dilue mip 3669 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3748 3670 3749 3671 DO i = 1, nl … … 3787 3709 END DO 3788 3710 3789 3790 3791 3792 3711 ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3712 ! icb represente de niveau ou se trouve la 3713 ! base du nuage , et inb le top du nuage 3714 ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3793 3715 3794 3716 DO i = 1, nd … … 3800 3722 DO i = 1, nd 3801 3723 DO il = 1, ncum 3802 rdcp = (rrd*(1.-rr(il,i))-rr(il,i)*rrv)/(cpd*(1.-rr(il, & 3803 i))+rr(il,i)*cpv) 3724 rdcp = (rrd*(1.-rr(il,i))-rr(il,i)*rrv)/(cpd*(1.-rr(il,i))+rr(il,i)*cpv) 3804 3725 tls(il, i) = t(il, i)*(1000.0/p(il,i))**rdcp 3805 3726 tps(il, i) = tp(il, i) … … 3808 3729 3809 3730 3810 ! *** diagnose the in-cloud mixing ratio ***! cld3811 ! *** of condensed water ***! cld3812 ! ! cld 3813 3814 DO i = 1, nd ! cld3815 DO il = 1, ncum ! cld3816 mac(il, i) = 0.0 ! cld3817 wa(il, i) = 0.0 ! cld3818 siga(il, i) = 0.0 ! cld3819 sax(il, i) = 0.0 ! cld3820 END DO ! cld3821 END DO ! cld3822 3823 DO i = minorig, nl ! cld3824 DO k = i + 1, nl + 1 ! cld3825 DO il = 1, ncum ! cld3731 ! *** diagnose the in-cloud mixing ratio *** ! cld 3732 ! *** of condensed water *** ! cld 3733 !! cld 3734 3735 DO i = 1, nd ! cld 3736 DO il = 1, ncum ! cld 3737 mac(il, i) = 0.0 ! cld 3738 wa(il, i) = 0.0 ! cld 3739 siga(il, i) = 0.0 ! cld 3740 sax(il, i) = 0.0 ! cld 3741 END DO ! cld 3742 END DO ! cld 3743 3744 DO i = minorig, nl ! cld 3745 DO k = i + 1, nl + 1 ! cld 3746 DO il = 1, ncum ! cld 3826 3747 IF (i<=inb(il) .AND. k<=(inb(il)+1) .AND. iflag(il)<=1) THEN ! cld 3827 mac(il, i) = mac(il, i) + m(il, k) ! cld3828 END IF ! cld3829 END DO ! cld3830 END DO ! cld3831 END DO ! cld3832 3833 DO i = 1, nl ! cld3834 DO j = 1, i ! cld3835 DO il = 1, ncum ! cld3836 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld3837 .AND. j>=icb(il) .AND. iflag(il)<=1) THEN ! cld3838 sax(il, i) = sax(il, i) + rrd*(tvp(il,j)-tv(il,j)) & ! cld3839 *(ph(il,j)-ph(il,j+1))/p(il, j) ! cld3840 END IF ! cld3841 END DO ! cld3842 END DO ! cld3843 END DO ! cld3844 3845 DO i = 1, nl ! cld3846 DO il = 1, ncum ! cld3847 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld3848 .AND. sax(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld3849 wa(il, i) = sqrt(2.*sax(il,i)) ! cld3850 END IF ! cld3851 END DO ! cld3852 END DO ! cld3853 3854 DO i = 1, nl ! cld3855 DO il = 1, ncum ! cld3856 IF (wa(il,i)>0.0 .AND. iflag(il)<=1) & ! cld3857 siga(il, i) = mac(il, i)/wa(il, i) & ! cld3858 *rrd*tvp(il, i)/p(il, i)/100./delta ! cld3859 siga(il, i) = min(siga(il,i), 1.0) ! cld3860 ! IM cf. FH 3861 IF (iflag_clw==0) THEN 3862 qcondc(il, i) = siga(il, i)*clw(il, i)*(1.-ep(il,i)) & ! cld3863 +(1.-siga(il,i))*qcond(il, i) ! cld3864 ELSE IF (iflag_clw==1) THEN 3865 qcondc(il, i) = qcond(il, i) ! cld3866 END IF 3867 3868 END DO ! cld3869 END DO 3870 3871 ! cld 3748 mac(il, i) = mac(il, i) + m(il, k) ! cld 3749 END IF ! cld 3750 END DO ! cld 3751 END DO ! cld 3752 END DO ! cld 3753 3754 DO i = 1, nl ! cld 3755 DO j = 1, i ! cld 3756 DO il = 1, ncum ! cld 3757 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld 3758 .AND. j>=icb(il) .AND. iflag(il)<=1) THEN ! cld 3759 sax(il, i) = sax(il, i) + rrd*(tvp(il,j)-tv(il,j)) & ! cld 3760 *(ph(il,j)-ph(il,j+1))/p(il, j) ! cld 3761 END IF ! cld 3762 END DO ! cld 3763 END DO ! cld 3764 END DO ! cld 3765 3766 DO i = 1, nl ! cld 3767 DO il = 1, ncum ! cld 3768 IF (i>=icb(il) .AND. i<=(inb(il)-1) & ! cld 3769 .AND. sax(il,i)>0.0 .AND. iflag(il)<=1) THEN ! cld 3770 wa(il, i) = sqrt(2.*sax(il,i)) ! cld 3771 END IF ! cld 3772 END DO ! cld 3773 END DO ! cld 3774 3775 DO i = 1, nl ! cld 3776 DO il = 1, ncum ! cld 3777 IF (wa(il,i)>0.0 .AND. iflag(il)<=1) & ! cld 3778 siga(il, i) = mac(il, i)/wa(il, i) & ! cld 3779 *rrd*tvp(il, i)/p(il, i)/100./delta ! cld 3780 siga(il, i) = min(siga(il,i), 1.0) ! cld 3781 ! IM cf. FH 3782 IF (iflag_clw==0) THEN ! cld 3783 qcondc(il, i) = siga(il, i)*clw(il, i)*(1.-ep(il,i)) & ! cld 3784 +(1.-siga(il,i))*qcond(il, i) ! cld 3785 ELSE IF (iflag_clw==1) THEN ! cld 3786 qcondc(il, i) = qcond(il, i) ! cld 3787 END IF ! cld 3788 3789 END DO ! cld 3790 END DO 3791 ! print*,'cv3_yield fin' 3792 3872 3793 RETURN 3873 3794 END SUBROUTINE cv3_yield 3874 3795 3875 ! AC! et !RomP >>> 3876 SUBROUTINE cv3_tracer(nloc, len, ncum, nd, na, ment, sigij, da, phi, phi2, & 3877 d1a, dam, ep, vprecip, elij, clw, epmlmmm, eplamm, icb, inb) 3796 !AC! et !RomP >>> 3797 SUBROUTINE cv3_tracer(nloc, len, ncum, nd, na, & 3798 ment, sigij, da, phi, phi2, d1a, dam, & 3799 ep, Vprecip, elij, clw, epmlmMm, eplaMm, & 3800 icb, inb) 3878 3801 IMPLICIT NONE 3879 3802 3880 3803 include "cv3param.h" 3881 3804 3882 !inputs:3805 !inputs: 3883 3806 INTEGER ncum, nd, na, nloc, len 3884 3807 REAL ment(nloc, na, na), sigij(nloc, na, na) … … 3886 3809 REAL ep(nloc, na) 3887 3810 INTEGER icb(nloc), inb(nloc) 3888 REAL vprecip(nloc, nd+1)3889 !ouputs:3811 REAL Vprecip(nloc, nd+1) 3812 !ouputs: 3890 3813 REAL da(nloc, na), phi(nloc, na, na) 3891 3814 REAL phi2(nloc, na, na) 3892 3815 REAL d1a(nloc, na), dam(nloc, na) 3893 REAL epmlm mm(nloc, na, na), eplamm(nloc, na)3894 3895 !local variables:3816 REAL epmlmMm(nloc, na, na), eplaMm(nloc, na) 3817 ! variables pour tracer dans precip de l'AA et des mel 3818 !local variables: 3896 3819 INTEGER i, j, k 3897 3820 REAL epm(nloc, na, na) 3898 3821 3899 3900 3901 3902 3903 3904 3905 3906 3822 ! variables d'Emanuel : du second indice au troisieme 3823 ! ---> tab(i,k,j) -> de l origine k a l arrivee j 3824 ! ment, sigij, elij 3825 ! variables personnelles : du troisieme au second indice 3826 ! ---> tab(i,j,k) -> de k a j 3827 ! phi, phi2 3828 3829 ! initialisations 3907 3830 3908 3831 da(:, :) = 0. … … 3910 3833 dam(:, :) = 0. 3911 3834 epm(:, :, :) = 0. 3912 epla mm(:, :) = 0.3913 epmlm mm(:, :, :) = 0.3835 eplaMm(:, :) = 0. 3836 epmlmMm(:, :, :) = 0. 3914 3837 phi(:, :, :) = 0. 3915 3838 phi2(:, :, :) = 0. 3916 3839 3917 3918 3840 ! fraction deau condensee dans les melanges convertie en precip : epm 3841 ! et eau condensée précipitée dans masse d'air saturé : l_m*dM_m/dzdz.dzdz 3919 3842 DO j = 1, na 3920 3843 DO k = 1, na 3921 3844 DO i = 1, ncum 3922 IF (k>=icb(i) .AND. k<=inb(i) .AND. & ! !jyg &3923 !j.ge.k.and.j.le.inb(i)) then3924 !!jyg epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j)3845 IF (k>=icb(i) .AND. k<=inb(i) .AND. & 3846 !!jyg j.ge.k.and.j.le.inb(i)) then 3847 !!jyg epm(i,j,k)=1.-(1.-ep(i,j))*clw(i,j)/elij(i,k,j) 3925 3848 j>k .AND. j<=inb(i)) THEN 3926 3849 epm(i, j, k) = 1. - (1.-ep(i,j))*clw(i, j)/max(elij(i,k,j), 1.E-16) 3927 !!3850 !! 3928 3851 epm(i, j, k) = max(epm(i,j,k), 0.0) 3929 3852 END IF … … 3937 3860 DO i = 1, ncum 3938 3861 IF (k>=icb(i) .AND. k<=inb(i)) THEN 3939 epla mm(i, j) = eplamm(i, j) + ep(i, j)*clw(i, j)*ment(i, j, k)*(1.-&3940 sigij(i,j,k))3862 eplaMm(i, j) = eplamm(i, j) + & 3863 ep(i, j)*clw(i, j)*ment(i, j, k)*(1.-sigij(i,j,k)) 3941 3864 END IF 3942 3865 END DO … … 3948 3871 DO i = 1, ncum 3949 3872 IF (k>=icb(i) .AND. k<=inb(i) .AND. j<=inb(i)) THEN 3950 epmlm mm(i, j, k) = epm(i, j, k)*elij(i, k, j)*ment(i, k, j)3873 epmlmMm(i, j, k) = epm(i, j, k)*elij(i, k, j)*ment(i, k, j) 3951 3874 END IF 3952 3875 END DO … … 3954 3877 END DO 3955 3878 3956 3879 ! matrices pour calculer la tendance des concentrations dans cvltr.F90 3957 3880 DO j = 1, na 3958 3881 DO k = 1, na … … 3962 3885 d1a(i, j) = d1a(i, j) + ment(i, k, j)*ep(i, k)*(1.-sigij(i,k,j)) 3963 3886 IF (k<=j) THEN 3964 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1. & 3965 -sigij(i,k,j)) 3966 3887 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1.-sigij(i,k,j)) 3967 3888 phi2(i, j, k) = phi(i, j, k)*epm(i, j, k) 3968 3889 END IF … … 3973 3894 RETURN 3974 3895 END SUBROUTINE cv3_tracer 3975 ! AC! et !RomP <<< 3976 3977 SUBROUTINE cv3_uncompress(nloc, len, ncum, nd, ntra, idcum, iflag, precip, & 3978 sig, w0, ft, fq, fu, fv, ftra, ma, upwd, dnwd, dnwd0, qcondc, wd, cape, & 3979 iflag1, precip1, sig1, w01, ft1, fq1, fu1, fv1, ftra1, ma1, upwd1, dnwd1, & 3980 dnwd01, qcondc1, wd1, cape1) 3896 !AC! et !RomP <<< 3897 3898 SUBROUTINE cv3_uncompress(nloc, len, ncum, nd, ntra, idcum, & 3899 iflag, & 3900 precip, sig, w0, & 3901 ft, fq, fu, fv, ftra, & 3902 Ma, upwd, dnwd, dnwd0, qcondc, wd, cape, & 3903 iflag1, & 3904 precip1, sig1, w01, & 3905 ft1, fq1, fu1, fv1, ftra1, & 3906 Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, cape1) 3981 3907 IMPLICIT NONE 3982 3908 3983 3909 include "cv3param.h" 3984 3910 3985 !inputs:3911 !inputs: 3986 3912 INTEGER len, ncum, nd, ntra, nloc 3987 3913 INTEGER idcum(nloc) … … 3996 3922 REAL wd(nloc), cape(nloc) 3997 3923 3998 !outputs:3924 !outputs: 3999 3925 INTEGER iflag1(len) 4000 3926 REAL precip1(len) … … 4007 3933 REAL wd1(nloc), cape1(nloc) 4008 3934 4009 !local variables:3935 !local variables: 4010 3936 INTEGER i, k, j 4011 3937 … … 4038 3964 4039 3965 4040 ! AC! do 2100 j=1,ntra 4041 ! AC!c oct3 do 2110 k=1,nl 4042 ! AC! do 2110 k=1,nd ! oct3 4043 ! AC! do 2120 i=1,ncum 4044 ! AC! ftra1(idcum(i),k,j)=ftra(i,k,j) 4045 ! AC! 2120 continue 4046 ! AC! 2110 continue 4047 ! AC! 2100 continue 3966 !AC! do 2100 j=1,ntra 3967 !AC!c oct3 do 2110 k=1,nl 3968 !AC! do 2110 k=1,nd ! oct3 3969 !AC! do 2120 i=1,ncum 3970 !AC! ftra1(idcum(i),k,j)=ftra(i,k,j) 3971 !AC! 2120 continue 3972 !AC! 2110 continue 3973 !AC! 2100 continue 3974 ! 4048 3975 RETURN 4049 3976 END SUBROUTINE cv3_uncompress
Note: See TracChangeset
for help on using the changeset viewer.