--- trunk/Sources/phylmd/Interface_surf/calcul_fluxs.f 2015/04/29 15:47:56 134 +++ trunk/Sources/phylmd/Interface_surf/calcul_fluxs.f 2016/08/30 12:52:46 206 @@ -4,9 +4,9 @@ contains - SUBROUTINE calcul_fluxs(nisurf, dtime, tsurf, p1lay, cal, beta, coef1lay, & - ps, qsurf, radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, petAcoef, & - peqAcoef, petBcoef, peqBcoef, tsurf_new, evap, fluxlat, fluxsens, & + SUBROUTINE calcul_fluxs(dtime, tsurf, p1lay, cal, beta, coef1lay, ps, & + qsurf, radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, petAcoef, & + peqAcoef, petBcoef, peqBcoef, tsurf_new, evap, fluxlat, flux_t, & dflux_s, dflux_l) ! Cette routine calcule les fluxs en h et q à l'interface et une @@ -14,53 +14,53 @@ ! L. Fairhead April 2000 - USE abort_gcm_m, ONLY: abort_gcm - USE indicesol, ONLY: is_ter USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep - USE interface_surf, ONLY: run_off use nr_util, only: assert_eq - USE suphec_m, ONLY: rcpd, rd, retv, rkappa, rlstt, rlvtt, rtt + USE suphec_m, ONLY: rcpd, rd, retv, rlstt, rlvtt, rtt USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2 - integer, intent(IN):: nisurf ! surface a traiter real, intent(IN):: dtime - real, intent(IN):: tsurf(:) ! (knon) temperature de surface - real, intent(IN):: p1lay(:) ! (knon) pression 1er niveau (milieu de couche) + real, intent(IN):: tsurf(:) ! (knon) température de surface + + real, intent(IN):: p1lay(:) ! (knon) + ! pression première couche (milieu de couche) + real, intent(IN):: cal(:) ! (knon) capacité calorifique du sol - real, intent(IN):: beta(:) ! (knon) evap reelle + real, intent(IN):: beta(:) ! (knon) évaporation réelle real, intent(IN):: coef1lay(:) ! (knon) coefficient d'échange real, intent(IN):: ps(:) ! (knon) pression au sol - real, intent(OUT):: qsurf(:) ! (knon) humidite de l'air au dessus du sol - real, intent(IN):: radsol(:) ! (knon) rayonnement net au sol (LW + SW) + real, intent(OUT):: qsurf(:) ! (knon) humidité de l'air au-dessus du sol + + real, intent(IN):: radsol(:) ! (knon) + ! rayonnement net au sol (longwave + shortwave) real, intent(IN):: dif_grnd(:) ! (knon) - ! coefficient diffusion vers le sol profond + ! coefficient de diffusion vers le sol profond real, intent(IN):: t1lay(:), q1lay(:), u1lay(:), v1lay(:) ! (knon) real, intent(IN):: petAcoef(:), peqAcoef(:) ! (knon) - ! coefficients A de la résolution de la couche limite pour t et q + ! coefficients A de la résolution de la couche limite pour T et q real, intent(IN):: petBcoef(:), peqBcoef(:) ! (knon) - ! petBcoef coeff. B de la resolution de la CL pour t - ! peqBcoef coeff. B de la resolution de la CL pour q + ! coefficients B de la résolution de la couche limite pour t et q real, intent(OUT):: tsurf_new(:) ! (knon) température au sol - real, intent(OUT):: evap(:), fluxlat(:), fluxsens(:) ! (knon) - ! fluxlat flux de chaleur latente - ! fluxsens flux de chaleur sensible + real, intent(OUT):: evap(:) ! (knon) + + real, intent(OUT):: fluxlat(:), flux_t(:) ! (knon) + ! flux de chaleur latente et sensible + real, intent(OUT):: dflux_s(:), dflux_l(:) ! (knon) - ! Dérivées des flux dF/dTs (W m-2 K-1) - ! dflux_s derivee du flux de chaleur sensible / Ts - ! dflux_l derivee du flux de chaleur latente / Ts + ! dérivées des flux de chaleurs sensible et latente par rapport à + ! Ts (W m-2 K-1) ! Local: integer i integer knon ! nombre de points a traiter - real, dimension(size(ps)):: mh, oh, mq, nq, oq - real, dimension(size(ps)):: dq_s_dt, coef - real qsat(size(ps)) ! qsat en kg/kg - real sl(size(ps)) ! chaleur latente d'evaporation ou de sublimation + real, dimension(size(ps)):: mh, oh, mq, nq, oq, dq_s_dt, coef ! (knon) + real qsat(size(ps)) ! mass fraction + real sl(size(ps)) ! chaleur latente d'évaporation ou de sublimation logical delta real zcor real, parameter:: t_grnd = 271.35, t_coup = 273.15 @@ -71,16 +71,10 @@ size(coef1lay), size(ps), size(qsurf), size(radsol), size(dif_grnd), & size(t1lay), size(q1lay), size(u1lay), size(v1lay), size(petAcoef), & size(peqAcoef), size(petBcoef), size(peqBcoef), size(tsurf_new), & - size(evap), size(fluxlat), size(fluxsens), size(dflux_s), & + size(evap), size(fluxlat), size(flux_t), size(dflux_s), & size(dflux_l)/), "calcul_fluxs knon") - if (size(run_off) /= knon .AND. nisurf == is_ter) then - print *, 'Bizarre, le nombre de points continentaux' - print *, 'a change entre deux appels. J''arrete.' - call abort_gcm('calcul_fluxs', 'Pb run_off', 1) - endif - - ! Traitement humidite du sol + ! Traitement de l'humidité du sol IF (thermcep) THEN DO i = 1, knon @@ -124,7 +118,7 @@ evap = - mq - nq * tsurf_new fluxlat = - evap * sl - fluxsens = mh + dflux_s * tsurf_new + flux_t = mh + dflux_s * tsurf_new dflux_l = sl * nq ! Nouvelle valeur de l'humidité au dessus du sol :