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

Contents of /trunk/Sources/phylmd/Interface_surf/fonte_neige.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 221 - (show annotations)
Thu Apr 20 14:44:47 2017 UTC (7 years ago) by guez
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 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 interface_surf, 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