6 SUBROUTINE bilin (KLUOUT,PX1,PY1,PFIELD1,PX2,PY2,PFIELD2,OINTERP)
86 USE modi_hor_extrapol_surf_cheap
91 USE yomhook
,ONLY : lhook, dr_hook
92 USE parkind1
,ONLY : jprb
98 INTEGER,
INTENT(IN) :: kluout
99 REAL,
DIMENSION(:),
INTENT(IN) :: px1
100 REAL,
DIMENSION(:),
INTENT(IN) :: py1
101 REAL,
DIMENSION(:,:),
INTENT(IN) :: pfield1
102 REAL,
DIMENSION(:),
INTENT(IN) :: px2
103 REAL,
DIMENSION(:),
INTENT(IN) :: py2
104 REAL,
DIMENSION(:),
INTENT(OUT) :: pfield2
105 LOGICAL,
DIMENSION(:),
INTENT(IN) :: ointerp
111 REAL,
DIMENSION (:,:),
ALLOCATABLE :: zw
113 REAL,
DIMENSION (:,:),
ALLOCATABLE :: zw_field
114 REAL,
DIMENSION (:,:),
ALLOCATABLE :: zfield_x
115 REAL,
DIMENSION (:,:),
ALLOCATABLE :: zfield_y
116 REAL,
DIMENSION (:,:),
ALLOCATABLE :: zfield_xy
117 REAL,
DIMENSION (SIZE(PX1)+1) :: zx
118 REAL,
DIMENSION (SIZE(PY1)+1) :: zy
120 INTEGER,
DIMENSION(SIZE(PFIELD2)) :: ici, icj
138 REAL(KIND=JPRB) :: zhook_handle
141 IF (lhook) CALL dr_hook(
'BILIN_1',0,zhook_handle)
148 ALLOCATE(zw(iiu,iju))
149 WHERE (pfield1/=xundef)
157 ALLOCATE(zw_field(iiu,iju))
165 ALLOCATE(zfield_x(iiu+1,iju))
171 zfield_x(2:iiu ,:) = (zw_field(1:iiu-1,:)+zw_field(2:iiu,:)) &
172 / max(zw(1:iiu-1,:)+zw(2:iiu,:),zeps)
173 zfield_x(1 ,:) = zw_field(1 ,:)
174 zfield_x( iiu+1,:) = zw_field(iiu,:)
180 WHERE ( pfield1(1:iiu,:)==0.)
181 zfield_x(1:iiu,:) = 0.
184 WHERE ( pfield1(1:iiu,:)==0.)
185 zfield_x(2:iiu+1,:) = 0.
193 ALLOCATE(zfield_y(iiu,iju+1))
199 zfield_y(:,2:iju ) = (zw_field(:,1:iju-1)+zw_field(:,2:iju)) &
200 / max(zw(:,1:iju-1)+zw(:,2:iju),zeps)
201 zfield_y(:,1 ) = zw_field(:,1 )
202 zfield_y(:, iju+1) = zw_field(:, iju )
208 WHERE ( pfield1(:,1:iju)==0.)
209 zfield_y(:,1:iju) = 0.
212 WHERE ( pfield1(:,1:iju)==0.)
213 zfield_y(:,2:iju+1) = 0.
221 ALLOCATE(zfield_xy(iiu+1,iju+1))
227 IF (iiu>1 .AND. iju>1) &
228 zfield_xy(2:iiu ,2:iju ) = ( zw_field(1:iiu-1,1:iju-1) &
229 + zw_field(1:iiu-1,2:iju ) &
230 + zw_field(2:iiu ,1:iju-1) &
231 + zw_field(2:iiu ,2:iju ) ) &
232 / max( zw(1:iiu-1,1:iju-1) &
233 + zw(1:iiu-1,2:iju ) &
234 + zw(2:iiu ,1:iju-1) &
235 + zw(2:iiu ,2:iju ) , zeps)
238 zfield_xy(1 ,2:iju ) = ( zw_field(1 ,1:iju-1) &
239 + zw_field(1 ,2:iju ) ) &
240 / max( zw(1 ,1:iju-1) &
241 + zw(1 ,2:iju ) , zeps)
244 zfield_xy( iiu+1,2:iju ) = ( zw_field(iiu ,1:iju-1) &
245 + zw_field(iiu ,2:iju ) ) &
246 / max( zw(iiu ,1:iju-1) &
247 + zw(iiu ,2:iju ) , zeps)
250 zfield_xy(2:iiu ,1 ) = ( zw_field(1:iiu-1,1 ) &
251 + zw_field(2:iiu ,1 ) ) &
252 / max( zw(1:iiu-1,1 ) &
253 + zw(2:iiu ,1 ) , zeps)
256 zfield_xy(2:iiu ,iju+1 ) = ( zw_field(1:iiu-1,iju ) &
257 + zw_field(2:iiu ,iju ) ) &
258 / max( zw(1:iiu-1,iju ) &
259 + zw(2:iiu ,iju ) , zeps)
261 zfield_xy(1 ,1 ) = ( pfield1(1 ,1 ) )
262 zfield_xy(iiu+1 ,1 ) = ( pfield1(iiu ,1 ) )
263 zfield_xy(1 ,iju+1 ) = ( pfield1(1 ,iju ) )
264 zfield_xy(iiu+1 ,iju+1 ) = ( pfield1(iiu ,iju ) )
269 WHERE ( pfield1(1:iiu,1:iju)==0.)
270 zfield_xy(1:iiu,1:iju) = 0.
273 WHERE ( pfield1(1:iiu,1:iju)==0.)
274 zfield_xy(1:iiu,2:iju+1) = 0.
277 WHERE ( pfield1(1:iiu,1:iju)==0.)
278 zfield_xy(2:iiu+1,1:iju) = 0.
281 WHERE ( pfield1(1:iiu,1:iju)==0.)
282 zfield_xy(2:iiu+1,2:iju+1) = 0.
291 zx(iiu+1) = 1.5*px1(iiu) -0.5*px1(iiu-1)
292 zx(2:iiu) = 0.5*px1(1:iiu-1)+0.5*px1(2:iiu)
293 zx(1) = 1.5*px1(1) -0.5*px1(2)
295 zx(1) = px1(1) - 1.e6
296 zx(2) = px1(1) + 1.e6
300 zy(iju+1) = 1.5*py1(iju) -0.5*py1(iju-1)
301 zy(2:iju) = 0.5*py1(1:iju-1)+0.5*py1(2:iju)
302 zy(1) = 1.5*py1(1) -0.5*py1(2)
304 zy(1) = py1(1) - 1.e6
305 zy(2) = py1(1) + 1.e6
317 IF (lhook) CALL dr_hook(
'BILIN_1',1,zhook_handle)
318 IF (lhook) CALL dr_hook(
'BILIN_2',0,zhook_handle)
323 DO jl=1,
SIZE(pfield2)
325 IF (zx(jj)<=px2(jl))
THEN
331 IF (zy(jj)<=py2(jl))
THEN
339 IF (lhook) CALL dr_hook(
'BILIN_2',1,zhook_handle)
340 IF (lhook) CALL dr_hook(
'BILIN_3',0,zhook_handle)
342 DO jl=1,
SIZE(pfield2,1)
347 ji=max(min(ji,iiu),0)
348 IF (px1(ji)<=px2(jl))
THEN
349 zc2_x = (px2(jl)-zx(ji+1))/(px1(ji)-zx(ji+1))
350 zc2_x = max(min(zc2_x,1.),0.)
354 zc2_x = (px2(jl)-zx(ji))/(px1(ji)-zx(ji))
355 zc2_x = max(min(zc2_x,1.),0.)
363 jj=max(min(jj,iju),0)
364 IF (py1(jj)<=py2(jl))
THEN
365 zc2_y = (py2(jl)-zy(jj+1))/(py1(jj)-zy(jj+1))
366 zc2_y = max(min(zc2_y,1.),0.)
370 zc2_y = (py2(jl)-zy(jj))/(py1(jj)-zy(jj))
371 zc2_y = max(min(zc2_y,1.),0.)
378 IF(pfield1(ji,jj) /= xundef) &
380 zc1_y * ( zc1_x * zfield_xy(ji ,jj ) &
381 + zc2_x * zfield_y(ji ,jj ) &
382 + zc3_x * zfield_xy(ji+1,jj ) ) &
383 + zc2_y * ( zc1_x * zfield_x(ji ,jj ) &
384 + zc2_x * pfield1(ji ,jj ) &
385 + zc3_x * zfield_x(ji+1,jj ) ) &
386 + zc3_y * ( zc1_x * zfield_xy(ji ,jj+1) &
387 + zc2_x * zfield_y(ji ,jj+1) &
388 + zc3_x * zfield_xy(ji+1,jj+1) )
392 IF (lhook) CALL dr_hook(
'BILIN_3',1,zhook_handle)
393 IF (lhook) CALL dr_hook(
'BILIN_4',0,zhook_handle)
399 DEALLOCATE(zfield_x )
400 DEALLOCATE(zfield_y )
401 DEALLOCATE(zfield_xy)
405 WHERE(abs(pfield2-xundef)<1.e-6) pfield2=xundef
413 IF (count(pfield2(:)==xundef .AND. ointerp(:))==0 .AND. lhook) CALL dr_hook(
'BILIN',1,zhook_handle)
414 IF (count(pfield2(:)==xundef .AND. ointerp(:))==0)
RETURN
417 IF (count(pfield1(:,:)/=xundef)==0 .AND. lhook) CALL dr_hook(
'BILIN',1,zhook_handle)
418 IF (count(pfield1(:,:)/=xundef)==0)
RETURN
420 WRITE(kluout,*)
' Remaining horizontal extrapolations'
421 WRITE(kluout,*)
' Total number of input data : ',count(pfield1(:,:)/=xundef)
422 WRITE(kluout,*)
' Number of points to interpolate: ',count(pfield2(:)==xundef .AND. ointerp(:))
428 IF (lhook) CALL dr_hook(
'BILIN_4',1,zhook_handle)
subroutine bilin(KLUOUT, PX1, PY1, PFIELD1, PX2, PY2, PFIELD2, OINTERP)