From c19bb0390f879d5c4de82e9ef529d1225dc4c0e5 Mon Sep 17 00:00:00 2001 From: Denise Worthen Date: Thu, 27 Feb 2020 10:22:24 -0500 Subject: [PATCH] Feature/changefldnames (#29) * remove ice-ocean merge in prep_atm * remove atm-ocn in prep_atm;remove associated FBs * comment vs ifdef * remove unnecessary prep_atm merges * remove custom merges in prep_atm which are not needed when field name changes are made of fv3 side for import directly from cice * move sum(weights) into datm part of loop; add wgtp01 for netLW merge * remove unused code in prep_atm * use RWFields_tile for mediator dumps * clean up commented out code used for testing * add print statement of slow and fast counters for field dumping * more PET log info printout * add ability to write mediator a-o fluxes to file with statewrite_flag * return statewrite flags to their default setting * mediator aborts if a required mediator restart file does not exist * add condition of 'not coldstart' to mediator abort when mediator restart files are missing * change sw field names from cice * Add capablilty to build the CMEPS mediator in place of the NEMS mediator using 'ifdef CMEPS' conditionals in module_EARTH_GRID_COMP.F90 If CMEPS is built, the NUOPC field contained in parm/fd.yaml will be used. --- src/GNUmakefile | 4 + src/incmake/component_CICE.mk | 7 + src/incmake/component_CMEPS.mk | 47 ++++ src/incmake/component_MOM6.mk | 7 + src/module_EARTH_GRID_COMP.F90 | 459 ++++++++++++++++++++++++++++++++- src/module_MEDIATOR.F90 | 343 +++++++++++++----------- 6 files changed, 715 insertions(+), 152 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/incmake/component_CICE.mk b/src/incmake/component_CICE.mk index 007b816a..3e44d4a4 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 69ba3586..0b03dee4 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="$(FULL_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 6cac85ea..8da83de3 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( & @@ -1318,7 +1336,51 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) line=__LINE__, & file=__FILE__)) & return ! bail out - endif + endif + if (.not. NUOPC_FieldDictionaryHasEntry( & + "mean_sw_pen_to_ocn_vis_dir_flx")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_sw_pen_to_ocn_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_sw_pen_to_ocn_vis_dif_flx")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_sw_pen_to_ocn_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_sw_pen_to_ocn_ir_dir_flx")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_sw_pen_to_ocn_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_sw_pen_to_ocn_ir_dif_flx")) then + call NUOPC_FieldDictionaryAddEntry( & + standardName="mean_sw_pen_to_ocn_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_ir_dir_albedo")) then call NUOPC_FieldDictionaryAddEntry( & @@ -3237,6 +3299,7 @@ SUBROUTINE EARTH_REGISTER(EARTH_GRID_COMP,RC_REG) file=__FILE__)) & return ! bail out endif +#endif !----------------------------------------------------------------------- ! @@ -3248,6 +3311,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 @@ -3265,7 +3331,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 @@ -3339,7 +3410,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 @@ -3372,7 +3474,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, & @@ -3747,7 +3849,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 @@ -3778,6 +3880,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, & @@ -3810,9 +3915,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 @@ -4285,6 +4400,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 ! !----------------------------------------------------------------------- ! diff --git a/src/module_MEDIATOR.F90 b/src/module_MEDIATOR.F90 index b83a9942..16a4d73f 100644 --- a/src/module_MEDIATOR.F90 +++ b/src/module_MEDIATOR.F90 @@ -97,11 +97,11 @@ module module_MEDIATOR type(ESMF_FieldBundle):: FBHyd_a ! Hyd export data mapped to atm grid type(ESMF_FieldBundle):: FBHyd_h ! Hyd export on hyd grid type(ESMF_FieldBundle):: FBAtmOcn_o ! Atm/Ocn flux fields on ocn grid - type(ESMF_FieldBundle):: FBAtmOcn_a ! Atm/Ocn flux fields on atm grid + !type(ESMF_FieldBundle):: FBAtmOcn_a ! Atm/Ocn flux fields on atm grid !BL2017b type(ESMF_FieldBundle):: FBOcn2_a ! Ocn export data mapped to atm grid type(ESMF_FieldBundle):: FBIce2_a ! Ice export data mapped to atm grid - type(ESMF_FieldBundle):: FBAtmOcn2_a ! Atm/Ocn flux fields on atm grid + !type(ESMF_FieldBundle):: FBAtmOcn2_a ! Atm/Ocn flux fields on atm grid !BL2017b type(ESMF_FieldBundle):: FBforAtm ! data storage for atm import type(ESMF_FieldBundle):: FBforOcn ! data storage for ocn import @@ -747,10 +747,10 @@ subroutine SetServices(gcomp, rc) ! call fld_list_add(fldsFrIce,"stress_on_ocn_ice_idir" , "will provide","copy") ! call fld_list_add(fldsFrIce,"stress_on_ocn_ice_jdir" , "will provide","copy") call fld_list_add(fldsFrIce,"mean_sw_pen_to_ocn" , "will provide","conservefrac") - call fld_list_add(fldsFrIce,"mean_net_sw_vis_dir_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrIce,"mean_net_sw_vis_dif_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrIce,"mean_net_sw_ir_dir_flx" , "will provide","conservefrac") - call fld_list_add(fldsFrIce,"mean_net_sw_ir_dif_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrIce,"mean_sw_pen_to_ocn_vis_dir_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrIce,"mean_sw_pen_to_ocn_vis_dif_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrIce,"mean_sw_pen_to_ocn_ir_dir_flx" , "will provide","conservefrac") + call fld_list_add(fldsFrIce,"mean_sw_pen_to_ocn_ir_dif_flx" , "will provide","conservefrac") call fld_list_add(fldsFrIce,"mean_up_lw_flx_ice" , "will provide","conservefrac") call fld_list_add(fldsFrIce,"mean_sensi_heat_flx_atm_into_ice", "will provide","conservefrac") call fld_list_add(fldsFrIce,"mean_laten_heat_flx_atm_into_ice", "will provide","conservefrac") @@ -991,6 +991,14 @@ subroutine InitializeP0(gcomp, importState, exportState, clock, rc) write(msgString,'(A,l6)') trim(subname)//' profile_memory = ',profile_memory call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=dbrc) + call ESMF_AttributeGet(gcomp, name="AoMedFlux", value=value, defaultValue="true", & + convention="NUOPC", purpose="Instance", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return ! bail out + atmocn_flux_from_atm=(trim(value)/="false") + write(msgString,'(A,l6)') trim(subname)//' atmocn_flux_from_atm = ',atmocn_flux_from_atm + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=dbrc) + ! Set clock_invalidTimeStamp call ESMF_TimeSet(time_invalidTimeStamp, yy=99999999, mm=1, dd=1, h=0, m=0, s=0, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & @@ -2373,11 +2381,11 @@ subroutine InitializeIPDv03p5(gcomp, importState, exportState, clock, rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out - call fieldBundle_init(is_local%wrap%FBAtmOcn_a, grid=gridAtm, & - fieldnamelist=fldsAtmOcn%shortname(1:fldsAtmOcn%num), name='FBAtmOcn_a', rc=rc) + !call fieldBundle_init(is_local%wrap%FBAtmOcn_a, grid=gridAtm, & + ! fieldnamelist=fldsAtmOcn%shortname(1:fldsAtmOcn%num), name='FBAtmOcn_a', rc=rc) !BL2017b - call fieldBundle_init(is_local%wrap%FBAtmOcn2_a, grid=gridAtm, & - fieldnamelist=fldsAtmOcn%shortname(1:fldsAtmOcn%num), name='FBAtmOcn2_a', rc=rc) + !call fieldBundle_init(is_local%wrap%FBAtmOcn2_a, grid=gridAtm, & + ! fieldnamelist=fldsAtmOcn%shortname(1:fldsAtmOcn%num), name='FBAtmOcn2_a', rc=rc) !BL2017b if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -3133,9 +3141,10 @@ subroutine MedPhase_prep_atm(gcomp, rc) real(ESMF_KIND_R8), pointer :: ifrac_ad(:,:), ifrac_adr(:,:) ! ice fraction on atm grid consd map real(ESMF_KIND_R8), pointer :: ifrac_ab(:,:), ifrac_abr(:,:) ! ice fraction on atm grid bilnr map real(ESMF_KIND_R8), pointer :: ifrac_ap(:,:), ifrac_apr(:,:) ! ice fraction on atm grid patch map - real(ESMF_KIND_R8), pointer :: ocnwgt(:,:),icewgt(:,:),customwgt(:,:) + real(ESMF_KIND_R8), pointer :: icewgt(:,:) integer :: i,j,n integer :: regridwriteAtmExp_timeslice = 0 + character(len=128) :: fname character(len=*),parameter :: subname='(module_MEDIATOR:MedPhase_prep_atm)' !BL2017b character(ESMF_MAXSTR) ,pointer :: fieldNameList(:) @@ -3220,11 +3229,11 @@ subroutine MedPhase_prep_atm(gcomp, rc) call fieldBundle_reset(is_local%wrap%FBIce_if, value=czero, rc=rc) call fieldBundle_reset(is_local%wrap%FBLnd_a, value=czero, rc=rc) call fieldBundle_reset(is_local%wrap%FBHyd_a, value=czero, rc=rc) - call fieldBundle_reset(is_local%wrap%FBAtmOcn_a, value=czero, rc=rc) + !call fieldBundle_reset(is_local%wrap%FBAtmOcn_a, value=czero, rc=rc) !BL2017b call fieldBundle_reset(is_local%wrap%FBOcn2_a, value=czero, rc=rc) call fieldBundle_reset(is_local%wrap%FBIce2_a, value=czero, rc=rc) - call fieldBundle_reset(is_local%wrap%FBAtmOcn2_a, value=czero, rc=rc) + !call fieldBundle_reset(is_local%wrap%FBAtmOcn2_a, value=czero, rc=rc) !BL2017b if (is_local%wrap%o2a_active) then @@ -3272,50 +3281,50 @@ subroutine MedPhase_prep_atm(gcomp, rc) enddo deallocate(fieldNameList) !BL2017b - - call Fieldbundle_Regrid(fldsAtmOcn, is_local%wrap%FBAtmOcn_o, is_local%wrap%FBAtmOcn_a, & - consfmap=is_local%wrap%RH_o2a_consf, & - consdmap=is_local%wrap%RH_o2a_consd, & - bilnrmap=is_local%wrap%RH_o2a_bilnr, & - patchmap=is_local%wrap%RH_o2a_patch, & - string='o2aatmocn', rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return ! bail out - -!BL2017b -! use the nearest neighbor method - call Fieldbundle_Regrid2(fldsAtmOcn, is_local%wrap%FBAtmOcn_o, is_local%wrap%FBAtmOcn2_a, & - nearestmap=is_local%wrap%RH_o2a_nearest, & - string='atmocn_o2a_nearest', rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return ! bail out - - call ESMF_FieldBundleGet(is_local%wrap%FBAtmOcn_a, fieldCount=fieldCount, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return ! bail out - allocate(fieldNameList(fieldCount)) - call ESMF_FieldBundleGet(is_local%wrap%FBAtmOcn_a, fieldNameList=fieldNameList, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return ! bail out - - do n = 1, fieldCount - call FieldBundle_GetFldPtr(is_local%wrap%FBAtmOcn_a, fieldNameList(n),dataPtr1,rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return ! bail out - - call FieldBundle_GetFldPtr(is_local%wrap%FBAtmOcn2_a, fieldNameList(n), dataPtr2, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=__FILE__)) return ! bail out - - do j=lbound(dataPtr1,2),ubound(dataPtr1,2) - do i=lbound(dataPtr1,1),ubound(dataPtr1,1) - if(dataPtr1(i,j).eq.0._ESMF_KIND_R8.and.abs(dataPtr2(i,j)).gt.0._ESMF_KIND_R8) then - dataPtr1(i,j)=dataPtr2(i,j) - endif - enddo - enddo - enddo - deallocate(fieldNameList) +! +! call Fieldbundle_Regrid(fldsAtmOcn, is_local%wrap%FBAtmOcn_o, is_local%wrap%FBAtmOcn_a, & +! consfmap=is_local%wrap%RH_o2a_consf, & +! consdmap=is_local%wrap%RH_o2a_consd, & +! bilnrmap=is_local%wrap%RH_o2a_bilnr, & +! patchmap=is_local%wrap%RH_o2a_patch, & +! string='o2aatmocn', rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out +! +!!BL2017b +!! use the nearest neighbor method +! call Fieldbundle_Regrid2(fldsAtmOcn, is_local%wrap%FBAtmOcn_o, is_local%wrap%FBAtmOcn2_a, & +! nearestmap=is_local%wrap%RH_o2a_nearest, & +! string='atmocn_o2a_nearest', rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out +! +! call ESMF_FieldBundleGet(is_local%wrap%FBAtmOcn_a, fieldCount=fieldCount, rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out +! allocate(fieldNameList(fieldCount)) +! call ESMF_FieldBundleGet(is_local%wrap%FBAtmOcn_a, fieldNameList=fieldNameList, rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out +! +! do n = 1, fieldCount +! call FieldBundle_GetFldPtr(is_local%wrap%FBAtmOcn_a, fieldNameList(n),dataPtr1,rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out +! +! call FieldBundle_GetFldPtr(is_local%wrap%FBAtmOcn2_a, fieldNameList(n), dataPtr2, rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out +! +! do j=lbound(dataPtr1,2),ubound(dataPtr1,2) +! do i=lbound(dataPtr1,1),ubound(dataPtr1,1) +! if(dataPtr1(i,j).eq.0._ESMF_KIND_R8.and.abs(dataPtr2(i,j)).gt.0._ESMF_KIND_R8) then +! dataPtr1(i,j)=dataPtr2(i,j) +! endif +! enddo +! enddo +! enddo +! deallocate(fieldNameList) !BL2017b endif @@ -3660,14 +3669,14 @@ subroutine MedPhase_prep_atm(gcomp, rc) call FieldBundle_diagnose(is_local%wrap%FBIce_a, trim(subname)//' FBIce_a ', rc=rc) call FieldBundle_diagnose(is_local%wrap%FBLnd_a, trim(subname)//' FBLnd_a ', rc=rc) call FieldBundle_diagnose(is_local%wrap%FBHyd_a, trim(subname)//' FBHyd_a ', rc=rc) - call FieldBundle_diagnose(is_local%wrap%FBAtmOcn_a, trim(subname)//' FBAtmOcn_a ', rc=rc) + !call FieldBundle_diagnose(is_local%wrap%FBAtmOcn_a, trim(subname)//' FBAtmOcn_a ', rc=rc) endif call fieldBundle_copy(is_local%wrap%FBforAtm, is_local%wrap%FBOcn_a, rc=rc) call fieldBundle_copy(is_local%wrap%FBforAtm, is_local%wrap%FBIce_a, rc=rc) call fieldBundle_copy(is_local%wrap%FBforAtm, is_local%wrap%FBLnd_a, rc=rc) call fieldBundle_copy(is_local%wrap%FBforAtm, is_local%wrap%FBHyd_a, rc=rc) - call fieldBundle_copy(is_local%wrap%FBforAtm, is_local%wrap%FBAtmOcn_a, rc=rc) + !call fieldBundle_copy(is_local%wrap%FBforAtm, is_local%wrap%FBAtmOcn_a, rc=rc) if (dbug_flag > 1) then call FieldBundle_diagnose(is_local%wrap%FBforAtm, trim(subname)//' FBforAtm ', rc=rc) @@ -3690,23 +3699,11 @@ subroutine MedPhase_prep_atm(gcomp, rc) #endif endif - !--------------------------------------- - !--- custom calculations to atm - !--------------------------------------- - - !--- ocn and ice fraction for merges + !--- check for ice fraction out of range call FieldBundle_GetFldPtr(is_local%wrap%FBIce_a, 'ice_fraction', icewgt, rc=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) - 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'), & @@ -3732,40 +3729,6 @@ subroutine MedPhase_prep_atm(gcomp, rc) return endif - !--- merges from ice only - - call fieldBundle_FieldMerge(is_local%wrap%FBforAtm ,'mean_sensi_heat_flx' , & - 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%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%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%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%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%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, customwgt) - !--------------------------------------- !--- set export State to special value for testing !--------------------------------------- @@ -3788,20 +3751,25 @@ subroutine MedPhase_prep_atm(gcomp, rc) if (statewrite_flag) then ! write the fields exported to atm to file -#ifdef FRONT_FV3 - regridwriteAtmExp_timeslice = regridwriteAtmExp_timeslice + 1 - call ESMFPP_RegridWriteFB(is_local%wrap%FBforAtm, "med_to_atm_export_", regridwriteAtmExp_timeslice, rc=rc) + write(msgString,'(A,i10)')trim(subname)//trim(': write field_med_to_atm '), is_local%wrap%fastcntr + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) +#ifdef FV3_CPLD + write(fname,'(a,i6.6)') 'field_med_to_atm_',is_local%wrap%fastcntr + call FieldBundle_RWFields_tiles('write',trim(fname),is_local%wrap%FBforAtm,rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__)) & - return ! bail out + line=__LINE__, file=__FILE__)) return ! bail out #else +! TODO: check method for DATM call NUOPC_Write(NState_AtmExp, & fldsToAtm%shortname(1:fldsToAtm%num), & "field_med_to_atm_", timeslice=is_local%wrap%fastcntr, & relaxedFlag=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out +! write(fname,'(a,i6.6)') 'field_med_to_atm_',is_local%wrap%fastcntr +! call FieldBundle_RWFields('write',trim(fname),is_local%wrap%FBforAtm,rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out #endif endif @@ -4307,6 +4275,9 @@ subroutine MedPhase_prep_ice(gcomp, rc) endif if (statewrite_flag) then + write(msgString,'(A,i10)')trim(subname)//trim(': write field_med_to_ice '), is_local%wrap%fastcntr + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) + ! write the fields exported to ice to file call NUOPC_Write(NState_IceExp, & fldsToIce%shortname(1:fldsToIce%num), & @@ -4750,6 +4721,7 @@ subroutine MedPhase_accum_fast(gcomp, rc) type(ESMF_State) :: importState, exportState type(InternalState) :: is_local integer :: i,j,n + character(len=128) :: fname character(len=*),parameter :: subname='(module_MEDIATOR:MedPhase_accum_fast)' if (dbug_flag > 5) then @@ -4792,16 +4764,29 @@ subroutine MedPhase_accum_fast(gcomp, rc) if (statewrite_flag) then ! write the fields imported from atm to file -#ifndef FRONT_FV3 + write(msgString,'(A,i10)')trim(subname)//trim(': write field_med_from_atm '), is_local%wrap%fastcntr + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) +#ifdef FV3_CPLD + write(fname,'(a,i6.6)') 'field_med_from_atm_',is_local%wrap%fastcntr + call FieldBundle_RWFields_tiles('write',trim(fname),is_local%wrap%FBAtm_a,rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=__FILE__)) return ! bail out +#else +! TODO: check method for DATM call NUOPC_Write(NState_AtmImp, & fldsFrAtm%shortname(1:fldsFrAtm%num), & "field_med_from_atm_", timeslice=is_local%wrap%fastcntr, & relaxedFlag=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out +! write(fname,'(a,i6.6)') 'field_med_from_atm_',is_local%wrap%fastcntr +! call FieldBundle_RWFields('write',trim(fname),is_local%wrap%FBAtm_a,rc=rc) +! if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & +! line=__LINE__, file=__FILE__)) return ! bail out #endif - ! write the fields imported from ice to file + write(msgString,'(A,i10)')trim(subname)//trim(': write field_med_from_ice '), is_local%wrap%fastcntr + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) call NUOPC_Write(NState_IceImp, & fldsFrIce%shortname(1:fldsFrIce%num), & "field_med_from_ice_", timeslice=is_local%wrap%fastcntr, & @@ -5255,10 +5240,13 @@ subroutine MedPhase_prep_ocn(gcomp, rc) real(ESMF_KIND_R8), pointer :: atmwgt1(:,:),icewgt1(:,:),wgtp01(:,:),wgtm01(:,:) real(ESMF_KIND_R8), pointer :: tmp_n1(:,:),tmp_n2(:,:) character(ESMF_MAXSTR) ,pointer :: fieldNameList(:) + type(ESMF_Field) :: aofield integer :: fieldCount logical :: checkOK, checkOK1, checkOK2 character(len=*),parameter :: subname='(module_MEDIATOR:MedPhase_prep_ocn)' + integer :: ii,jj + if(profile_memory) call ESMF_VMLogMemInfo("Entering "//trim(subname)) if (dbug_flag > 5) then call ESMF_LogWrite(trim(subname)//": called", ESMF_LOGMSG_INFO, rc=dbrc) @@ -5300,6 +5288,8 @@ subroutine MedPhase_prep_ocn(gcomp, rc) if (statewrite_flag) then ! write the fields imported from ocn to file + write(msgString,'(A,i10)')trim(subname)//trim(': write field_med_from_ocn '), is_local%wrap%slowcntr + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) call NUOPC_Write(NState_OcnImp, & fldsFrOcn%shortname(1:fldsFrOcn%num), & "field_med_from_ocn_", timeslice=is_local%wrap%slowcntr, & @@ -5433,9 +5423,33 @@ subroutine MedPhase_prep_ocn(gcomp, rc) !--- custom calculations to ocn !--------------------------------------- -! if (dbug_flag > 1) then -! call FieldBundle_diagnose(is_local%wrap%FBforOcn, trim(subname)//' FB4ocn_AFcc ', rc=rc) -! endif + !if (dbug_flag > 1) then + ! call FieldBundle_diagnose(is_local%wrap%FBforOcn, trim(subname)//' FB4ocn_AFcc ', rc=rc) + !endif + + !--------------------------------------- + !--- write the Mediator Atm-Ocn fluxes + !--------------------------------------- + + if (statewrite_flag) then + ! write the fields cantaining the mediator fluxes to ocn to file + write(msgString,'(A,i10)')trim(subname)//trim(': write field_aofield_to_ocn '), is_local%wrap%slowcntr + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) + + call ESMF_FieldBundleGet(is_local%wrap%FBAccumAtmOcn, fieldCount=fieldCount, rc=rc) + allocate(fieldNameList(fieldCount)) + call ESMF_FieldBundleGet(is_local%wrap%FBAccumAtmOcn, fieldNameList=fieldNameList, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU,line=__LINE__, file=__FILE__)) return + + do n = 1, fieldCount + call ESMF_FieldBundleGet(is_local%wrap%FBAccumAtmOcn, fieldname=fieldNameList(n), field=aofield, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU,line=__LINE__, file=__FILE__)) return + call ESMF_FieldWrite(aofield,'field_aofield_to_ocn_'//trim(fieldnameList(n))//'.nc', & + timeslice=is_local%wrap%slowcntr, overwrite=.true.,rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU,line=__LINE__, file=__FILE__)) return + end do + deallocate(fieldNameList) + endif !--------------------------------------- !--- merges to ocn @@ -5460,17 +5474,21 @@ subroutine MedPhase_prep_ocn(gcomp, rc) allocate(wgtm01(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) +#ifndef FV3_CPLD +! DATM uses mediator aoflux calc in icy water atmwgt(i,j) = 1.0_ESMF_KIND_R8 - icewgt(i,j) atmwgt1(i,j) = atmwgt(i,j) icewgt1(i,j) = icewgt(i,j) wgtp01(i,j) = 0.0_ESMF_KIND_R8 wgtm01(i,j) = 0.0_ESMF_KIND_R8 +! DATM uses atm fluxes in non-icy water if (atmocn_flux_from_atm .and. icewgt(i,j) <= 0.0_ESMF_KIND_R8) then atmwgt1(i,j) = 0.0_ESMF_KIND_R8 icewgt1(i,j) = 0.0_ESMF_KIND_R8 wgtp01(i,j) = 1.0_ESMF_KIND_R8 wgtm01(i,j) = -1.0_ESMF_KIND_R8 endif + ! check wgts do add to 1 as expected if (abs(atmwgt(i,j) + icewgt(i,j) - 1.0_ESMF_KIND_R8) > 1.0e-12 .or. & abs(atmwgt1(i,j) + icewgt1(i,j) + wgtp01(i,j) - 1.0_ESMF_KIND_R8) > 1.0e-12 .or. & @@ -5479,9 +5497,24 @@ subroutine MedPhase_prep_ocn(gcomp, rc) rc = ESMF_FAILURE return endif +#else + atmwgt(i,j) = 1.0_ESMF_KIND_R8 - icewgt(i,j) + atmwgt1(i,j) = 0.0_ESMF_KIND_R8 + icewgt1(i,j) = icewgt(i,j) + wgtm01(i,j) = -atmwgt(i,j) + wgtp01(i,j) = atmwgt(i,j) +#endif enddo enddo + ii =lbound(icewgt,1)+(ubound(icewgt,1) - lbound(icewgt,1))/2 + jj =lbound(icewgt,2)+(ubound(icewgt,2) - lbound(icewgt,2))/2 + write(msgString,'(A,6f12.5)')trim(subname)//trim(' sample wts for atm-ocn merges'), & + real(icewgt(ii,jj),4), real(atmwgt(ii,jj),4),& + real(icewgt1(ii,jj),4), real( atmwgt1(ii,jj),4),& + real(wgtp01(ii,jj),4), real( wgtm01(ii,jj),4) + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) + !------------- ! mean_evap_rate = mean_laten_heat_flux * (1-ice_fraction)/const_lhvap !------------- @@ -5536,12 +5569,12 @@ subroutine MedPhase_prep_ocn(gcomp, rc) ! not used by mom, mom uses evap ! 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, & - 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_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, & + ! 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, & @@ -5549,7 +5582,7 @@ subroutine MedPhase_prep_ocn(gcomp, rc) 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_net_lw_flx' , & is_local%wrap%FBAtm_o , 'mean_down_lw_flx' , atmwgt1, & is_local%wrap%FBAccumAtmOcn, 'mean_up_lw_flx_ocn', atmwgt1, & @@ -5611,28 +5644,28 @@ subroutine MedPhase_prep_ocn(gcomp, rc) call fieldBundle_FieldMerge(is_local%wrap%FBforOcn,'mean_net_sw_vis_dir_flx' , & is_local%wrap%FBAtm_o ,'mean_down_sw_vis_dir_flx',customwgt, & - is_local%wrap%FBIce_o ,'mean_net_sw_vis_dir_flx' ,icewgt, & + is_local%wrap%FBIce_o ,'mean_sw_pen_to_ocn_vis_dir_flx' ,icewgt, & 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_net_sw_vis_dif_flx' , & is_local%wrap%FBAtm_o ,'mean_down_sw_vis_dif_flx',customwgt, & - is_local%wrap%FBIce_o ,'mean_net_sw_vis_dif_flx',icewgt, & + is_local%wrap%FBIce_o ,'mean_sw_pen_to_ocn_vis_dif_flx',icewgt, & 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_net_sw_ir_dir_flx' , & is_local%wrap%FBAtm_o ,'mean_down_sw_ir_dir_flx',customwgt, & - is_local%wrap%FBIce_o ,'mean_net_sw_ir_dir_flx',icewgt, & + is_local%wrap%FBIce_o ,'mean_sw_pen_to_ocn_ir_dir_flx',icewgt, & 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_net_sw_ir_dif_flx' , & is_local%wrap%FBAtm_o ,'mean_down_sw_ir_dif_flx',customwgt, & - is_local%wrap%FBIce_o ,'mean_net_sw_ir_dif_flx',icewgt, & + is_local%wrap%FBIce_o ,'mean_sw_pen_to_ocn_ir_dif_flx',icewgt, & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -5710,6 +5743,9 @@ subroutine MedPhase_prep_ocn(gcomp, rc) if (statewrite_flag) then ! write the fields exported to ocn to file + write(msgString,'(A,i10)')trim(subname)//trim(': write field_med_to_ocn '), is_local%wrap%slowcntr + call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=rc) + call NUOPC_Write(NState_OcnExp, & fldsToOcn%shortname(1:fldsToOcn%num), & "field_med_to_ocn_", timeslice=is_local%wrap%slowcntr, & @@ -5792,9 +5828,9 @@ subroutine MedPhase_write_restart(gcomp, rc) endif endif - if (dbug_flag > 5) then + !if (dbug_flag > 5) then call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO, rc=dbrc) - endif + !endif end subroutine MedPhase_write_restart @@ -6099,6 +6135,12 @@ subroutine FieldBundle_RWFields(mode,fname,FB,flag,rc) call fieldBundle_diagnose(FB, 'write '//trim(fname), rc) elseif (mode == 'read') then inquire(file=fname,exist=fexists) + + if(.not.fexists .and. .not. coldstart)then + call ESMF_LogWrite(trim(fname)//' does not exist', ESMF_LOGMSG_INFO, rc=dbrc) + call ESMF_Finalize(endflag=ESMF_END_ABORT) + endif + if (fexists) then call ESMF_LogWrite(trim(subname)//": read "//trim(fname), ESMF_LOGMSG_INFO, rc=dbrc) !----------------------------------------------------------------------------------------------------- @@ -6148,7 +6190,7 @@ subroutine FieldBundle_RWFields_tiles(mode,fname,FB,flag,rc) integer,optional :: rc ! local variables - type(ESMF_Field) :: f(47) + type(ESMF_Field),allocatable :: flds(:) type(ESMF_GridComp) :: IOComp type(ESMF_Grid) :: gridFv3 character(len=ESMF_MAXSTR) :: name @@ -6162,19 +6204,25 @@ subroutine FieldBundle_RWFields_tiles(mode,fname,FB,flag,rc) call ESMF_LogWrite(trim(subname)//trim(fname)//": called", ESMF_LOGMSG_INFO, rc=dbrc) endif - if (mode == 'write') then call ESMF_FieldBundleGet(FB, fieldCount=fieldCount, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out - write(msgString,*) trim(subname)//' fieldCount = ',fieldCount - call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=dbrc) + !write(msgString,*) trim(subname)//' fieldCount = ',fieldCount + !call ESMF_LogWrite(trim(msgString), ESMF_LOGMSG_INFO, rc=dbrc) - call fieldBundle_getFieldN(FB, 1, f(1), rc) + allocate(flds(fieldCount)) + + if (mode == 'write') then + + call ESMF_LogWrite(trim(subname)//": write "//trim(fname)// & + "tile1-tile6", ESMF_LOGMSG_INFO, rc=dbrc) + + call fieldBundle_getFieldN(FB, 1, flds(1), rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out - call ESMF_FieldGet(f(1), grid=gridFv3, rc=rc) + call ESMF_FieldGet(flds(1), grid=gridFv3, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -6183,27 +6231,33 @@ subroutine FieldBundle_RWFields_tiles(mode,fname,FB,flag,rc) line=__LINE__, file=__FILE__)) return ! bail out call ESMF_LogWrite(trim(subname)//": write "//trim(fname), ESMF_LOGMSG_INFO, rc=dbrc) - do n=2, 47 - call fieldBundle_getFieldN(FB, n, f(n), rc) + do n=2, fieldCount + call fieldBundle_getFieldN(FB, n, flds(n), rc) enddo - call ESMFIO_Write(IOComp, fname, f, filePath='./', rc=rc) + call ESMFIO_Write(IOComp, fname, flds, filePath='./', rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out elseif (mode == 'read') then fname_tile1='mediator_FBAtm_a_restart.tile1.nc' inquire(file=fname_tile1,exist=fexists) + + if(.not.fexists .and. .not. coldstart)then + call ESMF_LogWrite(trim(fname_tile1)//' does not exist', ESMF_LOGMSG_INFO, rc=dbrc) + call ESMF_Finalize(endflag=ESMF_END_ABORT) + endif + if (fexists) then call ESMF_LogWrite(trim(subname)//": read "//trim(fname)// & "tile1-tile6", ESMF_LOGMSG_INFO, rc=dbrc) - call fieldBundle_getFieldN(FB, 1, f(1), rc) + call fieldBundle_getFieldN(FB, 1, flds(1), rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out - call ESMF_FieldGet(f(1), grid=gridFv3, rc=rc) + call ESMF_FieldGet(flds(1), grid=gridFv3, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -6211,11 +6265,11 @@ subroutine FieldBundle_RWFields_tiles(mode,fname,FB,flag,rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out - do n=2, 47 - call fieldBundle_getFieldN(FB, n, f(n), rc) + do n=2, fieldCount + call fieldBundle_getFieldN(FB, n, flds(n), rc) enddo - call ESMFIO_Read(IOComp, fname, f, filePath='./', rc=rc) + call ESMFIO_Read(IOComp, fname, flds, filePath='./', rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) return ! bail out @@ -6225,6 +6279,7 @@ subroutine FieldBundle_RWFields_tiles(mode,fname,FB,flag,rc) call ESMF_LogWrite(trim(subname)//": mode WARNING "//trim(fname)//" mode="//trim(mode), ESMF_LOGMSG_INFO, rc=dbrc) endif ! -- Finalize ESMFIO + deallocate(flds) call ESMFIO_Destroy(IOComp, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=__FILE__)) call ESMF_Finalize()