Test_FieldSpec.pf Source File


This file depends on

sourcefile~~test_fieldspec.pf~~EfferentGraph sourcefile~test_fieldspec.pf Test_FieldSpec.pf sourcefile~basicverticalgrid.f90 BasicVerticalGrid.F90 sourcefile~test_fieldspec.pf->sourcefile~basicverticalgrid.f90 sourcefile~esmf_utilities.f90 ESMF_Utilities.F90 sourcefile~test_fieldspec.pf->sourcefile~esmf_utilities.f90 sourcefile~fieldspec.f90~2 FieldSpec.F90 sourcefile~test_fieldspec.pf->sourcefile~fieldspec.f90~2 sourcefile~geom_mgr.f90 geom_mgr.F90 sourcefile~test_fieldspec.pf->sourcefile~geom_mgr.f90 sourcefile~ungriddeddim.f90 UngriddedDim.F90 sourcefile~test_fieldspec.pf->sourcefile~ungriddeddim.f90 sourcefile~ungriddeddims.f90 UngriddedDims.F90 sourcefile~test_fieldspec.pf->sourcefile~ungriddeddims.f90 sourcefile~ungriddeddimvector.f90 UngriddedDimVector.F90 sourcefile~test_fieldspec.pf->sourcefile~ungriddeddimvector.f90 sourcefile~verticaldimspec.f90 VerticalDimSpec.F90 sourcefile~test_fieldspec.pf->sourcefile~verticaldimspec.f90 sourcefile~errorhandling.f90 ErrorHandling.F90 sourcefile~basicverticalgrid.f90->sourcefile~errorhandling.f90 sourcefile~griddedcomponentdriver.f90 GriddedComponentDriver.F90 sourcefile~basicverticalgrid.f90->sourcefile~griddedcomponentdriver.f90 sourcefile~verticalgrid.f90 VerticalGrid.F90 sourcefile~basicverticalgrid.f90->sourcefile~verticalgrid.f90 sourcefile~esmf_utilities.f90->sourcefile~errorhandling.f90 sourcefile~fieldspec.f90~2->sourcefile~basicverticalgrid.f90 sourcefile~fieldspec.f90~2->sourcefile~esmf_utilities.f90 sourcefile~fieldspec.f90~2->sourcefile~geom_mgr.f90 sourcefile~fieldspec.f90~2->sourcefile~ungriddeddims.f90 sourcefile~fieldspec.f90~2->sourcefile~verticaldimspec.f90 sourcefile~abstractactionspec.f90 AbstractActionSpec.F90 sourcefile~fieldspec.f90~2->sourcefile~abstractactionspec.f90 sourcefile~actualconnectionpt.f90 ActualConnectionPt.F90 sourcefile~fieldspec.f90~2->sourcefile~actualconnectionpt.f90 sourcefile~actualptspecptrmap.f90 ActualPtSpecPtrMap.F90 sourcefile~fieldspec.f90~2->sourcefile~actualptspecptrmap.f90 sourcefile~actualptvector.f90 ActualPtVector.F90 sourcefile~fieldspec.f90~2->sourcefile~actualptvector.f90 sourcefile~convertunitsaction.f90 ConvertUnitsAction.F90 sourcefile~fieldspec.f90~2->sourcefile~convertunitsaction.f90 sourcefile~copyaction.f90 CopyAction.F90 sourcefile~fieldspec.f90~2->sourcefile~copyaction.f90 sourcefile~fieldspec.f90~2->sourcefile~errorhandling.f90 sourcefile~extensionaction.f90 ExtensionAction.F90 sourcefile~fieldspec.f90~2->sourcefile~extensionaction.f90 sourcefile~fielddictionary.f90 FieldDictionary.F90 sourcefile~fieldspec.f90~2->sourcefile~fielddictionary.f90 sourcefile~fieldspec.f90~2->sourcefile~griddedcomponentdriver.f90 sourcefile~keywordenforcer.f90 KeywordEnforcer.F90 sourcefile~fieldspec.f90~2->sourcefile~keywordenforcer.f90 sourcefile~lu_bound.f90 LU_Bound.F90 sourcefile~fieldspec.f90~2->sourcefile~lu_bound.f90 sourcefile~multistate.f90 MultiState.F90 sourcefile~fieldspec.f90~2->sourcefile~multistate.f90 sourcefile~nullaction.f90 NullAction.F90 sourcefile~fieldspec.f90~2->sourcefile~nullaction.f90 sourcefile~regridaction.f90 RegridAction.F90 sourcefile~fieldspec.f90~2->sourcefile~regridaction.f90 sourcefile~stateitemspec.f90 StateItemSpec.F90 sourcefile~fieldspec.f90~2->sourcefile~stateitemspec.f90 sourcefile~udunits2f.f90 udunits2f.F90 sourcefile~fieldspec.f90~2->sourcefile~udunits2f.f90 sourcefile~variablespec.f90 VariableSpec.F90 sourcefile~fieldspec.f90~2->sourcefile~variablespec.f90 sourcefile~fieldspec.f90~2->sourcefile~verticalgrid.f90 sourcefile~verticalregridaction.f90 VerticalRegridAction.F90 sourcefile~fieldspec.f90~2->sourcefile~verticalregridaction.f90 sourcefile~wildcardspec.f90 WildcardSpec.F90 sourcefile~fieldspec.f90~2->sourcefile~wildcardspec.f90 sourcefile~geomspec.f90 GeomSpec.F90 sourcefile~geom_mgr.f90->sourcefile~geomspec.f90 sourcefile~geomutilities.f90 GeomUtilities.F90 sourcefile~geom_mgr.f90->sourcefile~geomutilities.f90 sourcefile~ungriddeddim.f90->sourcefile~errorhandling.f90 sourcefile~ungriddeddim.f90->sourcefile~lu_bound.f90 sourcefile~ungriddeddims.f90->sourcefile~ungriddeddim.f90 sourcefile~ungriddeddims.f90->sourcefile~ungriddeddimvector.f90 sourcefile~ungriddeddims.f90->sourcefile~errorhandling.f90 sourcefile~ungriddeddims.f90->sourcefile~lu_bound.f90 sourcefile~ungriddeddimvector.f90->sourcefile~ungriddeddim.f90 sourcefile~verticaldimspec.f90->sourcefile~errorhandling.f90

