ESMF_Finalize Subroutine

public subroutine ESMF_Finalize(keywordEnforcer, endflag, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_KeywordEnforcer), optional :: keywordEnforcer
type(ESMF_End_Flag), intent(in), optional :: endflag
integer, intent(out), optional :: rc

Calls

proc~~esmf_finalize~~CallsGraph proc~esmf_finalize ESMF_Finalize c_esmc_getcompliancechecktrace c_esmc_getcompliancechecktrace proc~esmf_finalize->c_esmc_getcompliancechecktrace proc~esmf_calendarfinalize ESMF_CalendarFinalize proc~esmf_finalize->proc~esmf_calendarfinalize proc~esmf_logfinalize ESMF_LogFinalize proc~esmf_finalize->proc~esmf_logfinalize proc~esmf_logflush ESMF_LogFlush proc~esmf_finalize->proc~esmf_logflush proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_finalize->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_finalize->proc~esmf_logwrite proc~esmf_traceclose ESMF_TraceClose proc~esmf_finalize->proc~esmf_traceclose proc~esmf_vmabort ESMF_VMAbort proc~esmf_finalize->proc~esmf_vmabort proc~esmf_vmfinalize ESMF_VMFinalize proc~esmf_finalize->proc~esmf_vmfinalize c_esmc_calendarfinalize c_esmc_calendarfinalize proc~esmf_calendarfinalize->c_esmc_calendarfinalize proc~esmf_logfounderror ESMF_LogFoundError proc~esmf_calendarfinalize->proc~esmf_logfounderror c_esmc_logfinalize c_esmc_logfinalize proc~esmf_logfinalize->c_esmc_logfinalize proc~esmf_logclose ESMF_LogClose proc~esmf_logfinalize->proc~esmf_logclose proc~esmf_utilarray2string ESMF_UtilArray2String proc~esmf_logflush->proc~esmf_utilarray2string proc~esmf_utiliounitflush ESMF_UtilIOUnitFlush proc~esmf_logflush->proc~esmf_utiliounitflush c_esmc_loggeterrormsg c_esmc_loggeterrormsg proc~esmf_logrc2msg->c_esmc_loggeterrormsg proc~esmf_logwrite->proc~esmf_logflush c_esmc_vmwtime c_esmc_vmwtime proc~esmf_logwrite->c_esmc_vmwtime proc~esmf_logwrite->proc~esmf_logclose proc~esmf_logopenfile ESMF_LogOpenFile proc~esmf_logwrite->proc~esmf_logopenfile proc~esmf_logwrite->proc~esmf_utiliounitflush proc~esmf_utilstring2array ESMF_UtilString2Array proc~esmf_logwrite->proc~esmf_utilstring2array c_esmftrace_close c_esmftrace_close proc~esmf_traceclose->c_esmftrace_close proc~esmf_traceclose->proc~esmf_logfounderror c_esmc_vmabort c_esmc_vmabort proc~esmf_vmabort->c_esmc_vmabort c_esmc_vmfinalize c_esmc_vmfinalize proc~esmf_vmfinalize->c_esmc_vmfinalize proc~esmf_logclose->proc~esmf_logflush proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logfounderror->proc~esmf_logwrite esmf_breakpoint esmf_breakpoint proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logopenfile->proc~esmf_utiliounitflush proc~esmf_utiliounitget ESMF_UtilIOUnitGet proc~esmf_logopenfile->proc~esmf_utiliounitget

Called by

