subroutine exhaustiveMeshDualTest(correct, rc)
logical :: correct
integer :: rc
type(ESMF_Mesh):: mesh, dualMesh
integer, pointer :: nodeIds(:),nodeOwners(:),nodeMask(:),nodeIdsTst(:)
real(ESMF_KIND_R8), pointer :: nodeCoords(:), nodeCoordsTst(:)
real(ESMF_KIND_R8), pointer :: ownedNodeCoords(:)
integer :: numNodes, numOwnedNodes, numOwnedNodesTst
integer :: numElems,numOwnedElemsTst
integer :: numElemConns, numTriElems, numQuadElems
real(ESMF_KIND_R8), pointer :: elemCoords(:), elemCoordsTst(:)
integer, pointer :: elemIds(:),elemTypes(:),elemConn(:),elemMask(:), elemIdsTst(:)
integer :: petCount, localPet
type(ESMF_VM) :: vm
integer :: numOwnedElems
! 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 4 PETs
if ((petCount /= 1) .and. (petCount /=4)) then
rc=ESMF_FAILURE
return
endif
! Setup mesh info depending on the
! number of PETs
if (petCount .eq. 1) then
! Fill in node data
numNodes=16
!! node ids
allocate(nodeIds(numNodes))
nodeIds=(/1,2,3,4,5,6,7,8, &
9,10,11,12,13,14,&
15,16/)
!! node mask
!! (Ids + 10)
allocate(nodeMask(numNodes))
nodeMask=(/11,12,13,14,15,16,17,18, &
19,20,21,22,23,24,&
25,26/)
!! node Coords
allocate(nodeCoords(numNodes*2))
nodeCoords=(/0.0,0.0, & ! 1
1.0,0.0, & ! 2
2.0,0.0, & ! 3
3.0,0.0, & ! 4
0.0,1.0, & ! 5
1.0,1.0, & ! 6
2.0,1.0, & ! 7
3.0,1.0, & ! 8
0.0,2.0, & ! 9
1.0,2.0, & ! 10
2.0,2.0, & ! 11
3.0,2.0, & ! 12
0.0,3.0, & ! 13
1.0,3.0, & ! 14
2.0,3.0, & ! 15
3.0,3.0 /) ! 16
!! node owners
allocate(nodeOwners(numNodes))
nodeOwners=0 ! everything on proc 0
! Fill in elem data
numTriElems=0
numQuadElems=9
numElems=numTriElems+numQuadElems
numElemConns=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/1,2,3,4,5,6,7,8,9/)
!! elem mask
!! (Ids+100)
allocate(elemMask(numElems))
elemMask=(/101,102,103,104,105,106,107,108,109/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD, & ! 1
ESMF_MESHELEMTYPE_QUAD, & ! 2
ESMF_MESHELEMTYPE_QUAD, & ! 3
ESMF_MESHELEMTYPE_QUAD, & ! 4
ESMF_MESHELEMTYPE_QUAD, & ! 5
ESMF_MESHELEMTYPE_QUAD, & ! 6
ESMF_MESHELEMTYPE_QUAD, & ! 7
ESMF_MESHELEMTYPE_QUAD, & ! 8
ESMF_MESHELEMTYPE_QUAD/) ! 9
!! elem coords
allocate(elemCoords(2*numElems))
elemCoords=(/0.5,0.5, & ! 1
1.5,0.5, & ! 2
2.5,0.5, & ! 3
0.5,1.5, & ! 4
1.5,1.5, & ! 5
2.5,1.5, & ! 6
0.5,2.5, & ! 7
1.5,2.5, & ! 8
2.5,2.5/) ! 9
!! elem conn
allocate(elemConn(numElemConns))
elemConn=(/1,2,6,5, & ! 1
2,3,7,6, & ! 2
3,4,8,7, & ! 3
5,6,10,9, & ! 4
6,7,11,10, & ! 5
7,8,12,11, & ! 6
9,10,14,13, & ! 7
10,11,15,14, & ! 8
11,12,16,15/) ! 9
else if (petCount .eq. 4) then
! Setup mesh data depending on PET
if (localPet .eq. 0) then
! Fill in node data
numNodes=4
!! node ids
allocate(nodeIds(numNodes))
nodeIds=(/1,2,5,6/)
!! node mask
!! (ids+10)
allocate(nodeMask(numNodes))
nodeMask=(/11,12,15,16/)
!! node Coords
allocate(nodeCoords(numNodes*2))
nodeCoords=(/0.0,0.0, & ! 1
1.0,0.0, & ! 2
0.0,1.0, & ! 5
1.0,1.0 /) ! 6
!! node owners
allocate(nodeOwners(numNodes))
nodeOwners=0 ! everything on proc 0
! Fill in elem data
numTriElems=0
numQuadElems=1
numElems=numTriElems+numQuadElems
numElemConns=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/1/)
!! elem mask
!! (ids+100)
allocate(elemMask(numElems))
elemMask=(/101/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD/) ! 1
!! elem coords
allocate(elemCoords(2*numElems))
elemCoords=(/0.5,0.5/) ! 1
!! elem conn
allocate(elemConn(numElemConns))
elemConn=(/1,2,4,3/) ! 1
else if (localPet .eq. 1) then
! Fill in node data
numNodes=6
!! node ids
allocate(nodeIds(numNodes))
nodeIds=(/2,3,4,6,7,8/)
!! node mask
!! (ids+10)
allocate(nodeMask(numNodes))
nodeMask=(/12,13,14,16,17,18/)
!! node Coords
allocate(nodeCoords(numNodes*2))
nodeCoords=(/1.0,0.0, & ! 2
2.0,0.0, & ! 3
3.0,0.0, & ! 4
1.0,1.0, & ! 6
2.0,1.0, & ! 7
3.0,1.0 /) ! 8
!! node owners
allocate(nodeOwners(numNodes))
nodeOwners=(/0, & ! 2
1, & ! 3
1, & ! 4
0, & ! 6
1, & ! 7
1/) ! 8
! Fill in elem data
numTriElems=0
numQuadElems=2
numElems=numTriElems+numQuadElems
numElemConns=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/2,3/)
!! elem mask
!! (ids+100)
allocate(elemMask(numElems))
elemMask=(/102,103/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD, & ! 2
ESMF_MESHELEMTYPE_QUAD/) ! 3
!! elem coords
allocate(elemCoords(2*numElems))
elemCoords=(/1.5,0.5, & ! 2
2.5,0.5/) ! 3
!! elem conn
allocate(elemConn(numElemConns))
elemConn=(/1,2,5,4, & ! 2
2,3,6,5/) ! 3
else if (localPet .eq. 2) then
! Fill in node data
numNodes=9
!! node ids
allocate(nodeIds(numNodes))
nodeIds=(/5,6,7, &
9,10,11, &
13,14,15/)
!! node mask
!! (ids+10)
allocate(nodeMask(numNodes))
nodeMask=(/15,16,17, &
19,20,21, &
23,24,25/)
!! node Coords
allocate(nodeCoords(numNodes*2))
nodeCoords=(/0.0,1.0, & ! 5
1.0,1.0, & ! 6
2.0,1.0, & ! 7
0.0,2.0, & ! 9
1.0,2.0, & ! 10
2.0,2.0, & ! 11
0.0,3.0, & ! 13
1.0,3.0, & ! 14
2.0,3.0/) ! 15
!! node owners
allocate(nodeOwners(numNodes))
nodeOwners=(/0, & ! 5
0, & ! 6
1, & ! 7
2, & ! 9
2, & ! 10
3, & ! 11
2, & ! 13
2, & ! 14
3/) ! 15
! Fill in elem data
numTriElems=0
numQuadElems=4
numElems=numTriElems+numQuadElems
numElemConns=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/4,5,7,8/)
!! elem mask
!! (ids+100)
allocate(elemMask(numElems))
elemMask=(/104,105,107,108/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD, & ! 4
ESMF_MESHELEMTYPE_QUAD, & ! 5
ESMF_MESHELEMTYPE_QUAD, & ! 7
ESMF_MESHELEMTYPE_QUAD/) ! 8
!! elem coords
allocate(elemCoords(2*numElems))
elemCoords=(/0.5,1.5, & ! 4
1.5,1.5, & ! 5
0.5,2.5, & ! 7
1.5,2.5/) ! 8
!! elem conn
allocate(elemConn(numElemConns))
elemConn=(/1,2,5,4, & ! 4
2,3,6,5, & ! 5
4,5,8,7, & ! 7
5,6,9,8/) ! 8
else if (localPet .eq. 3) then
! Fill in node data
numNodes=6
!! node ids
allocate(nodeIds(numNodes))
nodeIds=(/7,8,11,12,15,16/)
!! node mask
!! (ids+10)
allocate(nodeMask(numNodes))
nodeMask=(/17,18,21,22,25,26/)
!! node Coords
allocate(nodeCoords(numNodes*2))
nodeCoords=(/2.0,1.0, & ! 7
3.0,1.0, & ! 8
2.0,2.0, & ! 11
3.0,2.0, & ! 12
2.0,3.0, & ! 15
3.0,3.0 /) ! 16
!! node owners
allocate(nodeOwners(numNodes))
nodeOwners=(/1, & ! 7
1, & ! 8
3, & ! 11
3, & ! 12
3, & ! 15
3/) ! 16
! Fill in elem data
numTriElems=0
numQuadElems=2
numElems=numTriElems+numQuadElems
numElemConns=3*numTriElems+4*numQuadElems
!! elem ids
allocate(elemIds(numElems))
elemIds=(/6,9/)
!! elem mask
!! (ids+100)
allocate(elemMask(numElems))
elemMask=(/106,109/)
!! elem types
allocate(elemTypes(numElems))
elemTypes=(/ESMF_MESHELEMTYPE_QUAD, & ! 6
ESMF_MESHELEMTYPE_QUAD/) ! 9
!! elem coords
allocate(elemCoords(2*numElems))
elemCoords=(/2.5,1.5, & ! 6
2.5,2.5/) ! 9
!! elem conn
allocate(elemConn(numElemConns))
elemConn=(/1,2,4,3, & ! 6
3,4,6,5/) ! 9
endif
endif
! Create Mesh structure in 1 step
mesh=ESMF_MeshCreate(parametricDim=2,spatialDim=2, &
coordSys=ESMF_COORDSYS_SPH_DEG, &
nodeIds=nodeIds, nodeCoords=nodeCoords, &
nodeOwners=nodeOwners, nodeMask=nodeMask, &
elementIds=elemIds, elementTypes=elemTypes, elementConn=elemConn, &
elementCoords=elemCoords, elementMask=elemMask, &
rc=rc)
if (rc /= ESMF_SUCCESS) return
! deallocate node data
deallocate(nodeIds)
deallocate(nodeCoords)
deallocate(nodeOwners)
deallocate(nodeMask)
! deallocate elem data
deallocate(elemIds)
deallocate(elemTypes)
deallocate(elemCoords)
deallocate(elemConn)
deallocate(elemMask)
! Create Dual Mesh
dualMesh=ESMF_MeshCreateDual(mesh, rc=rc)
if (rc /= ESMF_SUCCESS) return
! call ESMF_MeshWrite(dualMesh, "dualMesh", rc=rc)
! Init correct
correct=.true.
! Get count info from dual
call ESMF_MeshGet(dualMesh, &
nodeCount=numNodes, &
elementCount=numElems, &
elementConnCount=numElemConns, &
numOwnedNodes=numOwnedNodes, &
numOwnedElements=numOwnedElems, &
rc=rc)
if (rc /= ESMF_SUCCESS) return
! ! DEBUG OUTPUT
! write(*,*) localPEt,"# numNodes=",numNodes
! write(*,*) localPEt,"# numElems=",numElems
! write(*,*) localPEt,"# numElemConns=",numElemConns
! write(*,*) localPEt,"# numOwnedNodes=",numOwnedNodes
! write(*,*) localPEt,"# numOwnedElems=",numOwnedElems
! Allocate space for arrays
allocate(nodeIds(numNodes))
allocate(nodeIdsTst(numNodes))
allocate(nodeCoords(2*numNodes))
allocate(nodeCoordsTst(2*numNodes))
allocate(nodeMask(numNodes))
allocate(elemIds(numElems))
allocate(elemIdsTst(numElems))
allocate(elemMask(numElems))
allocate(elemCoords(2*numElems))
allocate(elemCoordsTst(2*numElems))
! Get count info from dual
call ESMF_MeshGet(dualMesh, &
nodeIds=nodeIds, &
nodeCoords=nodeCoords, &
nodeMask=nodeMask, &
elementIds=elemIds, &
elementMask=elemMask, &
elementCoords=elemCoords, &
rc=rc)
if (rc /= ESMF_SUCCESS) return
! ! DEBUG OUTPUT
!write(*,*) localPet,"# nodeIds=",nodeIds
!write(*,*) localPet,"# nodeCoords=",nodeCoords
!write(*,*) localPet,"# elemIds=",elemIds
!write(*,*) localPet,"# elemCoords=",elemCoords
! Check based on PetCount
if (petCount == 1) then
! Check Counts
if (numNodes /= 9) correct=.false.
if (numElems /= 4) correct=.false.
if (numElemConns /= 16) correct=.false.
if (numOwnedNodes /= 9) correct=.false.
if (numOwnedElems /= 4) correct=.false.
! Check node ids and coords
nodeIdsTst=(/1, 2, 3, 4, 5, 6, 7, 8, 9/)
nodeCoordsTst=(/0.50, 0.50, 1.5, 0.50, 2.5, 0.50, 0.50, 1.5, 1.5, 1.5, 2.5, 1.5, 0.50, 2.5, 1.5, 2.5, 2.5, 2.5/)
do i=1,numNodes
if (nodeIdsTst(i) /= nodeIds(i)) correct=.false.
if (nodeMask(i) /= nodeIds(i)+100) correct=.false.
if (nodeCoordsTst(2*i-1) /= nodeCoords(2*i-1)) correct=.false.
if (nodeCoordsTst(2*i) /= nodeCoords(2*i)) correct=.false.
enddo
! Check elem ids and coords
elemIdsTst=(/6, 7, 10, 11/)
elemCoordsTst=(/1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 2.0, 2.0/)
do i=1,numElems
if (elemIdsTst(i) /= elemIds(i)) correct=.false.
if (elemMask(i) /= elemIds(i)+10) correct=.false.
if (elemCoordsTst(2*i-1) /= elemCoords(2*i-1)) correct=.false.
if (elemCoordsTst(2*i) /= elemCoords(2*i)) correct=.false.
enddo
else if (petCount == 4) then
if (localPet == 0) then
! Check Counts
if (numNodes /= 4) correct=.false.
if (numElems /= 1) correct=.false.
if (numElemConns /= 4) correct=.false.
if (numOwnedNodes /= 1) correct=.false.
if (numOwnedElems /= 1) correct=.false.
! Check node ids and coords
nodeIdsTst=(/1, 2, 4, 5/)
nodeCoordsTst=(/0.5, 0.5, 1.5, 0.5, 0.5, 1.5, 1.5, 1.5/)
do i=1,numNodes
if (nodeCoordsTst(2*i-1) /= nodeCoords(2*i-1)) correct=.false.
if (nodeCoordsTst(2*i) /= nodeCoords(2*i)) correct=.false.
enddo
! Check elem ids and coords
elemIdsTst=(/6/)
elemCoordsTst=(/1.0, 1.0/)
do i=1,numElems
if (elemIdsTst(i) /= elemIds(i)) correct=.false.
if (elemCoordsTst(2*i-1) /= elemCoords(2*i-1)) correct=.false.
if (elemCoordsTst(2*i) /= elemCoords(2*i)) correct=.false.
enddo
else if (localPet == 1) then
! Check Counts
if (numNodes /= 6) correct=.false.
if (numElems /= 2) correct=.false.
if (numElemConns /= 8) correct=.false.
if (numOwnedNodes /= 2) correct=.false.
if (numOwnedElems /= 1) correct=.false.
! Check node ids and coords
nodeIdsTst=(/2, 3, 1, 4, 5, 6/)
nodeCoordsTst=(/1.5, 0.50, 2.5, 0.50, 0.50, 0.50, 0.50, 1.5, 1.5, 1.5, 2.5, 1.5/)
do i=1,numNodes
if (nodeCoordsTst(2*i-1) /= nodeCoords(2*i-1)) correct=.false.
if (nodeCoordsTst(2*i) /= nodeCoords(2*i)) correct=.false.
enddo
! Check elem ids and coords
elemIdsTst=(/6,7/)
elemCoordsTst=(/1.0, 1.0, 2.0, 1.0/)
do i=1,numElems
if (elemIdsTst(i) /= elemIds(i)) correct=.false.
if (elemCoordsTst(2*i-1) /= elemCoords(2*i-1)) correct=.false.
if (elemCoordsTst(2*i) /= elemCoords(2*i)) correct=.false.
enddo
else if (localPet == 2) then
! Check Counts
if (numNodes /= 9) correct=.false.
if (numElems /= 4) correct=.false.
if (numElemConns /= 16) correct=.false.
if (numOwnedNodes /= 4) correct=.false.
if (numOwnedElems /= 1) correct=.false.
! Check node ids and coords
nodeIdsTst=(/4, 5, 7, 8, 1, 2, 3, 6, 9/)
nodeCoordsTst=(/0.50, 1.5, 1.5, 1.5, 0.50, 2.5, 1.5, 2.5, 0.50, 0.50, 1.5, 0.50, 2.5, 0.50, 2.5, 1.5, 2.5, 2.5/)
do i=1,numNodes
if (nodeCoordsTst(2*i-1) /= nodeCoords(2*i-1)) correct=.false.
if (nodeCoordsTst(2*i) /= nodeCoords(2*i)) correct=.false.
enddo
! Check elem ids and coords
elemIdsTst=(/6, 7, 10, 11/)
elemCoordsTst=(/1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 2.0, 2.0/)
do i=1,numElems
if (elemIdsTst(i) /= elemIds(i)) correct=.false.
if (elemCoordsTst(2*i-1) /= elemCoords(2*i-1)) correct=.false.
if (elemCoordsTst(2*i) /= elemCoords(2*i)) correct=.false.
enddo
else if (localPet == 3) then
! Check Counts
if (numNodes /= 6) correct=.false.
if (numElems /= 2) correct=.false.
if (numElemConns /= 8) correct=.false.
if (numOwnedNodes /= 2) correct=.false.
if (numOwnedElems /= 1) correct=.false.
! Check node ids and coords
nodeIdsTst=(/6, 9, 2, 3, 5, 8/)
nodeCoordsTst=(/2.50, 1.50, 2.50, 2.50, 1.50, 0.500, 2.50, 0.500, 1.50, 1.50, 1.50, 2.5/)
do i=1,numNodes
if (nodeCoordsTst(2*i-1) /= nodeCoords(2*i-1)) correct=.false.
if (nodeCoordsTst(2*i) /= nodeCoords(2*i)) correct=.false.
enddo
! Check elem ids and coords
elemIdsTst=(/7, 11/)
elemCoordsTst=(/2.0, 1.0, 2.0, 2.0/)
do i=1,numElems
if (elemIdsTst(i) /= elemIds(i)) correct=.false.
if (elemCoordsTst(2*i-1) /= elemCoords(2*i-1)) correct=.false.
if (elemCoordsTst(2*i) /= elemCoords(2*i)) correct=.false.
enddo
else
rc=ESMF_FAILURE
return
endif
else
rc=ESMF_FAILURE
return
endif
! Deallocate
deallocate(nodeIds)
deallocate(nodeIdsTst)
deallocate(nodeCoords)
deallocate(nodeCoordsTst)
deallocate(nodeMask)
deallocate(elemIds)
deallocate(elemIdsTst)
deallocate(elemMask)
deallocate(elemCoords)
deallocate(elemCoordsTst)
! Destroy meshes
call ESMF_MeshDestroy(dualMesh, rc=rc)
if (rc /= ESMF_SUCCESS) return
call ESMF_MeshDestroy(mesh, rc=rc)
if (rc /= ESMF_SUCCESS) return
end subroutine exhaustiveMeshDualTest