#include "MAPL_Generic.h" !------------------------------------------------------------------------- ! NASA/GSFC, Global Modeling and Assimilation Office, Code 910.1 ! !------------------------------------------------------------------------- !BOP ! ! !MODULE: GEOSCHEMchem_GridCompMod - Implements GEOSCHEM Chemistry ! ! !INTERFACE: ! MODULE GEOSCHEMchem_GridCompMod ! ! !USES: ! USE ESMF_Mod USE MAPL_Mod IMPLICIT NONE PRIVATE ! ! !PUBLIC MEMBER FUNCTIONS: PUBLIC SetServices ! ! !DESCRIPTION: ! ! {\tt GEOSCHEMchem_GridComp} is an ESMF gridded component implementing ! the GEOSCHEM chemical processes. ! ! Developed for GEOS-5 release Fortuna 2.0 and later. ! ! !REVISION HISTORY: ! ! 06Dec2009 da Silva Created the GEOSCHEM skeleton. ! !EOP !------------------------------------------------------------------------- ! Legacy state ! ------------ TYPE GEOSCHEM_State PRIVATE type(ESMF_Config) :: myCF ! Private Config END TYPE GEOSCHEM_State ! Hook for the ESMF ! ----------------- TYPE GEOSCHEM_Wrap TYPE (GEOSCHEM_State), pointer :: PTR => null() END TYPE GEOSCHEM_WRAP CONTAINS !------------------------------------------------------------------------- ! NASA/GSFC, Global Modeling and Assimilation Office, Code 910.1 ! !------------------------------------------------------------------------- !BOP ! ! !IROUTINE: SetServices --- Sets IRF services for the GEOSCHEMchem Grid Component ! ! !INTERFACE: SUBROUTINE SetServices ( GC, RC ) ! !ARGUMENTS: type(ESMF_GridComp), intent(INOUT) :: GC ! gridded component integer, optional :: RC ! return code ! !DESCRIPTION: Sets Initialize, Run and Finalize services. ! ! !REVISION HISTORY: ! ! 1Dec2009 da Silva First crack. ! !EOP !------------------------------------------------------------------------- __Iam__('SetServices') ! Local derived type aliases ! -------------------------- type (GEOSCHEM_State), pointer :: myState ! internal, that is type (GEOSCHEM_wrap) :: wrap character(len=ESMF_MAXSTR) :: comp_name ! ------------ ! Get my name and set-up traceback handle ! --------------------------------------- call ESMF_GridCompGet( GC, name=comp_name, __RC__ ) Iam = TRIM(comp_name) // '::' // TRIM(Iam) ! Wrap internal state for storing in GC; rename legacyState ! ------------------------------------- allocate ( myState, stat=STATUS ) VERIFY_(STATUS) wrap%ptr => myState ! Load private Config Attributes ! ------------------------------ myState%myCF = ESMF_ConfigCreate(__RC__) call ESMF_ConfigLoadFile ( myState%myCF,'GEOSCHEMchem_GridComp.rc',__RC__) ! ------------------------ ! ESMF Functional Services ! ------------------------ ! Set the Initialize, Run, Finalize entry points ! ---------------------------------------------- call MAPL_GridCompSetEntryPoint ( GC, ESMF_SETINIT, Initialize_, __RC__ ) call MAPL_GridCompSetEntryPoint ( GC, ESMF_SETRUN, Run_, __RC__ ) call MAPL_GridCompSetEntryPoint ( GC, ESMF_SETFINAL, Finalize_, __RC__ ) ! Store internal state in GC ! -------------------------- call ESMF_UserCompSetInternalState ( GC, 'GEOSCHEM_state', wrap, STATUS ) VERIFY_(STATUS) ! ------------------ ! MAPL Data Services ! ------------------ !BOP ! ! !IMPORT STATE: #include "GEOSCHEMchem_ImportSpec___.h" ! !INTERNAL STATE: #include "GEOSCHEMchem_InternalSpec___.h" ! !EXTERNAL STATE: #include "GEOSCHEMchem_ExportSpec___.h" ! Generic Set Services ! -------------------- call MAPL_GenericSetServices ( GC, __RC__ ) ! All done ! -------- RETURN_(ESMF_SUCCESS) END SUBROUTINE SetServices !------------------------------------------------------------------------- ! NASA/GSFC, Global Modeling and Assimilation Office, Code 610.1 ! !------------------------------------------------------------------------- !BOP ! ! !IROUTINE: Initialize_ --- Initialize GEOSCHEMchem ! ! !INTERFACE: ! SUBROUTINE Initialize_ ( GC, IMPORT, EXPORT, CLOCK, rc ) ! !USES: implicit NONE ! !INPUT PARAMETERS: type(ESMF_Clock), intent(inout) :: CLOCK ! The clock ! !OUTPUT PARAMETERS: type(ESMF_GridComp), intent(inout) :: GC ! Grid Component type(ESMF_State), intent(inout) :: IMPORT ! Import State type(ESMF_State), intent(inout) :: EXPORT ! Export State integer, intent(out) :: rc ! Error return code: ! 0 - all is well ! 1 - ! !DESCRIPTION: This is a simple ESMF wrapper. ! ! !REVISION HISTORY: ! ! 01Dec2009 da Silva First crack. ! !EOP !------------------------------------------------------------------------- __Iam__('Initialize_') type(GEOSCHEM_state), pointer :: myState ! Legacy state type(ESMF_Grid) :: GRID ! Grid type(ESMF_Config) :: CF ! Universal Config integer :: im, jm, lm ! 3D Dimensions real(ESMF_KIND_R4), pointer :: lons(:,:) ! Longitudes real(ESMF_KIND_R4), pointer :: lats(:,:) ! Latitudes integer :: nymd, nhms ! date, time real :: cdt ! time step in secs character(len=ESMF_MAXSTR) :: comp_name ! Declare pointers to IMPORT/EXPORT/INTERNAL states ! ------------------------------------------------- # include "GEOSCHEMchem_DeclarePointer___.h" ! Get my name and set-up traceback handle ! --------------------------------------- call ESMF_GridCompGet( GC, name=COMP_NAME, __RC__ ) Iam = trim(comp_name) // trim(Iam) ! -------- ! Initialize MAPL Generic ! ----------------------- call MAPL_GenericInitialize ( gc, IMPORT, EXPORT, clock, __RC__ ) ! Get pointers to IMPORT/EXPORT/INTERNAL states ! --------------------------------------------- # include "GEOSCHEMchem_GetPointer___.h" ! Extract relevant runtime information ! ------------------------------------ call extract_ ( GC, CLOCK, myState, GRID, CF, im, jm, lm, lons, lats, & nymd, nhms, cdt, __RC__) ! All done ! -------- RETURN_(ESMF_SUCCESS) END SUBROUTINE Initialize_ !------------------------------------------------------------------------- ! NASA/GSFC, Global Modeling and Assimilation Office, Code 610.1 ! !------------------------------------------------------------------------- !BOP ! ! !IROUTINE: Run_ --- Runs GEOSCHEMchem ! ! !INTERFACE: ! SUBROUTINE Run_ ( gc, IMPORT, EXPORT, CLOCK, rc ) ! !USES: implicit NONE ! !INPUT PARAMETERS: type(ESMF_Clock), intent(inout) :: CLOCK ! The clock ! !OUTPUT PARAMETERS: type(ESMF_GridComp), intent(inout) :: GC ! Grid Component type(ESMF_State), intent(inout) :: IMPORT ! Import State type(ESMF_State), intent(inout) :: EXPORT ! Export State integer, intent(out) :: rc ! Error return code: ! 0 - all is well ! 1 - ! !DESCRIPTION: This is a simple ESMF wrapper. ! ! !REVISION HISTORY: ! ! 27Feb2005 da Silva First crack. ! !EOP !------------------------------------------------------------------------- __Iam__('Run_') type(GEOSCHEM_state), pointer :: myState ! Legacy state type(ESMF_Grid) :: GRID ! Grid type(ESMF_Config) :: CF ! Universal Config integer :: im, jm, lm ! 3D Dimensions real(ESMF_KIND_R4), pointer :: lons(:,:) ! Longitudes real(ESMF_KIND_R4), pointer :: lats(:,:) ! Latitudes integer :: nymd, nhms ! date, time real :: cdt ! time step in secs character(len=ESMF_MAXSTR) :: comp_name ! Declare pointers to IMPORT/EXPORT/INTERNAL states ! ------------------------------------------------- # include "GEOSCHEMchem_DeclarePointer___.h" ! Get my name and set-up traceback handle ! --------------------------------------- call ESMF_GridCompGet( GC, name=comp_name, __RC__ ) Iam = trim(comp_name) // trim(Iam) ! Get pointers to IMPORT/EXPORT/INTERNAL states ! --------------------------------------------- # include "GEOSCHEMchem_GetPointer___.h" ! Extract relevant runtime information ! ------------------------------------ call extract_ ( GC, CLOCK, myState, GRID, CF, im, jm, lm, lons, lats, & nymd, nhms, cdt, __RC__) ! All done ! -------- RETURN_(ESMF_SUCCESS) END SUBROUTINE Run_ !------------------------------------------------------------------------- ! NASA/GSFC, Global Modeling and Assimilation Office, Code 610.1 ! !------------------------------------------------------------------------- !BOP ! ! !IROUTINE: Finalize_ --- Finalize GEOSCHEMchem ! ! !INTERFACE: ! SUBROUTINE Finalize_ ( GC, IMPORT, EXPORT, CLOCK, rc ) ! !USES: implicit NONE ! !INPUT PARAMETERS: type(ESMF_Clock), intent(inout) :: CLOCK ! The clock ! !OUTPUT PARAMETERS: type(ESMF_GridComp), intent(inout) :: gc ! Grid Component type(ESMF_State), intent(inout) :: IMPORT ! Import State type(ESMF_State), intent(inout) :: EXPORT ! Export State integer, intent(out) :: rc ! Error return code: ! 0 - all is well ! 1 - ! !DESCRIPTION: This is a simple ESMF wrapper. ! ! !REVISION HISTORY: ! ! 01Dec2009 da Silva First crack. ! !EOP !------------------------------------------------------------------------- __Iam__('Finalize_') type(GEOSCHEM_state), pointer :: myState ! Legacy state type(ESMF_Grid) :: GRID ! Grid type(ESMF_Config) :: CF ! Universal Config integer :: im, jm, lm ! 3D Dimensions real(ESMF_KIND_R4), pointer :: lons(:,:) ! Longitudes real(ESMF_KIND_R4), pointer :: lats(:,:) ! Latitudes integer :: nymd, nhms ! date, time real :: cdt ! time step in secs character(len=ESMF_MAXSTR) :: COMP_NAME ! Get my name and set-up traceback handle ! --------------------------------------- call ESMF_GridCompGet( GC, name=comp_name, __RC__ ) Iam = trim(comp_name) // trim(Iam) ! Finalize MAPL Generic ! --------------------- call MAPL_GenericFinalize ( GC, IMPORT, EXPORT, CLOCK, __RC__ ) ! Extract relevant runtime information ! ------------------------------------ call extract_ ( GC, CLOCK, myState, GRID, CF, im, jm, lm, lons, lats, & nymd, nhms, cdt, __RC__) ! All done ! -------- RETURN_(ESMF_SUCCESS) end SUBROUTINE Finalize_ !....................................................................... subroutine extract_ ( GC, CLOCK, & myState, GRID, CF, im, jm, lm, lons, lats, & nymd, nhms, cdt, rc) type(ESMF_GridComp), intent(INout) :: GC ! Grid Comp object type(ESMF_Clock), intent(in) :: CLOCK ! Clock type(GEOSCHEM_state), pointer :: myState ! Legacy state type(ESMF_Grid), intent(out) :: GRID ! Grid type(ESMF_Config), intent(out) :: CF ! Universal Config integer, intent(out) :: im, jm, lm ! 3D Dimensions real(ESMF_KIND_R4), pointer :: lons(:,:) ! Longitudes real(ESMF_KIND_R4), pointer :: lats(:,:) ! Latitudes integer, intent(out) :: nymd, nhms ! date, time real, intent(out) :: cdt ! time step in secs integer, intent(out), optional :: rc ! --- character(len=ESMF_MAXSTR) :: comp_name __Iam__('extract_') type(MAPL_MetaComp), pointer :: MC type(ESMF_Time) :: TIME type(GEOSCHEM_Wrap) :: wrap integer :: iyr, imm, idd, ihr, imn, isc integer :: dims(3) ! Get my name and set-up traceback handle ! --------------------------------------- call ESMF_GridCompGet( GC, NAME=comp_name, __RC__ ) Iam = trim(COMP_NAME) // '::' // trim(Iam) rc = 0 ! Get my internal state ! --------------------- call ESMF_UserCompGetInternalState(gc, 'GEOSCHEM_state', WRAP, STATUS) VERIFY_(STATUS) myState => wrap%ptr ! Get the configuration ! --------------------- call ESMF_GridCompGet ( GC, config=CF, __RC__ ) ! Get time step ! ------------- call ESMF_ConfigGetAttribute ( CF, cdt, Label="RUN_DT:", __RC__ ) ! Extract time as simple integers from clock ! ------------------------------------------ call ESMF_ClockGet(CLOCK,currTIME=TIME,__RC__) call ESMF_TimeGet(TIME ,yy=iyr, mm=imm, dd=idd, h=ihr, m=imn, s=isc, __RC__) call MAPL_PackTime(nymd,iyr,imm,idd) call MAPL_PackTime(nhms,ihr,imn,isc) ! Extract the ESMF Grid ! --------------------- call ESMF_GridCompGet ( GC, grid=GRID, __RC__) ! Local dimensions ! ---------------- call ESMF_GridGet(GRID, localDE=0, staggerloc=ESMF_STAGGERLOC_CENTER, & computationalCount=DIMS, __RC__) im = dims(1) jm = dims(2) lm = dims(3) ! Get horizontal coordinate variables ! ----------------------------------- call MAPL_GetObjectFromGC ( GC, MC, RC=STATUS) call MAPL_Get ( MC, LONS = LONS, LATS = LATS, __RC__) RETURN_(ESMF_SUCCESS) end subroutine extract_ END MODULE GEOSCHEMchem_GridCompMod