Test_FieldSpec.pf Source File


This file depends on

sourcefile~~test_fieldspec.pf~~EfferentGraph sourcefile~test_fieldspec.pf Test_FieldSpec.pf sourcefile~aspectcollection.f90 AspectCollection.F90 sourcefile~test_fieldspec.pf->sourcefile~aspectcollection.f90 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 FieldSpec.F90 sourcefile~test_fieldspec.pf->sourcefile~fieldspec.f90 sourcefile~frequencyaspect.f90 FrequencyAspect.F90 sourcefile~test_fieldspec.pf->sourcefile~frequencyaspect.f90 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

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_AspectCollection
   use mapl3g_FrequencyAspect
   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

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

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

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

      ! Mirror ungrids by not specifying anything
      import_spec = FieldSpec( &
           geom=geom, vertical_grid=BasicVerticalGrid(1), vertical_dim_spec=VerticalDimSpec(), &
           typekind=ESMF_TYPEKIND_R4, &
           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

   @test
   subroutine test_field_accumulation()
      type(FieldSpec), target :: field_spec
      type(VerticalDimSpec) :: vertical_dim_spec
      type(ESMF_Typekind_Flag) :: typekind
      character(len=8) :: accumulation_type
      type(AspectCollection), pointer :: aspects
      type(FrequencyAspect), pointer :: aspect
      character(len=8) :: actual_accumulation_type

      aspects => null()
      typekind = ESMF_TYPEKIND_R4
      accumulation_type = 'mean'
      field_spec = FieldSpec(vertical_dim_spec=vertical_dim_spec, typekind=typekind, &
         accumulation_type=accumulation_type, ungridded_dims=UngriddedDims())
      aspects => field_spec%get_aspects()
      aspect => aspects%get_frequency_aspect()
      actual_accumulation_type = aspect%get_accumulation_type()
      @assertEqual(accumulation_type, actual_accumulation_type, 'accumulation_type does not match expected.')

   end subroutine test_field_accumulation

end module Test_FieldSpec