AccumulatorActionInterface.F90 Source File


This file depends on

sourcefile~~accumulatoractioninterface.f90~~EfferentGraph sourcefile~accumulatoractioninterface.f90 AccumulatorActionInterface.F90 sourcefile~accumulatoraction.f90 AccumulatorAction.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~accumulatoraction.f90 sourcefile~errorhandling.f90 ErrorHandling.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~errorhandling.f90 sourcefile~extensionaction.f90 ExtensionAction.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~extensionaction.f90 sourcefile~keywordenforcer.f90 KeywordEnforcer.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~keywordenforcer.f90 sourcefile~maxaction.f90 MaxAction.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~maxaction.f90 sourcefile~meanaction.f90 MeanAction.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~meanaction.f90 sourcefile~minaction.f90 MinAction.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~minaction.f90 sourcefile~nullaction.f90 NullAction.F90 sourcefile~accumulatoractioninterface.f90->sourcefile~nullaction.f90 sourcefile~accumulatoraction.f90->sourcefile~extensionaction.f90 sourcefile~fieldpointerutilities.f90 FieldPointerUtilities.F90 sourcefile~accumulatoraction.f90->sourcefile~fieldpointerutilities.f90 sourcefile~fieldutilities.f90 FieldUtilities.F90 sourcefile~accumulatoraction.f90->sourcefile~fieldutilities.f90 sourcefile~internalconstants.f90 InternalConstants.F90 sourcefile~accumulatoraction.f90->sourcefile~internalconstants.f90 sourcefile~mapl_exceptionhandling.f90 MAPL_ExceptionHandling.F90 sourcefile~accumulatoraction.f90->sourcefile~mapl_exceptionhandling.f90 sourcefile~mapl_throw.f90 MAPL_Throw.F90 sourcefile~errorhandling.f90->sourcefile~mapl_throw.f90 sourcefile~extensionaction.f90->sourcefile~errorhandling.f90 sourcefile~maxaction.f90->sourcefile~accumulatoraction.f90 sourcefile~maxaction.f90->sourcefile~fieldpointerutilities.f90 sourcefile~maxaction.f90->sourcefile~internalconstants.f90 sourcefile~maxaction.f90->sourcefile~mapl_exceptionhandling.f90 sourcefile~meanaction.f90->sourcefile~accumulatoraction.f90 sourcefile~fieldcreate.f90 FieldCreate.F90 sourcefile~meanaction.f90->sourcefile~fieldcreate.f90 sourcefile~fieldget.f90 FieldGet.F90 sourcefile~meanaction.f90->sourcefile~fieldget.f90 sourcefile~meanaction.f90->sourcefile~fieldpointerutilities.f90 sourcefile~meanaction.f90->sourcefile~fieldutilities.f90 sourcefile~meanaction.f90->sourcefile~internalconstants.f90 sourcefile~meanaction.f90->sourcefile~mapl_exceptionhandling.f90 sourcefile~minaction.f90->sourcefile~accumulatoraction.f90 sourcefile~minaction.f90->sourcefile~fieldpointerutilities.f90 sourcefile~minaction.f90->sourcefile~internalconstants.f90 sourcefile~minaction.f90->sourcefile~mapl_exceptionhandling.f90 sourcefile~nullaction.f90->sourcefile~errorhandling.f90 sourcefile~nullaction.f90->sourcefile~extensionaction.f90 sourcefile~fieldcreate.f90->sourcefile~errorhandling.f90 sourcefile~fieldcreate.f90->sourcefile~keywordenforcer.f90 sourcefile~fieldinfo.f90 FieldInfo.F90 sourcefile~fieldcreate.f90->sourcefile~fieldinfo.f90 sourcefile~lu_bound.f90 LU_Bound.F90 sourcefile~fieldcreate.f90->sourcefile~lu_bound.f90 sourcefile~ungriddeddims.f90 UngriddedDims.F90 sourcefile~fieldcreate.f90->sourcefile~ungriddeddims.f90 sourcefile~verticalstaggerloc.f90 VerticalStaggerLoc.F90 sourcefile~fieldcreate.f90->sourcefile~verticalstaggerloc.f90 sourcefile~fieldget.f90->sourcefile~errorhandling.f90 sourcefile~fieldget.f90->sourcefile~keywordenforcer.f90 sourcefile~fieldget.f90->sourcefile~fieldinfo.f90 sourcefile~fieldget.f90->sourcefile~ungriddeddims.f90 sourcefile~fieldget.f90->sourcefile~verticalstaggerloc.f90 sourcefile~fieldpointerutilities.f90->sourcefile~mapl_exceptionhandling.f90 sourcefile~fieldutilities.f90->sourcefile~errorhandling.f90 sourcefile~fieldutilities.f90->sourcefile~keywordenforcer.f90 sourcefile~fieldutilities.f90->sourcefile~fieldpointerutilities.f90 sourcefile~fieldutilities.f90->sourcefile~fieldinfo.f90 sourcefile~infoutilities.f90 InfoUtilities.F90 sourcefile~fieldutilities.f90->sourcefile~infoutilities.f90 sourcefile~fieldutilities.f90->sourcefile~lu_bound.f90 sourcefile~fieldutilities.f90->sourcefile~ungriddeddims.f90 sourcefile~mapl_exceptionhandling.f90->sourcefile~errorhandling.f90 sourcefile~mapl_exceptionhandling.f90->sourcefile~mapl_throw.f90 sourcefile~fieldinfo.f90->sourcefile~errorhandling.f90 sourcefile~fieldinfo.f90->sourcefile~keywordenforcer.f90 sourcefile~fieldinfo.f90->sourcefile~infoutilities.f90 sourcefile~fieldinfo.f90->sourcefile~ungriddeddims.f90 sourcefile~fieldinfo.f90->sourcefile~verticalstaggerloc.f90 sourcefile~mapl_esmf_infokeys.f90 MAPL_ESMF_InfoKeys.F90 sourcefile~fieldinfo.f90->sourcefile~mapl_esmf_infokeys.f90 sourcefile~infoutilities.f90->sourcefile~errorhandling.f90 sourcefile~infoutilities.f90->sourcefile~keywordenforcer.f90 sourcefile~infoutilities.f90->sourcefile~mapl_esmf_infokeys.f90 sourcefile~ungriddeddims.f90->sourcefile~errorhandling.f90 sourcefile~ungriddeddims.f90->sourcefile~infoutilities.f90 sourcefile~ungriddeddims.f90->sourcefile~lu_bound.f90 sourcefile~ungriddeddims.f90->sourcefile~mapl_esmf_infokeys.f90 sourcefile~ungriddeddim.f90 UngriddedDim.F90 sourcefile~ungriddeddims.f90->sourcefile~ungriddeddim.f90 sourcefile~ungriddeddimvector.f90 UngriddedDimVector.F90 sourcefile~ungriddeddims.f90->sourcefile~ungriddeddimvector.f90

