def set_local_diagonal_entries(self, rows, diag_val=1.0, idx=None): """Set the diagonal entry in ``rows`` to a particular value. :param rows: a :class:`Subset` or an iterable. :param diag_val: the value to add The indices in ``rows`` should index the process-local rows of the matrix (no mapping to global indexes is applied). """ rows = np.asarray(rows, dtype=IntType) rbs, _ = self.dims[0][0] if len(rows) == 0: # No need to set anything if we didn't get any rows, but # do need to force assembly flush. return base._LazyMatOp(self, lambda: None, new_state=Mat.INSERT_VALUES, write=True).enqueue() if rbs > 1: if idx is not None: rows = rbs * rows + idx else: rows = np.dstack([rbs*rows + i for i in range(rbs)]).flatten() vals = np.repeat(diag_val, len(rows)) closure = partial(self.handle.setValuesLocalRCV, rows.reshape(-1, 1), rows.reshape(-1, 1), vals.reshape(-1, 1), addv=PETSc.InsertMode.INSERT_VALUES) return base._LazyMatOp(self, closure, new_state=Mat.INSERT_VALUES, write=True).enqueue()
def set_local_diagonal_entries(self, rows, diag_val=1.0, idx=None): rows = np.asarray(rows, dtype=IntType) rbs, _ = self.dims[0][0] if len(rows) == 0: # No need to set anything if we didn't get any rows, but # do need to force assembly flush. return base._LazyMatOp(self, lambda: None, new_state=Mat.INSERT_VALUES, write=True).enqueue() if rbs > 1: if idx is not None: rows = rbs * rows + idx else: rows = np.dstack([rbs * rows + i for i in range(rbs)]).flatten() vals = np.repeat(diag_val, len(rows)) closure = partial(self.handle.setValuesLocalRCV, rows.reshape(-1, 1), rows.reshape(-1, 1), vals.reshape(-1, 1), addv=PETSc.InsertMode.INSERT_VALUES) return base._LazyMatOp(self, closure, new_state=Mat.INSERT_VALUES, write=True).enqueue()
def set_local_diagonal_entries(self, rows, diag_val=1.0, idx=None): """Set the diagonal entry in ``rows`` to a particular value. :param rows: a :class:`Subset` or an iterable. :param diag_val: the value to add The indices in ``rows`` should index the process-local rows of the matrix (no mapping to global indexes is applied). """ rows = np.asarray(rows, dtype=IntType) rbs, _ = self.dims[0][0] if len(rows) == 0: # No need to set anything if we didn't get any rows, but # do need to force assembly flush. return base._LazyMatOp(self, lambda: None, new_state=Mat.INSERT_VALUES, write=True).enqueue() if rbs > 1: if idx is not None: rows = rbs * rows + idx else: rows = np.dstack([rbs * rows + i for i in range(rbs)]).flatten() vals = np.repeat(diag_val, len(rows)) closure = partial(self.handle.setValuesLocalRCV, rows.reshape(-1, 1), rows.reshape(-1, 1), vals.reshape(-1, 1), addv=PETSc.InsertMode.INSERT_VALUES) return base._LazyMatOp(self, closure, new_state=Mat.INSERT_VALUES, write=True).enqueue()
def set_values(self, rows, cols, values): """Set a block of values in the :class:`Mat`.""" closure = partial(self.handle.setValuesBlockedLocal, rows, cols, values, addv=PETSc.InsertMode.INSERT_VALUES) return base._LazyMatOp(self, closure, new_state=Mat.INSERT_VALUES, write=True).enqueue()
def addto_values(self, rows, cols, values): """Add a block of values to the :class:`Mat`.""" closure = partial(self.handle.setValuesBlockedLocal, rows, cols, values, addv=PETSc.InsertMode.ADD_VALUES) return base._LazyMatOp(self, closure, new_state=Mat.ADD_VALUES, read=True, write=True).enqueue()
def set_local_diagonal_entries(self, rows, diag_val=1.0, idx=None): rows = np.asarray(rows, dtype=IntType) rbs, _ = self.dims[0][0] if len(rows) == 0: # No need to set anything if we didn't get any rows, but # do need to force assembly flush. return base._LazyMatOp(self, lambda: None, new_state=Mat.INSERT_VALUES, write=True).enqueue() if rbs > 1: if idx is not None: rows = rbs * rows + idx else: rows = np.dstack([rbs*rows + i for i in range(rbs)]).flatten() vals = np.repeat(diag_val, len(rows)) closure = partial(self.handle.setValuesLocalRCV, rows.reshape(-1, 1), rows.reshape(-1, 1), vals.reshape(-1, 1), addv=PETSc.InsertMode.INSERT_VALUES) return base._LazyMatOp(self, closure, new_state=Mat.INSERT_VALUES, write=True).enqueue()