/[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 103 - (show annotations)
Fri Aug 29 13:00:05 2014 UTC (9 years, 8 months ago) by guez
File size: 7307 byte(s)
Renamed module cvparam to cv_param. Deleted procedure
cv_param. Changed variables of module cv_param into parameters.

In procedures cv_driver, cv_uncompress and cv3_uncompress, removed
some arguments giving dimensions and used module variables klon and
klev instead.

In procedures gradiv2, laplacien_gam and laplacien, changed
declarations of local variables because klevel is not always klev.

Removed code for nudging surface pressure.

Removed arguments pim and pjm of tau2alpha. Added assignment of false
to variable first.

Replaced real argument del of procedures foeew and FOEDE by logical
argument.

1 module calcul_fluxs_m
2
3 implicit none
4
5 contains
6
7 SUBROUTINE calcul_fluxs( klon, knon, nisurf, dtime, &
8 tsurf, p1lay, cal, beta, coef1lay, ps, &
9 precip_rain, precip_snow, snow, qsurf, &
10 radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, &
11 petAcoef, peqAcoef, petBcoef, peqBcoef, &
12 tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
13
14 ! Cette routine calcule les fluxs en h et q à l'interface et une
15 ! température de surface.
16
17 ! L. Fairhead 4/2000
18
19 ! input:
20 ! knon nombre de points a traiter
21 ! nisurf surface a traiter
22 ! tsurf temperature de surface
23 ! p1lay pression 1er niveau (milieu de couche)
24 ! cal capacite calorifique du sol
25 ! beta evap reelle
26 ! coef1lay coefficient d'echange
27 ! ps pression au sol
28 ! precip_rain precipitations liquides
29 ! precip_snow precipitations solides
30 ! snow champs hauteur de neige
31 ! runoff runoff en cas de trop plein
32 ! petAcoef coeff. A de la resolution de la CL pour t
33 ! peqAcoef coeff. A de la resolution de la CL pour q
34 ! petBcoef coeff. B de la resolution de la CL pour t
35 ! peqBcoef coeff. B de la resolution de la CL pour q
36 ! radsol rayonnement net aus sol (LW + SW)
37 ! dif_grnd coeff. diffusion vers le sol profond
38
39 ! output:
40 ! tsurf_new temperature au sol
41 ! qsurf humidite de l'air au dessus du sol
42 ! fluxsens flux de chaleur sensible
43 ! fluxlat flux de chaleur latente
44 ! dflux_s derivee du flux de chaleur sensible / Ts
45 ! dflux_l derivee du flux de chaleur latente / Ts
46
47
48 use indicesol
49 use abort_gcm_m, only: abort_gcm
50 use yoethf_m
51 use fcttre, only: thermcep, foeew, qsats, qsatl, foede, dqsats, dqsatl
52 use SUPHEC_M
53 use interface_surf
54
55 ! Parametres d'entree
56 integer, intent(IN) :: knon, nisurf, klon
57 real , intent(IN) :: dtime
58 real, dimension(klon), intent(IN) :: petAcoef, peqAcoef
59 real, dimension(klon), intent(IN) :: petBcoef, peqBcoef
60 real, dimension(klon), intent(IN) :: ps, q1lay
61 real, dimension(klon), intent(IN) :: tsurf, p1lay, cal, beta, coef1lay
62 real, dimension(klon), intent(IN) :: precip_rain, precip_snow
63 real, dimension(klon), intent(IN) :: radsol, dif_grnd
64 real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay
65 real, dimension(klon), intent(INOUT) :: snow, qsurf
66
67 ! Parametres sorties
68 real, dimension(klon), intent(OUT):: tsurf_new, evap, fluxsens, fluxlat
69 real, dimension(klon), intent(OUT):: dflux_s, dflux_l
70
71 ! Variables locales
72 integer :: i
73 real, dimension(klon) :: zx_mh, zx_nh, zx_oh
74 real, dimension(klon) :: zx_mq, zx_nq, zx_oq
75 real, dimension(klon) :: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef
76 real, dimension(klon) :: zx_sl, zx_k1
77 real, dimension(klon) :: zx_q_0 , d_ts
78 logical zdelta
79 real zcvm5, zx_qs, zcor, zx_dq_s_dh
80 real :: bilan_f, fq_fonte
81 REAL :: subli, fsno
82 REAL :: qsat_new, q1_new
83 real, parameter :: t_grnd = 271.35, t_coup = 273.15
84 !! PB temporaire en attendant mieux pour le modele de neige
85 REAL, parameter :: chasno = 3.334E+05/(2.3867E+06*0.15)
86
87 logical, save :: check = .false.
88 character (len = 20) :: modname = 'calcul_fluxs'
89 logical, save :: fonte_neige = .false.
90 real, save :: max_eau_sol = 150.0
91 character (len = 80) :: abort_message
92 logical, save :: first = .true., second=.false.
93
94 if (check) write(*, *)'Entree ', modname, ' surface = ', nisurf
95
96 IF (check) THEN
97 WRITE(*, *)' radsol (min, max)' &
98 , MINVAL(radsol(1:knon)), MAXVAL(radsol(1:knon))
99 !!CALL flush(6)
100 ENDIF
101
102 if (size(run_off) /= knon .AND. nisurf == is_ter) then
103 write(*, *)'Bizarre, le nombre de points continentaux'
104 write(*, *)'a change entre deux appels. J''arrete ...'
105 abort_message='Pb run_off'
106 call abort_gcm(modname, abort_message, 1)
107 endif
108
109 ! Traitement neige et humidite du sol
110
111 ! Initialisation
112
113 evap = 0.
114 fluxsens=0.
115 fluxlat=0.
116 dflux_s = 0.
117 dflux_l = 0.
118
119 ! zx_qs = qsat en kg/kg
120
121 DO i = 1, knon
122 zx_pkh(i) = (ps(i)/ps(i))**RKAPPA
123 IF (thermcep) THEN
124 zdelta= rtt >= tsurf(i)
125 zcvm5 = merge(R5IES*RLSTT, R5LES*RLVTT, zdelta)
126 zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q1lay(i))
127 zx_qs= r2es * FOEEW(tsurf(i), zdelta)/ps(i)
128 zx_qs=MIN(0.5, zx_qs)
129 zcor=1./(1.-retv*zx_qs)
130 zx_qs=zx_qs*zcor
131 zx_dq_s_dh = FOEDE(tsurf(i), zdelta, zcvm5, zx_qs, zcor) &
132 /RLVTT / zx_pkh(i)
133 ELSE
134 IF (tsurf(i).LT.t_coup) THEN
135 zx_qs = qsats(tsurf(i)) / ps(i)
136 zx_dq_s_dh = dqsats(tsurf(i), zx_qs)/RLVTT &
137 / zx_pkh(i)
138 ELSE
139 zx_qs = qsatl(tsurf(i)) / ps(i)
140 zx_dq_s_dh = dqsatl(tsurf(i), zx_qs)/RLVTT &
141 / zx_pkh(i)
142 ENDIF
143 ENDIF
144 zx_dq_s_dt(i) = RCPD * zx_pkh(i) * zx_dq_s_dh
145 zx_qsat(i) = zx_qs
146 zx_coef(i) = coef1lay(i) &
147 * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
148 * p1lay(i)/(RD*t1lay(i))
149
150 ENDDO
151
152 ! === Calcul de la temperature de surface ===
153
154 ! zx_sl = chaleur latente d'evaporation ou de sublimation
155
156 do i = 1, knon
157 zx_sl(i) = RLVTT
158 if (tsurf(i) .LT. RTT) zx_sl(i) = RLSTT
159 zx_k1(i) = zx_coef(i)
160 enddo
161
162 do i = 1, knon
163 ! Q
164 zx_oq(i) = 1. - (beta(i) * zx_k1(i) * peqBcoef(i) * dtime)
165 zx_mq(i) = beta(i) * zx_k1(i) * &
166 (peqAcoef(i) - zx_qsat(i) &
167 + zx_dq_s_dt(i) * tsurf(i)) &
168 / zx_oq(i)
169 zx_nq(i) = beta(i) * zx_k1(i) * (-1. * zx_dq_s_dt(i)) &
170 / zx_oq(i)
171
172 ! H
173 zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime)
174 zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i)
175 zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
176
177 ! Tsurface
178 tsurf_new(i) = (tsurf(i) + cal(i)/(RCPD * zx_pkh(i)) * dtime * &
179 (radsol(i) + zx_mh(i) + zx_sl(i) * zx_mq(i)) &
180 + dif_grnd(i) * t_grnd * dtime)/ &
181 ( 1. - dtime * cal(i)/(RCPD * zx_pkh(i)) * ( &
182 zx_nh(i) + zx_sl(i) * zx_nq(i)) &
183 + dtime * dif_grnd(i))
184
185
186 ! Y'a-t-il fonte de neige?
187
188 ! fonte_neige = (nisurf /= is_oce) .AND. &
189 ! & (snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
190 ! & .AND. (tsurf_new(i) >= RTT)
191 ! if (fonte_neige) tsurf_new(i) = RTT
192 d_ts(i) = tsurf_new(i) - tsurf(i)
193 ! zx_h_ts(i) = tsurf_new(i) * RCPD * zx_pkh(i)
194 ! zx_q_0(i) = zx_qsat(i) + zx_dq_s_dt(i) * d_ts(i)
195 !== flux_q est le flux de vapeur d'eau: kg/(m**2 s) positive vers bas
196 !== flux_t est le flux de cpt (energie sensible): j/(m**2 s)
197 evap(i) = - zx_mq(i) - zx_nq(i) * tsurf_new(i)
198 fluxlat(i) = - evap(i) * zx_sl(i)
199 fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i)
200 ! Derives des flux dF/dTs (W m-2 K-1):
201 dflux_s(i) = zx_nh(i)
202 dflux_l(i) = (zx_sl(i) * zx_nq(i))
203 ! Nouvelle valeure de l'humidite au dessus du sol
204 qsat_new=zx_qsat(i) + zx_dq_s_dt(i) * d_ts(i)
205 q1_new = peqAcoef(i) - peqBcoef(i)*evap(i)*dtime
206 qsurf(i)=q1_new*(1.-beta(i)) + beta(i)*qsat_new
207 ENDDO
208
209 END SUBROUTINE calcul_fluxs
210
211 end module calcul_fluxs_m

  ViewVC Help
Powered by ViewVC 1.1.21