Files dependent on this one

sourcefile~~accumulatoractioninterface.f90~~AfferentGraph sourcefile~accumulatoractioninterface.f90 AccumulatorActionInterface.F90 sourcefile~frequencyaspect.f90 FrequencyAspect.F90 sourcefile~frequencyaspect.f90->sourcefile~accumulatoractioninterface.f90 sourcefile~aspectcollection.f90 AspectCollection.F90 sourcefile~aspectcollection.f90->sourcefile~frequencyaspect.f90 sourcefile~fieldspec.f90 FieldSpec.F90 sourcefile~fieldspec.f90->sourcefile~frequencyaspect.f90 sourcefile~fieldspec.f90->sourcefile~aspectcollection.f90 sourcefile~variablespec.f90 VariableSpec.F90 sourcefile~fieldspec.f90->sourcefile~variablespec.f90 sourcefile~test_fieldspec.pf Test_FieldSpec.pf sourcefile~test_fieldspec.pf->sourcefile~frequencyaspect.f90 sourcefile~test_fieldspec.pf->sourcefile~aspectcollection.f90 sourcefile~test_fieldspec.pf->sourcefile~fieldspec.f90 sourcefile~variablespec.f90->sourcefile~frequencyaspect.f90 sourcefile~variablespec.f90->sourcefile~aspectcollection.f90 sourcefile~bracketspec.f90 BracketSpec.F90 sourcefile~bracketspec.f90->sourcefile~fieldspec.f90 sourcefile~componentspec.f90 ComponentSpec.F90 sourcefile~componentspec.f90->sourcefile~variablespec.f90 sourcefile~componentspecparser.f90 ComponentSpecParser.F90 sourcefile~componentspecparser.f90->sourcefile~variablespec.f90 sourcefile~historycollectiongridcomp_private.f90 HistoryCollectionGridComp_private.F90 sourcefile~historycollectiongridcomp_private.f90->sourcefile~variablespec.f90 sourcefile~initialize_advertise.f90 initialize_advertise.F90 sourcefile~initialize_advertise.f90->sourcefile~variablespec.f90 sourcefile~make_itemspec.f90 make_itemSpec.F90 sourcefile~make_itemspec.f90->sourcefile~fieldspec.f90 sourcefile~make_itemspec.f90->sourcefile~variablespec.f90 sourcefile~mapl_generic.f90~2 MAPL_Generic.F90 sourcefile~mapl_generic.f90~2->sourcefile~variablespec.f90 sourcefile~mockitemspec.f90 MockItemSpec.F90 sourcefile~mockitemspec.f90->sourcefile~aspectcollection.f90 sourcefile~mockitemspec.f90->sourcefile~variablespec.f90 sourcefile~modelverticalgrid.f90 ModelVerticalGrid.F90 sourcefile~modelverticalgrid.f90->sourcefile~fieldspec.f90 sourcefile~servicespec.f90 ServiceSpec.F90 sourcefile~servicespec.f90->sourcefile~variablespec.f90 sourcefile~stateitemspec.f90 StateItemSpec.F90 sourcefile~stateitemspec.f90->sourcefile~aspectcollection.f90 sourcefile~statespec.f90 StateSpec.F90 sourcefile~statespec.f90->sourcefile~variablespec.f90 sourcefile~test_addfieldspec.pf Test_AddFieldSpec.pf sourcefile~test_addfieldspec.pf->sourcefile~fieldspec.f90 sourcefile~test_bracketspec.pf Test_BracketSpec.pf sourcefile~test_bracketspec.pf->sourcefile~fieldspec.f90 sourcefile~test_modelverticalgrid.pf Test_ModelVerticalGrid.pf sourcefile~test_modelverticalgrid.pf->sourcefile~variablespec.f90 sourcefile~variablespecvector.f90 VariableSpecVector.F90 sourcefile~variablespecvector.f90->sourcefile~variablespec.f90 sourcefile~wildcardspec.f90 WildcardSpec.F90 sourcefile~wildcardspec.f90->sourcefile~aspectcollection.f90

