/[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 103 - (hide annotations)
Fri Aug 29 13:00:05 2014 UTC (9 years, 8 months ago) by guez
Original Path: trunk/phylmd/Interface_surf/fonte_neige.f
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 guez 54 module fonte_neige_m
2    
3     implicit none
4    
5     contains
6    
7 guez 101 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 guez 54 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 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     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 guez 54 ! tsurf temperature de surface
29     ! p1lay pression 1er niveau (milieu de couche)
30     ! beta evap reelle
31     ! coef1lay coefficient d'echange
32 guez 101 real, dimension(klon), intent(IN):: ps
33 guez 54 ! ps pression au sol
34 guez 101
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 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 101 real, dimension(klon), intent(IN):: petBcoef, peqBcoef
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 101 real, intent(INOUT):: tsurf_new(klon), evap(klon)
57 guez 54 ! tsurf_new temperature au sol
58    
59 guez 101 ! 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 guez 54
63     ! Flux thermique utiliser pour fondre la neige
64     real, dimension(klon), intent(INOUT):: ffonte
65 guez 101
66 guez 54 real, dimension(klon), intent(INOUT):: run_off_lic_0
67 guez 101 ! run_off_lic_0 run off glacier du pas de temps précedent
68    
69     ! Local:
70    
71     real, parameter:: snow_max=3000.
72 guez 54 ! Masse maximum de neige (kg/m2). Au dessus de ce seuil, la neige
73     ! en exces "s'ecoule" (calving)
74    
75 guez 101 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 guez 103 logical zdelta
82     real zcvm5, zx_qs, zcor, zx_dq_s_dh
83 guez 101 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 guez 54
92 guez 101 !--------------------------------------------------------------------
93 guez 54
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 guez 103 zdelta= rtt >= tsurf(i)
101     zcvm5 = merge(R5IES*RLSTT, R5LES*RLVTT, zdelta)
102 guez 101 zcvm5 = zcvm5 / RCPD / (1. + RVTMP2*q1lay(i))
103 guez 54 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 guez 101 zx_dq_s_dh = FOEDE(tsurf(i), zdelta, zcvm5, zx_qs, zcor) /RLVTT &
108     / zx_pkh(i)
109 guez 54 ELSE
110 guez 101 IF (tsurf(i) < t_coup) THEN
111 guez 54 zx_qs = qsats(tsurf(i)) / ps(i)
112 guez 101 zx_dq_s_dh = dqsats(tsurf(i), zx_qs)/RLVTT / zx_pkh(i)
113 guez 54 ELSE
114     zx_qs = qsatl(tsurf(i)) / ps(i)
115 guez 101 zx_dq_s_dh = dqsatl(tsurf(i), zx_qs)/RLVTT / zx_pkh(i)
116 guez 54 ENDIF
117     ENDIF
118     zx_dq_s_dt(i) = RCPD * zx_pkh(i) * zx_dq_s_dh
119     zx_qsat(i) = zx_qs
120 guez 101 zx_coef(i) = coef1lay(i) * (1. + SQRT(u1lay(i)**2 + v1lay(i)**2)) &
121     * p1lay(i) / (RD * t1lay(i))
122 guez 54 ENDDO
123    
124 guez 101 ! Calcul de la temperature de surface
125 guez 54
126     ! zx_sl = chaleur latente d'evaporation ou de sublimation
127    
128     do i = 1, knon
129     zx_sl(i) = RLVTT
130 guez 101 if (tsurf(i) < RTT) zx_sl(i) = RLSTT
131 guez 54 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 guez 101 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 guez 54
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 guez 101 WHERE (precip_snow > 0.) snow = snow + precip_snow * dtime
148    
149     WHERE (evap > 0.)
150 guez 54 snow_evap = MIN (snow / dtime, evap)
151     snow = snow - snow_evap * dtime
152 guez 101 snow = MAX(0., snow)
153     elsewhere
154     snow_evap = 0.
155 guez 54 end where
156    
157 guez 101 bil_eau_s = precip_rain * dtime - (evap(:knon) - snow_evap(:knon)) * dtime
158 guez 54
159     ! Y'a-t-il fonte de neige?
160    
161     ffonte=0.
162     do i = 1, knon
163 guez 101 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 guez 54 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 guez 101 IF (nisurf == is_sic .OR. nisurf == is_lic) THEN
172     fq_fonte = MAX((tsurf_new(i)-RTT)/chaice, 0.)
173 guez 54 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 guez 101 ! S'il y a une hauteur trop importante de neige, elle s'écoule
181 guez 54 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 guez 101 run_off(i) = run_off(i) + MAX(qsol(i) - max_eau_sol, 0.)
187 guez 54 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