SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_coupling_canopy.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! ######spl
7 ! ####################
8 !
9 USE yomhook ,ONLY : lhook, dr_hook
10 USE parkind1 ,ONLY : jprb
11 !
12  CONTAINS
13 !
14 ! ###############################################################################
15 SUBROUTINE init_forc( PFORC_U, PDFORC_UDU, PFORC_E, PDFORC_EDE, &
16  pforc_t, pdforc_tdt, pforc_q, pdforc_qdq )
17 !
18 IMPLICIT NONE
19 !
20 REAL, DIMENSION(:,:), INTENT(OUT) :: pforc_u
21 REAL, DIMENSION(:,:), INTENT(OUT) :: pdforc_udu
22 REAL, DIMENSION(:,:), INTENT(OUT) :: pforc_e
23 REAL, DIMENSION(:,:), INTENT(OUT) :: pdforc_ede
24 REAL, DIMENSION(:,:), INTENT(OUT) :: pforc_t
25 REAL, DIMENSION(:,:), INTENT(OUT) :: pdforc_tdt
26 REAL, DIMENSION(:,:), INTENT(OUT) :: pforc_q
27 REAL, DIMENSION(:,:), INTENT(OUT) :: pdforc_qdq
28 !
29 REAL(KIND=JPRB) :: zhook_handle
30 !
31 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_FORC',0,zhook_handle)
32 !
33 pforc_u = 0.
34 pdforc_udu = 0.
35 !
36 pforc_e(:,:) = 0.
37 pdforc_ede(:,:) = 0.
38 !
39 pforc_t(:,:) = 0.
40 pdforc_tdt(:,:) = 0.
41 !
42 pforc_q(:,:) = 0.
43 pdforc_qdq(:,:) = 0.
44 !
45 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_FORC',1,zhook_handle)
46 !
47 END SUBROUTINE init_forc
48 ! ###############################################################################
49 !
50 ! ###############################################################################
51 SUBROUTINE init_coupling_canopy( PP, PPA, PT, PQ, PU, PV, PZ, PXU, &
52  prhoa, palfau, pbetau, palfath, &
53  pbetath, palfaq, pbetaq, &
54  pppa, ptta, pqqa, puu, pvv, &
55  puuref, pzzref, pexna, &
56  ppew_aa_coef, ppew_bb_coef, &
57  ppet_aa_coef, ppet_bb_coef, &
58  ppeq_aa_coef, ppeq_bb_coef )
59 !
60 USE modd_surf_par, ONLY : xundef
61 USE modd_csts, ONLY : xcpd, xrd, xp00
62 USE modd_surf_atm, ONLY : xwindmin
63 !
64 IMPLICIT NONE
65 !
66 REAL, DIMENSION(:), INTENT(IN) :: pp
67 REAL, DIMENSION(:), INTENT(IN) :: ppa
68 REAL, DIMENSION(:), INTENT(IN) :: pt
69 REAL, DIMENSION(:), INTENT(IN) :: pq
70 REAL, DIMENSION(:), INTENT(IN) :: pu
71 REAL, DIMENSION(:), INTENT(IN) :: pv
72 REAL, DIMENSION(:), INTENT(IN) :: pz
73 REAL, DIMENSION(:), INTENT(IN) :: pxu
74 REAL, DIMENSION(:), INTENT(IN) :: prhoa
75 REAL, DIMENSION(:), INTENT(IN) :: palfau
76 REAL, DIMENSION(:), INTENT(IN) :: pbetau
77 REAL, DIMENSION(:), INTENT(IN) :: palfath
78 REAL, DIMENSION(:), INTENT(IN) :: pbetath
79 REAL, DIMENSION(:), INTENT(IN) :: palfaq
80 REAL, DIMENSION(:), INTENT(IN) :: pbetaq
81 REAL, DIMENSION(:), INTENT(OUT) :: pppa
82 REAL, DIMENSION(:), INTENT(OUT) :: ptta
83 REAL, DIMENSION(:), INTENT(OUT) :: pqqa
84 REAL, DIMENSION(:), INTENT(OUT) :: puu
85 REAL, DIMENSION(:), INTENT(OUT) :: pvv
86 REAL, DIMENSION(:), INTENT(OUT) :: puuref
87 REAL, DIMENSION(:), INTENT(OUT) :: pzzref
88 REAL, DIMENSION(:), INTENT(OUT) :: pexna
89 REAL, DIMENSION(:), INTENT(OUT) :: ppew_aa_coef
90 REAL, DIMENSION(:), INTENT(OUT) :: ppew_bb_coef
91 REAL, DIMENSION(:), INTENT(OUT) :: ppet_aa_coef
92 REAL, DIMENSION(:), INTENT(OUT) :: ppet_bb_coef
93 REAL, DIMENSION(:), INTENT(OUT) :: ppeq_aa_coef
94 REAL, DIMENSION(:), INTENT(OUT) :: ppeq_bb_coef
95 !
96 REAL(KIND=JPRB) :: zhook_handle
97 !
98 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING_CANOPY',0,zhook_handle)
99 !
100 pppa = pp(:)
101 ptta = pt(:)
102 pqqa = pq(:)
103 puu = pu / max(sqrt(pu**2+pv**2),xwindmin) * pxu(:)
104 pvv = pv / max(sqrt(pu**2+pv**2),xwindmin) * pxu(:)
105 puuref = pz(:)
106 pzzref = pz(:)
107 !
108 pexna(:) = (pp(:)/xp00)**(xrd/xcpd)
109 WHERE (pp(:)==xundef) !* security at first time-step
110  pexna = (ppa/xp00)**(xrd/xcpd)
111  pppa = ppa
112 END WHERE
113 !
114 !* ALMA conventions for implicit coefficients:
115 ! U+ = - rho A u'w' + B
116 ! Th+ = - rho A w'th' + B
117 ! q+ = - rho A w'q' + B
118 !
119 ppew_aa_coef = - palfau / prhoa
120 ppew_bb_coef = pbetau
121 ppet_aa_coef = - palfath / prhoa
122 ppet_bb_coef = pbetath
123 ppeq_aa_coef = - palfaq / prhoa
124 ppeq_bb_coef = pbetaq
125 !
126 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING_CANOPY',1,zhook_handle)
127 !
128 END SUBROUTINE init_coupling_canopy
129 ! ###############################################################################
130 !
131 ! ###############################################################################
132 SUBROUTINE init_coupling( HCOUPLING, &
133  pps, ppa, pta, pqa, pu, pv, &
134  puref, pzref, &
135  ppew_a_coef, ppew_b_coef, &
136  ppet_a_coef, ppet_b_coef, &
137  ppeq_a_coef, ppeq_b_coef, &
138  pppa, ptta, pqqa, puu, pvv, &
139  puuref, pzzref, &
140  ppew_aa_coef, ppew_bb_coef, &
141  ppet_aa_coef, ppet_bb_coef, &
142  ppeq_aa_coef, ppeq_bb_coef )
143 !
144 USE modd_csts, ONLY : xcpd, xrd, xp00
145 !
146 IMPLICIT NONE
147 !
148  CHARACTER(LEN=1), INTENT(IN) :: hcoupling
149 REAL, DIMENSION(:), INTENT(IN) :: pps
150 REAL, DIMENSION(:), INTENT(IN) :: ppa
151 REAL, DIMENSION(:), INTENT(IN) :: pta
152 REAL, DIMENSION(:), INTENT(IN) :: pqa
153 REAL, DIMENSION(:), INTENT(IN) :: pu
154 REAL, DIMENSION(:), INTENT(IN) :: pv
155 REAL, DIMENSION(:), INTENT(IN) :: puref
156 REAL, DIMENSION(:), INTENT(IN) :: pzref
157 REAL, DIMENSION(:), INTENT(IN) :: ppew_a_coef
158 REAL, DIMENSION(:), INTENT(IN) :: ppew_b_coef
159 REAL, DIMENSION(:), INTENT(IN) :: ppet_a_coef
160 REAL, DIMENSION(:), INTENT(IN) :: ppet_b_coef
161 REAL, DIMENSION(:), INTENT(IN) :: ppeq_a_coef
162 REAL, DIMENSION(:), INTENT(IN) :: ppeq_b_coef
163 REAL, DIMENSION(:), INTENT(OUT) :: pppa
164 REAL, DIMENSION(:), INTENT(OUT) :: ptta
165 REAL, DIMENSION(:), INTENT(OUT) :: pqqa
166 REAL, DIMENSION(:), INTENT(OUT) :: puu
167 REAL, DIMENSION(:), INTENT(OUT) :: pvv
168 REAL, DIMENSION(:), INTENT(OUT) :: puuref
169 REAL, DIMENSION(:), INTENT(OUT) :: pzzref
170 REAL, DIMENSION(:), INTENT(OUT) :: ppew_aa_coef
171 REAL, DIMENSION(:), INTENT(OUT) :: ppew_bb_coef
172 REAL, DIMENSION(:), INTENT(OUT) :: ppet_aa_coef
173 REAL, DIMENSION(:), INTENT(OUT) :: ppet_bb_coef
174 REAL, DIMENSION(:), INTENT(OUT) :: ppeq_aa_coef
175 REAL, DIMENSION(:), INTENT(OUT) :: ppeq_bb_coef
176 !
177 REAL(KIND=JPRB) :: zhook_handle
178 !
179 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING',0,zhook_handle)
180 !
181 pppa = ppa
182 ptta = pta
183 pqqa = pqa
184 puu = pu
185 pvv = pv
186 puuref = puref
187 pzzref = pzref
188 !
189 ppew_aa_coef = ppew_a_coef
190 ppew_bb_coef = ppew_b_coef
191 !
192 IF (hcoupling=='I') THEN
193  ppet_aa_coef = ppet_a_coef
194  ppeq_aa_coef = ppeq_a_coef
195  ppet_bb_coef = ppet_b_coef
196  ppeq_bb_coef = ppeq_b_coef
197 ELSE
198  ppet_aa_coef = 0.
199  ppet_bb_coef = pta / (ppa/xp00)**(xrd/xcpd)
200  ppeq_aa_coef = 0.
201  ppeq_bb_coef = pqa
202 ENDIF
203 !
204 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING',1,zhook_handle)
205 !
206 END SUBROUTINE init_coupling
207 ! ###############################################################################
208 !
209 ! ###############################################################################
210 SUBROUTINE init_2m_10m( PP, PT, PQ, PXU, PXZ, PU, PV, PWIND, PRHOA, &
211  pt2m, pq2m, phu2m, pzon10m, pmer10m, &
212  pwind10m, pwind10m_max, pt2m_min, pt2m_max, &
213  phu2m_min, phu2m_max )
214 !
215 USE modd_surf_par, ONLY : xundef
216 !
217 USE mode_thermos, ONLY : qsat
218 !
219 USE modi_interpol_sbl
220 !
221 IMPLICIT NONE
222 !
223 REAL, DIMENSION(:), INTENT(IN) :: pp
224 REAL, DIMENSION(:), INTENT(IN) :: pt
225 REAL, DIMENSION(:), INTENT(IN) :: pq
226 REAL, DIMENSION(:,:), INTENT(IN) :: pxu
227 REAL, DIMENSION(:,:), INTENT(IN) :: pxz
228 REAL, DIMENSION(:), INTENT(IN) :: pu
229 REAL, DIMENSION(:), INTENT(IN) :: pv
230 REAL, DIMENSION(:), INTENT(IN) :: pwind
231 REAL, DIMENSION(:), INTENT(IN) :: prhoa
232 REAL, DIMENSION(:), INTENT(OUT) :: pt2m
233 REAL, DIMENSION(:), INTENT(OUT) :: pq2m
234 REAL, DIMENSION(:), INTENT(OUT) :: phu2m
235 REAL, DIMENSION(:), INTENT(OUT) :: pzon10m
236 REAL, DIMENSION(:), INTENT(OUT) :: pmer10m
237 REAL, DIMENSION(:), INTENT(OUT) :: pwind10m
238 REAL, DIMENSION(:), INTENT(INOUT) :: pwind10m_max
239 REAL, DIMENSION(:), INTENT(INOUT) :: pt2m_min
240 REAL, DIMENSION(:), INTENT(INOUT) :: pt2m_max
241 REAL, DIMENSION(:), INTENT(INOUT) :: phu2m_min
242 REAL, DIMENSION(:), INTENT(INOUT) :: phu2m_max
243 !
244 REAL, DIMENSION(SIZE(PT)) :: zu10
245 INTEGER :: jj
246 REAL(KIND=JPRB) :: zhook_handle
247 !
248 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_2M_10M',0,zhook_handle)
249 !
250 pt2m(:) = pt(:)
251 pt2m_min(:) = min(pt2m(:),pt2m_min(:))
252 pt2m_max(:) = max(pt2m(:),pt2m_max(:))
253 pq2m(:) = pq(:) / prhoa(:)
254 phu2m(:)= min( pq2m(:) / qsat(pt2m(:),pp(:)) , 1.)
255 phu2m_min(:) = min(phu2m(:),phu2m_min(:))
256 phu2m_max(:) = max(phu2m(:),phu2m_max(:))
257  CALL interpol_sbl(pxz(:,:),pxu(:,:),10.,zu10(:))
258 DO jj=1,SIZE(pt)
259  IF (zu10(jj)/=xundef) THEN
260  IF (pwind(jj)>0.) THEN
261  pzon10m(jj) = zu10(jj) * pu(jj)/pwind(jj)
262  pmer10m(jj) = zu10(jj) * pv(jj)/pwind(jj)
263  ELSE
264  pzon10m(jj) = 0.
265  pmer10m(jj) = 0.
266  END IF
267  pwind10m(jj) = sqrt(pzon10m(jj)**2+pmer10m(jj)**2)
268  pwind10m_max(jj) = max(pwind10m(jj),pwind10m_max(jj))
269  ELSE
270  pzon10m(jj) = xundef
271  pmer10m(jj) = xundef
272  pwind10m(jj) = xundef
273  pwind10m_max(jj) = xundef
274  END IF
275 END DO
276 !
277 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_2M_10M',1,zhook_handle)
278 !
279 END SUBROUTINE
280 !
281 END MODULE mode_coupling_canopy
subroutine init_coupling_canopy(PP, PPA, PT, PQ, PU, PV, PZ, PXU, PRHOA, PALFAU, PBETAU, PALFATH, PBETATH, PALFAQ, PBETAQ, PPPA, PTTA, PQQA, PUU, PVV, PUUREF, PZZREF, PEXNA, PPEW_AA_COEF, PPEW_BB_COEF, PPET_AA_COEF, PPET_BB_COEF, PPEQ_AA_COEF, PPEQ_BB_COEF)
subroutine init_coupling(HCOUPLING, PPS, PPA, PTA, PQA, PU, PV, PUREF, PZREF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPET_B_COEF, PPEQ_A_COEF, PPEQ_B_COEF, PPPA, PTTA, PQQA, PUU, PVV, PUUREF, PZZREF, PPEW_AA_COEF, PPEW_BB_COEF, PPET_AA_COEF, PPET_BB_COEF, PPEQ_AA_COEF, PPEQ_BB_COEF)
subroutine interpol_sbl(PZ, PIN, PH, POUT)
Definition: interpol_sbl.F90:6
subroutine init_2m_10m(PP, PT, PQ, PXU, PXZ, PU, PV, PWIND, PRHOA, PT2M, PQ2M, PHU2M, PZON10M, PMER10M, PWIND10M, PWIND10M_MAX, PT2M_MIN, PT2M_MAX, PHU2M_MIN, PHU2M_MAX)
subroutine init_forc(PFORC_U, PDFORC_UDU, PFORC_E, PDFORC_EDE, PFORC_T, PDFORC_TDT, PFORC_Q, PDFORC_QDQ)