22 interp_method, num_nbrs, max_dist, src_modulo, &
23 grid_at_center, mask_in, mask_out)
26 type(horiz_interp_type),
intent(inout) :: Interp
27 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_in , lat_in
28 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_out, lat_out
29 integer,
intent(in),
optional :: verbose
30 character(len=*),
intent(in),
optional :: interp_method
31 integer,
intent(in),
optional :: num_nbrs
32 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
33 logical,
intent(in),
optional :: src_modulo
34 logical,
intent(in),
optional :: grid_at_center
35 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
36 real(FMS_HI_KIND_),
intent(inout),
dimension(:,:),
optional :: mask_out
38 real(FMS_HI_KIND_),
dimension(:,:),
allocatable :: lon_src, lat_src, lon_dst, lat_dst
39 real(FMS_HI_KIND_),
dimension(:),
allocatable :: lon_src_1d, lat_src_1d, lon_dst_1d, lat_dst_1d
40 integer :: i, j, nlon_in, nlat_in, nlon_out, nlat_out
42 character(len=40) :: method
43 integer,
parameter :: kindl = fms_hi_kind_
45 call horiz_interp_init
47 method =
'conservative'
48 if(
present(interp_method)) method = interp_method
50 select case (trim(method))
52 interp%interp_method = conserve
53 call horiz_interp_conserve_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose)
55 interp%interp_method = bilinear
57 if(
present(grid_at_center) ) center = grid_at_center
59 nlon_out =
size(lon_out(:)); nlat_out =
size(lat_out(:))
60 allocate(lon_dst(nlon_out,nlat_out), lat_dst(nlon_out,nlat_out))
62 lon_dst(i,:) = lon_out(i)
65 lat_dst(:,j) = lat_out(j)
68 call horiz_interp_bilinear_new ( interp, lon_in, lat_in, lon_dst, lat_dst, &
70 deallocate(lon_dst, lat_dst)
72 nlon_in =
size(lon_in(:))-1; nlat_in =
size(lat_in(:))-1
73 nlon_out =
size(lon_out(:))-1; nlat_out =
size(lat_out(:))-1
74 allocate(lon_src_1d(nlon_in), lat_src_1d(nlat_in))
75 allocate(lon_dst(nlon_out,nlat_out), lat_dst(nlon_out,nlat_out))
77 lon_src_1d(i) = (lon_in(i) + lon_in(i+1)) * 0.5_kindl
80 lat_src_1d(j) = (lat_in(j) + lat_in(j+1)) * 0.5_kindl
83 lon_dst(i,:) = (lon_out(i) + lon_out(i+1)) * 0.5_kindl
86 lat_dst(:,j) = (lat_out(j) + lat_out(j+1)) * 0.5_kindl
88 call horiz_interp_bilinear_new ( interp, lon_src_1d, lat_src_1d, lon_dst, lat_dst, &
90 deallocate(lon_src_1d, lat_src_1d, lon_dst, lat_dst)
93 interp%interp_method = bicubic
95 if(
present(grid_at_center) ) center = grid_at_center
98 call horiz_interp_bicubic_new ( interp, lon_in, lat_in, lon_out, lat_out, &
101 nlon_in =
size(lon_in(:))-1; nlat_in =
size(lat_in(:))-1
102 nlon_out =
size(lon_out(:))-1; nlat_out =
size(lat_out(:))-1
103 allocate(lon_src_1d(nlon_in), lat_src_1d(nlat_in))
104 allocate(lon_dst_1d(nlon_out), lat_dst_1d(nlat_out))
106 lon_src_1d(i) = (lon_in(i) + lon_in(i+1)) * 0.5_kindl
109 lat_src_1d(j) = (lat_in(j) + lat_in(j+1)) * 0.5_kindl
112 lon_dst_1d(i) = (lon_out(i) + lon_out(i+1)) * 0.5_kindl
115 lat_dst_1d(j) = (lat_out(j) + lat_out(j+1)) * 0.5_kindl
117 call horiz_interp_bicubic_new ( interp, lon_src_1d, lat_src_1d, lon_dst_1d, lat_dst_1d, &
119 deallocate(lon_src_1d, lat_src_1d, lon_dst_1d, lat_dst_1d)
122 interp%interp_method = spherical
123 nlon_in =
size(lon_in(:)); nlat_in =
size(lat_in(:))
124 nlon_out =
size(lon_out(:)); nlat_out =
size(lat_out(:))
125 allocate(lon_src(nlon_in,nlat_in), lat_src(nlon_in,nlat_in))
126 allocate(lon_dst(nlon_out,nlat_out), lat_dst(nlon_out,nlat_out))
128 lon_src(i,:) = lon_in(i)
131 lat_src(:,j) = lat_in(j)
134 lon_dst(i,:) = lon_out(i)
137 lat_dst(:,j) = lat_out(j)
139 call horiz_interp_spherical_new ( interp, lon_src, lat_src, lon_dst, lat_dst, &
140 num_nbrs, max_dist, src_modulo)
141 deallocate(lon_src, lat_src, lon_dst, lat_dst)
143 call mpp_error(fatal,
'horiz_interp_mod: interp_method should be conservative, bilinear, bicubic, spherical')
147 interp% HI_KIND_TYPE_ % is_allocated = .true.
148 interp%I_am_initialized = .true.
155 verbose, interp_method, num_nbrs, max_dist, &
156 src_modulo, grid_at_center, mask_in, mask_out, is_latlon_out )
158 type(horiz_interp_type),
intent(inout) :: Interp
159 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_in , lat_in
160 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_out, lat_out
161 integer,
intent(in),
optional :: verbose
162 character(len=*),
intent(in),
optional :: interp_method
163 integer,
intent(in),
optional :: num_nbrs
164 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
165 logical,
intent(in),
optional :: src_modulo
166 logical,
intent(in),
optional :: grid_at_center
167 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
168 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
169 logical,
intent(in),
optional :: is_latlon_out
171 real(FMS_HI_KIND_),
dimension(:,:),
allocatable :: lon_src, lat_src
172 real(FMS_HI_KIND_),
dimension(:),
allocatable :: lon_src_1d, lat_src_1d
173 integer :: i, j, nlon_in, nlat_in
174 character(len=40) :: method
176 logical :: dst_is_latlon
177 integer,
parameter :: kindl = fms_hi_kind_
179 call horiz_interp_init
181 method =
'conservative'
182 if(
present(interp_method)) method = interp_method
184 select case (trim(method))
185 case (
"conservative")
186 interp%interp_method = conserve
188 if(
PRESENT(is_latlon_out))
then
189 dst_is_latlon = is_latlon_out
191 dst_is_latlon = is_lat_lon(lon_out, lat_out)
193 if(dst_is_latlon )
then
194 if(
present(mask_in))
then
195 if ( any(mask_in < -.0001_kindl) .or. any(mask_in > 1.0001_kindl)) &
196 call mpp_error(fatal, &
197 'horiz_interp_conserve_new_1d_src(horiz_interp_conserve_mod): input mask not between 0,1')
198 allocate(interp%HI_KIND_TYPE_%mask_in(
size(mask_in,1),
size(mask_in,2)) )
199 interp%HI_KIND_TYPE_%mask_in = mask_in
201 call horiz_interp_conserve_new ( interp, lon_in, lat_in, lon_out(:,1), lat_out(1,:), &
204 call horiz_interp_conserve_new ( interp, lon_in, lat_in, lon_out, lat_out, &
205 verbose=verbose, mask_in=mask_in, mask_out=mask_out )
208 interp%interp_method = bilinear
210 if(
present(grid_at_center) ) center = grid_at_center
212 call horiz_interp_bilinear_new ( interp, lon_in, lat_in, lon_out, lat_out, &
213 verbose, src_modulo )
215 nlon_in =
size(lon_in(:))-1; nlat_in =
size(lat_in(:))-1
216 allocate(lon_src_1d(nlon_in), lat_src_1d(nlat_in))
218 lon_src_1d(i) = (lon_in(i) + lon_in(i+1)) * 0.5_kindl
221 lat_src_1d(j) = (lat_in(j) + lat_in(j+1)) * 0.5_kindl
223 call horiz_interp_bilinear_new ( interp, lon_src_1d, lat_src_1d, lon_out, lat_out, &
224 verbose, src_modulo )
225 deallocate(lon_src_1d,lat_src_1d)
228 interp%interp_method = bicubic
230 if(
present(grid_at_center) ) center = grid_at_center
232 call horiz_interp_bicubic_new ( interp, lon_in, lat_in, lon_out, lat_out, &
233 verbose, src_modulo )
235 nlon_in =
size(lon_in(:))-1; nlat_in =
size(lat_in(:))-1
236 allocate(lon_src_1d(nlon_in), lat_src_1d(nlat_in))
238 lon_src_1d(i) = (lon_in(i) + lon_in(i+1)) * 0.5_kindl
241 lat_src_1d(j) = (lat_in(j) + lat_in(j+1)) * 0.5_kindl
243 call horiz_interp_bicubic_new ( interp, lon_src_1d, lat_src_1d, lon_out, lat_out, &
244 verbose, src_modulo )
245 deallocate(lon_src_1d,lat_src_1d)
248 interp%interp_method = spherical
249 nlon_in =
size(lon_in(:)); nlat_in =
size(lat_in(:))
250 allocate(lon_src(nlon_in,nlat_in), lat_src(nlon_in,nlat_in))
252 lon_src(i,:) = lon_in(i)
255 lat_src(:,j) = lat_in(j)
257 call horiz_interp_spherical_new ( interp, lon_src, lat_src, lon_out, lat_out, &
258 num_nbrs, max_dist, src_modulo)
259 deallocate(lon_src, lat_src)
261 call mpp_error(fatal,
'interp_method should be conservative, bilinear, bicubic, spherical')
265 interp% HI_KIND_TYPE_ % is_allocated = .true.
266 interp%I_am_initialized = .true.
272 subroutine horiz_interp_new_2d_ (Interp, lon_in, lat_in, lon_out, lat_out, &
273 verbose, interp_method, num_nbrs, max_dist, &
274 src_modulo, mask_in, mask_out, is_latlon_in, is_latlon_out )
275 type(horiz_interp_type),
intent(inout) :: Interp
276 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_in , lat_in
277 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_out, lat_out
278 integer,
intent(in),
optional :: verbose
279 character(len=*),
intent(in),
optional :: interp_method
280 integer,
intent(in),
optional :: num_nbrs
281 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
282 logical,
intent(in),
optional :: src_modulo
283 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
284 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
285 logical,
intent(in),
optional :: is_latlon_in, is_latlon_out
286 logical :: src_is_latlon, dst_is_latlon
287 character(len=40) :: method
288 integer,
parameter :: kindl = fms_hi_kind_
290 call horiz_interp_init
293 if(
present(interp_method)) method = interp_method
295 select case (trim(method))
296 case (
"conservative")
297 interp%interp_method = conserve
298 if(
PRESENT(is_latlon_in))
then
299 src_is_latlon = is_latlon_in
301 src_is_latlon = is_lat_lon(lon_in, lat_in)
303 if(
PRESENT(is_latlon_out))
then
304 dst_is_latlon = is_latlon_out
306 dst_is_latlon = is_lat_lon(lon_out, lat_out)
308 if(src_is_latlon .AND. dst_is_latlon)
then
309 if(
present(mask_in))
then
310 if ( any(mask_in < -0.0001_kindl) .or. any(mask_in > 1.0001_kindl))
then
311 call mpp_error(fatal,
'horiz_interp_conserve_new_2d(horiz_interp_conserve_mod):' // &
312 ' input mask not between 0,1')
314 allocate(interp%HI_KIND_TYPE_%mask_in(
size(mask_in,1),
size(mask_in,2)) )
315 interp%HI_KIND_TYPE_%mask_in = mask_in
317 call horiz_interp_conserve_new ( interp, lon_in(:,1), lat_in(1,:), lon_out(:,1), lat_out(1,:), &
319 else if(src_is_latlon)
then
320 call horiz_interp_conserve_new ( interp, lon_in(:,1), lat_in(1,:), lon_out, lat_out, &
321 verbose=verbose, mask_in=mask_in, mask_out=mask_out )
322 else if(dst_is_latlon)
then
323 call horiz_interp_conserve_new ( interp, lon_in, lat_in, lon_out(:,1), lat_out(1,:), &
324 verbose=verbose, mask_in=mask_in, mask_out=mask_out )
326 call horiz_interp_conserve_new ( interp, lon_in, lat_in, lon_out, lat_out, &
327 verbose=verbose, mask_in=mask_in, mask_out=mask_out )
331 interp%interp_method = spherical
332 call horiz_interp_spherical_new ( interp, lon_in, lat_in, lon_out, lat_out, &
333 num_nbrs, max_dist, src_modulo )
335 interp%interp_method = bilinear
336 call horiz_interp_bilinear_new ( interp, lon_in, lat_in, lon_out, lat_out, &
337 verbose, src_modulo )
339 call mpp_error(fatal,
'when source grid are 2d, interp_method should be spherical or bilinear')
342 interp% HI_KIND_TYPE_ % is_allocated = .true.
343 interp%I_am_initialized = .true.
345 end subroutine horiz_interp_new_2d_
348 subroutine horiz_interp_new_1d_dst_ (Interp, lon_in, lat_in, lon_out, lat_out, &
349 verbose, interp_method, num_nbrs, max_dist, src_modulo, mask_in, mask_out, is_latlon_in )
350 type(horiz_interp_type),
intent(inout) :: Interp
351 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_in , lat_in
352 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_out, lat_out
353 integer,
intent(in),
optional :: verbose
354 character(len=*),
intent(in),
optional :: interp_method
355 integer,
intent(in),
optional :: num_nbrs
356 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
357 logical,
intent(in),
optional :: src_modulo
358 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
359 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
360 logical,
intent(in),
optional :: is_latlon_in
362 character(len=40) :: method
363 integer,
parameter :: kindl = fms_hi_kind_
365 integer :: i, j, nlon_out, nlat_out
366 real(FMS_HI_KIND_),
dimension(:,:),
allocatable :: lon_dst, lat_dst
367 logical :: src_is_latlon
369 call horiz_interp_init
372 if(
present(interp_method)) method = interp_method
374 nlon_out =
size(lon_out(:)); nlat_out =
size(lat_out(:))
375 allocate(lon_dst(nlon_out,nlat_out), lat_dst(nlon_out,nlat_out))
377 lon_dst(i,:) = lon_out(i)
380 lat_dst(:,j) = lat_out(j)
383 select case (trim(method))
384 case (
"conservative")
385 interp%interp_method = conserve
386 if(
PRESENT(is_latlon_in))
then
387 src_is_latlon = is_latlon_in
389 src_is_latlon = is_lat_lon(lon_in, lat_in)
392 if(src_is_latlon)
then
393 if(
present(mask_in))
then
394 if ( any(mask_in < -0.0001_kindl) .or. any(mask_in > 1.0001_kindl)) &
395 call mpp_error(fatal, &
396 'horiz_interp_conserve_new_1d_dst(horiz_interp_conserve_mod): input mask not between 0,1')
397 allocate(interp%HI_KIND_TYPE_%mask_in(
size(mask_in,1),
size(mask_in,2)) )
398 interp%HI_KIND_TYPE_%mask_in = mask_in
400 call horiz_interp_conserve_new ( interp, lon_in(:,1), lat_in(1,:), lon_out, lat_out, &
403 call horiz_interp_conserve_new ( interp, lon_in, lat_in, lon_out, lat_out, &
404 verbose=verbose, mask_in=mask_in, mask_out=mask_out )
407 interp%interp_method = bilinear
408 call horiz_interp_bilinear_new ( interp, lon_in, lat_in, lon_dst, lat_dst, &
409 verbose, src_modulo )
411 interp%interp_method = spherical
412 call horiz_interp_spherical_new ( interp, lon_in, lat_in, lon_dst, lat_dst, &
413 num_nbrs, max_dist, src_modulo)
415 call mpp_error(fatal,
'when source grid are 2d, interp_method should be spherical or bilinear')
418 deallocate(lon_dst,lat_dst)
420 interp% HI_KIND_TYPE_ % is_allocated = .true.
421 interp%I_am_initialized = .true.
423 end subroutine horiz_interp_new_1d_dst_
427 subroutine horiz_interp_base_2d_ ( Interp, data_in, data_out, verbose, &
428 mask_in, mask_out, missing_value, missing_permit, &
429 err_msg, new_missing_handle )
431 type (horiz_interp_type),
intent(in) :: Interp
432 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: data_in
433 real(FMS_HI_KIND_),
intent(out),
dimension(:,:) :: data_out
434 integer,
intent(in),
optional :: verbose
435 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
436 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
437 real(FMS_HI_KIND_),
intent(in),
optional :: missing_value
438 integer,
intent(in),
optional :: missing_permit
439 character(len=*),
intent(out),
optional :: err_msg
440 logical,
intent(in),
optional :: new_missing_handle
442 if(
present(err_msg)) err_msg =
''
443 if(.not.interp%I_am_initialized)
then
444 if(fms_error_handler(
'horiz_interp',
'The horiz_interp_type variable is not initialized',err_msg))
return
447 select case(interp%interp_method)
449 call horiz_interp_conserve(interp,data_in, data_out, verbose, mask_in, mask_out)
451 call horiz_interp_bilinear(interp,data_in, data_out, verbose, mask_in, mask_out, &
452 missing_value, missing_permit, new_missing_handle )
454 call horiz_interp_bicubic(interp,data_in, data_out, verbose, mask_in, mask_out, &
455 missing_value, missing_permit )
457 call horiz_interp_spherical(interp,data_in, data_out, verbose, mask_in, mask_out, &
460 call mpp_error(fatal,
'interp_method should be conservative, bilinear, bicubic, spherical')
465 end subroutine horiz_interp_base_2d_
473 missing_value, missing_permit, err_msg )
479 type (horiz_interp_type),
intent(in) :: Interp
480 real(FMS_HI_KIND_),
intent(in),
dimension(:,:,:) :: data_in
481 real(FMS_HI_KIND_),
intent(out),
dimension(:,:,:) :: data_out
482 integer,
intent(in),
optional :: verbose
483 real(FMS_HI_KIND_),
intent(in),
dimension(:,:,:),
optional :: mask_in
484 real(FMS_HI_KIND_),
intent(out),
dimension(:,:,:),
optional :: mask_out
485 real(FMS_HI_KIND_),
intent(in),
optional :: missing_value
486 integer,
intent(in),
optional :: missing_permit
487 character(len=*),
intent(out),
optional :: err_msg
491 if(
present(err_msg)) err_msg =
''
492 if(.not.interp%I_am_initialized)
then
493 if(fms_error_handler(
'horiz_interp',
'The horiz_interp_type variable is not initialized',err_msg))
return
496 do n = 1,
size(data_in,3)
497 if (
present(mask_in))
then
498 if(
present(mask_out))
then
499 call horiz_interp( interp, data_in(:,:,n), data_out(:,:,n), &
500 verbose, mask_in(:,:,n), mask_out(:,:,n), &
501 missing_value, missing_permit )
503 call horiz_interp( interp, data_in(:,:,n), data_out(:,:,n), &
504 verbose, mask_in(:,:,n), missing_value = missing_value, &
505 missing_permit = missing_permit )
508 if(
present(mask_out))
then
509 call horiz_interp( interp, data_in(:,:,n), data_out(:,:,n), &
510 verbose, mask_out=mask_out(:,:,n), missing_value = missing_value, &
511 missing_permit = missing_permit )
513 call horiz_interp( interp, data_in(:,:,n), data_out(:,:,n), &
514 verbose, missing_value = missing_value, &
515 missing_permit = missing_permit )
530 data_out, verbose, mask_in, mask_out, &
531 interp_method, missing_value, missing_permit, &
532 num_nbrs, max_dist,src_modulo, grid_at_center )
534 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: data_in
535 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_in , lat_in
536 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_out, lat_out
537 real(FMS_HI_KIND_),
intent(out),
dimension(:,:) :: data_out
538 integer,
intent(in),
optional :: verbose
539 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
540 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
541 character(len=*),
intent(in),
optional :: interp_method
542 real(FMS_HI_KIND_),
intent(in),
optional :: missing_value
543 integer,
intent(in),
optional :: missing_permit
544 integer,
intent(in),
optional :: num_nbrs
545 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
546 logical,
intent(in),
optional :: src_modulo
547 logical,
intent(in),
optional :: grid_at_center
549 type (horiz_interp_type) :: Interp
551 call horiz_interp_init
553 call horiz_interp_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose, &
554 interp_method, num_nbrs, max_dist, src_modulo, grid_at_center )
556 call horiz_interp ( interp, data_in, data_out, verbose, &
557 mask_in, mask_out, missing_value, missing_permit )
559 call horiz_interp_del ( interp )
570 data_out, verbose, mask_in, mask_out, &
571 interp_method, missing_value, missing_permit, &
572 num_nbrs, max_dist, src_modulo, grid_at_center )
574 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: data_in
575 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_in , lat_in
576 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_out, lat_out
577 real(FMS_HI_KIND_),
intent(out),
dimension(:,:) :: data_out
578 integer,
intent(in),
optional :: verbose
579 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
580 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
581 character(len=*),
intent(in),
optional :: interp_method
582 real(FMS_HI_KIND_),
intent(in),
optional :: missing_value
583 integer,
intent(in),
optional :: missing_permit
584 integer,
intent(in),
optional :: num_nbrs
585 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
586 logical,
intent(in),
optional :: src_modulo
587 logical,
intent(in),
optional :: grid_at_center
590 type (horiz_interp_type) :: Interp
591 logical :: dst_is_latlon
592 character(len=128) :: method
594 call horiz_interp_init
595 method =
'conservative'
596 if(
present(interp_method)) method = interp_method
597 dst_is_latlon = .true.
598 if(trim(method) ==
'conservative') dst_is_latlon = is_lat_lon(lon_out, lat_out)
600 if(dst_is_latlon)
then
601 call horiz_interp_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose, &
602 interp_method, num_nbrs, max_dist, src_modulo, &
603 grid_at_center, is_latlon_out = dst_is_latlon )
604 call horiz_interp ( interp, data_in, data_out, verbose, &
605 mask_in, mask_out, missing_value, missing_permit )
607 call horiz_interp_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose, &
608 interp_method, num_nbrs, max_dist, src_modulo, &
609 grid_at_center, mask_in, mask_out, is_latlon_out = dst_is_latlon)
611 call horiz_interp ( interp, data_in, data_out, verbose, &
612 missing_value=missing_value, missing_permit=missing_permit )
615 call horiz_interp_del ( interp )
627 verbose, mask_in, mask_out, interp_method, missing_value,&
628 missing_permit, num_nbrs, max_dist, src_modulo )
630 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: data_in
631 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_in , lat_in
632 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_out, lat_out
633 real(FMS_HI_KIND_),
intent(out),
dimension(:,:) :: data_out
634 integer,
intent(in),
optional :: verbose
635 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
636 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
637 character(len=*),
intent(in),
optional :: interp_method
638 real(FMS_HI_KIND_),
intent(in),
optional :: missing_value
639 integer,
intent(in),
optional :: missing_permit
640 integer,
intent(in),
optional :: num_nbrs
641 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
642 logical,
intent(in),
optional :: src_modulo
644 type (horiz_interp_type) :: Interp
645 logical :: dst_is_latlon, src_is_latlon
646 character(len=128) :: method
648 call horiz_interp_init
650 method =
'conservative'
651 if(
present(interp_method)) method = interp_method
652 dst_is_latlon = .true.
653 src_is_latlon = .true.
654 if(trim(method) ==
'conservative')
then
655 dst_is_latlon = is_lat_lon(lon_out, lat_out)
656 src_is_latlon = is_lat_lon(lon_in, lat_in)
659 if(dst_is_latlon .and. src_is_latlon)
then
660 call horiz_interp_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose, &
661 interp_method, num_nbrs, max_dist, src_modulo, &
662 is_latlon_in=dst_is_latlon, is_latlon_out = dst_is_latlon )
663 call horiz_interp ( interp, data_in, data_out, verbose, &
664 mask_in, mask_out, missing_value, missing_permit )
666 call horiz_interp_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose, &
667 interp_method, num_nbrs, max_dist, src_modulo, &
669 is_latlon_in=dst_is_latlon, is_latlon_out = dst_is_latlon)
670 call horiz_interp ( interp, data_in, data_out, verbose, &
671 missing_value=missing_value, missing_permit=missing_permit )
674 call horiz_interp_del ( interp )
686 verbose, mask_in, mask_out,interp_method,missing_value, &
687 missing_permit, num_nbrs, max_dist, src_modulo)
689 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: data_in
690 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: lon_in , lat_in
691 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_out, lat_out
692 real(FMS_HI_KIND_),
intent(out),
dimension(:,:) :: data_out
693 integer,
intent(in),
optional :: verbose
694 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
695 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
696 character(len=*),
intent(in),
optional :: interp_method
697 real(FMS_HI_KIND_),
intent(in),
optional :: missing_value
698 integer,
intent(in),
optional :: missing_permit
699 integer,
intent(in),
optional :: num_nbrs
700 real(FMS_HI_KIND_),
intent(in),
optional :: max_dist
701 logical,
intent(in),
optional :: src_modulo
703 type (horiz_interp_type) :: Interp
704 logical :: src_is_latlon
705 character(len=128) :: method
707 call horiz_interp_init
709 method =
'conservative'
710 if(
present(interp_method)) method = interp_method
711 src_is_latlon = .true.
712 if(trim(method) ==
'conservative') src_is_latlon = is_lat_lon(lon_in, lat_in)
714 if(src_is_latlon)
then
715 call horiz_interp_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose, &
716 interp_method, num_nbrs, max_dist, src_modulo, &
717 is_latlon_in = src_is_latlon )
718 call horiz_interp ( interp, data_in, data_out, verbose, &
719 mask_in, mask_out, missing_value, missing_permit )
721 call horiz_interp_new ( interp, lon_in, lat_in, lon_out, lat_out, verbose, &
722 interp_method, num_nbrs, max_dist, src_modulo, &
723 mask_in, mask_out, is_latlon_in = src_is_latlon)
725 call horiz_interp ( interp, data_in, data_out, verbose, &
726 missing_value=missing_value, missing_permit=missing_permit )
729 call horiz_interp_del ( interp )
739 lon_out, lat_out, data_out, &
740 verbose, mask_in, mask_out)
743 real(FMS_HI_KIND_),
intent(in),
dimension(:,:) :: data_in
745 real(FMS_HI_KIND_),
intent(in) :: wb
747 real(FMS_HI_KIND_),
intent(in) :: sb
749 real(FMS_HI_KIND_),
intent(in) :: dx
751 real(FMS_HI_KIND_),
intent(in) :: dy
753 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lon_out
757 real(FMS_HI_KIND_),
intent(in),
dimension(:) :: lat_out
761 real(FMS_HI_KIND_),
intent(out),
dimension(:,:) :: data_out
762 integer,
intent(in),
optional :: verbose
763 real(FMS_HI_KIND_),
intent(in),
dimension(:,:),
optional :: mask_in
764 real(FMS_HI_KIND_),
intent(out),
dimension(:,:),
optional :: mask_out
766 real(FMS_HI_KIND_),
dimension(size(data_in,1)+1) :: blon_in
767 real(FMS_HI_KIND_),
dimension(size(data_in,2)+1) :: blat_in
768 integer :: i, j, nlon_in, nlat_in
769 real(FMS_HI_KIND_) :: tpi
770 integer,
parameter :: kindl = fms_hi_kind_
772 call horiz_interp_init
774 tpi = 2.0_kindl * real(pi, fms_hi_kind_)
775 nlon_in =
size(data_in,1)
776 nlat_in =
size(data_in,2)
779 blon_in(i) = wb + real(i-1, fms_hi_kind_)*dx
781 if (abs(blon_in(nlon_in+1)-blon_in(1)-tpi) < epsilon(blon_in)) &
782 blon_in(nlon_in+1)=blon_in(1)+tpi
785 blat_in(j) = sb + real(j-1, fms_hi_kind_)*dy
787 blat_in(1) = -0.5_kindl * real(pi, fms_hi_kind_)
788 blat_in(nlat_in+1) = 0.5_kindl * real(pi, fms_hi_kind_)
791 call horiz_interp_solo_1d (data_in, blon_in, blat_in, &
792 lon_out, lat_out, data_out, &
793 verbose, mask_in, mask_out )
803 function is_lat_lon_(lon, lat)
804 real(FMS_HI_KIND_),
dimension(:,:),
intent(in) :: lon, lat
805 logical :: IS_LAT_LON_
806 integer :: i, j, nlon, nlat, num
811 loop_lat:
do j = 1, nlat
813 if(lat(i,j) .NE. lat(1,j))
then
814 is_lat_lon_ = .false.
821 loop_lon:
do i = 1, nlon
823 if(lon(i,j) .NE. lon(i,1))
then
824 is_lat_lon_ = .false.
832 if(is_lat_lon_) num = 1
837 is_lat_lon_ = .false.
841 end function is_lat_lon_
846 weight_file_source, interp_method, isw, iew, jsw, jew, nglon, nglat)
847 type(horiz_interp_type),
intent(inout) :: Interp
848 character(len=*),
intent(in) :: weight_filename
849 real(FMS_HI_KIND_),
intent(in) :: lat_out(:,:)
850 real(FMS_HI_KIND_),
intent(in) :: lon_out(:,:)
851 real(FMS_HI_KIND_),
intent(in) :: lat_in(:)
852 real(FMS_HI_KIND_),
intent(in) :: lon_in(:)
853 character(len=*),
intent(in) :: weight_file_source
854 character(len=*),
intent(in) :: interp_method
855 integer,
intent(in) :: isw, iew, jsw, jew
856 integer,
intent(in) :: nglon
857 integer,
intent(in) :: nglat
862 real(FMS_HI_KIND_),
allocatable :: lon_src_1d(:)
863 real(FMS_HI_KIND_),
allocatable :: lat_src_1d(:)
864 integer,
parameter :: kindl = fms_hi_kind_
866 select case (trim(interp_method))
872 nlon_in =
size(lon_in(:))-1; nlat_in =
size(lat_in(:))-1
873 allocate(lon_src_1d(nlon_in), lat_src_1d(nlat_in))
875 lon_src_1d(i) = (lon_in(i) + lon_in(i+1)) * 0.5_kindl
878 lat_src_1d(j) = (lat_in(j) + lat_in(j+1)) * 0.5_kindl
881 call horiz_interp_read_weights_bilinear(interp, weight_filename, lon_out, lat_out, &
882 lon_src_1d, lat_src_1d, weight_file_source, interp_method, &
883 isw, iew, jsw, jew, nglon, nglat)
884 deallocate(lon_src_1d,lat_src_1d)
886 call mpp_error(fatal,
"Reading weight from file is not supported for the "//&
887 trim(interp_method)//
" method. It is currently only supported for bilinear")
subroutine horiz_interp_solo_1d_dst_(data_in, lon_in, lat_in, lon_out, lat_out, data_out, verbose, mask_in, mask_out, interp_method, missing_value, missing_permit, num_nbrs, max_dist, src_modulo)
interpolates from any grid to rectangular longitude/latitude grid. interp_method should be "spherical...
subroutine horiz_interp_new_1d_src_(Interp, lon_in, lat_in, lon_out, lat_out, verbose, interp_method, num_nbrs, max_dist, src_modulo, grid_at_center, mask_in, mask_out, is_latlon_out)
subroutine horiz_interp_solo_1d_(data_in, lon_in, lat_in, lon_out, lat_out, data_out, verbose, mask_in, mask_out, interp_method, missing_value, missing_permit, num_nbrs, max_dist, src_modulo, grid_at_center)
Interpolates from a rectangular grid to rectangular grid. interp_method can be the value conservative...
subroutine horiz_interp_base_3d_(Interp, data_in, data_out, verbose, mask_in, mask_out, missing_value, missing_permit, err_msg)
Overload of interface HORIZ_INTERP_BASE_2D_ uses 3d arrays for data and mask this allows for multiple...
subroutine horiz_interp_read_weights_(Interp, weight_filename, lon_out, lat_out, lon_in, lat_in, weight_file_source, interp_method, isw, iew, jsw, jew, nglon, nglat)
Subroutine for reading a weight file and use it to fill in the horiz interp type for the bilinear int...
subroutine horiz_interp_new_1d_(Interp, lon_in, lat_in, lon_out, lat_out, verbose, interp_method, num_nbrs, max_dist, src_modulo, grid_at_center, mask_in, mask_out)
subroutine horiz_interp_solo_2d_(data_in, lon_in, lat_in, lon_out, lat_out, data_out, verbose, mask_in, mask_out, interp_method, missing_value, missing_permit, num_nbrs, max_dist, src_modulo)
Interpolates from any grid to any grid. interp_method should be "spherical" horiz_interp_new don't ne...
subroutine horiz_interp_solo_1d_src_(data_in, lon_in, lat_in, lon_out, lat_out, data_out, verbose, mask_in, mask_out, interp_method, missing_value, missing_permit, num_nbrs, max_dist, src_modulo, grid_at_center)
Interpolates from a uniformly spaced grid to any output grid. interp_method can be the value "onserva...
subroutine horiz_interp_solo_old_(data_in, wb, sb, dx, dy, lon_out, lat_out, data_out, verbose, mask_in, mask_out)
Overloaded version of interface horiz_interp_solo_2.