Ignore:
Timestamp:
Oct 19, 2023, 4:02:57 PM (8 months ago)
Author:
idelkadi
Message:

Merged trunk changes -r4488:4726 LMDZ_ECRad branch

Location:
LMDZ6/branches/LMDZ_ECRad
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/LMDZ_ECRad

  • LMDZ6/branches/LMDZ_ECRad/libf/phylmd/surf_landice_mod.F90

    r4482 r4727  
    1212       rmu0, lwdownm, albedo, pphi1, &
    1313       swnet, lwnet, tsurf, p1lay, &
    14        cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
     14       cdragh, cdragm, precip_rain, precip_snow, precip_bs, temp_air, spechum, &
    1515       AcoefH, AcoefQ, BcoefH, BcoefQ, &
    1616       AcoefU, AcoefV, BcoefU, BcoefV, &
     17       AcoefQBS, BcoefQBS, &
    1718       ps, u1, v1, gustiness, rugoro, pctsrf, &
    18        snow, qsurf, qsol, agesno, &
    19        tsoil, z0m, z0h, SFRWL, alb_dir, alb_dif, evap, fluxsens, fluxlat, &
     19       snow, qsurf, qsol, qbs1, agesno, &
     20       tsoil, z0m, z0h, SFRWL, alb_dir, alb_dif, evap, fluxsens, fluxlat, fluxbs, &
    2021       tsurf_new, dflux_s, dflux_l, &
    2122       alt, slope, cloudf, &
     
    3031    USE cpl_mod,          ONLY : cpl_send_landice_fields
    3132    USE calcul_fluxs_mod
     33    USE phys_local_var_mod, ONLY : zxrhoslic, zxustartlic
    3234    USE phys_output_var_mod, ONLY : snow_o,zfra_o
    3335!FC
    3436    USE ioipsl_getin_p_mod, ONLY : getin_p
    35 
     37    USE lmdz_blowing_snow_ini, ONLY : zeta_bs, pbst_bs, prt_bs, iflag_saltation_bs
    3638
    3739#ifdef CPP_INLANDSIS
     
    5658    REAL, DIMENSION(klon), INTENT(IN)             :: p1lay
    5759    REAL, DIMENSION(klon), INTENT(IN)             :: cdragh, cdragm
    58     REAL, DIMENSION(klon), INTENT(IN)             :: precip_rain, precip_snow
     60    REAL, DIMENSION(klon), INTENT(IN)             :: precip_rain, precip_snow, precip_bs
    5961    REAL, DIMENSION(klon), INTENT(IN)             :: temp_air, spechum
    6062    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefH, AcoefQ
    6163    REAL, DIMENSION(klon), INTENT(IN)             :: BcoefH, BcoefQ
    6264    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefU, AcoefV, BcoefU, BcoefV
     65    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefQBS, BcoefQBS
    6366    REAL, DIMENSION(klon), INTENT(IN)             :: ps
    64     REAL, DIMENSION(klon), INTENT(IN)             :: u1, v1, gustiness
     67    REAL, DIMENSION(klon), INTENT(IN)             :: u1, v1, gustiness, qbs1
    6568    REAL, DIMENSION(klon), INTENT(IN)             :: rugoro
    6669    REAL, DIMENSION(klon,nbsrf), INTENT(IN)       :: pctsrf
     
    9497!albedo SB <<<
    9598    REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat
     99    REAL, DIMENSION(klon), INTENT(OUT)            :: fluxbs
    96100    REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
    97101    REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l     
     
    134138
    135139    REAL,DIMENSION(klon) :: alb1,alb2
     140    REAL,DIMENSION(klon) :: precip_totsnow, evap_totsnow
    136141    REAL, DIMENSION (klon,6) :: alb6
     142    REAL                   :: rho0, rhoice, ustart0,esalt, rhod
     143    REAL                   :: lambdasalt,fluxsalt, csalt, nunu, aa, bb, cc
     144    REAL                   :: tau_dens, tau_dens0, tau_densmin, rhomax, rhohard
     145    REAL, DIMENSION(klon)  :: ws1, rhos, ustart, qsalt, hsalt, snowini
     146    REAL                   :: maxerosion ! in kg/s   
     147
    137148! End definition
    138149!****************************************************************************************
     
    165176    alb2(:) = 999999.
    166177    alb1(:) = 999999.
    167    
     178    fluxbs(:)=0. 
    168179    runoff(:) = 0.
    169180!****************************************************************************************
     
    173184    radsol(:) = 0.0
    174185    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
     186
     187!****************************************************************************************
    175188
    176189!****************************************************************************************
     
    264277
    265278
    266 
    267279    ELSE
    268280
     
    314326         flux_u1, flux_v1)
    315327
    316 !****************************************************************************************
    317 ! Calculate snow height, age, run-off,..
    318 !   
    319 !****************************************************************************************
    320     CALL fonte_neige(knon, is_lic, knindex, dtime, &
    321          tsurf, precip_rain, precip_snow, &
    322          snow, qsol, tsurf_new, evap)
    323 
    324328
    325329!****************************************************************************************
     
    327331!
    328332!****************************************************************************************
     333 
    329334    CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 
    330335
    331     WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.
    332     zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0)))
    333     alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + &
    334          0.6 * (1.0-zfra(1:knon))
     336
     337! EV: following lines are obsolete since we set alb1 and alb2 to constant values
     338! I therefore comment them
     339!    alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + &
     340!         0.6 * (1.0-zfra(1:knon))
    335341!
    336342!IM: plusieurs choix/tests sur l'albedo des "glaciers continentaux"
     
    354360    !z0m = SQRT(z0m**2+rugoro**2)
    355361
     362
     363
     364  ! Simple blowing snow param
     365  if (ok_bs) then
     366       ustart0 = 0.211
     367       rhoice = 920.0
     368       rho0 = 300.0
     369       rhomax=450.0
     370       rhohard=450.0
     371       tau_dens0=86400.0*10.  ! 10 days by default, in s
     372       tau_densmin=21600.0    ! 1/4 days according to in situ obs by C. Amory during blowing snow +
     373                              ! Marshall et al. 1999 (snow densification during rain)
     374
     375       ! computation of threshold friction velocity
     376       ! which depends on surface snow density
     377       do j = 1, knon
     378           ! estimation of snow density
     379           ! snow density increases with snow age and
     380           ! increases even faster in case of sedimentation of blowing snow or rain
     381           tau_dens=max(tau_densmin, tau_dens0*exp(-abs(precip_bs(j))/pbst_bs - &
     382                    abs(precip_rain(j))/prt_bs)*exp(-max(tsurf(j)-272.0,0.)))
     383           rhos(j)=rho0+(rhohard-rho0)*(1.-exp(-agesno(j)*86400.0/tau_dens))
     384           ! blowing snow flux formula used in MAR
     385           ws1(j)=(u1(j)**2+v1(j)**2)**0.5
     386           ustar(j)=(cdragm(j)*(u1(j)**2+v1(j)**2))**0.5
     387           ustart(j)=ustart0*exp(max(rhoice/rho0-rhoice/rhos(j),0.))*exp(max(0.,rhos(j)-rhomax))
     388           ! we have multiplied by exp to prevent erosion when rhos>rhomax (usefull till
     389           ! rhohard<450)
     390       enddo
     391       
     392       ! computation of qbs at the top of the saltation layer
     393       ! two formulations possible
     394       ! pay attention that qbs is a mixing ratio and has to be converted
     395       ! to specific content
     396       
     397       if (iflag_saltation_bs .eq. 1) then
     398       ! expression from CRYOWRF (Sharma et al. 2022)
     399          aa=2.6
     400          bb=2.5
     401          cc=2.0
     402          lambdasalt=0.45
     403          do j =1, knon
     404               rhod=p1lay(j)/RD/temp_air(j)
     405               nunu=max(ustar(j)/ustart(j),1.e-3)
     406               fluxsalt=rhod/RG*(ustar(j)**3)*(1.-nunu**(-2)) * &
     407                        (aa+bb*nunu**(-2)+cc*nunu**(-1)) 
     408               csalt=fluxsalt/(2.8*ustart(j))
     409               hsalt(j)=0.08436*ustar(j)**1.27
     410               qsalt(j)=1./rhod*csalt*lambdasalt*RG/(max(ustar(j)**2,1E-6)) &
     411                       * exp(-lambdasalt*RG*hsalt(j)/max(ustar(j)**2,1E-6))
     412               qsalt(j)=max(qsalt(j),0.)
     413          enddo
     414
     415
     416       else
     417       ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001)       
     418          do j=1, knon
     419              esalt=1./(3.25*max(ustar(j),0.001))
     420              hsalt(j)=0.08436*ustar(j)**1.27
     421              qsalt(j)=(max(ustar(j)**2-ustart(j)**2,0.))/(RG*hsalt(j))*esalt
     422              !ep=qsalt*cdragm(j)*sqrt(u1(j)**2+v1(j)**2)
     423          enddo
     424       endif
     425
     426        ! calculation of erosion (flux positive towards the surface here)
     427        ! consistent with implicit resolution of turbulent mixing equation
     428       do j=1, knon
     429              i = knindex(j)
     430              rhod=p1lay(j)/RD/temp_air(j)
     431              ! Nemoto and Nishimura 2004 show that steady-state saltation is achieved within an interval of about 10s
     432              ! we thus prevent snowerosion (snow particle transfer from the saltation layer to the first model level)
     433              ! to exceed (in intensity) integrated over 10s to exceed the total mass of snow particle in the saltation layer
     434              ! (rho*qsalt*hsalt)
     435              maxerosion=hsalt(j)*qsalt(j)*rhod/10.
     436              fluxbs(j)=rhod*ws1(j)*cdragm(j)*(AcoefQBS(j)-qsalt(j)) &
     437                       / (1.-rhod*ws1(j)*cdragm(j)*BcoefQBS(j)*dtime)
     438              !fluxbs(j)= rhod*ws1(j)*cdragm(j)*(qbs1(j)-qsalt(j))
     439              fluxbs(j)=max(-maxerosion,fluxbs(j))
     440
     441              ! for outputs
     442
     443              zxustartlic(i) = ustart(j)
     444              zxrhoslic(i) = rhos(j)
     445       enddo
     446
     447  endif
     448
     449
     450
     451!****************************************************************************************
     452! Calculate snow amount
     453!   
     454!****************************************************************************************
     455    IF (ok_bs) THEN
     456      precip_totsnow(:)=precip_snow(:)+precip_bs(:)
     457      evap_totsnow(:)=evap(:)-fluxbs(:) ! flux bs is positive towards the surface (snow erosion)
     458    ELSE
     459      precip_totsnow(:)=precip_snow(:)
     460      evap_totsnow(:)=evap(:)
     461    ENDIF
     462   
     463 
     464    CALL fonte_neige(knon, is_lic, knindex, dtime, &
     465         tsurf, precip_rain, precip_totsnow,  &
     466         snow, qsol, tsurf_new, evap_totsnow)
     467   
     468   
     469    WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.                                         
     470    zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0))) 
    356471
    357472
     
    378493    runoff(1:knon)=run_off_lic(1:knon)/dtime
    379494
    380  
    381 !****************************************************************************************
    382495       snow_o=0.
    383496       zfra_o = 0.
     
    420533!albedo SB <<<
    421534
    422  
    423  
    424535
    425536  END SUBROUTINE surf_landice
Note: See TracChangeset for help on using the changeset viewer.