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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 103 - (hide annotations)
Fri Aug 29 13:00:05 2014 UTC (9 years, 8 months ago) by guez
File size: 7307 byte(s)
Renamed module cvparam to cv_param. Deleted procedure
cv_param. Changed variables of module cv_param into parameters.

In procedures cv_driver, cv_uncompress and cv3_uncompress, removed
some arguments giving dimensions and used module variables klon and
klev instead.

In procedures gradiv2, laplacien_gam and laplacien, changed
declarations of local variables because klevel is not always klev.

Removed code for nudging surface pressure.

Removed arguments pim and pjm of tau2alpha. Added assignment of false
to variable first.

Replaced real argument del of procedures foeew and FOEDE by logical
argument.

1 guez 54 module calcul_fluxs_m
2    
3     implicit none
4    
5     contains
6    
7     SUBROUTINE calcul_fluxs( klon, knon, nisurf, dtime, &
8     tsurf, p1lay, cal, beta, coef1lay, ps, &
9     precip_rain, precip_snow, snow, qsurf, &
10     radsol, dif_grnd, t1lay, q1lay, u1lay, v1lay, &
11     petAcoef, peqAcoef, petBcoef, peqBcoef, &
12     tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
13    
14 guez 99 ! Cette routine calcule les fluxs en h et q à l'interface et une
15     ! température de surface.
16 guez 54
17     ! L. Fairhead 4/2000
18    
19     ! input:
20     ! knon nombre de points a traiter
21     ! nisurf surface a traiter
22     ! tsurf temperature de surface
23     ! p1lay pression 1er niveau (milieu de couche)
24     ! cal capacite calorifique du sol
25     ! beta evap reelle
26     ! coef1lay coefficient d'echange
27     ! ps pression au sol
28     ! precip_rain precipitations liquides
29     ! precip_snow precipitations solides
30     ! snow champs hauteur de neige
31     ! runoff runoff en cas de trop plein
32     ! petAcoef coeff. A de la resolution de la CL pour t
33     ! peqAcoef coeff. A de la resolution de la CL pour q
34     ! petBcoef coeff. B de la resolution de la CL pour t
35     ! peqBcoef coeff. B de la resolution de la CL pour q
36     ! radsol rayonnement net aus sol (LW + SW)
37     ! dif_grnd coeff. diffusion vers le sol profond
38    
39     ! output:
40     ! tsurf_new temperature au sol
41     ! qsurf humidite de l'air au dessus du sol
42     ! fluxsens flux de chaleur sensible
43     ! fluxlat flux de chaleur latente
44     ! dflux_s derivee du flux de chaleur sensible / Ts
45     ! dflux_l derivee du flux de chaleur latente / Ts
46    
47    
48     use indicesol
49     use abort_gcm_m, only: abort_gcm
50     use yoethf_m
51     use fcttre, only: thermcep, foeew, qsats, qsatl, foede, dqsats, dqsatl
52     use SUPHEC_M
53     use interface_surf
54    
55     ! Parametres d'entree
56     integer, intent(IN) :: knon, nisurf, klon
57     real , intent(IN) :: dtime
58     real, dimension(klon), intent(IN) :: petAcoef, peqAcoef
59     real, dimension(klon), intent(IN) :: petBcoef, peqBcoef
60     real, dimension(klon), intent(IN) :: ps, q1lay
61     real, dimension(klon), intent(IN) :: tsurf, p1lay, cal, beta, coef1lay
62     real, dimension(klon), intent(IN) :: precip_rain, precip_snow
63     real, dimension(klon), intent(IN) :: radsol, dif_grnd
64     real, dimension(klon), intent(IN) :: t1lay, u1lay, v1lay
65     real, dimension(klon), intent(INOUT) :: snow, qsurf
66    
67     ! Parametres sorties
68     real, dimension(klon), intent(OUT):: tsurf_new, evap, fluxsens, fluxlat
69     real, dimension(klon), intent(OUT):: dflux_s, dflux_l
70    
71     ! Variables locales
72     integer :: i
73     real, dimension(klon) :: zx_mh, zx_nh, zx_oh
74     real, dimension(klon) :: zx_mq, zx_nq, zx_oq
75     real, dimension(klon) :: zx_pkh, zx_dq_s_dt, zx_qsat, zx_coef
76     real, dimension(klon) :: zx_sl, zx_k1
77     real, dimension(klon) :: zx_q_0 , d_ts
78 guez 103 logical zdelta
79     real zcvm5, zx_qs, zcor, zx_dq_s_dh
80 guez 54 real :: bilan_f, fq_fonte
81     REAL :: subli, fsno
82     REAL :: qsat_new, q1_new
83     real, parameter :: t_grnd = 271.35, t_coup = 273.15
84     !! PB temporaire en attendant mieux pour le modele de neige
85     REAL, parameter :: chasno = 3.334E+05/(2.3867E+06*0.15)
86    
87     logical, save :: check = .false.
88     character (len = 20) :: modname = 'calcul_fluxs'
89     logical, save :: fonte_neige = .false.
90     real, save :: max_eau_sol = 150.0
91     character (len = 80) :: abort_message
92     logical, save :: first = .true., second=.false.
93    
94     if (check) write(*, *)'Entree ', modname, ' surface = ', nisurf
95    
96     IF (check) THEN
97     WRITE(*, *)' radsol (min, max)' &
98     , MINVAL(radsol(1:knon)), MAXVAL(radsol(1:knon))
99     !!CALL flush(6)
100     ENDIF
101    
102 guez 101 if (size(run_off) /= knon .AND. nisurf == is_ter) then
103 guez 54 write(*, *)'Bizarre, le nombre de points continentaux'
104     write(*, *)'a change entre deux appels. J''arrete ...'
105     abort_message='Pb run_off'
106     call abort_gcm(modname, abort_message, 1)
107     endif
108    
109     ! Traitement neige et humidite du sol
110    
111     ! Initialisation
112    
113     evap = 0.
114     fluxsens=0.
115     fluxlat=0.
116     dflux_s = 0.
117     dflux_l = 0.
118    
119     ! zx_qs = qsat en kg/kg
120    
121     DO i = 1, knon
122     zx_pkh(i) = (ps(i)/ps(i))**RKAPPA
123     IF (thermcep) THEN
124 guez 103 zdelta= rtt >= tsurf(i)
125     zcvm5 = merge(R5IES*RLSTT, R5LES*RLVTT, zdelta)
126 guez 54 zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q1lay(i))
127     zx_qs= r2es * FOEEW(tsurf(i), zdelta)/ps(i)
128     zx_qs=MIN(0.5, zx_qs)
129     zcor=1./(1.-retv*zx_qs)
130     zx_qs=zx_qs*zcor
131     zx_dq_s_dh = FOEDE(tsurf(i), zdelta, zcvm5, zx_qs, zcor) &
132     /RLVTT / zx_pkh(i)
133     ELSE
134     IF (tsurf(i).LT.t_coup) THEN
135     zx_qs = qsats(tsurf(i)) / ps(i)
136     zx_dq_s_dh = dqsats(tsurf(i), zx_qs)/RLVTT &
137     / zx_pkh(i)
138     ELSE
139     zx_qs = qsatl(tsurf(i)) / ps(i)
140     zx_dq_s_dh = dqsatl(tsurf(i), zx_qs)/RLVTT &
141     / zx_pkh(i)
142     ENDIF
143     ENDIF
144     zx_dq_s_dt(i) = RCPD * zx_pkh(i) * zx_dq_s_dh
145     zx_qsat(i) = zx_qs
146     zx_coef(i) = coef1lay(i) &
147     * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
148     * p1lay(i)/(RD*t1lay(i))
149    
150     ENDDO
151    
152     ! === Calcul de la temperature de surface ===
153    
154     ! zx_sl = chaleur latente d'evaporation ou de sublimation
155    
156     do i = 1, knon
157     zx_sl(i) = RLVTT
158     if (tsurf(i) .LT. RTT) zx_sl(i) = RLSTT
159     zx_k1(i) = zx_coef(i)
160     enddo
161    
162     do i = 1, knon
163     ! Q
164     zx_oq(i) = 1. - (beta(i) * zx_k1(i) * peqBcoef(i) * dtime)
165     zx_mq(i) = beta(i) * zx_k1(i) * &
166     (peqAcoef(i) - zx_qsat(i) &
167     + zx_dq_s_dt(i) * tsurf(i)) &
168     / zx_oq(i)
169     zx_nq(i) = beta(i) * zx_k1(i) * (-1. * zx_dq_s_dt(i)) &
170     / zx_oq(i)
171    
172     ! H
173     zx_oh(i) = 1. - (zx_k1(i) * petBcoef(i) * dtime)
174     zx_mh(i) = zx_k1(i) * petAcoef(i) / zx_oh(i)
175     zx_nh(i) = - (zx_k1(i) * RCPD * zx_pkh(i))/ zx_oh(i)
176    
177     ! Tsurface
178     tsurf_new(i) = (tsurf(i) + cal(i)/(RCPD * zx_pkh(i)) * dtime * &
179     (radsol(i) + zx_mh(i) + zx_sl(i) * zx_mq(i)) &
180     + dif_grnd(i) * t_grnd * dtime)/ &
181     ( 1. - dtime * cal(i)/(RCPD * zx_pkh(i)) * ( &
182     zx_nh(i) + zx_sl(i) * zx_nq(i)) &
183     + dtime * dif_grnd(i))
184    
185    
186     ! Y'a-t-il fonte de neige?
187    
188     ! fonte_neige = (nisurf /= is_oce) .AND. &
189     ! & (snow(i) > epsfra .OR. nisurf == is_sic .OR. nisurf == is_lic) &
190     ! & .AND. (tsurf_new(i) >= RTT)
191     ! if (fonte_neige) tsurf_new(i) = RTT
192     d_ts(i) = tsurf_new(i) - tsurf(i)
193     ! zx_h_ts(i) = tsurf_new(i) * RCPD * zx_pkh(i)
194     ! zx_q_0(i) = zx_qsat(i) + zx_dq_s_dt(i) * d_ts(i)
195     !== flux_q est le flux de vapeur d'eau: kg/(m**2 s) positive vers bas
196     !== flux_t est le flux de cpt (energie sensible): j/(m**2 s)
197     evap(i) = - zx_mq(i) - zx_nq(i) * tsurf_new(i)
198     fluxlat(i) = - evap(i) * zx_sl(i)
199     fluxsens(i) = zx_mh(i) + zx_nh(i) * tsurf_new(i)
200     ! Derives des flux dF/dTs (W m-2 K-1):
201     dflux_s(i) = zx_nh(i)
202     dflux_l(i) = (zx_sl(i) * zx_nq(i))
203     ! Nouvelle valeure de l'humidite au dessus du sol
204     qsat_new=zx_qsat(i) + zx_dq_s_dt(i) * d_ts(i)
205     q1_new = peqAcoef(i) - peqBcoef(i)*evap(i)*dtime
206     qsurf(i)=q1_new*(1.-beta(i)) + beta(i)*qsat_new
207     ENDDO
208    
209     END SUBROUTINE calcul_fluxs
210    
211     end module calcul_fluxs_m

  ViewVC Help
Powered by ViewVC 1.1.21