exhaustiveMeshDualTest Subroutine

subroutine exhaustiveMeshDualTest(correct, rc)

Arguments

Type IntentOptional Attributes Name
logical :: correct
integer :: rc

Calls

proc~~exhaustivemeshdualtest~~CallsGraph proc~exhaustivemeshdualtest exhaustiveMeshDualTest interface~esmf_meshcreate ESMF_MeshCreate proc~exhaustivemeshdualtest->interface~esmf_meshcreate interface~esmf_vmget ESMF_VMGet proc~exhaustivemeshdualtest->interface~esmf_vmget proc~esmf_meshcreatedual ESMF_MeshCreateDual proc~exhaustivemeshdualtest->proc~esmf_meshcreatedual proc~esmf_meshdestroy ESMF_MeshDestroy proc~exhaustivemeshdualtest->proc~esmf_meshdestroy proc~esmf_meshget ESMF_MeshGet proc~exhaustivemeshdualtest->proc~esmf_meshget proc~esmf_vmgetglobal ESMF_VMGetGlobal proc~exhaustivemeshdualtest->proc~esmf_vmgetglobal

Called by

proc~~exhaustivemeshdualtest~~CalledByGraph proc~exhaustivemeshdualtest exhaustiveMeshDualTest program~esmf_meshutest ESMF_MeshUTest program~esmf_meshutest->proc~exhaustivemeshdualtest

Source Code

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