/[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 221 - (hide annotations)
Thu Apr 20 14:44:47 2017 UTC (7 years, 1 month ago) by guez
Original Path: trunk/Sources/phylmd/Interface_surf/fonte_neige.f
File size: 4372 byte(s)
clcdrag is no longer used in LMDZ. Replaced by cdrag in LMDZ. In cdrag
in LMDZ, zxli is a symbolic constant, false. So removed case zxli true
in LMDZE.

read_sst is called zero (if no ocean point on the whole planet) time or
once per call of physiq. If mod(itap - 1, lmt_pas) == 0 then we have
advanced in time of lmt_pas and deja_lu is necessarily false.

qsat[sl] and dqsat[sl] were never called.

Added output of qsurf in histins, following LMDZ.

Last dummy argument dtime of phystokenc is always the same as first
dummy argument pdtphys, removed dtime.

Removed make rules for nag_xref95, since it does not exist any longer.

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