Changeset 5082 for LMDZ6/branches/Amaury_dev/libf/phylmd/cvltr.F90
- Timestamp:
- Jul 19, 2024, 5:41:58 PM (4 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/phylmd/cvltr.F90
r4046 r5082 49 49 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: sij ! fraction dair de lenv 50 50 REAL,DIMENSION(klon,klev),INTENT(IN) :: wght_cvfd ! weights of the layers feeding convection 51 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: elij ! contenu en eau condens ée spécifique/conc deau condensée massique51 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: elij ! contenu en eau condens�e sp�cifique/conc deau condens�e massique 52 52 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: epmlmMm ! eau condensee precipitee dans mel masse dair sat 53 53 REAL,DIMENSION(klon,klev),INTENT(IN) :: eplaMm ! eau condensee precipitee dans aa masse dair sat 54 54 55 REAL,DIMENSION(klon,klev),INTENT(IN) :: clw ! contenu en eau condens ée dans lasc adiab55 REAL,DIMENSION(klon,klev),INTENT(IN) :: clw ! contenu en eau condens�e dans lasc adiab 56 56 REAL,DIMENSION(klon),INTENT(IN) :: sigd 57 57 INTEGER,DIMENSION(klon),INTENT(IN) :: icb,inb … … 80 80 81 81 ! RomP ! les variables sont nettoyees des valeurs aberrantes 82 REAL,DIMENSION(klon,klev) :: Pa, Pm ! pluie AA et m élanges, var temporaire82 REAL,DIMENSION(klon,klev) :: Pa, Pm ! pluie AA et m�langes, var temporaire 83 83 REAL,DIMENSION(klon,klev) :: pmflxs,pmflxr ! pmflxrIN,pmflxsIN sans valeur aberante 84 84 REAL,DIMENSION(klon,klev) :: mp ! flux de masse … … 155 155 ! On prend la moyenne des precip entre le niveau i+1 et i 156 156 ! I=3/4* (P(1+1)+P(i))/2 / (sigd*r*rho_l) 157 ! 1000kg/m3= densit éde l'eau157 ! 1000kg/m3= densit� de l'eau 158 158 ! 0.75e-3 = 3/4 /1000 159 ! Par la suite, I est tout le temps multipli épar sig_d pour avoir l'impaction sur la surface de la maille160 ! on le n églige ici pour simplifier le code159 ! Par la suite, I est tout le temps multipli� par sig_d pour avoir l'impaction sur la surface de la maille 160 ! on le n�glige ici pour simplifier le code 161 161 do j=1,klev-1 162 162 do i=1,klon … … 201 201 END DO 202 202 203 ! suppression des valeurs tr ès faibles (~1e-320)203 ! suppression des valeurs tr�s faibles (~1e-320) 204 204 ! multiplication de levaporation pour lavoir par unite de temps 205 205 ! et par unite de surface de la maille … … 207 207 DO j=1,klev 208 208 DO i=1,klon 209 if(ev(i,j) .lt.1.e-16) then209 if(ev(i,j)<1.e-16) then 210 210 evap(i,j)=0. 211 211 else … … 217 217 DO j=1,klev 218 218 DO i=1,klon 219 if(j .lt.klev) then220 if(epIN(i,j) .lt.1.e-32) then219 if(j<klev) then 220 if(epIN(i,j)<1.e-32) then 221 221 ep(i,j)=0. 222 222 else … … 226 226 ep(i,j)=epmax 227 227 endif 228 if(mpIN(i,j) .lt.1.e-32) then228 if(mpIN(i,j)<1.e-32) then 229 229 mp(i,j)=0. 230 230 else 231 231 mp(i,j)=mpIN(i,j) 232 232 endif 233 if(pmflxsIN(i,j) .lt.1.e-32) then233 if(pmflxsIN(i,j)<1.e-32) then 234 234 pmflxs(i,j)=0. 235 235 else 236 236 pmflxs(i,j)=pmflxsIN(i,j) 237 237 endif 238 if(pmflxrIN(i,j) .lt.1.e-32) then238 if(pmflxrIN(i,j)<1.e-32) then 239 239 pmflxr(i,j)=0. 240 240 else 241 241 pmflxr(i,j)=pmflxrIN(i,j) 242 242 endif 243 if(wdtrainA(i,j) .lt.1.e-32) then243 if(wdtrainA(i,j)<1.e-32) then 244 244 Pa(i,j)=0. 245 245 else 246 246 Pa(i,j)=wdtrainA(i,j) 247 247 endif 248 if(wdtrainM(i,j) .lt.1.e-32) then248 if(wdtrainM(i,j)<1.e-32) then 249 249 Pm(i,j)=0. 250 250 else … … 257 257 DO j = klev-1,1,-1 258 258 DO i = 1,klon 259 NO_precip(i,j) = (pmflxr(i,j+1)+pmflxs(i,j+1)) .lt.1.e-10&260 .and.Pa(i,j) .lt.1.e-10.and.Pm(i,j).lt.1.e-10259 NO_precip(i,j) = (pmflxr(i,j+1)+pmflxs(i,j+1))<1.e-10& 260 .and.Pa(i,j)<1.e-10.and.Pm(i,j)<1.e-10 261 261 END DO 262 262 END DO … … 285 285 DO j=k-1,1,-1 286 286 DO i=1,klon 287 if(mp(i,j+1) .gt.1.e-10) then287 if(mp(i,j+1)>1.e-10) then 288 288 zmd(i,j,k)=zmd(i,j+1,k)*min(1.,mp(i,j)/mp(i,j+1)) !det ~ mk(j)=mk(j+1)*mp(i,j)/mp(i,j+1) 289 289 ENDif … … 302 302 DO j=1,klev-1 303 303 DO i=1,klon 304 if(mp(i,j+1) .gt.1.e-10) then304 if(mp(i,j+1)>1.e-10) then 305 305 qTrdi(i,j+1,it)=qTrdi(i,j+1,it)+(zmd(i,j+1,k)/mp(i,j+1))*tr(i,k,it) 306 306 else … … 397 397 DO j=1,klev 398 398 DO i=1,klon 399 if(j .ge.icb(i).and.j.le.inb(i)) then400 if(clw(i,j) .gt.1.e-16) then399 if(j>=icb(i).and.j<=inb(i)) then 400 if(clw(i,j)>1.e-16) then 401 401 qPa(i,j,it)=ccntrAA_coef*tr(i,1,it)/clw(i,j) 402 402 else … … 413 413 DO k=1,j-1 414 414 DO i=1,klon 415 if(k .ge.icb(i).and.k.le.inb(i).and.&416 j .le.inb(i)) then417 if(elij(i,k,j) .gt.1.e-16) then415 if(k>=icb(i).and.k<=inb(i).and.& 416 j<=inb(i)) then 417 if(elij(i,k,j)>1.e-16) then 418 418 qMeltmp(i,j,it)=((1-ep(i,k))*ccntrAA_coef*tr(i,1,it)& 419 419 *(1.-sij(i,k,j)) +ccntrENV_coef& … … 431 431 DO j=1,klev 432 432 DO i=1,klon 433 if(Mint(i,j) .gt.1.e-16) then433 if(Mint(i,j)>1.e-16) then 434 434 qMel(i,j,it)=qpmMint(i,j,it)/Mint(i,j) 435 435 else … … 442 442 DO j=klev-1,1,-1 443 443 DO i=1,klon 444 if(mp(i,j+1) .gt.mp(i,j).and.mp(i,j+1).gt.1.e-10) then ! detrainement444 if(mp(i,j+1)>mp(i,j).and.mp(i,j+1)>1.e-10) then ! detrainement 445 445 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*& 446 446 (-mp(i,j+1)-imp(i,j)/RG*dxpres(i,j))& 447 447 + (imp(i,j)/RG*dxpres(i,j))*(evap(i,j)/RG*dxpres(i,j))) 448 448 449 elseif(mp(i,j) .gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then! entrainement450 if(j .eq.1) then449 elseif(mp(i,j)>mp(i,j+1).and.mp(i,j)>1.e-10) then! entrainement 450 if(j==1) then 451 451 kappa(i,j)=((pmflxr(i,j+1)+pmflxs(i,j+1)+Pa(i,j)+Pm(i,j))*& 452 452 (-mp(i,2)-imp(i,j)/RG*dxpres(i,j))& … … 465 465 DO j=klev-1,1,-1 466 466 DO i=1,klon 467 if (abs(kappa(i,j)) .lt.1.e-25) then !si denominateur nul (il peut y avoir des mp!=0)467 if (abs(kappa(i,j))<1.e-25) then !si denominateur nul (il peut y avoir des mp!=0) 468 468 kappa(i,j)=1. 469 if(j .eq.1) then470 qDi(i,j,it)=qDi(i,j+1,it) !orig tr(i,j,it) ! mp(1)=0 donc tout vient de la couche sup érieure471 elseif(mp(i,j+1) .gt.mp(i,j).and.mp(i,j+1).gt.1.e-10) then469 if(j==1) then 470 qDi(i,j,it)=qDi(i,j+1,it) !orig tr(i,j,it) ! mp(1)=0 donc tout vient de la couche sup�rieure 471 elseif(mp(i,j+1)>mp(i,j).and.mp(i,j+1)>1.e-10) then 472 472 qDi(i,j,it)=qDi(i,j+1,it) 473 elseif(mp(i,j) .gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then! entrainement473 elseif(mp(i,j)>mp(i,j+1).and.mp(i,j)>1.e-10) then! entrainement 474 474 qDi(i,j,it)=(-mp(i,j+1)*(qDi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))/(-mp(i,j)) 475 475 else ! si mp (i)=0 et mp(j+1)=0 … … 490 490 !!jyg (20130119) correction pour le sommet du nuage 491 491 !! if(j.ge.inb(i)) then !au-dessus du nuage, sommet inclu 492 if(j .gt.inb(i)) then !au-dessus du nuage492 if(j>inb(i)) then !au-dessus du nuage 493 493 qDi(i,j,it)=tr(i,j,it) ! pas de descente => environnement = descente insaturee 494 494 qPr(i,j,it)=0. 495 495 496 496 ! vvv premiere couche du modele ou mp(1)=0 ! det tout le temps vvv 497 elseif(j .eq.1) then498 if(mp(i,2) .gt.1.e-10) then !mp(2) non nul -> detrainement (car mp(1) = 0) !ent pas possible497 elseif(j==1) then 498 if(mp(i,2)>1.e-10) then !mp(2) non nul -> detrainement (car mp(1) = 0) !ent pas possible 499 499 if(NO_precip(i,j)) then !pas de precip en (i) 500 500 qDi(i,j,it)=qDi(i,j+1,it) … … 530 530 else 531 531 !------------------------------------------------------------- detrainement 532 if(mp(i,j+1) .gt.mp(i,j).and.mp(i,j+1).gt.1.e-10) then !mp(i,j).gt.1.e-10) then532 if(mp(i,j+1)>mp(i,j).and.mp(i,j+1)>1.e-10) then !mp(i,j).gt.1.e-10) then 533 533 if(NO_precip(i,j)) then 534 534 qDi(i,j,it)=qDi(i,j+1,it) … … 548 548 endif !precip 549 549 !------------------------------------------------------------- entrainement 550 elseif(mp(i,j) .gt.mp(i,j+1).and.mp(i,j).gt.1.e-10) then550 elseif(mp(i,j)>mp(i,j+1).and.mp(i,j)>1.e-10) then 551 551 if(NO_precip(i,j)) then 552 552 qDi(i,j,it)=(-mp(i,j+1)*(qDi(i,j+1,it)-tr(i,j,it))-mp(i,j)*tr(i,j,it))/(-mp(i,j)) … … 614 614 -zmfdam(i,k,it)*ccntrAA_coef 615 615 ! lessivage courants insatures 616 if(k .le.inb(i).and.k.gt.1) then ! tendances dans le nuage616 if(k<=inb(i).and.k>1) then ! tendances dans le nuage 617 617 !------------------------------------------------------------- detrainement 618 if(mp(i,k+1) .gt.mp(i,k).and.mp(i,k+1).gt.1.e-10) then618 if(mp(i,k+1)>mp(i,k).and.mp(i,k+1)>1.e-10) then 619 619 uscavtrac= (-mp(i,k)+mp(i,k+1))*(qDi(i,k,it)-tr(i,k,it))& 620 620 + mp(i,k)*(tr(i,k-1,it)-tr(i,k,it)) … … 625 625 ! 'mp',mp(i,k) 626 626 !------------------------------------------------------------- entrainement 627 elseif(mp(i,k) .gt.mp(i,k+1).and.mp(i,k).gt.1.e-10) then627 elseif(mp(i,k)>mp(i,k+1).and.mp(i,k)>1.e-10) then 628 628 uscavtrac= mp(i,k)*(tr(i,k-1,it)-tr(i,k,it)) 629 629 ! … … 641 641 endif ! mp/det/ent 642 642 !------------------------------------------------------------- premiere couche 643 elseif(k .eq.1) then ! mp(1)=0.644 if(mp(i,2) .gt.1.e-10) then !detrainement643 elseif(k==1) then ! mp(1)=0. 644 if(mp(i,2)>1.e-10) then !detrainement 645 645 uscavtrac= (-0.+mp(i,2))*(qDi(i,k,it)-tr(i,k,it)) !& 646 646 ! + mp(i,2)*(0.-tr(i,k,it))
Note: See TracChangeset
for help on using the changeset viewer.