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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (hide annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 2 months ago) by guez
File size: 6191 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

1 guez 54 module fonte_neige_m
2    
3     implicit none
4    
5     contains
6    
7 guez 104 SUBROUTINE fonte_neige(nisurf, dtime, tsurf, p1lay, beta, coef1lay, ps, &
8     precip_rain, precip_snow, snow, qsol, t1lay, q1lay, u1lay, v1lay, &
9     petAcoef, peqAcoef, petBcoef, peqBcoef, tsurf_new, evap, fqcalving, &
10     ffonte, run_off_lic_0)
11 guez 54
12     ! Routine de traitement de la fonte de la neige dans le cas du traitement
13 guez 178 ! de sol simplifi\'e
14 guez 54
15     ! LF 03/2001
16 guez 101
17 guez 178 USE fcttre, ONLY: foeew, qsatl, qsats, thermcep
18 guez 101 USE indicesol, ONLY: epsfra, is_lic, is_sic, is_ter
19     USE interface_surf, ONLY: run_off, run_off_lic, tau_calv
20 guez 104 use nr_util, only: assert_eq
21 guez 178 USE suphec_m, ONLY: rcpd, rday, retv, rlmlt, rlstt, rlvtt, rtt
22 guez 101 USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2
23    
24 guez 178 integer, intent(IN):: nisurf ! surface \`a traiter
25 guez 101 real, intent(IN):: dtime ! pas de temps de la physique (en s)
26 guez 104 real, dimension(:), intent(IN):: tsurf, p1lay, beta, coef1lay ! (knon)
27 guez 54 ! tsurf temperature de surface
28     ! p1lay pression 1er niveau (milieu de couche)
29     ! beta evap reelle
30     ! coef1lay coefficient d'echange
31 guez 104 real, dimension(:), intent(IN):: ps ! (knon)
32 guez 54 ! ps pression au sol
33 guez 101
34     real, intent(IN):: precip_rain(:) ! (knon)
35     ! precipitation, liquid water mass flux (kg/m2/s), positive down
36    
37 guez 104 real, intent(IN):: precip_snow(:) ! (knon)
38 guez 101 ! precipitation, solid water mass flux (kg/m2/s), positive down
39    
40 guez 104 real, intent(INOUT):: snow(:) ! (knon)
41     ! column-density of mass of snow, in kg m-2
42 guez 101
43     real, intent(INOUT):: qsol(:) ! (knon)
44     ! column-density of water in soil, in kg m-2
45    
46 guez 104 real, dimension(:), intent(IN):: t1lay ! (knon)
47     real, dimension(:), intent(IN):: q1lay ! (knon)
48     real, dimension(:), intent(IN):: u1lay, v1lay ! (knon)
49     real, dimension(:), intent(IN):: petAcoef, peqAcoef ! (knon)
50 guez 54 ! petAcoef coeff. A de la resolution de la CL pour t
51     ! peqAcoef coeff. A de la resolution de la CL pour q
52 guez 104 real, dimension(:), intent(IN):: petBcoef, peqBcoef ! (knon)
53 guez 54 ! petBcoef coeff. B de la resolution de la CL pour t
54     ! peqBcoef coeff. B de la resolution de la CL pour q
55    
56 guez 104 real, intent(INOUT):: tsurf_new(:)
57 guez 54 ! tsurf_new temperature au sol
58    
59 guez 104 real, intent(IN):: evap(:) ! (knon)
60    
61 guez 101 ! Flux d'eau "perdue" par la surface et necessaire pour que limiter la
62     ! hauteur de neige, en kg/m2/s
63 guez 104 real, intent(OUT):: fqcalving(:) ! (knon)
64 guez 54
65     ! Flux thermique utiliser pour fondre la neige
66 guez 104 real, intent(OUT):: ffonte(:) ! (knon)
67 guez 101
68 guez 104 real, dimension(:), intent(INOUT):: run_off_lic_0 ! (knon)
69 guez 178 ! run_off_lic_0 run off glacier du pas de temps pr\'ecedent
70 guez 101
71     ! Local:
72    
73 guez 178 integer knon ! nombre de points \`a traiter
74 guez 101 real, parameter:: snow_max=3000.
75 guez 54 ! Masse maximum de neige (kg/m2). Au dessus de ce seuil, la neige
76     ! en exces "s'ecoule" (calving)
77    
78 guez 101 integer i
79 guez 103 logical zdelta
80 guez 178 real zcvm5, zx_qs, zcor
81 guez 101 real fq_fonte
82 guez 104 REAL bil_eau_s(size(ps)) ! in kg m-2
83     real snow_evap(size(ps)) ! in kg m-2 s-1
84 guez 101 real, parameter:: t_grnd = 271.35, t_coup = 273.15
85     REAL, parameter:: chasno = 3.334E5/(2.3867E6*0.15)
86     REAL, parameter:: chaice = 3.334E5/(2.3867E6*0.15)
87     real, parameter:: max_eau_sol = 150. ! in kg m-2
88     real coeff_rel
89 guez 54
90 guez 101 !--------------------------------------------------------------------
91 guez 54
92 guez 104 knon = assert_eq((/size(tsurf), size(p1lay), size(beta), size(coef1lay), &
93     size(ps), size(precip_rain), size(precip_snow), size(snow), &
94     size(qsol), size(t1lay), size(q1lay), size(u1lay), size(v1lay), &
95     size(petAcoef), size(peqAcoef), size(petBcoef), size(peqBcoef), &
96     size(tsurf_new), size(evap), size(fqcalving), size(ffonte), &
97     size(run_off_lic_0)/), "fonte_neige knon")
98    
99 guez 54 ! Initialisations
100     coeff_rel = dtime/(tau_calv * rday)
101     bil_eau_s = 0.
102     DO i = 1, knon
103     IF (thermcep) THEN
104 guez 103 zdelta= rtt >= tsurf(i)
105     zcvm5 = merge(R5IES*RLSTT, R5LES*RLVTT, zdelta)
106 guez 101 zcvm5 = zcvm5 / RCPD / (1. + RVTMP2*q1lay(i))
107 guez 54 zx_qs= r2es * FOEEW(tsurf(i), zdelta)/ps(i)
108     zx_qs=MIN(0.5, zx_qs)
109     zcor=1./(1.-retv*zx_qs)
110     zx_qs=zx_qs*zcor
111     ELSE
112 guez 101 IF (tsurf(i) < t_coup) THEN
113 guez 54 zx_qs = qsats(tsurf(i)) / ps(i)
114     ELSE
115     zx_qs = qsatl(tsurf(i)) / ps(i)
116     ENDIF
117     ENDIF
118     ENDDO
119    
120 guez 101 ! Calcul de la temperature de surface
121 guez 54
122 guez 101 WHERE (precip_snow > 0.) snow = snow + precip_snow * dtime
123    
124     WHERE (evap > 0.)
125 guez 104 snow_evap = MIN(snow / dtime, evap)
126 guez 54 snow = snow - snow_evap * dtime
127 guez 101 snow = MAX(0., snow)
128     elsewhere
129     snow_evap = 0.
130 guez 54 end where
131    
132 guez 101 bil_eau_s = precip_rain * dtime - (evap(:knon) - snow_evap(:knon)) * dtime
133 guez 54
134     ! Y'a-t-il fonte de neige?
135    
136     ffonte=0.
137     do i = 1, knon
138 guez 101 if ((snow(i) > epsfra .OR. nisurf == is_sic &
139     .OR. nisurf == is_lic) .AND. tsurf_new(i) >= RTT) then
140     fq_fonte = MIN(MAX((tsurf_new(i)-RTT)/chasno, 0.), snow(i))
141 guez 54 ffonte(i) = fq_fonte * RLMLT/dtime
142     snow(i) = max(0., snow(i) - fq_fonte)
143     bil_eau_s(i) = bil_eau_s(i) + fq_fonte
144     tsurf_new(i) = tsurf_new(i) - fq_fonte * chasno
145     !IM cf JLD/ GKtest fonte aussi pour la glace
146 guez 101 IF (nisurf == is_sic .OR. nisurf == is_lic) THEN
147     fq_fonte = MAX((tsurf_new(i)-RTT)/chaice, 0.)
148 guez 54 ffonte(i) = ffonte(i) + fq_fonte * RLMLT/dtime
149     bil_eau_s(i) = bil_eau_s(i) + fq_fonte
150     tsurf_new(i) = RTT
151     ENDIF
152     endif
153    
154 guez 178 ! S'il y a une hauteur trop importante de neige, elle s'\'ecoule
155 guez 54 fqcalving(i) = max(0., snow(i) - snow_max)/dtime
156     snow(i)=min(snow(i), snow_max)
157    
158     IF (nisurf == is_ter) then
159     qsol(i) = qsol(i) + bil_eau_s(i)
160 guez 101 run_off(i) = run_off(i) + MAX(qsol(i) - max_eau_sol, 0.)
161 guez 54 qsol(i) = MIN(qsol(i), max_eau_sol)
162     else if (nisurf == is_lic) then
163     run_off_lic(i) = (coeff_rel * fqcalving(i)) + &
164     (1. - coeff_rel) * run_off_lic_0(i)
165     run_off_lic_0(i) = run_off_lic(i)
166     run_off_lic(i) = run_off_lic(i) + bil_eau_s(i)/dtime
167     endif
168     enddo
169    
170     END SUBROUTINE fonte_neige
171    
172     end module fonte_neige_m

  ViewVC Help
Powered by ViewVC 1.1.21