Source Code

#include "MAPL_TestErr.h"

module Test_FieldSpec
   use funit
   use mapl3g_geom_mgr
   use mapl3g_FieldSpec
   use mapl3g_UngriddedDims
   use mapl3g_UngriddedDim
   use mapl3g_UngriddedDimVector
   use mapl3g_VerticalDimSpec
   use mapl3g_BasicVerticalGrid
   use mapl3g_ESMF_Utilities, only: MAPL_TYPEKIND_MIRROR
   use gftl2_StringVector
   use esmf
   implicit none

   type(ESMF_Geom) :: geom

contains

   
   @before
   subroutine setup()
      type(ESMF_HConfig) :: hconfig
      type(MaplGeom) :: mapl_geom
      type(GeomManager), pointer :: geom_mgr
      integer :: status

      hconfig = ESMF_HConfigCreate(content="{class: latlon, im_world: 12, jm_world: 13, pole: PC, dateline: DC}", _RC)
      geom_mgr => get_geom_manager()
      mapl_geom = geom_mgr%get_mapl_geom(hconfig, _RC)
      geom = mapl_geom%get_geom()
   end subroutine setup

   
   @test
   subroutine test_can_connect_typekind()
      type(FieldSpec) :: spec_r4, spec_r8, spec_mirror
      type(StringVector) :: import_attributes, export_attributes

      spec_r4 = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m')
      spec_r8 = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R8, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m')
      spec_mirror = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=MAPL_TYPEKIND_MIRROR, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m')

      @assert_that(spec_r4%can_connect_to(spec_r4), is(true()))
      @assert_that(spec_r4%can_connect_to(spec_r8), is(true()))
      @assert_that(spec_r8%can_connect_to(spec_r4), is(true()))
      @assert_that(spec_r8%can_connect_to(spec_r8), is(true()))

      @assert_that(spec_mirror%can_connect_to(spec_r4), is(true()))
      @assert_that(spec_mirror%can_connect_to(spec_r8), is(true()))

   end subroutine test_can_connect_typekind


   @test
   ! Verify that framework detects when an export spec does not
   ! provide mandatory attributes specified by import spec.
   subroutine test_mismatched_attribute()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec
      type(StringVector) :: import_attributes, export_attributes

      call import_attributes%push_back('radius')

      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m', &
           attributes=import_attributes)
      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m', &
           attributes=export_attributes)

      @assert_that(import_spec%can_connect_to(export_spec), is(false()))

   end subroutine test_mismatched_attribute

   @test
   ! Only the import attributes need to match. Not all.
   subroutine test_matched_attribute()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec
      type(StringVector) :: import_attributes, export_attributes

      call import_attributes%push_back('radius')
      call export_attributes%push_back('radius')
      call export_attributes%push_back('other')

      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m', &
           attributes=import_attributes)
      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m', &
           attributes=export_attributes)

      @assert_that(import_spec%can_connect_to(export_spec), is(true()))

   end subroutine test_matched_attribute

   @test
   ! Only the import attributes need to match. Not all.
   subroutine test_multiple_attribute()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec
      type(StringVector) :: import_attributes, export_attributes

      call import_attributes%push_back('radius')
      call import_attributes%push_back('diameter')

      call export_attributes%push_back('other')
      call export_attributes%push_back('radius')
      call export_attributes%push_back('other2')
      call export_attributes%push_back('diameter')


      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m', &
           attributes=import_attributes)
      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', units='m', &
           attributes=export_attributes)

      @assert_that(import_spec%can_connect_to(export_spec), is(true()))

   end subroutine test_multiple_attribute

   @test
   subroutine test_mismatched_units()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec

      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='g')

      @assert_that(import_spec%can_connect_to(export_spec), is(false()))

   end subroutine test_mismatched_units

    @test
   subroutine test_convertible_units()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec

      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='km')

      @assert_that(import_spec%can_connect_to(export_spec), is(true()))

   end subroutine test_convertible_units

   @test
   subroutine test_same_units()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec

      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      @assert_that(import_spec%can_connect_to(export_spec), is(true()))

   end subroutine test_same_units

   @test
   subroutine test_mirror_units()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec


      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector())

      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      @assert_that(import_spec%can_connect_to(export_spec), is(true()))

   end subroutine test_mirror_units

   @test
   subroutine test_mirror_geom()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec

      
      import_spec = FieldSpec( &
           vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector())

      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      @assert_that(import_spec%can_connect_to(export_spec), is(true()))

   end subroutine test_mirror_geom

   @test
   subroutine test_mirror_geom_cost()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec

      
      import_spec = FieldSpec( &
           vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector())

      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = UngriddedDims(), &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      @assert_that(export_spec%extension_cost(import_spec), is(0))

   end subroutine test_mirror_geom_cost

   subroutine test_mirror_ungridded_dims()
      type(FieldSpec) :: import_spec
      type(FieldSpec) :: export_spec
      type(ESMF_Geom) :: geom

      type(UngriddedDims) :: mirror_ungrid, export_dims
      type(UngriddedDimVector) :: ungrid_dims
      type(UngriddedDim) :: ungrid_dim

      mirror_ungrid = mirror_ungridded_dims()
      ungrid_dim = UngriddedDim(2)
      call ungrid_dims%push_back(ungrid_dim)
      export_dims = UngriddedDims(ungrid_dims)

      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = mirror_ungrid, &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      export_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           ungridded_dims = export_dims, &
           standard_name='A', long_name='AA', attributes=StringVector(), &
           units='m')

      @assert_that(import_spec%can_connect_to(export_spec), is(true()))

   end subroutine test_mirror_ungridded_dims

end module Test_FieldSpec