ESMF_ArrayHaloUTest.F90 Source File


Source Code

! $Id$
!
! Earth System Modeling Framework
! Copyright (c) 2002-2023, University Corporation for Atmospheric Research,
! Massachusetts Institute of Technology, Geophysical Fluid Dynamics
! Laboratory, University of Michigan, National Centers for Environmental
! Prediction, Los Alamos National Laboratory, Argonne National Laboratory,
! NASA Goddard Space Flight Center.
! Licensed under the University of Illinois-NCSA License.
!
!==============================================================================
!
program ESMF_ArrayHaloUTest

!------------------------------------------------------------------------------

#include "ESMF_Macros.inc"
#include "ESMF.h"

!==============================================================================
!BOP
! !PROGRAM: ESMF_ArrayHaloUTest -  Tests ArrayHalo()
!
! !DESCRIPTION:
!
!-----------------------------------------------------------------------------
! !USES:
  use ESMF_TestMod     ! test methods
  use ESMF

  implicit none

!------------------------------------------------------------------------------
! The following line turns the CVS identifier string into a printable variable.
  character(*), parameter :: version = &
    '$Id$'
!------------------------------------------------------------------------------

!-------------------------------------------------------------------------
!=========================================================================

  ! individual test failure message
  character(ESMF_MAXSTR) :: failMsg
  character(ESMF_MAXSTR) :: name

  ! Local variables
  type(ESMF_VM)         :: vm
  type(ESMF_DELayout)   :: delayout
  type(ESMF_DistGrid)   :: distgrid
  type(ESMF_Array)      :: array
  type(ESMF_ArraySpec)  :: arrayspec
  type(ESMF_RouteHandle):: routehandle
  integer(ESMF_KIND_I4), pointer :: farrayPtr(:,:)
  integer(ESMF_KIND_I4), pointer :: farrayPtr3d(:,:,:)
  integer               :: rc, i, j, m, verifyValue
  integer               :: petCount, localPet, localDeCount, lde
  integer, allocatable  :: localDeToDeMap(:)
  logical               :: verifyFlag
  integer               :: eLB(2,1), eUB(2,1)
  integer               :: cLB(2,1), cUB(2,1)
  integer               :: tLB(2,1), tUB(2,1)
  integer               :: hLB(2,1), hUB(2,1)
  integer               :: uLB(1), uUB(1)
  integer, allocatable  :: eLBde(:,:), eUBde(:,:), tLBde(:,:), tUBde(:,:)
  type(ESMF_DistGridConnection), allocatable :: connectionList(:)

  ! cumulative result: count failures; no failures equals "all pass"
  integer :: result = 0

!-------------------------------------------------------------------------------
! The unit tests are divided into Sanity and Exhaustive. The Sanity tests are
! always run. When the environment variable, EXHAUSTIVE, is set to ON then
! the EXHAUSTIVE and sanity tests both run. If the EXHAUSTIVE variable is set
! to OFF, then only the sanity unit tests.
! Special strings (Non-exhaustive and exhaustive) have been
! added to allow a script to count the number and types of unit tests.
!-------------------------------------------------------------------------------

  !------------------------------------------------------------------------
  call ESMF_TestStart(ESMF_SRCLINE, rc=rc)  ! calls ESMF_Initialize() internally
  if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  !------------------------------------------------------------------------
  ! get global VM
  call ESMF_VMGetGlobal(vm, rc=rc)
  if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_VMGet(vm, localPet=localPet, petCount=petCount, rc=rc)
  if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  
  if (petCount /= 4) then
    print *, "This system test needs to run on exactly 4 PETs, petCount = ", &
      petCount
    goto 10
  endif

