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

Contents of /trunk/Sources/phylmd/Interface_surf/fonte_neige.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 104 - (show annotations)
Thu Sep 4 10:05:52 2014 UTC (9 years, 8 months ago) by guez
Original Path: trunk/phylmd/Interface_surf/fonte_neige.f
File size: 7669 byte(s)
Removed procedure sortvarc0. Called sortvarc with an additional
argument resetvarc instead. (Following LMDZ.) Moved current time
computations and some printing statements from sortvarc to
caldyn. Could then remove arguments itau and time_0 of sortvarc, and
could remove "use dynetat0". Better to keep "dynetat0.f" as a gcm-only
file.

Moved some variables from module ener to module sortvarc.

Split file "mathelp.f" into single-procedure files.

Removed unused argument nadv of adaptdt. Removed dimension arguments
of bernoui.

Removed unused argument nisurf of interfoce_lim. Changed the size of
argument lmt_sst of interfoce_lim from klon to knon. Removed case when
newlmt is false.

dynredem1 is called only once in each run, either ce0l or gcm. So
variable nb in call to nf95_put_var was always 1. Removed variable nb.

Removed dimension arguments of calcul_fluxs. Removed unused arguments
precip_rain, precip_snow, snow of calcul_fluxs. Changed the size of
all the arrays in calcul_fluxs from klon to knon.

Removed dimension arguments of fonte_neige. Changed the size of all
the arrays in fonte_neige from klon to knon.

Changed the size of arguments tsurf and tsurf_new of interfsurf_hq
from klon to knon. Changed the size of argument ptsrf of soil from
klon to knon.

