Skip to content

Commit 7133ea3

Browse files
committed
Add Array IO unit tests that cover more types and run with mpiuni
The existing Array IO unit tests don't run with mpiuni. The main motivation for adding these is to add testing of I/O via PIO with mpiuni. I especially want to cover all data types to make sure that the mpiuni handling of different data types - and other I/O handling of different data types - is working correctly.
1 parent 2afdc55 commit 7133ea3

File tree

3 files changed

+296
-1
lines changed

3 files changed

+296
-1
lines changed
Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
! $Id$
2+
!
3+
! Earth System Modeling Framework
4+
! Copyright (c) 2002-2024, University Corporation for Atmospheric Research,
5+
! Massachusetts Institute of Technology, Geophysical Fluid Dynamics
6+
! Laboratory, University of Michigan, National Centers for Environmental
7+
! Prediction, Los Alamos National Laboratory, Argonne National Laboratory,
8+
! NASA Goddard Space Flight Center.
9+
! Licensed under the University of Illinois-NCSA License.
10+
!
11+
!==============================================================================
12+
!
13+
program ESMF_ArrayIOTypesUTest
14+
15+
!------------------------------------------------------------------------------
16+
17+
#include "ESMF.h"
18+
19+
!==============================================================================
20+
!BOP
21+
! !PROGRAM: ESMF_ArrayIOTypesUTest - Tests ArrayWrite() and ArrayRead() on available types
22+
!
23+
! !DESCRIPTION:
24+
! There are two purposes of this program that go beyond what's in ESMF_ArrayIOUTest:
25+
!
26+
! (1) This covers writing and reading additional data types
27+
!
28+
! (2) This works with mpiuni as well as with a real mpi library, and so adds more I/O coverage with mpiuni
29+
!
30+
!-----------------------------------------------------------------------------
31+
! !USES:
32+
use ESMF_TestMod ! test methods
33+
use ESMF
34+
35+
! -------------------------------------------------------------------------
36+
! -- The sole purpose of the netcdf/pnetcdf use statements is to trigger a
37+
! -- compile-time error in case the ESMF module above were to "leak" NetCDF
38+
! -- symbols.
39+
#if (defined ESMF_NETCDF)
40+
use netcdf, only: nf90_nowrite, nf90_noerr
41+
#elif (defined ESMF_PNETCDF)
42+
use pnetcdf, only: nf90_nowrite, nf90_noerr
43+
#endif
44+
! -------------------------------------------------------------------------
45+
46+
implicit none
47+
48+
!-------------------------------------------------------------------------
49+
!=========================================================================
50+
51+
! cumulative result: count failures; no failures equals "all pass"
52+
integer :: result = 0
53+
54+
! individual test failure message
55+
character(ESMF_MAXSTR) :: failMsg
56+
character(ESMF_MAXSTR) :: name
57+
58+
! local variables
59+
type(ESMF_VM):: vm
60+
integer :: rc
61+
integer :: localPet, petCount
62+
type(ESMF_DistGrid) :: distgrid
63+
type(ESMF_Array) :: arrayInt, arrayFloat, arrayDouble
64+
type(ESMF_Array) :: arrayIntRead, arrayFloatRead, arrayDoubleRead
65+
integer, pointer :: arrayIntData(:,:), arrayIntReadData(:,:)
66+
real(ESMF_KIND_R4), pointer :: arrayFloatData(:,:), arrayFloatReadData(:,:)
67+
real(ESMF_KIND_R8), pointer :: arrayDoubleData(:,:), arrayDoubleReadData(:,:)
68+
logical :: allEqual
69+
70+
character(len=*), parameter :: fileName = "ESMF_ArrayIOTypesUTest.nc"
71+
72+
!------------------------------------------------------------------------
73+
call ESMF_TestStart(ESMF_SRCLINE, rc=rc) ! calls ESMF_Initialize() internally
74+
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
75+
!------------------------------------------------------------------------
76+
77+
! Set up
78+
! *******
79+
call ESMF_VMGetGlobal(vm, rc=rc)
80+
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
81+
82+
call ESMF_VMGet(vm, localPet=localPet, petCount=petCount, rc=rc)
83+
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
84+
85+
!------------------------------------------------------------------------
86+
!NEX_UTest
87+
write(name, *) "Create Arrays"
88+
write(failMsg, *) "Did not return ESMF_SUCCESS"
89+
call createArrays(rc)
90+
call ESMF_Test((rc.eq.ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
91+
!------------------------------------------------------------------------
92+
93+
!------------------------------------------------------------------------
94+
!NEX_UTest
95+
write(name, *) "Write an I4 Array"
96+
write(failMsg, *) "Did not return ESMF_SUCCESS"
97+
call ESMF_ArrayWrite(arrayInt, fileName=fileName, overwrite=.true., rc=rc)
98+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
99+
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
100+
#else
101+
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
102+
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
103+
#endif
104+
!------------------------------------------------------------------------
105+
106+
!------------------------------------------------------------------------
107+
!NEX_UTest
108+
write(name, *) "Write an R4 Array"
109+
write(failMsg, *) "Did not return ESMF_SUCCESS"
110+
call ESMF_ArrayWrite(arrayFloat, fileName=fileName, overwrite=.true., rc=rc)
111+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
112+
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
113+
#else
114+
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
115+
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
116+
#endif
117+
!------------------------------------------------------------------------
118+
119+
!------------------------------------------------------------------------
120+
!NEX_UTest
121+
write(name, *) "Write an R8 Array"
122+
write(failMsg, *) "Did not return ESMF_SUCCESS"
123+
call ESMF_ArrayWrite(arrayDouble, fileName=fileName, overwrite=.true., rc=rc)
124+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
125+
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
126+
#else
127+
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
128+
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
129+
#endif
130+
!------------------------------------------------------------------------
131+
132+
!------------------------------------------------------------------------
133+
!NEX_UTest
134+
write(name, *) "Read an I4 Array"
135+
write(failMsg, *) "Did not return ESMF_SUCCESS"
136+
call ESMF_ArrayRead(arrayIntRead, fileName=fileName, rc=rc)
137+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
138+
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
139+
#else
140+
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
141+
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
142+
#endif
143+
!------------------------------------------------------------------------
144+
145+
!------------------------------------------------------------------------
146+
!NEX_UTest
147+
write(name, *) "Read an R4 Array"
148+
write(failMsg, *) "Did not return ESMF_SUCCESS"
149+
call ESMF_ArrayRead(arrayFloatRead, fileName=fileName, rc=rc)
150+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
151+
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
152+
#else
153+
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
154+
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
155+
#endif
156+
!------------------------------------------------------------------------
157+
158+
!------------------------------------------------------------------------
159+
!NEX_UTest
160+
write(name, *) "Read an R8 Array"
161+
write(failMsg, *) "Did not return ESMF_SUCCESS"
162+
call ESMF_ArrayRead(arrayDoubleRead, fileName=fileName, rc=rc)
163+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
164+
call ESMF_Test((rc == ESMF_SUCCESS), name, failMsg, result, ESMF_SRCLINE)
165+
#else
166+
write(failMsg, *) "Did not return ESMF_RC_LIB_NOT_PRESENT"
167+
call ESMF_Test((rc == ESMF_RC_LIB_NOT_PRESENT), name, failMsg, result, ESMF_SRCLINE)
168+
#endif
169+
!------------------------------------------------------------------------
170+
171+
!------------------------------------------------------------------------
172+
!NEX_UTest
173+
write(name, *) "Confirm that Array-read array matches original for I4 Array"
174+
write(failMsg, *) "Read-in array differs from original"
175+
allEqual = all(arrayIntReadData == arrayIntData)
176+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
177+
call ESMF_Test(allEqual, name, failMsg, result, ESMF_SRCLINE)
178+
#else
179+
write(failMsg, *) "Comparison did not fail as expected"
180+
call ESMF_Test(.not. allEqual, name, failMsg, result, ESMF_SRCLINE)
181+
#endif
182+
!------------------------------------------------------------------------
183+
184+
!------------------------------------------------------------------------
185+
!NEX_UTest
186+
write(name, *) "Confirm that Array-read array matches original for R4 Array"
187+
write(failMsg, *) "Read-in array differs from original"
188+
allEqual = all(arrayFloatReadData == arrayFloatData)
189+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
190+
call ESMF_Test(allEqual, name, failMsg, result, ESMF_SRCLINE)
191+
#else
192+
write(failMsg, *) "Comparison did not fail as expected"
193+
call ESMF_Test(.not. allEqual, name, failMsg, result, ESMF_SRCLINE)
194+
#endif
195+
!------------------------------------------------------------------------
196+
197+
!------------------------------------------------------------------------
198+
!NEX_UTest
199+
write(name, *) "Confirm that Array-read array matches original for R8 Array"
200+
write(failMsg, *) "Read-in array differs from original"
201+
allEqual = all(arrayDoubleReadData == arrayDoubleData)
202+
#if (defined ESMF_PIO && (defined ESMF_NETCDF || defined ESMF_PNETCDF))
203+
call ESMF_Test(allEqual, name, failMsg, result, ESMF_SRCLINE)
204+
#else
205+
write(failMsg, *) "Comparison did not fail as expected"
206+
call ESMF_Test(.not. allEqual, name, failMsg, result, ESMF_SRCLINE)
207+
#endif
208+
!------------------------------------------------------------------------
209+
210+
!------------------------------------------------------------------------
211+
call ESMF_TestEnd(ESMF_SRCLINE) ! calls ESMF_Finalize() internally
212+
!------------------------------------------------------------------------
213+
214+
contains
215+
216+
subroutine createArrays(rc)
217+
! Creates Arrays used by the tests used in this module
218+
integer, intent(out) :: rc
219+
220+
type(ESMF_ArraySpec) :: arraySpecInt
221+
type(ESMF_ArraySpec) :: arraySpecFloat
222+
type(ESMF_ArraySpec) :: arraySpecDouble
223+
integer :: i, j
224+
225+
distgrid = ESMF_DistGridCreate(minIndex=[1,1], maxIndex=[3*petCount,4], regDecomp=[petCount,1], rc=rc)
226+
if (rc /= ESMF_SUCCESS) return
227+
228+
call ESMF_ArraySpecSet(arraySpecInt, typekind=ESMF_TYPEKIND_I4, rank=2, rc=rc)
229+
if (rc /= ESMF_SUCCESS) return
230+
call ESMF_ArraySpecSet(arraySpecFloat, typekind=ESMF_TYPEKIND_R4, rank=2, rc=rc)
231+
if (rc /= ESMF_SUCCESS) return
232+
call ESMF_ArraySpecSet(arraySpecDouble, typekind=ESMF_TYPEKIND_R8, rank=2, rc=rc)
233+
if (rc /= ESMF_SUCCESS) return
234+
235+
arrayInt = ESMF_ArrayCreate(distgrid, arraySpecInt, name="arrayInt", rc=rc)
236+
if (rc /= ESMF_SUCCESS) return
237+
call ESMF_ArrayGet(arrayInt, farrayPtr=arrayIntData, rc=rc)
238+
if (rc /= ESMF_SUCCESS) return
239+
do j = 1, size(arrayIntData, 2)
240+
do i = 1, size(arrayIntData, 1)
241+
arrayIntData(i,j) = (localPet+1) * 17 * ((i-1)*size(arrayIntData,2) + (j-1))
242+
end do
243+
end do
244+
245+
arrayIntRead = ESMF_ArrayCreate(distgrid, arraySpecInt, name="arrayInt", rc=rc)
246+
if (rc /= ESMF_SUCCESS) return
247+
call ESMF_ArrayGet(arrayIntRead, farrayPtr=arrayIntReadData, rc=rc)
248+
if (rc /= ESMF_SUCCESS) return
249+
250+
arrayFloat = ESMF_ArrayCreate(distgrid, arraySpecFloat, name="arrayFloat", rc=rc)
251+
if (rc /= ESMF_SUCCESS) return
252+
call ESMF_ArrayGet(arrayFloat, farrayPtr=arrayFloatData, rc=rc)
253+
if (rc /= ESMF_SUCCESS) return
254+
do j = 1, size(arrayFloatData, 2)
255+
do i = 1, size(arrayFloatData, 1)
256+
arrayFloatData(i,j) = (localPet+1) * 27.0 * ((i-1)*size(arrayFloatData,2) + (j-1))
257+
end do
258+
end do
259+
260+
arrayFloatRead = ESMF_ArrayCreate(distgrid, arraySpecFloat, name="arrayFloat", rc=rc)
261+
if (rc /= ESMF_SUCCESS) return
262+
call ESMF_ArrayGet(arrayFloatRead, farrayPtr=arrayFloatReadData, rc=rc)
263+
if (rc /= ESMF_SUCCESS) return
264+
265+
arrayDouble = ESMF_ArrayCreate(distgrid, arraySpecDouble, name="arrayDouble", rc=rc)
266+
if (rc /= ESMF_SUCCESS) return
267+
call ESMF_ArrayGet(arrayDouble, farrayPtr=arrayDoubleData, rc=rc)
268+
if (rc /= ESMF_SUCCESS) return
269+
do j = 1, size(arrayDoubleData, 2)
270+
do i = 1, size(arrayDoubleData, 1)
271+
arrayDoubleData(i,j) = (localPet+1) * 37.0 * ((i-1)*size(arrayDoubleData,2) + (j-1))
272+
end do
273+
end do
274+
275+
arrayDoubleRead = ESMF_ArrayCreate(distgrid, arraySpecDouble, name="arrayDouble", rc=rc)
276+
if (rc /= ESMF_SUCCESS) return
277+
call ESMF_ArrayGet(arrayDoubleRead, farrayPtr=arrayDoubleReadData, rc=rc)
278+
if (rc /= ESMF_SUCCESS) return
279+
280+
end subroutine createArrays
281+
282+
end program ESMF_ArrayIOTypesUTest

src/Infrastructure/Array/tests/ESMF_ArrayIOUTest.F90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ program ESMF_ArrayIOUTest
1818

1919
!==============================================================================
2020
!BOP
21-
! !PROGRAM: ESMF_PIOArrayUTest - Tests ArrayWrite() and ArrayRead()
21+
! !PROGRAM: ESMF_ArrayIOUTest - Tests ArrayWrite() and ArrayRead()
2222
!
2323
! !DESCRIPTION:
2424
!

src/Infrastructure/Array/tests/makefile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ TESTS_BUILD = $(ESMF_TESTDIR)/ESMF_ArrayCreateGetUTest \
1111
$(ESMF_TESTDIR)/ESMF_ArrayDataUTest \
1212
$(ESMF_TESTDIR)/ESMF_ArrayScatterUTest \
1313
$(ESMF_TESTDIR)/ESMF_ArrayGatherUTest \
14+
$(ESMF_TESTDIR)/ESMF_ArrayIOTypesUTest \
1415
$(ESMF_TESTDIR)/ESMF_ArrayIOUTest \
1516
$(ESMF_TESTDIR)/ESMF_ArraySMMUTest \
1617
$(ESMF_TESTDIR)/ESMF_ArraySMMFromFileUTest \
@@ -24,6 +25,7 @@ TESTS_RUN = RUN_ESMF_ArrayCreateGetUTest \
2425
RUN_ESMF_ArrayDataUTest \
2526
RUN_ESMF_ArrayScatterUTest \
2627
RUN_ESMF_ArrayGatherUTest \
28+
RUN_ESMF_ArrayIOTypesUTest \
2729
RUN_ESMF_ArrayIOUTest \
2830
RUN_ESMF_ArraySMMUTest \
2931
RUN_ESMF_ArraySMMFromFileUTest \
@@ -34,6 +36,7 @@ TESTS_RUN = RUN_ESMF_ArrayCreateGetUTest \
3436
RUN_ESMC_ArrayUTest
3537

3638
TESTS_RUN_UNI = RUN_ESMF_ArrayDataUTestUNI \
39+
RUN_ESMF_ArrayIOTypesUTestUNI \
3740
RUN_ESMF_ArraySMMUTestUNI \
3841
RUN_ESMF_ArraySMMFromFileUTestUNI \
3942
RUN_ESMC_ArrayUTestUNI
@@ -85,6 +88,16 @@ RUN_ESMF_ArrayGatherUTest:
8588

8689
# ---
8790

91+
RUN_ESMF_ArrayIOTypesUTest:
92+
rm -f $(ESMF_TESTDIR)/ESMF_ArrayIOTypesUTest.nc
93+
$(MAKE) TNAME=ArrayIOTypes NP=4 ftest
94+
95+
RUN_ESMF_ArrayIOTypesUTestUNI:
96+
rm -f $(ESMF_TESTDIR)/ESMF_ArrayIOTypesUTest.nc
97+
$(MAKE) TNAME=ArrayIOTypes NP=1 ftest
98+
99+
# ---
100+
88101
RUN_ESMF_ArrayIOUTest:
89102
$(MAKE) TNAME=ArrayIO NP=6 ftest
90103

0 commit comments

Comments
 (0)