/[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 297 - (show annotations)
Thu Jul 26 16:02:11 2018 UTC (5 years, 10 months ago) by guez
File size: 4374 byte(s)
Rename module interface_surf to conf_interface_m.

Move the computation of pkf out of procedure climb_hq_down into clqh.

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