function ESMF_RouteHandleCreateRH(routehandle, keywordEnforcer, &
originPetList, targetPetList, rc)
!
! !RETURN VALUE:
type(ESMF_RouteHandle) :: ESMF_RouteHandleCreateRH
!
! !ARGUMENTS:
type(ESMF_RouteHandle), intent(in) :: routehandle
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
integer, intent(in), optional :: originPetList(:)
integer, intent(in), optional :: targetPetList(:)
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
! Create a new {\tt ESMF\_RouteHandle} object from and existing RouteHandle.
! The new RouteHandle can be created to function on a different petList than
! the incoming RouteHandle.
!
! The arguments are:
! \begin{description}
! \item[routehandle]
! The RouteHandle object to be duplicated.
! \item[{[originPetList]}]
! \begin{sloppypar}
! The petList on which the incoming {\tt routehandle} is defined to operate.
! If present, then {\tt targetPetList} must also be present and of the same
! size. The petLists are used to map origin PETs to target PETs. By
! convention the petLists are constructed to first list the PETs of the
! source component, followed by the PETs of the destination component.
! Defaults, to the petList of the current component context, meaning that
! the PETs in the RouteHandle are not modified.
! \end{sloppypar}
! \item[{[targetPetList]}]
! \begin{sloppypar}
! The petList on which the newly created RouteHandle is defined to operate.
! If present, then {\tt originPetList} must also be present and of the same
! size. The petLists are used to map origin PETs to target PETs. By
! convention the petLists are constructed to first list the PETs of the
! source component, followed by the PETs of the destination component.
! Defaults, to the petList of the current component context, meaning that
! the PETs in the RouteHandle are not modified.
! \end{sloppypar}
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOP
!------------------------------------------------------------------------------
integer :: localrc ! local return code
type(ESMF_RouteHandle) :: rhandle
type(ESMF_InterArray) :: originPetListArg
type(ESMF_InterArray) :: targetPetListArg
! initialize return code; assume routine not implemented
localrc = ESMF_RC_NOT_IMPL
if (present(rc)) rc = ESMF_RC_NOT_IMPL
rhandle%this = ESMF_NULL_POINTER
ESMF_RouteHandleCreateRH = rhandle
! Deal with (optional) array arguments
originPetListArg = ESMF_InterArrayCreate(originPetList, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
targetPetListArg = ESMF_InterArrayCreate(targetPetList, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Call C++ create code
call c_ESMC_RouteHandleCreateRH(rhandle, routehandle, originPetListArg, &
targetPetListArg, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Set return values
ESMF_RouteHandleCreateRH = rhandle
! Garbage collection
call ESMF_InterArrayDestroy(originPetListArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(targetPetListArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Set init code
ESMF_INIT_SET_CREATED(ESMF_RouteHandleCreateRH)
! Return successfully
if (present(rc)) rc = ESMF_SUCCESS
end function ESMF_RouteHandleCreateRH