/[lmdze]/trunk/Sources/phylmd/Interface_surf/calcul_fluxs.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/Interface_surf/calcul_fluxs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (hide annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
File size: 4626 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

1 guez 54 module calcul_fluxs_m
2    
3     implicit none
4    
5     contains
6    
7 guez 171 SUBROUTINE calcul_fluxs(dtime, tsurf, p1lay, cal, beta, coef1lay, ps, &
8     qsurf, radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, petAcoef, &
9 guez 104 peqAcoef, petBcoef, peqBcoef, tsurf_new, evap, fluxlat, fluxsens, &
10     dflux_s, dflux_l)
11 guez 54
12 guez 99 ! Cette routine calcule les fluxs en h et q à l'interface et une
13     ! température de surface.
14 guez 54
15 guez 104 ! L. Fairhead April 2000
16 guez 54
17 guez 171 USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep
18 guez 104 use nr_util, only: assert_eq
19 guez 178 USE suphec_m, ONLY: rcpd, rd, retv, rlstt, rlvtt, rtt
20 guez 104 USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2
21    
22     real, intent(IN):: dtime
23     real, intent(IN):: tsurf(:) ! (knon) temperature de surface
24     real, intent(IN):: p1lay(:) ! (knon) pression 1er niveau (milieu de couche)
25     real, intent(IN):: cal(:) ! (knon) capacité calorifique du sol
26     real, intent(IN):: beta(:) ! (knon) evap reelle
27     real, intent(IN):: coef1lay(:) ! (knon) coefficient d'échange
28     real, intent(IN):: ps(:) ! (knon) pression au sol
29     real, intent(OUT):: qsurf(:) ! (knon) humidite de l'air au dessus du sol
30     real, intent(IN):: radsol(:) ! (knon) rayonnement net au sol (LW + SW)
31    
32     real, intent(IN):: dif_grnd(:) ! (knon)
33     ! coefficient diffusion vers le sol profond
34    
35     real, intent(IN):: t1lay(:), q1lay(:), u1lay(:), v1lay(:) ! (knon)
36    
37     real, intent(IN):: petAcoef(:), peqAcoef(:) ! (knon)
38     ! coefficients A de la résolution de la couche limite pour t et q
39    
40     real, intent(IN):: petBcoef(:), peqBcoef(:) ! (knon)
41 guez 171 ! coeff. B de la resolution de la CL pour t et q
42 guez 54
43 guez 104 real, intent(OUT):: tsurf_new(:) ! (knon) température au sol
44 guez 171 real, intent(OUT):: evap(:) ! (knon)
45    
46     real, intent(OUT):: fluxlat(:), fluxsens(:) ! (knon)
47     ! flux de chaleur latente et sensible
48    
49 guez 104 real, intent(OUT):: dflux_s(:), dflux_l(:) ! (knon)
50 guez 171 ! dérivées des flux de chaleurs sensible et latente par rapport à
51     ! Ts (W m-2 K-1)
52 guez 54
53 guez 104 ! Local:
54     integer i
55     integer knon ! nombre de points a traiter
56 guez 105 real, dimension(size(ps)):: mh, oh, mq, nq, oq
57     real, dimension(size(ps)):: dq_s_dt, coef
58     real qsat(size(ps)) ! qsat en kg/kg
59     real sl(size(ps)) ! chaleur latente d'evaporation ou de sublimation
60     logical delta
61     real zcor
62 guez 104 real, parameter:: t_grnd = 271.35, t_coup = 273.15
63 guez 54
64 guez 104 !---------------------------------------------------------------------
65 guez 54
66 guez 104 knon = assert_eq((/size(tsurf), size(p1lay), size(cal), size(beta), &
67     size(coef1lay), size(ps), size(qsurf), size(radsol), size(dif_grnd), &
68     size(t1lay), size(q1lay), size(u1lay), size(v1lay), size(petAcoef), &
69     size(peqAcoef), size(petBcoef), size(peqBcoef), size(tsurf_new), &
70     size(evap), size(fluxlat), size(fluxsens), size(dflux_s), &
71     size(dflux_l)/), "calcul_fluxs knon")
72 guez 54
73 guez 104 ! Traitement humidite du sol
74 guez 54
75 guez 105 IF (thermcep) THEN
76     DO i = 1, knon
77     delta = rtt >= tsurf(i)
78     qsat(i) = MIN(0.5, r2es * FOEEW(tsurf(i), delta) / ps(i))
79     zcor = 1. / (1. - retv * qsat(i))
80     qsat(i) = qsat(i) * zcor
81     dq_s_dt(i) = RCPD * FOEDE(tsurf(i), delta, merge(R5IES * RLSTT, &
82     R5LES * RLVTT, delta) / RCPD / (1. + RVTMP2 * q1lay(i)), &
83     qsat(i), zcor) / RLVTT
84     ENDDO
85     ELSE
86     DO i = 1, knon
87     IF (tsurf(i) < t_coup) THEN
88     qsat(i) = qsats(tsurf(i)) / ps(i)
89     dq_s_dt(i) = RCPD * dqsats(tsurf(i), qsat(i)) / RLVTT
90 guez 54 ELSE
91 guez 105 qsat(i) = qsatl(tsurf(i)) / ps(i)
92     dq_s_dt(i) = RCPD * dqsatl(tsurf(i), qsat(i)) / RLVTT
93 guez 54 ENDIF
94 guez 105 ENDDO
95     ENDIF
96 guez 54
97 guez 105 coef = coef1lay * (1. + SQRT(u1lay**2 + v1lay**2)) * p1lay / (RD * t1lay)
98     sl = merge(RLSTT, RLVTT, tsurf < RTT)
99 guez 54
100 guez 105 ! Q
101     oq = 1. - (beta * coef * peqBcoef * dtime)
102     mq = beta * coef * (peqAcoef - qsat + dq_s_dt * tsurf) / oq
103     nq = beta * coef * (- 1. * dq_s_dt) / oq
104 guez 54
105 guez 105 ! H
106     oh = 1. - (coef * petBcoef * dtime)
107     mh = coef * petAcoef / oh
108     dflux_s = - (coef * RCPD)/ oh
109 guez 54
110 guez 105 ! Tsurface
111     tsurf_new = (tsurf + cal / RCPD * dtime * (radsol + mh + sl * mq) &
112     + dif_grnd * t_grnd * dtime) / (1. - dtime * cal / RCPD * (dflux_s &
113     + sl * nq) + dtime * dif_grnd)
114 guez 54
115 guez 105 evap = - mq - nq * tsurf_new
116     fluxlat = - evap * sl
117     fluxsens = mh + dflux_s * tsurf_new
118     dflux_l = sl * nq
119 guez 54
120 guez 105 ! Nouvelle valeur de l'humidité au dessus du sol :
121     qsurf = (peqAcoef - peqBcoef * evap * dtime) * (1. - beta) + beta * (qsat &
122     + dq_s_dt * (tsurf_new - tsurf))
123 guez 54
124     END SUBROUTINE calcul_fluxs
125    
126     end module calcul_fluxs_m

  ViewVC Help
Powered by ViewVC 1.1.21