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

Contents of /trunk/phylmd/Interface_surf/calcul_fluxs.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
Original Path: trunk/Sources/phylmd/Interface_surf/calcul_fluxs.f
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 module calcul_fluxs_m
2
3 implicit none
4
5 contains
6
7 SUBROUTINE calcul_fluxs(dtime, tsurf, p1lay, cal, beta, coef1lay, ps, &
8 qsurf, radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, petAcoef, &
9 peqAcoef, petBcoef, peqBcoef, tsurf_new, evap, fluxlat, fluxsens, &
10 dflux_s, dflux_l)
11
12 ! Cette routine calcule les fluxs en h et q à l'interface et une
13 ! température de surface.
14
15 ! L. Fairhead April 2000
16
17 USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep
18 use nr_util, only: assert_eq
19 USE suphec_m, ONLY: rcpd, rd, retv, rlstt, rlvtt, rtt
20 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 ! coeff. B de la resolution de la CL pour t et q
42
43 real, intent(OUT):: tsurf_new(:) ! (knon) température au sol
44 real, intent(OUT):: evap(:) ! (knon)
45
46 real, intent(OUT):: fluxlat(:), fluxsens(:) ! (knon)
47 ! flux de chaleur latente et sensible
48
49 real, intent(OUT):: dflux_s(:), dflux_l(:) ! (knon)
50 ! dérivées des flux de chaleurs sensible et latente par rapport à
51 ! Ts (W m-2 K-1)
52
53 ! Local:
54 integer i
55 integer knon ! nombre de points a traiter
56 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 real, parameter:: t_grnd = 271.35, t_coup = 273.15
63
64 !---------------------------------------------------------------------
65
66 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
73 ! Traitement humidite du sol
74
75 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 ELSE
91 qsat(i) = qsatl(tsurf(i)) / ps(i)
92 dq_s_dt(i) = RCPD * dqsatl(tsurf(i), qsat(i)) / RLVTT
93 ENDIF
94 ENDDO
95 ENDIF
96
97 coef = coef1lay * (1. + SQRT(u1lay**2 + v1lay**2)) * p1lay / (RD * t1lay)
98 sl = merge(RLSTT, RLVTT, tsurf < RTT)
99
100 ! 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
105 ! H
106 oh = 1. - (coef * petBcoef * dtime)
107 mh = coef * petAcoef / oh
108 dflux_s = - (coef * RCPD)/ oh
109
110 ! 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
115 evap = - mq - nq * tsurf_new
116 fluxlat = - evap * sl
117 fluxsens = mh + dflux_s * tsurf_new
118 dflux_l = sl * nq
119
120 ! 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
124 END SUBROUTINE calcul_fluxs
125
126 end module calcul_fluxs_m

  ViewVC Help
Powered by ViewVC 1.1.21