/[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 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
File size: 6191 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 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\'e
14
15 ! LF 03/2001
16
17 USE fcttre, ONLY: 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, rday, retv, rlmlt, rlstt, rlvtt, rtt
22 USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2
23
24 integer, intent(IN):: nisurf ! surface \`a 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\'ecedent
70
71 ! Local:
72
73 integer knon ! nombre de points \`a 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 logical zdelta
80 real zcvm5, zx_qs, zcor
81 real fq_fonte
82 REAL bil_eau_s(size(ps)) ! in kg m-2
83 real snow_evap(size(ps)) ! in kg m-2 s-1
84 real, parameter:: t_grnd = 271.35, t_coup = 273.15
85 REAL, parameter:: chasno = 3.334E5/(2.3867E6*0.15)
86 REAL, parameter:: chaice = 3.334E5/(2.3867E6*0.15)
87 real, parameter:: max_eau_sol = 150. ! in kg m-2
88 real coeff_rel
89
90 !--------------------------------------------------------------------
91
92 knon = assert_eq((/size(tsurf), size(p1lay), size(beta), size(coef1lay), &
93 size(ps), size(precip_rain), size(precip_snow), size(snow), &
94 size(qsol), size(t1lay), size(q1lay), size(u1lay), size(v1lay), &
95 size(petAcoef), size(peqAcoef), size(petBcoef), size(peqBcoef), &
96 size(tsurf_new), size(evap), size(fqcalving), size(ffonte), &
97 size(run_off_lic_0)/), "fonte_neige knon")
98
99 ! Initialisations
100 coeff_rel = dtime/(tau_calv * rday)
101 bil_eau_s = 0.
102 DO i = 1, knon
103 IF (thermcep) THEN
104 zdelta= rtt >= tsurf(i)
105 zcvm5 = merge(R5IES*RLSTT, R5LES*RLVTT, zdelta)
106 zcvm5 = zcvm5 / RCPD / (1. + RVTMP2*q1lay(i))
107 zx_qs= r2es * FOEEW(tsurf(i), zdelta)/ps(i)
108 zx_qs=MIN(0.5, zx_qs)
109 zcor=1./(1.-retv*zx_qs)
110 zx_qs=zx_qs*zcor
111 ELSE
112 IF (tsurf(i) < t_coup) THEN
113 zx_qs = qsats(tsurf(i)) / ps(i)
114 ELSE
115 zx_qs = qsatl(tsurf(i)) / ps(i)
116 ENDIF
117 ENDIF
118 ENDDO
119
120 ! Calcul de la temperature de surface
121
122 WHERE (precip_snow > 0.) snow = snow + precip_snow * dtime
123
124 WHERE (evap > 0.)
125 snow_evap = MIN(snow / dtime, evap)
126 snow = snow - snow_evap * dtime
127 snow = MAX(0., snow)
128 elsewhere
129 snow_evap = 0.
130 end where
131
132 bil_eau_s = precip_rain * dtime - (evap(:knon) - snow_evap(:knon)) * dtime
133
134 ! Y'a-t-il fonte de neige?
135
136 ffonte=0.
137 do i = 1, knon
138 if ((snow(i) > epsfra .OR. nisurf == is_sic &
139 .OR. nisurf == is_lic) .AND. tsurf_new(i) >= RTT) then
140 fq_fonte = MIN(MAX((tsurf_new(i)-RTT)/chasno, 0.), snow(i))
141 ffonte(i) = fq_fonte * RLMLT/dtime
142 snow(i) = max(0., snow(i) - fq_fonte)
143 bil_eau_s(i) = bil_eau_s(i) + fq_fonte
144 tsurf_new(i) = tsurf_new(i) - fq_fonte * chasno
145 !IM cf JLD/ GKtest fonte aussi pour la glace
146 IF (nisurf == is_sic .OR. nisurf == is_lic) THEN
147 fq_fonte = MAX((tsurf_new(i)-RTT)/chaice, 0.)
148 ffonte(i) = ffonte(i) + fq_fonte * RLMLT/dtime
149 bil_eau_s(i) = bil_eau_s(i) + fq_fonte
150 tsurf_new(i) = RTT
151 ENDIF
152 endif
153
154 ! S'il y a une hauteur trop importante de neige, elle s'\'ecoule
155 fqcalving(i) = max(0., snow(i) - snow_max)/dtime
156 snow(i)=min(snow(i), snow_max)
157
158 IF (nisurf == is_ter) then
159 qsol(i) = qsol(i) + bil_eau_s(i)
160 run_off(i) = run_off(i) + MAX(qsol(i) - max_eau_sol, 0.)
161 qsol(i) = MIN(qsol(i), max_eau_sol)
162 else if (nisurf == is_lic) then
163 run_off_lic(i) = (coeff_rel * fqcalving(i)) + &
164 (1. - coeff_rel) * run_off_lic_0(i)
165 run_off_lic_0(i) = run_off_lic(i)
166 run_off_lic(i) = run_off_lic(i) + bil_eau_s(i)/dtime
167 endif
168 enddo
169
170 END SUBROUTINE fonte_neige
171
172 end module fonte_neige_m

  ViewVC Help
Powered by ViewVC 1.1.21