!-------------------------------------------------------------------------------
!-------------------------------------------------------------------------------
! Test-1: 1D decomposition, non-overlapping halo regions

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/1,4/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=2, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    computationalLWidth=(/2,2/), computationalUWidth=(/2,2/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    totalLBound=tLB, totalUBound=tUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 1 x 4 = 4 DEs. This means that each DE holds a 10 x 5
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. There are, therefore,
! exactly one DE per PET.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
! +-------------------+   +-------------------+   +-------------------+   +-------------------+
! | \       2       / |   | \       2       / |   | \       2       / |   | \       2       / |
! |  +-------------+  |   |  +-------------+  |   |  +-------------+  |   |  +-------------+  |
! |  |     DE 0    |  |   |  |     DE 1    |  |   |  |     DE 2    |  |   |  |     DE 3    |  |
! |  |             |  |   |  |             |  |   |  |             |  |   |  |             |  |
! |  |   10 x 5    |  |   |  |   10 x 5    |  |   |  |   10 x 5    |  |   |  |   10 x 5    |  |
! |  |             |  |   |  |             |  |   |  |             |  |   |  |             |  |
! |2 |             | 2|<->|2 |             | 2|<->|2 |             | 2|<->|2 |             | 2|
! |  |             |  |   |  |             |  |   |  |             |  |   |  |             |  |
! |  |             |  |   |  |             |  |   |  |             |  |   |  |             |  |
! |  |             |  |   |  |             |  |   |  |             |  |   |  |             |  |
! |  |             |  |   |  |             |  |   |  |             |  |   |  |             |  |
! |  +-------------+  |   |  +-------------+  |   |  +-------------+  |   |  +-------------+  |
! | /       2       \ |   | /       2       \ |   | /       2       \ |   | /       2       \ |
! +-------------------+   +-------------------+   +-------------------+   +-------------------+
!
! Without the explicit definition of boundary conditions only the indicated
! inner connections define valid Halo paths for the Array object.
!------------------------------------------------------------------------

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  farrayPtr = localPet

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-1"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      if (farrayPtr(i,j) /= localPet) then
        verifyFlag = .false.
        print *, "Found wrong exclusive element"
        exit
      endif
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  verifyValue = localPet
  if (verifyFlag) then
    do j=tLB(2,1), eLB(2,1)-1
      do i=tLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=tLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  verifyValue = localPet
  if (verifyFlag) then
    do j=tLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  verifyValue = localPet
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  verifyValue = localPet
  if (verifyFlag) then
    do j=eUB(2,1)+1, tUB(2,1)
      do i=eUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  verifyValue = localPet
  if (verifyFlag) then
    do j=eUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  verifyValue = localPet
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-1"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------
! Test-2: 2D decomposition, overlapping halo regions

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/2,2/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=2, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    computationalLWidth=(/2,2/), computationalUWidth=(/2,2/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    totalLBound=tLB, totalUBound=tUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 2 x 2 = 4 DEs. This means that each DE holds a 5 x 10 
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. There are, therefore,
! exactly one DE per PET.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 0    |  |       |  |     DE 2    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
!                    ^            \/             ^
!                    |            /\             |
!                    v                           v
!
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 1    |  |       |  |     DE 3    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
! Without the explicit definition of boundary conditions only the indicated
! inner connections define valid Halo paths for the Array object.
!------------------------------------------------------------------------

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  farrayPtr = localPet

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-2"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      if (farrayPtr(i,j) /= localPet) then
        verifyFlag = .false.
        print *, "Found wrong exclusive element"
        exit
      endif
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=tLB(2,1), eLB(2,1)-1
      do i=tLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=tLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=tLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eUB(2,1)+1, tUB(2,1)
      do i=eUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-2"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------
! Test-2b: 2D decomposition, overlapping halo regions, multiple DEs/PET

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "DELayout Create Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  delayout = ESMF_DELayoutCreate(petMap=(/0,3,2,0/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/2,2/), delayout=delayout, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=2, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    computationalLWidth=(/2,2/), computationalUWidth=(/2,2/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get localDeCount Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, localDeCount=localDeCount, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
  allocate(eLBde(2,0:localDeCount-1))
  allocate(eUBde(2,0:localDeCount-1))
  allocate(tLBde(2,0:localDeCount-1))
  allocate(tUBde(2,0:localDeCount-1))
  
  allocate(localDeToDeMap(0:localDeCount-1))

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLBde, exclusiveUBound=eUBde, &
    totalLBound=tLBde, totalUBound=tUBde, localDeToDeMap=localDeToDeMap, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 2 x 2 = 4 DEs. This means that each DE holds a 5 x 10 
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. However, a DELayout is
! explicitly created to map DEs 0 and 3 agains PET 0, DE 1 against PET 3 and
! DE 2 against PET 2. Thus PET 0 holds 2 DEs, PET 1 holds no DEs, and PET 2 and
! 3 each holds 1 DE.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 0    |  |       |  |     DE 2    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
!                    ^            \/             ^
!                    |            /\             |
!                    v                           v
!
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 1    |  |       |  |     DE 3    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
! Without the explicit definition of boundary conditions only the indicated
! inner connections define valid Halo paths for the Array object.
!------------------------------------------------------------------------

  do lde=0, localDeCount-1
    call ESMF_ArrayGet(array, localDe=lde, farrayPtr=farrayPtr, rc=rc)
    ! Initialize the entire Array piece to its DE number
    farrayPtr = localDeToDeMap(lde)
  enddo

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-2b"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  do lde=0, localDeCount-1
  
    call ESMF_ArrayGet(array, localDe=lde, farrayPtr=farrayPtr, rc=rc)

    ! verify elements within exclusive region
    do j=eLBde(2,lde), eUBde(2,lde)
      do i=eLBde(1,lde), eUBde(1,lde)
        if (farrayPtr(i,j) /= localDeToDeMap(lde)) then
          verifyFlag = .false.
          print *, "Found wrong exclusive element"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  
    ! verify all eight sections outside the exclusive region
    ! section 1 staring in NW corner and going counter clock wise
    ! verify section 1
    if (localDeToDeMap(lde) == 0) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = 0
    endif
    do j=tLBde(2,lde), eLBde(2,lde)-1
      do i=tLBde(1,lde), eLBde(1,lde)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 1 for DE", localDeToDeMap(lde), &
            " on PET", localPet, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    ! verify section 2
    if (localDeToDeMap(lde) == 0) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = 0
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = 1
    endif
    do j=tLBde(2,lde), eLBde(2,lde)-1
      do i=eLBde(1,lde), eUBde(1,lde)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 2 for DE", localDeToDeMap(lde), &
            " on PET", localPet, i, j, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    ! verify section 3
    if (localDeToDeMap(lde) == 0) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = 1
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = localDeToDeMap(lde)
    endif
    do j=tLBde(2,lde), eLBde(2,lde)-1
      do i=eUBde(1,lde)+1, tUBde(1,lde)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 3 for DE", localDeToDeMap(lde), &
            " on PET", localPet, i, j, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    ! verify section 4
    if (localDeToDeMap(lde) == 0) then
      verifyValue = 1
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = 3
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = localDeToDeMap(lde)
    endif
    do j=eLBde(2,lde), eUBde(2,lde)
      do i=eUBde(1,lde)+1, tUBde(1,lde)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 4 for DE", localDeToDeMap(lde), &
            " on PET", localPet, i, j, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    ! verify section 5
    if (localDeToDeMap(lde) == 0) then
      verifyValue = 3
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = localDeToDeMap(lde)
    endif
    do j=eUBde(2,lde)+1, tUBde(2,lde)
      do i=eUBde(1,lde)+1, tUBde(1,lde)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 5 for DE", localDeToDeMap(lde), &
            " on PET", localPet, i, j, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    ! verify section 6
    if (localDeToDeMap(lde) == 0) then
      verifyValue = 2
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = 3
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = localDeToDeMap(lde)
    endif
    do j=eUBde(2,lde)+1, tUBde(2,lde)
      do i=eLBde(1,lde), eUBde(1,lde)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 6 for DE", localDeToDeMap(lde), &
            " on PET", localPet, i, j, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    ! verify section 7
    if (localDeToDeMap(lde) == 0) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = 2
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = localDeToDeMap(lde)
    endif
    do j=eUBde(2,lde)+1, tUBde(2,lde)
      do i=tLBde(1,lde), eLBde(1,lde)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 7 for DE", localDeToDeMap(lde), &
            " on PET", localPet, i, j, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    ! verify section 8
    if (localDeToDeMap(lde) == 0) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 1) then
      verifyValue = 0
    else if (localDeToDeMap(lde) == 2) then
      verifyValue = localDeToDeMap(lde)
    else if (localDeToDeMap(lde) == 3) then
      verifyValue = 2
    endif
    do j=eLBde(2,lde), eUBde(2,lde)
      do i=tLBde(1,lde), eLBde(1,lde)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong value in section 8 for DE", localDeToDeMap(lde), &
            " on PET", localPet, i, j, farrayPtr(i,j), verifyValue
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    
  enddo ! - local DE loop
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)

  deallocate (localDeToDeMap)
  deallocate (eLBde, eUBde, tLBde, tUBde)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "DELayout Destroy Test-2b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DELayoutDestroy(delayout, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------
