1 | #!/usr/bin/env python |
---|
2 | |
---|
3 | def swap_domain(domain, i, j, k): |
---|
4 | """Swap information of two mesh entities. |
---|
5 | |
---|
6 | This is used to ensure the calculation sequence in parallel. |
---|
7 | """ |
---|
8 | |
---|
9 | neighbours = domain.neighbours[i] |
---|
10 | |
---|
11 | s_neighbours = domain.surrogate_neighbours[i] |
---|
12 | normals = domain.normals[i] |
---|
13 | edgelengths = domain.edgelengths[i] |
---|
14 | |
---|
15 | vertex_coordinates = domain.vertex_coordinates |
---|
16 | edge_coordinates = domain.edge_coordinates |
---|
17 | |
---|
18 | |
---|
19 | stage_edge_values = domain.quantities['stage'].edge_values[i] |
---|
20 | xmom_edge_values = domain.quantities['xmomentum'].edge_values[i] |
---|
21 | ymom_edge_values = domain.quantities['ymomentum'].edge_values[i] |
---|
22 | bed_edge_values = domain.quantities['elevation'].edge_values[i] |
---|
23 | |
---|
24 | stage_vertex_values = domain.quantities['stage'].vertex_values[i] |
---|
25 | xmom_vertex_values = domain.quantities['xmomentum'].vertex_values[i] |
---|
26 | ymom_vertex_values = domain.quantities['ymomentum'].vertex_values[i] |
---|
27 | bed_vertex_values = domain.quantities['elevation'].vertex_values[i] |
---|
28 | |
---|
29 | |
---|
30 | neighbours[j], neighbours[k] = neighbours[k], neighbours[j] |
---|
31 | |
---|
32 | s_neighbours[j], s_neighbours[k] = s_neighbours[k], s_neighbours[j] |
---|
33 | |
---|
34 | normals[j*2], normals[k*2] = normals[k*2], normals[j*2] |
---|
35 | |
---|
36 | normals[j*2+1], normals[k*2+1] = normals[k*2+1], normals[j*2+1] |
---|
37 | |
---|
38 | edgelengths[j], edgelengths[k] = edgelengths[k], edgelengths[j] |
---|
39 | |
---|
40 | vertex_coordinates[i*3+j][0], vertex_coordinates[i*3+k][0] = vertex_coordinates[i*3+k][0], vertex_coordinates[i*3+j][0] |
---|
41 | vertex_coordinates[i*3+j][1], vertex_coordinates[i*3+k][1] = vertex_coordinates[i*3+k][1], vertex_coordinates[i*3+j][1] |
---|
42 | |
---|
43 | edge_coordinates[i*3+j][0], edge_coordinates[i*3+k][0] = edge_coordinates[i*3+k][0], edge_coordinates[i*3+j][0] |
---|
44 | edge_coordinates[i*3+j][1], edge_coordinates[i*3+k][1] = edge_coordinates[i*3+k][1], edge_coordinates[i*3+j][1] |
---|
45 | |
---|
46 | stage_edge_values[j], stage_edge_values[k] = stage_edge_values[k], stage_edge_values[j] |
---|
47 | xmom_edge_values[j], xmom_edge_values[k] = xmom_edge_values[k], xmom_edge_values[j] |
---|
48 | ymom_edge_values[j], ymom_edge_values[k] = ymom_edge_values[k], ymom_edge_values[j] |
---|
49 | bed_edge_values[j], bed_edge_values[k] = bed_edge_values[k], bed_edge_values[j] |
---|
50 | |
---|
51 | stage_vertex_values[j], stage_vertex_values[k] = stage_vertex_values[k], stage_vertex_values[j] |
---|
52 | xmom_vertex_values[j], xmom_vertex_values[k] = xmom_vertex_values[k], xmom_vertex_values[j] |
---|
53 | ymom_vertex_values[j], ymom_vertex_values[k] = ymom_vertex_values[k], ymom_vertex_values[j] |
---|
54 | bed_vertex_values[j], bed_vertex_values[k] = bed_vertex_values[k], bed_vertex_values[j] |
---|
55 | |
---|
56 | |
---|
57 | |
---|
58 | def sort_domain(domain): |
---|
59 | """Sort the neighbour order of mesh entities |
---|
60 | |
---|
61 | This is used to ensure the calculation sequence in paralle as same as |
---|
62 | that in sequential |
---|
63 | """ |
---|
64 | |
---|
65 | for i in range(domain.number_of_elements): |
---|
66 | |
---|
67 | neighbours = domain.neighbours[i] |
---|
68 | |
---|
69 | if neighbours[2]>=0 and neighbours[2] < i and \ |
---|
70 | (neighbours[1]<0 or neighbours[2]<neighbours[1]): |
---|
71 | swap_domain(domain, i, 2, 1) |
---|
72 | |
---|
73 | if neighbours[1]>=0 and neighbours[1]<i and \ |
---|
74 | (neighbours[0]<0 or neighbours[1]<neighbours[0]): |
---|
75 | swap_domain(domain, i, 0, 1) |
---|
76 | |
---|
77 | if neighbours[2]>=0 and neighbours[2]<i and \ |
---|
78 | (neighbours[1]<0 or neighbours[2]<neighbours[1]): |
---|
79 | swap_domain(domain, i, 2, 1) |
---|
80 | |
---|
81 | |
---|
82 | for i in range(domain.number_of_elements): |
---|
83 | n1, n2, n3 = domain.neighbours[i] |
---|
84 | |
---|
85 | for index in range(3): |
---|
86 | if domain.neighbours[n1][index] == i: |
---|
87 | domain.neighbour_edges[n1][index] = 0 |
---|
88 | if domain.neighbours[n2][index] == i: |
---|
89 | domain.neighbour_edges[n2][index] = 1 |
---|
90 | if domain.neighbours[n3][index] == i: |
---|
91 | domain.neighbour_edges[n3][index] = 2 |
---|
92 | |
---|
93 | |
---|
94 | |
---|
95 | def sort_domain_check(domain2): |
---|
96 | """Check the sorted domain information.""" |
---|
97 | |
---|
98 | from anuga_cuda.merimbula_data.generate_domain import domain_create |
---|
99 | |
---|
100 | domain1 = domain_create() |
---|
101 | |
---|
102 | for k in range(domain1.number_of_elements): |
---|
103 | b = [0,1,2] |
---|
104 | spe_bubble_sort(b, domain1.neighbours[k], k) |
---|
105 | for i in range(3): |
---|
106 | if domain1.neighbours[k][b[i]] != domain2.neighbours[k][i]: |
---|
107 | print "###### tri: %ld, edge: %d - %d " % (k, b[i], i) |
---|
108 | continue |
---|
109 | |
---|
110 | if domain1.surrogate_neighbours[k][ b[i] ] != domain2.surrogate_neighbours[k][i]: |
---|
111 | print "tri: %ld, edge: %d - %d @ surrogate_neighbours " % (k, b[i], i) |
---|
112 | |
---|
113 | if domain1.normals[k][ b[i]*2] != domain2.normals[k][i*2] or\ |
---|
114 | domain1.normals[k][ b[i]*2+1] != domain2.normals[k][i*2+1]: |
---|
115 | print "tri: %ld, edge: %ld - %d @ normals " % (k, b[i], i) |
---|
116 | |
---|
117 | if domain1.edgelengths[k][ b[i] ] != domain2.edgelengths[k][i]: |
---|
118 | print "tri: %ld, edge: %ld - %d @ edgelengths " % (k, b[i], i) |
---|
119 | |
---|
120 | |
---|
121 | if domain1.vertex_coordinates[k*3+b[i]][0] != domain2.vertex_coordinates[k*3+i][0] or\ |
---|
122 | domain1.vertex_coordinates[k*3+b[i]][1] != domain2.vertex_coordinates[k*3+i][1]: |
---|
123 | print "tri: %ld, edge: %ld - %d @ vertex_coordinates " % (k, b[i], i) |
---|
124 | |
---|
125 | if domain1.edge_coordinates[k*3+b[i]][0] != domain2.edge_coordinates[k*3+i][0] or\ |
---|
126 | domain1.edge_coordinates[k*3+b[i]][1] != domain2.edge_coordinates[k*3+i][1]: |
---|
127 | print "tri: %ld, edge: %ld - %d @ edge_coordinates " % (k, b[i], i) |
---|
128 | |
---|
129 | |
---|
130 | if domain1.quantities['stage'].edge_values[k][ b[i] ] != \ |
---|
131 | domain2.quantities['stage'].edge_values[k][i]: |
---|
132 | print "tri: %ld, edge: %ld - %d @ stage_edge_values " % (k, b[i], i) |
---|
133 | |
---|
134 | if domain1.quantities['xmomentum'].edge_values[k][ b[i] ] != \ |
---|
135 | domain2.quantities['xmomentum'].edge_values[k][i]: |
---|
136 | print "tri: %ld, edge: %ld - %d @ xmom_edge_values " % (k, b[i], i) |
---|
137 | |
---|
138 | if domain1.quantities['ymomentum'].edge_values[k][ b[i] ] != \ |
---|
139 | domain2.quantities['ymomentum'].edge_values[k][i]: |
---|
140 | print "tri: %ld, edge: %ld - %d @ ymom_edge_values " % (k, b[i], i) |
---|
141 | |
---|
142 | if domain1.quantities['elevation'].edge_values[k][ b[i] ] != \ |
---|
143 | domain2.quantities['elevation'].edge_values[k][i]: |
---|
144 | print "tri: %ld, edge: %ld - %d @ bed_edge_values " % (k, b[i], i) |
---|
145 | |
---|
146 | |
---|
147 | if domain1.quantities['stage'].vertex_values[k][ b[i] ] != \ |
---|
148 | domain2.quantities['stage'].vertex_values[k][i]: |
---|
149 | print "tri: %ld, vertex: %ld - %d @ stage_vertex_values " % (k, b[i], i) |
---|
150 | |
---|
151 | if domain1.quantities['xmomentum'].vertex_values[k][ b[i] ] != \ |
---|
152 | domain2.quantities['xmomentum'].vertex_values[k][i]: |
---|
153 | print "tri: %ld, vertex: %ld - %d @ xmom_vertex_values " % (k, b[i], i) |
---|
154 | |
---|
155 | if domain1.quantities['ymomentum'].vertex_values[k][ b[i] ] != \ |
---|
156 | domain2.quantities['ymomentum'].vertex_values[k][i]: |
---|
157 | print "tri: %ld, vertex: %ld - %d @ ymom_vertex_values " % (k, b[i], i) |
---|
158 | |
---|
159 | if domain1.quantities['elevation'].vertex_values[k][ b[i] ] != \ |
---|
160 | domain2.quantities['elevation'].vertex_values[k][i]: |
---|
161 | print "tri: %ld, vertex: %ld - %d @ bed_vertex_values " % (k, b[i], i) |
---|
162 | |
---|
163 | |
---|
164 | |
---|
165 | def rearrange_domain(domain, sort_flag=True, spare_domain=None): |
---|
166 | """Rearrange the mesh information stored in memory. |
---|
167 | |
---|
168 | This will help to better meet the requirements of coalesced memory |
---|
169 | access. |
---|
170 | """ |
---|
171 | |
---|
172 | import copy |
---|
173 | |
---|
174 | if spare_domain == None: |
---|
175 | new_dom = copy.deepcopy(domain) |
---|
176 | |
---|
177 | if sort_flag: |
---|
178 | sort_domain(new_dom) |
---|
179 | temp_dom = copy.deepcopy(new_dom) |
---|
180 | else: |
---|
181 | temp_dom = domain |
---|
182 | else: |
---|
183 | new_dom = domain |
---|
184 | temp_dom = spare_domain |
---|
185 | |
---|
186 | N = new_dom.number_of_elements |
---|
187 | |
---|
188 | neighbours = new_dom.neighbours |
---|
189 | neighbour_edges = new_dom.neighbour_edges |
---|
190 | surrogate_neighbours = new_dom.surrogate_neighbours |
---|
191 | normals = new_dom.normals |
---|
192 | edgelengths = new_dom.edgelengths |
---|
193 | |
---|
194 | vertex_coordinates = new_dom.vertex_coordinates |
---|
195 | edge_coordinates = new_dom.edge_coordinates |
---|
196 | centroid_coordinates = new_dom.centroid_coordinates |
---|
197 | |
---|
198 | |
---|
199 | stage_edge_values = new_dom.quantities['stage'].edge_values |
---|
200 | xmom_edge_values = new_dom.quantities['xmomentum'].edge_values |
---|
201 | ymom_edge_values = new_dom.quantities['ymomentum'].edge_values |
---|
202 | bed_edge_values = new_dom.quantities['elevation'].edge_values |
---|
203 | |
---|
204 | stage_vertex_values = new_dom.quantities['stage'].vertex_values |
---|
205 | xmom_vertex_values = new_dom.quantities['xmomentum'].vertex_values |
---|
206 | ymom_vertex_values = new_dom.quantities['ymomentum'].vertex_values |
---|
207 | bed_vertex_values = new_dom.quantities['elevation'].vertex_values |
---|
208 | |
---|
209 | |
---|
210 | for i in range(N): |
---|
211 | neighbours[i/3][i%3] = temp_dom.neighbours[i][0] |
---|
212 | neighbours[(i+N)/3][(i+N)%3] = temp_dom.neighbours[i][1] |
---|
213 | neighbours[(i+2*N)/3][(i+2*N)%3] = temp_dom.neighbours[i][2] |
---|
214 | |
---|
215 | neighbour_edges[i/3][i%3] = temp_dom.neighbour_edges[i][0] |
---|
216 | neighbour_edges[(i+N)/3][(i+N)%3] = temp_dom.neighbour_edges[i][1] |
---|
217 | neighbour_edges[(i+2*N)/3][(i+2*N)%3] = temp_dom.neighbour_edges[i][2] |
---|
218 | |
---|
219 | surrogate_neighbours[i/3][i%3] = \ |
---|
220 | temp_dom.surrogate_neighbours[i][0] |
---|
221 | surrogate_neighbours[(i+N)/3][(i+N)%3] = \ |
---|
222 | temp_dom.surrogate_neighbours[i][1] |
---|
223 | surrogate_neighbours[(i+2*N)/3][(i+2*N)%3] = \ |
---|
224 | temp_dom.surrogate_neighbours[i][2] |
---|
225 | |
---|
226 | |
---|
227 | normals[i/6][i%6] = temp_dom.normals[i][0] |
---|
228 | normals[(i+N)/6][(i+N)%6] = temp_dom.normals[i][1] |
---|
229 | normals[(i+2*N)/6][(i+2*N)%6] = temp_dom.normals[i][2] |
---|
230 | normals[(i+3*N)/6][(i+3*N)%6] = temp_dom.normals[i][3] |
---|
231 | normals[(i+4*N)/6][(i+4*N)%6] = temp_dom.normals[i][4] |
---|
232 | normals[(i+5*N)/6][(i+5*N)%6] = temp_dom.normals[i][5] |
---|
233 | |
---|
234 | |
---|
235 | edgelengths[i/3][i%3] = temp_dom.edgelengths[i][0] |
---|
236 | edgelengths[(i+N)/3][(i+N)%3] = temp_dom.edgelengths[i][1] |
---|
237 | edgelengths[(i+2*N)/3][(i+2*N)%3] = temp_dom.edgelengths[i][2] |
---|
238 | |
---|
239 | |
---|
240 | #vertex_coordinates[i/2][i%2] = \ |
---|
241 | # temp_dom.vertex_coordinates[i*3][0] |
---|
242 | #vertex_coordinates[(i+N)/2][(i+N)%2] = \ |
---|
243 | # temp_dom.vertex_coordinates[i*3][1] |
---|
244 | #vertex_coordinates[(i+N*2)/2][(i+N*2)%2] = \ |
---|
245 | # temp_dom.vertex_coordinates[i*3+1][0] |
---|
246 | #vertex_coordinates[(i+N*3)/2][(i+N*3)%2] = \ |
---|
247 | # temp_dom.vertex_coordinates[i*3+1][1] |
---|
248 | #vertex_coordinates[(i+N*4)/2][(i+N*4)%2] = \ |
---|
249 | # temp_dom.vertex_coordinates[i*3+2][0] |
---|
250 | #vertex_coordinates[(i+N*5)/2][(i+N*5)%2] = \ |
---|
251 | # temp_dom.vertex_coordinates[i*3+2][1] |
---|
252 | |
---|
253 | vertex_coordinates.flat[i] = \ |
---|
254 | temp_dom.vertex_coordinates[i*3][0] |
---|
255 | vertex_coordinates.flat[i+N] = \ |
---|
256 | temp_dom.vertex_coordinates[i*3][1] |
---|
257 | vertex_coordinates.flat[i+N*2] = \ |
---|
258 | temp_dom.vertex_coordinates[i*3+1][0] |
---|
259 | vertex_coordinates.flat[i+N*3] = \ |
---|
260 | temp_dom.vertex_coordinates[i*3+1][1] |
---|
261 | vertex_coordinates.flat[i+N*4] = \ |
---|
262 | temp_dom.vertex_coordinates[i*3+2][0] |
---|
263 | vertex_coordinates.flat[i+N*5] = \ |
---|
264 | temp_dom.vertex_coordinates[i*3+2][1] |
---|
265 | |
---|
266 | |
---|
267 | edge_coordinates[i/2][i%2] = temp_dom.edge_coordinates[i*3][0] |
---|
268 | edge_coordinates[(i+N)/2][(i+N)%2] = temp_dom.edge_coordinates[i*3][1] |
---|
269 | edge_coordinates[(i+N*2)/2][(i+N*2)%2] = temp_dom.edge_coordinates[i*3+1][0] |
---|
270 | edge_coordinates[(i+N*3)/2][(i+N*3)%2] = temp_dom.edge_coordinates[i*3+1][1] |
---|
271 | edge_coordinates[(i+N*4)/2][(i+N*4)%2] = temp_dom.edge_coordinates[i*3+2][0] |
---|
272 | edge_coordinates[(i+N*5)/2][(i+N*5)%2] = temp_dom.edge_coordinates[i*3+2][1] |
---|
273 | |
---|
274 | |
---|
275 | centroid_coordinates[i/2][i%2] = temp_dom.centroid_coordinates[i][0] |
---|
276 | centroid_coordinates[(i+N)/2][(i+N)%2] = temp_dom.centroid_coordinates[i][1] |
---|
277 | |
---|
278 | stage_edge_values[i/3][i%3] = \ |
---|
279 | temp_dom.quantities['stage'].edge_values[i][0] |
---|
280 | stage_edge_values[(i+N)/3][(i+N)%3] = \ |
---|
281 | temp_dom.quantities['stage'].edge_values[i][1] |
---|
282 | stage_edge_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
283 | temp_dom.quantities['stage'].edge_values[i][2] |
---|
284 | |
---|
285 | |
---|
286 | xmom_edge_values[i/3][i%3] = \ |
---|
287 | temp_dom.quantities['xmomentum'].edge_values[i][0] |
---|
288 | xmom_edge_values[(i+N)/3][(i+N)%3] = \ |
---|
289 | temp_dom.quantities['xmomentum'].edge_values[i][1] |
---|
290 | xmom_edge_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
291 | temp_dom.quantities['xmomentum'].edge_values[i][2] |
---|
292 | |
---|
293 | |
---|
294 | ymom_edge_values[i/3][i%3] = \ |
---|
295 | temp_dom.quantities['ymomentum'].edge_values[i][0] |
---|
296 | ymom_edge_values[(i+N)/3][(i+N)%3] = \ |
---|
297 | temp_dom.quantities['ymomentum'].edge_values[i][1] |
---|
298 | ymom_edge_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
299 | temp_dom.quantities['ymomentum'].edge_values[i][2] |
---|
300 | |
---|
301 | |
---|
302 | bed_edge_values[i/3][i%3] = \ |
---|
303 | temp_dom.quantities['elevation'].edge_values[i][0] |
---|
304 | bed_edge_values[(i+N)/3][(i+N)%3] = \ |
---|
305 | temp_dom.quantities['elevation'].edge_values[i][1] |
---|
306 | bed_edge_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
307 | temp_dom.quantities['elevation'].edge_values[i][2] |
---|
308 | |
---|
309 | |
---|
310 | |
---|
311 | stage_vertex_values[i/3][i%3] = \ |
---|
312 | temp_dom.quantities['stage'].vertex_values[i][0] |
---|
313 | stage_vertex_values[(i+N)/3][(i+N)%3] = \ |
---|
314 | temp_dom.quantities['stage'].vertex_values[i][1] |
---|
315 | stage_vertex_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
316 | temp_dom.quantities['stage'].vertex_values[i][2] |
---|
317 | |
---|
318 | |
---|
319 | xmom_vertex_values[i/3][i%3] = \ |
---|
320 | temp_dom.quantities['xmomentum'].vertex_values[i][0] |
---|
321 | xmom_vertex_values[(i+N)/3][(i+N)%3] = \ |
---|
322 | temp_dom.quantities['xmomentum'].vertex_values[i][1] |
---|
323 | xmom_vertex_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
324 | temp_dom.quantities['xmomentum'].vertex_values[i][2] |
---|
325 | |
---|
326 | |
---|
327 | ymom_vertex_values[i/3][i%3] = \ |
---|
328 | temp_dom.quantities['ymomentum'].vertex_values[i][0] |
---|
329 | ymom_vertex_values[(i+N)/3][(i+N)%3] = \ |
---|
330 | temp_dom.quantities['ymomentum'].vertex_values[i][1] |
---|
331 | ymom_vertex_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
332 | temp_dom.quantities['ymomentum'].vertex_values[i][2] |
---|
333 | |
---|
334 | |
---|
335 | bed_vertex_values[i/3][i%3] = \ |
---|
336 | temp_dom.quantities['elevation'].vertex_values[i][0] |
---|
337 | bed_vertex_values[(i+N)/3][(i+N)%3] = \ |
---|
338 | temp_dom.quantities['elevation'].vertex_values[i][1] |
---|
339 | bed_vertex_values[(i+2*N)/3][(i+2*N)%3] = \ |
---|
340 | temp_dom.quantities['elevation'].vertex_values[i][2] |
---|
341 | |
---|
342 | return new_dom |
---|
343 | |
---|
344 | |
---|
345 | |
---|
346 | def check_rearranged_array(a, b, configure=3): |
---|
347 | """Check rearranged array.""" |
---|
348 | |
---|
349 | import numpy |
---|
350 | counter = 0 |
---|
351 | N = a.shape[0] |
---|
352 | if configure == 2: |
---|
353 | """ N * 2 """ |
---|
354 | for i in range(N): |
---|
355 | if a[i][0] != b[i/2][i%2] or \ |
---|
356 | a[i][1] != b[(i+N)/2][(i+N)%2] : |
---|
357 | counter +=1 |
---|
358 | |
---|
359 | if configure == 3: |
---|
360 | """ N * 3 """ |
---|
361 | for i in range(N): |
---|
362 | if not ( numpy.allclose( a[i][0], b[i/3][i%3] ) and \ |
---|
363 | numpy.allclose( a[i][1], b[(i+N)/3][(i+N)%3] ) and \ |
---|
364 | numpy.allclose( a[i][2], b[(i+N*2)/3][(i+N*2)%3] ) ): |
---|
365 | if counter < 5: |
---|
366 | print i, a[i], b[i/3][i%3], b[(i+N)/3][(i+N)%3], \ |
---|
367 | b[(i+N*2)/3][(i+N*2)%3] |
---|
368 | |
---|
369 | counter += 1 |
---|
370 | |
---|
371 | elif configure == 6: |
---|
372 | """ N * 6 """ |
---|
373 | for i in range(N): |
---|
374 | if a[i][0] != b[i/6][i%6] or \ |
---|
375 | a[i][1] != b[(i+N)/6][(i+N)%6] or \ |
---|
376 | a[i][2] != b[(i+N*2)/6][(i+N*2)%6] or \ |
---|
377 | a[i][3] != b[(i+N*3)/6][(i+N*3)%6] or \ |
---|
378 | a[i][4] != b[(i+N*4)/6][(i+N*4)%6] or \ |
---|
379 | a[i][5] != b[(i+N*5)/6][(i+N*5)%6]: |
---|
380 | |
---|
381 | counter +=1 |
---|
382 | |
---|
383 | elif configure == 32: |
---|
384 | """ N*3 * 2""" |
---|
385 | N = N/3 |
---|
386 | for i in range(N): |
---|
387 | if a[i*3][0] != b[i/2][i%2] or \ |
---|
388 | a[i*3][1] != b[(i+N)/2][(i+N)%2] or \ |
---|
389 | a[i*3 + 1][0] != b[(i+N*2)/2][(i+N*2)%2] or \ |
---|
390 | a[i*3 + 1][1] != b[(i+N*3)/2][(i+N*3)%2] or \ |
---|
391 | a[i*3 + 2][0] != b[(i+N*4)/2][(i+N*4)%2] or \ |
---|
392 | a[i*3 + 2][1] != b[(i+N*5)/2][(i+N*5)%2] : |
---|
393 | |
---|
394 | counter +=1 |
---|
395 | |
---|
396 | if counter == 0: |
---|
397 | # This is used to tell apart the False and 0 |
---|
398 | counter = -1 |
---|
399 | return counter |
---|
400 | |
---|
401 | |
---|
402 | |
---|
403 | def rearrange_domain_check(domain1, domain2): |
---|
404 | """Check rearranged mesh information""" |
---|
405 | |
---|
406 | neighbours = domain1.neighbours |
---|
407 | neighbour_edges = domain1.neighbour_edges |
---|
408 | surrogate_neighbours = domain1.surrogate_neighbours |
---|
409 | normals = domain1.normals |
---|
410 | edgelengths = domain1.edgelengths |
---|
411 | |
---|
412 | vertex_coordinates = domain1.vertex_coordinates |
---|
413 | edge_coordinates = domain1.edge_coordinates |
---|
414 | centroid_coordinates = domain1.centroid_coordinates |
---|
415 | |
---|
416 | |
---|
417 | stage_edge_values = domain1.quantities['stage'].edge_values |
---|
418 | xmom_edge_values = domain1.quantities['xmomentum'].edge_values |
---|
419 | ymom_edge_values = domain1.quantities['ymomentum'].edge_values |
---|
420 | bed_edge_values = domain1.quantities['elevation'].edge_values |
---|
421 | |
---|
422 | stage_vertex_values = domain1.quantities['stage'].vertex_values |
---|
423 | xmom_vertex_values = domain1.quantities['xmomentum'].vertex_values |
---|
424 | ymom_vertex_values = domain1.quantities['ymomentum'].vertex_values |
---|
425 | bed_vertex_values = domain1.quantities['elevation'].vertex_values |
---|
426 | |
---|
427 | |
---|
428 | vc = domain2.vertex_coordinates |
---|
429 | xc = domain2.edge_coordinates |
---|
430 | cc = domain2.centroid_coordinates |
---|
431 | |
---|
432 | |
---|
433 | se = domain2.quantities['stage'].edge_values |
---|
434 | xe = domain2.quantities['xmomentum'].edge_values |
---|
435 | ye = domain2.quantities['ymomentum'].edge_values |
---|
436 | be = domain2.quantities['elevation'].edge_values |
---|
437 | |
---|
438 | sv = domain2.quantities['stage'].vertex_values |
---|
439 | xv = domain2.quantities['xmomentum'].vertex_values |
---|
440 | yv = domain2.quantities['ymomentum'].vertex_values |
---|
441 | bv = domain2.quantities['elevation'].vertex_values |
---|
442 | |
---|
443 | |
---|
444 | |
---|
445 | N = domain1.number_of_elements |
---|
446 | |
---|
447 | cnt_nb = check_rearranged_array( |
---|
448 | neighbours, domain2.neighbours, 3) |
---|
449 | cnt_nbedge = check_rearranged_array( |
---|
450 | neighbour_edges, domain2.neighbour_edges, 3) |
---|
451 | cnt_surrnb = check_rearranged_array( |
---|
452 | surrogate_neighbours, domain2.surrogate_neighbours, 3) |
---|
453 | cnt_norm = check_rearranged_array( |
---|
454 | normals, domain2.normals, 6) |
---|
455 | cnt_el = check_rearranged_array( |
---|
456 | edgelengths, domain2.edgelengths, 3) |
---|
457 | cnt_vc = check_rearranged_array( |
---|
458 | vertex_coordinates, domain2.vertex_coordinates, 32) |
---|
459 | cnt_ec = check_rearranged_array( |
---|
460 | edge_coordinates, domain2.edge_coordinates, 32) |
---|
461 | |
---|
462 | edgeC = edge_coordinates |
---|
463 | ec_2 = domain2.edge_coordinates.flat |
---|
464 | for i in range(N): |
---|
465 | if edgeC[i*3][0] != ec_2[i] or edgeC[i*3][1] != ec_2[i+N] or \ |
---|
466 | edgeC[i*3+1][0]!=ec_2[i+N*2] or edgeC[i*3+1][1]!=ec_2[i+N*3] or\ |
---|
467 | edgeC[i*3+2][0]!=ec_2[i+N*4] or edgeC[i*3+2][1]!=ec_2[i+N*5]: |
---|
468 | print i |
---|
469 | |
---|
470 | cnt_cc = check_rearranged_array( |
---|
471 | centroid_coordinates, domain2.centroid_coordinates, 2) |
---|
472 | cnt_se = check_rearranged_array( stage_edge_values, |
---|
473 | domain2.quantities['stage'].edge_values, 3) |
---|
474 | cnt_xe = check_rearranged_array( xmom_edge_values, |
---|
475 | domain2.quantities['xmomentum'].edge_values, 3) |
---|
476 | cnt_ye = check_rearranged_array( ymom_edge_values, |
---|
477 | domain2.quantities['ymomentum'].edge_values, 3) |
---|
478 | cnt_be = check_rearranged_array( bed_edge_values, |
---|
479 | domain2.quantities['elevation'].edge_values, 3) |
---|
480 | cnt_sv = check_rearranged_array( stage_vertex_values, |
---|
481 | domain2.quantities['stage'].vertex_values, 3) |
---|
482 | cnt_xv = check_rearranged_array( xmom_vertex_values, |
---|
483 | domain2.quantities['xmomentum'].vertex_values, 3) |
---|
484 | cnt_yv = check_rearranged_array( ymom_vertex_values, |
---|
485 | domain2.quantities['ymomentum'].vertex_values, 3) |
---|
486 | cnt_bv = check_rearranged_array( bed_vertex_values, |
---|
487 | domain2.quantities["elevation"].vertex_values, 3) |
---|
488 | |
---|
489 | #for i in range(N): |
---|
490 | # if neighbours[i][0] != domain2.neighbours[i/3][i%3] or \ |
---|
491 | # neighbours[i][1] != domain2.neighbours[(i+N)/3][(i+N)%3] or \ |
---|
492 | # neighbours[i][2] != domain2.neighbours[(i+N*2)/3][(i+N*2)%3]: |
---|
493 | # if cnt_nb < 5: |
---|
494 | # print i, neighbours[i], domain2.neighbours[i/3][i%3], \ |
---|
495 | # domain2.neighbours[(i+N)/3][(i+N)%3], \ |
---|
496 | # domain2.neighbours[(i+N*2)/3][(i+N*2)%3] |
---|
497 | # cnt_nb+=1 |
---|
498 | |
---|
499 | # if neighbour_edges[i][0] != domain2.neighbour_edges[i/3][i%3] or \ |
---|
500 | # neighbour_edges[i][1] != \ |
---|
501 | # domain2.neighbour_edges[(i+N)/3][(i+N)%3]or\ |
---|
502 | # neighbour_edges[i][2] != \ |
---|
503 | # domain2.neighbour_edges[(i+N*2)/3][(i+N*2)%3]: |
---|
504 | # cnt_nbedge+=1 |
---|
505 | # |
---|
506 | # if surrogate_neighbours[i][0] != \ |
---|
507 | # domain2.surrogate_neighbours[i/3][i%3]or\ |
---|
508 | # surrogate_neighbours[i][1] !=\ |
---|
509 | # domain2.surrogate_neighbours[(i+N)/3][(i+N)%3]or\ |
---|
510 | # surrogate_neighbours[i][2] !=\ |
---|
511 | # domain2.surrogate_neighbours[(i+N*2)/3][(i+N*2)%3]: |
---|
512 | # cnt_surrnb +=1 |
---|
513 | |
---|
514 | # if normals[i][0] != domain2.normals[i/6][i%6] or \ |
---|
515 | # normals[i][1] != domain2.normals[(i+N)/6][(i+N)%6] or \ |
---|
516 | # normals[i][2] != domain2.normals[(i+N*2)/6][(i+N*2)%6] or \ |
---|
517 | # normals[i][3] != domain2.normals[(i+N*3)/6][(i+N*3)%6] or \ |
---|
518 | # normals[i][4] != domain2.normals[(i+N*4)/6][(i+N*4)%6] or \ |
---|
519 | # normals[i][5] != domain2.normals[(i+N*5)/6][(i+N*5)%6]: |
---|
520 | # cnt_norm +=1 |
---|
521 | |
---|
522 | # if edgelengths[i][0] != domain2.edgelengths[i/3][i%3] or \ |
---|
523 | # edgelengths[i][1] != domain2.edgelengths[(i+N)/3][(i+N)%3] or \ |
---|
524 | # edgelengths[i][2] != domain2.edgelengths[(i+N*2)/3][(i+N*2)%3]: |
---|
525 | # if cnt_nb < 5: |
---|
526 | # print i, edgelengths[i], domain2.edgelengths[i/3][i%3], \ |
---|
527 | # domain2.edgelengths[(i+N)/3][(i+N)%3], \ |
---|
528 | # domain2.edgelengths[(i+N*2)/3][(i+N*2)%3] |
---|
529 | # cnt_el +=1 |
---|
530 | |
---|
531 | |
---|
532 | # if vertex_coordinates[i*3][0] != \ |
---|
533 | # domain2.vertex_coordinates[i/2][i%2] or \ |
---|
534 | # vertex_coordinates[i*3][1] != \ |
---|
535 | # domain2.vertex_coordinates[(i+N)/2][(i+N)%2] or \ |
---|
536 | # vertex_coordinates[i*3 + 1][0] != \ |
---|
537 | # domain2.vertex_coordinates[(i+N*2)/2][(i+N*2)%2] or \ |
---|
538 | # vertex_coordinates[i*3 + 1][1] != \ |
---|
539 | # domain2.vertex_coordinates[(i+N*3)/2][(i+N*3)%2] or \ |
---|
540 | # vertex_coordinates[i*3 + 2][0] != \ |
---|
541 | # domain2.vertex_coordinates[(i+N*4)/2][(i+N*4)%2] or \ |
---|
542 | # vertex_coordinates[i*3 + 2][1] != \ |
---|
543 | # domain2.vertex_coordinates[(i+N*5)/2][(i+N*5)%2] : |
---|
544 | # cnt_vc +=1 |
---|
545 | |
---|
546 | |
---|
547 | # if edge_coordinates[i*3][0] != \ |
---|
548 | # domain2.edge_coordinates[i/2][i%2] or \ |
---|
549 | # edge_coordinates[i*3][1] != \ |
---|
550 | # domain2.edge_coordinates[(i+N)/2][(i+N)%2] or \ |
---|
551 | # edge_coordinates[i*3 + 1][0] != \ |
---|
552 | # domain2.edge_coordinates[(i+N*2)/2][(i+N*2)%2] or \ |
---|
553 | # edge_coordinates[i*3 + 1][1] != \ |
---|
554 | # domain2.edge_coordinates[(i+N*3)/2][(i+N*3)%2] or \ |
---|
555 | # edge_coordinates[i*3 + 2][0] != \ |
---|
556 | # domain2.edge_coordinates[(i+N*4)/2][(i+N*4)%2] or \ |
---|
557 | # edge_coordinates[i*3 + 2][1] != \ |
---|
558 | # domain2.edge_coordinates[(i+N*5)/2][(i+N*5)%2] : |
---|
559 | # cnt_ec +=1 |
---|
560 | |
---|
561 | |
---|
562 | # if centroid_coordinates[i][0] !=\ |
---|
563 | # domain2.centroid_coordinates[i/2][i%2] or \ |
---|
564 | # centroid_coordinates[i][1] != \ |
---|
565 | # domain2.centroid_coordinates[(i+N)/2][(i+N)%2] : |
---|
566 | # cnt_cc +=1 |
---|
567 | |
---|
568 | |
---|
569 | # if stage_edge_values[i][0] != \ |
---|
570 | # domain2.quantities["stage"].edge_values[i/3][i%3] or \ |
---|
571 | # stage_edge_values[i][1] != \ |
---|
572 | # domain2.quantities["stage"].edge_values[(i+N)/3][(i+N)%3] \ |
---|
573 | # or stage_edge_values[i][2] != \ |
---|
574 | # domain2.quantities["stage"].edge_values[(i+N*2)/3][(i+N*2)%3]: |
---|
575 | # if cnt_nb < 5: |
---|
576 | # print i, stage_edge_values[i], \ |
---|
577 | # domain2.quantities["stage"].edge_values[i/3][i%3], \ |
---|
578 | # domain2.quantities["stage"].edge_values[(i+N)/3][(i+N)%3],\ |
---|
579 | # domain2.quantities["stage"].edge_values[(i+N*2)/3][(i+N*2)%3] |
---|
580 | # cnt_se+=1 |
---|
581 | |
---|
582 | # if xmom_edge_values[i][0] != \ |
---|
583 | # domain2.quantities["xmomentum"].edge_values[i/3][i%3] or \ |
---|
584 | # xmom_edge_values[i][1] != \ |
---|
585 | # domain2.quantities["xmomentum"].edge_values[(i+N)/3][(i+N)%3] or \ |
---|
586 | # xmom_edge_values[i][2] != \ |
---|
587 | # domain2.quantities["xmomentum"].edge_values[(i+N*2)/3][(i+N*2)%3]: |
---|
588 | # if cnt_nb < 5: |
---|
589 | # print i, xmom_edge_values[i], domain2.quantities["xmomentum"].edge_values[i/3][i%3], domain2.quantities["xmomentum"].edge_values[(i+N)/3][(i+N)%3], domain2.quantities["xmomentum"].edge_values[(i+N*2)/3][(i+N*2)%3] |
---|
590 | # cnt_xe+=1 |
---|
591 | |
---|
592 | # if ymom_edge_values[i][0] != \ |
---|
593 | # domain2.quantities["ymomentum"].edge_values[i/3][i%3] or \ |
---|
594 | # ymom_edge_values[i][1] != \ |
---|
595 | # domain2.quantities["ymomentum"].edge_values[(i+N)/3][(i+N)%3] or \ |
---|
596 | # ymom_edge_values[i][2] != \ |
---|
597 | # domain2.quantities["ymomentum"].edge_values[(i+N*2)/3][(i+N*2)%3]: |
---|
598 | # if cnt_nb < 5: |
---|
599 | # print i, ymom_edge_values[i], domain2.quantities["ymomentum"].edge_values[i/3][i%3], domain2.quantities["ymomentum"].edge_values[(i+N)/3][(i+N)%3], domain2.quantities["ymomentum"].edge_values[(i+N*2)/3][(i+N*2)%3] |
---|
600 | # cnt_ye+=1 |
---|
601 | |
---|
602 | # if bed_edge_values[i][0] != \ |
---|
603 | # domain2.quantities["elevation"].edge_values[i/3][i%3] or \ |
---|
604 | # bed_edge_values[i][1] != \ |
---|
605 | # domain2.quantities["elevation"].edge_values[(i+N)/3][(i+N)%3] or \ |
---|
606 | # bed_edge_values[i][2] != \ |
---|
607 | # domain2.quantities["elevation"].edge_values[(i+N*2)/3][(i+N*2)%3]: |
---|
608 | # if cnt_nb < 5: |
---|
609 | # print i, bed_edge_values[i], domain2.quantities["elevation"].edge_values[i/3][i%3], domain2.quantities["elevation"].edge_values[(i+N)/3][(i+N)%3], domain2.quantities["elevation"].edge_values[(i+N*2)/3][(i+N*2)%3] |
---|
610 | # cnt_be+=1 |
---|
611 | |
---|
612 | # # Vertex values |
---|
613 | |
---|
614 | # if stage_vertex_values[i][0] != \ |
---|
615 | # domain2.quantities["stage"].vertex_values[i/3][i%3] or \ |
---|
616 | # stage_vertex_values[i][1] != \ |
---|
617 | # domain2.quantities["stage"].vertex_values[(i+N)/3][(i+N)%3] or \ |
---|
618 | # stage_vertex_values[i][2] != \ |
---|
619 | # domain2.quantities["stage"].vertex_values[(i+N*2)/3][(i+N*2)%3]: |
---|
620 | # if cnt_nb < 5: |
---|
621 | # print i, stage_vertex_values[i], domain2.quantities["stage"].vertex_values[i/3][i%3], domain2.quantities["stage"].vertex_values[(i+N)/3][(i+N)%3], domain2.quantities["stage"].vertex_values[(i+N*2)/3][(i+N*2)%3] |
---|
622 | # cnt_sv +=1 |
---|
623 | |
---|
624 | # if xmom_vertex_values[i][0] != \ |
---|
625 | # domain2.quantities["xmomentum"].vertex_values[i/3][i%3] or \ |
---|
626 | # xmom_vertex_values[i][1] != \ |
---|
627 | # domain2.quantities["xmomentum"].vertex_values[(i+N)/3][(i+N)%3] or \ |
---|
628 | # xmom_vertex_values[i][2] != \ |
---|
629 | # domain2.quantities["xmomentum"].vertex_values[(i+N*2)/3][(i+N*2)%3]: |
---|
630 | # if cnt_nb < 5: |
---|
631 | # print i, xmom_vertex_values[i], domain2.quantities["xmomentum"].vertex_values[i/3][i%3], domain2.quantities["xmomentum"].vertex_values[(i+N)/3][(i+N)%3], domain2.quantities["xmomentum"].vertex_values[(i+N*2)/3][(i+N*2)%3] |
---|
632 | # cnt_xv +=1 |
---|
633 | |
---|
634 | # if ymom_vertex_values[i][0] != \ |
---|
635 | # domain2.quantities["ymomentum"].vertex_values[i/3][i%3] or \ |
---|
636 | # ymom_vertex_values[i][1] != \ |
---|
637 | # domain2.quantities["ymomentum"].vertex_values[(i+N)/3][(i+N)%3] or \ |
---|
638 | # ymom_vertex_values[i][2] != \ |
---|
639 | # domain2.quantities["ymomentum"].vertex_values[(i+N*2)/3][(i+N*2)%3]: |
---|
640 | # if cnt_nb < 5: |
---|
641 | # print i, ymom_vertex_values[i], domain2.quantities["ymomentum"].vertex_values[i/3][i%3], domain2.quantities["ymomentum"].vertex_values[(i+N)/3][(i+N)%3], domain2.quantities["ymomentum"].vertex_values[(i+N*2)/3][(i+N*2)%3] |
---|
642 | # cnt_yv +=1 |
---|
643 | |
---|
644 | # if bed_vertex_values[i][0] != \ |
---|
645 | # domain2.quantities["elevation"].vertex_values[i/3][i%3] or \ |
---|
646 | # bed_vertex_values[i][1] != \ |
---|
647 | # domain2.quantities["elevation"].vertex_values[(i+N)/3][(i+N)%3] or \ |
---|
648 | # bed_vertex_values[i][2] != \ |
---|
649 | # domain2.quantities["elevation"].vertex_values[(i+N*2)/3][(i+N*2)%3]: |
---|
650 | # if cnt_nb < 5: |
---|
651 | # print i, bed_vertex_values[i], domain2.quantities["elevation"].vertex_values[i/3][i%3], domain2.quantities["elevation"].vertex_values[(i+N)/3][(i+N)%3], domain2.quantities["elevation"].vertex_values[(i+N*2)/3][(i+N*2)%3] |
---|
652 | # cnt_bv +=1 |
---|
653 | |
---|
654 | if cnt_nb or cnt_nbedge or cnt_surrnb or cnt_norm: |
---|
655 | print "nb=%d, nb_edge=%d surrnb=%d norm=%d" % \ |
---|
656 | (cnt_nb, cnt_nbedge, cnt_surrnb, cnt_norm) |
---|
657 | if cnt_el or cnt_vc or cnt_ec or cnt_cc: |
---|
658 | print "elen=%d, vc=%d ec=%d cc=%d" % \ |
---|
659 | (cnt_el, cnt_vc, cnt_ec, cnt_cc) |
---|
660 | if cnt_se or cnt_xe or cnt_ye or cnt_be: |
---|
661 | print "se=%d, xe=%d ye=%d be=%d" % \ |
---|
662 | (cnt_se, cnt_xe, cnt_ye, cnt_be) |
---|
663 | if cnt_sv or cnt_xv or cnt_yv or cnt_bv: |
---|
664 | print "sv=%d, xv=%d yv=%d bv=%d" % \ |
---|
665 | (cnt_sv, cnt_xv, cnt_yv, cnt_bv) |
---|
666 | |
---|
667 | |
---|
668 | |
---|
669 | |
---|
670 | if __name__ == "__main__": |
---|
671 | from anuga_cuda import generate_merimbula_domain |
---|
672 | |
---|
673 | from anuga_cuda.compute_fluxes.compute_fluxes import spe_bubble_sort |
---|
674 | |
---|
675 | domain1 = generate_merimbula_domain() |
---|
676 | domain2 = generate_merimbula_domain() |
---|
677 | #sort_domain(domain2) |
---|
678 | #sort_domain_check(domain2) |
---|
679 | |
---|
680 | #sort_domain(domain1) |
---|
681 | print " **** rearrange_domain **** " |
---|
682 | domain2=rearrange_domain(domain2, False) |
---|
683 | print " **** check domain ****" |
---|
684 | rearrange_domain_check(domain1, domain2) |
---|