subroutine test_regrid_3d(this)
class(ESMF_TestMethod), intent(inout) :: this
type(GeomManager) :: geom_mgr
type(RegridderManager), target :: regridder_mgr
type(RegridderSpec) :: spec
integer :: status
class(Regridder), pointer :: my_regridder
type(ESMF_Geom) :: geom_1, geom_2
type(ESMF_HConfig) :: hconfig
type(ESMF_Field) :: f1, f2
real(kind=ESMF_KIND_R4), pointer :: x1(:,:,:)
real(kind=ESMF_KIND_R4), pointer :: x2(:,:,:)
type(DynamicMask) :: dyn_mask
geom_mgr = GeomManager()
regridder_mgr = RegridderManager()
hconfig = ESMF_HConfigCreate(content="{class: latlon, im_world: 12, jm_world: 11, pole: PC, dateline: DE, nx: 1, ny: 1}", _RC)
geom_1 = make_geom(geom_mgr, hconfig, _RC)
hconfig = ESMF_HConfigCreate(content="{class: latlon, im_world: 6, jm_world: 5, pole: PC, dateline: DE, nx: 1, ny: 1}", _RC)
geom_2 = make_geom(geom_mgr, hconfig, _RC) ! variant of geom_1
dyn_mask = DynamicMask(mask_type='missing_value', src_mask_value=real(MAPL_UNDEF,kind=ESMF_KIND_R8), handleAllElements=.true.,_RC)
spec = RegridderSpec(EsmfRegridderParam(regridmethod=ESMF_REGRIDMETHOD_CONSERVE, dyn_mask=dyn_mask), geom_1, geom_2)
my_regridder => regridder_mgr%get_regridder(spec, _RC)
f1 = make_field(geom_1, 'f1', value=2._ESMF_KIND_R4, lm=2, _RC)
call ESMF_FieldGet(f1, farrayptr=x1)
x1(::4,6,1) = MAPL_UNDEF ! missing bits in level 1
x1(1::2,:,2) = 0 ! checkerboard on level 2
f2 = make_field(geom_2, 'f2', value=0._ESMF_KIND_R4, lm=2, _RC)
call my_regridder%regrid(f1, f2, _RC)
call ESMF_FieldGet(f2, farrayptr=x2, _RC)
! Missing elements case
@assert_that(x2(1:2,:,1), every_item(is(equal_to(2._ESMF_KIND_R4))))
! Non missing elements case
! Weirdly this introduces roundoff that was not present in the
! previous test. This has been reported to the ESMF core team.
@assert_that(x2(:,:,2), every_item(is(near(1._ESMF_KIND_R4, 1.e-6))))
end subroutine test_regrid_3d