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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 215 - (hide annotations)
Tue Mar 28 12:46:28 2017 UTC (7 years, 2 months ago) by guez
Original Path: trunk/Sources/phylmd/Interface_surf/fonte_neige.f
File size: 4244 byte(s)
size(snow) is now knon in interfsurf_hq.

Renamed snow to fsnow in clmain, same name as corresponding actual
argument. We can then rename ysnow to simply snow in clmain, same name
as corresponding dummy argument of clqh. No need to initialize local
snow to 0 since it is only used with indices 1:knon and already
initialized from fsnow for each type of surface. If there is no point
for a given type of surface, fsnow should be reset to 0 for this
type. We need to give a valid value to fsnow in this case even if it
will be multiplied by pctsrf = 0 in physiq.

In physiq, no need for intermediate zxsnow for output.

Removed unused arguments tsurf, p1lay, beta, coef1lay, ps, t1lay,
q1lay, u1lay, v1lay, petAcoef, peqAcoef, petBcoef, peqBcoef of
fonte_neige, with unused computations of zx_qs and zcor. (Same was
done in LMDZ.)

1 guez 54 module fonte_neige_m
2    
3     implicit none
4    
5     contains
6    
7 guez 215 SUBROUTINE fonte_neige(nisurf, dtime, precip_rain, precip_snow, snow, qsol, &
8     tsurf_new, evap, fqcalving, ffonte, run_off_lic_0)
9 guez 54
10     ! Routine de traitement de la fonte de la neige dans le cas du traitement
11 guez 178 ! de sol simplifi\'e
12 guez 54
13 guez 202 ! Laurent Fairhead, March, 2001
14 guez 101
15 guez 207 USE fcttre, ONLY: foeew, qsatl, qsats
16 guez 101 USE indicesol, ONLY: epsfra, is_lic, is_sic, is_ter
17 guez 202 USE interface_surf, ONLY: run_off_lic, tau_calv
18 guez 104 use nr_util, only: assert_eq
19 guez 215 USE suphec_m, ONLY: rday, rlmlt, rtt
20 guez 101
21 guez 178 integer, intent(IN):: nisurf ! surface \`a traiter
22 guez 101 real, intent(IN):: dtime ! pas de temps de la physique (en s)
23    
24     real, intent(IN):: precip_rain(:) ! (knon)
25 guez 206 ! precipitation, liquid water mass flux (kg / m2 / s), positive down
26 guez 101
27 guez 104 real, intent(IN):: precip_snow(:) ! (knon)
28 guez 206 ! precipitation, solid water mass flux (kg / m2 / s), positive down
29 guez 101
30 guez 104 real, intent(INOUT):: snow(:) ! (knon)
31     ! column-density of mass of snow, in kg m-2
32 guez 101
33     real, intent(INOUT):: qsol(:) ! (knon)
34     ! column-density of water in soil, in kg m-2
35    
36 guez 207 real, intent(INOUT):: tsurf_new(:) ! (knon) temp\'erature au sol
37 guez 104 real, intent(IN):: evap(:) ! (knon)
38    
39 guez 202 real, intent(OUT):: fqcalving(:) ! (knon)
40     ! flux d'eau "perdue" par la surface et n\'ecessaire pour limiter la
41 guez 206 ! hauteur de neige, en kg / m2 / s
42 guez 54
43 guez 104 real, intent(OUT):: ffonte(:) ! (knon)
44 guez 202 ! flux thermique utilis\'é pour fondre la neige
45 guez 101
46 guez 202 real, intent(INOUT):: run_off_lic_0(:) ! (knon)
47     ! run off glacier du pas de temps pr\'ecedent
48 guez 101
49     ! Local:
50    
51 guez 178 integer knon ! nombre de points \`a traiter
52 guez 101 real, parameter:: snow_max=3000.
53 guez 206 ! Masse maximum de neige (kg / m2). Au dessus de ce seuil, la neige
54 guez 215 ! en exces "s'\'ecoule" (calving).
55 guez 54
56 guez 101 integer i
57     real fq_fonte
58 guez 215 REAL bil_eau_s(size(precip_rain)) ! (knon) in kg m-2
59     real snow_evap(size(precip_rain)) ! (knon) in kg m-2 s-1
60     REAL, parameter:: chasno = 3.334E5 / (2.3867E6 * 0.15)
61     REAL, parameter:: chaice = 3.334E5 / (2.3867E6 * 0.15)
62 guez 101 real, parameter:: max_eau_sol = 150. ! in kg m-2
63     real coeff_rel
64 guez 54
65 guez 101 !--------------------------------------------------------------------
66 guez 54
67 guez 215 knon = assert_eq((/size(precip_rain), size(precip_snow), size(snow), &
68     size(qsol), size(tsurf_new), size(evap), size(fqcalving), &
69     size(ffonte), size(run_off_lic_0)/), "fonte_neige knon")
70 guez 104
71 guez 206 coeff_rel = dtime / (tau_calv * rday)
72 guez 101 WHERE (precip_snow > 0.) snow = snow + precip_snow * dtime
73    
74     WHERE (evap > 0.)
75 guez 104 snow_evap = MIN(snow / dtime, evap)
76 guez 54 snow = snow - snow_evap * dtime
77 guez 101 snow = MAX(0., snow)
78     elsewhere
79     snow_evap = 0.
80 guez 54 end where
81    
82 guez 215 bil_eau_s = precip_rain * dtime - (evap - snow_evap) * dtime
83 guez 54
84 guez 202 ! Y a-t-il fonte de neige ?
85 guez 54
86     do i = 1, knon
87 guez 101 if ((snow(i) > epsfra .OR. nisurf == is_sic &
88     .OR. nisurf == is_lic) .AND. tsurf_new(i) >= RTT) then
89 guez 207 fq_fonte = MIN(MAX((tsurf_new(i) - RTT) / chasno, 0.), snow(i))
90 guez 206 ffonte(i) = fq_fonte * RLMLT / dtime
91 guez 54 snow(i) = max(0., snow(i) - fq_fonte)
92     bil_eau_s(i) = bil_eau_s(i) + fq_fonte
93     tsurf_new(i) = tsurf_new(i) - fq_fonte * chasno
94 guez 215
95     !IM cf. JLD/ GKtest fonte aussi pour la glace
96 guez 101 IF (nisurf == is_sic .OR. nisurf == is_lic) THEN
97 guez 207 fq_fonte = MAX((tsurf_new(i) - RTT) / chaice, 0.)
98 guez 206 ffonte(i) = ffonte(i) + fq_fonte * RLMLT / dtime
99 guez 54 bil_eau_s(i) = bil_eau_s(i) + fq_fonte
100     tsurf_new(i) = RTT
101     ENDIF
102 guez 215 else
103     ffonte(i) = 0.
104 guez 54 endif
105    
106 guez 178 ! S'il y a une hauteur trop importante de neige, elle s'\'ecoule
107 guez 206 fqcalving(i) = max(0., snow(i) - snow_max) / dtime
108 guez 215 snow(i) = min(snow(i), snow_max)
109 guez 54
110     IF (nisurf == is_ter) then
111     qsol(i) = qsol(i) + bil_eau_s(i)
112     qsol(i) = MIN(qsol(i), max_eau_sol)
113     else if (nisurf == is_lic) then
114     run_off_lic(i) = (coeff_rel * fqcalving(i)) + &
115     (1. - coeff_rel) * run_off_lic_0(i)
116     run_off_lic_0(i) = run_off_lic(i)
117 guez 206 run_off_lic(i) = run_off_lic(i) + bil_eau_s(i) / dtime
118 guez 54 endif
119     enddo
120    
121     END SUBROUTINE fonte_neige
122    
123     end module fonte_neige_m

  ViewVC Help
Powered by ViewVC 1.1.21