subroutine CreateTestMesh2x2EE_2(mesh, rc)
type(ESMF_Mesh), intent(out) :: mesh
integer :: rc
integer :: numElems,numOwnedElemsTst
integer :: numElemCorners, numTriElems, numQuadElems
real(ESMF_KIND_R8), pointer :: elemCoords(:,:)
real(ESMF_KIND_R8), pointer :: elemCornerCoords(:,:)
integer, pointer :: elemIds(:),elemTypes(:)
integer :: petCount, localPet
type(ESMF_VM) :: vm
! get global VM
call ESMF_VMGetGlobal(vm, rc=rc)
if (rc /= ESMF_SUCCESS) return
call ESMF_VMGet(vm, localPet=localPet, petCount=petCount, rc=rc)
if (rc /= ESMF_SUCCESS) return
! return with an error if not 1 or 2 PETs
if ((petCount /= 1) .and. (petCount /=2)) then
rc=ESMF_FAILURE
return
endif
! Setup mesh info depending on the
! number of PETs
if (petCount .eq. 1) then
! Fill in elem data
numTriElems=2
numQuadElems=3
numElems=numTriElems+numQuadElems
numElemCorners=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/1,3,7,9,10/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD, & ! 1
ESMF_MESHELEMTYPE_QUAD, & ! 3
ESMF_MESHELEMTYPE_QUAD, & ! 7
ESMF_MESHELEMTYPE_TRI, & ! 9
ESMF_MESHELEMTYPE_TRI/) ! 10
!! elem corner Coords
allocate(elemCornerCoords(2,numElemCorners))
elemCornerCoords(:,1)=(/0.0,0.0/) ! 1
elemCornerCoords(:,2)=(/1.0,0.0/) ! 1
elemCornerCoords(:,3)=(/1.0,1.0/) ! 1
elemCornerCoords(:,4)=(/0.0,1.0/) ! 1
elemCornerCoords(:,5)=(/1.0,0.0/) ! 3
elemCornerCoords(:,6)=(/3.0,0.0/) ! 3
elemCornerCoords(:,7)=(/3.0,1.0/) ! 3
elemCornerCoords(:,8)=(/1.0,1.0/) ! 3
elemCornerCoords(:,9)=(/0.0,1.0/) ! 7
elemCornerCoords(:,10)=(/1.0,1.0/) ! 7
elemCornerCoords(:,11)=(/1.0,3.0/) ! 7
elemCornerCoords(:,12)=(/0.0,3.0/) ! 7
elemCornerCoords(:,13)=(/1.0,1.0/) ! 9
elemCornerCoords(:,14)=(/3.0,1.0/) ! 9
elemCornerCoords(:,15)=(/3.0,3.0/) ! 9
elemCornerCoords(:,16)=(/1.0,1.0/) ! 10
elemCornerCoords(:,17)=(/3.0,3.0/) ! 10
elemCornerCoords(:,18)=(/1.0,3.0 /) ! 10
else if (petCount .eq. 2) then
! Setup mesh data depending on PET
if (localPet .eq. 0) then
! Fill in elem data
numTriElems=0
numQuadElems=2
numElems=numTriElems+numQuadElems
numElemCorners=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/1,3/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD, &! 1
ESMF_MESHELEMTYPE_QUAD/) ! 3
!! elem corner Coords
allocate(elemCornerCoords(2,numElemCorners))
elemCornerCoords(:,1)=(/0.0,0.0/) ! 1
elemCornerCoords(:,2)=(/1.0,0.0/) ! 1
elemCornerCoords(:,3)=(/1.0,1.0/) ! 1
elemCornerCoords(:,4)=(/0.0,1.0/) ! 1
elemCornerCoords(:,5)=(/1.0,0.0/) ! 3
elemCornerCoords(:,6)=(/3.0,0.0/) ! 3
elemCornerCoords(:,7)=(/3.0,1.0/) ! 3
elemCornerCoords(:,8)=(/1.0,1.0/) ! 3
else if (localPet .eq. 1) then
! Fill in elem data
numTriElems=2
numQuadElems=1
numElems=numTriElems+numQuadElems
numElemCorners=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/7,9,10/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD, & ! 7
ESMF_MESHELEMTYPE_TRI, & ! 9
ESMF_MESHELEMTYPE_TRI/) ! 10
!! elem corner Coords
allocate(elemCornerCoords(2,numElemCorners))
elemCornerCoords(:,1)=(/0.0,1.0/) ! 7
elemCornerCoords(:,2)=(/1.0,1.0/) ! 7
elemCornerCoords(:,3)=(/1.0,3.0/) ! 7
elemCornerCoords(:,4)=(/0.0,3.0/) ! 7
elemCornerCoords(:,5)=(/1.0,1.0/) ! 9
elemCornerCoords(:,6)=(/3.0,1.0/) ! 9
elemCornerCoords(:,7)=(/3.0,3.0/) ! 9
elemCornerCoords(:,8)=(/1.0,1.0/) ! 10
elemCornerCoords(:,9)=(/3.0,3.0/) ! 10
elemCornerCoords(:,10)=(/1.0,3.0 /) ! 10
endif
endif
! Create Mesh structure in 1 step
mesh=ESMF_MeshCreate(parametricDim=2, &
coordSys=ESMF_COORDSYS_SPH_DEG, &
elementIds=elemIds,&
elementTypes=elemTypes,&
elementCornerCoords=elemCornerCoords, &
rc=rc)
if (rc /= ESMF_SUCCESS) return
! deallocate elem data
deallocate(elemIds)
deallocate(elemTypes)
deallocate(elemCornerCoords)
! Output Mesh for debugging
!call ESMF_MeshWrite(mesh,"meshee2",rc=rc)
!if (rc .ne. ESMF_SUCCESS) rc=ESMF_FAILURE
! Return success
rc=ESMF_SUCCESS
end subroutine CreateTestMesh2x2EE_2