Ignore:
Timestamp:
Jul 28, 2025, 7:23:15 PM (6 days ago)
Author:
aborella
Message:

Merge with trunk r5789

Location:
LMDZ6/branches/contrails
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/contrails

  • LMDZ6/branches/contrails/libf/phylmd/ocean_forced_mod.F90

    r5618 r5791  
    2222       radsol, snow, agesno, &
    2323       qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    24        tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa &
     24       tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa, &
     25       dthetadz300,pctsrf,Ampl &
    2526#ifdef ISO
    2627       ,xtprecip_rain, xtprecip_snow, xtspechum,Roce,rlat, &
     
    3940    USE mod_grid_phy_lmdz
    4041    USE indice_sol_mod
     42    USE surface_data,     ONLY : iflag_leads
    4143    USE phys_output_var_mod, ONLY : sens_prec_liq_o, sens_prec_sol_o, lat_prec_liq_o, lat_prec_sol_o
    4244    use config_ocean_skin_m, only: activate_ocean_skin
     
    6971    REAL, DIMENSION(klon), INTENT(IN)        :: tsurf_in
    7072    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
     73!GG
     74     REAL, DIMENSION(klon), INTENT(IN)        :: dthetadz300
     75     REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
     76!
    7177
    7278#ifdef ISO
     
    9399    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
    94100    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l
    95     REAL, intent(out):: sens_prec_liq(:) ! (knon)
     101    REAL, INTENT(out):: sens_prec_liq(:) ! (knon)
     102!GG
     103     REAL, DIMENSION(klon), INTENT(OUT)       :: Ampl
     104!
    96105
    97106#ifdef ISO     
     
    110119    REAL, DIMENSION(knon)       :: sens_prec_sol
    111120    REAL, DIMENSION(klon)       :: lat_prec_liq, lat_prec_sol   
     121! GG
     122    REAL, DIMENSION(klon)       :: l_CBL, sicfra
     123!
    112124#ifdef ISO   
    113125    REAL, PARAMETER :: t_coup = 273.15     
     
    204216    enddo
    205217
     218!GG
     219    if (iflag_leads == 1) then
     220      l_CBL = -52381.*dthetadz300 + 3008.1
     221      Ampl = 6.012e-08*l_CBL**2 - 4.036e-04*l_CBL + 1.4979
     222      WHERE(Ampl(:)>1.2) Ampl(:)=1.2
     223      sicfra(:)=pctsrf(:,is_sic)/(1.-pctsrf(:,is_lic)-pctsrf(:,is_ter))
     224      WHERE(pctsrf(:,is_sic)+pctsrf(:,is_oce)<EPSFRA) sicfra(:)=0.
     225      WHERE(sicfra<0.7) Ampl(:)=1.
     226      WHERE((sicfra>0.7).and.(sicfra<0.9)) Ampl=((sicfra-0.7)/0.2)*Ampl+((0.9-sicfra)/0.2)
     227      fluxsens=Ampl*fluxsens
     228      dflux_s=Ampl*dflux_s
     229    endif
     230
    206231
    207232! - Flux calculation at first modele level for U and V
     
    244269       AcoefH, AcoefQ, BcoefH, BcoefQ, &
    245270       AcoefU, AcoefV, BcoefU, BcoefV, &
    246        ps, u1, v1, gustiness, &
     271!GG       ps, u1, v1, gustiness, &
     272       ps, u1, v1, gustiness, pctsrf, &
     273!GG
    247274       radsol, snow, qsol, agesno, tsoil, &
    248275       qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    249        tsurf_new, dflux_s, dflux_l, rhoa &
     276!GG       tsurf_new, dflux_s, dflux_l, rhoa)
     277       tsurf_new, dflux_s, dflux_l, rhoa, swnet, hice, tice, bilg_cumul, &
     278       fcds, fcdi, dh_basal_growth, dh_basal_melt, dh_top_melt, dh_snow2sic, &
     279       dtice_melt, dtice_snow2sic &
     280!GG
    250281#ifdef ISO
    251282       ,xtprecip_rain, xtprecip_snow, xtspechum,Roce, &
     
    261292    USE geometry_mod, ONLY: longitude,latitude
    262293    USE calcul_fluxs_mod
    263     USE surface_data,     ONLY : calice, calsno
     294!GG    USE surface_data,     ONLY : calice, calsno
     295    USE surface_data,     ONLY : calice, calsno, iflag_seaice, iflag_seaice_alb, &
     296            sice_cond, sisno_cond, sisno_den, sisno_min, sithick_min, sisno_wfact, &
     297            amax_s,amax_n, rn_alb_sdry, rn_alb_smlt, rn_alb_idry, rn_alb_imlt, &
     298            si_pen_frac, si_pen_ext, fseaN, fseaS, iflag_leads
     299
     300    USE geometry_mod, ONLY: longitude,latitude,latitude_deg
     301!GG
    264302    USE limit_read_mod
    265303    USE fonte_neige_mod,  ONLY : fonte_neige
     
    298336    REAL, DIMENSION(klon), INTENT(IN)    :: u1, v1, gustiness
    299337    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
     338!GG
     339    REAL, DIMENSION(klon), INTENT(IN)    :: swnet
     340    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
     341!GG
    300342#ifdef ISO
    301343    REAL, DIMENSION(ntiso,klon), INTENT(IN) :: xtprecip_rain, xtprecip_snow
     
    311353    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    312354    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
     355!GG
     356    REAL, DIMENSION(klon), INTENT(INOUT)          :: hice
     357    REAL, DIMENSION(klon), INTENT(INOUT)          :: tice
     358    REAL, DIMENSION(klon), INTENT(INOUT)          :: bilg_cumul
     359    REAL, DIMENSION(klon), INTENT(INOUT)          :: fcds
     360    REAL, DIMENSION(klon), INTENT(INOUT)          :: fcdi
     361    REAL, DIMENSION(klon), INTENT(INOUT)          :: dh_basal_growth
     362    REAL, DIMENSION(klon), INTENT(INOUT)          :: dh_basal_melt
     363    REAL, DIMENSION(klon), INTENT(INOUT)          :: dh_top_melt
     364    REAL, DIMENSION(klon), INTENT(INOUT)          :: dh_snow2sic
     365    REAL, DIMENSION(klon), INTENT(INOUT)          :: dtice_melt
     366    REAL, DIMENSION(klon), INTENT(INOUT)          :: dtice_snow2sic
     367!GG
    313368#ifdef ISO     
    314369    REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: xtsnow
     
    342397    REAL, DIMENSION(knon)       :: sens_prec_liq, sens_prec_sol
    343398    REAL, DIMENSION(klon)       :: lat_prec_liq, lat_prec_sol   
     399!GG
     400    INTEGER                     :: ki
     401    INTEGER                     :: cpl_pas
     402    REAL, DIMENSION(klon)       :: bilg, fsic, f_bot
     403    REAL, PARAMETER             :: latent_ice = 334.0e3
     404    REAL, PARAMETER             :: rau_ice = 917.0
     405    REAL, PARAMETER             :: kice=2.2
     406    REAL                  :: f_cond, f_swpen, f_cond_s, f_cond_i
     407    REAL                  :: ustar, uscap, ustau
     408    ! for snow/ice albedo:
     409    REAL                  :: alb_snow, alb_ice, alb_pond
     410    REAL                  :: frac_snow, frac_ice, frac_pond
     411    REAL                  :: z1_i, z2_i, z1_s, zlog ! height parameters
     412    ! for ice melt / freeze
     413    REAL                  :: e_melt, snow_evap, h_test
     414    ! dhsic, dfsic change in ice mass, fraction.
     415    REAL                  :: dhsic, dfsic, frac_mf
     416    REAL                        :: fsea, amax
     417    REAL                  :: hice_i, tice_i, fsic_new
     418! snow and ice physical characteristics:
     419    REAL, PARAMETER :: t_freeze=271.35 ! freezing sea water temp
     420    REAL, PARAMETER :: t_melt=273.15   ! melting ice temp
     421    REAL :: sno_den!=sisno_den !mean snow density, kg/m3
     422    REAL, PARAMETER :: ice_den=917. ! ice density
     423    REAL, PARAMETER :: sea_den=1025. ! sea water density
     424    REAL :: ice_cond!=sice_cond*ice_den !conductivity of ice
     425    REAL :: sno_cond!=sisno_cond*sno_den ! conductivity of snow
     426    REAL, PARAMETER :: ice_cap=2067.   ! specific heat capacity, snow and ice
     427    REAL, PARAMETER :: sea_cap=3995.   ! specific heat capacity, water
     428    REAL, PARAMETER :: ice_lat=334000. ! freeze /melt latent heat snow and ice
     429
     430! control of snow and ice cover & freeze / melt (heights converted to kg/m2)
     431    REAL :: snow_min!=sisno_min*sno_den !critical snow height 5 cm
     432    REAL :: snow_wfact!=sisno_wfact ! max fraction of falling snow blown into ocean
     433    REAL, PARAMETER :: ice_frac_min=0.005
     434    REAL :: h_ice_min!=sithick_min ! min ice thickness
     435    ! below ice_thin, priority is melt lateral / grow height
     436    ! ice_thin is also height of new ice
     437    REAL, PARAMETER :: h_ice_max=7 ! max ice height
     438    ! Ice thickness parameter for lateral growth
     439    REAL, PARAMETER :: h_ice_thick=1.5
     440    REAL, PARAMETER :: h_ice_thin=0.15
     441
     442! albedo  and radiation parameters
     443    INTEGER, SAVE :: iflag_sic_albedo
     444! albedo old or NEMO
     445    REAL :: alb_sno_dry!=rn_alb_sdry !dry snow albedo
     446    REAL :: alb_sno_wet!=rn_alb_smlt !wet snow albedo
     447    REAL :: alb_ice_dry!=rn_alb_idry !dry thick ice
     448    REAL :: alb_ice_wet!=rn_alb_imlt !melting thick ice
     449! new (Toyoda 2020) albedo
     450! Values for snow / ice, dry / melting, visible / near IR
     451    REAL, PARAMETER :: alb_sdry_vis=0.98
     452    REAL, PARAMETER :: alb_smlt_vis=0.88
     453    REAL, PARAMETER :: alb_sdry_nir=0.7
     454    REAL, PARAMETER :: alb_smlt_nir=0.55
     455    REAL, PARAMETER :: alb_idry_vis=0.78
     456    REAL, PARAMETER :: alb_imlt_vis=0.705
     457    REAL, PARAMETER :: alb_idry_nir=0.36
     458    REAL, PARAMETER :: alb_imlt_nir=0.285
     459    REAL, PARAMETER :: h_ice_alb=0.5*ice_den ! height for full ice albedo
     460    REAL, PARAMETER :: h_sno_alb=0.02*300 ! height for control of snow fraction
     461
     462    REAL :: pen_frac !=si_pen_frac !fraction of shortwave penetrating into the
     463    ! ice (not snow). Should be visible only, not NIR
     464    REAL :: pen_ext !=si_pen_ext !extinction length of penetrating shortwave (m-1)
     465
     466! HF from ocean below ice
     467!    REAL, PARAMETER :: fseaN=2.0 ! NH
     468!    REAL, PARAMETER :: fseaS=4.0 ! SH   
     469!GG
    344470
    345471#ifdef ISO
     
    371497    tsurf_tmp(:) = tsurf_in(:)
    372498
     499!GG
     500    IF (iflag_seaice==0) THEN ! Old LMDZ sea ice surface
     501!GG
    373502! calculate the parameters cal, beta, capsol and dif_grnd and then recalculate cal
    374503    CALL calbeta(dtime, is_sic, knon, snow, qsol, beta, capsol, dif_grnd)
     
    387516       WHERE (snow > 0.0) cal = RCPD * calsno
    388517    ENDIF
     518
     519!GG
     520    ELSEIF (iflag_seaice==2) THEN
     521
     522    sno_den=sisno_den !mean snow density, kg/m3
     523    ice_cond=sice_cond*ice_den !conductivity of ice
     524    sno_cond=sisno_cond*sno_den ! conductivity of snow
     525    snow_min=sisno_min*sno_den !critical snow height 5 cm
     526    snow_wfact=sisno_wfact ! max fraction of falling snow blown into ocean
     527    h_ice_min=sithick_min ! min ice thickness
     528    alb_sno_dry=rn_alb_sdry !dry snow albedo
     529    alb_sno_wet=rn_alb_smlt !wet snow albedo
     530    alb_ice_dry=rn_alb_idry !dry thick ice
     531    alb_ice_wet=rn_alb_imlt !melting thick ice
     532    pen_frac=si_pen_frac !fraction of shortwave penetrating into the
     533    pen_ext=si_pen_ext !extinction length of penetrating shortwave (m-1)
     534
     535    bilg(:)=0.
     536    dif_grnd(:)=0.
     537    beta(:) = 1.
     538    fsic(:) = pctsrf(:,is_sic)
     539    cpl_pas =  NINT(86400./dtime * 1.0) ! une fois par jour
     540
     541    ! Surface, snow-ice and ice-ocean fluxes.
     542! Prepare call to calcul_fluxs (cal, beta, radsol, dif_grnd)
     543
     544    !write(*,*) 'radsol 1',radsol(1:100)
     545    DO i=1,knon
     546        ki=knindex(i)
     547        IF (snow(i).GT.snow_min) THEN
     548            !  1 / snow-layer heat capacity
     549            cal(i)=2.*RCPD/(snow(i)*ice_cap)
     550            ! adjustment time-scale of conductive flux
     551            dif_grnd(i) = cal(i) * sno_cond / snow(i) / RCPD
     552            ! for conductive flux
     553            f_cond_s = sno_cond * (tice(ki)-t_freeze) / snow(i)
     554            radsol(i) = radsol(i)+f_cond_s
     555            ! all shortwave flux absorbed
     556            f_swpen=0.
     557        ELSE ! bare ice.
     558            f_cond_s = 0.
     559            ! 1 / ice-layer heat capacity
     560            cal(i) = 2.*RCPD/(hice(ki)*ice_den*ice_cap)
     561            ! adjustment time-scale of conductive flux
     562            dif_grnd(i) = cal(i) * ice_cond / (hice(ki)*ice_den) / RCPD
     563            ! penetrative shortwave flux...
     564            f_swpen=swnet(i)*pen_frac*exp(-pen_ext*hice(ki))
     565            radsol(i) = radsol(i)-f_swpen
     566            ! GG no conductive flux in this case?
     567        END IF
     568        bilg(ki)=f_swpen-f_cond_s
     569    END DO
     570
     571    endif
    389572
    390573!    beta = 1.0
     
    423606!
    424607!****************************************************************************************
     608!GG
     609    if (iflag_seaice==0) then
     610!GG
    425611#ifdef ISO
    426612   ! verif
     
    502688    alb2_new(:) = alb1_new(:)
    503689
     690!GG
     691  else
     692
     693        DO i=1,knon
     694        ki=knindex(i)
     695
     696           ! ocean-ice heat flux
     697           fsea=fseaS
     698           amax=amax_s
     699           if (latitude(ki)>0) THEN
     700                   fsea=fseaN
     701                   amax=amax_n
     702           ENDIF
     703
     704           IF (snow(i).GT.snow_min) THEN
     705                ! snow conductive flux after calcul_fluxs (pos up)
     706                f_cond_s = sno_cond * (tice(ki)-tsurf_new(i)) / snow(i)
     707                ! 1 / heat capacity and conductive timescale
     708                uscap = 2. / ice_cap / (snow(i)+hice(ki)*ice_den)
     709                ustau = uscap * ice_cond / (hice(ki)*ice_den)
     710                ! update ice temp
     711                tice(ki) = (tice(ki) + dtime*(ustau*t_freeze - uscap*f_cond_s)) &
     712                     / (1 + dtime*ustau)
     713           ELSE ! bare ice
     714                tice(ki)=tsurf_new(i)
     715           ENDIF
     716           ! ice conductive flux (pos up)
     717           f_cond_i = ice_cond * (t_freeze-tice(ki)) / (hice(ki)*ice_den)
     718           f_bot(i) = fsea - f_cond_i
     719           fcdi(ki) = f_cond_i - fsea
     720           fcds(i) = f_cond_s
     721           !bilg(ki) = bilg(ki)+f_cond_i
     722        END DO
     723
     724!****************************************************************************************
     725! 2) Update snow and ice surface : thickness
     726!****************************************************************************************
     727
     728    IF (iflag_seaice==1) THEN
     729!   Read from limit
     730    CALL limit_read_hice(knon,knindex,hice)
     731    ENDIF
     732!   Formula Krinner et al. 1997 : h = (0.2 + 3.8(f_min**2))(1 + 2(f- f_min))
     733
     734
     735
     736    DO i=1,knon
     737        ki=knindex(i)
     738        IF (precip_snow(i) > 0.) THEN
     739            snow(i) = snow(i)+precip_snow(i)*dtime*(1.-snow_wfact*(1.-fsic(ki)))
     740        END IF
     741! snow and ice sublimation
     742        IF (evap(i) > 0.) THEN
     743           snow_evap = MIN (snow(i) / dtime, evap(i))
     744           snow(i) = snow(i) - snow_evap * dtime
     745           snow(i) = MAX(0.0, snow(i))
     746           IF (iflag_seaice==2) THEN
     747             hice(ki) = MAX(0.0,hice(ki)-(evap(i)-snow_evap)*dtime/ice_den)
     748           ENDIF
     749        ENDIF
     750! Melt / Freeze snow from above if Tsurf>0
     751        IF (tsurf_new(i).GT.t_melt) THEN
     752            ! energy available for melting snow (in kg of melted snow /m2)
     753            e_melt = MIN(MAX(snow(i)*(tsurf_new(i)-t_melt)*ice_cap/2. &
     754               /(ice_lat+ice_cap/2.*(t_melt-tice(ki))),0.0),snow(i))
     755            ! remove snow
     756            tice_i=tice(ki)
     757            IF (snow(i).GT.e_melt) THEN
     758                snow(i)=snow(i)-e_melt
     759                tsurf_new(i)=t_melt
     760            ELSE ! all snow is melted
     761                ! add remaining heat flux to ice
     762                e_melt=e_melt-snow(i)
     763                tice(ki)=tice(ki)+e_melt*ice_lat*2./(ice_cap*hice(ki)*ice_den)
     764                tsurf_new(i)=tice(ki)
     765            END IF
     766            dtice_melt(ki)=(tice(ki)-tice_i)/dtime
     767        END IF
     768! Bottom melt / grow
     769! bottom freeze if bottom flux (cond + oce-ice) <0
     770        IF (iflag_seaice==2) THEN
     771         IF (f_bot(i).LT.0) THEN
     772           ! larger fraction of bottom growth
     773           frac_mf=MIN(1.,MAX(0.,(hice(ki)-h_ice_thick)   &
     774                  / (h_ice_max-h_ice_thick)))
     775           ! quantity of new ice (formed at mean ice temp)
     776           e_melt= -f_bot(i) * dtime * fsic(ki) &
     777                   / (ice_lat+ice_cap/2.*(t_freeze-tice(ki)))
     778           ! first increase height to h_thick
     779           dhsic=MAX(0.,MIN(h_ice_thick-hice(ki),e_melt/(fsic(ki)*ice_den)))
     780           hice_i=hice(ki)
     781           hice(ki)=dhsic+hice(ki)
     782           e_melt=e_melt-fsic(ki)*dhsic
     783           IF (e_melt.GT.0.) THEN
     784           ! frac_mf fraction used for lateral increase
     785           dfsic=MIN(amax-fsic(ki),e_melt*frac_mf/ (hice(ki)*ice_den) )
     786           ! No lateral growth -> forced ocean
     787           !fsic(ki)=fsic(ki)+dfsic
     788           e_melt=e_melt-dfsic*hice(ki)*ice_den
     789           ! rest used to increase height
     790           hice(ki)=MIN(h_ice_max,hice(ki)+e_melt/( fsic(ki) * ice_den ) )
     791           END IF
     792           dh_basal_growth(ki)=(hice(ki)-hice_i)/dtime
     793
     794! melt from below if bottom flux >0
     795         ELSE
     796           ! larger fraction of lateral melt from warm ocean
     797           frac_mf=MIN(1.,MAX(0.,(hice(ki)-h_ice_thin)   &
     798                  / (h_ice_thick-h_ice_thin)))
     799           ! bring ice to freezing and melt from below
     800           ! quantity of melted ice
     801           e_melt= f_bot(i) * dtime * fsic(ki) &
     802                   / (ice_lat+ice_cap/2.*(tice(ki)-t_freeze))
     803           ! first decrease height to h_thick
     804           hice_i=hice(ki)
     805           dhsic=MAX(0.,MIN(hice(ki)-h_ice_thick,e_melt/(fsic(ki)*ice_den)))
     806           hice(ki)=hice(ki)-dhsic
     807           e_melt=e_melt-fsic(ki)*dhsic*ice_den
     808
     809           IF (e_melt.GT.0) THEN
     810           ! frac_mf fraction used for height decrease
     811           dhsic=MAX(0.,MIN(hice(ki)-h_ice_min,e_melt/ice_den*frac_mf/fsic(ki)))
     812           hice(ki)=hice(ki)-dhsic
     813           e_melt=e_melt-fsic(ki)*dhsic*ice_den
     814           ! rest used to decrease fraction (up to 0!)
     815           dfsic=MIN(fsic(ki),e_melt/(hice(ki)*ice_den))
     816           ! Remaining heat not used if everything melted
     817           e_melt=e_melt-dfsic*hice(ki)*ice_den
     818           ! slab_bilg(ki) = slab_bilg(ki) + e_melt*ice_lat/dtime
     819           END IF
     820           dh_basal_melt(ki)=(hice(ki)-hice_i)/dtime
     821         END IF
     822        END IF
     823
     824! melt ice from above if Tice>0
     825        tice_i=tice(ki)
     826        IF (tice(ki).GT.t_melt) THEN
     827           IF (iflag_seaice==2) THEN
     828            ! quantity of ice melted (kg/m2)
     829            e_melt=MAX(hice(ki)*ice_den*(tice(ki)-t_melt)*ice_cap/2. &
     830             /(ice_lat+ice_cap/2.*(t_melt-t_freeze)),0.0)
     831            ! melt from above, height only
     832            hice_i=hice(ki)
     833            dhsic=MIN(hice(ki)-h_ice_min,e_melt/ice_den)
     834            dh_top_melt(i)=dhsic
     835            e_melt=e_melt-dhsic
     836            IF (e_melt.GT.0) THEN
     837              ! lateral melt if ice too thin
     838              dfsic=MAX(fsic(ki)-ice_frac_min,e_melt/(h_ice_min*ice_den)*fsic(ki))
     839              ! if all melted do nothing with remaining heat
     840              e_melt=MAX(0.,e_melt*fsic(ki)-dfsic*h_ice_min*ice_den)
     841              ! slab_bilg(ki) = slab_bilg(ki) + e_melt*ice_lat/dtime
     842            END IF
     843            hice(ki)=hice(ki)-dhsic
     844            dh_top_melt(ki)=(hice(ki)-hice_i)/dtime
     845            ! surface temperature at melting point
     846           END IF
     847           tice(ki)=t_melt
     848           tsurf_new(i)=t_melt
     849        END IF
     850        dtice_melt(ki)=dtice_melt(ki)+tice(ki)-tice_i
     851
     852        ! convert snow to ice if below floating line
     853        h_test=(hice(ki)*ice_den+snow(i))-hice(ki)*sea_den
     854        IF ((h_test.GT.0.).AND.(hice(ki).GT.h_ice_min)) THEN !snow under water
     855            ! extra snow converted to ice (with added frozen sea water)
     856            IF (iflag_seaice==2) THEN
     857             dhsic=h_test/(sea_den-ice_den+sno_den)
     858             hice(ki)=hice(ki)+dhsic
     859            ENDIF
     860            snow(i)=snow(i)-dhsic*sno_den
     861            ! available energy (freeze sea water + bring to tice)
     862            e_melt=dhsic*ice_den*(1.-sno_den/ice_den)*(ice_lat+ &
     863                   ice_cap/2.*(t_freeze-tice(ki)))
     864            ! update ice temperature
     865            tice_i=tice(ki)
     866            tice(ki)=tice(ki)+2.*e_melt/ice_cap/(snow(i)+hice(ki)*ice_den)
     867            IF (iflag_seaice==2) THEN
     868              dh_snow2sic(ki)=dhsic/dtime
     869            END IF
     870            dtice_snow2sic(ki)=(tice(ki)-tice_i)/dtime
     871        END IF
     872    END DO
     873
     874        !write(*,*) 'hice 2',hice(1:100)
     875        !write(*,*) 'tice 2',tice(1:100)
     876
     877        iflag_sic_albedo=iflag_seaice_alb
     878
     879!*******************************************************************************
     880! 3) cumulate ice-ocean fluxes, update tslab, lateral grow
     881!***********************************************o*******************************
     882    !cumul fluxes.
     883    bilg_cumul(:)=bilg_cumul(:)+bilg(:)/float(cpl_pas)
     884    IF (MOD(itime,cpl_pas).EQ.0) THEN ! time to update tslab
     885        bilg_cumul(:)=0.
     886    END IF ! coupling time
     887
     888!   write(*,*) 'hice 3',hice(1:100)
     889!   write(*,*) 'tice 3',tice(1:100)
     890    !tests ice fraction
     891    WHERE (fsic.LT.ice_frac_min)
     892        tice=t_melt
     893        hice=h_ice_min
     894    END WHERE
     895
     896    !write(*,*) 'hice 4',hice(1:100)
     897    !write(*,*) 'tice 4',tice(1:100)
     898
     899    endif
     900
     901!****************************************************************************************
     902! 4) Compute sea-ice and snow albedo
     903!****************************************************************************************
     904    IF (iflag_seaice > 0) THEN
     905    SELECT CASE (iflag_sic_albedo)
     906      CASE(0)
     907! old slab albedo : single value. age of snow, melt ponds.
     908        DO i=1,knon
     909          ki=knindex(i)
     910         ! snow albedo: update snow age
     911          IF (snow(i).GT.0.0001) THEN
     912               agesno(i)=(agesno(i) + (1.-agesno(i)/50.)*dtime/86400.)&
     913                           * EXP(-1.*MAX(0.0,precip_snow(i))*dtime/5.)
     914          ELSE
     915              agesno(i)=0.0
     916          END IF
     917          ! snow albedo
     918          alb_snow=alb_sno_wet+(alb_sno_dry-alb_sno_wet)*EXP(-agesno(i)/50.)
     919          ! ice albedo (varies with ice tkickness and temp)
     920          alb_ice=MAX(0.0,0.13*LOG(100.*hice(ki))+0.1)
     921          !alb_ice=MAX(0.0,0.13*LOG(100.*seaice(ki)/ice_den)+0.1)
     922          IF (tice(ki).GT.t_freeze-0.01) THEN
     923              alb_ice=MIN(alb_ice,alb_ice_wet)
     924          ELSE
     925              alb_ice=MIN(alb_ice,alb_ice_dry)
     926          END IF
     927          ! pond albedo
     928          alb_pond=0.36-0.1*(2.0+MIN(0.0,MAX(tice(ki)-t_melt,-2.0)))
     929          ! pond fraction
     930          frac_pond=0.2*(2.0+MIN(0.0,MAX(tice(ki)-t_melt,-2.0)))
     931          ! snow fraction
     932          frac_snow=MAX(0.0,MIN(1.0-frac_pond,snow(i)/snow_min))
     933          ! ice fraction
     934          frac_ice=MAX(0.0,1.-frac_pond-frac_snow)
     935          ! total albedo
     936          alb1_new(i)=alb_snow*frac_snow+alb_ice*frac_ice+alb_pond*frac_pond
     937        END DO
     938        alb2_new(:) = alb1_new(:)
     939
     940      CASE(1)
     941! New visible and IR albedos, dry / melting snow
     942! based on Toyoda et al, 2020
     943      DO i=1,knon
     944          ki=knindex(i)
     945          ! snow fraction
     946          frac_snow  = snow(i) / (snow(i) + h_sno_alb)
     947          ! dependence of ice albedo with ice thickness
     948          frac_ice = MIN(1.,ATAN(4.*hice(ki)*ice_den) / ATAN(4.*h_ice_alb))
     949          ! Total (for ice, min = 0.066 = alb_ocean)
     950          IF (tice(ki).GT.t_melt) THEN
     951              alb_ice = 0.066 + (alb_imlt_vis - 0.066)*frac_ice
     952              alb1_new(i)=alb_smlt_vis*frac_snow + alb_ice*(1.-frac_snow)
     953              alb_ice = 0.066 + (alb_imlt_nir - 0.066)*frac_ice
     954              alb2_new(i)=alb_smlt_nir*frac_snow + alb_ice*(1.-frac_snow)
     955          ELSEIF (tice(ki).GT.t_melt - 1.) THEN
     956              frac_pond = tice(ki) - t_freeze
     957              alb_snow = alb_smlt_vis*frac_pond + alb_sdry_vis*(1.-frac_pond)
     958              alb_ice = alb_imlt_vis*frac_pond + alb_idry_vis*(1.-frac_pond)
     959              alb_ice = 0.066 + (alb_ice - 0.66)*frac_ice
     960              alb1_new(i)= alb_snow*frac_snow + alb_ice*(1.-frac_snow)
     961              alb_snow = alb_smlt_nir*frac_pond + alb_sdry_nir*(1.-frac_pond)
     962              alb_ice = alb_imlt_nir*frac_pond + alb_idry_nir*(1.-frac_pond)
     963              alb_ice = 0.066 + (alb_ice - 0.66)*frac_ice
     964              alb2_new(i)= alb_snow*frac_snow + alb_ice*(1.-frac_snow)
     965          ELSE
     966              alb_ice = 0.066 + (alb_idry_vis - 0.066)*frac_ice
     967              alb1_new(i)=alb_sdry_vis*frac_snow + alb_ice*(1.-frac_snow)
     968              alb_ice = 0.066 + (alb_idry_nir - 0.066)*frac_ice
     969              alb2_new(i)=alb_sdry_nir*frac_snow + alb_ice*(1.-frac_snow)
     970          ENDIF
     971      END DO
     972
     973      CASE(2)
     974! LIM3 scheme. Uses clear sky / overcast value, with 50% clear sky
     975      z1_i = 1.5 * ice_den
     976      z2_i = 0.05 * ice_den
     977      zlog = 1. / (LOG(1.5) - LOG(0.05))
     978      z1_s = 1. / (0.025 * sno_den)
     979      DO i=1,knon
     980          ki=knindex(i)
     981            ! temperature above / below 0
     982            IF (tice(ki).GE.t_melt) THEN
     983               alb_ice = alb_ice_wet
     984               alb_snow = alb_sno_wet
     985            ELSE
     986               alb_ice = alb_ice_dry
     987               alb_snow = alb_sno_dry
     988            ENDIF
     989            ! ice thickness
     990            IF (hice(ki)*ice_den.LT.z2_i) THEN
     991                alb_ice = 0.066 + 0.114 * hice(ki)*ice_den / z2_i
     992            ELSEIF (hice(ki)*ice_den.LT.z1_i) THEN
     993                alb_ice = alb_ice + (0.18 - alb_ice) &
     994                          * (LOG(z1_i) - LOG(hice(ki)*ice_den)) * zlog
     995            ENDIF
     996            ! ice or snow depending on snow thickness
     997            alb_snow = alb_snow - (alb_snow -alb_ice) * EXP(- snow(i) * z1_s)
     998            ! Effect of clouds (polynomial fit with 50% clouds)
     999            alb1_new(i) = alb_snow - 0.5 * (-0.1010 * alb_snow*alb_snow &
     1000                          + 0.1933*alb_snow - 0.0148)
     1001            alb2_new(i) = alb1_new(i)
     1002      END DO
     1003
     1004      CASE(3)
     1005      CALL albsno(klon, knon, dtime, agesno(:), alb_neig(:), precip_snow(:))
     1006      WHERE (snow(1:knon) .LT. 0.0001) agesno(1:knon) = 0.
     1007      alb1_new(:) = 0.0
     1008      DO i=1, knon
     1009         zfra = MAX(0.0,MIN(1.0,snow(i)/(snow(i)+10.0)))
     1010         alb1_new(i) = alb_neig(i) * zfra +  0.6 * (1.0-zfra)
     1011      ENDDO
     1012      alb2_new(:) = alb1_new(:)
     1013
     1014      print*,'alb_neig=',alb_neig
     1015      print*,'zfra=',zfra
     1016      print*,'snow=',snow
     1017      print*,'alb1_new=',alb1_new
     1018      print*,'alb2_new=',alb2_new
     1019    END SELECT
     1020    END IF
     1021! ------ End Albedo ----------
     1022
     1023!GG
    5041024  END SUBROUTINE ocean_forced_ice
    5051025
Note: See TracChangeset for help on using the changeset viewer.