Arb2ArbBunReDistwESMF_Finalize
w
Arb2ArbFldReDistw
w
AttributeUpdateReconcilew
w
Blk2ArbBunRedistw
w
Blk2ArbFldRedistw
w
Blk2BlkBunRedistw
w
Blk2BlkFldRedistw
w
CompCreatew
w
ConcurrentComponentw
w
dataMatchArrayListsw
w
ErrorMsgAndAbortw
w
ErrorMsgAndAbortw
w
ESMF_AlarmExw
w
ESMF_AlarmTestw
w
ESMF_AppDriverw
w
esmf_applicationw
w
ESMF_AppMainExw
w
ESMF_AppMainExw
w
ESMF_AppMainExw
w
ESMF_ArrayArbHaloExw
w
ESMF_ArrayArbIdxSMMUTestw
w
ESMF_ArrayBundleCreateUTestw
w
ESMF_ArrayBundleExw
w
ESMF_ArrayBundleHaloExw
w
ESMF_ArrayBundleIOUTestw
w
ESMF_ArrayBundleRedistSTestw
w
ESMF_ArrayBundleRedistUTestw
w
ESMF_ArrayBundleSparseMMSTestw
w
ESMF_ArrayCommNBExw
w
ESMF_ArrayCreateGetUTestw
w
ESMF_ArrayDataUTestw
w
ESMF_ArrayExw
w
ESMF_ArrayFarrayExw
w
ESMF_ArrayFarrayHaloExw
w
ESMF_ArrayGatherUTestw
w
ESMF_ArrayHaloExw
w
ESMF_ArrayHaloUTestw
w
ESMF_ArrayInfoUTestw
w
ESMF_ArrayIOTypesUTestw
w
ESMF_ArrayIOUTestw
w
ESMF_ArrayLarrayExw
w
ESMF_ArrayRedist3DSTestw
w
ESMF_ArrayRedistExw
w
ESMF_ArrayRedistOpenACCSTestw
w
ESMF_ArrayRedistOpenMPSTestw
w
ESMF_ArrayRedistPerfUTestw
w
ESMF_ArrayRedistSharedObjSTestw
w
ESMF_ArrayRedistSTestw
w
ESMF_ArrayRedistSTestw
w
ESMF_ArrayRedistSTestw
w
ESMF_ArrayRedistUTestw
w
ESMF_ArrayScatterGatherArbExw
w
ESMF_ArrayScatterGatherExw
w
ESMF_ArrayScatterGatherSTestw
w
ESMF_ArrayScatterUTestw
w
ESMF_ArraySharedDeSSISTestw
w
ESMF_ArraySMMFromFileUTestw
w
ESMF_ArraySMMUTestw
w
ESMF_ArraySparseMatMulExw
w
ESMF_ArraySparseMatMulSTestw
w
ESMF_ArraySpecExw
w
ESMF_ArraySpecUTestw
w
ESMF_AttachMethodsExw
w
ESMF_AttributeProfileUTestw
w
ESMF_AttributeSTestw
w
ESMF_AttributeUpdateContainerStressUTestw
w
ESMF_AttributeUpdateMultiReconcileUTestw
w
ESMF_AttributeUpdateRemoveOnlyUTestw
w
ESMF_AttributeUpdateUTestw
w
ESMF_AttributeUpdateUTestw
w
ESMF_AttributeUtilUTestw
w
ESMF_BaseUTestw
w
ESMF_CalendarExw
w
ESMF_CalendarUTestw
w
ESMF_CalRangeUTestw
w
ESMF_ClockExw
w
ESMF_ClockTestw
w
ESMF_CompFortranAndCw
w
ESMF_ComplianceCheckerSTestw
w
ESMF_ComponentUTestw
w
ESMF_CompSetServUTestw
w
ESMF_CompTunnelExw
w
ESMF_CompTunnelUTestw
w
ESMF_ConcurrentEnsembleSTestw
w
ESMF_Config_Testw
w
ESMF_ConfigOverviewExw
w
ESMF_ContainerUTestw
w
ESMF_CplCompCreateUTestw
w
ESMF_DELayoutExw
w
ESMF_DELayoutUTestw
w
ESMF_DELayoutWQUTestw
w
ESMF_DirectCouplingSTestw
w
ESMF_DistGridCreateGetUTestw
w
ESMF_DistGridExw
w
ESMF_F95PTRUTestw
w
ESMF_FaultToleranceCompASTestw
w
ESMF_FaultToleranceSTestw
w
ESMF_FieldArbGridUTestw
w
ESMF_FieldArgGridExw
w
ESMF_FieldBundleCreateExw
w
ESMF_FieldBundleCrGetUTestw
w
ESMF_FieldBundleIOUTestw
w
ESMF_FieldBundleLSRedistArb2ArbSTestw
w
ESMF_FieldBundleLSRedistArb2ArbUngrdDimSTestw
w
ESMF_FieldBundleRedistPackedSTestw
w
ESMF_FieldBundleRegridPackedSTestw
w
ESMF_FieldBundleRegridUTestw
w
ESMF_FieldBundleSMMPackedSTestw
w
ESMF_FieldBundleSMMSTestw
w
ESMF_FieldBundleSMMUTestw
w
ESMF_FieldBundleUTestw
w
ESMF_FieldCommExw
w
ESMF_FieldCreateExw
w
ESMF_FieldCreateGetUTestw
w
ESMF_FieldExw
w
ESMF_FieldGatherUTestw
w
ESMF_FieldHaloUTestw
w
ESMF_FieldIOUTestw
w
ESMF_FieldLSRedistArb2ArbSTestw
w
ESMF_FieldLSRedistArb2ArbUngrdDimSTestw
w
ESMF_FieldLSSMMSTestw
w
ESMF_FieldLSSMMUTestw
w
ESMF_FieldMeshSMMSTestw
w
ESMF_FieldMeshSMMUTestw
w
ESMF_FieldRedistArbUTestw
w
ESMF_FieldRedistUTestw
w
ESMF_FieldRegridCsrv2ndUTestw
w
ESMF_FieldRegridCsrvUTestw
w
ESMF_FieldRegridExw
w
ESMF_FieldRegridExw
w
ESMF_FieldRegridLSSTestw
w
ESMF_FieldRegridMeshSTestw
w
ESMF_FieldRegridMeshToMeshSTestw
w
ESMF_FieldRegridPatchDisjointSTestw
w
ESMF_FieldRegridSTestw
w
ESMF_FieldRegridSTestw
w
ESMF_FieldRegridSTestw
w
ESMF_FieldRegridUTestw
w
ESMF_FieldRegridUTestw
w
ESMF_FieldRegridXGSMMUTestw
w
ESMF_FieldRegridXGUTestw
w
ESMF_FieldRepDimExw
w
ESMF_FieldSharedDeSSISTestw
w
ESMF_FieldSMMFromFileUTestw
w
ESMF_FieldSMMUTestw
w
ESMF_FieldSparseMatMulSTestw
w
ESMF_FieldSphereRegridExw
w
ESMF_FieldStressUTestw
w
ESMF_FieldUTestw
w
ESMF_FileRegridUTestw
w
ESMF_FortranWordsizeUTestw
w
ESMF_FrameworkUTestw
w
ESMF_GeomUTestw
w
ESMF_GridArbitraryUTestw
w
ESMF_GridCompCreateUTestw
w
ESMF_GridCoordUTestw
w
ESMF_GridCreateExw
w
ESMF_GridCreateExw
w
ESMF_GridCreateExw
w
ESMF_GridCreateExw
w
ESMF_GridCreateExw
w
ESMF_GridCreateUTestw
w
ESMF_GridItemUTestw
w
ESMF_GridToMeshUTestw
w
ESMF_HConfigExw
w
ESMF_HConfigUTestw
w
ESMF_InfoArrayUTestw
w
ESMF_InfoCacheUTestw
w
ESMF_InfoDescribeUTestw
w
ESMF_InfoGetFromHostExw
w
ESMF_InfoProfileUTestw
w
ESMF_InfoSyncUTestw
w
ESMF_InfoTutorialw
w
ESMF_InfoUTestw
w
ESMF_InitMacrosTestw
w
ESMF_InternalStateExw
w
ESMF_InternalStateModExw
w
ESMF_InternalStateUTestw
w
ESMF_IO_FileTypeCheckUTestw
w
ESMF_IO_MultitileUTestw
w
ESMF_IO_YAMLUTestw
w
ESMF_IOCompUTestw
w
ESMF_IOGridCompUTestw
w
ESMF_IOUTestw
w
ESMF_LAPACKUTestw
w
ESMF_LocalArrayDataUTestw
w
ESMF_LocalArrayTestw
w
ESMF_LocStreamCreateUTestw
w
ESMF_LocStreamExw
w
ESMF_LogErrExw
w
ESMF_LogErrPerfUTestw
w
ESMF_LogErrUTestw
w
ESMF_LogErrUTestw
w
ESMF_MeshExw
w
ESMF_MeshExw
w
ESMF_MeshFileIOUTestw
w
ESMF_MeshOpUTestw
w
ESMF_MeshUTestw
w
ESMF_NamedAliasUTestw
w
ESMF_NUOPC_UTestw
w
ESMF_NUOPCAtmModelExw
w
ESMF_NUOPCBasicModelExw
w
ESMF_PointListUTestw
w
ESMF_PrintInfoFw
w
ESMF_ProfileUTestw
w
ESMF_RecursiveComponentSTestw
w
ESMF_RedistUTestw
w
ESMF_RegridAppw
w
ESMF_RegridExw
w
ESMF_RegridWeightGenAppw
w
ESMF_RegridWeightGenUTestw
w
ESMF_RHandleBitForBitExw
w
ESMF_RHandleDynamicMaskingExw
w
ESMF_RHandleFromFileExw
w
ESMF_RHandleFromRHandleExw
w
ESMF_RHandleReusabilityExw
w
ESMF_RHandleVMEpochExw
w
ESMF_RouteHandleAdvancedUTestw
w
ESMF_RouteHandleUTestw
w
ESMF_SciCompCreateUTestw
w
ESMF_SCompExw
w
ESMF_SequentialEnsembleSTestw
w
ESMF_StateCreateUTestw
w
ESMF_StateExw
w
ESMF_StateReconcileExw
w
ESMF_StateReconcileProxyUTestw
w
ESMF_StateReconcileUTestw
w
ESMF_StateUTestw
w
ESMF_StdCompMethodsUTestw
w
esmf_test_harnessw
w
ESMF_TestEndw
w
ESMF_TestUTestw
w
ESMF_TimeExw
w
ESMF_TimeIntervalExw
w
ESMF_TimeIntervalUTestw
w
ESMF_TimeUTestw
w
ESMF_TraceClkMonoSyncUTestw
w
ESMF_TraceClkMonoUTestw
w
ESMF_TraceExw
w
ESMF_TraceIOUTestw
w
ESMF_TraceMPIUTestw
w
ESMF_TraceSTestw
w
ESMF_TraceUserExw
w
ESMF_TraceUTestw
w
ESMF_TransferGridSTestw
w
ESMF_TransferMeshSTestw
w
ESMF_TypeKindGetUTestw
w
ESMF_UtilUTestw
w
ESMF_VMAccUTestw
w
ESMF_VMAllFullReduceExw
w
ESMF_VMAllGatherUTestw
w
ESMF_VMAllGatherVUTestw
w
ESMF_VMAllToAllUTestw
w
ESMF_VMAllToAllVUTestw
w
ESMF_VMBarrierUTestw
w
ESMF_VMBroadcastUTestw
w
ESMF_VMComponentExw
w
ESMF_VMComponentUTestw
w
ESMF_VMControlMPIThreadSupportExw
w
ESMF_VMDefaultBasicsExw
w
ESMF_VMEpochLargeMsgUTestw
w
ESMF_VMGatherUTestw
w
ESMF_VMGetMPICommunicatorExw
w
ESMF_VMHigherRankDataExw
w
ESMF_VMNonBlockingExw
w
ESMF_VMOpenMPUTestw
w
ESMF_VMScatterUTestw
w
ESMF_VMScatterVMGatherExw
w
ESMF_VMSendNbVMRecvNbUTestw
w
ESMF_VMSendRecvNbUTestw
w
ESMF_VMSendrecvUTestw
w
ESMF_VMSendVMRecvExw
w
ESMF_VMSendVMRecvUTestw
w
ESMF_VMUserMpiCommExw
w
ESMF_VMUserMpiCommMultiExw
w
ESMF_VMUserMpiExw
w
ESMF_VMUTestw
w
ESMF_VMUTestw
w
ESMF_WebServComponentUTestw
w
ESMF_WebServicesSTestw
w
ESMF_XGridConcurrentSTestw
w
ESMF_XGridExw
w
ESMF_XGridMaskingUTestw
w
ESMF_XGridSerialSTestw
w
ESMF_XGridSparseMatExw
w
ESMF_XGridUTestw
w
ESMX_Appw
w
ExceptionsUTestw
w
f_esmf_frameworkfinalizew
w
FeatureTestw
w
FieldBundleHaloExw
w
FieldBundleRedistExw
w
FieldBundleSMMExw
w
FieldConcurrentComponentw
w
FieldHaloExw
w
FieldRedistw
w
FieldRedistExw
w
FieldRegridConservw
w
FieldRegridMultiw
w
FieldRegridOrderw
w
FieldSMMExw
w
MapperSimpleTwoConcurrentCompsw
w
MapperTwoConcurrentCompsw
w
ParseFileTypeArgw
w
SetModelServicesw
w
SetModelServicesw
w
StringTestw
w
testw
w
test_localglobalboundsmeshw
w
test_meshindexw
w
test_vm_currentw
w
user_finalw
w
user_finalw
w
user_finalw
w
user_finalw
w
user_finalw
w
user_finalw
w
user_finalw
w
user_finalw
w
user_initw
w
user_initw
w
user_initw
w
user_initw
w
user_initw
w
user_initw
w
user_initw
w
user_initw
w
user_runw
w
user_runw
w
user_runw
w
user_runw
w
user_runw
w
user_runw
w
user_runw
w
user_runw
w
usercpl_registerw
w
usercpl_registerw
w
usercpl_registerw
w
usercpl_registerw
w
userm2_registerw
w
userm2_registerw
w
userm2_registerw
w
userm2_registerw
w
WebServicesExw
w
WordsizeTestw
w

