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
0 commit comments