/[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 311 - (show annotations)
Mon Dec 3 17:52:21 2018 UTC (5 years, 5 months ago) by guez
File size: 4170 byte(s)
Move file cv_thermo.f to directory CV30_routines since it is only used
there. Rename module cv_thermo_m to cv_thermo.

Named constants instead of variables in module suphec_m.

Rename dummy argument spechum of procedure interfsurf_hq to q1lay
(same as corresponding dummy argument in calcul_fluxs).

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 .OR. nisurf == is_lic) &
92 .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