From 3ba89eb6a6076b061988c76ee05618415a605f42 Mon Sep 17 00:00:00 2001 From: "denise.worthen" Date: Tue, 10 Dec 2019 12:52:55 +0000 Subject: [PATCH 01/12] Bring in CMEPS --- src/GNUmakefile | 4 + src/MAIN_NEMS.F90 | 20 ++ src/incmake/component_CICE.mk | 7 + src/incmake/component_CMEPS.mk | 47 ++++ src/incmake/component_MOM6.mk | 7 + src/module_EARTH_GRID_COMP.F90 | 413 ++++++++++++++++++++++++++++++++- 6 files changed, 491 insertions(+), 7 deletions(-) create mode 100644 src/incmake/component_CMEPS.mk diff --git a/src/GNUmakefile b/src/GNUmakefile index 4032717d..78637cc3 100644 --- a/src/GNUmakefile +++ b/src/GNUmakefile @@ -74,6 +74,10 @@ $(foreach COMP,$(COMP_LINK_ORDER),$(eval $(call comp_template,$(COMP)))) CPPFLAGS += $(DEP_FRONTS) +ifneq (,$(findstring CMEPS,$(COMPONENTS))) +CPPFLAGS += -DCMEPS +endif + TARGET = ../exe/NEMS.x ifneq (,$(findstring MACOSX,$(CPPDEFS))) diff --git a/src/MAIN_NEMS.F90 b/src/MAIN_NEMS.F90 index c25c6831..26905ff6 100644 --- a/src/MAIN_NEMS.F90 +++ b/src/MAIN_NEMS.F90 @@ -64,6 +64,14 @@ PROGRAM MAIN_NEMS !----------------------------------------------------------------------- ! USE module_NEMS_Rusage,ONLY: NEMS_Rusage +#ifdef CMEPS +! +!----------------------------------------------------------------------- +!*** This module init PIO +!----------------------------------------------------------------------- +! + USE shr_pio_mod, ONLY : shr_pio_init1 +#endif ! !----------------------------------------------------------------------- ! @@ -118,6 +126,9 @@ PROGRAM MAIN_NEMS ! CHARACTER(LEN=MPI_MAX_PROCESSOR_NAME) :: PROCNAME !<-- The processor(host) name INTEGER :: PROCNAME_LEN !<-- Actual PROCRNAME string length +#ifdef CMEPS + INTEGER :: COMP_COMM +#endif ! !----------------------------------------------------------------------- !*********************************************************************** @@ -189,6 +200,15 @@ PROGRAM MAIN_NEMS call rusage%start(MPI_COMM_WORLD,PROCNAME,PROCNAME_LEN,RC) ! It is safe to ignore RC since rusage%is_valid will tell us if ! the start succeeded. +#ifdef CMEPS +! +!----------------------------------------------------------------------- +!*** Initialize PIO +!----------------------------------------------------------------------- +! + COMP_COMM = MPI_COMM_WORLD + call shr_pio_init1(8, "pio_in", COMP_COMM) +#endif ! !----------------------------------------------------------------------- !*** Set up the default log. diff --git a/src/incmake/component_CICE.mk b/src/incmake/component_CICE.mk index 222e3d93..f5b50d65 100644 --- a/src/incmake/component_CICE.mk +++ b/src/incmake/component_CICE.mk @@ -16,6 +16,12 @@ NEMS_GRID?=T126_mx5 $(call require_dir,$(CICE_SRCDIR),CICE source directory) $(call require_dir,$(ROOTDIR)/CICE_CAP,CICE cap directory) +ifneq (,$(findstring CMEPS,$(COMPONENTS))) +CPPCMEPS = -DCMEPS +else +CPPCMEPS = +endif + CICE_ALL_OPTS=\ COMP_SRCDIR=$(CICE_SRCDIR) \ COMP_BINDIR=$(CICE_BINDIR) \ @@ -23,6 +29,7 @@ CICE_ALL_OPTS=\ SYSTEM_USERDIR="$(CICE_SRCDIR)" \ SRCDIR="$(CICE_SRCDIR)" \ EXEDIR="$(CICE_SRCDIR)" \ + CPPCMEPS="$(CPPCMEPS)" \ NEMS_GRID="$(NEMS_GRID)" ######################################################################## diff --git a/src/incmake/component_CMEPS.mk b/src/incmake/component_CMEPS.mk new file mode 100644 index 00000000..fcdc9c06 --- /dev/null +++ b/src/incmake/component_CMEPS.mk @@ -0,0 +1,47 @@ +# Location of the ESMF makefile fragment for this component: +cmeps_mk = $(CMEPS_BINDIR)/cmeps.mk +all_component_mk_files+=$(cmeps_mk) + +# Location of source code and installation +CMEPS_SRCDIR?=$(ROOTDIR)/CMEPS +CMEPS_BINDIR?=$(ROOTDIR)/CMEPS_INSTALL + +# Make sure the expected directories exist and are non-empty: +$(call require_dir,$(CMEPS_SRCDIR),CMEPS source directory) + +ifndef CONFIGURE_NEMS_FILE +$(error CONFIGURE_NEMS_FILE not set.) +endif + +include $(CONFIGURE_NEMS_FILE) + +# Rule for building this component: +build_CMEPS: $(cmeps_mk) + +CMEPS_ALL_OPTS=\ + COMP_SRCDIR="$(CMEPS_SRCDIR)" \ + COMP_BINDIR="$(CMEPS_BINDIR)" \ + MACHINE_ID="$(MACHINE_ID)" \ + FC="$(FC)" \ + CC="$(CC)" \ + CXX="$(CXX)" + +$(cmeps_mk): configure + $(MODULE_LOGIC) ; export $(CMEPS_ALL_OPTS) ; \ + set -e ; \ + $(MODULE_LOGIC) ; cd $(CMEPS_SRCDIR) ; \ + exec $(MAKE) $(CMEPS_ALL_OPTS) \ + "INSTALLDIR=$(CMEPS_BINDIR)" install + test -d "$(CMEPS_BINDIR)" + test -s "$(cmeps_mk)" + +# Rule for cleaning the SRCDIR and BINDIR: +clean_CMEPS: + $(MODULE_LOGIC) ; export $(CMEPS_ALL_OPTS) ; \ + set -e ; \ + cd $(CMEPS_SRCDIR) ; \ + exec $(MAKE) clean + +distclean_CMEPS: clean_CMEPS + rm -rf $(CMEPS_BINDIR) + rm -f $(cmeps_mk) diff --git a/src/incmake/component_MOM6.mk b/src/incmake/component_MOM6.mk index 41cdfc12..20e29690 100644 --- a/src/incmake/component_MOM6.mk +++ b/src/incmake/component_MOM6.mk @@ -12,10 +12,17 @@ $(call require_dir,$(MOM6_SRCDIR),MOM6 source directory) # Rule for building this component: build_MOM6: $(mom6_mk) +ifneq (,$(findstring CMEPS,$(COMPONENTS))) +CPPCMEPS = -DCMEPS +else +CPPCMEPS = +endif + MOM6_ALL_OPTS=\ COMP_SRCDIR="$(MOM6_SRCDIR)" \ COMP_BINDIR="$(MOM6_BINDIR)" \ FMS_BINDIR="$(FMS_BINDIR)" \ + CPPCMEPS="$(CPPCMEPS)" \ MACHINE_ID="$(MACHINE_ID)" # Workaround: if MOM6 is built twice, it fails because files in diff --git a/src/module_EARTH_GRID_COMP.F90 b/src/module_EARTH_GRID_COMP.F90 index 18390b1d..c775c23b 100644 --- a/src/module_EARTH_GRID_COMP.F90 +++ b/src/module_EARTH_GRID_COMP.F90 @@ -150,7 +150,11 @@ MODULE module_EARTH_GRID_COMP use FRONT_GSDCHEM, only: GSDCHEM_SS => SetServices #endif ! - Mediator +#ifdef CMEPS + use MED, only : MED_SS => SetServices +#else use module_MEDIATOR, only: MED_SS => SetServices +#endif use module_MEDSpaceWeather, only: MEDSW_SS => SetServices USE module_EARTH_INTERNAL_STATE,ONLY: EARTH_INTERNAL_STATE & @@ -279,6 +283,13 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) !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 +#ifdef CMEPS + call NUOPC_FieldDictionarySetup("fd.yaml", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out +#else if (.not.NUOPC_FieldDictionaryHasEntry( & "air_density_height_lowest")) then call NUOPC_FieldDictionaryAddEntry( & @@ -587,6 +598,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + !For MOM6 and WW3 variables to match: if (.not.NUOPC_FieldDictionaryHasEntry( & "eastward_partitioned_stokes_drift_1")) then @@ -598,7 +610,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) line=__LINE__, & file=__FILE__)) & return ! bail out - endif + endif if (.not.NUOPC_FieldDictionaryHasEntry( & "northward_partitioned_stokes_drift_1")) then @@ -611,6 +623,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + if (.not.NUOPC_FieldDictionaryHasEntry( & "eastward_partitioned_stokes_drift_2")) then call NUOPC_FieldDictionaryAddEntry( & @@ -622,6 +635,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + if (.not.NUOPC_FieldDictionaryHasEntry( & "northward_partitioned_stokes_drift_2")) then call NUOPC_FieldDictionaryAddEntry( & @@ -633,6 +647,9 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + + + if (.not.NUOPC_FieldDictionaryHasEntry( & "eastward_partitioned_stokes_drift_3")) then call NUOPC_FieldDictionaryAddEntry( & @@ -657,6 +674,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) return ! bail out endif ! end of MOM6 and WW3 variables to match + if (.not.NUOPC_FieldDictionaryHasEntry( & "inst_temp_height_surface")) then call NUOPC_FieldDictionaryAddEntry( & @@ -3218,6 +3236,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif +#endif !----------------------------------------------------------------------- ! @@ -3229,6 +3248,9 @@ END SUBROUTINE EARTH_REGISTER ! subroutine SetModelServices(driver, rc) +#ifdef CMEPS + use med_internalstate_mod , only : med_id +#endif type(ESMF_GridComp) :: driver integer, intent(out) :: rc @@ -3246,7 +3268,12 @@ subroutine SetModelServices(driver, rc) integer :: petListBounds(2) integer :: componentCount type(NUOPC_FreeFormat) :: attrFF, fdFF - +#ifdef CMEPS + logical :: read_restart + character(ESMF_MAXSTR) :: cvalue + character(len=5) :: inst_suffix + logical :: isPresent +#endif rc = ESMF_SUCCESS ! query the Component for info @@ -3320,7 +3347,38 @@ subroutine SetModelServices(driver, rc) label="EARTH_component_list:", count=componentCount, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - + +#ifdef CMEPS + ! get file suffix + call NUOPC_CompAttributeGet(driver, name="inst_suffix", isPresent=isPresent, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + if (isPresent) then + call NUOPC_CompAttributeGet(driver, name="inst_suffix", value=inst_suffix, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + else + inst_suffix = "" + endif + + ! obtain driver attributes (for CMEPS) + call ReadAttributes(driver, config, "DRIVER_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + + call ReadAttributes(driver, config, "FLDS_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + + call ReadAttributes(driver, config, "CLOCK_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + + call ReadAttributes(driver, config, "ALLCOMP_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out +#endif + ! determine information for each component and add to the driver do i=1, componentCount ! construct component prefix @@ -3353,7 +3411,7 @@ subroutine SetModelServices(driver, rc) do j=petListBounds(1), petListBounds(2) petList(j-petListBounds(1)+1) = j ! PETs are 0 based enddo - + if (trim(model) == "satm") then #ifdef FRONT_SATM call NUOPC_DriverAddComp(driver, trim(prefix), SATM_SS, & @@ -3728,7 +3786,7 @@ subroutine SetModelServices(driver, rc) write (msg, *) "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) + file=__FILE__, rcToReturn=rc) return ! bail out #endif elseif (trim(model) == "wrfhydro") then @@ -3759,6 +3817,9 @@ subroutine SetModelServices(driver, rc) #endif ! - Two mediator choices currently built into NEMS from internal elseif (trim(model) == "nems") then +#ifdef CMEPS + med_id = i+1 +#endif call NUOPC_DriverAddComp(driver, trim(prefix), MED_SS, & petList=petList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -3791,9 +3852,19 @@ subroutine SetModelServices(driver, rc) ! clean-up deallocate(petList) - + +#ifdef CMEPS + ! Perform restarts if appropriate + call InitRestart(driver, rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + + call AddAttributes(comp, driver, config, i+1, trim(prefix), inst_suffix, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out +#endif enddo - + #if ESMF_VERSION_MAJOR < 8 !TODOgjt: REMOVE THIS BLOCK ONCE SHOWN TO WORK WITHOUT ! SetServices for Connectors @@ -4266,6 +4337,334 @@ recursive subroutine ModifyCplLists(driver, importState, exportState, clock, & end subroutine !----------------------------------------------------------------------------- + +#ifdef CMEPS + subroutine ReadAttributes(gcomp, config, label, relaxedflag, formatprint, rc) + + use ESMF , only : ESMF_GridComp, ESMF_Config, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS + use NUOPC , only : NUOPC_FreeFormatCreate, NUOPC_CompAttributeIngest + use NUOPC , only : NUOPC_FreeFormatDestroy, NUOPC_FreeFormat + + ! input/output arguments + type(ESMF_GridComp) , intent(inout) :: gcomp + type(ESMF_Config) , intent(in) :: config + character(len=*) , intent(in) :: label + logical , intent(in), optional :: relaxedflag + logical , intent(in), optional :: formatprint + integer , intent(inout) :: rc + + ! local variables + type(NUOPC_FreeFormat) :: attrFF + character(len=*), parameter :: subname = "(module_EARTH_GRID_COMP.F90:ReadAttributes)" + !------------------------------------------- + + rc = ESMF_SUCCESS + + if (present(relaxedflag)) then + attrFF = NUOPC_FreeFormatCreate(config, label=trim(label), relaxedflag=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + else + attrFF = NUOPC_FreeFormatCreate(config, label=trim(label), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + end if + + call NUOPC_CompAttributeIngest(gcomp, attrFF, addFlag=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + call NUOPC_FreeFormatDestroy(attrFF, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + end subroutine ReadAttributes + + subroutine InitRestart(driver, rc) + + !----------------------------------------------------- + ! Determine if will restart and read pointer file if appropriate + !----------------------------------------------------- + + use ESMF , only : ESMF_GridComp, ESMF_VM, ESMF_GridCompGet, ESMF_VMGet, ESMF_SUCCESS + use ESMF , only : ESMF_LogSetError, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_RC_NOT_VALID + use NUOPC , only : NUOPC_CompAttributeGet, NUOPC_CompAttributeSet, NUOPC_CompAttributeAdd + + ! input/output variables + type(ESMF_GridComp) , intent(inout) :: driver + integer , intent(out) :: rc + + ! local variables + logical :: read_restart ! read the restart file, based on start_type + character(len=ESMF_MAXSTR) :: cvalue ! temporary + character(len=ESMF_MAXSTR) :: rest_case_name ! Short case identification + character(len=*) , parameter :: subname = "(module_EARTH_GRID_COMP.F90:InitRestart)" + !------------------------------------------- + + rc = ESMF_SUCCESS + call ESMF_LogWrite(trim(subname)//": called", ESMF_LOGMSG_INFO, rc=rc) + + !----------------------------------------------------- + ! Carry out restart if appropriate + !----------------------------------------------------- + + read_restart = IsRestart(driver, rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + ! Add rest_case_name and read_restart to driver attributes + call NUOPC_CompAttributeAdd(driver, attrList=(/'rest_case_name','read_restart '/), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + rest_case_name = ' ' + call NUOPC_CompAttributeSet(driver, name='rest_case_name', value=rest_case_name, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + write(cvalue,*) read_restart + call NUOPC_CompAttributeSet(driver, name='read_restart', value=trim(cvalue), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + end subroutine InitRestart + + function IsRestart(gcomp, rc) + + use ESMF , only : ESMF_GridComp, ESMF_SUCCESS + use ESMF , only : ESMF_LogSetError, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_RC_NOT_VALID + use NUOPC , only : NUOPC_CompAttributeGet + + ! input/output variables + logical :: IsRestart + type(ESMF_GridComp) , intent(inout) :: gcomp + integer , intent(out) :: rc + + ! locals + character(len=ESMF_MAXSTR) :: start_type ! Type of startup + character(len=ESMF_MAXSTR) :: msgstr + character(len=*) , parameter :: start_type_start = "startup" + character(len=*) , parameter :: start_type_cont = "continue" + character(len=*) , parameter :: start_type_brnch = "branch" + character(len=*) , parameter :: subname = "(module_EARTH_GRID_COMP.F90:IsRestart)" + !--------------------------------------- + + rc = ESMF_SUCCESS + + ! First Determine if restart is read + call NUOPC_CompAttributeGet(gcomp, name='start_type', value=start_type, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + if ((trim(start_type) /= start_type_start) .and. & + (trim(start_type) /= start_type_cont ) .and. & + (trim(start_type) /= start_type_brnch)) then + write (msgstr, *) subname//': start_type invalid = '//trim(start_type) + call ESMF_LogSetError(ESMF_RC_NOT_VALID, msg=msgstr, line=__LINE__, file=__FILE__, rcToReturn=rc) + return + end if + + !TODO: this is hard-wired to CIME start/continue types in terms of gcomp + IsRestart = .false. + if (trim(start_type) == trim(start_type_cont) .or. trim(start_type) == trim(start_type_brnch)) then + IsRestart = .true. + end if + + end function IsRestart + + subroutine AddAttributes(gcomp, driver, config, compid, compname, inst_suffix, rc) + + ! Add specific set of attributes to components from driver attributes + + use ESMF , only : ESMF_GridComp, ESMF_Config, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS + use ESMF , only : ESMF_LogFoundAllocError, ESMF_ConfigGetLen, ESMF_ConfigGetAttribute + use NUOPC , only : NUOPC_CompAttributeAdd, NUOPC_CompAttributeGet, NUOPC_CompAttributeSet + + ! input/output parameters + type(ESMF_GridComp) , intent(inout) :: gcomp + type(ESMF_GridComp) , intent(in) :: driver + type(ESMF_Config) , intent(inout) :: config + integer , intent(in) :: compid + character(len=*) , intent(in) :: compname + character(len=*) , intent(in) :: inst_suffix + integer , intent(inout) :: rc + + ! local variables + integer :: n + integer :: stat + integer :: inst_index + logical :: is_present + character(len=ESMF_MAXSTR) :: cvalue + character(len=32), allocatable :: compLabels(:) + character(len=32), allocatable :: attrList(:) + integer :: componentCount + character(len=*), parameter :: subname = "(module_EARTH_GRID_COMP.F90:AddAttributes)" + logical :: lvalue = .false. + !------------------------------------------- + + rc = ESMF_Success + call ESMF_LogWrite(trim(subname)//": called", ESMF_LOGMSG_INFO) + + !------ + ! Add compid to gcomp attributes + !------ + !write(cvalue,*) compid + !call NUOPC_CompAttributeAdd(gcomp, attrList=(/'MCTID'/), rc=rc) + !if (chkerr(rc,__LINE__,u_FILE_u)) return + !call NUOPC_CompAttributeSet(gcomp, name='MCTID', value=trim(cvalue), rc=rc) + !if (chkerr(rc,__LINE__,u_FILE_u)) return + + !------ + ! Add all the other attributes in AttrList (which have already been added to driver attributes) + !------ + !allocate(attrList(5)) + !attrList = (/"read_restart", "orb_eccen ", "orb_obliqr ", "orb_lambm0 ", "orb_mvelpp "/) + ! TODO: orb_obliqr and orb_lambm0 not exist + allocate(attrList(1)) + attrList = (/"read_restart"/) + + call NUOPC_CompAttributeAdd(gcomp, attrList=attrList, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + do n = 1,size(attrList) + if (trim(attrList(n)) == "read_restart") then + call NUOPC_CompAttributeGet(driver, name="mediator_read_restart", value=cvalue, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + read(cvalue,*) lvalue + + if (.not. lvalue) then + call NUOPC_CompAttributeGet(driver, name=trim(attrList(n)), value=cvalue, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + end if + + call NUOPC_CompAttributeSet(gcomp, name=trim(attrList(n)), value=trim(cvalue), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + else + print*, trim(attrList(n)) + call NUOPC_CompAttributeGet(driver, name=trim(attrList(n)), value=cvalue, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + call NUOPC_CompAttributeSet(gcomp, name=trim(attrList(n)), value=trim(cvalue), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + end if + enddo + deallocate(attrList) + + !------ + ! Add component specific attributes + !------ + call ReadAttributes(gcomp, config, trim(compname)//"_attributes::", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + call ReadAttributes(gcomp, config, "ALLCOMP_attributes::", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + call ReadAttributes(gcomp, config, trim(compname)//"_modelio"//trim(inst_suffix)//"::", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + call ReadAttributes(gcomp, config, "CLOCK_attributes::", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + !------ + ! Add mediator specific attributes + !------ + if (compname == 'MED') then + call ReadAttributes(gcomp, config, "MED_history_attributes::", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + call ReadAttributes(gcomp, config, "FLDS_attributes::", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + endif + + !------ + ! Add multi-instance specific attributes + !------ + call NUOPC_CompAttributeAdd(gcomp, attrList=(/'inst_index'/), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + ! add inst_index attribute (inst_index is not required for cime internal components) + ! for now hard-wire inst_index to 1 + inst_index = 1 + write(cvalue,*) inst_index + call NUOPC_CompAttributeSet(gcomp, name='inst_index', value=trim(cvalue), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + ! add inst_suffix attribute + if (len_trim(inst_suffix) > 0) then + call NUOPC_CompAttributeAdd(gcomp, attrList=(/'inst_suffix'/), rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + call NUOPC_CompAttributeSet(gcomp, name='inst_suffix', value=inst_suffix, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + end if + + end subroutine AddAttributes +#endif ! !----------------------------------------------------------------------- ! From f0da12c76158913b1a3239e136033b37a2360cc6 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Sat, 14 Dec 2019 13:13:10 -0700 Subject: [PATCH 02/12] updates to get remove CMEPS #ifdefs as much as possible --- src/MAIN_NEMS.F90 | 20 ---- src/module_EARTH_GRID_COMP.F90 | 185 +++++++++++++++++++++------------ src/module_MEDIATOR.F90 | 30 +++--- 3 files changed, 133 insertions(+), 102 deletions(-) diff --git a/src/MAIN_NEMS.F90 b/src/MAIN_NEMS.F90 index 26905ff6..c25c6831 100644 --- a/src/MAIN_NEMS.F90 +++ b/src/MAIN_NEMS.F90 @@ -64,14 +64,6 @@ PROGRAM MAIN_NEMS !----------------------------------------------------------------------- ! USE module_NEMS_Rusage,ONLY: NEMS_Rusage -#ifdef CMEPS -! -!----------------------------------------------------------------------- -!*** This module init PIO -!----------------------------------------------------------------------- -! - USE shr_pio_mod, ONLY : shr_pio_init1 -#endif ! !----------------------------------------------------------------------- ! @@ -126,9 +118,6 @@ PROGRAM MAIN_NEMS ! CHARACTER(LEN=MPI_MAX_PROCESSOR_NAME) :: PROCNAME !<-- The processor(host) name INTEGER :: PROCNAME_LEN !<-- Actual PROCRNAME string length -#ifdef CMEPS - INTEGER :: COMP_COMM -#endif ! !----------------------------------------------------------------------- !*********************************************************************** @@ -200,15 +189,6 @@ PROGRAM MAIN_NEMS call rusage%start(MPI_COMM_WORLD,PROCNAME,PROCNAME_LEN,RC) ! It is safe to ignore RC since rusage%is_valid will tell us if ! the start succeeded. -#ifdef CMEPS -! -!----------------------------------------------------------------------- -!*** Initialize PIO -!----------------------------------------------------------------------- -! - COMP_COMM = MPI_COMM_WORLD - call shr_pio_init1(8, "pio_in", COMP_COMM) -#endif ! !----------------------------------------------------------------------- !*** Set up the default log. diff --git a/src/module_EARTH_GRID_COMP.F90 b/src/module_EARTH_GRID_COMP.F90 index c775c23b..0758b7bf 100644 --- a/src/module_EARTH_GRID_COMP.F90 +++ b/src/module_EARTH_GRID_COMP.F90 @@ -152,6 +152,7 @@ MODULE module_EARTH_GRID_COMP ! - Mediator #ifdef CMEPS use MED, only : MED_SS => SetServices + use med_internalstate_mod , only : med_id #else use module_MEDIATOR, only: MED_SS => SetServices #endif @@ -179,7 +180,11 @@ MODULE module_EARTH_GRID_COMP ! LOGICAL, PRIVATE :: flag_verbose_diagnostics = .false. - +#ifdef CMEPS + logical :: use_cmeps = .true. +#else + logical :: use_cmeps = .false. +#endif CONTAINS @@ -283,13 +288,14 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) !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 -#ifdef CMEPS - call NUOPC_FieldDictionarySetup("fd.yaml", rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__)) & - return ! bail out -#else + if (use_cmeps) then + call NUOPC_FieldDictionarySetup("fd.yaml", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out + + else if (.not.NUOPC_FieldDictionaryHasEntry( & "air_density_height_lowest")) then call NUOPC_FieldDictionaryAddEntry( & @@ -312,6 +318,17 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + if (.not.NUOPC_FieldDictionaryHasEntry( & + "mean_zonal_moment_flx_atm")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_zonal_moment_flx_atm", & + 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( & @@ -323,6 +340,17 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + if (.not.NUOPC_FieldDictionaryHasEntry( & + "mean_merid_moment_flx_atm")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_merid_moment_flx_atm", & + 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( & @@ -334,6 +362,17 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + if (.not.NUOPC_FieldDictionaryHasEntry( & + "mean_sensi_heat_flx_atm")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_sensi_heat_flx_atm", & + 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( & @@ -367,6 +406,17 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif + if (.not.NUOPC_FieldDictionaryHasEntry( & + "mean_laten_heat_flx_atm")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_laten_heat_flx_atm", & + 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( & @@ -1283,9 +1333,9 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & - "mean_net_sw_flx")) then + "mean_net_lw_flx_atm")) then call NUOPC_FieldDictionaryAddEntry( & - standardName="mean_net_sw_flx", & + standardName="mean_net_lw_flx_atm", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1294,9 +1344,9 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & - "mean_up_lw_flx_ice")) then + "mean_net_sw_flx")) then call NUOPC_FieldDictionaryAddEntry( & - standardName="mean_up_lw_flx_ice", & + standardName="mean_net_sw_flx", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1305,9 +1355,9 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & - "mean_up_lw_flx_ocn")) then + "mean_up_lw_flx_ice")) then call NUOPC_FieldDictionaryAddEntry( & - standardName="mean_up_lw_flx_ocn", & + standardName="mean_up_lw_flx_ice", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -1316,9 +1366,9 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) return ! bail out endif if (.not. NUOPC_FieldDictionaryHasEntry( & - "inst_net_lw_flx")) then + "mean_up_lw_flx_ocn")) then call NUOPC_FieldDictionaryAddEntry( & - standardName="inst_net_lw_flx", & + standardName="mean_up_lw_flx_ocn", & canonicalUnits="W m-2", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -3236,7 +3286,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif -#endif + endif ! for if-cmeps !----------------------------------------------------------------------- ! @@ -3248,9 +3298,7 @@ END SUBROUTINE EARTH_REGISTER ! subroutine SetModelServices(driver, rc) -#ifdef CMEPS - use med_internalstate_mod , only : med_id -#endif + type(ESMF_GridComp) :: driver integer, intent(out) :: rc @@ -3268,12 +3316,10 @@ subroutine SetModelServices(driver, rc) integer :: petListBounds(2) integer :: componentCount type(NUOPC_FreeFormat) :: attrFF, fdFF -#ifdef CMEPS - logical :: read_restart - character(ESMF_MAXSTR) :: cvalue - character(len=5) :: inst_suffix - logical :: isPresent -#endif + logical :: read_restart ! CMEPS + character(ESMF_MAXSTR) :: cvalue ! CMEPS + character(len=5) :: inst_suffix ! CMEPS + logical :: isPresent ! CMEPS rc = ESMF_SUCCESS ! query the Component for info @@ -3348,36 +3394,36 @@ subroutine SetModelServices(driver, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out -#ifdef CMEPS - ! get file suffix - call NUOPC_CompAttributeGet(driver, name="inst_suffix", isPresent=isPresent, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - if (isPresent) then - call NUOPC_CompAttributeGet(driver, name="inst_suffix", value=inst_suffix, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - else - inst_suffix = "" - endif + if (use_cmeps) then + ! get file suffix + call NUOPC_CompAttributeGet(driver, name="inst_suffix", isPresent=isPresent, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + if (isPresent) then + call NUOPC_CompAttributeGet(driver, name="inst_suffix", value=inst_suffix, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + else + inst_suffix = "" + endif - ! obtain driver attributes (for CMEPS) - call ReadAttributes(driver, config, "DRIVER_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + ! obtain driver attributes (for CMEPS) + call ReadAttributes(driver, config, "DRIVER_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "FLDS_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + call ReadAttributes(driver, config, "FLDS_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "CLOCK_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + call ReadAttributes(driver, config, "CLOCK_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "ALLCOMP_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out -#endif + call ReadAttributes(driver, config, "ALLCOMP_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + end if ! determine information for each component and add to the driver do i=1, componentCount @@ -3817,9 +3863,11 @@ subroutine SetModelServices(driver, rc) #endif ! - Two mediator choices currently built into NEMS from internal elseif (trim(model) == "nems") then -#ifdef CMEPS - med_id = i+1 -#endif + + if (use_cmeps) then + med_id = i+1 + end if + call NUOPC_DriverAddComp(driver, trim(prefix), MED_SS, & petList=petList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -3853,16 +3901,17 @@ subroutine SetModelServices(driver, rc) ! clean-up deallocate(petList) -#ifdef CMEPS - ! Perform restarts if appropriate - call InitRestart(driver, rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + if (use_cmeps) then + ! Perform restarts if appropriate + call InitRestart(driver, rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + + call AddAttributes(comp, driver, config, i+1, trim(prefix), inst_suffix, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + end if - call AddAttributes(comp, driver, config, i+1, trim(prefix), inst_suffix, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out -#endif enddo #if ESMF_VERSION_MAJOR < 8 @@ -4337,10 +4386,10 @@ recursive subroutine ModifyCplLists(driver, importState, exportState, clock, & end subroutine !----------------------------------------------------------------------------- - -#ifdef CMEPS subroutine ReadAttributes(gcomp, config, label, relaxedflag, formatprint, rc) + ! Only used in for CMEPS + use ESMF , only : ESMF_GridComp, ESMF_Config, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS use NUOPC , only : NUOPC_FreeFormatCreate, NUOPC_CompAttributeIngest use NUOPC , only : NUOPC_FreeFormatDestroy, NUOPC_FreeFormat @@ -4391,6 +4440,7 @@ end subroutine ReadAttributes subroutine InitRestart(driver, rc) !----------------------------------------------------- + ! Only used in for CMEPS ! Determine if will restart and read pointer file if appropriate !----------------------------------------------------- @@ -4447,6 +4497,7 @@ end subroutine InitRestart function IsRestart(gcomp, rc) + ! Only used in for CMEPS use ESMF , only : ESMF_GridComp, ESMF_SUCCESS use ESMF , only : ESMF_LogSetError, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_RC_NOT_VALID use NUOPC , only : NUOPC_CompAttributeGet @@ -4492,6 +4543,7 @@ end function IsRestart subroutine AddAttributes(gcomp, driver, config, compid, compname, inst_suffix, rc) + ! Only used in for CMEPS ! Add specific set of attributes to components from driver attributes use ESMF , only : ESMF_GridComp, ESMF_Config, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS @@ -4664,7 +4716,6 @@ subroutine AddAttributes(gcomp, driver, config, compid, compname, inst_suffix, r end if end subroutine AddAttributes -#endif ! !----------------------------------------------------------------------- ! diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index 23ac5f7a..c618e2e2 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -561,19 +561,19 @@ subroutine SetServices(gcomp, rc) ! Fields from ATM - call fld_list_add(fldsFrAtm,"mean_zonal_moment_flx" , "cannot provide","conservefrac") - call fld_list_add(fldsFrAtm,"mean_merid_moment_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"mean_sensi_heat_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"mean_laten_heat_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_zonal_moment_flx_atm" , "cannot provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_merid_moment_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_sensi_heat_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_laten_heat_flx_atm" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_lw_flx" , "will provide","conservefrac") ! call fld_list_add(fldsFrAtm,"mean_up_lw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_sw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_prec_rate" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_fprec_rate" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_zonal_moment_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_merid_moment_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_sensi_heat_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_laten_heat_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_zonal_moment_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_merid_moment_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_sensi_heat_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_laten_heat_flx_atm" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_down_lw_flx" , "will provide","conservefrac") ! call fld_list_add(fldsFrAtm,"inst_up_lw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_down_sw_flx" , "will provide","conservefrac") @@ -594,9 +594,9 @@ subroutine SetServices(gcomp, rc) call fld_list_add(fldsFrAtm,"inst_pres_height_surface", "will provide","bilinear") call fld_list_add(fldsFrAtm,"inst_surface_height" , "will provide","bilinear") ! new imports from GSM added 04/23/14: - call fld_list_add(fldsFrAtm,"mean_net_lw_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_net_lw_flx_atm" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_net_sw_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_net_lw_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_net_lw_flx_atm" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_net_sw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_sw_ir_dir_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_sw_ir_dif_flx" , "will provide","conservefrac") @@ -5536,14 +5536,14 @@ subroutine MedPhase_prep_ocn(gcomp, rc) ! hycom uses latent heat flux call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_laten_heat_flx' , & is_local%wrap%FBAccumAtmOcn, 'mean_laten_heat_flx_atm_into_ocn', atmwgt1, & - is_local%wrap%FBAtm_o , 'mean_laten_heat_flx' , wgtm01, & + is_local%wrap%FBAtm_o , 'mean_laten_heat_flx_atm' , wgtm01, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_sensi_heat_flx' , & is_local%wrap%FBAccumAtmOcn, 'mean_sensi_heat_flx_atm_into_ocn', atmwgt1, & - is_local%wrap%FBAtm_o , 'mean_sensi_heat_flx' , wgtm01, & + is_local%wrap%FBAtm_o , 'mean_sensi_heat_flx_atm' , wgtm01, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -5551,7 +5551,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_net_lw_flx' , & is_local%wrap%FBAtm_o , 'mean_down_lw_flx' , atmwgt1, & is_local%wrap%FBAccumAtmOcn, 'mean_up_lw_flx_ocn', atmwgt1, & - is_local%wrap%FBAtm_o , 'mean_net_lw_flx' , wgtp01, & + is_local%wrap%FBAtm_o , 'mean_net_lw_flx_atm', wgtp01, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -5581,7 +5581,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_zonal_moment_flx' , & is_local%wrap%FBAccumAtmOcn, 'stress_on_air_ocn_zonal', atmwgt1, & is_local%wrap%FBIce_o , 'stress_on_ocn_ice_zonal', icewgt1, & - is_local%wrap%FBAtm_o , 'mean_zonal_moment_flx' , wgtm01, & + is_local%wrap%FBAtm_o , 'mean_zonal_moment_flx_atm' , wgtm01, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -5589,7 +5589,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_merid_moment_flx' , & is_local%wrap%FBAccumAtmOcn, 'stress_on_air_ocn_merid', atmwgt1, & is_local%wrap%FBIce_o , 'stress_on_ocn_ice_merid', icewgt1, & - is_local%wrap%FBAtm_o , 'mean_merid_moment_flx' , wgtm01, & + is_local%wrap%FBAtm_o , 'mean_merid_moment_flx_atm' , wgtm01, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out From d6bb4797a9629d141c946b0c9d9b818b23623721 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Sun, 15 Dec 2019 13:54:34 -0700 Subject: [PATCH 03/12] fixed compilation bug for NEMS --- src/module_EARTH_GRID_COMP.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/module_EARTH_GRID_COMP.F90 b/src/module_EARTH_GRID_COMP.F90 index 0758b7bf..c8261dce 100644 --- a/src/module_EARTH_GRID_COMP.F90 +++ b/src/module_EARTH_GRID_COMP.F90 @@ -151,7 +151,7 @@ MODULE module_EARTH_GRID_COMP #endif ! - Mediator #ifdef CMEPS - use MED, only : MED_SS => SetServices + use MED, only : MED_SS => SetServices use med_internalstate_mod , only : med_id #else use module_MEDIATOR, only: MED_SS => SetServices @@ -184,6 +184,7 @@ MODULE module_EARTH_GRID_COMP logical :: use_cmeps = .true. #else logical :: use_cmeps = .false. + integer :: med_id #endif CONTAINS @@ -3865,6 +3866,7 @@ subroutine SetModelServices(driver, rc) elseif (trim(model) == "nems") then if (use_cmeps) then + ! Set the mediator id for in med_internal_state for CMEPS med_id = i+1 end if From 68ba2295f7d6426520b542d75af74c55067012e5 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Sun, 15 Dec 2019 17:31:54 -0700 Subject: [PATCH 04/12] fixed problem with updates to nuopc dictionary in nems mode --- src/module_EARTH_GRID_COMP.F90 | 11 +++++++++++ src/module_MEDIATOR.F90 | 12 ++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/module_EARTH_GRID_COMP.F90 b/src/module_EARTH_GRID_COMP.F90 index c8261dce..dcebe485 100644 --- a/src/module_EARTH_GRID_COMP.F90 +++ b/src/module_EARTH_GRID_COMP.F90 @@ -1377,6 +1377,17 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) 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( & diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index c618e2e2..726b1425 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -570,10 +570,10 @@ subroutine SetServices(gcomp, rc) call fld_list_add(fldsFrAtm,"mean_down_sw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_prec_rate" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_fprec_rate" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_zonal_moment_flx_atm" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_merid_moment_flx_atm" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_sensi_heat_flx_atm" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_laten_heat_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_zonal_moment_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_merid_moment_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_sensi_heat_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_laten_heat_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_down_lw_flx" , "will provide","conservefrac") ! call fld_list_add(fldsFrAtm,"inst_up_lw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_down_sw_flx" , "will provide","conservefrac") @@ -594,9 +594,9 @@ subroutine SetServices(gcomp, rc) call fld_list_add(fldsFrAtm,"inst_pres_height_surface", "will provide","bilinear") call fld_list_add(fldsFrAtm,"inst_surface_height" , "will provide","bilinear") ! new imports from GSM added 04/23/14: - call fld_list_add(fldsFrAtm,"mean_net_lw_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_net_lw_flx_atm" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_net_sw_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"inst_net_lw_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"inst_net_lw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_net_sw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_sw_ir_dir_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_sw_ir_dif_flx" , "will provide","conservefrac") From 9fd4c3f4f572141ad72db8b84bc57167f7fec7eb Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Mon, 16 Dec 2019 12:20:28 -0700 Subject: [PATCH 05/12] simplified removal of CMEPS in module_EARTH_GRID_COMP.F90 --- src/module_EARTH_GRID_COMP.F90 | 129 +++++++++++++++------------------ 1 file changed, 60 insertions(+), 69 deletions(-) diff --git a/src/module_EARTH_GRID_COMP.F90 b/src/module_EARTH_GRID_COMP.F90 index dcebe485..6f80eac4 100644 --- a/src/module_EARTH_GRID_COMP.F90 +++ b/src/module_EARTH_GRID_COMP.F90 @@ -151,8 +151,7 @@ MODULE module_EARTH_GRID_COMP #endif ! - Mediator #ifdef CMEPS - use MED, only : MED_SS => SetServices - use med_internalstate_mod , only : med_id + use MED, only : MED_SS => SetServices #else use module_MEDIATOR, only: MED_SS => SetServices #endif @@ -180,12 +179,7 @@ MODULE module_EARTH_GRID_COMP ! LOGICAL, PRIVATE :: flag_verbose_diagnostics = .false. -#ifdef CMEPS - logical :: use_cmeps = .true. -#else - logical :: use_cmeps = .false. - integer :: med_id -#endif + CONTAINS @@ -289,14 +283,13 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) !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 (use_cmeps) then - call NUOPC_FieldDictionarySetup("fd.yaml", rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__)) & - return ! bail out - - else +#ifdef CMEPS + call NUOPC_FieldDictionarySetup("fd.yaml", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__)) & + return ! bail out +#else if (.not.NUOPC_FieldDictionaryHasEntry( & "air_density_height_lowest")) then call NUOPC_FieldDictionaryAddEntry( & @@ -3298,7 +3291,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif - endif ! for if-cmeps +#endif !----------------------------------------------------------------------- ! @@ -3310,7 +3303,9 @@ END SUBROUTINE EARTH_REGISTER ! subroutine SetModelServices(driver, rc) - +#ifdef CMEPS + use med_internalstate_mod , only : med_id +#endif type(ESMF_GridComp) :: driver integer, intent(out) :: rc @@ -3328,10 +3323,12 @@ subroutine SetModelServices(driver, rc) integer :: petListBounds(2) integer :: componentCount type(NUOPC_FreeFormat) :: attrFF, fdFF - logical :: read_restart ! CMEPS - character(ESMF_MAXSTR) :: cvalue ! CMEPS - character(len=5) :: inst_suffix ! CMEPS - logical :: isPresent ! CMEPS +#ifdef CMEPS + logical :: read_restart + character(ESMF_MAXSTR) :: cvalue + character(len=5) :: inst_suffix + logical :: isPresent +#endif rc = ESMF_SUCCESS ! query the Component for info @@ -3406,36 +3403,36 @@ subroutine SetModelServices(driver, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - if (use_cmeps) then - ! get file suffix - call NUOPC_CompAttributeGet(driver, name="inst_suffix", isPresent=isPresent, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - if (isPresent) then - call NUOPC_CompAttributeGet(driver, name="inst_suffix", value=inst_suffix, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - else - inst_suffix = "" - endif +#ifdef CMEPS + ! get file suffix + call NUOPC_CompAttributeGet(driver, name="inst_suffix", isPresent=isPresent, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + if (isPresent) then + call NUOPC_CompAttributeGet(driver, name="inst_suffix", value=inst_suffix, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + else + inst_suffix = "" + endif - ! obtain driver attributes (for CMEPS) - call ReadAttributes(driver, config, "DRIVER_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + ! obtain driver attributes (for CMEPS) + call ReadAttributes(driver, config, "DRIVER_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "FLDS_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + call ReadAttributes(driver, config, "FLDS_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "CLOCK_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + call ReadAttributes(driver, config, "CLOCK_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "ALLCOMP_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - end if + call ReadAttributes(driver, config, "ALLCOMP_attributes::", formatprint=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out +#endif ! determine information for each component and add to the driver do i=1, componentCount @@ -3875,12 +3872,9 @@ subroutine SetModelServices(driver, rc) #endif ! - Two mediator choices currently built into NEMS from internal elseif (trim(model) == "nems") then - - if (use_cmeps) then - ! Set the mediator id for in med_internal_state for CMEPS - med_id = i+1 - end if - +#ifdef CMEPS + med_id = i+1 +#endif call NUOPC_DriverAddComp(driver, trim(prefix), MED_SS, & petList=petList, comp=comp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -3914,17 +3908,16 @@ subroutine SetModelServices(driver, rc) ! clean-up deallocate(petList) - if (use_cmeps) then - ! Perform restarts if appropriate - call InitRestart(driver, rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - - call AddAttributes(comp, driver, config, i+1, trim(prefix), inst_suffix, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - end if +#ifdef CMEPS + ! Perform restarts if appropriate + call InitRestart(driver, rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out + call AddAttributes(comp, driver, config, i+1, trim(prefix), inst_suffix, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out +#endif enddo #if ESMF_VERSION_MAJOR < 8 @@ -4399,9 +4392,9 @@ recursive subroutine ModifyCplLists(driver, importState, exportState, clock, & end subroutine !----------------------------------------------------------------------------- - subroutine ReadAttributes(gcomp, config, label, relaxedflag, formatprint, rc) - ! Only used in for CMEPS +#ifdef CMEPS + subroutine ReadAttributes(gcomp, config, label, relaxedflag, formatprint, rc) use ESMF , only : ESMF_GridComp, ESMF_Config, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS use NUOPC , only : NUOPC_FreeFormatCreate, NUOPC_CompAttributeIngest @@ -4453,7 +4446,6 @@ end subroutine ReadAttributes subroutine InitRestart(driver, rc) !----------------------------------------------------- - ! Only used in for CMEPS ! Determine if will restart and read pointer file if appropriate !----------------------------------------------------- @@ -4510,7 +4502,6 @@ end subroutine InitRestart function IsRestart(gcomp, rc) - ! Only used in for CMEPS use ESMF , only : ESMF_GridComp, ESMF_SUCCESS use ESMF , only : ESMF_LogSetError, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_RC_NOT_VALID use NUOPC , only : NUOPC_CompAttributeGet @@ -4556,7 +4547,6 @@ end function IsRestart subroutine AddAttributes(gcomp, driver, config, compid, compname, inst_suffix, rc) - ! Only used in for CMEPS ! Add specific set of attributes to components from driver attributes use ESMF , only : ESMF_GridComp, ESMF_Config, ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS @@ -4729,6 +4719,7 @@ subroutine AddAttributes(gcomp, driver, config, compid, compname, inst_suffix, r end if end subroutine AddAttributes +#endif ! !----------------------------------------------------------------------- ! From 27e31c2ece3096210f1e2ffe14073b8944e7d799 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Mon, 16 Dec 2019 15:31:56 -0700 Subject: [PATCH 06/12] fixed problem with latent heat flux --- src/module_MEDIATOR.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index 726b1425..c89050ce 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -5487,7 +5487,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) customwgt = wgtm01 / const_lhvap call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_evap_rate' , & is_local%wrap%FBAccumAtmOcn, 'mean_evap_rate_atm_into_ocn', atmwgt1, & - is_local%wrap%FBAtm_o , 'mean_laten_heat_flx' , customwgt, & + is_local%wrap%FBAtm_o , 'mean_laten_heat_flx_atm' , customwgt, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out From 5fb087aa950cdce91aff807febd2d0abfd727b73 Mon Sep 17 00:00:00 2001 From: "denise.worthen" Date: Thu, 2 Jan 2020 16:31:29 +0000 Subject: [PATCH 07/12] fix divide by zero --- src/module_MEDIATOR.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index c89050ce..6039dc44 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -5143,9 +5143,11 @@ subroutine MedPhase_atm_ocn_flux(gcomp, rc) zbot1(1) = zbot(i,j) ubot1(1) = ubot(i,j) vbot1(1) = vbot(i,j) - thbot1(1) = tbot(i,j)*((100000._ESMF_KIND_R8/pbot(i,j))**0.286_ESMF_KIND_R8) ! tcx temporary + if(pbot(i,j) .gt. 0.0) & + thbot1(1) = tbot(i,j)*((100000._ESMF_KIND_R8/pbot(i,j))**0.286_ESMF_KIND_R8) ! tcx temporary !tcx thbot1(1) = thbot(i,j) qbot1(1) = qbot(i,j) + if(tbot(i,j) .gt. 0.0) & rbot1(1) =pbot(i,j)/(287.058_ESMF_KIND_R8*(1._ESMF_KIND_R8+0.608_ESMF_KIND_R8*qbot(i,j))*tbot(i,j)) ! tcx temporary !tcx rbot1(1) = rbot(i,j) tbot1(1) = tbot(i,j) From fbfb3dfe141061032a9fa231e03a1a14bda4f983 Mon Sep 17 00:00:00 2001 From: "denise.worthen" Date: Sat, 11 Jan 2020 19:31:03 +0000 Subject: [PATCH 08/12] remove ice-ocean merge in prep_atm --- src/module_MEDIATOR.F90 | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index 23ac5f7a..508fbbfe 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -3700,13 +3700,19 @@ subroutine MedPhase_prep_atm(gcomp, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out allocate(ocnwgt(lbound(icewgt,1):ubound(icewgt,1),lbound(icewgt,2):ubound(icewgt,2))) + allocate(customwgt(lbound(icewgt,1):ubound(icewgt,1),lbound(icewgt,2):ubound(icewgt,2))) do j=lbound(icewgt,2),ubound(icewgt,2) do i=lbound(icewgt,1),ubound(icewgt,1) ocnwgt(i,j) = 1.0_ESMF_KIND_R8 - icewgt(i,j) -!BL2017 ocnwgt = 1.0_ESMF_KIND_R8 - icewgt + customwgt(i,j) = 1.0_ESMF_KIND_R8 enddo enddo + ! FLAG icewgt > 1.0 + write(msgString,'(A,3g17.10)')trim(subname)//trim(' FLAG icewgt>1.0'), & + minval(icewgt),maxval(icewgt-1.0_ESMF_KIND_R8),sum(icewgt) + if(maxval(icewgt) .gt. 1.0_ESMF_KIND_R8)call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) + !--- fill land mask every coupling from initial computation if (generate_landmask) then @@ -3726,45 +3732,39 @@ subroutine MedPhase_prep_atm(gcomp, rc) return endif - !--- merges - + !--- merges from ice only + call fieldBundle_FieldMerge(is_local%wrap%FBforAtm ,'mean_sensi_heat_flx' , & - is_local%wrap%FBAtmOcn_a,'mean_sensi_heat_flx_atm_into_ocn',ocnwgt, & - is_local%wrap%FBIce_a ,'mean_sensi_heat_flx_atm_into_ice',icewgt, rc=rc) + is_local%wrap%FBIce_a ,'mean_sensi_heat_flx_atm_into_ice',customwgt, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out call fieldBundle_FieldMerge(is_local%wrap%FBforAtm ,'mean_laten_heat_flx' , & - is_local%wrap%FBAtmOcn_a,'mean_laten_heat_flx_atm_into_ocn',ocnwgt, & - is_local%wrap%FBIce_a ,'mean_laten_heat_flx_atm_into_ice',icewgt, rc=rc) + is_local%wrap%FBIce_a ,'mean_laten_heat_flx_atm_into_ice',customwgt, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out call fieldBundle_FieldMerge(is_local%wrap%FBforAtm ,'mean_up_lw_flx' , & - is_local%wrap%FBAtmOcn_a,'mean_up_lw_flx_ocn',ocnwgt, & - is_local%wrap%FBIce_a ,'mean_up_lw_flx_ice',icewgt, rc=rc) + is_local%wrap%FBIce_a ,'mean_up_lw_flx_ice',customwgt, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out call fieldBundle_FieldMerge(is_local%wrap%FBforAtm ,'mean_evap_rate' , & - is_local%wrap%FBAtmOcn_a,'mean_evap_rate_atm_into_ocn',ocnwgt, & - is_local%wrap%FBIce_a ,'mean_evap_rate_atm_into_ice',icewgt, rc=rc) + is_local%wrap%FBIce_a ,'mean_evap_rate_atm_into_ice',customwgt, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out call fieldBundle_FieldMerge(is_local%wrap%FBforAtm ,'mean_zonal_moment_flx' , & - is_local%wrap%FBAtmOcn_a,'stress_on_air_ocn_zonal',ocnwgt, & - is_local%wrap%FBIce_a ,'stress_on_air_ice_zonal',icewgt, rc=rc) + is_local%wrap%FBIce_a ,'stress_on_air_ice_zonal',customwgt, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out call fieldBundle_FieldMerge(is_local%wrap%FBforAtm ,'mean_merid_moment_flx' , & - is_local%wrap%FBAtmOcn_a,'stress_on_air_ocn_merid',ocnwgt, & - is_local%wrap%FBIce_a ,'stress_on_air_ice_merid',icewgt, rc=rc) + is_local%wrap%FBIce_a ,'stress_on_air_ice_merid',customwgt, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out - deallocate(ocnwgt) + deallocate(ocnwgt, customwgt) !--------------------------------------- !--- set export State to special value for testing From 100e324d4d042e548c282bb5af496b264a59879a Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Mon, 9 Mar 2020 15:25:58 -0600 Subject: [PATCH 09/12] these are the changes that are consistent with the latest cmeps branch mvertens/nems_integration2_update3 that currently has a PR to cmeps master --- src/module_EARTH_GRID_COMP.F90 | 51 ++-------------------------------- 1 file changed, 2 insertions(+), 49 deletions(-) diff --git a/src/module_EARTH_GRID_COMP.F90 b/src/module_EARTH_GRID_COMP.F90 index f28cb704..8e5c9f6c 100644 --- a/src/module_EARTH_GRID_COMP.F90 +++ b/src/module_EARTH_GRID_COMP.F90 @@ -284,7 +284,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) !TODO: absorbed the needed standard names into the default dictionary. ! -> 20 fields identified as exports by the GSM component #ifdef CMEPS - call NUOPC_FieldDictionarySetup("fd.yaml", rc=rc) + call NUOPC_FieldDictionarySetup("fd_nems.yaml", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & @@ -3423,31 +3423,13 @@ subroutine SetModelServices(driver, rc) line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out #ifdef CMEPS - ! get file suffix - call NUOPC_CompAttributeGet(driver, name="inst_suffix", isPresent=isPresent, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - if (isPresent) then - call NUOPC_CompAttributeGet(driver, name="inst_suffix", value=inst_suffix, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - else - inst_suffix = "" - endif + inst_suffix = "" ! obtain driver attributes (for CMEPS) call ReadAttributes(driver, config, "DRIVER_attributes::", formatprint=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "FLDS_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - - call ReadAttributes(driver, config, "CLOCK_attributes::", formatprint=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out - call ReadAttributes(driver, config, "ALLCOMP_attributes::", formatprint=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//__FILE__)) return ! bail out @@ -4675,35 +4657,6 @@ subroutine AddAttributes(gcomp, driver, config, compid, compname, inst_suffix, r file=__FILE__)) & return ! bail out - call ReadAttributes(gcomp, config, trim(compname)//"_modelio"//trim(inst_suffix)//"::", rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__)) & - return ! bail out - - call ReadAttributes(gcomp, config, "CLOCK_attributes::", rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__)) & - return ! bail out - - !------ - ! Add mediator specific attributes - !------ - if (compname == 'MED') then - call ReadAttributes(gcomp, config, "MED_history_attributes::", rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__)) & - return ! bail out - - call ReadAttributes(gcomp, config, "FLDS_attributes::", rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__)) & - return ! bail out - endif - !------ ! Add multi-instance specific attributes !------ From f3425160f2ec391050d5405804fcc91c13f201f8 Mon Sep 17 00:00:00 2001 From: "denise.worthen" Date: Thu, 2 Apr 2020 13:39:18 +0000 Subject: [PATCH 10/12] update pyprodutil --- tests/produtil/NCEPLIBS-pyprodutil | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/produtil/NCEPLIBS-pyprodutil b/tests/produtil/NCEPLIBS-pyprodutil index 1c96952b..ca171b95 160000 --- a/tests/produtil/NCEPLIBS-pyprodutil +++ b/tests/produtil/NCEPLIBS-pyprodutil @@ -1 +1 @@ -Subproject commit 1c96952b092e8dc4da03b741ae1e8453fc9fe099 +Subproject commit ca171b95095db4fcd0fc7b01c23d073d90becd99 From 1d1544472278f2a3db54dd1be023e846d1dc29d3 Mon Sep 17 00:00:00 2001 From: "denise.worthen" Date: Thu, 2 Apr 2020 14:49:26 -0400 Subject: [PATCH 11/12] updates to be consistent w/ latest s2s & cmeps --- src/MAIN_NEMS.F90 | 1 - src/module_MEDIATOR.F90 | 12 ++++++------ src/module_NEMS_GRID_COMP.F90 | 2 -- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/MAIN_NEMS.F90 b/src/MAIN_NEMS.F90 index ac47df36..c25c6831 100644 --- a/src/MAIN_NEMS.F90 +++ b/src/MAIN_NEMS.F90 @@ -509,7 +509,6 @@ PROGRAM MAIN_NEMS CALL ESMF_ConfigGetAttribute(config = CF_MAIN & ,value = RUN_CONTINUE & ,label = 'RUN_CONTINUE:' & - ,default= .false. & ,rc = RC) ESMF_ERR_ABORT(RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index 0be47d75..43a5fed8 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -563,8 +563,8 @@ subroutine SetServices(gcomp, rc) ! Fields from ATM call fld_list_add(fldsFrAtm,"mean_zonal_moment_flx_atm" , "cannot provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_merid_moment_flx_atm" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"mean_sensi_heat_flx_atm" , "will provide","conservefrac") - call fld_list_add(fldsFrAtm,"mean_laten_heat_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_sensi_heat_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_laten_heat_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_lw_flx" , "will provide","conservefrac") ! call fld_list_add(fldsFrAtm,"mean_up_lw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_down_sw_flx" , "will provide","conservefrac") @@ -594,7 +594,7 @@ subroutine SetServices(gcomp, rc) call fld_list_add(fldsFrAtm,"inst_pres_height_surface", "will provide","bilinear") call fld_list_add(fldsFrAtm,"inst_surface_height" , "will provide","bilinear") ! new imports from GSM added 04/23/14: - call fld_list_add(fldsFrAtm,"mean_net_lw_flx_atm" , "will provide","conservefrac") + call fld_list_add(fldsFrAtm,"mean_net_lw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"mean_net_sw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_net_lw_flx" , "will provide","conservefrac") call fld_list_add(fldsFrAtm,"inst_net_sw_flx" , "will provide","conservefrac") @@ -5522,7 +5522,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) customwgt = wgtm01 / const_lhvap call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_evap_rate' , & is_local%wrap%FBAccumAtmOcn, 'mean_evap_rate_atm_into_ocn', atmwgt1, & - is_local%wrap%FBAtm_o , 'mean_laten_heat_flx_atm' , customwgt, & + is_local%wrap%FBAtm_o , 'mean_laten_heat_flx' , customwgt, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -5578,7 +5578,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_sensi_heat_flx' , & is_local%wrap%FBAccumAtmOcn, 'mean_sensi_heat_flx_atm_into_ocn', atmwgt1, & - is_local%wrap%FBAtm_o , 'mean_sensi_heat_flx_atm' , wgtm01, & + is_local%wrap%FBAtm_o , 'mean_sensi_heat_flx' , wgtm01, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -5586,7 +5586,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) call fieldBundle_FieldMerge(is_local%wrap%FBforOcn , 'mean_net_lw_flx' , & is_local%wrap%FBAtm_o , 'mean_down_lw_flx' , atmwgt1, & is_local%wrap%FBAccumAtmOcn, 'mean_up_lw_flx_ocn', atmwgt1, & - is_local%wrap%FBAtm_o , 'mean_net_lw_flx_atm', wgtp01, & + is_local%wrap%FBAtm_o , 'mean_net_lw_flx' , wgtp01, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out diff --git a/src/module_NEMS_GRID_COMP.F90 b/src/module_NEMS_GRID_COMP.F90 index e0593f1c..d0d0436b 100644 --- a/src/module_NEMS_GRID_COMP.F90 +++ b/src/module_NEMS_GRID_COMP.F90 @@ -313,7 +313,6 @@ SUBROUTINE NEMS_INITIALIZE(NEMS_GRID_COMP & ,value = ENS_SPS & !<-- Value of control flag for ! stochastic perturbation scheme ,label = 'ENS_SPS:' & !<-- Flag's label in configure file - ,default= .false. & ,rc = RC) ESMF_ERR_RETURN(RC,RC_INIT) ! @@ -369,7 +368,6 @@ SUBROUTINE NEMS_INITIALIZE(NEMS_GRID_COMP & CALL ESMF_ConfigGetAttribute(config = CF_NEMS & !<-- The NEMS configure object ,value = TOTAL_MEMBER & !<-- Total # of ensemble members ,label = 'total_member:' & !<-- Flag in configure file - ,default= 1 & ,rc = RC) ESMF_ERR_RETURN(RC,RC_INIT) ! From acb09c47d7f85d4795d9de31feac5c23a9b7b355 Mon Sep 17 00:00:00 2001 From: "denise.worthen" Date: Fri, 24 Apr 2020 15:24:31 +0000 Subject: [PATCH 12/12] update default values in MAIN_NEMS and module_NEMS_GRID_COMP --- src/MAIN_NEMS.F90 | 1 + src/module_NEMS_GRID_COMP.F90 | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/MAIN_NEMS.F90 b/src/MAIN_NEMS.F90 index c25c6831..ac47df36 100644 --- a/src/MAIN_NEMS.F90 +++ b/src/MAIN_NEMS.F90 @@ -509,6 +509,7 @@ PROGRAM MAIN_NEMS CALL ESMF_ConfigGetAttribute(config = CF_MAIN & ,value = RUN_CONTINUE & ,label = 'RUN_CONTINUE:' & + ,default= .false. & ,rc = RC) ESMF_ERR_ABORT(RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ diff --git a/src/module_NEMS_GRID_COMP.F90 b/src/module_NEMS_GRID_COMP.F90 index d0d0436b..e0593f1c 100644 --- a/src/module_NEMS_GRID_COMP.F90 +++ b/src/module_NEMS_GRID_COMP.F90 @@ -313,6 +313,7 @@ SUBROUTINE NEMS_INITIALIZE(NEMS_GRID_COMP & ,value = ENS_SPS & !<-- Value of control flag for ! stochastic perturbation scheme ,label = 'ENS_SPS:' & !<-- Flag's label in configure file + ,default= .false. & ,rc = RC) ESMF_ERR_RETURN(RC,RC_INIT) ! @@ -368,6 +369,7 @@ SUBROUTINE NEMS_INITIALIZE(NEMS_GRID_COMP & CALL ESMF_ConfigGetAttribute(config = CF_NEMS & !<-- The NEMS configure object ,value = TOTAL_MEMBER & !<-- Total # of ensemble members ,label = 'total_member:' & !<-- Flag in configure file + ,default= 1 & ,rc = RC) ESMF_ERR_RETURN(RC,RC_INIT) !