Source Code

      subroutine ESMF_Finalize(keywordEnforcer, endflag, rc)
!
! !ARGUMENTS:
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
      type(ESMF_End_Flag), intent(in), optional  :: endflag
      integer,             intent(out), optional :: rc

!
! !STATUS:
! \begin{itemize}
! \item\apiStatusCompatibleVersion{5.2.0r}
! \end{itemize}
!
! !DESCRIPTION:
!     This must be called once on each PET before the application exits
!     to allow ESMF to flush buffers, close open connections, and 
!     release internal resources cleanly. The optional argument 
!     {\tt endflag} may be used to indicate the mode of termination.  
!     Note that this call must be issued only once per PET with 
!     {\tt endflag=ESMF\_END\_NORMAL}, and that this call may not be followed
!     by {\tt ESMF\_Initialize()}.  This last restriction means that it is not
!     possible to restart ESMF within the same execution.
!
!     The arguments are:
!     \begin{description}
!     \item [{[endflag]}]
!           Specify mode of termination. The default is {\tt ESMF\_END\_NORMAL}
!           which waits for all PETs of the global VM to reach 
!           {\tt ESMF\_Finalize()} before termination. See section 
!           \ref{const:endflag} for a complete list and description of
!           valid flags.
!     \item [{[rc]}]
!           Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
!     \end{description}
!
!EOP

      logical :: rcpresent                        ! Return code present
      logical :: abortFlag
      type(ESMF_Logical) :: keepMpiFlag
      integer :: localrc
      character(ESMF_MAXSTR) :: errmsg, msgStr
      integer :: errmsg_l

      integer :: traceIsOn, profileIsOn

      ! Initialize return code
      rcpresent = .FALSE.
      if(present(rc)) then
        rcpresent = .TRUE.
        rc = ESMF_RC_NOT_IMPL
      endif

      abortFlag = .false.
      keepMpiFlag = ESMF_FALSE
      if (present(endflag)) then
        if (endflag==ESMF_END_ABORT) abortFlag = .true.
        if (endflag==ESMF_END_KEEPMPI) keepMpiFlag = ESMF_TRUE
      endif

      if (already_final) then
          if (rcpresent) rc = ESMF_SUCCESS
          return
      endif

      ! Write final message to the log
      write(msgStr,*) "Finalizing ESMF"
      if (abortFlag) &
        write(msgStr,*) "Finalizing ESMF with endflag==ESMF_END_ABORT"
      if (keepMpiFlag==ESMF_TRUE) &
        write(msgStr,*) "Finalizing ESMF with endflag==ESMF_END_KEEPMPI"
      call ESMF_LogWrite(trim(msgStr), ESMF_LOGMSG_INFO, rc=localrc)
      if (localrc /= ESMF_SUCCESS) then
          write (ESMF_UtilIOStderr,*) ESMF_METHOD, ": Error writing into the default log"
      endif

      call c_esmc_getComplianceCheckTrace(traceIsOn, profileIsOn, localrc)
      if (localrc /= ESMF_SUCCESS) then
          write (ESMF_UtilIOStderr,*) ESMF_METHOD, ": Error checking ESMF_RUNTIME_* env variables"
      endif
      if (traceIsOn == 1 .or. profileIsOn == 1) then
        call ESMF_TraceClose(rc=localrc)
        if (localrc /= ESMF_SUCCESS) then
          write (ESMF_UtilIOStderr,*) ESMF_METHOD, ": Error closing trace stream"
        endif
      endif

