SURFEX v8.1
General documentation of Surfex
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( SB, PPA, PU, PV, &
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_canopy_n, ONLY : canopy_t
61 !
62 USE modd_surf_par, ONLY : xundef
63 USE modd_csts, ONLY : xcpd, xrd, xp00
64 USE modd_surf_atm, ONLY : xwindmin
65 !
66 IMPLICIT NONE
67 !
68 TYPE(canopy_t), INTENT(INOUT) :: SB
69 !
70 REAL, DIMENSION(:), INTENT(IN) :: PPA
71 REAL, DIMENSION(:), INTENT(IN) :: PU
72 REAL, DIMENSION(:), INTENT(IN) :: PV
73 REAL, DIMENSION(:), INTENT(IN) :: PRHOA
74 REAL, DIMENSION(:), INTENT(IN) :: PALFAU
75 REAL, DIMENSION(:), INTENT(IN) :: PBETAU
76 REAL, DIMENSION(:), INTENT(IN) :: PALFATH
77 REAL, DIMENSION(:), INTENT(IN) :: PBETATH
78 REAL, DIMENSION(:), INTENT(IN) :: PALFAQ
79 REAL, DIMENSION(:), INTENT(IN) :: PBETAQ
80 REAL, DIMENSION(:), INTENT(OUT) :: PPPA
81 REAL, DIMENSION(:), INTENT(OUT) :: PTTA
82 REAL, DIMENSION(:), INTENT(OUT) :: PQQA
83 REAL, DIMENSION(:), INTENT(OUT) :: PUU
84 REAL, DIMENSION(:), INTENT(OUT) :: PVV
85 REAL, DIMENSION(:), INTENT(OUT) :: PUUREF
86 REAL, DIMENSION(:), INTENT(OUT) :: PZZREF
87 REAL, DIMENSION(:), INTENT(OUT) :: PEXNA
88 REAL, DIMENSION(:), INTENT(OUT) :: PPEW_AA_COEF
89 REAL, DIMENSION(:), INTENT(OUT) :: PPEW_BB_COEF
90 REAL, DIMENSION(:), INTENT(OUT) :: PPET_AA_COEF
91 REAL, DIMENSION(:), INTENT(OUT) :: PPET_BB_COEF
92 REAL, DIMENSION(:), INTENT(OUT) :: PPEQ_AA_COEF
93 REAL, DIMENSION(:), INTENT(OUT) :: PPEQ_BB_COEF
94 !
95 REAL(KIND=JPRB) :: ZHOOK_HANDLE
96 !
97 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING_CANOPY',0,zhook_handle)
98 !
99 pppa = sb%XP(:,1)
100 ptta = sb%XT(:,1)
101 pqqa = sb%XQ(:,1)
102 puu = pu / max(sqrt(pu**2+pv**2),xwindmin) * sb%XU(:,1)
103 pvv = pv / max(sqrt(pu**2+pv**2),xwindmin) * sb%XU(:,1)
104 puuref = sb%XZ(:,1)
105 pzzref = sb%XZ(:,1)
106 !
107 pexna(:) = (sb%XP(:,1)/xp00)**(xrd/xcpd)
108 WHERE (sb%XP(:,1)==xundef) !* security at first time-step
109  pexna = (ppa/xp00)**(xrd/xcpd)
110  pppa = ppa
111 END WHERE
112 !
113 !* ALMA conventions for implicit coefficients:
114 ! U+ = - rho A u'w' + B
115 ! Th+ = - rho A w'th' + B
116 ! q+ = - rho A w'q' + B
117 !
118 ppew_aa_coef = - palfau / prhoa
119 ppew_bb_coef = pbetau
120 ppet_aa_coef = - palfath / prhoa
121 ppet_bb_coef = pbetath
122 ppeq_aa_coef = - palfaq / prhoa
123 ppeq_bb_coef = pbetaq
124 !
125 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING_CANOPY',1,zhook_handle)
126 !
127 END SUBROUTINE init_coupling_canopy
128 ! ###############################################################################
129 !
130 ! ###############################################################################
131 SUBROUTINE init_coupling( HCOUPLING, &
132  PPS, PPA, PTA, PQA, PU, PV, &
133  PUREF, PZREF, &
134  PPEW_A_COEF, PPEW_B_COEF, &
135  PPET_A_COEF, PPET_B_COEF, &
136  PPEQ_A_COEF, PPEQ_B_COEF, &
137  PPPA, PTTA, PQQA, PUU, PVV, &
138  PUUREF, PZZREF, &
139  PPEW_AA_COEF, PPEW_BB_COEF, &
140  PPET_AA_COEF, PPET_BB_COEF, &
141  PPEQ_AA_COEF, PPEQ_BB_COEF )
142 !
143 USE modd_csts, ONLY : xcpd, xrd, xp00
144 !
145 IMPLICIT NONE
146 !
147  CHARACTER(LEN=1), INTENT(IN) :: HCOUPLING
148 REAL, DIMENSION(:), INTENT(IN) :: PPS
149 REAL, DIMENSION(:), INTENT(IN) :: PPA
150 REAL, DIMENSION(:), INTENT(IN) :: PTA
151 REAL, DIMENSION(:), INTENT(IN) :: PQA
152 REAL, DIMENSION(:), INTENT(IN) :: PU
153 REAL, DIMENSION(:), INTENT(IN) :: PV
154 REAL, DIMENSION(:), INTENT(IN) :: PUREF
155 REAL, DIMENSION(:), INTENT(IN) :: PZREF
156 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF
157 REAL, DIMENSION(:), INTENT(IN) :: PPEW_B_COEF
158 REAL, DIMENSION(:), INTENT(IN) :: PPET_A_COEF
159 REAL, DIMENSION(:), INTENT(IN) :: PPET_B_COEF
160 REAL, DIMENSION(:), INTENT(IN) :: PPEQ_A_COEF
161 REAL, DIMENSION(:), INTENT(IN) :: PPEQ_B_COEF
162 REAL, DIMENSION(:), INTENT(OUT) :: PPPA
163 REAL, DIMENSION(:), INTENT(OUT) :: PTTA
164 REAL, DIMENSION(:), INTENT(OUT) :: PQQA
165 REAL, DIMENSION(:), INTENT(OUT) :: PUU
166 REAL, DIMENSION(:), INTENT(OUT) :: PVV
167 REAL, DIMENSION(:), INTENT(OUT) :: PUUREF
168 REAL, DIMENSION(:), INTENT(OUT) :: PZZREF
169 REAL, DIMENSION(:), INTENT(OUT) :: PPEW_AA_COEF
170 REAL, DIMENSION(:), INTENT(OUT) :: PPEW_BB_COEF
171 REAL, DIMENSION(:), INTENT(OUT) :: PPET_AA_COEF
172 REAL, DIMENSION(:), INTENT(OUT) :: PPET_BB_COEF
173 REAL, DIMENSION(:), INTENT(OUT) :: PPEQ_AA_COEF
174 REAL, DIMENSION(:), INTENT(OUT) :: PPEQ_BB_COEF
175 !
176 REAL(KIND=JPRB) :: ZHOOK_HANDLE
177 !
178 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING',0,zhook_handle)
179 !
180 pppa = ppa
181 ptta = pta
182 pqqa = pqa
183 puu = pu
184 pvv = pv
185 puuref = puref
186 pzzref = pzref
187 !
188 ppew_aa_coef = ppew_a_coef
189 ppew_bb_coef = ppew_b_coef
190 !
191 IF (hcoupling=='I') THEN
192  ppet_aa_coef = ppet_a_coef
193  ppeq_aa_coef = ppeq_a_coef
194  ppet_bb_coef = ppet_b_coef
195  ppeq_bb_coef = ppeq_b_coef
196 ELSE
197  ppet_aa_coef = 0.
198  ppet_bb_coef = pta / (ppa/xp00)**(xrd/xcpd)
199  ppeq_aa_coef = 0.
200  ppeq_bb_coef = pqa
201 ENDIF
202 !
203 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_COUPLING',1,zhook_handle)
204 !
205 END SUBROUTINE init_coupling
206 ! ###############################################################################
207 !
208 ! ###############################################################################
209 SUBROUTINE init_2m_10m( SB, D, PU, PV, PWIND, PRHOA )
210 !
211 USE modd_canopy_n, ONLY : canopy_t
212 USE modd_diag_n, ONLY : diag_t
213 !
214 USE modd_surf_par, ONLY : xundef
215 !
216 USE mode_thermos, ONLY : qsat
217 !
218 USE modi_interpol_sbl
219 !
220 IMPLICIT NONE
221 !
222 TYPE(canopy_t), INTENT(INOUT) :: SB
223 TYPE(diag_t), INTENT(INOUT) :: D
224 !
225 REAL, DIMENSION(:), INTENT(IN) :: PU
226 REAL, DIMENSION(:), INTENT(IN) :: PV
227 REAL, DIMENSION(:), INTENT(IN) :: PWIND
228 REAL, DIMENSION(:), INTENT(IN) :: PRHOA
229 !
230 REAL, DIMENSION(SIZE(SB%XT,1)) :: ZU10
231 INTEGER :: JJ
232 REAL(KIND=JPRB) :: ZHOOK_HANDLE
233 !
234 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_2M_10M',0,zhook_handle)
235 !
236 d%XT2M(:) = sb%XT(:,2)
237 d%XT2M_MIN(:) = min(d%XT2M(:),d%XT2M_MIN(:))
238 d%XT2M_MAX(:) = max(d%XT2M(:),d%XT2M_MAX(:))
239 d%XQ2M(:) = sb%XQ(:,2) / prhoa(:)
240 d%XHU2M(:)= min( d%XQ2M(:) / qsat(d%XT2M(:),sb%XP(:,2)) , 1.)
241 d%XHU2M_MIN(:) = min(d%XHU2M(:),d%XHU2M_MIN(:))
242 d%XHU2M_MAX(:) = max(d%XHU2M(:),d%XHU2M_MAX(:))
243  CALL interpol_sbl(sb%XZ(:,:),sb%XU(:,:),10.,zu10(:))
244 DO jj=1,SIZE(sb%XT(:,2))
245  IF (zu10(jj)/=xundef) THEN
246  IF (pwind(jj)>0.) THEN
247  d%XZON10M(jj) = zu10(jj) * pu(jj)/pwind(jj)
248  d%XMER10M(jj) = zu10(jj) * pv(jj)/pwind(jj)
249  ELSE
250  d%XZON10M(jj) = 0.
251  d%XMER10M(jj) = 0.
252  END IF
253  d%XWIND10M(jj) = sqrt(d%XZON10M(jj)**2+d%XMER10M(jj)**2)
254  d%XWIND10M_MAX(jj) = max(d%XWIND10M(jj),d%XWIND10M_MAX(jj))
255  ELSE
256  d%XZON10M(jj) = xundef
257  d%XMER10M(jj) = xundef
258  d%XWIND10M(jj) = xundef
259  d%XWIND10M_MAX(jj) = xundef
260  END IF
261 END DO
262 !
263 IF (lhook) CALL dr_hook('MODE_COUPLING_CANOPY:INIT_2M_10M',1,zhook_handle)
264 !
265 END SUBROUTINE
266 !
267 END MODULE mode_coupling_canopy
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)
real, save xcpd
Definition: modd_csts.F90:63
subroutine init_2m_10m(SB, D, PU, PV, PWIND, PRHOA)
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine interpol_sbl(PZ, PIN, PH, POUT)
Definition: interpol_sbl.F90:7
subroutine init_forc(PFORC_U, PDFORC_UDU, PFORC_E, PDFORC_EDE, PFORC_T, PDFORC_TDT, PFORC_Q, PDFORC_QDQ)
subroutine init_coupling_canopy(SB, PPA, PU, PV, 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)
real, save xp00
Definition: modd_csts.F90:57