Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
    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()
Exemplo n.º 4
0
 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()
Exemplo n.º 5
0
 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()
Exemplo n.º 6
0
 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()
Exemplo n.º 7
0
 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()
Exemplo n.º 8
0
 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()