1 module fonte_neige_m
2
3 implicit none
4
5 contains
6
7 SUBROUTINE fonte_neige(nisurf, dtime, tsurf, p1lay, beta, coef1lay, ps, &
8 precip_rain, precip_snow, snow, qsol, t1lay, q1lay, u1lay, v1lay, &
9 petAcoef, peqAcoef, petBcoef, peqBcoef, tsurf_new, evap, fqcalving, &
10 ffonte, run_off_lic_0)
11
12 ! Routine de traitement de la fonte de la neige dans le cas du traitement
13 ! de sol simplifié
14
15 ! LF 03/2001
16
17 USE fcttre, ONLY: dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep
18 USE indicesol, ONLY: epsfra, is_lic, is_sic, is_ter
19 USE interface_surf, ONLY: run_off, run_off_lic, tau_calv
20 use nr_util, only: assert_eq
21 USE suphec_m, ONLY: rcpd, rd, rday, retv, rkappa, rlmlt, rlstt, rlvtt, rtt
22 USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2
23
24 integer, intent(IN):: nisurf ! surface à traiter
25 real, intent(IN):: dtime ! pas de temps de la physique (en s)
26 real, dimension(:), intent(IN):: tsurf, p1lay, beta, coef1lay ! (knon)
27 ! tsurf temperature de surface
28 ! p1lay pression 1er niveau (milieu de couche)
29 ! beta evap reelle
30 ! coef1lay coefficient d'echange
31 real, dimension(:), intent(IN):: ps ! (knon)
32 ! ps pression au sol
33
34 real, intent(IN):: precip_rain(:) ! (knon)
35 ! precipitation, liquid water mass flux (kg/m2/s), positive down
36
37 real, intent(IN):: precip_snow(:) ! (knon)
38 ! precipitation, solid water mass flux (kg/m2/s), positive down
39
40 real, intent(INOUT):: snow(:) ! (knon)
41 ! column-density of mass of snow, in kg m-2
42
43 real, intent(INOUT):: qsol(:) ! (knon)
44 ! column-density of water in soil, in kg m-2
45
46 real, dimension(:), intent(IN):: t1lay ! (knon)
47 real, dimension(:), intent(IN):: q1lay ! (knon)
48 real, dimension(:), intent(IN):: u1lay, v1lay ! (knon)
49 real, dimension(:), intent(IN):: petAcoef, peqAcoef ! (knon)
50 ! petAcoef coeff. A de la resolution de la CL pour t
51 ! peqAcoef coeff. A de la resolution de la CL pour q
52 real, dimension(:), intent(IN):: petBcoef, peqBcoef ! (knon)
53 ! petBcoef coeff. B de la resolution de la CL pour t
54 ! peqBcoef coeff. B de la resolution de la CL pour q
55
56 real, intent(INOUT):: tsurf_new(:)
57 ! tsurf_new temperature au sol
58
59 real, intent(IN):: evap(:) ! (knon)
60
61 ! Flux d'eau "perdue" par la surface et necessaire pour que limiter la
62 ! hauteur de neige, en kg/m2/s
63 real, intent(OUT):: fqcalving(:) ! (knon)
64
65 ! Flux thermique utiliser pour fondre la neige
66 real, intent(OUT):: ffonte(:) ! (knon)
67
68 real, dimension(:), intent(INOUT):: run_off_lic_0 ! (knon)
69 ! run_off_lic_0 run off glacier du pas de temps précedent
70
71 ! Local:
72
73 integer knon ! nombre de points à traiter
74 real, parameter:: snow_max=3000.
75 ! Masse maximum de neige (kg/m2). Au dessus de ce seuil, la neige
76 ! en exces "s'ecoule" (calving)
77
78 integer i
79 real, dimension(size(ps)):: zx_mh, zx_nh, zx_oh
80 real, dimension(size(ps)):: zx_mq, zx_nq, zx_oq
81 real, dimension(size(ps)):: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef
82 real, dimension(size(ps)):: zx_sl, zx_k1
83 real, dimension(size(ps)):: d_ts
84 logical zdelta
85 real zcvm5, zx_qs, zcor, zx_dq_s_dh
86 real fq_fonte
87 REAL bil_eau_s(size(ps)) ! in kg m-2
88 real snow_evap(size(ps)) ! in kg m-2 s-1
89 real, parameter:: t_grnd = 271.35, t_coup = 273.15
90 REAL, parameter:: chasno = 3.334E5/(2.3867E6*0.15)
91 REAL, parameter:: chaice = 3.334E5/(2.3867E6*0.15)
92 real, parameter:: max_eau_sol = 150. ! in kg m-2
93 real coeff_rel
94
95 !--------------------------------------------------------------------
96
97 knon = assert_eq((/size(tsurf), size(p1lay), size(beta), size(coef1lay), &
98 size(ps), size(precip_rain), size(precip_snow), size(snow), &
99 size(qsol), size(t1lay), size(q1lay), size(u1lay), size(v1lay), &
100 size(petAcoef), size(peqAcoef), size(petBcoef), size(peqBcoef), &
101 size(tsurf_new), size(evap), size(fqcalving), size(ffonte), &
102 size(run_off_lic_0)/), "fonte_neige knon")
103
104 ! Initialisations
105 coeff_rel = dtime/(tau_calv * rday)
106 bil_eau_s = 0.
107 DO i = 1, knon
108 zx_pkh(i) = (ps(i)/ps(i))**RKAPPA
109 IF (thermcep) THEN
110 zdelta= rtt >= tsurf(i)
111 zcvm5 = merge(R5IES*RLSTT, R5LES*RLVTT, zdelta)
112 zcvm5 = zcvm5 / RCPD / (1. + RVTMP2*q1lay(i))
113 zx_qs= r2es * FOEEW(tsurf(i), zdelta)/ps(i)
114 zx_qs=MIN(0.5, zx_qs)
115 zcor=1./(1.-retv*zx_qs)
116 zx_qs=zx_qs*zcor
117 zx_dq_s_dh = FOEDE(tsurf(i), zdelta, zcvm5, zx_qs, zcor) /RLVTT &
118 / zx_pkh(i)
119 ELSE
120 IF (tsurf(i) < t_coup) THEN
121 zx_qs = qsats(tsurf(i)) / ps(i)
122 zx_dq_s_dh = dqsats(tsurf(i), zx_qs)/RLVTT / zx_pkh(i)
123 ELSE
124 zx_qs = qsatl(tsurf(i)) / ps(i)
125 zx_dq_s_dh = dqsatl(tsurf(i), zx_qs)/RLVTT / zx_pkh(i)
126 ENDIF
127 ENDIF
128 zx_dq_s_dt(i) = RCPD * zx_pkh(i) * zx_dq_s_dh
129 zx_qsat(i) = zx_qs
130 zx_coef(i) = coef1lay(i) * (1. + SQRT(u1lay(i)**2 + v1lay(i)**2)) &
131 * p1lay(i) / (RD * t1lay(i))
132 ENDDO
133
134 ! Calcul de la temperature de surface
135
136 ! zx_sl = chaleur latente d'evaporation ou de sublimation
137
138 do i = 1, knon
139 zx_sl(i) = RLVTT
140 if (tsurf(i) < RTT) zx_sl(i) = RLSTT
141 zx_k1(i) = zx_coef(i)
142 enddo
143
144 do i = 1, knon
145 ! Q
146 zx_oq(i) = 1. - (beta(i) * zx_k1(i) * peqBcoef(i) * dtime)
147 zx_mq(i) = beta(i) * zx_k1(i) * (peqAcoef(i) - zx_qsat(i) &
148 + zx_dq_s_dt(i) * tsurf(i)) / zx_oq(i)
149 zx_nq(i) = beta(i) * zx_k1(i) * (-1. * zx_dq_s_dt(i)) / zx_oq(i)
150
151 ! H
152 zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime)
153 zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i)
154 zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
155 enddo
156
157 WHERE (precip_snow > 0.) snow = snow + precip_snow * dtime
158
159 WHERE (evap > 0.)
160 snow_evap = MIN(snow / dtime, evap)
161 snow = snow - snow_evap * dtime
162 snow = MAX(0., snow)
163 elsewhere
164 snow_evap = 0.
165 end where
166
167 bil_eau_s = precip_rain * dtime - (evap(:knon) - snow_evap(:knon)) * dtime
168
169 ! Y'a-t-il fonte de neige?
170
171 ffonte=0.
172 do i = 1, knon
173 if ((snow(i) > epsfra .OR. nisurf == is_sic &
174 .OR. nisurf == is_lic) .AND. tsurf_new(i) >= RTT) then
175 fq_fonte = MIN(MAX((tsurf_new(i)-RTT)/chasno, 0.), snow(i))
176 ffonte(i) = fq_fonte * RLMLT/dtime
177 snow(i) = max(0., snow(i) - fq_fonte)
178 bil_eau_s(i) = bil_eau_s(i) + fq_fonte
179 tsurf_new(i) = tsurf_new(i) - fq_fonte * chasno
180 !IM cf JLD/ GKtest fonte aussi pour la glace
181 IF (nisurf == is_sic .OR. nisurf == is_lic) THEN
182 fq_fonte = MAX((tsurf_new(i)-RTT)/chaice, 0.)
183 ffonte(i) = ffonte(i) + fq_fonte * RLMLT/dtime
184 bil_eau_s(i) = bil_eau_s(i) + fq_fonte
185 tsurf_new(i) = RTT
186 ENDIF
187 d_ts(i) = tsurf_new(i) - tsurf(i)
188 endif
189
190 ! S'il y a une hauteur trop importante de neige, elle s'écoule
191 fqcalving(i) = max(0., snow(i) - snow_max)/dtime
192 snow(i)=min(snow(i), snow_max)
193
194 IF (nisurf == is_ter) then
195 qsol(i) = qsol(i) + bil_eau_s(i)
196 run_off(i) = run_off(i) + MAX(qsol(i) - max_eau_sol, 0.)
197 qsol(i) = MIN(qsol(i), max_eau_sol)
198 else if (nisurf == is_lic) then
199 run_off_lic(i) = (coeff_rel * fqcalving(i)) + &
200 (1. - coeff_rel) * run_off_lic_0(i)
201 run_off_lic_0(i) = run_off_lic(i)
202 run_off_lic(i) = run_off_lic(i) + bil_eau_s(i)/dtime
203 endif
204 enddo
205
206 END SUBROUTINE fonte_neige
207
208 end module fonte_neige_m

  ViewVC Help
Powered by ViewVC 1.1.21