Changeset 181


Ignore:
Timestamp:
Mar 27, 2001, 12:31:52 PM (23 years ago)
Author:
lmdzadmin
Message:

Traitement de la fonte de la neige dans le cas du modele de sol simplifie
est sorti de calcul_flux
LF

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ.3.3/branches/rel-LF/libf/phylmd/interface_surf.F90

    r180 r181  
    329329     &   tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
    330330
     331       CALL fonte_neige( klon, knon, nisurf, dtime, &
     332     &   tsurf, p1lay, cal, beta, tq_cdrag, ps, &
     333     &   precip_rain, precip_snow, snow, qsol,  &
     334     &   radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, &
     335     &   petAcoef, peqAcoef, petBcoef, peqBcoef, &
     336     &   tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
     337
    331338    else
    332339        CALL albsno(klon,agesno,alb_neig_grid) 
     
    476483     &   tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
    477484
     485    if (ocean /= 'couple') then
     486      call fonte_neige( klon, knon, nisurf, dtime, &
     487     &   tsurf_temp, p1lay, cal, beta, tq_cdrag, ps, &
     488     &   precip_rain, precip_snow, snow, qsol,  &
     489     &   radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, &
     490     &   petAcoef, peqAcoef, petBcoef, peqBcoef, &
     491     &   tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
     492    endif
    478493!
    479494! 2eme appel a interfoce pour le cumul et le passage des flux a l'ocean
     
    526541
    527542    call calcul_fluxs( klon, knon, nisurf, dtime, &
     543     &   tsurf, p1lay, cal, beta, tq_cdrag, ps, &
     544     &   precip_rain, precip_snow, snow, qsol,  &
     545     &   radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, &
     546     &   petAcoef, peqAcoef, petBcoef, peqBcoef, &
     547     &   tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
     548
     549    call fonte_neige( klon, knon, nisurf, dtime, &
    528550     &   tsurf, p1lay, cal, beta, tq_cdrag, ps, &
    529551     &   precip_rain, precip_snow, snow, qsol,  &
     
    19211943  real, dimension(klon) :: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef
    19221944  real, dimension(klon) :: zx_sl, zx_k1
    1923   real, dimension(klon) :: zx_h_ts, zx_q_0 , d_ts
     1945  real, dimension(klon) :: zx_q_0 , d_ts
    19241946  real                  :: zdelta, zcvm5, zx_qs, zcor, zx_dq_s_dh
    19251947  real                  :: bilan_f, fq_fonte
     
    20232045    zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
    20242046
    2025 
    20262047! Tsurface
    20272048    tsurf_new(i) = (tsurf(i) + cal(i)/(RCPD * zx_pkh(i)) * dtime * &
     
    20352056! Y'a-t-il fonte de neige?
    20362057!
    2037     fonte_neige = (nisurf /= is_oce) .AND. &
    2038      & (snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
    2039      & .AND. (tsurf_new(i) >= RTT)
    2040     if (fonte_neige) tsurf_new(i) = RTT 
    2041     zx_h_ts(i) = tsurf_new(i) * RCPD * zx_pkh(i)
     2058!    fonte_neige = (nisurf /= is_oce) .AND. &
     2059!     & (snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
     2060!     & .AND. (tsurf_new(i) >= RTT)
     2061!    if (fonte_neige) tsurf_new(i) = RTT 
    20422062    d_ts(i) = tsurf_new(i) - tsurf(i)
    2043     zx_q_0(i) = zx_qsat(i) + zx_dq_s_dt(i) * d_ts(i)
     2063!    zx_h_ts(i) = tsurf_new(i) * RCPD * zx_pkh(i)
     2064!    zx_q_0(i) = zx_qsat(i) + zx_dq_s_dt(i) * d_ts(i)
    20442065!== flux_q est le flux de vapeur d'eau: kg/(m**2 s)  positive vers bas
    20452066!== flux_t est le flux de cpt (energie sensible): j/(m**2 s)
     
    20542075! en cas de fonte de neige
    20552076!
    2056     if (fonte_neige) then
    2057       bilan_f = radsol(i) + fluxsens(i) - (zx_sl(i) * evap (i)) - &
    2058      &          dif_grnd(i) * (tsurf_new(i) - t_grnd) - &
    2059      &          RCPD * (zx_pkh(i))/cal(i)/dtime * (tsurf_new(i) - tsurf(i))
    2060       bilan_f = max(0., bilan_f)
    2061       fq_fonte = bilan_f / zx_sl(i)
    2062       snow(i) = max(0., snow(i) - fq_fonte * dtime)
    2063       qsol(i) = qsol(i) + (fq_fonte * dtime)
    2064     endif
     2077!    if (fonte_neige) then
     2078!      bilan_f = radsol(i) + fluxsens(i) - (zx_sl(i) * evap (i)) - &
     2079!     &          dif_grnd(i) * (tsurf_new(i) - t_grnd) - &
     2080!     &          RCPD * (zx_pkh(i))/cal(i)/dtime * (tsurf_new(i) - tsurf(i))
     2081!      bilan_f = max(0., bilan_f)
     2082!      fq_fonte = bilan_f / zx_sl(i)
     2083!      snow(i) = max(0., snow(i) - fq_fonte * dtime)
     2084!      qsol(i) = qsol(i) + (fq_fonte * dtime)
     2085!    endif
    20652086    if (nisurf == is_ter)  &
    20662087     &  run_off(i) = run_off(i) + max(qsol(i) - max_eau_sol, 0.0)
     
    21962217!#########################################################################
    21972218!
     2219
     2220  SUBROUTINE fonte_neige( klon, knon, nisurf, dtime, &
     2221     & tsurf, p1lay, cal, beta, coef1lay, ps, &
     2222     & precip_rain, precip_snow, snow, qsol, &
     2223     & radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, &
     2224     & petAcoef, peqAcoef, petBcoef, peqBcoef, &
     2225     & tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
     2226
     2227! Routine de traitement de la fonte de la neige dans le cas du traitement
     2228! de sol simplifié
     2229!
     2230! LF 03/2001
     2231! input:
     2232!   knon         nombre de points a traiter
     2233!   nisurf       surface a traiter
     2234!   tsurf        temperature de surface
     2235!   p1lay        pression 1er niveau (milieu de couche)
     2236!   cal          capacite calorifique du sol
     2237!   beta         evap reelle
     2238!   coef1lay     coefficient d'echange
     2239!   ps           pression au sol
     2240!   precip_rain  precipitations liquides
     2241!   precip_snow  precipitations solides
     2242!   snow         champs hauteur de neige
     2243!   qsol         humidite du sol
     2244!   runoff       runoff en cas de trop plein
     2245!   petAcoef     coeff. A de la resolution de la CL pour t
     2246!   peqAcoef     coeff. A de la resolution de la CL pour q
     2247!   petBcoef     coeff. B de la resolution de la CL pour t
     2248!   peqBcoef     coeff. B de la resolution de la CL pour q
     2249!   radsol       rayonnement net aus sol (LW + SW)
     2250!   dif_grnd     coeff. diffusion vers le sol profond
     2251!
     2252! output:
     2253!   tsurf_new    temperature au sol
     2254!   fluxsens     flux de chaleur sensible
     2255!   fluxlat      flux de chaleur latente
     2256!   dflux_s      derivee du flux de chaleur sensible / Ts
     2257!   dflux_l      derivee du flux de chaleur latente  / Ts
     2258!
     2259
     2260#include "YOETHF.inc"
     2261#include "FCTTRE.inc"
     2262
     2263! Parametres d'entree
     2264  integer, intent(IN) :: knon, nisurf, klon
     2265  real   , intent(IN) :: dtime
     2266  real, dimension(klon), intent(IN) :: petAcoef, peqAcoef
     2267  real, dimension(klon), intent(IN) :: petBcoef, peqBcoef
     2268  real, dimension(klon), intent(IN) :: ps, q1lay
     2269  real, dimension(klon), intent(IN) :: tsurf, p1lay, cal, beta, coef1lay
     2270  real, dimension(klon), intent(IN) :: precip_rain, precip_snow
     2271  real, dimension(klon), intent(IN) :: radsol, dif_grnd
     2272  real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay
     2273  real, dimension(klon), intent(INOUT) :: snow, qsol
     2274
     2275! Parametres sorties
     2276  real, dimension(klon), intent(INOUT):: tsurf_new, evap, fluxsens, fluxlat
     2277  real, dimension(klon), intent(INOUT):: dflux_s, dflux_l
     2278
     2279! Variables locales
     2280  integer :: i
     2281  real, dimension(klon) :: zx_mh, zx_nh, zx_oh
     2282  real, dimension(klon) :: zx_mq, zx_nq, zx_oq
     2283  real, dimension(klon) :: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef
     2284  real, dimension(klon) :: zx_sl, zx_k1
     2285  real, dimension(klon) :: zx_q_0 , d_ts
     2286  real                  :: zdelta, zcvm5, zx_qs, zcor, zx_dq_s_dh
     2287  real                  :: bilan_f, fq_fonte
     2288  REAL                  :: subli, fsno
     2289  real, parameter :: t_grnd = 271.35, t_coup = 273.15
     2290!! PB temporaire en attendant mieux pour le modele de neige
     2291  REAL, parameter :: chasno = 3.334E+05/(2.3867E+06*0.15)
     2292!
     2293  logical, save         :: check = .true.
     2294  character (len = 20)  :: modname = 'fonte_neige'
     2295  logical, save         :: neige_fond = .false.
     2296  real, save            :: max_eau_sol = 150.0
     2297  character (len = 80) :: abort_message
     2298  logical,save         :: first = .true.,second=.false.
     2299
     2300  if (check) write(*,*)'Entree ', modname,' surface = ',nisurf
     2301
     2302! Initialisations
     2303  DO i = 1, knon
     2304    zx_pkh(i) = (ps(i)/ps(i))**RKAPPA
     2305  IF (thermcep) THEN
     2306      zdelta=MAX(0.,SIGN(1.,rtt-tsurf(i)))
     2307      zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
     2308      zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q1lay(i))
     2309      zx_qs= r2es * FOEEW(tsurf(i),zdelta)/ps(i)
     2310      zx_qs=MIN(0.5,zx_qs)
     2311      zcor=1./(1.-retv*zx_qs)
     2312      zx_qs=zx_qs*zcor
     2313      zx_dq_s_dh = FOEDE(tsurf(i),zdelta,zcvm5,zx_qs,zcor) &
     2314     &                 /RLVTT / zx_pkh(i)
     2315    ELSE
     2316      IF (tsurf(i).LT.t_coup) THEN
     2317        zx_qs = qsats(tsurf(i)) / ps(i)
     2318        zx_dq_s_dh = dqsats(tsurf(i),zx_qs)/RLVTT &
     2319     &                    / zx_pkh(i)
     2320      ELSE
     2321        zx_qs = qsatl(tsurf(i)) / ps(i)
     2322        zx_dq_s_dh = dqsatl(tsurf(i),zx_qs)/RLVTT &
     2323     &               / zx_pkh(i)
     2324      ENDIF
     2325    ENDIF
     2326    zx_dq_s_dt(i) = RCPD * zx_pkh(i) * zx_dq_s_dh
     2327    zx_qsat(i) = zx_qs
     2328    zx_coef(i) = coef1lay(i) &
     2329     & * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
     2330     & * p1lay(i)/(RD*t1lay(i))
     2331  ENDDO
     2332! === Calcul de la temperature de surface ===
     2333!
     2334! zx_sl = chaleur latente d'evaporation ou de sublimation
     2335!
     2336  do i = 1, knon
     2337    zx_sl(i) = RLVTT
     2338    if (tsurf(i) .LT. RTT) zx_sl(i) = RLSTT
     2339    zx_k1(i) = zx_coef(i)
     2340  enddo
     2341
     2342
     2343  do i = 1, knon
     2344! Q
     2345    zx_oq(i) = 1. - (beta(i) * zx_k1(i) * peqBcoef(i) * dtime)
     2346    zx_mq(i) = beta(i) * zx_k1(i) * &
     2347     &             (peqAcoef(i) - zx_qsat(i) &
     2348     &                          + zx_dq_s_dt(i) * tsurf(i)) &
     2349     &             / zx_oq(i)
     2350    zx_nq(i) = beta(i) * zx_k1(i) * (-1. * zx_dq_s_dt(i)) &
     2351     &                              / zx_oq(i)
     2352
     2353! H
     2354    zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime)
     2355    zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i)
     2356    zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
     2357  enddo
     2358
     2359!
     2360! Y'a-t-il fonte de neige?
     2361!
     2362  do i = 1, knon
     2363    neige_fond = ((snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
     2364     & .AND. tsurf_new(i) >= RTT)
     2365    if (neige_fond) then
     2366      tsurf_new(i) = RTT 
     2367      d_ts(i) = tsurf_new(i) - tsurf(i)
     2368!      zx_h_ts(i) = tsurf_new(i) * RCPD * zx_pkh(i)
     2369!      zx_q_0(i) = zx_qsat(i) + zx_dq_s_dt(i) * d_ts(i)
     2370!== flux_q est le flux de vapeur d'eau: kg/(m**2 s)  positive vers bas
     2371!== flux_t est le flux de cpt (energie sensible): j/(m**2 s)
     2372      evap(i) = - zx_mq(i) - zx_nq(i) * tsurf_new(i)
     2373      fluxlat(i) = - evap(i) * zx_sl(i)
     2374      fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i)
     2375! Derives des flux dF/dTs (W m-2 K-1):
     2376      dflux_s(i) = zx_nh(i)
     2377      dflux_l(i) = (zx_sl(i) * zx_nq(i))
     2378      bilan_f = radsol(i) + fluxsens(i) - (zx_sl(i) * evap (i)) - &
     2379     &          dif_grnd(i) * (tsurf_new(i) - t_grnd) - &
     2380     &          RCPD * (zx_pkh(i))/cal(i)/dtime * (tsurf_new(i) - tsurf(i))
     2381      bilan_f = max(0., bilan_f)
     2382      fq_fonte = bilan_f / zx_sl(i)
     2383      snow(i) = max(0., snow(i) - fq_fonte * dtime)
     2384      qsol(i) = qsol(i) + (fq_fonte * dtime)
     2385      if (nisurf == is_ter)  &
     2386     &  run_off(i) = run_off(i) + max(qsol(i) - max_eau_sol, 0.0)
     2387      qsol(i) = min(qsol(i), max_eau_sol)
     2388    endif
     2389  enddo
     2390
     2391  END SUBROUTINE fonte_neige
     2392!
     2393!#########################################################################
     2394!
    21982395  END MODULE interface_surf
Note: See TracChangeset for help on using the changeset viewer.