DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
test_basic.py
Go to the documentation of this file.
1from DNDSR import DNDS
2
3import numpy as np
4import pytest
5from numpy.random import MT19937
6from numpy.random import RandomState, SeedSequence
7
8
10 arrayRU = DNDS.Array_d_I_I_N()
11 rsize = np.linspace(3, 10, 32, dtype=np.int32)
12 arrayRU.Resize(32, rsize)
13 arrayRU_rstart = arrayRU.getRowStart()
14 del arrayRU
15 return (
16 arrayRU_rstart,
17 np.concatenate((np.array([0]), rsize.cumsum())),
18 )
19
20
21def test_all_reduce_scalar(mpi: DNDS.MPIInfo):
22 scalarBuf = np.zeros((), dtype=np.int64)
23 DNDS.MPI.Allreduce(np.array(1, dtype=np.int64), scalarBuf, "MPI_SUM", mpi) # type: ignore
24 # print(f"reduced scalar {scalarBuf}")
25 assert scalarBuf == mpi.size
26
27
28def test_array_trans(mpi: DNDS.MPIInfo, mode: str = "global"):
29 arrayR3 = DNDS.ParArray("d", 3, init_args=(mpi,))
30 if mpi.rank == 0:
31 print(f"arrayR3 is {type(arrayR3)}")
32 print(arrayR3.getRowStart().shape)
33 arrayR3.Resize(100)
34 d = arrayR3.data()
35 np.array(d, copy=False)[:] = 1.335
36
37 arrayR3son = DNDS.ParArray("d", 3, init_args=(mpi,))
38 arrayR3Trans = DNDS.ArrayTransformer("d", 3)
39 arrayR3Trans.setFatherSon(arrayR3, arrayR3son)
40 arrayR3Trans.createFatherGlobalMapping()
41 global_size = arrayR3.getLGlobalMapping().globalSize()
42 pullIdx = range(global_size)
43 if mode == "left":
44 pullIdx = np.array([0, 1, 2, 3], dtype=np.int64)
45 rank_pull = (mpi.rank - 1) % mpi.size
46 np.vectorize(lambda x: arrayR3.getLGlobalMapping()(rank_pull, x))(pullIdx)
47
48 arrayR3Trans.createGhostMapping(pullIdx)
49 arrayR3Trans.createMPITypes()
50 arrayR3Trans.pullOnce()
51 if mpi.rank == 0:
52 print(f"arrayR3son.size is {arrayR3son.Size()}")
53 assert arrayR3son.Size() == len(pullIdx)
54 assert np.all(np.array(arrayR3son.data()) == 1.335)
55
56 arrayR3son_1 = DNDS.ParArray("d", 3, init_args=(mpi,))
57 arrayR3Trans_1 = DNDS.ArrayTransformer("d", 3)
58 arrayR3Trans_1.setFatherSon(arrayR3, arrayR3son_1)
59 arrayR3Trans_1.BorrowGGIndexing(arrayR3Trans)
60 arrayR3Trans_1.createMPITypes()
61 arrayR3Trans_1.pullOnce()
62
63 assert arrayR3son_1.Size() == len(pullIdx)
64 assert np.all(np.array(arrayR3son_1.data()) == 1.335)
65
66
67def test_ParArrayPair(mpi: DNDS.MPIInfo):
68 arrayIIPair = DNDS.ParArrayPair("q", "I")
69 #!todo: check null status
70 arrayIIPair.father = DNDS.ParArray("q", "I", init_args=(mpi,))
71 arrayIIPair.son = DNDS.ParArray("q", "I", init_args=(mpi,))
72 arrayIIPair.TransAttach()
73 arrayIIPair.father.Resize(44)
74 for iRow in range(arrayIIPair.father.Size()):
75 arrayIIPair.father.ResizeRow(iRow, iRow % 4 + 2)
76 for j in range(arrayIIPair.father.Rowsize(iRow)):
77 arrayIIPair.father[iRow, j] = 123123
78 arrayIIPair.father.Compress()
79 arrayIIPair.trans.createFatherGlobalMapping()
80 global_size = arrayIIPair.trans.LGlobalMapping.globalSize()
81 pullIdx = range(global_size)
82 arrayIIPair.trans.createGhostMapping(pullIdx)
83 arrayIIPair.trans.createMPITypes()
84 arrayIIPair.trans.pullOnce()
85 assert arrayIIPair.son.Size() == len(pullIdx)
86 assert (np.array(arrayIIPair.son.data()) == 123123).all()
87
88
89def test_arrayRU(mpi: DNDS.MPIInfo):
90 arrayRU = DNDS.Array_d_I_I_N()
91
92 rsize = np.linspace(3, 10, 32, dtype=np.int32)
93 arrayRU.Resize(32, rsize)
94
95 # print(arrayRU.Size())
96 assert not (np.diff(np.array(arrayRU.getRowStart())) - rsize).any()
97
98 for i in range(arrayRU.Size()):
99 for j in range(arrayRU.Rowsize(i)):
100 arrayRU[i, j] = i + j
101 arrayRUdata = np.array(arrayRU.data(), copy=False)
102 arrayRUdata += 1
103 if mpi.rank == 0:
104 print(arrayRUdata.shape)
105 for i in range(arrayRU.Size()):
106 for j in range(arrayRU.Rowsize(i)):
107 assert arrayRU[i, j] == i + j + 1
108
109 (arrayRU_rstart_ret, gt) = get_rstart_data()
110 assert not np.any(
111 gt - arrayRU_rstart_ret
112 ) # to see if there is memory corruption on this
113 if mpi.rank == 0:
114 print(arrayRU_rstart_ret.shape)
115 arrayRU_rstart_ret_np = np.array(arrayRU_rstart_ret, copy=False)
116 del arrayRU_rstart_ret
117 if mpi.rank == 0:
118 print(
119 f"if corrupted: { np.any(gt - arrayRU_rstart_ret_np)}"
120 ) # should be corrupted
121
122
123def test_adj(mpi: DNDS.MPIInfo):
124 adj = DNDS.ArrayAdjacency("I", init_args=(mpi,))
125 adj.Resize(100)
126 for irow in range(adj.Size()):
127 adj.ResizeRow(irow, irow % 3 + 1)
128 rowdata = np.array(adj[irow], copy=False)
129 rowdata[:] = 3343
130 adj.Compress()
131 if mpi.rank == 0:
132 assert not np.any(np.array(adj.data()) - 3343)
133
134 adj_son = DNDS.ArrayAdjacency("I", init_args=(mpi,))
135 transT = adj.getTrans() # automatic transformer type get
136 adj_trans = transT()
137 adj_trans.setFatherSon(adj, adj_son)
138 adj_trans.createFatherGlobalMapping()
139 gsize = adj_trans.LGlobalMapping.globalSize()
140 pullIdx = range(gsize)
141 adj_trans.createGhostMapping(pullIdx)
142 adj_trans.createMPITypes()
143 adj_trans.pullOnce()
144 assert adj_son.Size() == len(pullIdx)
145 assert np.all(np.array(adj_son.data()) == 3343)
146
147
148def test_ArrayEigenVector(mpi: DNDS.MPIInfo):
149 arr = DNDS.ArrayEigenVector("D", init_args=(mpi,))
150 arr_son = DNDS.ArrayEigenVector("D", init_args=(mpi,))
151 arr.Resize(123, 5)
152 val0 = np.array([1, 4, 5, 1, 3.2], dtype=np.float64)
153 for irow in range(arr.Size()):
154 arr[irow] = val0
155
156 arrTrans = DNDS.ArrayTransformerFromParArray(arr)
157 arrTrans.setFatherSon(arr, arr_son)
158 arrTrans.createFatherGlobalMapping()
159 gsize = arrTrans.LGlobalMapping.globalSize()
160 pullIdx = range(gsize)
161 arrTrans.createGhostMapping(pullIdx)
162 arrTrans.createMPITypes()
163 arrTrans.pullOnce()
164
165 assert arr_son.Size() == len(pullIdx)
166 for irow in range(arr_son.Size()):
167 assert (np.array(arr_son[irow]) == val0).all()
168
169
170def test_ArrayEigenMatrix(mpi: DNDS.MPIInfo):
171 arr = DNDS.ArrayEigenMatrix(3, 4, init_args=(mpi,))
172 arr_son = DNDS.ArrayEigenMatrix(3, 4, init_args=(mpi,))
173 arr.Resize(30, 3, 4)
174 mat0 = np.eye(3, 4, dtype=np.float64)
175 for irow in range(arr.Size()):
176 arr[irow] = mat0
177
178 arrTrans = DNDS.ArrayTransformerFromParArray(arr)
179 arrTrans.setFatherSon(arr, arr_son)
180 arrTrans.createFatherGlobalMapping()
181 gsize = arrTrans.LGlobalMapping.globalSize()
182 pullIdx = range(gsize)
183 arrTrans.createGhostMapping(pullIdx)
184 arrTrans.createMPITypes()
185 arrTrans.pullOnce()
186 assert arr_son.Size() == len(pullIdx)
187 for irow in range(arr_son.Size()):
188 assert (np.array(arr_son[irow]) == mat0).all()
189
190
191def test_ArrayEigenMatrixBatch(mpi: DNDS.MPIInfo):
193 arr_son = DNDS.ArrayEigenMatrixBatch(mpi)
194 arr.Resize(32)
195
196 rs = RandomState(MT19937(SeedSequence(123456789)))
197 val0 = rs.rand(4, 5)
198 val1 = rs.rand(2, 6)
199 val2 = rs.rand(65535, 1)
200 rowList = [val0, val1, val2]
201
202 for irow in range(arr.Size()):
203 rowSiz = irow % 3 + 1
204 arr.InitializeWriteRow(irow, rowList[0:rowSiz])
205 arr.Compress()
206
207 arrTrans = DNDS.ArrayTransformerFromParArray(arr)
208 arrTrans.setFatherSon(arr, arr_son)
209 arrTrans.createFatherGlobalMapping()
210 gsize = arrTrans.LGlobalMapping.globalSize()
211 pullIdx = range(gsize)
212 arrTrans.createGhostMapping(pullIdx)
213 arrTrans.createMPITypes()
214 arrTrans.pullOnce()
215
216 assert arr_son.Size() == len(pullIdx)
217 for irow in range(arr_son.Size()):
218 for iMat in range(arr_son.BatchSize(irow)):
219 assert (np.array(arr_son[irow, iMat]) == rowList[iMat]).all()
220 # print(np.array(arr_son[irow, iMat]).tolist())
221
222
223def test_ArrayEigenUniMatrixBatch(mpi: DNDS.MPIInfo):
224 arr = DNDS.ArrayEigenUniMatrixBatch("D", "D", (mpi,))
225 arr_son = DNDS.ArrayEigenUniMatrixBatch("D", "D", (mpi,))
226 arr.Resize(32, 4, 5)
227 arr_son.Resize(0, 4, 5) #! warning: trans does not automatically do this for now!
228 rs = RandomState(MT19937(SeedSequence(123456789)))
229 val0 = rs.rand(4, 5)
230
231 for irow in range(arr.Size()):
232 arr.ResizeRow(irow, irow % 3 + 1)
233 cDat = np.concatenate((val0.reshape((1, 4, 5)),) * arr.BatchSize(irow), axis=0)
234 arr[irow] = cDat
235 arr.Compress()
236
237 arrTrans = DNDS.ArrayTransformerFromParArray(arr)
238 arrTrans.setFatherSon(arr, arr_son)
239 arrTrans.createFatherGlobalMapping()
240 gsize = arrTrans.LGlobalMapping.globalSize()
241 pullIdx = range(gsize)
242 arrTrans.createGhostMapping(pullIdx)
243 arrTrans.createMPITypes()
244 arrTrans.pullOnce()
245
246 assert arr_son.Size() == len(pullIdx)
247
248 # print(arr_son.data().tolist())
249 # print(arr_son.msize)
250 # print(arr_son.BatchSize(0))
251 for irow in range(arr_son.Size()):
252 for iMat in range(arr_son.BatchSize(irow)):
253 assert (np.array(arr_son[irow, iMat]) == val0).all()
254 # print(np.array(arr_son[irow, iMat]).tolist())
255
256
257if __name__ == "__main__":
258 import sys
259
260 # print(sys.argv)
262 mpiC.setWorld()
263
264 if mpiC.rank == 0:
265 print(f"is debugged == {DNDS.Debug.IsDebugged()}")
266
268 test_array_trans(mpiC)
269 test_array_trans(mpiC, mode="left")
271 test_arrayRU(mpiC)
272 test_adj(mpiC)
277
278 print(f"{mpiC.rank} / {mpiC.size}, {mpiC.comm():x}")
Mesh-connectivity array: ParArray<index> whose operator[] yields an AdjacencyRow typed view.
CSR array storing a variable-sized batch of Eigen matrices per row.
ParArray<real> whose operator[] returns an Eigen::Map<Matrix<real, Ni, Nj>>.
CSR array whose rows store a batch of identically-sized Eigen matrices.
ParArray<real, N> whose operator[] returns an Eigen::Map<Vector>.
Ghost-communication engine for a father / son ParArray pair.
MPI-aware Array: adds a communicator, rank, and global index mapping.
MPI_int Allreduce(const void *sendbuf, void *recvbuf, MPI_int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
Wrapper over MPI_Allreduce.
Definition MPI.cpp:203
test_arrayRU(DNDS.MPIInfo mpi)
Definition test_basic.py:89
test_adj(DNDS.MPIInfo mpi)
test_ArrayEigenMatrix(DNDS.MPIInfo mpi)
test_ArrayEigenUniMatrixBatch(DNDS.MPIInfo mpi)
test_ArrayEigenVector(DNDS.MPIInfo mpi)
test_ParArrayPair(DNDS.MPIInfo mpi)
Definition test_basic.py:67
test_ArrayEigenMatrixBatch(DNDS.MPIInfo mpi)
get_rstart_data()
Definition test_basic.py:9
test_array_trans(DNDS.MPIInfo mpi, str mode="global")
Definition test_basic.py:28
test_all_reduce_scalar(DNDS.MPIInfo mpi)
Definition test_basic.py:21
Lightweight bundle of an MPI communicator and the calling rank's coordinates.
Definition MPI.hpp:215
for(DNDS::index i=0;i< nLocal;i++) for(DNDS j< dynCols;j++)(*father)(i, j)=(gOff+i) *0.1+j *0.001;DNDS::index gSize=father-> globalSize()