Changeset 5117 for LMDZ6/branches/Amaury_dev/libf/phylmd/calltherm.F90
- Timestamp:
- Jul 24, 2024, 4:23:34 PM (2 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/phylmd/calltherm.F90
r5116 r5117 34 34 USE lmdz_abort_physic, ONLY: abort_physic 35 35 #ifdef ISO 36 useinfotrac_phy, ONLY: ntiso36 USE infotrac_phy, ONLY: ntiso 37 37 #ifdef ISOVERIF 38 38 USE isotopes_mod, ONLY: iso_eau,iso_HDO … … 66 66 REAL pplay(klon,klev) 67 67 REAL pphi(klon,klev) 68 real zlev(klon,klev+1)68 REAL zlev(klon,klev+1) 69 69 !test: on sort lentr et a* pour alimenter KE 70 70 REAL wght_th(klon,klev) … … 75 75 REAL d_t_ajs(klon,klev), d_q_ajs(klon,klev) 76 76 REAL d_u_ajs(klon,klev),d_v_ajs(klon,klev) 77 realfm_therm(klon,klev+1)78 realentr_therm(klon,klev),detr_therm(klon,klev)77 REAL fm_therm(klon,klev+1) 78 REAL entr_therm(klon,klev),detr_therm(klon,klev) 79 79 80 80 !******************************************************** 81 81 ! declarations 82 82 LOGICAL flag_bidouille_stratocu 83 realfmc_therm(klon,klev+1),zqasc(klon,klev)84 realzqla(klon,klev)85 realztv(klon,klev),ztva(klon,klev)86 realzpspsk(klon,klev)87 realztla(klon,klev)88 realzthl(klon,klev)89 realwmax_sec(klon)90 realzcong(klon)91 realzmax_sec(klon)92 realf_sec(klon)93 realdetrc_therm(klon,klev)83 REAL fmc_therm(klon,klev+1),zqasc(klon,klev) 84 REAL zqla(klon,klev) 85 REAL ztv(klon,klev),ztva(klon,klev) 86 REAL zpspsk(klon,klev) 87 REAL ztla(klon,klev) 88 REAL zthl(klon,klev) 89 REAL wmax_sec(klon) 90 REAL zcong(klon) 91 REAL zmax_sec(klon) 92 REAL f_sec(klon) 93 REAL detrc_therm(klon,klev) 94 94 ! FH WARNING : il semble que ces save ne servent a rien 95 95 ! save fmc_therm, detrc_therm 96 realclwcon0(klon,klev)97 realzqsat(klon,klev)98 realzw_sec(klon,klev+1)99 integerlmix_sec(klon)100 integerlmax(klon)101 realratqscth(klon,klev)102 realratqsdiff(klon,klev)103 real zqsatth(klon,klev)96 REAL clwcon0(klon,klev) 97 REAL zqsat(klon,klev) 98 REAL zw_sec(klon,klev+1) 99 INTEGER lmix_sec(klon) 100 INTEGER lmax(klon) 101 REAL ratqscth(klon,klev) 102 REAL ratqsdiff(klon,klev) 103 REAL zqsatth(klon,klev) 104 104 !nouvelles variables pour la convection 105 realale_bl(klon)106 realalp_bl(klon)107 realale(klon)108 realalp(klon)105 REAL ale_bl(klon) 106 REAL alp_bl(klon) 107 REAL ale(klon) 108 REAL alp(klon) 109 109 !RC 110 110 !on garde le zmax du pas de temps precedent 111 realzmax0(klon), f0(klon)111 REAL zmax0(klon), f0(klon) 112 112 113 113 !!! nrlmd le 10/04/2012 114 realpbl_tke(klon,klev+1,nbsrf)115 realpctsrf(klon,nbsrf)116 realomega(klon,klev)117 realairephy(klon)118 realzlcl_th(klon),fraca0(klon),w0(klon),w_conv(klon)119 realtherm_tke_max0(klon),env_tke_max0(klon)120 realn2(klon),s2(klon),strig(klon)121 realale_bl_stat(klon)122 realtherm_tke_max(klon,klev),env_tke_max(klon,klev)123 realalp_bl_det(klon),alp_bl_fluct_m(klon),alp_bl_fluct_tke(klon),alp_bl_conv(klon),alp_bl_stat(klon)114 REAL pbl_tke(klon,klev+1,nbsrf) 115 REAL pctsrf(klon,nbsrf) 116 REAL omega(klon,klev) 117 REAL airephy(klon) 118 REAL zlcl_th(klon),fraca0(klon),w0(klon),w_conv(klon) 119 REAL therm_tke_max0(klon),env_tke_max0(klon) 120 REAL n2(klon),s2(klon),strig(klon) 121 REAL ale_bl_stat(klon) 122 REAL therm_tke_max(klon,klev),env_tke_max(klon,klev) 123 REAL alp_bl_det(klon),alp_bl_fluct_m(klon),alp_bl_fluct_tke(klon),alp_bl_conv(klon),alp_bl_stat(klon) 124 124 !!! fin nrlmd le 10/04/2012 125 125 126 126 !******************************************************** 127 127 128 real, dimension(klon) :: pcon129 real, dimension(klon,klev) :: rhobarz,wth3130 integer,dimension(klon) :: lalim131 real, dimension(klon,klev+1) :: fm132 real, dimension(klon,klev) :: alim_star133 real, dimension(klon) :: zmax128 REAL, DIMENSION(klon) :: pcon 129 REAL, DIMENSION(klon,klev) :: rhobarz,wth3 130 INTEGER,DIMENSION(klon) :: lalim 131 REAL, DIMENSION(klon,klev+1) :: fm 132 REAL, DIMENSION(klon,klev) :: alim_star 133 REAL, DIMENSION(klon) :: zmax 134 134 135 135 … … 140 140 REAL d_u_the(klon,klev),d_v_the(klon,klev) 141 141 142 realzfm_therm(klon,klev+1),zdt143 realzentr_therm(klon,klev),zdetr_therm(klon,klev)142 REAL zfm_therm(klon,klev+1),zdt 143 REAL zentr_therm(klon,klev),zdetr_therm(klon,klev) 144 144 ! FH A VERIFIER : SAVE INUTILES 145 145 ! save zentr_therm,zfm_therm 146 146 147 character (len=20) :: modname='calltherm'148 character (len=80) :: abort_message149 150 integeri,k,isplit147 CHARACTER (LEN=20) :: modname='calltherm' 148 CHARACTER (LEN=80) :: abort_message 149 150 INTEGER i,k,isplit 151 151 logical, save :: first=.TRUE. 152 logical:: new_thermcell152 LOGICAL :: new_thermcell 153 153 154 154 #ifdef ISO 155 155 REAL xt_seri(ntiso,klon,klev),xtmemoire(ntiso,klon,klev) 156 156 REAL d_xt_ajs(ntiso,klon,klev) 157 reald_xt_the(ntiso,klon,klev)157 REAL d_xt_the(ntiso,klon,klev) 158 158 #ifdef DIAGISO 159 realq_the(klon,klev)160 realxt_the(ntiso,klon,klev)161 #endif 162 realqprec(klon,klev)163 integerixt159 REAL q_the(klon,klev) 160 REAL xt_the(ntiso,klon,klev) 161 #endif 162 REAL qprec(klon,klev) 163 INTEGER ixt 164 164 #endif 165 165 … … 167 167 !$OMP THREADPRIVATE(first) 168 168 !******************************************************** 169 if(first) THEN169 IF (first) THEN 170 170 itap=0 171 171 first=.FALSE. … … 199 199 ale_bl(:)=0. 200 200 alp_bl(:)=0. 201 if(prt_level>=10) THEN201 IF (prt_level>=10) THEN 202 202 PRINT*,'thermV4 nsplit: ',nsplit_thermals,' weak_inversion' 203 203 endif … … 209 209 do i=1,klon 210 210 ! Attention teste abderr 19-03-09 211 ! logexpr2(i,k)=. not.q_seri(i,k).ge.0.212 logexpr2(i,k)=. not.q_seri(i,k)>=1.e-15213 if(logexpr2(i,k)) THEN211 ! logexpr2(i,k)=.NOT.q_seri(i,k).ge.0. 212 logexpr2(i,k)=.NOT.q_seri(i,k)>=1.e-15 213 IF (logexpr2(i,k)) THEN 214 214 #ifdef ISO 215 215 qprec(i,k)=q_seri(i,k) … … 232 232 233 233 234 new_thermcell=iflag_thermals>=15. and.iflag_thermals<=18235 #ifdef ISO 236 if (.not.new_thermcell) THEN234 new_thermcell=iflag_thermals>=15.AND.iflag_thermals<=18 235 #ifdef ISO 236 IF (.NOT.new_thermcell) THEN 237 237 CALL abort_gcm('calltherm 234','isos pas prevus ici',1) 238 238 endif 239 239 #ifdef ISOVERIF 240 if(iso_eau.gt.0) THEN240 IF (iso_eau.gt.0) THEN 241 241 CALL iso_verif_egalite_vect2D( & 242 242 xt_seri,q_seri, & … … 250 250 do isplit=1,nsplit_thermals 251 251 252 if(iflag_thermals>=1000) THEN252 IF (iflag_thermals>=1000) THEN 253 253 CALL thermcell_2002(klon,klev,zdt,iflag_thermals & 254 254 ,pplay,paprs,pphi & … … 258 258 ,r_aspect_thermals,30.,w2di_thermals & 259 259 ,tau_thermals) 260 else if(iflag_thermals==2) THEN260 ELSE IF (iflag_thermals==2) THEN 261 261 CALL thermcell_sec(klon,klev,zdt & 262 262 ,pplay,paprs,pphi,zlev & … … 266 266 ,r_aspect_thermals,30.,w2di_thermals & 267 267 ,tau_thermals) 268 else if(iflag_thermals==3) THEN268 ELSE IF (iflag_thermals==3) THEN 269 269 CALL thermcell(klon,klev,zdt & 270 270 ,pplay,paprs,pphi & … … 274 274 ,r_aspect_thermals,l_mix_thermals,w2di_thermals & 275 275 ,tau_thermals) 276 else if(iflag_thermals==10) THEN276 ELSE IF (iflag_thermals==10) THEN 277 277 CALL thermcell_eau(klon,klev,zdt & 278 278 ,pplay,paprs,pphi & … … 282 282 ,r_aspect_thermals,l_mix_thermals,w2di_thermals & 283 283 ,tau_thermals) 284 else if(iflag_thermals==11) THEN284 ELSE IF (iflag_thermals==11) THEN 285 285 abort_message = 'cas non prevu dans calltherm' 286 286 CALL abort_physic (modname,abort_message,1) 287 else if(iflag_thermals==12) THEN287 ELSE IF (iflag_thermals==12) THEN 288 288 CALL calcul_sec(klon,klev,zdt & 289 289 ,pplay,paprs,pphi,zlev & … … 292 292 ,r_aspect_thermals,l_mix_thermals,w2di_thermals & 293 293 ,tau_thermals) 294 else if (iflag_thermals==13.or.iflag_thermals==14) THEN294 ELSE IF (iflag_thermals==13.OR.iflag_thermals==14) THEN 295 295 abort_message = 'thermcellV0_main enleve svn>2084' 296 296 CALL abort_physic (modname,abort_message,1) 297 else if(new_thermcell) THEN297 ELSE IF (new_thermcell) THEN 298 298 CALL thermcell_main(itap,klon,klev,zdt & 299 299 ,pplay,paprs,pphi,debut & … … 324 324 ) 325 325 326 if(prt_level>10) WRITE(lunout,*)'Apres thermcell_main OK'326 IF (prt_level>10) WRITE(lunout,*)'Apres thermcell_main OK' 327 327 else 328 328 abort_message = 'Cas des thermiques non prevu' … … 334 334 ! Il aurait mieux valu avoir un nobidouille_stratocu 335 335 ! Et pour simplifier : 336 ! nobidouille_stratocu=. not.(iflag_thermals==13.or.iflag_thermals=15)336 ! nobidouille_stratocu=.NOT.(iflag_thermals==13.OR.iflag_thermals=15) 337 337 ! Ce serait bien de changer, mai en prenant le temps de vérifier que ca 338 338 ! fait bien ce qu'on croit. 339 339 340 flag_bidouille_stratocu=iflag_thermals<=12. or.iflag_thermals==14.or.iflag_thermals==16.or.iflag_thermals==18340 flag_bidouille_stratocu=iflag_thermals<=12.OR.iflag_thermals==14.OR.iflag_thermals==16.OR.iflag_thermals==18 341 341 342 342 ! Calcul a posteriori du niveau max des thermiques pour les schémas qui 343 343 ! ne la sortent pas. 344 if (iflag_thermals<=12.or.iflag_thermals>=1000) THEN344 IF (iflag_thermals<=12.OR.iflag_thermals>=1000) THEN 345 345 lmax(:)=1 346 346 do k=1,klev-1 … … 349 349 do k=1,klev-1 350 350 do i=1,klon 351 if(zfm_therm(i,k+1)>0.) lmax(i)=k351 IF (zfm_therm(i,k+1)>0.) lmax(i)=k 352 352 enddo 353 353 enddo … … 356 356 fact(:)=0. 357 357 DO i=1,klon 358 logexpr1(i)=flag_bidouille_stratocu. or.weak_inversion(i)>0.5358 logexpr1(i)=flag_bidouille_stratocu.OR.weak_inversion(i)>0.5 359 359 IF(logexpr1(i)) fact(i)=1./REAL(nsplit_thermals) 360 360 ENDDO … … 402 402 #ifdef ISOVERIF 403 403 ! WRITE(*,*) 'calltherm 350 tmp: ajout d_xt_the' 404 if(iso_HDO.gt.0) THEN404 IF (iso_HDO.gt.0) THEN 405 405 ! i=479 406 406 ! k=4 … … 415 415 #endif 416 416 #endif 417 if(prt_level>10) WRITE(lunout,*)'Apres apres thermcell_main OK'417 IF (prt_level>10) WRITE(lunout,*)'Apres apres thermcell_main OK' 418 418 419 419 DO i=1,klon … … 432 432 DO k = 1, klev 433 433 DO i = 1, klon 434 logexpr2(i,k)=. not.q_seri(i,k)>=0.435 if(logexpr2(i,k)) THEN434 logexpr2(i,k)=.NOT.q_seri(i,k)>=0. 435 IF (logexpr2(i,k)) THEN 436 436 q_seri(i,k)=1.e-15 437 437 nbptspb=nbptspb+1 … … 450 450 #ifdef ISO 451 451 #ifdef ISOVERIF 452 if(iso_HDO.gt.0) THEN452 IF (iso_HDO.gt.0) THEN 453 453 CALL iso_verif_aberrant_enc_vect2D( & 454 454 xt_seri,q_seri, & … … 464 464 DO i = 1, klon 465 465 logexpr2(i,k)=t_seri(i,k)<50..or.t_seri(i,k)>370. 466 if(logexpr2(i,k)) nbptspb=nbptspb+1467 ! if ((t_seri(i,k).lt.50.) . or. &466 IF (logexpr2(i,k)) nbptspb=nbptspb+1 467 ! if ((t_seri(i,k).lt.50.) .OR. & 468 468 ! & (t_seri(i,k).gt.370.)) THEN 469 469 ! PRINT*,'WARN temp apres therm i=',i,' k=',k & … … 483 483 do k=1,klev 484 484 do i=1,klon 485 if(entr_therm(i,k)>0.) THEN485 IF (entr_therm(i,k)>0.) THEN 486 486 fmc_therm(i,k+1)=fmc_therm(i,k)+entr_therm(i,k) 487 487 else … … 498 498 ! PRINT*,'<<<<calcul de lhumidite dans thermique' 499 499 !CR:on ne le calcule que pour le cas sec 500 if(iflag_thermals<=11) THEN500 IF (iflag_thermals<=11) THEN 501 501 do i=1,klon 502 502 zqasc(i,1)=q_seri(i,1) 503 503 do k=2,klev 504 if(fmc_therm(i,k+1)>1.e-6) THEN504 IF (fmc_therm(i,k+1)>1.e-6) THEN 505 505 zqasc(i,k)=(fmc_therm(i,k)*zqasc(i,k-1) & 506 506 +entr_therm(i,k)*q_seri(i,k))/fmc_therm(i,k+1) … … 519 519 do k=1,klev 520 520 clwcon0(i,k)=zqasc(i,k)-zqsat(i,k) 521 if (clwcon0(i,k)<0. .or. &521 IF (clwcon0(i,k)<0. .OR. & 522 522 (fm_therm(i,k+1)+detrc_therm(i,k))<1.e-6) THEN 523 523 clwcon0(i,k)=0. … … 529 529 do k=1,klev 530 530 clwcon0(i,k)=zqla(i,k) 531 if (clwcon0(i,k)<0. .or. &531 IF (clwcon0(i,k)<0. .OR. & 532 532 (fm_therm(i,k+1)+detrc_therm(i,k))<1.e-6) THEN 533 533 clwcon0(i,k)=0. … … 542 542 do i=1,klon 543 543 do k=1,klev 544 if(ztla(i,k) < 1.e-10) fraca(i,k) =0.544 IF (ztla(i,k) < 1.e-10) fraca(i,k) =0. 545 545 enddo 546 546 enddo
Note: See TracChangeset
for help on using the changeset viewer.