Skip to content

Commit

Permalink
Add unit test of multi-tile I/O with both uneven DEs and ungridded dims
Browse files Browse the repository at this point in the history
  • Loading branch information
billsacks committed Sep 20, 2023
1 parent de95b14 commit 53a4ecb
Showing 1 changed file with 88 additions and 5 deletions.
93 changes: 88 additions & 5 deletions src/Infrastructure/IO/tests/ESMF_IO_MultitileUTest.F90
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ program ESMF_IO_MultitileUTest
! This field is not in the field bundle:
type(ESMF_Field) :: field3
real(ESMF_KIND_R8), pointer :: field3Data(:,:)
! This field is for tests with something other than 1 DE per PET:
type(ESMF_Field) :: field1UnevenDEs
! These fields are for tests with something other than 1 DE per PET:
type(ESMF_Field) :: field1UnevenDEs, field4dUnevenDEs
real(ESMF_KIND_R8), pointer :: field1UnevenDEsData(:,:)
real(ESMF_KIND_R8), pointer :: field4dUnevenDEsData(:,:,:,:)

! Fields used for reading:
!
Expand All @@ -74,9 +75,10 @@ program ESMF_IO_MultitileUTest
! This field is not in the field bundle:
type(ESMF_Field) :: field3Read
real(ESMF_KIND_R8), pointer :: field3ReadData(:,:)
! This field is for tests with something other than 1 DE per PET:
type(ESMF_Field) :: field1UnevenDEsRead
! These fields are for tests with something other than 1 DE per PET:
type(ESMF_Field) :: field1UnevenDEsRead, field4dUnevenDEsRead
real(ESMF_KIND_R8), pointer :: field1UnevenDEsReadData(:,:)
real(ESMF_KIND_R8), pointer :: field4dUnevenDEsReadData(:,:,:,:)

! This is used for error testing:
type(ESMF_Grid) :: gridSingleTile
Expand Down Expand Up @@ -399,6 +401,55 @@ program ESMF_IO_MultitileUTest
#endif
!------------------------------------------------------------------------

!------------------------------------------------------------------------
!EX_UTest_Multi_Proc_Only
write(name,*) "Write a multi-tile Field with uneven DEs per PET and ungridded dims"
write(failMsg, *) "Did not return ESMF_SUCCESS"
call ESMF_FieldWrite(field4dUnevenDEs, fileName=fileNameUnevenDEs, overwrite=.true., rc=rc)
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
#else
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
#endif
!------------------------------------------------------------------------

!------------------------------------------------------------------------
!EX_UTest_Multi_Proc_Only
write(name,*) "Read a multi-tile Field with uneven DEs per PET and ungridded dims"
write(failMsg, *) "Did not return ESMF_SUCCESS"
call ESMF_FieldRead(field4dUnevenDEsRead, fileName=fileNameUnevenDEs, rc=rc)
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
#else
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
#endif
!------------------------------------------------------------------------

!------------------------------------------------------------------------
!EX_UTest_Multi_Proc_Only
write(name,*) "Confirm that Field-read field matches original with uneven DEs per PET and ungridded dims"
write(failMsg, *) "Read-in field differs from original"
allEqual = .true.
do lde = 0, grid6tileUnevenDEsLdeCount - 1
! For simplicity, bail out if the following FieldGets fail rather than calling them their own unit test
call ESMF_FieldGet(field4dUnevenDEs, localDe=lde, farrayPtr=field4dUnevenDEsData, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_FieldGet(field4dUnevenDEsRead, localDe=lde, farrayPtr=field4dUnevenDEsReadData, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (.not. all(field4dUnevenDEsReadData == field4dUnevenDEsData)) then
allEqual = .false.
end if
end do
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
call ESMF_Test(allEqual, name, failMsg, result, ESMF_SRCLINE)
#else
write(failMsg, *) "Comparison did not fail as expected"
call ESMF_Test(.not. allEqual, name, failMsg, result, ESMF_SRCLINE)
#endif
!------------------------------------------------------------------------

#endif ! ESMF_TESTEXHAUSTIVE

!------------------------------------------------------------------------
Expand Down Expand Up @@ -537,7 +588,7 @@ subroutine createFields(rc)
if (rc /= ESMF_SUCCESS) return

!------------------------------------------------------------------------
! Set up a 6-tile grid with an uneven distribution of DEs to PETs, and create a field
! Set up a 6-tile grid with an uneven distribution of DEs to PETs, and create fields
! on this grid
!------------------------------------------------------------------------

Expand Down Expand Up @@ -574,6 +625,38 @@ subroutine createFields(rc)
if (rc /= ESMF_SUCCESS) return
! Note that we can't get farrayPtr here because we'll need to do that in a loop over DEs

field4dUnevenDEs = ESMF_FieldCreate(grid6tileUnevenDEs, arraySpec_w_ungridded, name="field4dUnevenDEs", &
ungriddedLBound=[2,15], ungriddedUBound=[4,18], &
! 2nd and 4th dimensions are ungridded dimensions
gridToFieldMap=[1,3], &
rc=rc)
if (rc /= ESMF_SUCCESS) return
do lde = 0, grid6tileUnevenDEsLdeCount-1
call ESMF_FieldGet(field4dUnevenDEs, localDe=lde, farrayPtr=field4dUnevenDEsData, rc=rc)
if (rc /= ESMF_SUCCESS) return
call ESMF_GridGetCoord(grid6tileUnevenDEs, coordDim=1, localDe=lde, farrayPtr=coordPtrX, rc=rc)
if (rc /= ESMF_SUCCESS) return
call ESMF_GridGetCoord(grid6tileUnevenDEs, coordDim=2, localDe=lde, farrayPtr=coordPtrY, rc=rc)
if (rc /= ESMF_SUCCESS) return
do u1 = 2,4
do u2 = 15,18
do i = lbound(field4dUnevenDEsData, 1), ubound(field4dUnevenDEsData, 1)
do j = lbound(field4dUnevenDEsData, 3), ubound(field4dUnevenDEsData, 3)
multiplier = 5.**(u2-15)
field4dUnevenDEsData(i,u1,j,u2) = u1*multiplier*(coordPtrX(i,j) - coordPtrY(i,j))
end do
end do
end do
end do
end do

field4dUnevenDEsRead = ESMF_FieldCreate(grid6tileUnevenDEs, arraySpec_w_ungridded, name="field4dUnevenDEs", &
ungriddedLBound=[2,15], ungriddedUBound=[4,18], &
! 2nd and 4th dimensions are ungridded dimensions
gridToFieldMap=[1,3], &
rc=rc)
if (rc /= ESMF_SUCCESS) return

end subroutine createFields

subroutine createSingleTileField(rc)
Expand Down

0 comments on commit 53a4ecb

Please sign in to comment.