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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 217 - (hide annotations)
Thu Mar 30 14:25:18 2017 UTC (7 years, 2 months ago) by guez
Original Path: trunk/Sources/phylmd/Interface_surf/fonte_neige.f
File size: 4414 byte(s)
run_off_lic downgraded from variable of module interface_surf to local
variable of fonte_neige.

Code could not work with ok_aie set to true, so removed this
possibility. tauae, piz_ae, cg_ae, topswai, solswai were then
0. cldtaupi was the same as cldtaupd.

In sw and procedures called by sw, flag_aer did not need to be double
precision, changed it to logical.

Downgraded re and fl from arguments of newmicro to local
variables. Added output of re and fl (following LMDZ).

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

  ViewVC Help
Powered by ViewVC 1.1.21