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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 305 - (show annotations)
Tue Sep 11 11:08:38 2018 UTC (5 years, 9 months ago) by guez
File size: 4169 byte(s)
We want to keep the same variable names throughout procedures. In
pbl_surface, rain_fall and snow_fall were passed to clqh and became
precip_rain and precip_snow. Which name should we choose?
Precipitation normally refers to water in all phases. Rainfall and
snowfall seem to be more common names to distinguish liquid water and
snow. Cf. CF standard names. So change everywhere precip_rain to
rain_fall and precip_snow to snow_fall.

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

  ViewVC Help
Powered by ViewVC 1.1.21