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

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

  ViewVC Help
Powered by ViewVC 1.1.21