! Test-3: 2D decomposition, overlapping halo regions, asymmetric haloDepth

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/2,2/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=2, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    totalLWidth=(/2,2/), totalUWidth=(/2,2/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    totalLBound=tLB, totalUBound=tUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 2 x 2 = 4 DEs. This means that each DE holds a 5 x 10 
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. There are, therefore,
! exactly one DE per PET.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 0    |  |       |  |     DE 2    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
!                    ^            \/             ^
!                    |            /\             |
!                    v                           v
!
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 1    |  |       |  |     DE 3    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
! Without the explicit definition of boundary conditions only the indicated
! inner connections define valid Halo paths for the Array object.
!------------------------------------------------------------------------

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  farrayPtr = localPet

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, &
    startregion=ESMF_STARTREGION_COMPUTATIONAL, &
    haloLDepth=(/0,1/), haloUDepth=(/2,3/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
  hLB(1,1) = max(eLB(1,1)-0, tLB(1,1))
  hLB(2,1) = max(eLB(2,1)-1, tLB(2,1))
  hUB(1,1) = min(eUB(1,1)+2, tUB(1,1))
  hUB(2,1) = min(eUB(2,1)+3, tUB(2,1)) 
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-3"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      if (farrayPtr(i,j) /= localPet) then
        verifyFlag = .false.
        print *, "Found wrong exclusive element"
        exit
      endif
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=hLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-3"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------
! Test-4: 2D decomposition, overlapping halo regions, asymmetric haloDepth
!         and use of startregion

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/2,2/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=2, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    computationalLWidth=(/1,1/), computationalUWidth=(/1,1/), &
    totalLWidth=(/2,2/), totalUWidth=(/2,2/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    computationalLBound=cLB, computationalUBound=cUB, &
    totalLBound=tLB, totalUBound=tUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 2 x 2 = 4 DEs. This means that each DE holds a 5 x 10 
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. There are, therefore,
! exactly one DE per PET.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 0    |  |       |  |     DE 2    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
!                    ^            \/             ^
!                    |            /\             |
!                    v                           v
!
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 1    |  |       |  |     DE 3    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
! Without the explicit definition of boundary conditions only the indicated
! inner connections define valid Halo paths for the Array object.
!------------------------------------------------------------------------

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  farrayPtr = localPet

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, &
    startregion=ESMF_STARTREGION_COMPUTATIONAL, &
    haloLDepth=(/0,1/), haloUDepth=(/2,3/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
  hLB(1,1) = max(cLB(1,1)-0, tLB(1,1))
  hLB(2,1) = max(cLB(2,1)-1, tLB(2,1))
  hUB(1,1) = min(cUB(1,1)+2, tUB(1,1))
  hUB(2,1) = min(cUB(2,1)+3, tUB(2,1)) 
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
! debugging ---------------  
!call ESMF_ArrayPrint(array)  
!print *, farrayPtr  
! debugging ---------------  

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-4"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      if (farrayPtr(i,j) /= localPet) then
        verifyFlag = .false.
        print *, "Found wrong exclusive element"
        exit
      endif
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), cLB(2,1)-1
      do i=hLB(1,1), cLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cLB(2,1), eLB(2,1)-1
      do i=cLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), cLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), cLB(2,1)-1
      do i=cUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, cUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=cUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, cUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cUB(2,1)+1, hUB(2,1)
      do i=cUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, cUB(2,1)
      do i=eUB(1,1)+1, cUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cUB(2,1)+1, hUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, cUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cUB(2,1)+1, hUB(2,1)
      do i=hLB(1,1), cLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, cUB(2,1)
      do i=cLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=hLB(1,1), cLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=cLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-4"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------
! Test-5: 2D decomposition with periodic boundary condition along 2nd dimension,
!         overlapping halo regions, asymmetric haloDepth and
!         use of startregion

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Connection Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  allocate(connectionList(1))  ! single connection
  call ESMF_DistGridConnectionSet(connection=connectionList(1), &
     tileIndexA=1, tileIndexB=1, &
     positionVector=(/0, 20/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/2,2/), connectionList=connectionList, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  deallocate(connectionList)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=2, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    computationalLWidth=(/1,1/), computationalUWidth=(/1,1/), &
    totalLWidth=(/2,2/), totalUWidth=(/2,2/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    computationalLBound=cLB, computationalUBound=cUB, &
    totalLBound=tLB, totalUBound=tUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 2 x 2 = 4 DEs. This means that each DE holds a 5 x 10 
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. There are, therefore,
! exactly one DE per PET.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
!             +-------------------+       +-------------------+
!             | \       2       / |       | \       2       / |
!             |  +-------------+  |       |  +-------------+  |
!             |  |     DE 0    |  |       |  |     DE 2    |  |
!             |  |             |  |       |  |             |  |
! periodic <- |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2| -> periodic
!             |  |             |  |       |  |             |  |
!             |  |             |  |       |  |             |  |
!             |  +-------------+  |       |  +-------------+  |
!             | /       2       \ |       | /       2       \ |
!             +-------------------+       +-------------------+
!
!                       ^            \/             ^
!                       |            /\             |
!                       v                           v
!
!             +-------------------+       +-------------------+
!             | \       2       / |       | \       2       / |
!             |  +-------------+  |       |  +-------------+  |
!             |  |     DE 1    |  |       |  |     DE 3    |  |
!             |  |             |  |       |  |             |  |
! periodic <- |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2| -> periodic
!             |  |             |  |       |  |             |  |
!             |  |             |  |       |  |             |  |
!             |  +-------------+  |       |  +-------------+  |
!             | /       2       \ |       | /       2       \ |
!             +-------------------+       +-------------------+
!
! Explicitly set outer connections and implicit inner connections in the 
! DistGrid define valid Halo paths for the Array object.
!------------------------------------------------------------------------

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  farrayPtr = localPet

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, &
    startregion=ESMF_STARTREGION_COMPUTATIONAL, &
    haloLDepth=(/0,1/), haloUDepth=(/2,3/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
  hLB(1,1) = max(cLB(1,1)-0, tLB(1,1))
  hLB(2,1) = max(cLB(2,1)-1, tLB(2,1))
  hUB(1,1) = min(cUB(1,1)+2, tUB(1,1))
  hUB(2,1) = min(cUB(2,1)+3, tUB(2,1)) 
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-5"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      if (farrayPtr(i,j) /= localPet) then
        verifyFlag = .false.
        print *, "Found wrong exclusive element"
        exit
      endif
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), cLB(2,1)-1
      do i=hLB(1,1), cLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cLB(2,1), eLB(2,1)-1
      do i=cLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 1"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), cLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 2"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), cLB(2,1)-1
      do i=cUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, cUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 3"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=cUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, cUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 4"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cUB(2,1)+1, hUB(2,1)
      do i=cUB(1,1)+1, hUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, cUB(2,1)
      do i=eUB(1,1)+1, cUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 5"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cUB(2,1)+1, hUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, cUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 6"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=cUB(2,1)+1, hUB(2,1)
      do i=hLB(1,1), cLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, cUB(2,1)
      do i=cLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 7"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong outside value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=hLB(1,1), cLB(1,1)-1
        if (farrayPtr(i,j) /= verifyValue) then
          verifyFlag = .false.
          print *, "Found wrong halo value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=cLB(1,1), eLB(1,1)-1
        if (farrayPtr(i,j) /= localPet) then
          verifyFlag = .false.
          print *, "Found wrong inside value in section 8"
          exit
        endif
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-5"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------
! Test-6: 2D decomposition, overlapping halo regions, asymmetric haloDepth,
!         Array with undistributed dimension (last dim, not compatible)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/2,2/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=3, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    totalLWidth=(/2,2/), totalUWidth=(/2,2/), &
    undistLBound=(/-3/), undistUBound=(/5/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    totalLBound=tLB, totalUBound=tUB, undistLBound=uLB, undistUBound=uUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 2 x 2 = 4 DEs. This means that each DE holds a 5 x 10 
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. There are, therefore,
! exactly one DE per PET.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 0    |  |       |  |     DE 2    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
!                    ^            \/             ^
!                    |            /\             |
!                    v                           v
!
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 1    |  |       |  |     DE 3    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
! Without the explicit definition of boundary conditions only the indicated
! inner connections define valid Halo paths for the Array object.
!------------------------------------------------------------------------

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr3d, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  do m=uLB(1), uUB(1)
    farrayPtr3d(:,:,m) = localPet + 10*m
  enddo

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, &
    startregion=ESMF_STARTREGION_COMPUTATIONAL, &
    haloLDepth=(/0,1/), haloUDepth=(/2,3/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
  hLB(1,1) = max(eLB(1,1)-0, tLB(1,1))
  hLB(2,1) = max(eLB(2,1)-1, tLB(2,1))
  hUB(1,1) = min(eUB(1,1)+2, tUB(1,1))
  hUB(2,1) = min(eUB(2,1)+3, tUB(2,1)) 
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
! debugging ---------------  
!call ESMF_ArrayPrint(array)  
!print *, farrayPtr  
! debugging ---------------  

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-6"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      do m=uLB(1), uUB(1)
        if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
          verifyFlag = .false.
          print *, "Found wrong exclusive element"
          exit
        endif
      enddo
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 1"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 1"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 2"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 2"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 3"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 3"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 4"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 4"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 5"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 5"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 6"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 6"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 7"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 7"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 8"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(i,j,m) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 8"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-6"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------
! Test-7: 2D decomposition, overlapping halo regions, asymmetric haloDepth,
!         Array with undistributed dimension (first dim, compatible)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Create Test-7"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  distgrid = ESMF_DistGridCreate(minIndex=(/1,1/), maxIndex=(/10,20/), &
    regDecomp=(/2,2/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
      
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArraySpec Set Test-7"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArraySpecSet(arrayspec, typekind=ESMF_TYPEKIND_I4, rank=3, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create Test-7a"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    distgridToArrayMap=(/2,3/), &
    undistLBound=(/-2/), undistUBound=(/5/), &
    totalLWidth=(/2,2/), totalUWidth=(/2,2/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-7a"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    totalLBound=tLB, totalUBound=tUB, undistLBound=uLB, undistUBound=uUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! The Array object is defined on a 10 x 20 index space which is regularily
! decomposed into 2 x 2 = 4 DEs. This means that each DE holds a 5 x 10 
! piece of the index space.
! The unit test is set up to run on exactly 4 PETs. There are, therefore,
! exactly one DE per PET.
! The Array further defines a computational width of 2 elements in each
! direction around the exclusive region. This area of 2 elements around
! the exclusive region provides the destination elements for Halo operations
! defined on the Array object.
! 
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 0    |  |       |  |     DE 2    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
!                    ^            \/             ^
!                    |            /\             |
!                    v                           v
!
!          +-------------------+       +-------------------+
!          | \       2       / |       | \       2       / |
!          |  +-------------+  |       |  +-------------+  |
!          |  |     DE 1    |  |       |  |     DE 3    |  |
!          |  |             |  |       |  |             |  |
!          |2 |    5 x 10   | 2|  <->  |2 |    5 x 10   | 2|
!          |  |             |  |       |  |             |  |
!          |  |             |  |       |  |             |  |
!          |  +-------------+  |       |  +-------------+  |
!          | /       2       \ |       | /       2       \ |
!          +-------------------+       +-------------------+
!
! Without the explicit definition of boundary conditions only the indicated
! inner connections define valid Halo paths for the Array object.
!------------------------------------------------------------------------

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-7a"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr3d, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  do m=uLB(1), uUB(1)
    farrayPtr3d(m,:,:) = localPet + 10*m
  enddo

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHaloStore Test-7"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloStore(array=array, routehandle=routehandle, &
    startregion=ESMF_STARTREGION_COMPUTATIONAL, &
    haloLDepth=(/0,1/), haloUDepth=(/2,3/), rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
  hLB(1,1) = max(eLB(1,1)-0, tLB(1,1))
  hLB(2,1) = max(eLB(2,1)-1, tLB(2,1))
  hUB(1,1) = min(eUB(1,1)+2, tUB(1,1))
  hUB(2,1) = min(eUB(2,1)+3, tUB(2,1)) 
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo Test-7a"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-7a"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      do m=uLB(1), uUB(1)
        if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
          verifyFlag = .false.
          print *, "Found wrong exclusive element"
          exit
        endif
      enddo
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 1", localPet, m, i, j, farrayPtr3d(m,i,j)
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 1"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 2"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 2"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 3"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 3"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 4"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 4"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 5"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 5"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 6"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 6"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 7"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 7"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 8"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 8"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-7a"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Create compatible Test-7b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  array = ESMF_ArrayCreate(arrayspec=arrayspec, distgrid=distgrid, &
    distgridToArrayMap=(/2,3/), &
    undistLBound=(/1/), undistUBound=(/15/), &
    totalLWidth=(/2,2/), totalUWidth=(/2,2/), rc=rc)

  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Get Test-7b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, exclusiveLBound=eLB, exclusiveUBound=eUB, &
    totalLBound=tLB, totalUBound=tUB, undistLBound=uLB, undistUBound=uUB, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Get farrayPtr from Array Test-7b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayGet(array, farrayPtr=farrayPtr3d, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
! Initialize the entire Array piece on every PET to the localPet number
!------------------------------------------------------------------------
  do m=uLB(1), uUB(1)
    farrayPtr3d(m,:,:) = localPet + 10*m
  enddo

  hLB(1,1) = max(eLB(1,1)-0, tLB(1,1))
  hLB(2,1) = max(eLB(2,1)-1, tLB(2,1))
  hUB(1,1) = min(eUB(1,1)+2, tUB(1,1))
  hUB(2,1) = min(eUB(2,1)+3, tUB(2,1)) 
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "ArrayHalo compatible Test-7b"
  write(failMsg, *) "Did not return ESMF_SUCCESS"
  call ESMF_ArrayHalo(array=array, routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Verify Array elements after Halo() Test-7b"
  write(failMsg, *) "Wrong results" 
  
  verifyFlag = .true. ! assume all is correct until error is found
  
  ! verify elements within exclusive region
  do j=eLB(2,1), eUB(2,1)
    do i=eLB(1,1), eUB(1,1)
      do m=uLB(1), uUB(1)
        if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
          verifyFlag = .false.
          print *, "Found wrong exclusive element"
          exit
        endif
      enddo
    enddo
    if (.not. verifyFlag) exit
  enddo
  
  ! verify all eight sections outside the exclusive region
  ! section 1 staring in NW corner and going counter clock wise
  ! verify section 1
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 0
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 1"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 1"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 2
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 0
  else if (localPet == 3) then
    verifyValue = 1
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 2"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 2"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 3
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 1
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=tLB(2,1), hLB(2,1)-1
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 3"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=hLB(2,1), eLB(2,1)-1
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 3"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 4
  if (localPet == 0) then
    verifyValue = 1
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = 3
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 4"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 4"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 5
  if (localPet == 0) then
    verifyValue = 3
  else if (localPet == 1) then
    verifyValue = localPet
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=hUB(1,1)+1, tUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 5"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eUB(1,1)+1, hUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 5"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 6
  if (localPet == 0) then
    verifyValue = 2
  else if (localPet == 1) then
    verifyValue = 3
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 6"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=eLB(1,1), eUB(1,1)
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 6"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 7
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 2
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = localPet
  endif
  if (verifyFlag) then
    do j=hUB(2,1)+1, tUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 7"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eUB(2,1)+1, hUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 7"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
  ! verify section 8
  if (localPet == 0) then
    verifyValue = localPet
  else if (localPet == 1) then
    verifyValue = 0
  else if (localPet == 2) then
    verifyValue = localPet
  else if (localPet == 3) then
    verifyValue = 2
  endif
  if (verifyFlag) then
    do j=eLB(2,1), eUB(2,1)
      do i=tLB(1,1), hLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= localPet + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong outside value in section 8"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
    do j=eLB(2,1), eUB(2,1)
      do i=hLB(1,1), eLB(1,1)-1
        do m=uLB(1), uUB(1)
          if (farrayPtr3d(m,i,j) /= verifyValue + 10*m) then
            verifyFlag = .false.
            print *, "Found wrong halo value in section 8"
            exit
          endif
        enddo
      enddo
      if (.not. verifyFlag) exit
    enddo
  endif
    
  call ESMF_Test(verifyFlag, name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Array Destroy Test-7b"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayDestroy(array, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
  
!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "routehandle Release Test-7"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_ArrayHaloRelease(routehandle=routehandle, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
  !NEX_UTest_Multi_Proc_Only
  write(name, *) "Distgrid Destroy Test-7"
  write(failMsg, *) "Did not return ESMF_SUCCESS" 
  call ESMF_DistGridDestroy(distGrid, rc=rc)
  call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)

!------------------------------------------------------------------------
!------------------------------------------------------------------------

10 continue
  !------------------------------------------------------------------------
  call ESMF_TestEnd(ESMF_SRCLINE) ! calls ESMF_Finalize() internally
  !------------------------------------------------------------------------


end program ESMF_ArrayHaloUTest