Changeset 3875


Ignore:
Timestamp:
Apr 20, 2021, 8:25:26 PM (3 years ago)
Author:
fhourdin
Message:

Modification de la reevaporation de la precipitation par Ludovic Touzé Peiffer.
Actif seulement si iflag_evap_prec=4.
Resultats numériquement inchangés sinon.
Frédéric

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/fisrtilp.F90

    r3845 r3875  
    1 !
    21! $Id$
    32!
     
    105104  !
    106105  REAL, SAVE :: seuil_neb=0.001 ! un nuage existe vraiment au-dela
     106  !<LTP
     107  REAL smallestreal
     108  REAL, SAVE :: rain_int_min=0.001 !intensité locale minimum pour la pluie avant diminution de la fraction précipitante associée = 0.001 mm/s
     109  !>LTP 
     110
     111
    107112  !$OMP THREADPRIVATE(seuil_neb)
    108113
     
    149154  REAL qcloud(klon)
    150155 
    151   REAL zrfl(klon), zrfln(klon), zqev, zqevt
     156  REAL zrfl(klon), zrfln(klon), zqev, zqevt
     157!<LTP
     158  REAL zrflclr(klon), zrflcld(klon)
     159  REAL d_zrfl_clr_cld(klon), d_zifl_clr_cld(klon)
     160  REAL d_zrfl_cld_clr(klon), d_zifl_cld_clr(klon)
     161!>LTP
     162
    152163  REAL zifl(klon), zifln(klon), zqev0,zqevi, zqevti
     164!<LTP
     165  REAL ziflclr(klon), ziflcld(klon)
     166!>LTP
    153167  REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq
    154168  REAL zoliqp(klon), zoliqi(klon)
     
    161175  REAL zdz(klon),zrho(klon),ztot      , zrhol(klon)
    162176  REAL zchau      ,zfroi      ,zfice(klon),zneb(klon),znebprecip(klon)
     177!<LTP
     178  REAL znebprecipclr(klon), znebprecipcld(klon)
     179  REAL tot_zneb(klon), tot_znebn(klon), d_tot_zneb(klon)
     180  REAL d_znebprecip_clr_cld(klon), d_znebprecip_cld_clr(klon)
     181!>LTP
     182
    163183  REAL zmelt, zpluie, zice
    164184  REAL dzfice(klon)
     
    219239!  ice_thermo = iflag_ice_thermo .GE. 1
    220240
     241 
    221242  itap=itap+1
    222243  znebprecip(:)=0.
     244
     245!<LTP
     246  smallestreal=1.e-9
     247  znebprecipclr(:)=0.
     248  znebprecipcld(:)=0.
     249!>LTP
    223250
    224251  ice_thermo = (iflag_ice_thermo .EQ. 1).OR.(iflag_ice_thermo .GE. 3)
     
    232259     CALL getin_p('iflag_evap_prec',iflag_evap_prec)
    233260     CALL getin_p('seuil_neb',seuil_neb)
     261!<LTP   
     262     CALL getin_p('rain_int_min',rain_int_min)
     263!>LTP
    234264     write(lunout,*)' iflag_oldbug_fisrtilp =',iflag_oldbug_fisrtilp
    235265     !
    236266     WRITE(lunout,*) 'fisrtilp, ninter:', ninter
    237267     WRITE(lunout,*) 'fisrtilp, iflag_evap_prec:', iflag_evap_prec
     268!<LTP   
     269     WRITE(lunout,*) 'fisrtilp, rain_int_min:', rain_int_min
     270!>LTP   
    238271     WRITE(lunout,*) 'fisrtilp, cpartiel:', cpartiel
     272     WRITE(lunout,*) 'FISRTILP VERSION LUDO'
    239273     
    240274     IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN
     
    303337
    304338  !cdir collapse
     339
    305340  DO k = 1, klev
    306341     DO i = 1, klon
     
    326361     zrfl(i) = 0.0
    327362     zifl(i) = 0.0
     363!<LTP
     364     zrflclr(i) = 0.0
     365     ziflclr(i) = 0.0
     366     zrflcld(i) = 0.0
     367     ziflcld(i) = 0.0
     368     tot_zneb(i) = 0.0
     369     tot_znebn(i) = 0.0
     370     d_tot_zneb(i) = 0.0
     371!>LTP
     372
    328373     zneb(i) = seuil_neb
    329374  ENDDO
     
    492537!      ================================
    493538        DO i = 1, klon
     539
     540
    494541!AJ<
    495542!        S'il y a des precipitations
    496543         IF (zrfl(i)+zifl(i).GT.0.) THEN
     544
     545        !LTP<
     546        !On ne tient compte que du flux de précipitation en ciel clair dans le calcul de l'évaporation.
     547                IF (iflag_evap_prec==4) THEN
     548                        zrfl(i) = zrflclr(i)
     549                        zifl(i) = ziflclr(i)
     550                ENDIF
     551       
     552        !>LTP
    497553
    498554         IF (iflag_evap_prec==1) THEN
     
    501557            znebprecip(i)=MAX(zneb(i),znebprecip(i))
    502558         ENDIF
    503      
     559         
     560         IF (iflag_evap_prec==4) THEN
     561        ! Evap max pour ne pas saturer toute la maille
     562         zqev0 = MAX (0.0, zqs(i)-zq(i))
     563         ELSE
    504564        ! Evap max pour ne pas saturer la fraction sous le nuage
    505565         zqev0 = MAX (0.0, (zqs(i)-zq(i))*znebprecip(i) )
     566         ENDIF
    506567
    507568         !JAM
     
    523584              *SQRT(zrfl(i)/max(1.e-4,znebprecip(i))) &
    524585              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
    525          ELSE
     586!<LTP
     587         ELSE IF (iflag_evap_prec==4) THEN
     588         zqevt = znebprecipclr(i)*coef_eva*(1.0-zq(i)/qsl) &
     589              *SQRT(zrfl(i)/max(1.e-8,znebprecipclr(i))) &
     590              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
     591!>LTP
     592        ELSE
    526593         zqevt = 1.*coef_eva*(1.0-zq(i)/qsl)*SQRT(zrfl(i)) &
    527594              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
     
    544611              *SQRT(zifl(i)/max(1.e-4,znebprecip(i))) &
    545612              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
     613!<LTP
     614         ELSE IF (iflag_evap_prec==4) THEN
     615         zqevti = znebprecipclr(i)*coef_eva*(1.0-zq(i)/qsi) &
     616              *SQRT(zifl(i)/max(1.e-8,znebprecipclr(i))) &
     617              *(paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG
     618!>LTP
    546619         ELSE
    547620         zqevti = 1.*coef_eva*(1.0-zq(i)/qsi)*SQRT(zifl(i)) &
     
    551624              *RG*dtime/(paprs(i,k)-paprs(i,k+1))   
    552625
     626       
    553627        !JAM
    554628        ! Limitation de l'evaporation. On s'assure qu'on ne sature pas
     
    573647             ENDIF
    574648         ENDIF
     649
    575650         ! Nouveaux flux de precip liquide et solide
    576651         zrfln(i) = Max(0.,zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) &
     
    602677         zrfl(i) = zrfln(i)
    603678         zifl(i) = zifln(i)
     679
     680!<LTP
     681        IF (iflag_evap_prec==4) THEN
     682                zrflclr(i) = zrfl(i)
     683                ziflclr(i) = zifl(i)   
     684                IF(zrflclr(i) + ziflclr(i) .LE. 0) THEN
     685                        znebprecipclr(i) = 0.
     686                ENDIF   
     687                zrfl(i) = zrflclr(i) + zrflcld(i)
     688                zifl(i) = ziflclr(i) + ziflcld(i)
     689        ENDIF
     690!>LTP       
     691
     692
    604693!        print*,'REEVAP ',itap,k,znebprecip(1),zqev0,zqev,zqevi,zrfl(1)
    605694
     
    612701           zmelt = MIN(MAX(zmelt,0.),1.)
    613702           ! Fusion de la glace
    614            zrfl(i)=zrfl(i)+zmelt*zifl(i)
     703!<LTP
     704           IF (iflag_evap_prec==4) THEN
     705                   zrflclr(i)=zrflclr(i)+zmelt*ziflclr(i)
     706                   zrflcld(i)=zrflcld(i)+zmelt*ziflcld(i)
     707                   zrfl(i)=zrflclr(i)+zrflcld(i)
     708!>LTP       
     709           ELSE
     710                   zrfl(i)=zrfl(i)+zmelt*zifl(i)
     711           ENDIF
    615712           if (fl_cor_ebil .LE. 0) then
    616713             ! the following line should not be here. Indeed, if zifl is modified
     
    628725        end if
    629726           if (fl_cor_ebil .GT. 0) then ! correction bug, deplacement ligne precedente
    630              zifl(i)=zifl(i)*(1.-zmelt)
     727!<LTP
     728             IF (iflag_evap_prec==4) THEN
     729                   ziflclr(i)=ziflclr(i)*(1.-zmelt)
     730                   ziflcld(i)=ziflcld(i)*(1.-zmelt)
     731                   zifl(i)=ziflclr(i)+ziflcld(i)
     732!>LTP       
     733             ELSE
     734                   zifl(i)=zifl(i)*(1.-zmelt)
     735             ENDIF
    631736           end if
    632737
     
    817922                 ! Variables calculees:
    818923                 ! rneb : nebulosite
    819                  ! zqn : eau totale dans le nuage (in cloud total water content)
     924                 ! zqn : eau condensee, dans le nuage (in cloud water content)
    820925                 ! zcond: eau condensee en moyenne dans la maille
    821926                 ! rhcl: humidite relative ciel-clair
     
    10191124           ENDIF
    10201125        ENDDO
     1126
     1127       
    10211128        ! If vertical heterogeneity, change fraction by volume as well
    10221129        if (iflag_cloudth_vert>=3) then
     
    11161223     ! Partager l'eau condensee en precipitation et eau liquide nuageuse
    11171224     !
     1225
     1226!<LTP
     1227
     1228IF (iflag_evap_prec==4) THEN
     1229        !Partitionnement des precipitations venant du dessus en précipitations nuageuses
     1230        !et précipitations ciel clair
     1231
     1232        !0) Calculate tot_zneb, la fraction nuageuse totale au-dessus du nuage
     1233        !en supposant un recouvrement maximum aléatoire (voir Jakob and Klein, 2000)
     1234       
     1235        DO i=1, klon
     1236                tot_znebn(i) = 1 - (1-tot_zneb(i))*(1 - max(rneb(i,k),zneb(i))) &
     1237                        /(1-min(zneb(i),1-smallestreal))
     1238                d_tot_zneb(i) = tot_znebn(i) - tot_zneb(i)
     1239                tot_zneb(i) = tot_znebn(i)
     1240
     1241
     1242                !1) Cloudy to clear air
     1243                d_znebprecip_cld_clr(i) = znebprecipcld(i) - min(rneb(i,k),znebprecipcld(i))
     1244                IF (znebprecipcld(i) .GT. 0) THEN
     1245                        d_zrfl_cld_clr(i) = d_znebprecip_cld_clr(i)/znebprecipcld(i)*zrflcld(i)
     1246                        d_zifl_cld_clr(i) = d_znebprecip_cld_clr(i)/znebprecipcld(i)*ziflcld(i)
     1247                ELSE
     1248                        d_zrfl_cld_clr(i) = 0.
     1249                        d_zifl_cld_clr(i) = 0.
     1250                ENDIF
     1251
     1252                !2) Clear to cloudy air
     1253                d_znebprecip_clr_cld(i) = max(0., min(znebprecipclr(i), rneb(i,k) &
     1254                        - d_tot_zneb(i) - zneb(i)))
     1255                IF (znebprecipclr(i) .GT. 0) THEN
     1256                        d_zrfl_clr_cld(i) = d_znebprecip_clr_cld(i)/znebprecipclr(i)*zrflclr(i)
     1257                        d_zifl_clr_cld(i) = d_znebprecip_clr_cld(i)/znebprecipclr(i)*ziflclr(i)
     1258                ELSE
     1259                        d_zrfl_clr_cld(i) = 0.
     1260                        d_zifl_clr_cld(i) = 0.
     1261                ENDIF
     1262
     1263                !Update variables
     1264                znebprecipcld(i) = znebprecipcld(i) + d_znebprecip_clr_cld(i) - d_znebprecip_cld_clr(i) 
     1265                znebprecipclr(i) = znebprecipclr(i) + d_znebprecip_cld_clr(i) - d_znebprecip_clr_cld(i)
     1266                zrflcld(i) = zrflcld(i) + d_zrfl_clr_cld(i) - d_zrfl_cld_clr(i)
     1267                ziflcld(i) = ziflcld(i) + d_zifl_clr_cld(i) - d_zifl_cld_clr(i)
     1268                zrflclr(i) = zrflclr(i) + d_zrfl_cld_clr(i) - d_zrfl_clr_cld(i)
     1269                ziflclr(i) = ziflclr(i) + d_zifl_cld_clr(i) - d_zifl_clr_cld(i)
     1270
     1271        ENDDO
     1272ENDIF
     1273
     1274!>LTP
     1275
     1276
    11181277
    11191278     ! Initialisation de zoliq (eau condensee moyenne dans la maille)
     
    12931452             d_ql(i,k) = (1-zfice(i))*zoliq(i)
    12941453             d_qi(i,k) = zfice(i)*zoliq(i)
    1295              zrfl(i) = zrfl(i)+ zqprecl(i) &
     1454!<LTP
     1455             IF (iflag_evap_prec == 4) THEN
     1456                zrflcld(i) = zrflcld(i)+zqprecl(i) &
     1457                 *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
     1458                ziflcld(i) = ziflcld(i)+ zqpreci(i) &
     1459                      *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
     1460                znebprecipcld(i) = rneb(i,k)
     1461                zrfl(i) = zrflcld(i) + zrflclr(i)
     1462                zifl(i) = ziflcld(i) + ziflclr(i)       
     1463!>LTP
     1464             ELSE
     1465                zrfl(i) = zrfl(i)+ zqprecl(i) &
    12961466                 *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
    1297              zifl(i) = zifl(i)+ zqpreci(i) &
     1467                zifl(i) = zifl(i)+ zqpreci(i) &
    12981468                      *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
     1469             
     1470             ENDIF !iflag_evap_prec==4
     1471
    12991472           ENDIF                     
    13001473         ENDDO
     
    13141487           d_qi(i,k) = zfice(i)*zoliq(i)
    13151488!           endif
     1489!<LTP
     1490             IF (iflag_evap_prec == 4) THEN
     1491                zrflcld(i) = zrflcld(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
     1492                       *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
     1493                ziflcld(i) = ziflcld(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
     1494                        *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
     1495                znebprecipcld(i) = rneb(i,k)
     1496                zrfl(i) = zrflcld(i) + zrflclr(i)
     1497                zifl(i) = ziflcld(i) + ziflclr(i)       
     1498!>LTP
     1499             ELSE
    13161500!AJ<
    1317            zrfl(i) = zrfl(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
    1318                *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
    1319            zifl(i) = zifl(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
    1320                     *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
     1501                   zrfl(i) = zrfl(i)+ MAX(zcond(i)*(1.-zfice(i))-zoliqp(i),0.0) &
     1502                       *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
     1503                        zifl(i) = zifl(i)+ MAX(zcond(i)*zfice(i)-zoliqi(i),0.0) &
     1504                        *(paprs(i,k)-paprs(i,k+1))/(RG*dtime) 
    13211505     !      zrfl(i) = zrfl(i)+  zpluie                         &
    13221506     !          *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)
    13231507     !      zifl(i) = zifl(i)+  zice                    &
    13241508     !               *(paprs(i,k)-paprs(i,k+1))/(RG*dtime)                                   
     1509             ENDIF !iflag_evap_prec == 4             
    13251510
    13261511!CR : on prend en compte l'effet Bergeron dans les flux de precipitation
    13271512           IF ((iflag_bergeron .EQ. 1) .AND. (zt(i) .LT. 273.15)) THEN
    1328               zsolid = zrfl(i)
    1329               zifl(i) = zifl(i)+zrfl(i)
    1330               zrfl(i) = 0.
     1513!<LTP
     1514                IF (iflag_evap_prec == 4) THEN
     1515                     zsolid = zrfl(i)
     1516                     ziflclr(i) = ziflclr(i) +zrflclr(i)
     1517                     ziflcld(i) = ziflcld(i) +zrflcld(i)
     1518                     zifl(i) = ziflclr(i)+ziflcld(i)
     1519                     zrflcld(i)=0.
     1520                     zrflclr(i)=0.   
     1521                     zrfl(i) = zrflclr(i)+zrflcld(i)
     1522!>LTP
     1523                ELSE
     1524                     zsolid = zrfl(i)
     1525                     zifl(i) = zifl(i)+zrfl(i)
     1526                     zrfl(i) = 0.
     1527                 ENDIF!iflag_evap_prec==4
     1528
    13311529           if (fl_cor_ebil .GT. 0) then
    13321530              zt(i)=zt(i)+zsolid*(RG*dtime)/(paprs(i,k)-paprs(i,k+1)) &
     
    13581556!       ENDDO
    13591557!     ENDIF
     1558
     1559
     1560!<LTP
     1561
     1562!Limitation de la fraction surfacique couverte par les précipitations lorsque l'intensité locale du flux de précipitation descend en
     1563!dessous de rain_int_min
     1564    IF (iflag_evap_prec==4) THEN
     1565        DO i=1, klon
     1566            IF (zrflclr(i) + ziflclr(i) .GT. 0 ) THEN
     1567                znebprecipclr(i) = min(znebprecipclr(i), max(zrflclr(i)/(znebprecipclr(i)*rain_int_min), ziflclr(i)/(znebprecipclr(i)*rain_int_min)))
     1568            ELSE
     1569                znebprecipclr(i)=0.
     1570            ENDIF
     1571
     1572            IF (zrflcld(i) + ziflcld(i) .GT. 0 ) THEN
     1573                znebprecipcld(i) = min(znebprecipcld(i), max(zrflcld(i)/(znebprecipcld(i)*rain_int_min), ziflcld(i)/(znebprecipcld(i)*rain_int_min)))
     1574            ELSE
     1575                znebprecipcld(i)=0.
     1576            ENDIF
     1577       ENDDO
     1578    ENDIf
     1579
     1580!>LTP
     1581
     1582
     1583
    13601584
    13611585       
Note: See TracChangeset for help on using the changeset viewer.