@@ -51,7 +51,9 @@ cdef extern from "petsc.h":
5151 PETSC_INSERT_VALUES " INSERT_VALUES"
5252 int PetscCalloc1(size_t, void * )
5353 int PetscMalloc1(size_t, void * )
54+ int PetscMalloc2(size_t, void * , size_t, void * )
5455 int PetscFree(void * )
56+ int PetscFree2(void * ,void * )
5557 int MatSetValuesBlockedLocal(PETSc.PetscMat, PetscInt, PetscInt* , PetscInt, PetscInt* ,
5658 PetscScalar* , PetscInsertMode)
5759 int MatSetValuesLocal(PETSc.PetscMat, PetscInt, PetscInt* , PetscInt, PetscInt* ,
@@ -193,7 +195,9 @@ def fill_with_zeros(PETSc.Mat mat not None, dims, maps, iteration_regions, set_d
193195 PetscScalar zero = 0.0
194196 PetscInt nrow, ncol
195197 PetscInt rarity, carity, tmp_rarity, tmp_carity
196- PetscInt[:, ::1 ] rmap, cmap
198+ PetscInt[:, ::1 ] rmap, cmap, tempmap
199+ PetscInt ** rcomposedmaps = NULL , ** ccomposedmaps = NULL
200+ PetscInt nrcomposedmaps = 0 , nccomposedmaps = 0 , rset_entry, cset_entry
197201 PetscInt * rvals
198202 PetscInt * cvals
199203 PetscInt * roffset
@@ -213,23 +217,52 @@ def fill_with_zeros(PETSc.Mat mat not None, dims, maps, iteration_regions, set_d
213217 set_size = pair[0 ].iterset.size
214218 if set_size == 0 :
215219 continue
216- # Memoryviews require writeable buffers
217- rflag = set_writeable(pair[0 ])
218- cflag = set_writeable(pair[1 ])
219- # Map values
220- rmap = pair[0 ].values_with_halo
221- cmap = pair[1 ].values_with_halo
220+ rflags = []
221+ cflags = []
222+ if isinstance (pair[0 ], op2.ComposedMap):
223+ m = pair[0 ].flattened_maps[0 ]
224+ rflags.append(set_writeable(m))
225+ rmap = m.values_with_halo
226+ nrcomposedmaps = len (pair[0 ].flattened_maps) - 1
227+ else :
228+ rflags.append(set_writeable(pair[0 ])) # Memoryviews require writeable buffers
229+ rmap = pair[0 ].values_with_halo # Map values
230+ if isinstance (pair[1 ], op2.ComposedMap):
231+ m = pair[1 ].flattened_maps[0 ]
232+ cflags.append(set_writeable(m))
233+ cmap = m.values_with_halo
234+ nccomposedmaps = len (pair[1 ].flattened_maps) - 1
235+ else :
236+ cflags.append(set_writeable(pair[1 ]))
237+ cmap = pair[1 ].values_with_halo
238+ # Handle ComposedMaps
239+ CHKERR(PetscMalloc2(nrcomposedmaps, & rcomposedmaps, nccomposedmaps, & ccomposedmaps))
240+ for i in range (nrcomposedmaps):
241+ m = pair[0 ].flattened_maps[1 + i]
242+ rflags.append(set_writeable(m))
243+ tempmap = m.values_with_halo
244+ rcomposedmaps[i] = & tempmap[0 , 0 ]
245+ for i in range (nccomposedmaps):
246+ m = pair[1 ].flattened_maps[1 + i]
247+ cflags.append(set_writeable(m))
248+ tempmap = m.values_with_halo
249+ ccomposedmaps[i] = & tempmap[0 , 0 ]
222250 # Arity of maps
223251 rarity = pair[0 ].arity
224252 carity = pair[1 ].arity
225-
226253 if not extruded:
227254 # The non-extruded case is easy, we just walk over the
228255 # rmap and cmap entries and set a block of values.
229256 CHKERR(PetscCalloc1(rarity* carity* rdim* cdim, & values))
230257 for set_entry in range (set_size):
231- CHKERR(MatSetValuesBlockedLocal(mat.mat, rarity, & rmap[set_entry, 0 ],
232- carity, & cmap[set_entry, 0 ],
258+ rset_entry = < PetscInt> set_entry
259+ cset_entry = < PetscInt> set_entry
260+ for i in range (nrcomposedmaps):
261+ rset_entry = rcomposedmaps[nrcomposedmaps - 1 - i][rset_entry]
262+ for i in range (nccomposedmaps):
263+ cset_entry = ccomposedmaps[nccomposedmaps - 1 - i][cset_entry]
264+ CHKERR(MatSetValuesBlockedLocal(mat.mat, rarity, & rmap[< int > rset_entry, 0 ],
265+ carity, & cmap[< int > cset_entry, 0 ],
233266 values, PETSC_INSERT_VALUES))
234267 else :
235268 # The extruded case needs a little more work.
@@ -268,6 +301,12 @@ def fill_with_zeros(PETSc.Mat mat not None, dims, maps, iteration_regions, set_d
268301 for i in range (carity):
269302 coffset[i] = pair[1 ].offset[i]
270303 for set_entry in range (set_size):
304+ rset_entry = < PetscInt> set_entry
305+ cset_entry = < PetscInt> set_entry
306+ for i in range (nrcomposedmaps):
307+ rset_entry = rcomposedmaps[nrcomposedmaps - 1 - i][rset_entry]
308+ for i in range (nccomposedmaps):
309+ cset_entry = ccomposedmaps[nccomposedmaps - 1 - i][cset_entry]
271310 if constant_layers:
272311 layer_start = layers[0 , 0 ]
273312 layer_end = layers[0 , 1 ] - 1
@@ -287,15 +326,15 @@ def fill_with_zeros(PETSc.Mat mat not None, dims, maps, iteration_regions, set_d
287326
288327 # In the case of tmp_rarity == rarity this is just:
289328 #
290- # rvals[i] = rmap[set_entry , i] + layer_start * roffset[i]
329+ # rvals[i] = rmap[rset_entry , i] + layer_start * roffset[i]
291330 #
292331 # But this means less special casing.
293332 for i in range (tmp_rarity):
294- rvals[i] = rmap[set_entry , i % rarity] + \
333+ rvals[i] = rmap[< int > rset_entry , i % rarity] + \
295334 (layer_start - layer_bottom + i // rarity) * roffset[i % rarity]
296335 # Ditto
297336 for i in range (tmp_carity):
298- cvals[i] = cmap[set_entry , i % carity] + \
337+ cvals[i] = cmap[< int > cset_entry , i % carity] + \
299338 (layer_start - layer_bottom + i // carity) * coffset[i % carity]
300339 for layer in range (layer_start, layer_end):
301340 CHKERR(MatSetValuesBlockedLocal(mat.mat, tmp_rarity, rvals,
@@ -310,6 +349,15 @@ def fill_with_zeros(PETSc.Mat mat not None, dims, maps, iteration_regions, set_d
310349 CHKERR(PetscFree(cvals))
311350 CHKERR(PetscFree(roffset))
312351 CHKERR(PetscFree(coffset))
313- restore_writeable(pair[0 ], rflag)
314- restore_writeable(pair[1 ], cflag)
352+ CHKERR(PetscFree2(rcomposedmaps, ccomposedmaps))
353+ if isinstance (pair[0 ], op2.ComposedMap):
354+ for m, rflag in zip (pair[0 ].flattened_maps, rflags):
355+ restore_writeable(m, rflag)
356+ else :
357+ restore_writeable(pair[0 ], rflags[0 ])
358+ if isinstance (pair[1 ], op2.ComposedMap):
359+ for m, cflag in zip (pair[1 ].flattened_maps, cflags):
360+ restore_writeable(m, cflag)
361+ else :
362+ restore_writeable(pair[1 ], cflags[0 ])
315363 CHKERR(PetscFree(values))
0 commit comments