114 INTEGER,
INTENT(IN) :: KILEN
115 INTEGER,
INTENT(IN) :: KOLEN
116 REAL,
DIMENSION(:),
INTENT(OUT) :: PAROUT
117 LOGICAL,
DIMENSION(:),
INTENT(IN) :: OINTERP
118 REAL,
DIMENSION(:,:),
INTENT(IN) :: PARIN
119 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: KLSMIN
120 REAL,
DIMENSION(:),
INTENT(IN) :: POLO, POLA
121 REAL,
DIMENSION(:,:),
INTENT(IN) :: PLA
122 REAL,
DIMENSION(:,:),
INTENT(IN) :: PLOP
123 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: KMASKIN
124 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: KLSMOUT
129 REAL,
DIMENSION(4) :: ZWV
130 REAL,
DIMENSION(12) :: ZWP
133 REAL,
DIMENSION(12) :: ZLSMP
134 REAL,
DIMENSION(4) :: ZLSMV
142 REAL,
DIMENSION(3) :: ZP
146 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
152 IF (
lhook)
CALL dr_hook(
'HORIBL_SURF_VALUE_1',0,zhook_handle)
155 IF (
PRESENT(kmaskin) .AND.
PRESENT(klsmout)) ldlsm = .true.
164 IF (
lhook)
CALL dr_hook(
'HORIBL_SURF_VALUE_1',1,zhook_handle)
166 IF (
lhook)
CALL dr_hook(
'HORIBL_SURF_VALUE_2',0,zhook_handle_omp)
171 IF (.NOT. ointerp(jl)) cycle
181 IF (klsmin(jl,ji).NE.klsmout(jl)) zlsmp(ji) = 0.
184 zlsmv(1) = zlsmp(1) + zlsmp(2)
185 zlsmv(2) = zlsmp(3) + zlsmp(4) + zlsmp(5) + zlsmp(6)
186 zlsmv(3) = zlsmp(7) + zlsmp(8) + zlsmp(9) + zlsmp(10)
187 zlsmv(4) = zlsmp(11) + zlsmp(12)
189 zlsmv(:) = min(zlsmv(:),1.)
190 zlsmtot = min(
sum(zlsmv),1.)
192 IF (zlsmv(1) < 1.e-3) zlsmp(1:2) = 1.
193 IF (zlsmv(2) < 1.e-3) zlsmp(3:6) = 1.
194 IF (zlsmv(3) < 1.e-3) zlsmp(7:10) = 1.
195 IF (zlsmv(4) < 1.e-3) zlsmp(11:12) = 1.
196 IF (zlsmtot < 1.e-3) zlsmv(:) = 1.
202 zp(1) = pla(jl,1) - pla(jl,2)
203 zp(2) = pla(jl,1) - pla(jl,3)
204 zp(3) = pla(jl,2) - pla(jl,3)
206 zt = pola(jl) - pla(jl,1)
207 zwv(1) = zlsmv(1) * (1.+zlsmv(2)*zt/zp(1)) * (1.+zlsmv(3)*zt/zp(2)) * (1.+zlsmv(4)*zt/(pla(jl,1)-pla(jl,4)))
208 zt = pola(jl) - pla(jl,2)
209 zwv(2) = zlsmv(2) * (1.-zlsmv(1)*zt/zp(1)) * (1.+zlsmv(3)*zt/zp(3)) * (1.+zlsmv(4)*zt/(pla(jl,2)-pla(jl,4)))
210 zt = pola(jl) - pla(jl,3)
211 zwv(3) = zlsmv(3) * (1.-zlsmv(1)*zt/zp(2)) * (1.-zlsmv(2)*zt/zp(3)) * (1.+zlsmv(4)*zt/(pla(jl,3)-pla(jl,4)))
212 zwv(4) = 1. - zwv(1) - zwv(2) - zwv(3)
215 zwp(1) = zlsmp(1) * (1.+zlsmp(2) *(polo(jl) -plop(jl,1))/(plop(jl,1) -plop(jl,2)))
218 zwp(11) = zlsmp(11)* (1.+zlsmp(12)*(polo(jl)-plop(jl,11))/(plop(jl,11)-plop(jl,12)))
219 zwp(12) = 1. - zwp(11)
222 zp(1) = plop(jl,3) - plop(jl,4)
223 zp(2) = plop(jl,3) - plop(jl,5)
224 zp(3) = plop(jl,4) - plop(jl,5)
226 zt = polo(jl) - plop(jl,3)
227 zwp(3) = zlsmp(3) * (1.+zlsmp(4)*zt/zp(1)) * (1.+zlsmp(5)*zt/zp(2)) * (1.+zlsmp(6)*zt/(plop(jl,3)-plop(jl,6)))
228 zt = polo(jl) - plop(jl,4)
229 zwp(4) = zlsmp(4) * (1.-zlsmp(3)*zt/zp(1)) * (1.+zlsmp(5)*zt/zp(3)) * (1.+zlsmp(6)*zt/(plop(jl,4)-plop(jl,6)))
230 zt = polo(jl) - plop(jl,5)
231 zwp(5) = zlsmp(5) * (1.-zlsmp(3)*zt/zp(2)) * (1.-zlsmp(4)*zt/zp(3)) * (1.+zlsmp(6)*zt/(plop(jl,5)-plop(jl,6)))
232 zwp(6) = 1. - zwp(3) - zwp(4) - zwp(5)
235 zp(1) = plop(jl,7) - plop(jl,8)
236 zp(2) = plop(jl,7) - plop(jl,9)
237 zp(3) = plop(jl,8) - plop(jl,9)
239 zt = polo(jl) - plop(jl,7)
240 zwp(7) = zlsmp(7) * (1.+zlsmp(8)*zt/zp(1)) * (1.+zlsmp(9)*zt/zp(2)) * (1.+zlsmp(10)*zt/(plop(jl,7)-plop(jl,10)))
241 zt = polo(jl) - plop(jl,8)
242 zwp(8) = zlsmp(8) * (1.-zlsmp(7)*zt/zp(1)) * (1.+zlsmp(9)*zt/zp(3)) * (1.+zlsmp(10)*zt/(plop(jl,8)-plop(jl,10)))
243 zt = polo(jl) - plop(jl,9)
244 zwp(9) = zlsmp(9) * (1.-zlsmp(7)*zt/zp(2)) * (1.-zlsmp(8)*zt/zp(3)) * (1.+zlsmp(10)*zt/(plop(jl,9)-plop(jl,10)))
245 zwp(10) = 1. - zwp(7) - zwp(8) - zwp(9)
251 IF (abs(zwp(2)) < 1.e-10) zwp(2) =0.
252 IF (abs(zwp(6)) < 1.e-10) zwp(6) =0.
253 IF (abs(zwp(10))< 1.e-10) zwp(10)=0.
254 IF (abs(zwp(12))< 1.e-10) zwp(12)=0.
255 IF (abs(zwv(4)) < 1.e-10) zwv(4) =0.
258 zwp(1:2) = zwp(1:2) * zwv(1)
259 zwp(3:6) = zwp(3:6) * zwv(2)
260 zwp(7:10) = zwp(7:10) * zwv(3)
261 zwp(11:12) = zwp(11:12) * zwv(4)
262 WHERE (zwp(:)<1.e-4) zwp(:) = 0.
263 zwp(:) = zwp(:) /
sum(zwp)
267 parout(jl) = parout(jl) + zwp(ji) * parin(jl,ji)
273 IF (
PRESENT(kmaskin))
THEN 279 IF (parin(jl,jl2)==
xundef) cycle
285 zmax=max(zmax,parin(jl,jl2))
286 zmin=min(zmin,parin(jl,jl2))
291 parout(jl) = max(min(parout(jl),zmax),zmin)
297 IF (
lhook)
CALL dr_hook(
'HORIBL_SURF_VALUE_2',1,zhook_handle_omp)
300 IF (
lhook)
CALL dr_hook(
'HORIBL_SURF_VALUE_3',0,zhook_handle)
302 IF (
lhook)
CALL dr_hook(
'HORIBL_SURF_VALUE_3',1,zhook_handle)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
subroutine horibl_surf_value(KILEN, KOLEN, PAROUT, OINTERP, PARIN, KLSMIN, POLO, POLA, PLA, PLOP, KMASKIN, KLSMOUT)