#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