4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE calcul_fluxs( klon, knon, nisurf, dtime, & |
SUBROUTINE calcul_fluxs(nisurf, dtime, tsurf, p1lay, cal, beta, coef1lay, & |
8 |
tsurf, p1lay, cal, beta, coef1lay, ps, & |
ps, qsurf, radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, petAcoef, & |
9 |
precip_rain, precip_snow, snow, qsurf, & |
peqAcoef, petBcoef, peqBcoef, tsurf_new, evap, fluxlat, fluxsens, & |
10 |
radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, & |
dflux_s, dflux_l) |
|
petAcoef, peqAcoef, petBcoef, peqBcoef, & |
|
|
tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l) |
|
11 |
|
|
12 |
! Cette routine calcule les fluxs en h et q à l'interface et une |
! Cette routine calcule les fluxs en h et q à l'interface et une |
13 |
! température de surface. |
! température de surface. |
14 |
|
|
15 |
! L. Fairhead 4/2000 |
! L. Fairhead April 2000 |
16 |
|
|
17 |
! input: |
USE abort_gcm_m, ONLY: abort_gcm |
18 |
! knon nombre de points a traiter |
USE indicesol, ONLY: is_ter |
19 |
! nisurf surface a traiter |
USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep |
20 |
! tsurf temperature de surface |
USE interface_surf, ONLY: run_off |
21 |
! p1lay pression 1er niveau (milieu de couche) |
use nr_util, only: assert_eq |
22 |
! cal capacite calorifique du sol |
USE suphec_m, ONLY: rcpd, rd, retv, rkappa, rlstt, rlvtt, rtt |
23 |
! beta evap reelle |
USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2 |
24 |
! coef1lay coefficient d'echange |
|
25 |
! ps pression au sol |
integer, intent(IN):: nisurf ! surface a traiter |
26 |
! precip_rain precipitations liquides |
real, intent(IN):: dtime |
27 |
! precip_snow precipitations solides |
real, intent(IN):: tsurf(:) ! (knon) temperature de surface |
28 |
! snow champs hauteur de neige |
real, intent(IN):: p1lay(:) ! (knon) pression 1er niveau (milieu de couche) |
29 |
! runoff runoff en cas de trop plein |
real, intent(IN):: cal(:) ! (knon) capacité calorifique du sol |
30 |
! petAcoef coeff. A de la resolution de la CL pour t |
real, intent(IN):: beta(:) ! (knon) evap reelle |
31 |
! peqAcoef coeff. A de la resolution de la CL pour q |
real, intent(IN):: coef1lay(:) ! (knon) coefficient d'échange |
32 |
|
real, intent(IN):: ps(:) ! (knon) pression au sol |
33 |
|
real, intent(OUT):: qsurf(:) ! (knon) humidite de l'air au dessus du sol |
34 |
|
real, intent(IN):: radsol(:) ! (knon) rayonnement net au sol (LW + SW) |
35 |
|
|
36 |
|
real, intent(IN):: dif_grnd(:) ! (knon) |
37 |
|
! coefficient diffusion vers le sol profond |
38 |
|
|
39 |
|
real, intent(IN):: t1lay(:), q1lay(:), u1lay(:), v1lay(:) ! (knon) |
40 |
|
|
41 |
|
real, intent(IN):: petAcoef(:), peqAcoef(:) ! (knon) |
42 |
|
! coefficients A de la résolution de la couche limite pour t et q |
43 |
|
|
44 |
|
real, intent(IN):: petBcoef(:), peqBcoef(:) ! (knon) |
45 |
! petBcoef coeff. B de la resolution de la CL pour t |
! petBcoef coeff. B de la resolution de la CL pour t |
46 |
! peqBcoef coeff. B de la resolution de la CL pour q |
! peqBcoef coeff. B de la resolution de la CL pour q |
|
! radsol rayonnement net aus sol (LW + SW) |
|
|
! dif_grnd coeff. diffusion vers le sol profond |
|
47 |
|
|
48 |
! output: |
real, intent(OUT):: tsurf_new(:) ! (knon) température au sol |
49 |
! tsurf_new temperature au sol |
real, intent(OUT):: evap(:), fluxlat(:), fluxsens(:) ! (knon) |
|
! qsurf humidite de l'air au dessus du sol |
|
|
! fluxsens flux de chaleur sensible |
|
50 |
! fluxlat flux de chaleur latente |
! fluxlat flux de chaleur latente |
51 |
|
! fluxsens flux de chaleur sensible |
52 |
|
real, intent(OUT):: dflux_s(:), dflux_l(:) ! (knon) |
53 |
|
! Dérivées des flux dF/dTs (W m-2 K-1) |
54 |
! dflux_s derivee du flux de chaleur sensible / Ts |
! dflux_s derivee du flux de chaleur sensible / Ts |
55 |
! dflux_l derivee du flux de chaleur latente / Ts |
! dflux_l derivee du flux de chaleur latente / Ts |
56 |
|
|
57 |
|
! Local: |
58 |
use indicesol |
integer i |
59 |
use abort_gcm_m, only: abort_gcm |
real, dimension(size(ps)) :: zx_mh, zx_nh, zx_oh |
60 |
use yoethf_m |
real, dimension(size(ps)) :: zx_mq, zx_nq, zx_oq |
61 |
use fcttre, only: thermcep, foeew, qsats, qsatl, foede, dqsats, dqsatl |
real, dimension(size(ps)) :: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef |
62 |
use SUPHEC_M |
real, dimension(size(ps)) :: zx_sl, zx_k1 |
63 |
use interface_surf |
real, dimension(size(ps)) :: zx_q_0 , d_ts |
|
|
|
|
! Parametres d'entree |
|
|
integer, intent(IN) :: knon, nisurf, klon |
|
|
real , intent(IN) :: dtime |
|
|
real, dimension(klon), intent(IN) :: petAcoef, peqAcoef |
|
|
real, dimension(klon), intent(IN) :: petBcoef, peqBcoef |
|
|
real, dimension(klon), intent(IN) :: ps, q1lay |
|
|
real, dimension(klon), intent(IN) :: tsurf, p1lay, cal, beta, coef1lay |
|
|
real, dimension(klon), intent(IN) :: precip_rain, precip_snow |
|
|
real, dimension(klon), intent(IN) :: radsol, dif_grnd |
|
|
real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay |
|
|
real, dimension(klon), intent(INOUT) :: snow, qsurf |
|
|
|
|
|
! Parametres sorties |
|
|
real, dimension(klon), intent(OUT):: tsurf_new, evap, fluxsens, fluxlat |
|
|
real, dimension(klon), intent(OUT):: dflux_s, dflux_l |
|
|
|
|
|
! Variables locales |
|
|
integer :: i |
|
|
real, dimension(klon) :: zx_mh, zx_nh, zx_oh |
|
|
real, dimension(klon) :: zx_mq, zx_nq, zx_oq |
|
|
real, dimension(klon) :: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef |
|
|
real, dimension(klon) :: zx_sl, zx_k1 |
|
|
real, dimension(klon) :: zx_q_0 , d_ts |
|
64 |
logical zdelta |
logical zdelta |
65 |
real zcvm5, zx_qs, zcor, zx_dq_s_dh |
real zcvm5, zx_qs, zcor, zx_dq_s_dh |
66 |
real :: bilan_f, fq_fonte |
real :: bilan_f, fq_fonte |
67 |
REAL :: subli, fsno |
REAL :: subli, fsno |
68 |
REAL :: qsat_new, q1_new |
REAL :: qsat_new, q1_new |
69 |
real, parameter :: t_grnd = 271.35, t_coup = 273.15 |
integer knon ! nombre de points a traiter |
70 |
!! PB temporaire en attendant mieux pour le modele de neige |
real, parameter:: t_grnd = 271.35, t_coup = 273.15 |
71 |
REAL, parameter :: chasno = 3.334E+05/(2.3867E+06*0.15) |
|
72 |
|
!--------------------------------------------------------------------- |
73 |
logical, save :: check = .false. |
|
74 |
character (len = 20) :: modname = 'calcul_fluxs' |
knon = assert_eq((/size(tsurf), size(p1lay), size(cal), size(beta), & |
75 |
logical, save :: fonte_neige = .false. |
size(coef1lay), size(ps), size(qsurf), size(radsol), size(dif_grnd), & |
76 |
real, save :: max_eau_sol = 150.0 |
size(t1lay), size(q1lay), size(u1lay), size(v1lay), size(petAcoef), & |
77 |
character (len = 80) :: abort_message |
size(peqAcoef), size(petBcoef), size(peqBcoef), size(tsurf_new), & |
78 |
logical, save :: first = .true., second=.false. |
size(evap), size(fluxlat), size(fluxsens), size(dflux_s), & |
79 |
|
size(dflux_l)/), "calcul_fluxs knon") |
|
if (check) write(*, *)'Entree ', modname, ' surface = ', nisurf |
|
|
|
|
|
IF (check) THEN |
|
|
WRITE(*, *)' radsol (min, max)' & |
|
|
, MINVAL(radsol(1:knon)), MAXVAL(radsol(1:knon)) |
|
|
!!CALL flush(6) |
|
|
ENDIF |
|
80 |
|
|
81 |
if (size(run_off) /= knon .AND. nisurf == is_ter) then |
if (size(run_off) /= knon .AND. nisurf == is_ter) then |
82 |
write(*, *)'Bizarre, le nombre de points continentaux' |
print *, 'Bizarre, le nombre de points continentaux' |
83 |
write(*, *)'a change entre deux appels. J''arrete ...' |
print *, 'a change entre deux appels. J''arrete.' |
84 |
abort_message='Pb run_off' |
call abort_gcm('calcul_fluxs', 'Pb run_off', 1) |
|
call abort_gcm(modname, abort_message, 1) |
|
85 |
endif |
endif |
86 |
|
|
87 |
! Traitement neige et humidite du sol |
! Traitement humidite du sol |
|
|
|
|
! Initialisation |
|
88 |
|
|
89 |
evap = 0. |
evap = 0. |
90 |
fluxsens=0. |
fluxsens=0. |