--- trunk/Sources/phylmd/Interface_surf/interfsurf_hq.f 2017/04/28 13:22:36 223 +++ trunk/phylmd/Interface_surf/interfsurf_hq.f 2018/05/03 16:14:08 267 @@ -22,7 +22,6 @@ USE albsno_m, ONLY: albsno use calbeta_m, only: calbeta USE calcul_fluxs_m, ONLY: calcul_fluxs - use clesphys2, only: soil_model USE dimphy, ONLY: klon USE fonte_neige_m, ONLY: fonte_neige USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter @@ -45,16 +44,15 @@ REAL, intent(inout):: tsoil(:, :) ! (knon, nsoilmx) - REAL, intent(INOUT):: qsol(klon) + REAL, intent(INOUT):: qsol(:) ! (knon) ! column-density of water in soil, in kg m-2 - real, dimension(klon), intent(IN):: u1_lay, v1_lay - ! u1_lay vitesse u 1ere couche - ! v1_lay vitesse v 1ere couche + real, intent(IN):: u1_lay(:), v1_lay(:) ! (knon) vitesse 1ere couche + real, dimension(klon), intent(IN):: temp_air, spechum ! temp_air temperature de l'air 1ere couche ! spechum humidite specifique 1ere couche - real, dimension(klon), intent(INOUT):: tq_cdrag ! coefficient d'echange + real, intent(IN):: tq_cdrag(:) ! (knon) coefficient d'echange real, dimension(klon), intent(IN):: petAcoef, peqAcoef ! coefficients A de la r\'esolution de la couche limite pour t et q @@ -75,12 +73,12 @@ real, intent(IN):: ts(:) ! (knon) temp\'erature de surface real, intent(IN):: p1lay(klon) ! pression 1er niveau (milieu de couche) real, dimension(klon), intent(IN):: ps ! pression au sol - REAL, INTENT(INOUT):: radsol(:) ! (knon) rayonnement net au sol (LW + SW) + REAL, INTENT(IN):: radsol(:) ! (knon) rayonnement net au sol (LW + SW) real, intent(OUT):: evap(:) ! (knon) evaporation totale real, intent(OUT):: flux_t(:) ! (knon) flux de chaleur sensible ! (Cp T) à la surface, positif vers le bas, W / m2 - + real, intent(OUT):: fluxlat(:) ! (knon) flux de chaleur latente real, intent(OUT):: dflux_l(:), dflux_s(:) ! (knon) real, intent(OUT):: tsurf_new(:) ! (knon) temp\'erature au sol @@ -111,8 +109,6 @@ real cal(size(knindex)) ! (knon) real beta(size(knindex)) ! (knon) evap reelle real dif_grnd(klon), capsol(klon) - real, parameter:: calice = 1. / (5.1444e6 * 0.15), tau_gl = 86400. * 5. - real, parameter:: calsno = 1. / (2.3867e6 * 0.15) real tsurf(size(knindex)) ! (knon) real alb_neig(size(knindex)) ! (knon) real zfra(size(knindex)) ! (knon) @@ -121,7 +117,7 @@ !------------------------------------------------------------- knon = size(knindex) - + ! On doit commencer par appeler les schemas de surfaces continentales ! car l'ocean a besoin du ruissellement qui est y calcule @@ -166,24 +162,18 @@ call interfsur_lim(dtime, julien, knindex, debut, albedo, z0_new) ! Calcul de snow et qsurf, hydrologie adapt\'ee - CALL calbeta(is_ter, snow, qsol(:knon), beta, capsol(:knon), & - dif_grnd(:knon)) + CALL calbeta(is_ter, snow, qsol, beta, capsol(:knon), dif_grnd(:knon)) - IF (soil_model) THEN - CALL soil(dtime, is_ter, snow, ts, tsoil, soilcap, soilflux) - cal = RCPD / soilcap - radsol = radsol + soilflux - ELSE - cal = RCPD * capsol(:knon) - ENDIF - - CALL calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta, tq_cdrag(:knon), & - ps(:knon), qsurf(:knon), radsol, dif_grnd(:knon), & - temp_air(:knon), spechum(:knon), u1_lay(:knon), v1_lay(:knon), & + CALL soil(dtime, is_ter, snow, ts, tsoil, soilcap, soilflux) + cal = RCPD / soilcap + + CALL calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta, tq_cdrag, & + ps(:knon), qsurf(:knon), radsol + soilflux, dif_grnd(:knon), & + temp_air(:knon), spechum(:knon), u1_lay, v1_lay, & petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), & peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l) CALL fonte_neige(is_ter, dtime, precip_rain(:knon), & - precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, & + precip_snow(:knon), snow, qsol, tsurf_new, evap, & fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon)) call albsno(dtime, agesno, alb_neig, precip_snow(:knon)) @@ -199,9 +189,9 @@ beta = 1. dif_grnd = 0. call calcul_fluxs(dtime, tsurf, p1lay(:knon), cal, beta, & - tq_cdrag(:knon), ps(:knon), qsurf(:knon), radsol, & - dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay(:knon), & - v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), & + tq_cdrag, ps(:knon), qsurf(:knon), radsol, & + dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay, & + v1_lay, petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), & peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l) agesno = 0. albedo = alboc_cd(rmu0(knindex)) * fmagic @@ -213,36 +203,26 @@ IF (pctsrf_new_sic(knindex(ii)) < EPSFRA) then snow(ii) = 0. tsurf_new(ii) = RTT - 1.8 - IF (soil_model) tsoil(ii, :) = RTT - 1.8 + tsoil(ii, :) = RTT - 1.8 else tsurf_new(ii) = ts(ii) endif enddo - CALL calbeta(is_sic, snow, qsol(:knon), beta, capsol(:knon), & - dif_grnd(:knon)) - - IF (soil_model) THEN - CALL soil(dtime, is_sic, snow, tsurf_new, tsoil, soilcap, & - soilflux) - cal = RCPD / soilcap - radsol = radsol + soilflux - dif_grnd = 0. - ELSE - dif_grnd = 1. / tau_gl - cal = RCPD * calice - WHERE (snow > 0.) cal = RCPD * calsno - ENDIF + CALL calbeta(is_sic, snow, qsol, beta, capsol(:knon), dif_grnd(:knon)) + CALL soil(dtime, is_sic, snow, tsurf_new, tsoil, soilcap, soilflux) + cal = RCPD / soilcap + dif_grnd = 0. tsurf = tsurf_new beta = 1. CALL calcul_fluxs(dtime, tsurf, p1lay(:knon), cal, beta, & - tq_cdrag(:knon), ps(:knon), qsurf(:knon), radsol, & - dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay(:knon), & - v1_lay(:knon), petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), & + tq_cdrag, ps(:knon), qsurf(:knon), radsol + soilflux, & + dif_grnd(:knon), temp_air(:knon), spechum(:knon), u1_lay, & + v1_lay, petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), & peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l) CALL fonte_neige(is_sic, dtime, precip_rain(:knon), & - precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, & + precip_snow(:knon), snow, qsol, tsurf_new, evap, & fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon)) ! Compute the albedo: @@ -256,24 +236,18 @@ case (is_lic) ! Surface "glacier continentaux" appel a l'interface avec le sol - IF (soil_model) THEN - CALL soil(dtime, is_lic, snow, ts, tsoil, soilcap, soilflux) - cal = RCPD / soilcap - radsol = radsol + soilflux - ELSE - cal = RCPD * calice - WHERE (snow > 0.) cal = RCPD * calsno - ENDIF + CALL soil(dtime, is_lic, snow, ts, tsoil, soilcap, soilflux) + cal = RCPD / soilcap beta = 1. dif_grnd = 0. - call calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta, tq_cdrag(:knon), & - ps(:knon), qsurf(:knon), radsol, dif_grnd(:knon), & - temp_air(:knon), spechum(:knon), u1_lay(:knon), v1_lay(:knon), & + call calcul_fluxs(dtime, ts, p1lay(:knon), cal, beta, tq_cdrag, & + ps(:knon), qsurf(:knon), radsol + soilflux, dif_grnd(:knon), & + temp_air(:knon), spechum(:knon), u1_lay, v1_lay, & petAcoef(:knon), peqAcoef(:knon), petBcoef(:knon), & peqBcoef(:knon), tsurf_new, evap, fluxlat, flux_t, dflux_s, dflux_l) call fonte_neige(is_lic, dtime, precip_rain(:knon), & - precip_snow(:knon), snow, qsol(:knon), tsurf_new, evap, & + precip_snow(:knon), snow, qsol, tsurf_new, evap, & fqcalving(:knon), ffonte(:knon), run_off_lic_0(:knon)) ! calcul albedo