Ignore:
Timestamp:
Sep 4, 2023, 10:17:16 AM (15 months ago)
Author:
Laurent Fairhead
Message:

Merged with trunk revision 4586 corresponding to june 2023 testing

Location:
LMDZ6/branches/LMDZ_cdrag_LSCE
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/LMDZ_cdrag_LSCE

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

    r4414 r4669  
    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 blowing_snow_ini_mod, 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, hsalt, 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
    137146! End definition
    138147!****************************************************************************************
     
    165174    alb2(:) = 999999.
    166175    alb1(:) = 999999.
    167    
     176    fluxbs(:)=0. 
    168177    runoff(:) = 0.
    169178!****************************************************************************************
     
    173182    radsol(:) = 0.0
    174183    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
     184
     185!****************************************************************************************
    175186
    176187!****************************************************************************************
     
    264275
    265276
    266 
    267277    ELSE
    268278
     
    314324         flux_u1, flux_v1)
    315325
    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 
    324326
    325327!****************************************************************************************
     
    327329!
    328330!****************************************************************************************
     331 
    329332    CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 
    330333
    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))
     334
     335! EV: following lines are obsolete since we set alb1 and alb2 to constant values
     336! I therefore comment them
     337!    alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + &
     338!         0.6 * (1.0-zfra(1:knon))
    335339!
    336340!IM: plusieurs choix/tests sur l'albedo des "glaciers continentaux"
     
    354358    !z0m = SQRT(z0m**2+rugoro**2)
    355359
     360
     361
     362  ! Simple blowing snow param
     363  if (ok_bs) then
     364       ustart0 = 0.211
     365       rhoice = 920.0
     366       rho0 = 200.0
     367       rhomax=450.0
     368       rhohard=400.0
     369       tau_dens0=86400.0*10.  ! 10 days by default, in s
     370       tau_densmin=86400.0 ! 1 days according to in situ obs by C. Amory
     371
     372       ! computation of threshold friction velocity
     373       ! which depends on surface snow density
     374       do i = 1, knon
     375           ! estimation of snow density
     376           ! snow density increases with snow age and
     377           ! increases even faster in case of sedimentation of blowing snow
     378           tau_dens=max(tau_densmin, tau_dens0*exp(-abs(precip_bs(i))/pbst_bs-abs(precip_rain(i))/prt_bs))
     379           rhos(i)=rho0+(rhohard-rho0)*(1.-exp(-agesno(i)*86400.0/tau_dens))
     380           ! blowing snow flux formula used in MAR
     381           ws1(i)=(u1(i)**2+v1(i)**2)**0.5
     382           ustar(i)=(cdragm(i)*(u1(i)**2+v1(i)**2))**0.5
     383           ustart(i)=ustart0*exp(max(rhoice/rho0-rhoice/rhos(i),0.))*exp(max(0.,rhos(i)-rhomax))
     384           ! we have multiplied by exp to prevent erosion when rhos>rhomax (usefull till
     385           ! rhohard<450)
     386       enddo
     387       
     388       ! computation of qbs at the top of the saltation layer
     389       ! two formulations possible
     390       ! pay attention that qbs is a mixing ratio and has to be converted
     391       ! to specific content
     392       
     393       if (iflag_saltation_bs .eq. 1) then
     394       ! expression from CRYOWRF (Sharma et al. 2022)
     395          aa=2.6
     396          bb=2.5
     397          cc=2.0
     398          lambdasalt=0.45
     399          do i =1, knon
     400               rhod=p1lay(i)/RD/temp_air(i)
     401               nunu=max(ustar(i)/ustart(i),1.e-3)
     402               fluxsalt=rhod/RG*(ustar(i)**3)*(1.-nunu**(-2)) * &
     403                        (aa+bb*nunu**(-2)+cc*nunu**(-1)) 
     404               csalt=fluxsalt/(2.8*ustart(i))
     405               hsalt=0.08436*ustar(i)**1.27
     406               qsalt(i)=1./rhod*csalt*lambdasalt*RG/(max(ustar(i)**2,1E-6)) &
     407                       * exp(-lambdasalt*RG*hsalt/max(ustar(i)**2,1E-6))
     408               qsalt(i)=max(qsalt(i),0.)
     409          enddo
     410
     411
     412       else
     413       ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001)       
     414          do i=1, knon
     415              esalt=1./(3.25*max(ustar(i),0.001))
     416              hsalt=0.08436*ustar(i)**1.27
     417              qsalt(i)=(max(ustar(i)**2-ustart(i)**2,0.))/(RG*hsalt)*esalt
     418              !ep=qsalt*cdragm(i)*sqrt(u1(i)**2+v1(i)**2)
     419          enddo
     420       endif
     421
     422        ! calculation of erosion (emission flux towards the first atmospheric level)
     423        ! consistent with implicit resolution of turbulent mixing equation
     424       do i=1, knon
     425              rhod=p1lay(i)/RD/temp_air(i)
     426              fluxbs(i)=rhod*ws1(i)*cdragm(i)*zeta_bs*(AcoefQBS(i)-qsalt(i)) &
     427                       / (1.-rhod*ws1(i)*zeta_bs*cdragm(i)*BcoefQBS(i)*dtime)
     428              !fluxbs(i)= zeta_bs*rhod*ws1(i)*cdragm(i)*(qbs1(i)-qsalt(i))
     429       enddo
     430
     431       ! for outputs
     432       do j = 1, knon
     433          i = knindex(j)
     434          zxustartlic(i) = ustart(j)
     435          zxrhoslic(i) = rhos(j)
     436       enddo
     437
     438  endif
     439
     440
     441
     442!****************************************************************************************
     443! Calculate surface snow amount
     444!   
     445!****************************************************************************************
     446    IF (ok_bs) THEN
     447      precip_totsnow(:)=precip_snow(:)+precip_bs(:)
     448      evap_totsnow(:)=evap(:)-fluxbs(:) ! flux bs is positive towards the surface (snow erosion)
     449    ELSE
     450      precip_totsnow(:)=precip_snow(:)
     451      evap_totsnow(:)=evap(:)
     452    ENDIF
     453
     454    CALL fonte_neige(knon, is_lic, knindex, dtime, &
     455         tsurf, precip_rain, precip_totsnow,  &
     456         snow, qsol, tsurf_new, evap_totsnow)
     457
     458    WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.                                         
     459    zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0))) 
    356460
    357461
     
    378482    runoff(1:knon)=run_off_lic(1:knon)/dtime
    379483
    380  
    381 !****************************************************************************************
    382484       snow_o=0.
    383485       zfra_o = 0.
     
    420522!albedo SB <<<
    421523
    422  
    423  
    424524
    425525  END SUBROUTINE surf_landice
Note: See TracChangeset for help on using the changeset viewer.