subroutine ESMF_GridSetFromDistGrid(grid, keywordEnforcer, &
distgrid,distgridToGridMap, distDim, &
coordSys, coordTypeKind, coordDimCount, coordDimMap, &
minIndex, maxIndex, &
localArbIndexCount, localArbIndex, &
gridEdgeLWidth, gridEdgeUWidth, gridAlign, gridMemLBound, &
indexflag, destroyDistgrid, destroyDELayout, name, vm, rc)
!
! !RETURN VALUE:
!
! !ARGUMENTS:
type(ESMF_Grid), intent(inout) :: grid
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
type(ESMF_DistGrid), intent(in), optional :: distgrid
integer, intent(in), optional :: distgridToGridMap(:)
integer, intent(in), optional :: distDim(:)
type(ESMF_CoordSys_Flag), intent(in), optional :: coordSys
type(ESMF_TypeKind_Flag), intent(in), optional :: coordTypeKind
integer, intent(in), optional :: coordDimCount(:)
integer, intent(in), optional :: coordDimMap(:,:)
integer, intent(in), optional :: minIndex(:)
integer, intent(in), optional :: maxIndex(:)
integer, intent(in), optional :: localArbIndexCount
integer, intent(in), optional :: localArbIndex(:,:)
integer, intent(in), optional :: gridEdgeLWidth(:)
integer, intent(in), optional :: gridEdgeUWidth(:)
integer, intent(in), optional :: gridAlign(:)
integer, intent(in), optional :: gridMemLBound(:)
type(ESMF_Index_Flag), intent(in), optional :: indexflag
logical, intent(in), optional :: destroyDistgrid
logical, intent(in), optional :: destroyDELayout
character (len=*), intent(in), optional :: name
type(ESMF_VM), intent(in), optional :: vm
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
! Set values in a grid in preparation for committing and creating a grid. This method
! is called between {\tt ESMF\_GridEmptyCreate} and {\tt ESMF\_GridCommit}. Note that
! once a grid is committed and created it's an error to try to set values in it. Note also
! that new values overwrite old values if previously set.
!
! The arguments are:
! \begin{description}
! \item[{grid}]
! Partially created Grid to set information into.
! \item[distgrid]
! {\tt ESMF\_DistGrid} object that describes how the array is decomposed and
! distributed over DEs.
! \item[{[distgridToGridMap]}]
! List that has as dimCount elements.
! The elements map each dimension of distgrid to a dimension in the grid.
! (i.e. the values should range from 1 to dimCount). If not specified, the default
! is to map all of distgrid's dimensions against the dimensions of the
! grid in sequence.
! \item[{[coordSys]}]
! The coordinate system of the grid coordinate data.
! For a full list of options, please see Section~\ref{const:coordsys}.
! If not specified then defaults to ESMF\_COORDSYS\_SPH\_DEG.
! \item[{[coordTypeKind]}]
! The type/kind of the grid coordinate data. All {\em numerical} types
! listed under section~\ref{const:typekind} are supported.
! If not specified then defaults to ESMF\_TYPEKIND\_R8.
! \item[{[minIndex]}]
! Tuple to start the index ranges at. If not present, defaults
! to /1,1,1,.../.
! \item[{[maxIndex]}]
! The upper extend of the grid index ranges.
! \item[{[localArbIndex]}]
! This 2D array specifies the indices of the local grid cells. The
! dimensions should be localArbIndexCount * number of grid dimensions
! where localArbIndexCount is the input argument specified below
! \item[{localArbIndexCount}]
! number of grid cells in the local DE
! \item[{[gridEdgeLWidth]}]
! The padding around the lower edges of the grid. This padding is between
! the index space corresponding to the cells and the boundary of the
! the exclusive region. This extra space is to contain the extra
! padding for non-center stagger locations, and should be big enough
! to hold any stagger in the grid. If this and gridAlign are not present then
! defaults to 0, 0, ..., 0 (all zeros).
! \item[{[gridEdgeUWidth]}]
! The padding around the upper edges of the grid. This padding is between
! the index space corresponding to the cells and the boundary of the
! the exclusive region. This extra space is to contain the extra
! padding for non-center stagger locations, and should be big enough
! to hold any stagger in the grid. If this and gridAlign are not present then
! defaults to 1, 1, ..., 1 (all ones).
! \item[{[gridAlign]}]
! Specification of how the stagger locations should align with the cell
! index space (can be overridden by the individual staggerAligns). If
! the gridEdgeWidths are not specified than this argument
! implies the gridEdgeWidths. If the gridEdgeWidths are specified and this argument isn't
! then this argument is implied by the gridEdgeWidths.
! If this and the gridEdgeWidths are not specified, then defaults to
! -1, -1, ..., -1 (all negative ones).
! \item[{[gridMemLBound]}]
! Specifies the lower index range of the memory of every DE in this Grid.
! Only used when indexflag is {\tt ESMF\_INDEX\_USER}. May be overridden
! by staggerMemLBound.
! \item[{[indexflag]}]
! Indicates the indexing scheme to be used in the new Grid. Please see
! Section~\ref{const:indexflag} for the list of options. If not present,
! defaults to ESMF\_INDEX\_DELOCAL.
! \item[{[destroyDistgrid]}]
! If true, when the Grid is destroyed the DistGrid will be destroyed also.
! Defaults to false.
! \item[{[destroyDELayout]}]
! If true, when the Grid is destroyed the DELayout will be destroyed also.
! Defaults to false.
! \item[{[name]}]
! {\tt ESMF\_Grid} name.
! \item[{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOPI
integer :: localrc ! local error status
integer :: nameLen
type(ESMF_InterArray) :: gridEdgeLWidthArg ! Language Interface Helper Var
type(ESMF_InterArray) :: gridEdgeUWidthArg ! Language Interface Helper Var
type(ESMF_InterArray) :: gridAlignArg ! Language Interface Helper Var
type(ESMF_InterArray) :: gridMemLBoundArg ! Language Interface Helper Var
type(ESMF_InterArray) :: distgridToGridMapArg ! Language Interface Helper Var
type(ESMF_InterArray) :: distDimArg ! Language Interface Helper Var
type(ESMF_InterArray) :: coordDimCountArg ! Language Interface Helper Var
type(ESMF_InterArray) :: coordDimMapArg ! Language Interface Helper Var
type(ESMF_InterArray) :: minIndexArg ! Language Interface Helper Var
type(ESMF_InterArray) :: maxIndexArg ! Language Interface Helper Var
type(ESMF_InterArray) :: localArbIndexArg ! Language Interface Helper Var
integer :: intDestroyDistgrid,intDestroyDELayout
type(ESMF_Pointer) :: vmThis
logical :: actualFlag
! Initialize return code; assume failure until success is certain
localrc = ESMF_RC_NOT_IMPL
if (present(rc)) rc = ESMF_RC_NOT_IMPL
! Check init status of arguments
ESMF_INIT_CHECK_DEEP_SHORT(ESMF_DistGridGetInit, distgrid, rc)
ESMF_INIT_CHECK_DEEP_SHORT(ESMF_GridGetInit, grid, rc)
! Must make sure the local PET is associated with an actual member
actualFlag = .true.
if (present(vm)) then
call ESMF_VMGetThis(vm, vmThis)
if (vmThis == ESMF_NULL_POINTER) then
actualFlag = .false. ! local PET is not for an actual member of Array
endif
endif
if (actualFlag) then
! Translate F90 arguments to C++ friendly form
!! name
nameLen=0
if (present(name)) then
nameLen=len_trim(name)
endif
!! coordTypeKind
! It doesn't look like it needs to be translated, but test to make sure
!! gridEdgeLWidth and gridEdgeUWidth
gridEdgeLWidthArg = ESMF_InterArrayCreate(gridEdgeLWidth, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
gridEdgeUWidthArg = ESMF_InterArrayCreate(gridEdgeUWidth, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
gridAlignArg = ESMF_InterArrayCreate(gridAlign, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
gridMemLBoundArg = ESMF_InterArrayCreate(gridMemLBound, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
!! distgridToGridMap
distgridToGridMapArg = ESMF_InterArrayCreate(distgridToGridMap, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
!! distDim
distDimArg = ESMF_InterArrayCreate(distDim, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
!! Description of array factorization
coordDimCountArg = ESMF_InterArrayCreate(coordDimCount, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
coordDimMapArg = ESMF_InterArrayCreate(farray2D=coordDimMap, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
!! Index bound and localArbIndex array
minIndexArg = ESMF_InterArrayCreate(minIndex, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
maxIndexArg = ESMF_InterArrayCreate(maxIndex, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
localArbIndexArg = ESMF_InterArrayCreate(farray2D=localArbIndex, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
!! default to don't destroy, actual value can be set by subroutine in other creates
intDestroyDistgrid=0
intDestroyDELayout=0
! Call C++ Subroutine to do the create
call c_ESMC_gridsetfromdistgrid(grid%this, nameLen, name, &
coordTypeKind, distgrid, &
distgridToGridMapArg, distDimArg, &
coordSys, coordDimCountArg, coordDimMapArg, &
minIndexArg, maxIndexArg, localArbIndexArg, localArbIndexCount, &
gridEdgeLWidthArg, gridEdgeUWidthArg, gridAlignArg, &
gridMemLBoundArg, indexflag, intDestroyDistGrid, intDestroyDELayout, localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Deallocate helper variables
call ESMF_InterArrayDestroy(gridEdgeUWidthArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(gridEdgeLWidthArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(gridAlignArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(gridMemLBoundArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(distgridToGridMapArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(distDimArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(coordDimCountArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(coordDimMapArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(minIndexArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(maxIndexArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_InterArrayDestroy(localArbIndexArg, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
endif
! Return successfully
if (present(rc)) rc = ESMF_SUCCESS
end subroutine ESMF_GridSetFromDistGrid