#ifdef LOG_FINALIZE
      call ESMF_LogWrite("Done closing ESMF_Trace", &
        ESMF_LOGMSG_INFO, rc=localrc)
      if (localrc /= ESMF_SUCCESS) then
          write (ESMF_UtilIOStderr,*) ESMF_METHOD, ": Error writing into the default log"
      endif
#endif

      ! Close the Config file
      ! TODO: write this routine and remove the status= line
      ! call ESMF_ConfigFinalize(localrc)
      localrc = ESMF_SUCCESS
      if (localrc /= ESMF_SUCCESS) then
          call ESMF_LogRc2Msg (localrc, errmsg, errmsg_l)
          write (ESMF_UtilIOStderr,*) ESMF_METHOD,  &
              ": Error finalizing config file: ", errmsg(:errmsg_l)
      endif

      ! Delete any internal built-in time manager calendars
      call ESMF_CalendarFinalize(rc=localrc)
      if (localrc /= ESMF_SUCCESS) then
          call ESMF_LogRc2Msg (localrc, errmsg, errmsg_l)
          write (ESMF_UtilIOStderr,*) ESMF_METHOD,  &
              ": Error finalizing the time manager calendars"
      endif

#ifdef LOG_FINALIZE
      call ESMF_LogWrite("Done finalizing ESMF_Calendar", &
        ESMF_LOGMSG_INFO, rc=localrc)
      if (localrc /= ESMF_SUCCESS) then
          write (ESMF_UtilIOStderr,*) ESMF_METHOD, ": Error writing into the default log"
      endif