Source Code

#include "MAPL_Generic.h"
module mapl3g_AccumulatorActionInterface
   use mapl3g_AccumulatorAction
   use mapl3g_MeanAction
   use mapl3g_MaxAction
   use mapl3g_MinAction
   use mapl3g_ExtensionAction
   use mapl3g_NullAction
   use mapl_ErrorHandling
   use mapl_KeywordEnforcer
   use esmf, only: ESMF_TypeKind_Flag, ESMF_TYPEKIND_R4, operator(/=)
   implicit none

   public :: AccumulatorAction
   public :: MeanAction
   public :: MaxAction
   public :: MinAction
   public :: MAX_ACCUMULATION
   public :: MEAN_ACCUMULATION
   public :: MIN_ACCUMULATION
   public :: SIMPLE_ACCUMULATION
   public :: INSTANTANEOUS
   public :: accumulation_type_is_valid
   public :: get_accumulator_action

   ! This is the default case where accumulation_type is not set.
   character(len=*), parameter :: INSTANTANEOUS =''
   
   ! These are explicit accumulation_type values.
   character(len=*), parameter :: MAX_ACCUMULATION = 'max'
   character(len=*), parameter :: MEAN_ACCUMULATION = 'mean'
   character(len=*), parameter :: MIN_ACCUMULATION = 'min'
   character(len=*), parameter :: SIMPLE_ACCUMULATION = 'simple'
   character(len=8), parameter :: ACCUMULATION_TYPES(4) = [character(len=8) :: &
      MAX_ACCUMULATION, MEAN_ACCUMULATION, MIN_ACCUMULATION, SIMPLE_ACCUMULATION]

contains

   logical function accumulation_type_is_valid(acctype) result(lval)
      character(len=*), optional, intent(in) :: acctype

      lval = .FALSE.
      if(.not. present(acctype)) return
      lval = any(ACCUMULATION_TYPES == acctype)

   end function accumulation_type_is_valid

   subroutine get_accumulator_action(accumulation_type, typekind, action, rc)
      character(len=*), intent(in) :: accumulation_type
      type(ESMF_TypeKind_Flag), intent(in) :: typekind
      class(ExtensionAction), allocatable, intent(out) :: action
      integer, optional, intent(out) :: rc 

      integer :: status

      allocate(action, source=NullAction())

      if(typekind /= ESMF_TYPEKIND_R4) then
         _FAIL('Unsupported typekind')
      end if

      select case(accumulation_type)
      case (SIMPLE_ACCUMULATION)
         allocate(action, source=AccumulatorAction(typekind))
      case (MEAN_ACCUMULATION)
         allocate(action, source=MeanAction(typekind))
      case (MAX_ACCUMULATION)
         allocate(action, source=MaxAction(typekind))
      case (MIN_ACCUMULATION)
         allocate(action, source=MinAction(typekind))
      case (INSTANTANEOUS)
         _FAIL('No AccumulatorAction for instantaneous.')
      case default
         _FAIL('Unsupported AccumulatorAction')
      end select

      _RETURN(_SUCCESS)

   end subroutine get_accumulator_action

end module mapl3g_AccumulatorActionInterface