diff --git a/src/Infrastructure/Array/include/ESMCI_Array.h b/src/Infrastructure/Array/include/ESMCI_Array.h index 512c4e99dc..ec1a21adb6 100644 --- a/src/Infrastructure/Array/include/ESMCI_Array.h +++ b/src/Infrastructure/Array/include/ESMCI_Array.h @@ -439,6 +439,8 @@ namespace ESMCI { const std::string &convention, const std::string &purpose, bool *overwrite, ESMC_FileStatus_Flag *status, int *timeslice, ESMC_IOFmt_Flag *iofmt); + void log(std::string prefix, + ESMC_LogMsgType_Flag msgType=ESMC_LOGMSG_INFO, bool deepFlag=false)const; int print() const; int sync(); int validate() const; diff --git a/src/Infrastructure/Array/interface/ESMCI_Array_F.C b/src/Infrastructure/Array/interface/ESMCI_Array_F.C index 79bc0a48a0..28793898a8 100644 --- a/src/Infrastructure/Array/interface/ESMCI_Array_F.C +++ b/src/Infrastructure/Array/interface/ESMCI_Array_F.C @@ -839,6 +839,36 @@ extern "C" { ESMC_NOT_PRESENT_FILTER(rc)); } + void FTN_X(c_esmc_arraylog)(ESMCI::Array **array, + char *prefix, ESMC_LogMsgType_Flag *logMsgFlag, ESMC_Logical *deep, int *rc, + ESMCI_FortranStrLenArg prefix_l){ +#undef ESMC_METHOD +#define ESMC_METHOD "c_esmc_arraylog()" + if (rc!=NULL) *rc = ESMC_RC_NOT_IMPL; + // convert to bool + bool deepFlag = false; // default + if (ESMC_NOT_PRESENT_FILTER(deep) != ESMC_NULL_POINTER) + if (*deep == ESMF_TRUE) deepFlag = true; + try{ + std::string prefixStr(prefix, prefix_l); + (*array)->log(prefixStr, *logMsgFlag, deepFlag); + }catch(int localrc){ + if (ESMC_LogDefault.MsgFoundError(localrc, ESMCI_ERR_PASSTHRU, + ESMC_CONTEXT, rc)) + return; // bail out + }catch(std::exception &x){ + ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, x.what(), ESMC_CONTEXT, + rc); + return; // bail out + }catch(...){ + ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, "- Caught exception", + ESMC_CONTEXT, rc); + return; + } + // return successfully + if (rc!=NULL) *rc = ESMF_SUCCESS; + } + void FTN_X(c_esmc_arrayprint)(ESMCI::Array **ptr, int *rc){ #undef ESMC_METHOD #define ESMC_METHOD "c_esmc_arrayprint()" diff --git a/src/Infrastructure/Array/interface/ESMF_Array.F90 b/src/Infrastructure/Array/interface/ESMF_Array.F90 index ea1688b0ec..2355cddcad 100644 --- a/src/Infrastructure/Array/interface/ESMF_Array.F90 +++ b/src/Infrastructure/Array/interface/ESMF_Array.F90 @@ -85,6 +85,7 @@ module ESMF_ArrayMod public ESMF_ArrayHaloRelease ! implemented in ESMF_ArrayHaMod public ESMF_ArrayHaloStore ! implemented in ESMF_ArrayHaMod public ESMF_ArrayIsCreated ! implemented in ESMF_ArrayHaMod + public ESMF_ArrayLog ! implemented in ESMF_ArrayHaMod public ESMF_ArrayPrint ! implemented in ESMF_ArrayHaMod public ESMF_ArrayRead ! implemented in ESMF_ArrayHaMod public ESMF_ArrayRedist ! implemented in ESMF_ArrayHaMod diff --git a/src/Infrastructure/Array/interface/ESMF_ArrayHa.F90 b/src/Infrastructure/Array/interface/ESMF_ArrayHa.F90 index d045a37c60..f538e0f5c7 100644 --- a/src/Infrastructure/Array/interface/ESMF_ArrayHa.F90 +++ b/src/Infrastructure/Array/interface/ESMF_ArrayHa.F90 @@ -68,6 +68,7 @@ module ESMF_ArrayHaMod public ESMF_ArrayHaloRelease public ESMF_ArrayHaloStore public ESMF_ArrayIsCreated + public ESMF_ArrayLog public ESMF_ArrayPrint public ESMF_ArrayRead public ESMF_ArrayRedist @@ -557,6 +558,76 @@ function ESMF_ArrayIsCreated(array, keywordEnforcer, rc) !------------------------------------------------------------------------------ +! -------------------------- ESMF-public method ----------------------------- +#undef ESMF_METHOD +#define ESMF_METHOD "ESMF_ArrayLog()" +!BOP +! !IROUTINE: ESMF_ArrayLog - Log Array information + +! !INTERFACE: + subroutine ESMF_ArrayLog(array, keywordEnforcer, prefix, logMsgFlag, deepFlag, rc) +! +! !ARGUMENTS: + type(ESMF_Array), intent(in) :: array +type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below + character(len=*), intent(in), optional :: prefix + type(ESMF_LogMsg_Flag), intent(in), optional :: logMsgFlag + logical, intent(in), optional :: deepFlag + integer, intent(out), optional :: rc +! +! !DESCRIPTION: +! Write information about {\tt array} to the ESMF default Log. +! +! The arguments are: +! \begin{description} +! \item[array] +! The {\tt ESMF\_Array} object logged. +! \item [{[prefix]}] +! String to prefix the log message. Default is no prefix. +! \item [{[logMsgFlag]}] +! Type of log message generated. See section \ref{const:logmsgflag} for +! a list of valid message types. Default is {\tt ESMF\_LOGMSG\_INFO}. +! \item[{[deepFlag]}] +! When set to {\tt .false.} (default), only log top level information about +! the Array. +! When set to {\tt .true.}, additionally log deep information. +! \item[{[rc]}] +! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors. +! \end{description} +! +!EOP +!------------------------------------------------------------------------------ + integer :: localrc ! local return code + type(ESMF_LogMsg_Flag) :: logMsg + type(ESMF_Logical) :: deep + + ! initialize return code; assume routine not implemented + localrc = ESMF_RC_NOT_IMPL + if (present(rc)) rc = ESMF_RC_NOT_IMPL + + ! Check init status of arguments + ESMF_INIT_CHECK_DEEP(ESMF_ArrayGetInit, array, rc) + + ! deal with optional logMsgFlag + logMsg = ESMF_LOGMSG_INFO ! default + if (present(logMsgFlag)) logMsg = logMsgFlag + + ! deal with optional deepFlag + deep = ESMF_FALSE ! default + if (present(deepFlag)) deep = deepFlag + + ! Call into the C++ interface. + call c_esmc_arraylog(array, prefix, logMsg, deep, localrc) + if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + ! return successfully + if (present(rc)) rc = ESMF_SUCCESS + + end subroutine ESMF_ArrayLog +!------------------------------------------------------------------------------ + + ! -------------------------- ESMF-public method ------------------------------- #undef ESMF_METHOD #define ESMF_METHOD "ESMF_ArrayPrint()" diff --git a/src/Infrastructure/Array/src/ESMCI_Array.C b/src/Infrastructure/Array/src/ESMCI_Array.C index 28ca01920d..3e35b8bc7c 100644 --- a/src/Infrastructure/Array/src/ESMCI_Array.C +++ b/src/Infrastructure/Array/src/ESMCI_Array.C @@ -4154,6 +4154,47 @@ int Array::write( } //----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#undef ESMC_METHOD +#define ESMC_METHOD "ESMCI::Array::log()" +//BOPI +// !IROUTINE: ESMCI::Array::log +// +// !INTERFACE: +void Array::log( +// +// !DESCRIPTION: +// Log details of Array object +// +// !ARGUMENTS: +// + std::string prefix, + ESMC_LogMsgType_Flag msgType, + bool deepFlag + )const{ +// +//EOPI +//----------------------------------------------------------------------------- + std::stringstream msg; + msg << prefix << "--- Array::log() start -----------------------------------"; + ESMC_LogDefault.Write(msg.str(), msgType); + + if (ESMC_BaseGetStatus()!=ESMF_STATUS_READY){ + msg.str(""); // clear + msg << prefix << "Array object is invalid! Not created or deleted!"; + ESMC_LogDefault.Write(msg.str(), msgType); + }else{ + msg.str(""); // clear + msg << prefix << " "; + ESMC_LogDefault.Write(msg.str(), msgType); + if (deepFlag) getDistGrid()->log(prefix+"! ", msgType, deepFlag); + } + msg.str(""); // clear + msg << prefix << "--- Array::log() end -------------------------------------"; + ESMC_LogDefault.Write(msg.str(), msgType); +} +//----------------------------------------------------------------------------- + //----------------------------------------------------------------------------- #undef ESMC_METHOD #define ESMC_METHOD "ESMCI::Array::print()" diff --git a/src/Infrastructure/ArrayBundle/include/ESMCI_ArrayBundle.h b/src/Infrastructure/ArrayBundle/include/ESMCI_ArrayBundle.h index ce09cf87db..d1f8d76dd9 100644 --- a/src/Infrastructure/ArrayBundle/include/ESMCI_ArrayBundle.h +++ b/src/Infrastructure/ArrayBundle/include/ESMCI_ArrayBundle.h @@ -121,6 +121,8 @@ class ArrayBundle : public ESMC_Base { // inherits from ESMC_Base class bool *overwrite, ESMC_FileStatus_Flag *status, int *timeslice, ESMC_IOFmt_Flag *iofmt); // misc. + void log(std::string prefix, + ESMC_LogMsgType_Flag msgType=ESMC_LOGMSG_INFO, bool deepFlag=false)const; int print() const; // serialize() and deserialize() int serialize(char *buffer,int *length,int *offset, diff --git a/src/Infrastructure/ArrayBundle/interface/ESMCI_ArrayBundle_F.C b/src/Infrastructure/ArrayBundle/interface/ESMCI_ArrayBundle_F.C index e36198c7de..df1456e285 100644 --- a/src/Infrastructure/ArrayBundle/interface/ESMCI_ArrayBundle_F.C +++ b/src/Infrastructure/ArrayBundle/interface/ESMCI_ArrayBundle_F.C @@ -381,6 +381,36 @@ extern "C" { ESMC_NOT_PRESENT_FILTER(rc)); } + void FTN_X(c_esmc_arraybundlelog)(ESMCI::ArrayBundle **arraybundle, + char *prefix, ESMC_LogMsgType_Flag *logMsgFlag, ESMC_Logical *deep, + int *rc, ESMCI_FortranStrLenArg prefix_l){ +#undef ESMC_METHOD +#define ESMC_METHOD "c_esmc_arraybundlelog()" + if (rc!=NULL) *rc = ESMC_RC_NOT_IMPL; + // convert to bool + bool deepFlag = false; // default + if (ESMC_NOT_PRESENT_FILTER(deep) != ESMC_NULL_POINTER) + if (*deep == ESMF_TRUE) deepFlag = true; + try{ + std::string prefixStr(prefix, prefix_l); + (*arraybundle)->log(prefixStr, *logMsgFlag, deepFlag); + }catch(int localrc){ + if (ESMC_LogDefault.MsgFoundError(localrc, ESMCI_ERR_PASSTHRU, + ESMC_CONTEXT, rc)) + return; // bail out + }catch(std::exception &x){ + ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, x.what(), ESMC_CONTEXT, + rc); + return; // bail out + }catch(...){ + ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, "- Caught exception", + ESMC_CONTEXT, rc); + return; + } + // return successfully + if (rc!=NULL) *rc = ESMF_SUCCESS; + } + void FTN_X(c_esmc_arraybundleprint)(ESMCI::ArrayBundle **ptr, int *rc){ #undef ESMC_METHOD #define ESMC_METHOD "c_esmc_arraybundleprint()" diff --git a/src/Infrastructure/ArrayBundle/interface/ESMF_ArrayBundle.F90 b/src/Infrastructure/ArrayBundle/interface/ESMF_ArrayBundle.F90 index 803f05520a..adfd393b05 100644 --- a/src/Infrastructure/ArrayBundle/interface/ESMF_ArrayBundle.F90 +++ b/src/Infrastructure/ArrayBundle/interface/ESMF_ArrayBundle.F90 @@ -89,6 +89,7 @@ module ESMF_ArrayBundleMod public ESMF_ArrayBundleHaloRelease public ESMF_ArrayBundleHaloStore public ESMF_ArrayBundleIsCreated + public ESMF_ArrayBundleLog public ESMF_ArrayBundlePrint public ESMF_ArrayBundleRead public ESMF_ArrayBundleRedist @@ -1587,6 +1588,75 @@ function ESMF_ArrayBundleIsCreated(arraybundle, keywordEnforcer, rc) !------------------------------------------------------------------------------ +! -------------------------- ESMF-public method ----------------------------- +#undef ESMF_METHOD +#define ESMF_METHOD "ESMF_ArrayBundleLog()" +!BOP +! !IROUTINE: ESMF_ArrayBundleLog - Log ArrayBundle information + +! !INTERFACE: + subroutine ESMF_ArrayBundleLog(arraybundle, keywordEnforcer, prefix, logMsgFlag, deepFlag, rc) +! +! !ARGUMENTS: + type(ESMF_ArrayBundle), intent(in) :: arraybundle +type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below + character(len=*), intent(in), optional :: prefix + type(ESMF_LogMsg_Flag), intent(in), optional :: logMsgFlag + logical, intent(in), optional :: deepFlag + integer, intent(out), optional :: rc +! +! !DESCRIPTION: +! Write information about {\tt arraybundle} to the ESMF default Log. +! +! The arguments are: +! \begin{description} +! \item[arraybundle] +! {\tt ESMF\_ArrayBundle} object logged. +! \item [{[prefix]}] +! String to prefix the log message. Default is no prefix. +! \item [{[logMsgFlag]}] +! Type of log message generated. See section \ref{const:logmsgflag} for +! a list of valid message types. Default is {\tt ESMF\_LOGMSG\_INFO}. +! \item[{[deepFlag]}] +! When set to {\tt .false.} (default), only log top level information for +! each item contained in the ArrayBundle. +! When set to {\tt .true.}, additionally log information for each item. +! \item[{[rc]}] +! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors. +! \end{description} +! +!EOP +!------------------------------------------------------------------------------ + integer :: localrc ! local return code + type(ESMF_LogMsg_Flag) :: logMsg + type(ESMF_Logical) :: deep + + ! initialize return code; assume routine not implemented + localrc = ESMF_RC_NOT_IMPL + if (present(rc)) rc = ESMF_RC_NOT_IMPL + + ! Check init status of arguments + ESMF_INIT_CHECK_DEEP_SHORT(ESMF_ArrayBundleGetInit, arraybundle, rc) + + ! deal with optional logMsgFlag + logMsg = ESMF_LOGMSG_INFO ! default + if (present(logMsgFlag)) logMsg = logMsgFlag + + ! deal with optional deepFlag + deep = ESMF_FALSE ! default + if (present(deepFlag)) deep = deepFlag + + ! Call into the C++ interface. + call c_esmc_arraybundlelog(arraybundle, prefix, logMsg, deep, localrc) + if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + ! return successfully + if (present(rc)) rc = ESMF_SUCCESS + + end subroutine ESMF_ArrayBundleLog +!------------------------------------------------------------------------------ + ! -------------------------- ESMF-public method ------------------------------- #undef ESMF_METHOD diff --git a/src/Infrastructure/ArrayBundle/src/ESMCI_ArrayBundle.C b/src/Infrastructure/ArrayBundle/src/ESMCI_ArrayBundle.C index 59068660dd..8dbd065615 100644 --- a/src/Infrastructure/ArrayBundle/src/ESMCI_ArrayBundle.C +++ b/src/Infrastructure/ArrayBundle/src/ESMCI_ArrayBundle.C @@ -536,6 +536,57 @@ int ArrayBundle::write( // //----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#undef ESMC_METHOD +#define ESMC_METHOD "ESMCI::ArrayBundle::log()" +//BOPI +// !IROUTINE: ESMCI::ArrayBundle::log +// +// !INTERFACE: +void ArrayBundle::log( +// +// !DESCRIPTION: +// Log details of ArrayBundle object +// +// !ARGUMENTS: +// + std::string prefix, + ESMC_LogMsgType_Flag msgType, + bool deepFlag + )const{ +// +//EOPI +//----------------------------------------------------------------------------- + std::stringstream msg; + msg << prefix << "--- ArrayBundle::log() start -----------------------------"; + ESMC_LogDefault.Write(msg.str(), msgType); + + if (ESMC_BaseGetStatus()!=ESMF_STATUS_READY){ + msg.str(""); // clear + msg << prefix << "ArrayBundle object is invalid! Not created or deleted!"; + ESMC_LogDefault.Write(msg.str(), msgType); + }else{ + msg.str(""); // clear + msg << prefix << "ArrayBundle object is valid!" + << " "; + ESMC_LogDefault.Write(msg.str(), msgType); + int item=0; + for (auto it = arrayContainer.begin(); it != arrayContainer.end(); ++it, + item++){ + msg.str(""); // clear + msg << prefix << "+- second->second->getName() << ">"; + ESMC_LogDefault.Write(msg.str(), msgType); + if (deepFlag) it->second->second->log(prefix+"! ", msgType, deepFlag); + } + } + msg.str(""); // clear + msg << prefix << "--- ArrayBundle::log() end -------------------------------"; + ESMC_LogDefault.Write(msg.str(), msgType); +} +//----------------------------------------------------------------------------- + + //----------------------------------------------------------------------------- #undef ESMC_METHOD #define ESMC_METHOD "ESMCI::ArrayBundle::print()" diff --git a/src/Infrastructure/ArrayBundle/tests/ESMF_ArrayBundleCreateUTest.F90 b/src/Infrastructure/ArrayBundle/tests/ESMF_ArrayBundleCreateUTest.F90 index 1de0c1c029..0f9094cf65 100644 --- a/src/Infrastructure/ArrayBundle/tests/ESMF_ArrayBundleCreateUTest.F90 +++ b/src/Infrastructure/ArrayBundle/tests/ESMF_ArrayBundleCreateUTest.F90 @@ -155,11 +155,18 @@ program ESMF_ArrayBundleCreateUTest !------------------------------------------------------------------------ !NEX_UTest - write(name, *) "ArrayBundlePrint Test" + write(name, *) "ArrayBundlePrint #1 Test" write(failMsg, *) "Did not return ESMF_SUCCESS" call ESMF_ArrayBundlePrint(arraybundle, rc=rc) call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE) + !------------------------------------------------------------------------ + !NEX_UTest + write(name, *) "ArrayBundleLog #1 Test" + write(failMsg, *) "Did not return ESMF_SUCCESS" + call ESMF_ArrayBundleLog(arraybundle, prefix="log-#1: ", rc=rc) + call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE) + !------------------------------------------------------------------------ !NEX_UTest write(name, *) "ArrayBundleDestroy Test" @@ -257,11 +264,18 @@ program ESMF_ArrayBundleCreateUTest !------------------------------------------------------------------------ !NEX_UTest - write(name, *) "ArrayBundlePrint Test" + write(name, *) "ArrayBundlePrint #2 Test" write(failMsg, *) "Did not return ESMF_SUCCESS" call ESMF_ArrayBundlePrint(arraybundle, rc=rc) call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE) + !------------------------------------------------------------------------ + !NEX_UTest + write(name, *) "ArrayBundleLog #2 Test" + write(failMsg, *) "Did not return ESMF_SUCCESS" + call ESMF_ArrayBundleLog(arraybundle, prefix="log-#2: ", rc=rc) + call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE) + !------------------------------------------------------------------------ !NEX_UTest write(name, *) "ArrayBundleGet with arrayList Test" @@ -450,7 +464,15 @@ program ESMF_ArrayBundleCreateUTest !------------------------------------------------------------------------ call ESMF_ArrayBundlePrint(arraybundle, rc=rc) if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT) - + + !------------------------------------------------------------------------ + !NEX_UTest + write(name, *) "ArrayBundleLog #3 Test" + write(failMsg, *) "Did not return ESMF_SUCCESS" + call ESMF_ArrayBundleLog(arraybundle, prefix="log-#3: ", deepFlag=.true., & + rc=rc) + call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE) + !------------------------------------------------------------------------ !NEX_UTest write(name, *) "ArrayBundleGet with arrayName to get count Test" diff --git a/src/Infrastructure/Config/src/ESMF_Config.F90 b/src/Infrastructure/Config/src/ESMF_Config.F90 index 6673283b3f..e947e574f6 100644 --- a/src/Infrastructure/Config/src/ESMF_Config.F90 +++ b/src/Infrastructure/Config/src/ESMF_Config.F90 @@ -3184,7 +3184,7 @@ subroutine ESMF_ConfigLog(config, keywordEnforcer, raw, prefix, logMsgFlag, & localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag diff --git a/src/Infrastructure/DistGrid/include/ESMCI_DistGrid.h b/src/Infrastructure/DistGrid/include/ESMCI_DistGrid.h index 64ec9307b9..822b7124aa 100644 --- a/src/Infrastructure/DistGrid/include/ESMCI_DistGrid.h +++ b/src/Infrastructure/DistGrid/include/ESMCI_DistGrid.h @@ -314,6 +314,8 @@ namespace ESMCI { int fillIndexListPDimPDe(int *indexList, int de, int dim, VMK::commhandle **commh, int rootPet, VM *vm=NULL) const; // misc. + void log(std::string prefix, + ESMC_LogMsgType_Flag msgType=ESMC_LOGMSG_INFO, bool deepFlag=false)const; static DistGridMatch_Flag match(DistGrid *distgrid1, DistGrid *distgrid2, int *rc=NULL); int print() const; diff --git a/src/Infrastructure/DistGrid/interface/ESMCI_DistGrid_F.C b/src/Infrastructure/DistGrid/interface/ESMCI_DistGrid_F.C index 184935737f..927389ceb0 100644 --- a/src/Infrastructure/DistGrid/interface/ESMCI_DistGrid_F.C +++ b/src/Infrastructure/DistGrid/interface/ESMCI_DistGrid_F.C @@ -804,6 +804,36 @@ extern "C" { if (rc!=NULL) *rc = ESMF_SUCCESS; } + void FTN_X(c_esmc_distgridlog)(ESMCI::DistGrid **distgrid, + char *prefix, ESMC_LogMsgType_Flag *logMsgFlag, ESMC_Logical *deep, int *rc, + ESMCI_FortranStrLenArg prefix_l){ +#undef ESMC_METHOD +#define ESMC_METHOD "c_esmc_distgridlog()" + if (rc!=NULL) *rc = ESMC_RC_NOT_IMPL; + // convert to bool + bool deepFlag = false; // default + if (ESMC_NOT_PRESENT_FILTER(deep) != ESMC_NULL_POINTER) + if (*deep == ESMF_TRUE) deepFlag = true; + try{ + std::string prefixStr(prefix, prefix_l); + (*distgrid)->log(prefixStr, *logMsgFlag, deepFlag); + }catch(int localrc){ + if (ESMC_LogDefault.MsgFoundError(localrc, ESMCI_ERR_PASSTHRU, + ESMC_CONTEXT, rc)) + return; // bail out + }catch(std::exception &x){ + ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, x.what(), ESMC_CONTEXT, + rc); + return; // bail out + }catch(...){ + ESMC_LogDefault.MsgFoundError(ESMC_RC_INTNRL_BAD, "- Caught exception", + ESMC_CONTEXT, rc); + return; + } + // return successfully + if (rc!=NULL) *rc = ESMF_SUCCESS; + } + void FTN_X(c_esmc_distgridmatch)(ESMCI::DistGrid **ptr1, ESMCI::DistGrid **ptr2, ESMCI::DistGridMatch_Flag *matchResult, int *rc){ #undef ESMC_METHOD diff --git a/src/Infrastructure/DistGrid/interface/ESMF_DistGrid.F90 b/src/Infrastructure/DistGrid/interface/ESMF_DistGrid.F90 index 9f483a64a1..5d7007ca0b 100644 --- a/src/Infrastructure/DistGrid/interface/ESMF_DistGrid.F90 +++ b/src/Infrastructure/DistGrid/interface/ESMF_DistGrid.F90 @@ -139,6 +139,7 @@ module ESMF_DistGridMod public ESMF_DistGridGet public ESMF_DistGridIsCreated + public ESMF_DistGridLog public ESMF_DistGridMatch public ESMF_DistGridPrint public ESMF_DistGridSet @@ -3945,6 +3946,76 @@ function ESMF_DistGridIsCreated(distgrid, keywordEnforcer, rc) !------------------------------------------------------------------------------ +! -------------------------- ESMF-public method ----------------------------- +#undef ESMF_METHOD +#define ESMF_METHOD "ESMF_DistGridLog()" +!BOP +! !IROUTINE: ESMF_DistGridLog - Log DistGrid information + +! !INTERFACE: + subroutine ESMF_DistGridLog(distgrid, keywordEnforcer, prefix, logMsgFlag, deepFlag, rc) +! +! !ARGUMENTS: + type(ESMF_DistGrid), intent(in) :: distgrid +type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below + character(len=*), intent(in), optional :: prefix + type(ESMF_LogMsg_Flag), intent(in), optional :: logMsgFlag + logical, intent(in), optional :: deepFlag + integer, intent(out), optional :: rc +! +! !DESCRIPTION: +! Write information about {\tt DistGrid} to the ESMF default Log. +! +! The arguments are: +! \begin{description} +! \item[distgrid] +! {\tt ESMF\_DistGrid} object logged. +! \item [{[prefix]}] +! String to prefix the log message. Default is no prefix. +! \item [{[logMsgFlag]}] +! Type of log message generated. See section \ref{const:logmsgflag} for +! a list of valid message types. Default is {\tt ESMF\_LOGMSG\_INFO}. +! \item[{[deepFlag]}] +! When set to {\tt .false.} (default), only log top level information about +! the DistGrid. +! When set to {\tt .true.}, additionally log deep information. +! \item[{[rc]}] +! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors. +! \end{description} +! +!EOP +!------------------------------------------------------------------------------ + integer :: localrc ! local return code + type(ESMF_LogMsg_Flag) :: logMsg + type(ESMF_Logical) :: deep + + ! initialize return code; assume routine not implemented + localrc = ESMF_RC_NOT_IMPL + if (present(rc)) rc = ESMF_RC_NOT_IMPL + + ! Check init status of arguments + ESMF_INIT_CHECK_DEEP(ESMF_DistGridGetInit, distgrid, rc) + + ! deal with optional logMsgFlag + logMsg = ESMF_LOGMSG_INFO ! default + if (present(logMsgFlag)) logMsg = logMsgFlag + + ! deal with optional deepFlag + deep = ESMF_FALSE ! default + if (present(deepFlag)) deep = deepFlag + + ! Call into the C++ interface. + call c_esmc_distgridlog(distgrid, prefix, logMsg, deep, localrc) + if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + ! return successfully + if (present(rc)) rc = ESMF_SUCCESS + + end subroutine ESMF_DistGridLog +!------------------------------------------------------------------------------ + + ! -------------------------- ESMF-public method ------------------------------- #undef ESMF_METHOD #define ESMF_METHOD "ESMF_DistGridMatch()" diff --git a/src/Infrastructure/DistGrid/src/ESMCI_DistGrid.C b/src/Infrastructure/DistGrid/src/ESMCI_DistGrid.C index 5cbcb3fe6b..cea2f6f378 100644 --- a/src/Infrastructure/DistGrid/src/ESMCI_DistGrid.C +++ b/src/Infrastructure/DistGrid/src/ESMCI_DistGrid.C @@ -3907,11 +3907,53 @@ int DistGrid::fillIndexListPDimPDe( //----------------------------------------------------------------------------- // -// match, print and validation class methods +// log, match, print and validation class methods // //----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#undef ESMC_METHOD +#define ESMC_METHOD "ESMCI::DistGrid::log()" +//BOPI +// !IROUTINE: ESMCI::DistGrid::log +// +// !INTERFACE: +void DistGrid::log( +// +// !DESCRIPTION: +// Log details of DistGrid object +// +// !ARGUMENTS: +// + std::string prefix, + ESMC_LogMsgType_Flag msgType, + bool deepFlag + )const{ +// +//EOPI +//----------------------------------------------------------------------------- + std::stringstream msg; + msg << prefix << "--- DistGrid::log() start --------------------------------"; + ESMC_LogDefault.Write(msg.str(), msgType); + + if (ESMC_BaseGetStatus()!=ESMF_STATUS_READY){ + msg.str(""); // clear + msg << prefix << "DistGrid object is invalid! Not created or deleted!"; + ESMC_LogDefault.Write(msg.str(), msgType); + }else{ + msg.str(""); // clear + msg << prefix << "DistGrid object is valid!" + << " "; + ESMC_LogDefault.Write(msg.str(), msgType); + } + msg.str(""); // clear + msg << prefix << "--- DistGrid::log() end ----------------------------------"; + ESMC_LogDefault.Write(msg.str(), msgType); +} +//----------------------------------------------------------------------------- + + //----------------------------------------------------------------------------- #undef ESMC_METHOD #define ESMC_METHOD "ESMCI::DistGrid::match()" diff --git a/src/Infrastructure/Field/src/ESMF_FieldHalo.F90 b/src/Infrastructure/Field/src/ESMF_FieldHalo.F90 index b2254ba8d3..a0e79daea8 100644 --- a/src/Infrastructure/Field/src/ESMF_FieldHalo.F90 +++ b/src/Infrastructure/Field/src/ESMF_FieldHalo.F90 @@ -43,7 +43,8 @@ module ESMF_FieldHaloMod use ESMF_VMMod use ESMF_DELayoutMod use ESMF_RHandleMod - + use ESMF_UtilMod + implicit none !------------------------------------------------------------------------------ @@ -64,6 +65,7 @@ module ESMF_FieldHaloMod public ESMF_FieldHaloRelease public ESMF_FieldHaloStore public ESMF_FieldIsCreated ! Check if a Field object is created + public ESMF_FieldLog !EOPI !------------------------------------------------------------------------------ @@ -423,7 +425,7 @@ function ESMF_FieldIsCreated(field, keywordEnforcer, rc) ! \end{description} ! !EOP - !----------------------------------------------------------------------------- +!------------------------------------------------------------------------------ ESMF_FieldIsCreated = .false. ! initialize if (present(rc)) rc = ESMF_SUCCESS if (ESMF_FieldGetInit(field)==ESMF_INIT_CREATED) & @@ -431,4 +433,144 @@ function ESMF_FieldIsCreated(field, keywordEnforcer, rc) end function !------------------------------------------------------------------------------ + +!------------------------------------------------------------------------------ +#undef ESMF_METHOD +#define ESMF_METHOD "ESMF_FieldLog()" +!BOP +! !IROUTINE: ESMF_FieldLog - Log Field information + +! !INTERFACE: + subroutine ESMF_FieldLog(field, keywordEnforcer, prefix, logMsgFlag, deepFlag, rc) +! +! !ARGUMENTS: + type(ESMF_Field), intent(in) :: field +type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below + character(len=*), intent(in), optional :: prefix + type(ESMF_LogMsg_Flag), intent(in), optional :: logMsgFlag + logical, intent(in), optional :: deepFlag + integer, intent(out), optional :: rc +! +! !DESCRIPTION: +! Write information about {\tt field} to the ESMF default Log. +! +! The arguments are: +! \begin{description} +! \item[field] +! The {\tt ESMF\_Field} object logged. +! \item [{[prefix]}] +! String to prefix the log message. Default is no prefix. +! \item [{[logMsgFlag]}] +! Type of log message generated. See section \ref{const:logmsgflag} for +! a list of valid message types. Default is {\tt ESMF\_LOGMSG\_INFO}. +! \item[{[deepFlag]}] +! When set to {\tt .false.} (default), only log top level information about +! the Field. +! When set to {\tt .true.}, additionally log deep information. +! \item[{[rc]}] +! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors. +! \end{description} +! +!EOP +!------------------------------------------------------------------------------ + integer :: localrc ! local return code + type(ESMF_LogMsg_Flag) :: logMsg + character(len=:), allocatable :: prefixStr + logical :: deepLog + type(ESMF_FieldStatus_Flag) :: fieldStatus + type(ESMF_TypeKind_Flag) :: typekind + integer :: rank, dimCount + character(ESMF_MAXSTR) :: name, tempString + character(800) :: msgString + + ! initialize return code; assume routine not implemented + localrc = ESMF_RC_NOT_IMPL + if (present(rc)) rc = ESMF_RC_NOT_IMPL + + ! optional prefix + if (present(prefix)) then + prefixStr = trim(prefix) + else + prefixStr = "" + endif + + ! deal with optional logMsgFlag + logMsg = ESMF_LOGMSG_INFO ! default + if (present(logMsgFlag)) logMsg = logMsgFlag + + ! deal with optional deepFlag + deepLog = .false. ! default + if (present(deepFlag)) deepLog = deepFlag + + call ESMF_LogWrite(ESMF_StringConcat(trim(prefixStr), & + "--- FieldLog() start -----------------"), logMsg, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + if (.not. ESMF_FieldIsCreated(field)) then + call ESMF_LogWrite(ESMF_StringConcat(prefix, & + "Field object is invalid! Not created or deleted!"), & + logMsg, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + else + ! query + call ESMF_FieldGet(field, name=name, status=fieldStatus, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + if (fieldStatus==ESMF_FIELDSTATUS_EMPTY) then + tempString = "ESMF_FIELDSTATUS_EMPTY" + else if (fieldStatus==ESMF_FIELDSTATUS_GRIDSET) then + tempString = "ESMF_FIELDSTATUS_GRIDSET" + else if (fieldStatus==ESMF_FIELDSTATUS_COMPLETE) then + tempString = "ESMF_FIELDSTATUS_COMPLETE" + else + tempString = "Out or range FIELDSTATUS!!!" + endif + + write (msgString,'(A,A,A,A,A,A)') & + prefix, " " + call ESMF_LogWrite(trim(msgString), logMsg, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + if (fieldStatus == ESMF_FIELDSTATUS_COMPLETE) then + call ESMF_FieldGet(field, typekind=typekind, rank=rank, & + dimCount=dimCount, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + call ESMF_TypeKindString(typekind, string=tempString, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + write (msgString,'(A,A,A,A,A,I4,A,A,I4,A)') & + prefix, "", & + " ", " " + call ESMF_LogWrite(trim(msgString), logMsg, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + endif + endif + + call ESMF_LogWrite(ESMF_StringConcat(trim(prefixStr), & + "--- FieldLog() end -------------------"), logMsg, rc=localrc) + if (ESMF_LogFoundError(localrc, & + ESMF_ERR_PASSTHRU, & + ESMF_CONTEXT, rcToReturn=rc)) return + + ! return successfully + if (present(rc)) rc = ESMF_SUCCESS + + end subroutine ESMF_FieldLog +!------------------------------------------------------------------------------ + end module ESMF_FieldHaloMod diff --git a/src/Infrastructure/VM/include/ESMCI_VM.h b/src/Infrastructure/VM/include/ESMCI_VM.h index 08f43badce..5a6493d332 100644 --- a/src/Infrastructure/VM/include/ESMCI_VM.h +++ b/src/Infrastructure/VM/include/ESMCI_VM.h @@ -1,10 +1,10 @@ // $Id$ // // Earth System Modeling Framework -// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, -// Massachusetts Institute of Technology, Geophysical Fluid Dynamics -// Laboratory, University of Michigan, National Centers for Environmental -// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, +// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, +// Massachusetts Institute of Technology, Geophysical Fluid Dynamics +// Laboratory, University of Michigan, National Centers for Environmental +// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, // NASA Goddard Space Flight Center. // Licensed under the University of Illinois-NCSA License. // diff --git a/src/Infrastructure/VM/include/ESMCI_VMKernel.h b/src/Infrastructure/VM/include/ESMCI_VMKernel.h index f264766d18..a831b0a94e 100644 --- a/src/Infrastructure/VM/include/ESMCI_VMKernel.h +++ b/src/Infrastructure/VM/include/ESMCI_VMKernel.h @@ -1,10 +1,10 @@ // $Id$ // // Earth System Modeling Framework -// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, -// Massachusetts Institute of Technology, Geophysical Fluid Dynamics -// Laboratory, University of Michigan, National Centers for Environmental -// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, +// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, +// Massachusetts Institute of Technology, Geophysical Fluid Dynamics +// Laboratory, University of Michigan, National Centers for Environmental +// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, // NASA Goddard Space Flight Center. // Licensed under the University of Illinois-NCSA License. // diff --git a/src/Infrastructure/VM/interface/ESMCI_VM_F.C b/src/Infrastructure/VM/interface/ESMCI_VM_F.C index 5de36763fc..760c8fbe60 100644 --- a/src/Infrastructure/VM/interface/ESMCI_VM_F.C +++ b/src/Infrastructure/VM/interface/ESMCI_VM_F.C @@ -1,10 +1,10 @@ // $Id$ // // Earth System Modeling Framework -// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, -// Massachusetts Institute of Technology, Geophysical Fluid Dynamics -// Laboratory, University of Michigan, National Centers for Environmental -// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, +// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, +// Massachusetts Institute of Technology, Geophysical Fluid Dynamics +// Laboratory, University of Michigan, National Centers for Environmental +// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, // NASA Goddard Space Flight Center. // Licensed under the University of Illinois-NCSA License. // diff --git a/src/Infrastructure/VM/interface/ESMF_VM.F90 b/src/Infrastructure/VM/interface/ESMF_VM.F90 index cabdb79f61..8f5cb7edcb 100644 --- a/src/Infrastructure/VM/interface/ESMF_VM.F90 +++ b/src/Infrastructure/VM/interface/ESMF_VM.F90 @@ -1,10 +1,10 @@ ! $Id$ ! ! Earth System Modeling Framework -! Copyright (c) 2002-2024, University Corporation for Atmospheric Research, -! Massachusetts Institute of Technology, Geophysical Fluid Dynamics -! Laboratory, University of Michigan, National Centers for Environmental -! Prediction, Los Alamos National Laboratory, Argonne National Laboratory, +! Copyright (c) 2002-2024, University Corporation for Atmospheric Research, +! Massachusetts Institute of Technology, Geophysical Fluid Dynamics +! Laboratory, University of Michigan, National Centers for Environmental +! Prediction, Los Alamos National Laboratory, Argonne National Laboratory, ! NASA Goddard Space Flight Center. ! Licensed under the University of Illinois-NCSA License. ! @@ -5832,19 +5832,20 @@ function ESMF_VMIsCreated(vm, keywordEnforcer, rc) #undef ESMF_METHOD #define ESMF_METHOD "ESMF_VMLog()" !BOP -! !IROUTINE: ESMF_VMLog - Log +! !IROUTINE: ESMF_VMLog - Log VM information ! !INTERFACE: - subroutine ESMF_VMLog(vm, prefix, logMsgFlag, rc) + subroutine ESMF_VMLog(vm, keywordEnforcer, prefix, logMsgFlag, rc) ! ! !ARGUMENTS: type(ESMF_VM), intent(in) :: vm +type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below character(len=*), intent(in), optional :: prefix type(ESMF_LogMsg_Flag), intent(in), optional :: logMsgFlag integer, intent(out), optional :: rc ! ! !DESCRIPTION: -! Log the VM. +! Write information about {\tt vm} to the ESMF default Log. ! ! The arguments are: ! \begin{description} @@ -5868,7 +5869,7 @@ subroutine ESMF_VMLog(vm, prefix, logMsgFlag, rc) localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -5921,7 +5922,7 @@ subroutine ESMF_VMLogBacktrace(prefix, logMsgFlag, rc) localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -5974,7 +5975,7 @@ subroutine ESMF_VMLogCurrentGarbageInfo(prefix, logMsgFlag, rc) localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -6027,7 +6028,7 @@ subroutine ESMF_VMLogGarbageInfo(prefix, logMsgFlag, rc) localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -6084,7 +6085,7 @@ subroutine ESMF_VMLogMemInfo(prefix, logMsgFlag, log, rc) localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -6137,7 +6138,7 @@ subroutine ESMF_VMLogSystem(prefix, logMsgFlag, rc) localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -10494,7 +10495,7 @@ subroutine ESMF_VMIdLog(vmId, prefix, logMsgFlag, rc) localrc = ESMF_RC_NOT_IMPL if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -11292,7 +11293,7 @@ subroutine ESMF_PointerLog(ptr, prefix, logMsgFlag, rc) integer, intent(out), optional :: rc type(ESMF_LogMsg_Flag) :: logMsg if (present(rc)) rc = ESMF_RC_NOT_IMPL - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag call c_pointerlog(ptr, prefix, logMsg) diff --git a/src/Infrastructure/VM/src/ESMCI_VMKernel.C b/src/Infrastructure/VM/src/ESMCI_VMKernel.C index f7ea7c1679..63b85ad0c3 100644 --- a/src/Infrastructure/VM/src/ESMCI_VMKernel.C +++ b/src/Infrastructure/VM/src/ESMCI_VMKernel.C @@ -1,10 +1,10 @@ // $Id$ // // Earth System Modeling Framework -// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, -// Massachusetts Institute of Technology, Geophysical Fluid Dynamics -// Laboratory, University of Michigan, National Centers for Environmental -// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, +// Copyright (c) 2002-2024, University Corporation for Atmospheric Research, +// Massachusetts Institute of Technology, Geophysical Fluid Dynamics +// Laboratory, University of Michigan, National Centers for Environmental +// Prediction, Los Alamos National Laboratory, Argonne National Laboratory, // NASA Goddard Space Flight Center. // Licensed under the University of Illinois-NCSA License. // diff --git a/src/Superstructure/State/src/ESMF_StateAPI.cppF90 b/src/Superstructure/State/src/ESMF_StateAPI.cppF90 index e57540cc57..0e26f6e7de 100644 --- a/src/Superstructure/State/src/ESMF_StateAPI.cppF90 +++ b/src/Superstructure/State/src/ESMF_StateAPI.cppF90 @@ -45,6 +45,7 @@ module ESMF_StateAPIMod use ESMF_FieldMod use ESMF_FieldGetMod use ESMF_FieldCreateMod + use ESMF_FieldHaloMod use ESMF_FieldBundleMod use ESMF_RHandleMod use ESMF_StateTypesMod @@ -1826,13 +1827,14 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below ^undef ESMF_METHOD ^define ESMF_METHOD "ESMF_StateLog()" !BOP -! !IROUTINE: ESMF_StateLog - Log +! !IROUTINE: ESMF_StateLog - Log State information ! !INTERFACE: - subroutine ESMF_StateLog(state, prefix, logMsgFlag, nestedFlag, deepFlag, rc) + subroutine ESMF_StateLog(state, keywordEnforcer, prefix, logMsgFlag, nestedFlag, deepFlag, rc) ! ! !ARGUMENTS: type(ESMF_State), intent(in) :: state +type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below character(len=*), intent(in), optional :: prefix type(ESMF_LogMsg_Flag), intent(in), optional :: logMsgFlag logical, intent(in), optional :: nestedFlag @@ -1840,7 +1842,7 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below integer, intent(out), optional :: rc ! ! !DESCRIPTION: -! Output information about {\tt state} to the ESMF default Log. +! Write information about {\tt state} to the ESMF default Log. ! ! The arguments are: ! \begin{description} @@ -1888,7 +1890,7 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below deepLog = .false. ! default if (present(deepFlag)) deepLog = deepFlag - ! deal with optionl logMsgFlag + ! deal with optional logMsgFlag logMsg = ESMF_LOGMSG_INFO ! default if (present(logMsgFlag)) logMsg = logMsgFlag @@ -1936,7 +1938,7 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below localrc = ESMF_RC_NOT_IMPL if (.not. ESMF_StateIsCreated(stateR)) then call ESMF_LogWrite(ESMF_StringConcat(prefix, & - "State object is invalid! Not created or deleted"), & + "State object is invalid! Not created or deleted!"), & logMsg, rc=localrc) if (ESMF_LogFoundError(localrc, & ESMF_ERR_PASSTHRU, & @@ -1963,9 +1965,8 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below tempString = "Out or range STATEINTENT!!!" endif - write (msgString,'(A,A,A,A,A,A,A,A,I4,A)') & - prefix, "State object is valid!", & - " ", & + write (msgString,'(A,A,A,A,A,A,A,I4,A)') & + prefix, " ", & " " call ESMF_LogWrite(trim(msgString), logMsg, rc=localrc) if (ESMF_LogFoundError(localrc, & @@ -2014,9 +2015,9 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below if (ESMF_LogFoundError(localrc, & ESMF_ERR_PASSTHRU, & ESMF_CONTEXT, rcToReturn=rc)) return -! call ESMF_FieldLog(field, & -! prefix=ESMF_StringConcat(prefix, "! "), & -! logMsgFlag=logMsg, rc=localrc) + call ESMF_FieldLog(field, & + prefix=ESMF_StringConcat(prefix, "! "), & + logMsgFlag=logMsg, rc=localrc) if (ESMF_LogFoundError(localrc, & ESMF_ERR_PASSTHRU, & ESMF_CONTEXT, rcToReturn=rc)) return @@ -2037,9 +2038,9 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below if (ESMF_LogFoundError(localrc, & ESMF_ERR_PASSTHRU, & ESMF_CONTEXT, rcToReturn=rc)) return -! call ESMF_ArrayLog(array, & -! prefix=ESMF_StringConcat(prefix, "! "), & -! logMsgFlag=logMsg, rc=localrc) + call ESMF_ArrayLog(array, & + prefix=ESMF_StringConcat(prefix, "! "), & + logMsgFlag=logMsg, rc=localrc) if (ESMF_LogFoundError(localrc, & ESMF_ERR_PASSTHRU, & ESMF_CONTEXT, rcToReturn=rc)) return @@ -2049,9 +2050,9 @@ type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below if (ESMF_LogFoundError(localrc, & ESMF_ERR_PASSTHRU, & ESMF_CONTEXT, rcToReturn=rc)) return -! call ESMF_ArrayBundleLog(arraybundle, & -! prefix=ESMF_StringConcat(prefix, "! "), & -! logMsgFlag=logMsg, rc=localrc) + call ESMF_ArrayBundleLog(arraybundle, & + prefix=ESMF_StringConcat(prefix, "! "), & + logMsgFlag=logMsg, deepFlag=deepLog, rc=localrc) if (ESMF_LogFoundError(localrc, & ESMF_ERR_PASSTHRU, & ESMF_CONTEXT, rcToReturn=rc)) return diff --git a/src/Superstructure/State/tests/ESMF_StateCreateUTest.F90 b/src/Superstructure/State/tests/ESMF_StateCreateUTest.F90 index 8ded04edd9..179857b539 100644 --- a/src/Superstructure/State/tests/ESMF_StateCreateUTest.F90 +++ b/src/Superstructure/State/tests/ESMF_StateCreateUTest.F90 @@ -85,6 +85,7 @@ program ESMF_StateCreateUTest type(ESMF_State) :: state2, state3, state4, state5 type(ESMF_FieldBundle) :: bundle1, bundle2, bundle3, qbundle type(ESMF_FieldBundle) :: bundle5, bundle6, bundle7 + type(ESMF_ArrayBundle) :: arraybundle1 type(ESMF_VM) :: vm logical :: isNeeded @@ -373,6 +374,22 @@ program ESMF_StateCreateUTest call ESMF_Test((rc.eq.ESMF_SUCCESS), & name, failMsg, result, ESMF_SRCLINE) !------------------------------------------------------------------------ + !EX_UTest + ! Create an arraybundle to use in the subsequent tests + arraybundle1 = ESMF_ArrayBundleCreate(name="AB1", rc=rc) + write(failMsg, *) "" + write(name, *) "Creating an empty arraybundle for State Test" + call ESMF_Test((rc.eq.ESMF_SUCCESS), & + name, failMsg, result, ESMF_SRCLINE) + !------------------------------------------------------------------------ + !EX_UTest + ! Test adding an arraybundle to a state + call ESMF_StateAdd(state2, (/arraybundle1/), rc=rc) + write(failMsg, *) "" + write(name, *) "Adding an ArrayBundle to a State" + call ESMF_Test((rc.eq.ESMF_SUCCESS), & + name, failMsg, result, ESMF_SRCLINE) + !------------------------------------------------------------------------ !EX_UTest ! Test printing a State with 1 FieldBundle call ESMF_StatePrint(state2, rc=rc) @@ -383,7 +400,8 @@ program ESMF_StateCreateUTest !------------------------------------------------------------------------ !EX_UTest ! Test logging a State with 1 FieldBundle - call ESMF_StateLog(state2, prefix="Log-1FB-State: ", rc=rc) + call ESMF_StateLog(state2, prefix="Log-1FB-State: ", deepFlag=.true., & + rc=rc) write(failMsg, *) "" write(name, *) "Logging a State with 1 FieldBundle Test" call ESMF_Test((rc.eq.ESMF_SUCCESS), & diff --git a/src/addon/ESMX/Driver/ESMX_Driver.F90 b/src/addon/ESMX/Driver/ESMX_Driver.F90 index def69f5fed..eac2465c5f 100644 --- a/src/addon/ESMX/Driver/ESMX_Driver.F90 +++ b/src/addon/ESMX/Driver/ESMX_Driver.F90 @@ -145,40 +145,46 @@ subroutine SetModelServices(driver, rc) foundFlag=isFlag, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=FILENAME)) return ! bail out - if (.not.isFlag) then - call ESMF_LogSetError(ESMF_RC_ARG_INCOMP, & - msg="Must provide settings for: "//configKey(1)//":"//configKey(2), & - line=__LINE__, file=FILENAME, rcToReturn=rc) - return ! bail out - endif - - ! Validate hconfigNode against ESMX/Driver controlled key vocabulary - isFlag = ESMF_HConfigValidateMapKeys(hconfigNode, & - vocabulary=["attributes ", & ! ESMX_Driver option - "componentList", & ! ESMX_Driver option - "runSequence " & ! ESMX_Driver option - ], badKey=string1, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=FILENAME)) & - call ESMF_Finalize(endflag=ESMF_END_ABORT) - if (.not.isFlag) then - call ESMF_LogSetError(ESMF_RC_ARG_WRONG, & - msg="An invalid key was found in config under ESMX/Driver (maybe a typo?): "//string1, & - line=__LINE__, file=FILENAME, rcToReturn=rc) - call ESMF_Finalize(endflag=ESMF_END_ABORT) + if (isFlag) then + ! Validate hconfigNode against ESMX/Driver controlled key vocabulary + isFlag = ESMF_HConfigValidateMapKeys(hconfigNode, & + vocabulary=["attributes ", & ! ESMX_Driver option + "componentList", & ! ESMX_Driver option + "runSequence " & ! ESMX_Driver option + ], badKey=string1, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=FILENAME)) & + call ESMF_Finalize(endflag=ESMF_END_ABORT) + if (.not.isFlag) then + call ESMF_LogSetError(ESMF_RC_ARG_WRONG, & + msg="An invalid key was found in config under ESMX/Driver (maybe a typo?): "//string1, & + line=__LINE__, file=FILENAME, rcToReturn=rc) + call ESMF_Finalize(endflag=ESMF_END_ABORT) + endif + ! Ingest the generic component label list + isFlag = ESMF_HConfigIsDefined(hconfigNode, keyString="componentList", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=FILENAME)) return ! bail out + isFlag = isFlag .and. & + .not.ESMF_HConfigIsNull(hconfigNode, keyString="componentList", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=FILENAME)) return ! bail out + if (isFlag) then + componentList = ESMF_HConfigAsStringSeq(hconfigNode, stringLen=32, & + keyString="componentList", rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=FILENAME)) return ! bail out + endif + call ESMF_HConfigDestroy(hconfigNode, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=FILENAME)) return ! bail out endif - ! Ingest the generic component label list - componentList = ESMF_HConfigAsStringSeq(hconfigNode, stringLen=32, & - keyString="componentList", rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=FILENAME)) return ! bail out - call ESMF_HConfigDestroy(hconfigNode, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=FILENAME)) return ! bail out - ! Determine componentCount - componentCount = size(componentList) + componentCount = 0 ! no components for unallocated componentList + if (allocated(componentList)) componentCount = size(componentList) ! Setup CompDef structure allocate(CompDef(componentDefCount)) @@ -388,36 +394,31 @@ subroutine SetRunSequence(driver, rc) foundFlag=isFlag, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=FILENAME)) return ! bail out - if (.not.isFlag) then - call ESMF_LogSetError(ESMF_RC_ARG_INCOMP, & - msg="Must provide settings for: "//configKey(1)//":"//configKey(2), & - line=__LINE__, file=FILENAME, rcToReturn=rc) - return ! bail out - endif - - isFlag = ESMF_HConfigIsDefined(hconfigNode, keyString="runSequence", & - rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=FILENAME)) return ! bail out if (isFlag) then - hconfig = ESMF_HConfigCreateAt(hconfigNode, keyString="runSequence", & + isFlag = ESMF_HConfigIsDefined(hconfigNode, keyString="runSequence", & rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=FILENAME)) return ! bail out - call NUOPC_DriverIngestRunSequence(driver, hconfig, & - autoAddConnectors=.true., rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=FILENAME)) return ! bail out - call ESMF_HConfigDestroy(hconfig, rc=rc) + if (isFlag) then + hconfig = ESMF_HConfigCreateAt(hconfigNode, keyString="runSequence", & + rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=FILENAME)) return ! bail out + call NUOPC_DriverIngestRunSequence(driver, hconfig, & + autoAddConnectors=.true., rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, & + msg="Unable to ingest RunSequence!", & + line=__LINE__, file=FILENAME)) return ! bail out + call ESMF_HConfigDestroy(hconfig, rc=rc) + if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, file=FILENAME)) return ! bail out + endif + ! clean-up + call ESMF_HConfigDestroy(hconfigNode, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=FILENAME)) return ! bail out endif - ! clean-up - call ESMF_HConfigDestroy(hconfigNode, rc=rc) - if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, file=FILENAME)) return ! bail out - end subroutine SetRunSequence !----------------------------------------------------------------------------- diff --git a/src/addon/ESMX/Driver/esmx_tools.py b/src/addon/ESMX/Driver/esmx_tools.py index 186574bbe5..f75a148e0b 100755 --- a/src/addon/ESMX/Driver/esmx_tools.py +++ b/src/addon/ESMX/Driver/esmx_tools.py @@ -6,7 +6,8 @@ def esmx_read_config(file_path: str): # open yaml file and read it if not os.path.exists(file_path): - sys.exit('File not found: {}'.format(file_path)) + print("File not found: {}, proceed with empty ESMX build configuration.".format(file_path)) + return {} # return empty with open(file_path) as file: data = yaml.safe_load(file) if data is not None: @@ -29,7 +30,10 @@ class ESMXAppCfg(dict): def __init__(self, args): if type(args) is dict: if "application" in args: - super().__init__(args["application"]) + if args["application"] is not None: + super().__init__(args["application"]) + else: + super().__init__({}) else: super().__init__({}) elif type(args) is str: @@ -43,7 +47,10 @@ class ESMXCmpCfg(dict): def __init__(self, args): if type(args) is dict: if "components" in args: - super().__init__(args["components"]) + if args["components"] is not None: + super().__init__(args["components"]) + else: + super().__init__({}) else: super().__init__({}) elif type(args) is str: @@ -80,7 +87,10 @@ class ESMXTstCfg(dict): def __init__(self, args): if type(args) is dict: if "tests" in args: - super().__init__(args["tests"]) + if args["tests"] is not None: + super().__init__(args["tests"]) + else: + super().__init__({}) else: super().__init__({}) elif type(args) is str: diff --git a/src/addon/ESMX/README.md b/src/addon/ESMX/README.md index 43ae3dd640..b85902a9fe 100644 --- a/src/addon/ESMX/README.md +++ b/src/addon/ESMX/README.md @@ -281,7 +281,7 @@ This section affects the driver level. | Option key | Description / Value options | Default | | --------------- | -------------------------------------------------------------------- | --------------- | -| `componentList` | list of component labels, each matching a top level key in this file | *non-optional* | +| `componentList` | list of component labels, each matching a top level key in this file | *Empty* | | `runSequence` | block literal string defining the run sequence | *NUOPC default* | | `attributes` | map of key value pairs, each defining a driver attribute | *None* | diff --git a/src/addon/NUOPC/src/NUOPC_Auxiliary.F90 b/src/addon/NUOPC/src/NUOPC_Auxiliary.F90 index dfea20fceb..a0c9d4648e 100644 --- a/src/addon/NUOPC/src/NUOPC_Auxiliary.F90 +++ b/src/addon/NUOPC/src/NUOPC_Auxiliary.F90 @@ -334,21 +334,24 @@ subroutine NUOPC_StateWrite(state, fieldNameList, fileNamePrefix, overwrite, & logical, intent(in), optional :: relaxedflag integer, intent(out), optional :: rc ! !DESCRIPTION: -! Write the data of the fields within a {\tt state} to NetCDF files. Each -! field is written to an individual file using the "StandardName" attribute -! as NetCDF attribute. +! Write the data of the fields contained in {\tt state} to NetCDF files. +! Each field is written to an individual file using its "StandardName" +! attribute as its NetCDF attribute. +! FieldBundle objects that are encountered within {\tt state} are traversed, +! and the contained fields are handled in the same manner as fields directly +! held by the {\tt state} object. ! ! The arguments are: ! \begin{description} ! \item[state] -! The {\tt ESMF\_State} object containing the fields. +! The {\tt ESMF\_State} object containing the fields written. ! \item[{[fieldNameList]}] ! List of names of the fields to be written. By default write all the fields ! in {\tt state}. ! \item[{[fileNamePrefix]}] ! File name prefix, common to all the files written. ! \item[{[overwrite]}] -! A logical flag, the default is .false., i.e., existing Field data may +! A logical flag, the default is .false., i.e., existing file data may ! {\em not} be overwritten. If .true., the ! data corresponding to each field's name will be ! be overwritten. If the {\tt timeslice} option is given, only data for @@ -356,7 +359,7 @@ subroutine NUOPC_StateWrite(state, fieldNameList, fileNamePrefix, overwrite, & ! Note that it is always an error to attempt to overwrite a NetCDF ! variable with data which has a different shape. ! \item[{[status]}] -! The file status. Valid options are {\tt ESMF\_FILESTATUS\_NEW}, +! The file status. Valid options are {\tt ESMF\_FILESTATUS\_NEW}, ! {\tt ESMF\_FILESTATUS\_OLD}, {\tt ESMF\_FILESTATUS\_REPLACE}, and ! {\tt ESMF\_FILESTATUS\_UNKNOWN} (default). ! \item[{[timeslice]}] @@ -386,33 +389,63 @@ subroutine NUOPC_StateWrite(state, fieldNameList, fileNamePrefix, overwrite, & !----------------------------------------------------------------------------- ! local variables integer :: localrc - integer :: i, itemCount + integer :: i, itemCount, iF, iFB + integer :: fieldCount, fieldBundleCount type(ESMF_Field) :: field + type(ESMF_FieldBundle) :: fieldbundle type(ESMF_StateItem_Flag) :: itemType character(len=160) :: fileName - character(len=160), allocatable :: fieldNameList_loc(:) + character(len=160), allocatable :: fieldNameList_loc(:) + character(len=160), allocatable :: fieldBundleNameList_loc(:) + character(len=160), allocatable :: itemNameList(:) + type(ESMF_StateItem_Flag), allocatable :: itemTypeList(:) if (present(rc)) rc = ESMF_SUCCESS + call ESMF_StateGet(state, itemCount=itemCount, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__, & + rcToReturn=rc)) & + return ! bail out + allocate(itemNameList(itemCount), itemTypeList(itemCount)) + call ESMF_StateGet(state, itemNameList=itemNameList, & + itemTypeList=itemTypeList, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=__FILE__, & + rcToReturn=rc)) & + return ! bail out + + fieldCount = 0 + fieldBundleCount = 0 + do i=1, size(itemTypeList) + if (itemTypeList(i) == ESMF_STATEITEM_FIELD) & + fieldCount = fieldCount + 1 + if (itemTypeList(i) == ESMF_STATEITEM_FIELDBUNDLE) & + fieldBundleCount = fieldBundleCount + 1 + enddo + allocate(fieldNameList_loc(fieldCount)) + allocate(fieldBundleNameList_loc(fieldBundleCount)) + iF = 0 + iFB = 0 + do i=1, size(itemTypeList) + if (itemTypeList(i) == ESMF_STATEITEM_FIELD) then + iF = iF + 1 + fieldNameList_loc(iF) = trim(itemNameList(i)) + endif + if (itemTypeList(i) == ESMF_STATEITEM_FIELDBUNDLE) then + iFB = iFB + 1 + fieldBundleNameList_loc(iFB) = trim(itemNameList(i)) + endif + enddo + if (present(fieldNameList)) then + deallocate(fieldNameList_loc) allocate(fieldNameList_loc(size(fieldNameList))) do i=1, size(fieldNameList) fieldNameList_loc(i) = trim(fieldNameList(i)) enddo - else - call ESMF_StateGet(state, itemCount=itemCount, rc=localrc) - if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__, & - rcToReturn=rc)) & - return ! bail out - allocate(fieldNameList_loc(itemCount)) - call ESMF_StateGet(state, itemNameList=fieldNameList_loc, rc=localrc) - if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & - line=__LINE__, & - file=__FILE__, & - rcToReturn=rc)) & - return ! bail out endif do i=1, size(fieldNameList_loc) @@ -424,7 +457,7 @@ subroutine NUOPC_StateWrite(state, fieldNameList, fileNamePrefix, overwrite, & rcToReturn=rc)) & return ! bail out if (itemType == ESMF_STATEITEM_FIELD) then - ! field is available in the state + ! field in the state call ESMF_StateGet(state, itemName=fieldNameList_loc(i), field=field, & rc=localrc) if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & @@ -449,8 +482,39 @@ subroutine NUOPC_StateWrite(state, fieldNameList, fileNamePrefix, overwrite, & return ! bail out endif enddo - - deallocate(fieldNameList_loc) + + do i=1, size(fieldBundleNameList_loc) + call ESMF_StateGet(state, itemName=fieldBundleNameList_loc(i), & + itemType=itemType, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=FILENAME, & + rcToReturn=rc)) & + return ! bail out + if (itemType == ESMF_STATEITEM_FIELDBUNDLE) then + ! fieldbundle in the state + call ESMF_StateGet(state, itemName=fieldBundleNameList_loc(i), & + fieldbundle=fieldbundle, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg=ESMF_LOGERR_PASSTHRU, & + line=__LINE__, & + file=FILENAME, & + rcToReturn=rc)) & + return ! bail out + ! -> output to file + call NUOPC_FieldBundleWrite(fieldbundle, fieldNameList=fieldNameList, & + fileNamePrefix=fileNamePrefix, overwrite=overwrite, status=status, & + timeslice=timeslice, iofmt=iofmt, relaxedflag=relaxedflag, rc=localrc) + if (ESMF_LogFoundError(rcToCheck=localrc, msg="Failed writing file: "// & + trim(fileName), & + line=__LINE__, & + file=FILENAME, & + rcToReturn=rc)) & + return ! bail out + endif + enddo + + deallocate(fieldNameList_loc, fieldBundleNameList_loc) + deallocate(itemNameList, itemTypeList) end subroutine !----------------------------------------------------------------------------- @@ -473,9 +537,9 @@ subroutine NUOPC_FieldBundleWrite(fieldbundle, fieldNameList, fileNamePrefix, ov logical, intent(in), optional :: relaxedflag integer, intent(out), optional :: rc ! !DESCRIPTION: -! Write the data of the fields within a {\tt fieldbundle} to NetCDF files. -! Each field is written to an individual file using the "StandardName" -! attribute as NetCDF attribute. +! Write the data of the fields contained in {\tt fieldbundle} to NetCDF files. +! Each field is written to an individual file using its "StandardName" +! attribute as its NetCDF attribute. ! ! The arguments are: ! \begin{description} @@ -495,7 +559,7 @@ subroutine NUOPC_FieldBundleWrite(fieldbundle, fieldNameList, fileNamePrefix, ov ! Note that it is always an error to attempt to overwrite a NetCDF ! variable with data which has a different shape. ! \item[{[status]}] -! The file status. Valid options are {\tt ESMF\_FILESTATUS\_NEW}, +! The file status. Valid options are {\tt ESMF\_FILESTATUS\_NEW}, ! {\tt ESMF\_FILESTATUS\_OLD}, {\tt ESMF\_FILESTATUS\_REPLACE}, and ! {\tt ESMF\_FILESTATUS\_UNKNOWN} (default). ! \item[{[timeslice]}] @@ -578,7 +642,7 @@ subroutine NUOPC_FieldBundleWrite(fieldbundle, fieldNameList, fileNamePrefix, ov rcToReturn=rc)) & return ! bail out enddo - + deallocate(fieldNameList_loc) end subroutine diff --git a/src/addon/NUOPC/src/NUOPC_Base.F90 b/src/addon/NUOPC/src/NUOPC_Base.F90 index 0104fc749c..1d965235f7 100644 --- a/src/addon/NUOPC/src/NUOPC_Base.F90 +++ b/src/addon/NUOPC/src/NUOPC_Base.F90 @@ -3257,13 +3257,15 @@ subroutine NUOPC_LogIntro(name, rName, verbosity, importState, exportState, rc) line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out endif if (btest(verbosity,4)) then - call ESMF_StateLog(importState, trim(name)//": "//rName//" intro:", & + call ESMF_StateLog(importState, & + prefix=trim(name)//": "//rName//" intro {IS}:", & nestedFlag=.true., deepFlag=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out endif if (btest(verbosity,5)) then - call ESMF_StateLog(exportState, trim(name)//": "//rName//" intro:", & + call ESMF_StateLog(exportState, & + prefix=trim(name)//": "//rName//" intro {ES}:", & nestedFlag=.true., deepFlag=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out @@ -3310,7 +3312,8 @@ subroutine NUOPC_LogExtro(name, rName, verbosity, importState, exportState, rc) integer :: indentCount if (btest(verbosity,4)) then if (present(importState)) then - call ESMF_StateLog(importState, trim(name)//": "//rName//" extro:", & + call ESMF_StateLog(importState, & + prefix=trim(name)//": "//rName//" extro {IS}:", & nestedFlag=.true., deepFlag=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out @@ -3318,7 +3321,8 @@ subroutine NUOPC_LogExtro(name, rName, verbosity, importState, exportState, rc) endif if (btest(verbosity,5)) then if (present(exportState)) then - call ESMF_StateLog(exportState, trim(name)//": "//rName//" extro:", & + call ESMF_StateLog(exportState, & + prefix=trim(name)//": "//rName//" extro {ES}:", & nestedFlag=.true., deepFlag=.true., rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out diff --git a/src/addon/NUOPC/src/NUOPC_Driver.F90 b/src/addon/NUOPC/src/NUOPC_Driver.F90 index 8074bbe1bc..30c0c61fbe 100644 --- a/src/addon/NUOPC/src/NUOPC_Driver.F90 +++ b/src/addon/NUOPC/src/NUOPC_Driver.F90 @@ -3533,7 +3533,7 @@ recursive subroutine routine_Run(driver, importState, exportState, clock, rc) line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out call ESMF_ClockPrint(internalClock, options="currTime", & preString=">>>"//trim(name)//& - " entered Run (phase="//trim(adjustl(pLabel))// & + ": entered Run (phase="//trim(adjustl(pLabel))// & ") with current time: ", unit=msgString, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out @@ -3641,8 +3641,9 @@ recursive subroutine routine_Run(driver, importState, exportState, clock, rc) ! conditionally output info to Log file if (btest(verbosity,9)) then call ESMF_ClockPrint(internalClock, options="currTime", & - preString="<<<"//trim(name)//& - " - leaving Run with current time: ", unit=msgString, rc=rc) + preString=">>>"//trim(name)//& + ": leaving Run (phase="//trim(adjustl(pLabel))// & + ") with current time: ", unit=msgString, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, file=trim(name)//":"//FILENAME)) return ! bail out call ESMF_LogWrite(msgString, ESMF_LOGMSG_INFO, rc=rc) diff --git a/src/apps/ESMX_Builder/ESMX_Builder.sh b/src/apps/ESMX_Builder/ESMX_Builder.sh index 56e994f273..c5d239deb8 100755 --- a/src/apps/ESMX_Builder/ESMX_Builder.sh +++ b/src/apps/ESMX_Builder/ESMX_Builder.sh @@ -171,6 +171,11 @@ fi # read ESMX build file from positional arguments if [[ $# -ge 1 ]]; then BUILD_FILE="${1}" + # ensure the explicitly specified BUILD_FILE exists + if [ ! -f "${BUILD_FILE}" ]; then + echo "ERROR: ESMX_BUILD_FILE is missing: ${BUILD_FILE}" + usage; exit 1 + fi else BUILD_FILE="esmxBuild.yaml" fi @@ -196,12 +201,6 @@ if [ ! -d "${ESMF_ESMXDIR}" ]; then usage; exit 1 fi -# check BUILD_FILE -if [ ! -f "${BUILD_FILE}" ]; then - echo "ERROR: ESMX_BUILD_FILE is missing: ${BUILD_FILE}" - usage; exit 1 -fi - # print settings if [ "${VERBOSE}" = true ] ; then settings @@ -254,21 +253,42 @@ INSTALL_SETTINGS=("") # build and install set +e +if [ "${VERBOSE}" = true ] ; then + echo --- CMake Configuring --- + set -x +fi cmake -S${ESMF_ESMXDIR} -B${BUILD_DIR} ${CMAKE_SETTINGS[@]} -if [ "$?" != "0" ]; then - echo "ESMX_Builder Failed: (cmake)" +RC=$? +{ set +x; } 2>/dev/null +if [ $RC -ne 0 ]; then + echo "ESMX_Builder Failed: 'cmake -S${ESMF_ESMXDIR} -B${BUILD_DIR} ${CMAKE_SETTINGS[@]}'" exit -1 fi +echo +if [ "${VERBOSE}" = true ] ; then + echo --- CMake Building --- + set -x +fi cmake --build ${BUILD_DIR} ${BUILD_SETTINGS[@]} -if [ "$?" != "0" ]; then - echo "ESMX_Builder Failed: (cmake --build)" +RC=$? +{ set +x; } 2>/dev/null +if [ $RC -ne 0 ]; then + echo "ESMX_Builder Failed: 'cmake --build ${BUILD_DIR} ${BUILD_SETTINGS[@]}'" exit -2 fi +echo +if [ "${VERBOSE}" = true ] ; then + echo --- CMake Installing --- + set -x +fi cmake --install ${BUILD_DIR} ${INSTALL_SETTINGS[@]} -if [ "$?" != "0" ]; then - echo "ESMX_Builder Failed: (cmake --install)" +RC=$? +{ set +x; } 2>/dev/null +if [ $RC -ne 0 ]; then + echo "ESMX_Builder Failed: 'cmake --install ${BUILD_DIR} ${INSTALL_SETTINGS[@]}'" exit -3 fi +echo if [ "${TEST}" = true ]; then (cd ${BUILD_DIR}/Driver; ctest ${TEST_SETTINGS[@]}) if [ "$?" != "0" ]; then