#endif

      ! Flush log to avoid lost messages
      call ESMF_LogFlush (rc=localrc)
      if (localrc /= ESMF_SUCCESS) then
          call ESMF_LogRc2Msg (localrc, errmsg, errmsg_l)
          write (ESMF_UtilIOStderr,*) ESMF_METHOD,  &
              ": Error flushing log file: ", errmsg(:errmsg_l)
      end if

#ifdef LOG_FINALIZE
      call ESMF_LogWrite("Done flushing ESMF_Log", &
        ESMF_LOGMSG_INFO, rc=localrc)
      if (localrc /= ESMF_SUCCESS) then
          write (ESMF_UtilIOStderr,*) ESMF_METHOD, ": Error writing into the default log"
      endif
#endif

      if (abortFlag) then
        ! Abort the VM
        call ESMF_VMAbort(rc=localrc)
        if (localrc /= ESMF_SUCCESS) then
          call ESMF_LogRc2Msg (localrc, errmsg, errmsg_l)
          write (ESMF_UtilIOStderr,*) ESMF_METHOD,  &
              ": Error aborting VM: ", errmsg(:errmsg_l)
          return
        endif
      else
        ! Finalize the VM
        call ESMF_VMFinalize(keepMpiFlag=keepMpiFlag, rc=localrc)
        if (localrc /= ESMF_SUCCESS) then
          call ESMF_LogRc2Msg (localrc, errmsg, errmsg_l)
          write (ESMF_UtilIOStderr,*) ESMF_METHOD,  &
              ": Error finalizing VM: ", errmsg(:errmsg_l)
          return
        endif
      endif

#ifdef LOG_FINALIZE
      call ESMF_LogWrite("Done finalizing ESMF_VM", &
        ESMF_LOGMSG_INFO, rc=localrc)
      if (localrc /= ESMF_SUCCESS) then
          write (ESMF_UtilIOStderr,*) ESMF_METHOD, ": Error writing into the default log"
      endif
#endif

      ! Shut down the log file
      call ESMF_LogFinalize(localrc)
      if (localrc /= ESMF_SUCCESS) then
          call ESMF_LogRc2Msg (localrc, errmsg, errmsg_l)
          write (ESMF_UtilIOStderr,*) ESMF_METHOD,  &
              ": Error finalizing log file: ", errmsg(:errmsg_l)
          return
      endif

      already_final = .true.

      if (rcpresent) rc = ESMF_SUCCESS

      end subroutine ESMF_Finalize