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