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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 104 - (hide 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 guez 54 module fonte_neige_m
2    
3     implicit none
4    
5     contains
6    
7 guez 104 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 guez 54
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 guez 101
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 guez 104 use nr_util, only: assert_eq
21 guez 101 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 guez 104 real, dimension(:), intent(IN):: tsurf, p1lay, beta, coef1lay ! (knon)
27 guez 54 ! tsurf temperature de surface
28     ! p1lay pression 1er niveau (milieu de couche)
29     ! beta evap reelle
30     ! coef1lay coefficient d'echange
31 guez 104 real, dimension(:), intent(IN):: ps ! (knon)
32 guez 54 ! ps pression au sol
33 guez 101
34     real, intent(IN):: precip_rain(:) ! (knon)
35     ! precipitation, liquid water mass flux (kg/m2/s), positive down
36    
37 guez 104 real, intent(IN):: precip_snow(:) ! (knon)
38 guez 101 ! precipitation, solid water mass flux (kg/m2/s), positive down
39    
40 guez 104 real, intent(INOUT):: snow(:) ! (knon)
41     ! column-density of mass of snow, in kg m-2
42 guez 101
43     real, intent(INOUT):: qsol(:) ! (knon)
44     ! column-density of water in soil, in kg m-2
45    
46 guez 104 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 guez 54 ! petAcoef coeff. A de la resolution de la CL pour t
51     ! peqAcoef coeff. A de la resolution de la CL pour q
52 guez 104 real, dimension(:), intent(IN):: petBcoef, peqBcoef ! (knon)
53 guez 54 ! 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 guez 104 real, intent(INOUT):: tsurf_new(:)
57 guez 54 ! tsurf_new temperature au sol
58    
59 guez 104 real, intent(IN):: evap(:) ! (knon)
60    
61 guez 101 ! Flux d'eau "perdue" par la surface et necessaire pour que limiter la
62     ! hauteur de neige, en kg/m2/s
63 guez 104 real, intent(OUT):: fqcalving(:) ! (knon)
64 guez 54
65     ! Flux thermique utiliser pour fondre la neige
66 guez 104 real, intent(OUT):: ffonte(:) ! (knon)
67 guez 101
68 guez 104 real, dimension(:), intent(INOUT):: run_off_lic_0 ! (knon)
69 guez 101 ! run_off_lic_0 run off glacier du pas de temps précedent
70    
71     ! Local:
72    
73 guez 104 integer knon ! nombre de points à traiter
74 guez 101 real, parameter:: snow_max=3000.
75 guez 54 ! Masse maximum de neige (kg/m2). Au dessus de ce seuil, la neige
76     ! en exces "s'ecoule" (calving)
77    
78 guez 101 integer i
79 guez 104 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 guez 103 logical zdelta
85     real zcvm5, zx_qs, zcor, zx_dq_s_dh
86 guez 101 real fq_fonte
87 guez 104 REAL bil_eau_s(size(ps)) ! in kg m-2
88     real snow_evap(size(ps)) ! in kg m-2 s-1
89 guez 101 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 guez 54
95 guez 101 !--------------------------------------------------------------------
96 guez 54
97 guez 104 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 guez 54 ! 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 guez 103 zdelta= rtt >= tsurf(i)
111     zcvm5 = merge(R5IES*RLSTT, R5LES*RLVTT, zdelta)
112 guez 101 zcvm5 = zcvm5 / RCPD / (1. + RVTMP2*q1lay(i))
113 guez 54 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 guez 101 zx_dq_s_dh = FOEDE(tsurf(i), zdelta, zcvm5, zx_qs, zcor) /RLVTT &
118     / zx_pkh(i)
119 guez 54 ELSE
120 guez 101 IF (tsurf(i) < t_coup) THEN
121 guez 54 zx_qs = qsats(tsurf(i)) / ps(i)
122 guez 101 zx_dq_s_dh = dqsats(tsurf(i), zx_qs)/RLVTT / zx_pkh(i)
123 guez 54 ELSE
124     zx_qs = qsatl(tsurf(i)) / ps(i)
125 guez 101 zx_dq_s_dh = dqsatl(tsurf(i), zx_qs)/RLVTT / zx_pkh(i)
126 guez 54 ENDIF
127     ENDIF
128     zx_dq_s_dt(i) = RCPD * zx_pkh(i) * zx_dq_s_dh
129     zx_qsat(i) = zx_qs
130 guez 101 zx_coef(i) = coef1lay(i) * (1. + SQRT(u1lay(i)**2 + v1lay(i)**2)) &
131     * p1lay(i) / (RD * t1lay(i))
132 guez 54 ENDDO
133    
134 guez 101 ! Calcul de la temperature de surface
135 guez 54
136     ! zx_sl = chaleur latente d'evaporation ou de sublimation
137    
138     do i = 1, knon
139     zx_sl(i) = RLVTT
140 guez 101 if (tsurf(i) < RTT) zx_sl(i) = RLSTT
141 guez 54 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 guez 101 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 guez 54
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 guez 101 WHERE (precip_snow > 0.) snow = snow + precip_snow * dtime
158    
159     WHERE (evap > 0.)
160 guez 104 snow_evap = MIN(snow / dtime, evap)
161 guez 54 snow = snow - snow_evap * dtime
162 guez 101 snow = MAX(0., snow)
163     elsewhere
164     snow_evap = 0.
165 guez 54 end where
166    
167 guez 101 bil_eau_s = precip_rain * dtime - (evap(:knon) - snow_evap(:knon)) * dtime
168 guez 54
169     ! Y'a-t-il fonte de neige?
170    
171     ffonte=0.
172     do i = 1, knon
173 guez 101 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 guez 54 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 guez 101 IF (nisurf == is_sic .OR. nisurf == is_lic) THEN
182     fq_fonte = MAX((tsurf_new(i)-RTT)/chaice, 0.)
183 guez 54 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 guez 101 ! S'il y a une hauteur trop importante de neige, elle s'écoule
191 guez 54 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 guez 101 run_off(i) = run_off(i) + MAX(qsol(i) - max_eau_sol, 0.)
197 guez 54 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