source: LMDZ6/trunk/libf/phylmd/surf_landice_mod.F90

Last change on this file was 4947, checked in by evignon, 6 weeks ago

ajout de la parameterisation de rugosite de la neige sur les calottes de Amory et al. 2017

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 24.3 KB
RevLine 
[781]1!
2MODULE surf_landice_mod
3 
4  IMPLICIT NONE
5
6CONTAINS
7!
8!****************************************************************************************
9!
10  SUBROUTINE surf_landice(itime, dtime, knon, knindex, &
[1865]11       rlon, rlat, debut, lafin, &
12       rmu0, lwdownm, albedo, pphi1, &
[888]13       swnet, lwnet, tsurf, p1lay, &
[4523]14       cdragh, cdragm, precip_rain, precip_snow, precip_bs, temp_air, spechum, &
[1067]15       AcoefH, AcoefQ, BcoefH, BcoefQ, &
16       AcoefU, AcoefV, BcoefU, BcoefV, &
[4529]17       AcoefQBS, BcoefQBS, &
[2240]18       ps, u1, v1, gustiness, rugoro, pctsrf, &
[4523]19       snow, qsurf, qsol, qbs1, agesno, &
20       tsoil, z0m, z0h, SFRWL, alb_dir, alb_dif, evap, fluxsens, fluxlat, fluxbs, &
[1067]21       tsurf_new, dflux_s, dflux_l, &
[3900]22       alt, slope, cloudf, &
[1865]23       snowhgt, qsnow, to_ice, sissnow, &
24       alb3, runoff, &
[1067]25       flux_u1, flux_v1)
[781]26
[1067]27    USE dimphy
[3974]28    USE geometry_mod,     ONLY : longitude,latitude
[3900]29    USE surface_data,     ONLY : type_ocean, calice, calsno, landice_opt, iflag_albcalc
30    USE fonte_neige_mod,  ONLY : fonte_neige,run_off_lic,fqcalving_global,ffonte_global,fqfonte_global,runofflic_global
[1067]31    USE cpl_mod,          ONLY : cpl_send_landice_fields
32    USE calcul_fluxs_mod
[4835]33    USE phys_local_var_mod, ONLY : zxrhoslic, zxustartlic, zxqsaltlic
[4414]34    USE phys_output_var_mod, ONLY : snow_o,zfra_o
[2728]35!FC
36    USE ioipsl_getin_p_mod, ONLY : getin_p
[4835]37    USE lmdz_blowing_snow_ini, ONLY : c_esalt_bs, zeta_bs, pbst_bs, prt_bs, rhoice_bs, rhohard_bs
38    USE lmdz_blowing_snow_ini, ONLY : rhofresh_bs, tau_eqsalt_bs, tau_dens0_bs, tau_densmin_bs
[3792]39#ifdef CPP_INLANDSIS
40    USE surf_inlandsis_mod,  ONLY : surf_inlandsis
41#endif
42
[1785]43    USE indice_sol_mod
[1067]44
[1785]45!    INCLUDE "indicesol.h"
[781]46    INCLUDE "dimsoil.h"
[793]47    INCLUDE "YOMCST.h"
48    INCLUDE "clesphys.h"
[781]49
50! Input variables
51!****************************************************************************************
52    INTEGER, INTENT(IN)                           :: itime, knon
53    INTEGER, DIMENSION(klon), INTENT(in)          :: knindex
54    REAL, INTENT(in)                              :: dtime
[888]55    REAL, DIMENSION(klon), INTENT(IN)             :: swnet ! net shortwave radiance
56    REAL, DIMENSION(klon), INTENT(IN)             :: lwnet ! net longwave radiance
[781]57    REAL, DIMENSION(klon), INTENT(IN)             :: tsurf
58    REAL, DIMENSION(klon), INTENT(IN)             :: p1lay
[1067]59    REAL, DIMENSION(klon), INTENT(IN)             :: cdragh, cdragm
[4523]60    REAL, DIMENSION(klon), INTENT(IN)             :: precip_rain, precip_snow, precip_bs
[781]61    REAL, DIMENSION(klon), INTENT(IN)             :: temp_air, spechum
[1067]62    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefH, AcoefQ
63    REAL, DIMENSION(klon), INTENT(IN)             :: BcoefH, BcoefQ
64    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefU, AcoefV, BcoefU, BcoefV
[4529]65    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefQBS, BcoefQBS
[781]66    REAL, DIMENSION(klon), INTENT(IN)             :: ps
[4523]67    REAL, DIMENSION(klon), INTENT(IN)             :: u1, v1, gustiness, qbs1
[781]68    REAL, DIMENSION(klon), INTENT(IN)             :: rugoro
69    REAL, DIMENSION(klon,nbsrf), INTENT(IN)       :: pctsrf
70
[1865]71    LOGICAL,  INTENT(IN)                          :: debut   !true if first step
72    LOGICAL,  INTENT(IN)                          :: lafin   !true if last step
73    REAL, DIMENSION(klon), INTENT(IN)             :: rlon, rlat
74    REAL, DIMENSION(klon), INTENT(IN)             :: rmu0
75    REAL, DIMENSION(klon), INTENT(IN)             :: lwdownm !ylwdown
76    REAL, DIMENSION(klon), INTENT(IN)             :: albedo  !mean albedo
77    REAL, DIMENSION(klon), INTENT(IN)             :: pphi1   
[3900]78    REAL, DIMENSION(klon), INTENT(IN)             :: alt   !mean altitude of the grid box 
[1865]79    REAL, DIMENSION(klon), INTENT(IN)             :: slope   !mean slope in grid box 
80    REAL, DIMENSION(klon), INTENT(IN)             :: cloudf  !total cloud fraction
81
[781]82! In/Output variables
83!****************************************************************************************
84    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
85    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
86    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
87
88! Output variables
89!****************************************************************************************
90    REAL, DIMENSION(klon), INTENT(OUT)            :: qsurf
[2243]91    REAL, DIMENSION(klon), INTENT(OUT)            :: z0m, z0h
[2227]92!albedo SB >>>
93!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb1  ! new albedo in visible SW interval
94!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb2  ! new albedo in near IR interval
[3792]95    REAL, DIMENSION(6), INTENT(IN)                :: SFRWL
96    REAL, DIMENSION(klon,nsw), INTENT(OUT)        :: alb_dir,alb_dif
[2227]97!albedo SB <<<
[781]98    REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat
[4523]99    REAL, DIMENSION(klon), INTENT(OUT)            :: fluxbs
[888]100    REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
[781]101    REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l     
[1067]102    REAL, DIMENSION(klon), INTENT(OUT)            :: flux_u1, flux_v1
[781]103
[1865]104    REAL, DIMENSION(klon), INTENT(OUT)           :: alb3
105    REAL, DIMENSION(klon), INTENT(OUT)           :: qsnow   !column water in snow [kg/m2]
106    REAL, DIMENSION(klon), INTENT(OUT)           :: snowhgt !Snow height (m)
107    REAL, DIMENSION(klon), INTENT(OUT)           :: to_ice
108    REAL, DIMENSION(klon), INTENT(OUT)           :: sissnow
109    REAL, DIMENSION(klon), INTENT(OUT)           :: runoff  !Land ice runoff
110 
111
[781]112! Local variables
113!****************************************************************************************
114    REAL, DIMENSION(klon)    :: soilcap, soilflux
115    REAL, DIMENSION(klon)    :: cal, beta, dif_grnd
116    REAL, DIMENSION(klon)    :: zfra, alb_neig
[888]117    REAL, DIMENSION(klon)    :: radsol
[3792]118    REAL, DIMENSION(klon)    :: u0, v0, u1_lay, v1_lay, ustar
119    INTEGER                  :: i,j,nt
[3900]120    REAL, DIMENSION(klon)    :: fqfonte,ffonte
[4283]121    REAL, DIMENSION(klon)    :: run_off_lic_frac
[1865]122    REAL, DIMENSION(klon)    :: emis_new                  !Emissivity
123    REAL, DIMENSION(klon)    :: swdown,lwdown
[3900]124    REAL, DIMENSION(klon)    :: precip_snow_adv, snow_adv !Snow Drift precip./advection (not used in inlandsis)
125    REAL, DIMENSION(klon)    :: erod                      !erosion of surface snow (flux, kg/m2/s like evap)
126    REAL, DIMENSION(klon)    :: zsl_height, wind_velo     !surface layer height, wind spd
[1865]127    REAL, DIMENSION(klon)    :: dens_air,  snow_cont_air  !air density; snow content air
128    REAL, DIMENSION(klon)    :: alb_soil                  !albedo of underlying ice
129    REAL, DIMENSION(klon)    :: pexner                    !Exner potential
130    REAL                     :: pref
[3792]131    REAL, DIMENSION(klon,nsoilmx) :: tsoil0               !modif
132    REAL                          :: dtis                ! subtimestep
133    LOGICAL                       :: debut_is, lafin_is  ! debut and lafin for inlandsis
[1865]134
135    CHARACTER (len = 20)                      :: modname = 'surf_landice'
136    CHARACTER (len = 80)                      :: abort_message
137
[2728]138
[3900]139    REAL,DIMENSION(klon) :: alb1,alb2
[4523]140    REAL,DIMENSION(klon) :: precip_totsnow, evap_totsnow
[3900]141    REAL, DIMENSION (klon,6) :: alb6
[4835]142    REAL                   :: esalt
[4529]143    REAL                   :: lambdasalt,fluxsalt, csalt, nunu, aa, bb, cc
[4916]144    REAL                   :: tau_dens, maxerosion
[4835]145    REAL, DIMENSION(klon)  :: ws1, rhod, rhos, ustart0, ustart, qsalt, hsalt
[4916]146    REAL, DIMENSION(klon)  :: fluxbs_1, fluxbs_2, bsweight_fresh
147    LOGICAL, DIMENSION(klon) :: ok_remaining_freshsnow
[4947]148    REAL  :: ta1, ta2, ta3, z01, z02, z03, coefa, coefb, coefc, coefd
[4672]149
[4947]150
[781]151! End definition
152!****************************************************************************************
[2728]153!FC
154!FC
155   REAL,SAVE :: alb_vis_sno_lic
156  !$OMP THREADPRIVATE(alb_vis_sno_lic)
157   REAL,SAVE :: alb_nir_sno_lic
158  !$OMP THREADPRIVATE(alb_nir_sno_lic)
159  LOGICAL, SAVE :: firstcall = .TRUE.
160  !$OMP THREADPRIVATE(firstcall)
161
162
[3792]163!FC firtscall initializations
164!******************************************************************************************
[2728]165  IF (firstcall) THEN
166  alb_vis_sno_lic=0.77
167  CALL getin_p('alb_vis_sno_lic',alb_vis_sno_lic)
168           PRINT*, 'alb_vis_sno_lic',alb_vis_sno_lic
169  alb_nir_sno_lic=0.77
170  CALL getin_p('alb_nir_sno_lic',alb_nir_sno_lic)
171           PRINT*, 'alb_nir_sno_lic',alb_nir_sno_lic
[3792]172 
[2728]173  firstcall=.false.
174  ENDIF
[3792]175!******************************************************************************************
176
[781]177! Initialize output variables
[1865]178    alb3(:) = 999999.
[888]179    alb2(:) = 999999.
180    alb1(:) = 999999.
[4523]181    fluxbs(:)=0. 
[1865]182    runoff(:) = 0.
[888]183!****************************************************************************************
184! Calculate total absorbed radiance at surface
185!
186!****************************************************************************************
187    radsol(:) = 0.0
188    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
[781]189
190!****************************************************************************************
[4523]191
192!****************************************************************************************
[3792]193!  landice_opt = 0 : soil_model, calcul_flux, fonte_neige, ... 
[3901]194!  landice_opt = 1  : prepare and call INterace Lmdz SISvat (INLANDSIS)
[1865]195!****************************************************************************************
[3792]196
197
198    IF (landice_opt .EQ. 1) THEN
199
[3901]200!****************************************************************************************   
[3792]201! CALL to INLANDSIS interface
202!****************************************************************************************
203#ifdef CPP_INLANDSIS
204
205        debut_is=debut
206        lafin_is=.false.
207        ! Suppose zero surface speed
208        u0(:)            = 0.0
209        v0(:)            = 0.0
210
211
212        CALL calcul_flux_wind(knon, dtime, &
213         u0, v0, u1, v1, gustiness, cdragm, &
214         AcoefU, AcoefV, BcoefU, BcoefV, &
215         p1lay, temp_air, &
216         flux_u1, flux_v1)
217
218       
219       ! Set constants and compute some input for SISVAT
220       ! = 1000 hPa
221       ! and calculate incoming flux for SW and LW interval: swdown, lwdown
222       swdown(:)        = 0.0
223       lwdown(:)        = 0.0
[3900]224       snow_cont_air(:) = 0.  ! the snow content in air is not a prognostic variable of the model     
[3792]225       alb_soil(:)      = 0.4 ! before albedo(:) but here it is the ice albedo that we have to set
226       ustar(:)         = 0.
227       pref             = 100000.       
228       DO i = 1, knon
229          swdown(i)        = swnet(i)/(1-albedo(i))
230          lwdown(i)        = lwdownm(i)
231          wind_velo(i)     = u1(i)**2 + v1(i)**2
232          wind_velo(i)     = wind_velo(i)**0.5
233          pexner(i)        = (p1lay(i)/pref)**(RD/RCPD)
234          dens_air(i)      = p1lay(i)/RD/temp_air(i)  ! dry air density
235          zsl_height(i)    = pphi1(i)/RG     
236          tsoil0(i,:)      = tsoil(i,:) 
237          ustar(i)= (cdragm(i)*(wind_velo(i)**2))**0.5   
238       END DO
239       
240
241
[3900]242        dtis=dtime
[3792]243
[3900]244          IF (lafin) THEN
[3792]245            lafin_is=.true.
246          END IF
247
[3900]248          CALL surf_inlandsis(knon, rlon, rlat, knindex, itime, dtis, debut_is, lafin_is,&
249            rmu0, swdown, lwdown, albedo, pexner, ps, p1lay, precip_rain, precip_snow,   &
250            zsl_height, wind_velo, ustar, temp_air, dens_air, spechum, tsurf,&
251            rugoro, snow_cont_air, alb_soil, alt, slope, cloudf, &
252            radsol, qsol, tsoil0, snow, zfra, snowhgt, qsnow, to_ice, sissnow,agesno,   &
[3792]253            AcoefH, AcoefQ, BcoefH, BcoefQ, cdragm, cdragh, &
[3900]254            run_off_lic, fqfonte, ffonte, evap, erod, fluxsens, fluxlat,dflux_s, dflux_l, &
255            tsurf_new, alb1, alb2, alb3, alb6, &
256            emis_new, z0m, z0h, qsurf)
[3792]257
[3900]258          debut_is=.false.
[3792]259
260
[3900]261        ! Treatment of snow melting and calving
[3792]262
[3900]263        ! for consistency with standard LMDZ, add calving to run_off_lic
264        run_off_lic(:)=run_off_lic(:) + to_ice(:)
265
266        DO i = 1, knon
267           ffonte_global(knindex(i),is_lic)    = ffonte(i)
268           fqfonte_global(knindex(i),is_lic)   = fqfonte(i)! net melting= melting - refreezing
269           fqcalving_global(knindex(i),is_lic) = to_ice(i) ! flux
270           runofflic_global(knindex(i)) = run_off_lic(i)
271        ENDDO
272        ! Here, we assume that the calving term is equal to the to_ice term
273        ! (no ice accumulation)
274
275
[3792]276#else
[3901]277       abort_message='Pb de coherence: landice_opt = 1  mais CPP_INLANDSIS = .false.'
[3792]278       CALL abort_physic(modname,abort_message,1)
279#endif
280
281
282    ELSE
283
284!****************************************************************************************
[781]285! Soil calculations
286!
287!****************************************************************************************
[3780]288
289    ! EV: use calbeta
290    CALL calbeta(dtime, is_lic, knon, snow, qsol, beta, cal, dif_grnd)
291
292
293    ! use soil model and recalculate properly cal
[781]294    IF (soil_model) THEN
[3974]295       CALL soil(dtime, is_lic, knon, snow, tsurf, qsol, &
296        & longitude(knindex(1:knon)), latitude(knindex(1:knon)), tsoil, soilcap, soilflux)
[781]297       cal(1:knon) = RCPD / soilcap(1:knon)
298       radsol(1:knon)  = radsol(1:knon) + soilflux(1:knon)
299    ELSE
300       cal = RCPD * calice
301       WHERE (snow > 0.0) cal = RCPD * calsno
302    ENDIF
303
304
305!****************************************************************************************
306! Calulate fluxes
307!
308!****************************************************************************************
[3792]309!    beta(:) = 1.0
310!    dif_grnd(:) = 0.0
[781]311
[1067]312! Suppose zero surface speed
313    u0(:)=0.0
314    v0(:)=0.0
315    u1_lay(:) = u1(:) - u0(:)
316    v1_lay(:) = v1(:) - v0(:)
317
[781]318    CALL calcul_fluxs(knon, is_lic, dtime, &
[2254]319         tsurf, p1lay, cal, beta, cdragh, cdragh, ps, &
[781]320         precip_rain, precip_snow, snow, qsurf,  &
[2240]321         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
[2254]322         1.,AcoefH, AcoefQ, BcoefH, BcoefQ, &
[781]323         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
324
[1067]325    CALL calcul_flux_wind(knon, dtime, &
[2240]326         u0, v0, u1, v1, gustiness, cdragm, &
[1067]327         AcoefU, AcoefV, BcoefU, BcoefV, &
328         p1lay, temp_air, &
329         flux_u1, flux_v1)
[781]330
331
332!****************************************************************************************
333! Calculate albedo
334!
335!****************************************************************************************
[3780]336
[781]337!
338!IM: plusieurs choix/tests sur l'albedo des "glaciers continentaux"
[888]339!       alb1(1 : knon)  = 0.6 !IM cf FH/GK
340!       alb1(1 : knon)  = 0.82
341!       alb1(1 : knon)  = 0.77 !211003 Ksta0.77
342!       alb1(1 : knon)  = 0.8 !KstaTER0.8 & LMD_ARMIP5
[781]343!IM: KstaTER0.77 & LMD_ARMIP6   
344
[3780]345! Attantion: alb1 and alb2 are not the same!
[2728]346    alb1(1:knon)  = alb_vis_sno_lic
347    alb2(1:knon)  = alb_nir_sno_lic
[781]348
349
350!****************************************************************************************
351! Rugosity
352!
353!****************************************************************************************
[2243]354
[4947]355if (z0m_landice .GT. 0.) then
356    z0m(1:knon) = z0m_landice
357    z0h(1:knon) = z0h_landice
358else
359    ! parameterization of z0=f(T) following measurements in Adelie Land by Amory et al 2018
360    coefa = 0.1658 !0.1862 !Ant
361    coefb = -50.3869 !-55.7718 !Ant
362    ta1 = 253.15 !255. Ant
363    ta2 = 273.15
364    ta3 = 273.15+3
365    z01 = exp(coefa*ta1 + coefb) !~0.2 ! ~0.25 mm
366    z02 = exp(coefa*ta2 + coefb) !~6  !~7 mm
367    z03 = z01
368    coefc = log(z03/z02)/(ta3-ta2)
369    coefd = log(z03)-coefc*ta3
370    do j=1,knon
371      if (temp_air(j) .lt. ta1) then
372        z0m(j) = z01
373      else if (temp_air(j).ge.ta1 .and. temp_air(j).lt.ta2) then
374        z0m(j) = exp(coefa*temp_air(j) + coefb)
375      else if (temp_air(j).ge.ta2 .and. temp_air(j).lt.ta3) then
376        ! if st > 0, melting induce smooth surface
377        z0m(j) = exp(coefc*temp_air(j) + coefd)
378      else
379        z0m(j) = z03
380      endif
381      z0h(j)=z0m(j)
382    enddo
[781]383
[4947]384endif   
385 
386
[4835]387!****************************************************************************************
388! Simple blowing snow param
389!****************************************************************************************
390! we proceed in 2 steps:
391! first we erode - if possible -the accumulated snow during the time step
392! then we update the density of the underlying layer and see if we can also erode
393! this layer
[1865]394
[4529]395
[4835]396   if (ok_bs) then
397       fluxbs(:)=0.
[4947]398       do j=1,knon
[4835]399          ws1(j)=(u1(j)**2+v1(j)**2)**0.5
400          ustar(j)=(cdragm(j)*(u1(j)**2+v1(j)**2))**0.5
401          rhod(j)=p1lay(j)/RD/temp_air(j)
402          ustart0(j) =(log(2.868)-log(1.625))/0.085*sqrt(cdragm(j))
403       enddo
404
405       ! 1st step: erosion of fresh snow accumulated during the time step
406       do j=1, knon
[4916]407       if (precip_snow(j) .GT. 0.) then
[4835]408           rhos(j)=rhofresh_bs
409           ! blowing snow flux formula used in MAR
410           ustart(j)=ustart0(j)*exp(max(rhoice_bs/rhofresh_bs-rhoice_bs/rhos(j),0.))*exp(max(0.,rhos(j)-rhohard_bs))
411           ! we have multiplied by exp to prevent erosion when rhos>rhohard_bs
412           ! computation of qbs at the top of the saltation layer
413           ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001)
414           esalt=1./(c_esalt_bs*max(1.e-6,ustar(j)))
415           hsalt(j)=0.08436*(max(1.e-6,ustar(j))**1.27)
416           qsalt(j)=(max(ustar(j)**2-ustart(j)**2,0.))/(RG*hsalt(j))*esalt
417           ! calculation of erosion (flux positive towards the surface here)
418           ! consistent with implicit resolution of turbulent mixing equation
419           ! Nemoto and Nishimura 2004 show that steady-state saltation is achieved within a time tau_eqsalt_bs of about 10s
420           ! we thus prevent snowerosion (snow particle transfer from the saltation layer to the first model level)
421           ! integrated over tau_eqsalt_bs to exceed the total mass of snow particle in the saltation layer
422           ! (rho*qsalt*hsalt)
423           ! during this first step we also lower bound the erosion to the amount of fresh snow accumulated during the time step
424           maxerosion=min(precip_snow(j),hsalt(j)*qsalt(j)*rhod(j)/tau_eqsalt_bs)
425
[4916]426           fluxbs_1(j)=rhod(j)*ws1(j)*cdragh(j)*zeta_bs*(AcoefQBS(j)-qsalt(j)) &
427                   / (1.-rhod(j)*ws1(j)*cdragh(j)*zeta_bs*BcoefQBS(j)*dtime)
428           fluxbs_1(j)=max(-maxerosion,fluxbs_1(j))
429
430           if (precip_snow(j) .gt. abs(fluxbs_1(j))) then
431               ok_remaining_freshsnow(j)=.true.
432               bsweight_fresh(j)=1.
433           else
434               ok_remaining_freshsnow(j)=.false.
435               bsweight_fresh(j)=exp(-(abs(fluxbs_1(j))-precip_snow(j))/precip_snow(j))
436           endif
437       else
438           ok_remaining_freshsnow(j)=.false.
439           fluxbs_1(j)=0.
440           bsweight_fresh(j)=0.
441       endif
[4835]442       enddo
443
444
445       ! we now compute the snow age of the overlying layer (snow surface after erosion of the fresh snow accumulated during the time step)
446       ! this is done through the routine albsno
[4916]447       CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)+fluxbs_1(:))
[4835]448
449       ! 2nd step:
[4529]450       ! computation of threshold friction velocity
451       ! which depends on surface snow density
[4672]452       do j = 1, knon
[4916]453        if (ok_remaining_freshsnow(j)) then
454           fluxbs_2(j)=0.
455        else
456           ! we start eroding the underlying layer
[4523]457           ! estimation of snow density
458           ! snow density increases with snow age and
[4672]459           ! increases even faster in case of sedimentation of blowing snow or rain
[4835]460           tau_dens=max(tau_densmin_bs, tau_dens0_bs*exp(-abs(precip_bs(j))/pbst_bs - &
461                    abs(precip_rain(j))/prt_bs)*exp(-max(tsurf(j)-RTT,0.)))
462           rhos(j)=rhofresh_bs+(rhohard_bs-rhofresh_bs)*(1.-exp(-agesno(j)*86400.0/tau_dens))
[4523]463           ! blowing snow flux formula used in MAR
[4835]464           ustart(j)=ustart0(j)*exp(max(rhoice_bs/rhofresh_bs-rhoice_bs/rhos(j),0.))*exp(max(0.,rhos(j)-rhohard_bs))
465           ! we have multiplied by exp to prevent erosion when rhos>rhohard_bs
466           ! computation of qbs at the top of the saltation layer
467           ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001)
[4916]468           esalt=1./(c_esalt_bs*max(1.e-6,ustar(j)))
[4835]469           hsalt(j)=0.08436*(max(1.e-6,ustar(j))**1.27)
470           qsalt(j)=(max(ustar(j)**2-ustart(j)**2,0.))/(RG*hsalt(j))*esalt
471           ! calculation of erosion (flux positive towards the surface here)
472           ! consistent with implicit resolution of turbulent mixing equation
473           ! Nemoto and Nishimura 2004 show that steady-state saltation is achieved within a time tau_eqsalt_bs of about 10s
474           ! we thus prevent snowerosion (snow particle transfer from the saltation layer to the first model level)
475           ! integrated over tau_eqsalt_bs to exceed the total mass of snow particle in the saltation layer
476           ! (rho*qsalt*hsalt)
477           maxerosion=hsalt(j)*qsalt(j)*rhod(j)/tau_eqsalt_bs
[4916]478           fluxbs_2(j)=rhod(j)*ws1(j)*cdragh(j)*zeta_bs*(AcoefQBS(j)-qsalt(j)) &
479                   / (1.-rhod(j)*ws1(j)*cdragh(j)*zeta_bs*BcoefQBS(j)*dtime)
480           fluxbs_2(j)=max(-maxerosion,fluxbs_2(j))
481         endif
[4523]482       enddo
483
[4916]484
485
486
487       ! final flux and outputs       
[4835]488        do j=1, knon
[4916]489              ! total flux is the erosion of fresh snow +
490              ! a fraction of the underlying snow (if all the fresh snow has been eroded)
491              ! the calculation of the fraction is quite delicate since we do not know
492              ! how much time was needed to erode the fresh snow. We assume that this time
493              ! is dt*exp(-(abs(fluxbs1)-precipsnow)/precipsnow)=dt*bsweight_fresh
494
495              fluxbs(j)=fluxbs_1(j)+fluxbs_2(j)*(1.-bsweight_fresh(j))
[4672]496              i = knindex(j)
497              zxustartlic(i) = ustart(j)
498              zxrhoslic(i) = rhos(j)
[4835]499              zxqsaltlic(i)=qsalt(j)
500        enddo
[4523]501
502
[4916]503  else ! not ok_bs
[4835]504  ! those lines are useful to calculate the snow age
505       CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:))
[4523]506
[4835]507  endif ! if ok_bs
[4523]508
[4835]509
510
[4523]511!****************************************************************************************
[4672]512! Calculate snow amount
[4523]513!   
514!****************************************************************************************
515    IF (ok_bs) THEN
[4526]516      precip_totsnow(:)=precip_snow(:)+precip_bs(:)
517      evap_totsnow(:)=evap(:)-fluxbs(:) ! flux bs is positive towards the surface (snow erosion)
[4523]518    ELSE
[4526]519      precip_totsnow(:)=precip_snow(:)
520      evap_totsnow(:)=evap(:)
[4523]521    ENDIF
[4672]522   
523 
[4523]524    CALL fonte_neige(knon, is_lic, knindex, dtime, &
525         tsurf, precip_rain, precip_totsnow,  &
526         snow, qsol, tsurf_new, evap_totsnow)
[4672]527   
528   
[4523]529    WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.                                         
530    zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0))) 
531
532
[3792]533    END IF ! landice_opt
534
535
[781]536!****************************************************************************************
537! Send run-off on land-ice to coupler if coupled ocean.
[3903]538! run_off_lic has been calculated in fonte_neige or surf_inlandsis
[4283]539! If landice_opt>=2, corresponding call is done from surf_land_orchidee
[781]540!****************************************************************************************
[4283]541    IF (type_ocean=='couple' .AND. landice_opt .LT. 2) THEN
542       ! Compress fraction where run_off_lic is active (here all pctsrf(is_lic))
543       run_off_lic_frac(:)=0.0
544       DO j = 1, knon
545          i = knindex(j)
546          run_off_lic_frac(j) = pctsrf(i,is_lic)
547       ENDDO
548
549       CALL cpl_send_landice_fields(itime, knon, knindex, run_off_lic, run_off_lic_frac)
[781]550    ENDIF
[1865]551
552 ! transfer runoff rate [kg/m2/s](!) to physiq for output
553    runoff(1:knon)=run_off_lic(1:knon)/dtime
554
[1403]555       snow_o=0.
556       zfra_o = 0.
557       DO j = 1, knon
558           i = knindex(j)
559           snow_o(i) = snow(j)
560           zfra_o(i) = zfra(j)
561       ENDDO
562
563
[2227]564!albedo SB >>>
565     select case(NSW)
566     case(2)
567       alb_dir(1:knon,1)=alb1(1:knon)
568       alb_dir(1:knon,2)=alb2(1:knon)
569     case(4)
570       alb_dir(1:knon,1)=alb1(1:knon)
571       alb_dir(1:knon,2)=alb2(1:knon)
572       alb_dir(1:knon,3)=alb2(1:knon)
573       alb_dir(1:knon,4)=alb2(1:knon)
574     case(6)
575       alb_dir(1:knon,1)=alb1(1:knon)
576       alb_dir(1:knon,2)=alb1(1:knon)
577       alb_dir(1:knon,3)=alb1(1:knon)
578       alb_dir(1:knon,4)=alb2(1:knon)
579       alb_dir(1:knon,5)=alb2(1:knon)
580       alb_dir(1:knon,6)=alb2(1:knon)
[3900]581
[3901]582       IF ((landice_opt .EQ. 1) .AND. (iflag_albcalc .EQ. 2)) THEN
[3900]583       alb_dir(1:knon,1)=alb6(1:knon,1)
584       alb_dir(1:knon,2)=alb6(1:knon,2)
585       alb_dir(1:knon,3)=alb6(1:knon,3)
586       alb_dir(1:knon,4)=alb6(1:knon,4)
587       alb_dir(1:knon,5)=alb6(1:knon,5)
588       alb_dir(1:knon,6)=alb6(1:knon,6)
589       ENDIF
590
[2227]591     end select
592alb_dif=alb_dir
593!albedo SB <<<
594
595
[781]596  END SUBROUTINE surf_landice
597!
598!****************************************************************************************
599!
600END MODULE surf_landice_mod
601
602
603
Note: See TracBrowser for help on using the repository browser.