/[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 54 - (show annotations)
Tue Dec 6 15:07:04 2011 UTC (12 years, 5 months ago) by guez
Original Path: trunk/libf/phylmd/Interface_surf/fonte_neige.f90
File size: 8091 byte(s)
Removed Numerical Recipes procedure "ran1". Replaced calls to "ran1"
in "inidissip" by calls to intrinsic procedures.

Split file "interface_surf.f90" into a file with a module containing
only variables, "interface_surf", and single-procedure files. Gathered
files into directory "Interface_surf".

Added argument "cdivu" to "gradiv" and "gradiv2", "cdivh" to
"divgrad2" and "divgrad", and "crot" to "nxgraro2" and
"nxgrarot". "dissip" now uses variables "cdivu", "cdivh" and "crot"
from module "inidissip_m", so it can pass them to "gradiv2",
etc. Thanks to this modification, we avoid a circular dependency
betwwen "inidissip.f90" and "gradiv2.f90", etc. The value -1. used by
"gradiv2", for instance, during computation of eigenvalues is not the
value "cdivu" computed by "inidissip".

Extracted procedure "start_inter_3d" from module "startdyn", to its
own module.

In "inidissip", unrolled loop on "ii". I find it clearer now.

Moved variables "matriceun", "matriceus", "matricevn", "matricevs",
"matrinvn" and "matrinvs" from module "parafilt" to module
"inifilr_m". Moved variables "jfiltnu", "jfiltnv", "jfiltsu",
"jfiltsv" from module "coefils" to module "inifilr_m".

1 module fonte_neige_m
2
3 implicit none
4
5 contains
6
7 SUBROUTINE fonte_neige( klon, knon, nisurf, dtime, &
8 tsurf, p1lay, cal, beta, coef1lay, ps, &
9 precip_rain, precip_snow, snow, qsol, &
10 radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, &
11 petAcoef, peqAcoef, petBcoef, peqBcoef, &
12 tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l, &
13 fqcalving, ffonte, run_off_lic_0)
14
15 ! Routine de traitement de la fonte de la neige dans le cas du traitement
16 ! de sol simplifié
17
18 ! LF 03/2001
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 ! qsol hauteur d'eau contenu dans le sol
32 ! runoff runoff en cas de trop plein
33 ! petAcoef coeff. A de la resolution de la CL pour t
34 ! peqAcoef coeff. A de la resolution de la CL pour q
35 ! petBcoef coeff. B de la resolution de la CL pour t
36 ! peqBcoef coeff. B de la resolution de la CL pour q
37 ! radsol rayonnement net aus sol (LW + SW)
38 ! dif_grnd coeff. diffusion vers le sol profond
39
40 ! output:
41 ! tsurf_new temperature au 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 ! in/out:
47 ! run_off_lic_0 run off glacier du pas de temps précedent
48
49
50 use indicesol
51 use SUPHEC_M
52 use yoethf_m
53 use fcttre
54 use interface_surf
55 !IM cf JLD
56
57 ! Parametres d'entree
58 integer, intent(IN) :: knon, nisurf, klon
59 real , intent(IN) :: dtime
60 real, dimension(klon), intent(IN) :: petAcoef, peqAcoef
61 real, dimension(klon), intent(IN) :: petBcoef, peqBcoef
62 real, dimension(klon), intent(IN) :: ps, q1lay
63 real, dimension(klon), intent(IN) :: tsurf, p1lay, cal, beta, coef1lay
64 real, dimension(klon), intent(IN) :: precip_rain, precip_snow
65 real, dimension(klon), intent(IN) :: radsol, dif_grnd
66 real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay
67 real, dimension(klon), intent(INOUT) :: snow, qsol
68
69 ! Parametres sorties
70 real, dimension(klon), intent(INOUT):: tsurf_new, evap, fluxsens, fluxlat
71 real, dimension(klon), intent(INOUT):: dflux_s, dflux_l
72 ! Flux thermique utiliser pour fondre la neige
73 real, dimension(klon), intent(INOUT):: ffonte
74 ! Flux d'eau "perdue" par la surface et necessaire pour que limiter la
75 ! hauteur de neige, en kg/m2/s
76 real, dimension(klon), intent(INOUT):: fqcalving
77 real, dimension(klon), intent(INOUT):: run_off_lic_0
78 ! Variables locales
79 ! Masse maximum de neige (kg/m2). Au dessus de ce seuil, la neige
80 ! en exces "s'ecoule" (calving)
81 ! real, parameter :: snow_max=1.
82 !IM cf JLD/GK
83 real, parameter :: snow_max=3000.
84 integer :: i
85 real, dimension(klon) :: zx_mh, zx_nh, zx_oh
86 real, dimension(klon) :: zx_mq, zx_nq, zx_oq
87 real, dimension(klon) :: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef
88 real, dimension(klon) :: zx_sl, zx_k1
89 real, dimension(klon) :: zx_q_0 , d_ts
90 real :: zdelta, zcvm5, zx_qs, zcor, zx_dq_s_dh
91 real :: bilan_f, fq_fonte
92 REAL :: subli, fsno
93 REAL, DIMENSION(klon) :: bil_eau_s, snow_evap
94 real, parameter :: t_grnd = 271.35, t_coup = 273.15
95 !! PB temporaire en attendant mieux pour le modele de neige
96 ! REAL, parameter :: chasno = RLMLT/(2.3867E+06*0.15)
97 REAL, parameter :: chasno = 3.334E+05/(2.3867E+06*0.15)
98 !IM cf JLD/ GKtest
99 REAL, parameter :: chaice = 3.334E+05/(2.3867E+06*0.15)
100 ! fin GKtest
101
102 logical, save :: check = .FALSE.
103 character (len = 20) :: modname = 'fonte_neige'
104 logical, save :: neige_fond = .false.
105 real, save :: max_eau_sol = 150.0
106 character (len = 80) :: abort_message
107 logical, save :: first = .true., second=.false.
108 real :: coeff_rel
109
110 if (check) write(*, *)'Entree ', modname, ' surface = ', nisurf
111
112 ! Initialisations
113 coeff_rel = dtime/(tau_calv * rday)
114 bil_eau_s = 0.
115 DO i = 1, knon
116 zx_pkh(i) = (ps(i)/ps(i))**RKAPPA
117 IF (thermcep) THEN
118 zdelta=MAX(0., SIGN(1., rtt-tsurf(i)))
119 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
120 zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q1lay(i))
121 zx_qs= r2es * FOEEW(tsurf(i), zdelta)/ps(i)
122 zx_qs=MIN(0.5, zx_qs)
123 zcor=1./(1.-retv*zx_qs)
124 zx_qs=zx_qs*zcor
125 zx_dq_s_dh = FOEDE(tsurf(i), zdelta, zcvm5, zx_qs, zcor) &
126 /RLVTT / zx_pkh(i)
127 ELSE
128 IF (tsurf(i).LT.t_coup) THEN
129 zx_qs = qsats(tsurf(i)) / ps(i)
130 zx_dq_s_dh = dqsats(tsurf(i), zx_qs)/RLVTT &
131 / zx_pkh(i)
132 ELSE
133 zx_qs = qsatl(tsurf(i)) / ps(i)
134 zx_dq_s_dh = dqsatl(tsurf(i), zx_qs)/RLVTT &
135 / zx_pkh(i)
136 ENDIF
137 ENDIF
138 zx_dq_s_dt(i) = RCPD * zx_pkh(i) * zx_dq_s_dh
139 zx_qsat(i) = zx_qs
140 zx_coef(i) = coef1lay(i) &
141 * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
142 * p1lay(i)/(RD*t1lay(i))
143 ENDDO
144
145 ! === Calcul de la temperature de surface ===
146
147 ! zx_sl = chaleur latente d'evaporation ou de sublimation
148
149 do i = 1, knon
150 zx_sl(i) = RLVTT
151 if (tsurf(i) .LT. RTT) zx_sl(i) = RLSTT
152 zx_k1(i) = zx_coef(i)
153 enddo
154
155 do i = 1, knon
156 ! Q
157 zx_oq(i) = 1. - (beta(i) * zx_k1(i) * peqBcoef(i) * dtime)
158 zx_mq(i) = beta(i) * zx_k1(i) * &
159 (peqAcoef(i) - zx_qsat(i) &
160 + zx_dq_s_dt(i) * tsurf(i)) &
161 / zx_oq(i)
162 zx_nq(i) = beta(i) * zx_k1(i) * (-1. * zx_dq_s_dt(i)) &
163 / zx_oq(i)
164
165 ! H
166 zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime)
167 zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i)
168 zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
169 enddo
170
171 WHERE (precip_snow > 0.) snow = snow + (precip_snow * dtime)
172 snow_evap = 0.
173 WHERE (evap > 0. )
174 snow_evap = MIN (snow / dtime, evap)
175 snow = snow - snow_evap * dtime
176 snow = MAX(0.0, snow)
177 end where
178
179 ! bil_eau_s = bil_eau_s + (precip_rain * dtime) - (evap - snow_evap) * dtime
180 bil_eau_s = (precip_rain * dtime) - (evap - snow_evap) * dtime
181
182
183 ! Y'a-t-il fonte de neige?
184
185 ffonte=0.
186 do i = 1, knon
187 neige_fond = ((snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
188 .AND. tsurf_new(i) >= RTT)
189 if (neige_fond) then
190 fq_fonte = MIN( MAX((tsurf_new(i)-RTT )/chasno, 0.0), snow(i))
191 ffonte(i) = fq_fonte * RLMLT/dtime
192 snow(i) = max(0., snow(i) - fq_fonte)
193 bil_eau_s(i) = bil_eau_s(i) + fq_fonte
194 tsurf_new(i) = tsurf_new(i) - fq_fonte * chasno
195 !IM cf JLD OK
196 !IM cf JLD/ GKtest fonte aussi pour la glace
197 IF (nisurf == is_sic .OR. nisurf == is_lic ) THEN
198 fq_fonte = MAX((tsurf_new(i)-RTT )/chaice, 0.0)
199 ffonte(i) = ffonte(i) + fq_fonte * RLMLT/dtime
200 bil_eau_s(i) = bil_eau_s(i) + fq_fonte
201 tsurf_new(i) = RTT
202 ENDIF
203 d_ts(i) = tsurf_new(i) - tsurf(i)
204 endif
205
206 ! s'il y a une hauteur trop importante de neige, elle s'coule
207 fqcalving(i) = max(0., snow(i) - snow_max)/dtime
208 snow(i)=min(snow(i), snow_max)
209
210 IF (nisurf == is_ter) then
211 qsol(i) = qsol(i) + bil_eau_s(i)
212 run_off(i) = run_off(i) + MAX(qsol(i) - max_eau_sol, 0.0)
213 qsol(i) = MIN(qsol(i), max_eau_sol)
214 else if (nisurf == is_lic) then
215 run_off_lic(i) = (coeff_rel * fqcalving(i)) + &
216 (1. - coeff_rel) * run_off_lic_0(i)
217 run_off_lic_0(i) = run_off_lic(i)
218 run_off_lic(i) = run_off_lic(i) + bil_eau_s(i)/dtime
219 endif
220 enddo
221
222 END SUBROUTINE fonte_neige
223
224 end module fonte_neige_m

  ViewVC Help
Powered by ViewVC 1.1.21