/[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 328 - (hide annotations)
Thu Jun 13 14:40:06 2019 UTC (5 years ago) by guez
File size: 4170 byte(s)
Change all `.f` suffixes to `.f90`. (The opposite was done in revision
82.)  Because of change of philosopy in GNUmakefile: we already had a
rewritten rule for `.f`, so it does not make the makefile longer to
replace it by a rule for `.f90`. And it spares us options of
makedepf90 and of the compiler. Also we prepare the way for a simpler
`CMakeLists.txt`.

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 311 ! 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 311 if ((snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
92     .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