Skip to content

Commit

Permalink
Merge branch 'nrl/work-esmx' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
theurich committed Aug 2, 2024
2 parents 75cee0a + 6127c62 commit 7b36ed9
Show file tree
Hide file tree
Showing 30 changed files with 890 additions and 163 deletions.
2 changes: 2 additions & 0 deletions src/Infrastructure/Array/include/ESMCI_Array.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
30 changes: 30 additions & 0 deletions src/Infrastructure/Array/interface/ESMCI_Array_F.C
Original file line number Diff line number Diff line change
Expand Up @@ -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()"
Expand Down
1 change: 1 addition & 0 deletions src/Infrastructure/Array/interface/ESMF_Array.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
71 changes: 71 additions & 0 deletions src/Infrastructure/Array/interface/ESMF_ArrayHa.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()"
Expand Down
41 changes: 41 additions & 0 deletions src/Infrastructure/Array/src/ESMCI_Array.C
Original file line number Diff line number Diff line change
Expand Up @@ -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 << " <name: " << getName() << ">";
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()"
Expand Down
2 changes: 2 additions & 0 deletions src/Infrastructure/ArrayBundle/include/ESMCI_ArrayBundle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
30 changes: 30 additions & 0 deletions src/Infrastructure/ArrayBundle/interface/ESMCI_ArrayBundle_F.C
Original file line number Diff line number Diff line change
Expand Up @@ -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()"
Expand Down
70 changes: 70 additions & 0 deletions src/Infrastructure/ArrayBundle/interface/ESMF_ArrayBundle.F90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
51 changes: 51 additions & 0 deletions src/Infrastructure/ArrayBundle/src/ESMCI_ArrayBundle.C
Original file line number Diff line number Diff line change
Expand Up @@ -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!"
<< " <name: " << getName() << "> <itemCount: " << getCount() << ">";
ESMC_LogDefault.Write(msg.str(), msgType);
int item=0;
for (auto it = arrayContainer.begin(); it != arrayContainer.end(); ++it,
item++){
msg.str(""); // clear
msg << prefix << "+-<item: " << item << "> <itemName: "
<< it->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()"
Expand Down
Loading

0 comments on commit 7b36ed9

Please sign in to comment.