#include "./ESMFVersionDefine.h" !----------------------------------------------------------------------- ! MODULE module_EARTH_GRID_COMP ! !----------------------------------------------------------------------- !*** This module contains codes directly related to the EARTH component. !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! 2010-03-24 Black - Created Earth component module. ! 2010-04 Yang - Added Ensemble capability. ! 2011-05-11 Theurich & Yang - Modified for using the ESMF 5.2.0r_beta_snapshot_07. ! 2011-10-04 Yang - Modified for using the ESMF 5.2.0r library. ! 2012-02 Tripp - Added ESMF superstructure to support an OCN model ! 2013-06 Theurich - Reworked OCN dependency to be NUOPC based ! 2013-07 Theurich - Macro based ESMF error handling !----------------------------------------------------------------------- ! !*** The EARTH component lies in the hierarchy seen here: ! ! Main program ! | ! | ! NEMS component ! | |________________________. ! | | ! EARTH component Ensemble Coupler component ! /|\ ! / | \ ! ATM/OCN/ICE/WAV/LND/IPM/HYD .. components ! | | | ! | | (CICE, etc.) ! | | ! | (MOM5, HYCOM, POM, etc.) ! | ! CORE component (GSM, NMM, FIM, GEN, etc.) ! !----------------------------------------------------------------------- ! USE esmf_mod #ifdef WITH_NUOPC use NUOPC use NUOPC_Driver, & Driver_routine_SS => SetServices, & Driver_label_SetModelServices => label_SetModelServices, & Driver_label_SetRunSequence => label_SetRunSequence, & Driver_label_Finalize => label_Finalize use NUOPC_Connector, only: conSS => SetServices ! - Handle build time ATM options: #ifdef FRONT_SATM use FRONT_SATM, only: ATM_SATM_SS => SetServices #endif #ifdef FRONT_XATM use FRONT_XATM, only: ATM_XATM_SS => SetServices #endif ! - Handle build time OCN options: #ifdef FRONT_SOCN use FRONT_SOCN, only: OCN_SOCN_SS => SetServices #endif #ifdef FRONT_XOCN use FRONT_XOCN, only: OCN_XOCN_SS => SetServices #endif #ifdef FRONT_HYCOM use FRONT_HYCOM, only: OCN_HYCOM_SS => SetServices #endif #ifdef FRONT_MOM5 use FRONT_MOM5, only: OCN_MOM5_SS => SetServices #endif #ifdef FRONT_POM use FRONT_POM, only: OCN_POM_SS => SetServices #endif ! - Handle build time ICE options: #ifdef FRONT_SICE use FRONT_SICE, only: ICE_SICE_SS => SetServices #endif #ifdef FRONT_XICE use FRONT_XICE, only: ICE_XICE_SS => SetServices #endif #ifdef FRONT_CICE use FRONT_CICE, only: ICE_CICE_SS => SetServices #endif ! - Handle build time WAV options: #ifdef FRONT_SWAV use FRONT_SWAV, only: WAV_SWAV_SS => SetServices #endif #ifdef FRONT_XWAV use FRONT_XWAV, only: WAV_XWAV_SS => SetServices #endif #ifdef FRONT_WW3 use FRONT_WW3, only: WAV_WW3_SS => SetServices #endif ! - Handle build time LND options: #ifdef FRONT_SLND use FRONT_SLND, only: LND_SLND_SS => SetServices #endif #ifdef FRONT_XLND use FRONT_XLND, only: LND_XLND_SS => SetServices #endif #ifdef FRONT_LIS use FRONT_LIS, only: LND_LIS_SS => SetServices #endif ! - Handle build time IPM options: #ifdef FRONT_SIPM use FRONT_SIPM, only: IPM_SIPM_SS => SetServices #endif #ifdef FRONT_XIPM use FRONT_XIPM, only: IPM_XIPM_SS => SetServices #endif #ifdef FRONT_IPE use FRONT_IPE, only: IPM_IPE_SS => SetServices #endif ! - Handle build time HYD options: #ifdef FRONT_SHYD use FRONT_SHYD, only: HYD_SHYD_SS => SetServices #endif #ifdef FRONT_XHYD use FRONT_XHYD, only: HYD_XHYD_SS => SetServices #endif #ifdef FRONT_WRFHYDRO use FRONT_WRFHYDRO, only: HYD_WRFHYDRO_SS => SetServices #endif ! - Mediator use module_MEDIATOR, only: MED_SS => SetServices use module_MEDSpaceWeather, only: MEDSW_SS => SetServices #endif USE module_EARTH_INTERNAL_STATE,ONLY: EARTH_INTERNAL_STATE & ,WRAP_EARTH_INTERNAL_STATE ! USE module_ATM_GRID_COMP ! USE module_ERR_MSG,ONLY: ERR_MSG,MESSAGE_CHECK ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! PRIVATE ! PUBLIC :: EARTH_REGISTER ! !----------------------------------------------------------------------- ! #ifndef WITH_NUOPC TYPE(EARTH_INTERNAL_STATE),POINTER,SAVE :: EARTH_INT_STATE !<-- Internal state of the EARTH component TYPE(WRAP_EARTH_INTERNAL_STATE) ,SAVE :: WRAP !<-- F90 pointer to the EARTH internal state #endif ! !----------------------------------------------------------------------- ! CONTAINS !----------------------------------------------------------------------- !####################################################################### !----------------------------------------------------------------------- ! SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument Variables !------------------------ ! TYPE(ESMF_GridComp) :: EARTH_GRID_COMP !<-- The EARTH component ! INTEGER,INTENT(OUT) :: RC_REG !<-- Error return code ! !--------------------- !*** Local Variables !--------------------- ! INTEGER :: RC #ifdef WITH_NUOPC type(ESMF_Config) :: config #endif ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! RC_REG = ESMF_SUCCESS ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! #ifdef WITH_NUOPC ! Derive from NUOPC_Driver call NUOPC_CompDerive(EARTH_GRID_COMP, Driver_routine_SS, rc=RC) ESMF_ERR_RETURN(RC,RC_REG) ! specializations: call NUOPC_CompSpecialize(EARTH_GRID_COMP, & specLabel=Driver_label_SetModelServices, specRoutine=SetModelServices, & rc=RC) ESMF_ERR_RETURN(RC,RC_REG) call NUOPC_CompSpecialize(EARTH_GRID_COMP, & specLabel=Driver_label_SetRunSequence, specRoutine=SetRunSequence, & rc=RC) ESMF_ERR_RETURN(RC,RC_REG) call NUOPC_CompSpecialize(EARTH_GRID_COMP, & specLabel=Driver_label_Finalize, specRoutine=Finalize, & rc=RC) ESMF_ERR_RETURN(RC,RC_REG) ! register an internal initialization method call NUOPC_CompSetInternalEntryPoint(EARTH_GRID_COMP, ESMF_METHOD_INITIALIZE, & phaseLabelList=(/"IPDv04p2"/), userRoutine=ModifyCplLists, rc=rc) ESMF_ERR_RETURN(RC,RC_REG) ! create, open, and set the config config = ESMF_ConfigCreate(rc=RC) ESMF_ERR_RETURN(RC,RC_REG) call ESMF_ConfigLoadFile(config, "nems.configure", rc=RC) ESMF_ERR_RETURN(RC,RC_REG) call ESMF_GridCompSet(EARTH_GRID_COMP, config=config, rc=RC) ESMF_ERR_RETURN(RC,RC_REG) ! Added the following Field Dictionary block to the EARTH component level ! in order to prevent different dictionary definitions in the lower ! components. Doing this here isn't without problems because it ! potentially makes the components (ATM & OCN) depend on this environment, ! which lowers their transferability to other coupled systems. However, ! extending the Field Dictionary is a temporary solution anyway (see the ! TODO: below), so this isn't going to stay for ever this way. ! Extend the NUOPC Field Dictionary to hold required entries. !TODO: In the long run this section will not be needed when we have !TODO: absorbed the needed standard names into the default dictionary. ! -> 20 fields identified as exports by the GSM component if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_zonal_moment_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_zonal_moment_flx", & canonicalUnits="N m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_merid_moment_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_merid_moment_flx", & canonicalUnits="N m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_sensi_heat_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_sensi_heat_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_sensi_heat_flx_atm_into_ice")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_sensi_heat_flx_atm_into_ice", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_laten_heat_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_laten_heat_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_laten_heat_flx_atm_into_ice")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_laten_heat_flx_atm_into_ice", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_down_lw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_down_lw_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_down_sw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_down_sw_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_fprec_rate")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_fprec_rate", & canonicalUnits="kg s m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_prec_rate")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_prec_rate", & canonicalUnits="kg s m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_evap_rate")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_evap_rate", & canonicalUnits="kg s m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "mean_evap_rate_atm_into_ice")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_evap_rate_atm_into_ice", & canonicalUnits="kg s m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_zonal_moment_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_zonal_moment_flx", & canonicalUnits="N m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_merid_moment_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_merid_moment_flx", & canonicalUnits="N m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_sensi_heat_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_sensi_heat_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_laten_heat_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_laten_heat_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_down_lw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_down_lw_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_down_sw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_down_sw_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_temp_height2m")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_temp_height2m", & canonicalUnits="K", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_spec_humid_height2m")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_spec_humid_height2m", & canonicalUnits="kg kg-1", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_u_wind_height10m")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_u_wind_height10m", & canonicalUnits="m s-1", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_v_wind_height10m")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_v_wind_height10m", & canonicalUnits="m s-1", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_zonal_wind_height10m")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_zonal_wind_height10m", & canonicalUnits="m s-1", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_merid_wind_height10m")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_merid_wind_height10m", & canonicalUnits="m s-1", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_temp_height_surface")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_temp_height_surface", & canonicalUnits="K", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_pres_height_surface")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_pres_height_surface", & canonicalUnits="Pa", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_surface_height")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_surface_height", & canonicalUnits="m", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif ! -> Additional fields identified as needed by MOM5 and others... if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_down_sw_vis_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_down_sw_vis_dir_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_down_sw_vis_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_down_sw_vis_dif_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_down_sw_ir_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_down_sw_ir_dir_flx", & canonicalUnits="W m-2", & rc=rc); if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_down_sw_ir_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_down_sw_ir_dif_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_down_sw_vis_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_down_sw_vis_dir_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_down_sw_vis_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_down_sw_vis_dif_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_down_sw_ir_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_down_sw_ir_dir_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_down_sw_ir_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_down_sw_ir_dif_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_net_sw_vis_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_net_sw_vis_dir_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_net_sw_vis_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_net_sw_vis_dif_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_net_sw_ir_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_net_sw_ir_dir_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_net_sw_ir_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_net_sw_ir_dif_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_net_sw_vis_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_net_sw_vis_dir_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_net_sw_vis_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_net_sw_vis_dif_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_net_sw_ir_dir_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_net_sw_ir_dir_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_net_sw_ir_dif_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_net_sw_ir_dif_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_salt_rate")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_salt_rate", & canonicalUnits="kg m-2 s", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_runoff_rate")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_runoff_rate", & canonicalUnits="kg m-2 s", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_calving_rate")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_calving_rate", & canonicalUnits="kg m-2 s", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_runoff_heat_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_runoff_heat_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_calving_heat_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_calving_heat_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "ice_fraction")) then call NUOPC_FieldDictionaryAddEntry( & standardName="ice_fraction", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_sw_pen_to_ocn")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_sw_pen_to_ocn", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_up_lw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_up_lw_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mass_of_overlying_sea_ice")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mass_of_overlying_sea_ice", & canonicalUnits="kg", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "s_surf")) then call NUOPC_FieldDictionaryAddEntry( & standardName="s_surf", & canonicalUnits="psu", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "freezing_melting_potential")) then call NUOPC_FieldDictionaryAddEntry( & standardName="freezing_melting_potential", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "u_surf")) then call NUOPC_FieldDictionaryAddEntry( & standardName="u_surf", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "v_surf")) then call NUOPC_FieldDictionaryAddEntry( & standardName="v_surf", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_lev")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_lev", & canonicalUnits="m", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "wind_stress_zonal")) then call NUOPC_FieldDictionaryAddEntry( & standardName="wind_stress_zonal", & canonicalUnits="N m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "wind_stress_merid")) then call NUOPC_FieldDictionaryAddEntry( & standardName="wind_stress_merid", & canonicalUnits="N m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "ocn_current_zonal")) then call NUOPC_FieldDictionaryAddEntry( & standardName="ocn_current_zonal", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "ocn_current_merid")) then call NUOPC_FieldDictionaryAddEntry( & standardName="ocn_current_merid", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_surface_slope_zonal")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_surface_slope_zonal", & canonicalUnits="m m-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_surface_slope_merid")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_surface_slope_merid", & canonicalUnits="m m-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "stress_on_air_ice_zonal")) then call NUOPC_FieldDictionaryAddEntry( & standardName="stress_on_air_ice_zonal", & canonicalUnits="N m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "stress_on_air_ice_merid")) then call NUOPC_FieldDictionaryAddEntry( & standardName="stress_on_air_ice_merid", & canonicalUnits="N m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "stress_on_ocn_ice_zonal")) then call NUOPC_FieldDictionaryAddEntry( & standardName="stress_on_ocn_ice_zonal", & canonicalUnits="N m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "stress_on_ocn_ice_merid")) then call NUOPC_FieldDictionaryAddEntry( & standardName="stress_on_ocn_ice_merid", & canonicalUnits="N m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mixed_layer_depth")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mixed_layer_depth", & canonicalUnits="m", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_net_lw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_net_lw_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_net_sw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_net_sw_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "mean_up_lw_flx_ice")) then call NUOPC_FieldDictionaryAddEntry( & standardName="mean_up_lw_flx_ice", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_net_lw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_net_lw_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_net_sw_flx")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_net_sw_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ir_dir_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ir_dir_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ir_dif_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ir_dif_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_vis_dir_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_vis_dir_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_vis_dif_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_vis_dif_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ocn_ir_dir_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ocn_ir_dir_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ocn_ir_dif_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ocn_ir_dif_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ocn_vis_dir_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ocn_vis_dir_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ocn_vis_dif_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ocn_vis_dif_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ice_ir_dir_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ice_ir_dir_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ice_ir_dif_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ice_ir_dif_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ice_vis_dir_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ice_vis_dir_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_ice_vis_dif_albedo")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_ice_vis_dif_albedo", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "inst_land_sea_mask")) then call NUOPC_FieldDictionaryAddEntry( & standardName="inst_land_sea_mask", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "ocean_mask")) then call NUOPC_FieldDictionaryAddEntry( & standardName="ocean_mask", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "ice_mask")) then call NUOPC_FieldDictionaryAddEntry( & standardName="ice_mask", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "land_mask")) then call NUOPC_FieldDictionaryAddEntry( & standardName="land_mask", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif ! special HYCOM exports if (.not. NUOPC_FieldDictionaryHasEntry( & "surface_downward_eastward_stress")) then call NUOPC_FieldDictionaryAddEntry( & standardName="surface_downward_eastward_stress", & canonicalUnits="Pa", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "surface_downward_northward_stress")) then call NUOPC_FieldDictionaryAddEntry( & standardName="surface_downward_northward_stress", & canonicalUnits="Pa", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "wind_speed_height10m")) then call NUOPC_FieldDictionaryAddEntry( & standardName="wind_speed_height10m", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "friction_speed")) then call NUOPC_FieldDictionaryAddEntry( & standardName="friction_speed", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "air_surface_temperature")) then call NUOPC_FieldDictionaryAddEntry( & standardName="air_surface_temperature", & canonicalUnits="K", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "upward_sea_ice_basal_available_heat_flux")) then call NUOPC_FieldDictionaryAddEntry( & standardName="upward_sea_ice_basal_available_heat_flux", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif ! special HYCOM imports if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_ice_area_fraction")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_ice_area_fraction", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "downward_x_stress_at_sea_ice_base")) then call NUOPC_FieldDictionaryAddEntry( & standardName="downward_x_stress_at_sea_ice_base", & canonicalUnits="Pa", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "downward_y_stress_at_sea_ice_base")) then call NUOPC_FieldDictionaryAddEntry( & standardName="downward_y_stress_at_sea_ice_base", & canonicalUnits="Pa", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "downward_sea_ice_basal_solar_heat_flux")) then call NUOPC_FieldDictionaryAddEntry( & standardName="downward_sea_ice_basal_solar_heat_flux", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "upward_sea_ice_basal_heat_flux")) then call NUOPC_FieldDictionaryAddEntry( & standardName="upward_sea_ice_basal_heat_flux", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "downward_sea_ice_basal_salt_flux")) then call NUOPC_FieldDictionaryAddEntry( & standardName="downward_sea_ice_basal_salt_flux", & canonicalUnits="kg m-2 s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "downward_sea_ice_basal_water_flux")) then call NUOPC_FieldDictionaryAddEntry( & standardName="downward_sea_ice_basal_water_flux", & canonicalUnits="kg m-2 s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_ice_temperature")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_ice_temperature", & canonicalUnits="K", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_ice_thickness")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_ice_thickness", & canonicalUnits="m", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_ice_x_velocity")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_ice_x_velocity", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "sea_ice_y_velocity")) then call NUOPC_FieldDictionaryAddEntry( & standardName="sea_ice_y_velocity", & canonicalUnits="m s-1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "dummyfield")) then call NUOPC_FieldDictionaryAddEntry( & standardName="dummyfield", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "dummyfield1")) then call NUOPC_FieldDictionaryAddEntry( & standardName="dummyfield1", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & "dummyfield2")) then call NUOPC_FieldDictionaryAddEntry( & standardName="dummyfield2", & canonicalUnits="1", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif #else !----------------------------------------------------------------------- !*** Register the EARTH Initialize, Run, and Finalize routines. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set Entry Point for EARTH Initialize" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetEntryPoint(EARTH_GRID_COMP & !<-- The EARTH component ,ESMF_METHOD_INITIALIZE & !<-- Subroutine type (Initialize) ,EARTH_INITIALIZE & !<-- User's subroutine name ,phase=1 & ,rc=RC) ESMF_ERR_RETURN(RC,RC_REG) ! !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set Entry Point for EARTH Run" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetEntryPoint(EARTH_GRID_COMP & !<-- The EARTH component ,ESMF_METHOD_RUN & !<-- Subroutine type (Run) ,EARTH_RUN & !<-- User's subroutine name ,phase=1 & ,rc=RC) ESMF_ERR_RETURN(RC,RC_REG) ! !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set Entry Point for EARTH Finalize" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetEntryPoint(EARTH_GRID_COMP & !<-- The EARTH component ,ESMF_METHOD_FINALIZE & !<-- Subroutine type (Finalize) ,EARTH_FINALIZE & !<-- User's subroutine name ,phase=1 & ,rc=RC) ESMF_ERR_RETURN(RC,RC_REG) ! !----------------------------------------------------------------------- #endif !----------------------------------------------------------------------- ! END SUBROUTINE EARTH_REGISTER ! !----------------------------------------------------------------------- !####################################################################### !----------------------------------------------------------------------- ! #ifdef WITH_NUOPC subroutine SetModelServices(driver, rc) type(ESMF_GridComp) :: driver integer, intent(out) :: rc ! local variables integer :: localrc, stat, i, petCount character(ESMF_MAXSTR) :: name type(WRAP_EARTH_INTERNAL_STATE) :: is type(ESMF_GridComp) :: comp type(ESMF_Config) :: config character(len=20) :: model character(len=160) :: msg integer :: petListBounds(2) rc = ESMF_SUCCESS ! query the Component for info call ESMF_GridCompGet(driver, name=name, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! allocate memory for the internal state and store in Component allocate(is%EARTH_INT_STATE, stat=stat) if (ESMF_LogFoundAllocError(statusToCheck=stat, & msg="Allocation of internal state memory failed.", & line=__LINE__, file=trim(name)//":"//__FILE__, rcToReturn=rc)) & return ! bail out call ESMF_GridCompSetInternalState(driver, is, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! nullify the petLists nullify(is%EARTH_INT_STATE%atmPetList) nullify(is%EARTH_INT_STATE%ocnPetList) nullify(is%EARTH_INT_STATE%icePetList) nullify(is%EARTH_INT_STATE%wavPetList) nullify(is%EARTH_INT_STATE%lndPetList) nullify(is%EARTH_INT_STATE%ipmPetList) nullify(is%EARTH_INT_STATE%hydPetList) nullify(is%EARTH_INT_STATE%medPetList) ! get petCount and config call ESMF_GridCompGet(driver, petCount=petCount, config=config, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! determine the ATM petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="atm_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="atm_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for ATM allocate(is%EARTH_INT_STATE%atmPetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%atmPetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! determine the OCN petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="ocn_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="ocn_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for OCN allocate(is%EARTH_INT_STATE%ocnPetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%ocnPetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! determine the ICE petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="ice_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="ice_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for ICE allocate(is%EARTH_INT_STATE%icePetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%icePetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! determine the WAV petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="wav_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="wav_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for ICE allocate(is%EARTH_INT_STATE%wavPetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%wavPetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! determine the LND petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="lnd_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="lnd_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for ICE allocate(is%EARTH_INT_STATE%lndPetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%lndPetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! determine the IPM petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="ipm_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="ipm_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for ICE allocate(is%EARTH_INT_STATE%ipmPetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%ipmPetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! determine the HYD petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="hyd_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="hyd_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for ICE allocate(is%EARTH_INT_STATE%hydPetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%hydPetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! determine the MED petList bounds call ESMF_ConfigGetAttribute(config, petListBounds, & label="med_petlist_bounds:", default=-1, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (petListBounds(1)==-1 .or. petListBounds(2)==-1) then petListBounds(1) = 0 petListBounds(2) = petCount - 1 endif call ESMF_ConfigGetAttribute(config, model, label="med_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out if (trim(model) /= "none") then ! set petList for MED allocate(is%EARTH_INT_STATE%medPetList( & petListBounds(2)-petListBounds(1)+1)) do i=petListBounds(1), petListBounds(2) is%EARTH_INT_STATE%medPetList(i-petListBounds(1)+1) = i ! PETs are 0 based enddo endif ! SetServices for ATM call ESMF_ConfigGetAttribute(config, model, label="atm_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%atmModel = model !print *, "atm_model: ", trim(model) if (trim(model) == "satm") then #ifdef FRONT_SATM call NUOPC_DriverAddComp(driver, "ATM", ATM_SATM_SS, & petList=is%EARTH_INT_STATE%atmPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "ATM model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "xatm") then #ifdef FRONT_XATM call NUOPC_DriverAddComp(driver, "ATM", ATM_XATM_SS, & petList=is%EARTH_INT_STATE%atmPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "ATM model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif ((trim(model) == "gsm") .or. (trim(model) == "nmm")) then ! currently GSM and NMMB are within the NEMS code directly and ! building them into the NEMS executable is controlled in the ! native NEMS way still. ! TODO: make GSM and NMMB (and FIM...) external, at least on the ! build system level, even if code stays internal to NEMS repo. #define WITH_INTERNAL_ATMS #ifdef WITH_INTERNAL_ATMS call NUOPC_DriverAddComp(driver, "ATM", ATM_REGISTER, & petList=is%EARTH_INT_STATE%atmPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "ATM model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif endif ! SetServices for OCN call ESMF_ConfigGetAttribute(config, model, label="ocn_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%ocnModel = model !print *, "ocn_model: ", trim(model) if (trim(model) == "socn") then #ifdef FRONT_SOCN call NUOPC_DriverAddComp(driver, "OCN", OCN_SOCN_SS, & petList=is%EARTH_INT_STATE%ocnPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "OCN model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "xocn") then #ifdef FRONT_XOCN call NUOPC_DriverAddComp(driver, "OCN", OCN_XOCN_SS, & petList=is%EARTH_INT_STATE%ocnPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "OCN model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "hycom") then #ifdef FRONT_HYCOM call NUOPC_DriverAddComp(driver, "OCN", OCN_HYCOM_SS, & petList=is%EARTH_INT_STATE%ocnPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "OCN model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "mom5") then #ifdef FRONT_MOM5 call NUOPC_DriverAddComp(driver, "OCN", OCN_MOM5_SS, & petList=is%EARTH_INT_STATE%ocnPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "OCN model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "pom") then #ifdef FRONT_POM call NUOPC_DriverAddComp(driver, "OCN", OCN_POM_SS, & petList=is%EARTH_INT_STATE%ocnPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "OCN model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif endif ! SetServices for ICE call ESMF_ConfigGetAttribute(config, model, label="ice_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%iceModel = model !print *, "ice_model: ", trim(model) if (trim(model) == "sice") then #ifdef FRONT_SICE call NUOPC_DriverAddComp(driver, "ICE", ICE_SICE_SS, & petList=is%EARTH_INT_STATE%icePetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "ICE model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "xice") then #ifdef FRONT_XICE call NUOPC_DriverAddComp(driver, "ICE", ICE_XICE_SS, & petList=is%EARTH_INT_STATE%icePetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "ICE model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "cice") then #ifdef FRONT_CICE call NUOPC_DriverAddComp(driver, "ICE", ICE_CICE_SS, & petList=is%EARTH_INT_STATE%icePetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "ICE model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif endif ! SetServices for WAV call ESMF_ConfigGetAttribute(config, model, label="wav_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%wavModel = model !print *, "wav_model: ", trim(model) if (trim(model) == "swav") then #ifdef FRONT_SWAV call NUOPC_DriverAddComp(driver, "WAV", WAV_SWAV_SS, & petList=is%EARTH_INT_STATE%wavPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "WAV model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "xwav") then #ifdef FRONT_XWAV call NUOPC_DriverAddComp(driver, "WAV", WAV_XWAV_SS, & petList=is%EARTH_INT_STATE%wavPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "WAV model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "ww3") then #ifdef FRONT_WW3 call NUOPC_DriverAddComp(driver, "WAV", WAV_WW3_SS, & petList=is%EARTH_INT_STATE%wavPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "WAV model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif endif ! SetServices for LND call ESMF_ConfigGetAttribute(config, model, label="lnd_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%lndModel = model !print *, "lnd_model: ", trim(model) if (trim(model) == "slnd") then #ifdef FRONT_SLND call NUOPC_DriverAddComp(driver, "LND", LND_SLND_SS, & petList=is%EARTH_INT_STATE%lndPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "LND model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "xlnd") then #ifdef FRONT_XLND call NUOPC_DriverAddComp(driver, "LND", LND_XLND_SS, & petList=is%EARTH_INT_STATE%lndPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "LND model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "lis") then #ifdef FRONT_LIS call NUOPC_DriverAddComp(driver, "LND", LND_LIS_SS, & petList=is%EARTH_INT_STATE%lndPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "LND model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif endif ! SetServices for IPM call ESMF_ConfigGetAttribute(config, model, label="ipm_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%ipmModel = model !print *, "ipm_model: ", trim(model) if (trim(model) == "sipm") then #ifdef FRONT_SIPM call NUOPC_DriverAddComp(driver, "IPM", IPM_SIPM_SS, & petList=is%EARTH_INT_STATE%ipmPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "IPM model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "xipm") then #ifdef FRONT_XIPM call NUOPC_DriverAddComp(driver, "IPM", IPM_XIPM_SS, & petList=is%EARTH_INT_STATE%ipmPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "IPM model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "ipe") then #ifdef FRONT_IPE call NUOPC_DriverAddComp(driver, "IPM", IPM_IPE_SS, & petList=is%EARTH_INT_STATE%ipmPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "IPM model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif endif ! SetServices for HYD call ESMF_ConfigGetAttribute(config, model, label="hyd_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%hydModel = model !print *, "hyd_model: ", trim(model) if (trim(model) == "shyd") then #ifdef FRONT_SHYD call NUOPC_DriverAddComp(driver, "HYD", HYD_SHYD_SS, & petList=is%EARTH_INT_STATE%hydPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "HYD model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "xhyd") then #ifdef FRONT_XHYD call NUOPC_DriverAddComp(driver, "HYD", HYD_XHYD_SS, & petList=is%EARTH_INT_STATE%hydPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "HYD model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "ipe") then #ifdef FRONT_WRFHYDRO call NUOPC_DriverAddComp(driver, "HYD", HYD_WRFHYDRO_SS, & petList=is%EARTH_INT_STATE%hydPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #else write (msg, *) "HYD model '", trim(model), "' was requested, "// & "but is not available in the executable!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out #endif endif ! SetServices for Mediator call ESMF_ConfigGetAttribute(config, model, label="med_model:", & default="none", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out is%EARTH_INT_STATE%medModel = model !print *, "med_model: ", trim(model) if (trim(model) == "none") then ! silently do nothing else if (trim(model) == "nems") then call NUOPC_DriverAddComp(driver, "MED", MED_SS, & petList=is%EARTH_INT_STATE%medPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out else if (trim(model) == "spaceweather") then call NUOPC_DriverAddComp(driver, "MED", MEDSW_SS, & petList=is%EARTH_INT_STATE%medPetList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_AttributeSet(comp, name="Verbosity", value="high", & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out else write (msg, *) "MEDIATOR '", trim(model), "' was requested, "// & "but is an invalid choice!" call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msg, line=__LINE__, & file=__FILE__, rcToReturn=rc) return ! bail out endif ! SetServices for Connectors call SetFromConfig(driver, mode="setServicesConnectors", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out end subroutine !----------------------------------------------------------------------------- subroutine SetRunSequence(driver, rc) type(ESMF_GridComp) :: driver integer, intent(out) :: rc ! local variables character(ESMF_MAXSTR) :: name rc = ESMF_SUCCESS ! query the Component for info call ESMF_GridCompGet(driver, name=name, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! access runSeq in the config call SetFromConfig(driver, mode="setRunSequence", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! Diagnostic output call NUOPC_DriverPrint(driver, orderflag=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out end subroutine !----------------------------------------------------------------------------- subroutine SetFromConfig(driver, mode, rc) type(ESMF_GridComp) :: driver character(len=*) :: mode integer, intent(out) :: rc ! local variables character(ESMF_MAXSTR) :: name type(ESMF_Config) :: config integer :: lineCount, columnCount, i, slotCount integer, allocatable :: count(:) character(len=20), allocatable :: line(:) character(len=20) :: tempString logical :: phaseFlag integer :: level, slot, slotHWM real(ESMF_KIND_R8) :: seconds integer, allocatable :: slotStack(:) type(ESMF_TimeInterval) :: timeStep type(ESMF_Clock) :: internalClock, subClock character(len=60), allocatable :: connectorInstance(:) integer :: connectorCount, j type(ESMF_CplComp) :: conn rc = ESMF_SUCCESS ! query the Component for info call ESMF_GridCompGet(driver, name=name, config=config, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! reset config to beginning of runSeq:: block call ESMF_ConfigFindLabel(config, label="runSeq::", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_ConfigGetDim(config, lineCount, columnCount, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out allocate(count(lineCount)) if (trim(mode)=="setServicesConnectors") then allocate(connectorInstance(lineCount)) ! max number of connectors connectorCount = 0 ! reset endif ! reset config to beginning of runSeq:: block call ESMF_ConfigFindLabel(config, label="runSeq::", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! determine number of entries on each line do i=1, lineCount call ESMF_ConfigNextLine(config) count(i) = ESMF_ConfigGetLen(config) ! entries on line i enddo ! reset config to beginning of runSeq:: block call ESMF_ConfigFindLabel(config, label="runSeq::", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! read each line and determine slotCount slotCount = 0 do i=1, lineCount call ESMF_ConfigNextLine(config) allocate(line(count(i))) call ESMF_ConfigGetAttribute(config, line, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! process the configuration line if (size(line) == 1) then if (index(trim(line(1)),"@") == 1) then slotCount = slotCount + 1 endif elseif ((size(line) == 3) .or. (size(line) == 4)) then if (trim(mode)=="setServicesConnectors") then ! a connector if the second element is "->" if (trim(line(2)) /= "->") then call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_BAD, & msg="Configuration line incorrectly formatted.", & line=__LINE__, & file=__FILE__) return ! bail out else ! found a connector entry, see if it is the first instance do j=1, connectorCount if (trim(connectorInstance(j)) == & trim(line(1))//trim(line(2))//trim(line(3))) exit enddo if (j>connectorCount) then ! this is a new Connector instance connectorCount = j connectorInstance(j) = trim(line(1))//trim(line(2))//trim(line(3)) ! SetServices for new Connector instance call NUOPC_DriverAddComp(driver, & srcCompLabel=trim(line(1)), dstCompLabel=trim(line(3)), & compSetServicesRoutine=conSS, comp=conn, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail call ESMF_AttributeSet(conn, name="Verbosity", & value="high", convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail if (size(line) == 4) then ! there are additional connection options specified ! -> set as Attribute for now on the connector object call ESMF_AttributeSet(conn, name="ConnectionOptions", & value=trim(line(4)), rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail endif endif endif endif endif ! clean-up deallocate(line) enddo slotCount = (slotCount+1) / 2 slotCount = max(slotCount, 1) ! at least one slot if (trim(mode)=="setRunSequence") then allocate(slotStack(slotCount)) ! Replace the default RunSequence with a customized one call NUOPC_DriverNewRunSequence(driver, slotCount=slotCount, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out ! Get driver intenalClock call ESMF_GridCompGet(driver, clock=internalClock, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out ! reset config to beginning of runSeq:: block call ESMF_ConfigFindLabel(config, label="runSeq::", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out level = 0 slot = 0 slotHWM = 0 do i=1, lineCount call ESMF_ConfigNextLine(config) allocate(line(count(i))) call ESMF_ConfigGetAttribute(config, line, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! process the configuration line if ((size(line) < 1) .or. (size(line) > 4)) then call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_BAD, & msg="Configuration line incorrectly formatted.", & line=__LINE__, & file=__FILE__) return ! bail out elseif (size(line) == 1) then ! either a model or a time step indicator if (index(trim(line(1)),"@") == 1) then ! time step indicator tempString=trim(line(1)) if (len(trim(tempString)) > 1) then ! entering new time loop level level = level + 1 slotStack(level)=slot slot = slotHWM + 1 slotHWM = slotHWM + 1 read(tempString(2:len(tempString)), *) seconds print *, "found time step indicator: ", seconds call ESMF_TimeIntervalSet(timeStep, s_r8=seconds, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out if (slot==1) then ! Set the timeStep of the internalClock call ESMF_ClockSet(internalClock, timeStep=timeStep, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out else ! Insert the link to a new slot, and set the timeStep call NUOPC_DriverAddRunElement(driver, slot=slotStack(level), & linkSlot=slot, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out subClock = ESMF_ClockCreate(internalClock, rc=rc) ! make a copy first if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_ClockSet(subClock, timeStep=timeStep, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call NUOPC_DriverSetRunSequence(driver, slot=slot, & clock=subClock, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out endif else ! exiting time loop level slot = slotStack(level) level = level - 1 endif else ! model slot = max(slot, 1) ! model outside of a time loop call NUOPC_DriverAddRunElement(driver, slot=slot, & compLabel=trim(line(1)), rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif elseif (size(line) == 2) then ! a model with a specific phase label call NUOPC_DriverAddRunElement(driver, slot=slot, & compLabel=trim(line(1)), phaseLabel=trim(line(2)), rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out elseif ((size(line) == 3) .or. (size(line) == 4)) then ! a connector if the second element is "->", with options if 4th part if (trim(line(2)) /= "->") then call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_BAD, & msg="Configuration line incorrectly formatted.", & line=__LINE__, & file=__FILE__) return ! bail out endif call NUOPC_DriverAddRunElement(driver, slot=slot, & srcCompLabel=trim(line(1)), dstCompLabel=trim(line(3)), rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out endif ! clean-up deallocate(line) enddo ! clean-up deallocate(slotStack) endif ! clean-up deallocate(count) if (trim(mode)=="setServicesConnectors") then deallocate(connectorInstance) endif end subroutine !----------------------------------------------------------------------------- subroutine Finalize(driver, rc) type(ESMF_GridComp) :: driver integer, intent(out) :: rc ! local variables integer :: localrc, stat type(WRAP_EARTH_INTERNAL_STATE) :: is logical :: existflag character(ESMF_MAXSTR) :: name rc = ESMF_SUCCESS ! query the Component for info call ESMF_GridCompGet(driver, name=name, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! query Component for this internal State nullify(is%EARTH_INT_STATE) call ESMF_GridCompGetInternalState(driver, is, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out ! deallocate internal state memory deallocate(is%EARTH_INT_STATE, stat=stat) if (ESMF_LogFoundDeallocError(statusToCheck=stat, & msg="Deallocation of internal state memory failed.", & line=__LINE__, file=trim(name)//":"//__FILE__, rcToReturn=rc)) & return ! bail out end subroutine !----------------------------------------------------------------------------- recursive subroutine ModifyCplLists(driver, importState, exportState, clock, & rc) type(ESMF_GridComp) :: driver type(ESMF_State) :: importState, exportState type(ESMF_Clock) :: clock integer, intent(out) :: rc character(len=160) :: name, msg type(ESMF_CplComp), pointer :: connectorList(:) integer :: i, j, cplListSize character(len=160), allocatable :: cplList(:) character(len=160) :: value type(WRAP_EARTH_INTERNAL_STATE) :: is rc = ESMF_SUCCESS ! query Component for this internal State nullify(is%EARTH_INT_STATE) call ESMF_GridCompGetInternalState(driver, is, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out call ESMF_LogWrite("Driver is in ModifyCplLists()", ESMF_LOGMSG_INFO, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out nullify(connectorList) call NUOPC_DriverGetComp(driver, compList=connectorList, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out write (msg,*) "Found ", size(connectorList), " Connectors."// & " Modifying CplList Attribute...." call ESMF_LogWrite(trim(msg), ESMF_LOGMSG_INFO, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out do i=1, size(connectorList) ! query Connector i for its name call ESMF_CplCompGet(connectorList(i), name=name, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out ! access CplList for Connector i call NUOPC_CompAttributeGet(connectorList(i), name="CplList", & itemCount=cplListSize, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out if (cplListSize>0) then allocate(cplList(cplListSize)) call NUOPC_CompAttributeGet(connectorList(i), name="CplList", & valueList=cplList, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out ! go through all of the entries in the cplList and add options do j=1, cplListSize cplList(j) = trim(cplList(j))//":DumpWeights=true" cplList(j) = trim(cplList(j))//":SrcTermProcessing=1:TermOrder=SrcSeq" ! add connection options read in from configuration file call ESMF_AttributeGet(connectorList(i), name="ConnectionOptions", & value=value, defaultValue="", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out cplList(j) = trim(cplList(j))//trim(value) enddo ! store the modified cplList in CplList attribute of connector i call ESMF_AttributeSet(connectorList(i), & name="CplList", valueList=cplList, & convention="NUOPC", purpose="General", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & return ! bail out deallocate(cplList) endif enddo deallocate(connectorList) end subroutine !----------------------------------------------------------------------------- #else ! !----------------------------------------------------------------------- !####################################################################### !----------------------------------------------------------------------- ! SUBROUTINE EARTH_INITIALIZE(EARTH_GRID_COMP & ,IMP_STATE & ,EXP_STATE & ,CLOCK_NEMS & ,RC_INIT) ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument Variables !------------------------ ! TYPE(ESMF_GridComp) :: EARTH_GRID_COMP !<-- The EARTH component ! TYPE(ESMF_State) :: IMP_STATE & !<-- The EARTH import state ,EXP_STATE !<-- The EARTH export state ! TYPE(ESMF_Clock) :: CLOCK_NEMS !<-- The NEMS component ESMF Clock ! INTEGER,INTENT(OUT) :: RC_INIT !<-- Error return code ! !----------------------------------------------------------------------- ! !--------------------- !*** Local Variables !--------------------- ! INTEGER :: RC ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! RC_INIT = ESMF_SUCCESS ! !----------------------------------------------------------------------- !*** Allocate the EARTH component's internal state, point at it, !*** and attach it to the EARTH component. !----------------------------------------------------------------------- ! ALLOCATE(EARTH_INT_STATE,stat=RC) wrap%EARTH_INT_STATE=>EARTH_INT_STATE ! CALL ESMF_GridCompSetInternalState(EARTH_GRID_COMP & !<--The EARTH component ,WRAP & !<-- Pointer to the EARTH internal state ,RC) ESMF_ERR_RETURN(RC,RC_INIT) ! !----------------------------------------------------------------------- !*** For the moment, use a direct copy of the NEMS Clock within !*** the EARTH component. !----------------------------------------------------------------------- ! earth_int_state%CLOCK_EARTH=CLOCK_NEMS ! !----------------------------------------------------------------------- !*** The ATM (atmosphere) gridded component resides inside of !*** the EARTH internal state. !----------------------------------------------------------------------- ! earth_int_state%ATM_GRID_COMP=ESMF_GridCompCreate(name ="ATM component" & ,rc =RC) !----------------------------------------------------------------------- !*** Register the Initialize, Run, and Finalize routines of !*** the ATM component. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Register ATM Init, Run, Finalize" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetServices(earth_int_state%ATM_GRID_COMP & ,ATM_REGISTER & !<-- The user's subroutine name ,rc=RC) ESMF_ERR_RETURN(RC,RC_INIT) ! !----------------------------------------------------------------------- !*** Create the ATM import and export states. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Create the ATM import state" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! earth_int_state%ATM_IMP_STATE=ESMF_StateCreate(STATENAME="ATM Import" & ,stateintent = ESMF_STATEINTENT_IMPORT & ,rc =RC) ESMF_ERR_RETURN(RC,RC_INIT) ! !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Create the ATM export state" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! earth_int_state%ATM_EXP_STATE=ESMF_StateCreate(STATENAME ="ATM Export" & ,stateintent = ESMF_STATEINTENT_EXPORT & ,rc =RC) ESMF_ERR_RETURN(RC,RC_INIT) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- !*** Insert the import/export states of the ATMOS component into the !*** import/export states of the EARTH component. This simplifies !*** the passing of information between lower and higher component !*** levels seen in the diagram above. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK= "Add the ATMOS states into the EARTH states" ! CALL ESMF_LogWrite(MESSAGE_CHECK, ESMF_LOGMSG_INFO, rc = RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateAdd(IMP_STATE, LISTWRAPPER(earth_int_state%ATM_IMP_STATE), rc = RC) ESMF_ERR_RETURN(RC,RC_INIT) ! CALL ESMF_StateAdd(EXP_STATE, LISTWRAPPER(earth_int_state%ATM_EXP_STATE), rc = RC) ESMF_ERR_RETURN(RC,RC_INIT) ! !----------------------------------------------------------------------- !*** Execute the Initialize step of the ATM component. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Execute the Initialize step of the ATM component" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompInitialize(gridcomp =earth_int_state%ATM_GRID_COMP & ,importState=earth_int_state%ATM_IMP_STATE & ,exportState=earth_int_state%ATM_EXP_STATE & ,clock =earth_int_state%CLOCK_EARTH & ,phase =1 & ,rc =RC) ESMF_ERR_RETURN(RC,RC_INIT) !----------------------------------------------------------------------- ! END SUBROUTINE EARTH_INITIALIZE ! !----------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE EARTH_RUN(EARTH_GRID_COMP & ,IMP_STATE & ,EXP_STATE & ,CLOCK_NEMS & ,RC_RUN) ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument Variables !------------------------ ! TYPE(ESMF_GridComp) :: EARTH_GRID_COMP !<-- The EARTH component ! TYPE(ESMF_State) :: IMP_STATE & !<-- The EARTH import state ,EXP_STATE !<-- The EARTH export state ! TYPE(ESMF_Clock) :: CLOCK_NEMS !<-- The NEMS component ESMF Clock ! INTEGER,INTENT(OUT) :: RC_RUN !<-- Error return code ! !--------------------- !*** Local Variables !--------------------- ! TYPE(ESMF_Time) :: CURRTIME & ,STARTTIME ! TYPE(ESMF_TimeInterval) :: RUNDURATION ! INTEGER :: RC ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! RC_RUN = ESMF_SUCCESS ! !----------------------------------------------------------------------- !*** Execute the Run step of the ATM component. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Execute the Run step of the ATM component" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompRun(gridcomp =earth_int_state%ATM_GRID_COMP & ,importState=earth_int_state%ATM_IMP_STATE & ,exportState=earth_int_state%ATM_EXP_STATE & ,clock =earth_int_state%CLOCK_EARTH & ,phase =1 & ,rc =RC) ESMF_ERR_RETURN(RC,RC_RUN) ! !----------------------------------------------------------------------- !*** Update the EARTH clock. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK = "Update the current time of the EARTH clock" ! CALL ESMF_LogWrite(MESSAGE_CHECK, ESMF_LOGMSG_INFO, rc = RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ClockGet(clock = earth_int_state%CLOCK_EARTH & ,startTime = startTime & ,runDuration = runDuration & ,rc = RC) ESMF_ERR_RETURN(RC,RC_RUN) ! CURRTIME = STARTTIME + RUNDURATION ! CALL ESMF_ClockSet(clock = earth_int_state%CLOCK_EARTH & ,currTime = CURRTIME & ,rc = RC) ESMF_ERR_RETURN(RC,RC_RUN) ! !----------------------------------------------------------------------- ! END SUBROUTINE EARTH_RUN ! !----------------------------------------------------------------------- !####################################################################### !----------------------------------------------------------------------- ! SUBROUTINE EARTH_FINALIZE(EARTH_GRID_COMP & ,IMP_STATE & ,EXP_STATE & ,CLOCK_NEMS & ,RC_FINALIZE) ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument Variables !------------------------ ! TYPE(ESMF_GridComp) :: EARTH_GRID_COMP !<-- The EARTH component ! TYPE(ESMF_State) :: IMP_STATE & !<-- The EARTH import state ,EXP_STATE !<-- The EARTH export state ! TYPE(ESMF_Clock) :: CLOCK_NEMS !<-- The NEMS component ESMF Clock ! INTEGER,INTENT(OUT) :: RC_FINALIZE !<-- Error return code ! !--------------------- !*** Local Variables !--------------------- ! !----------------------------------------------------------------------- ! INTEGER :: RC ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! RC_FINALIZE = ESMF_SUCCESS ! !----------------------------------------------------------------------- !*** Execute the Finalize step of the ATM ccomponent. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Execute the Finalize step of the ATM component" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompFinalize(gridcomp =earth_int_state%ATM_GRID_COMP & ,importState=earth_int_state%ATM_IMP_STATE & ,exportState=earth_int_state%ATM_EXP_STATE & ,clock =earth_int_state%CLOCK_EARTH & ,phase =1 & ,rc =RC) ESMF_ERR_RETURN(RC,RC_FINALIZE) ! !----------------------------------------------------------------------- ! END SUBROUTINE EARTH_FINALIZE #endif ! !----------------------------------------------------------------------- ! END MODULE module_EARTH_GRID_COMP ! !-----------------------------------------------------------------------