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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21