def matvec(self, b): '''Reduce''' reshaped = [] for indices in self.mapping: if len(indices) == 1: reshaped.append(b.blocks[indices[0]]) else: reshaped.append(PETScVector(as_petsc_nest(block_vec([b.blocks[idx] for idx in indices])))) return block_vec(reshaped) if len(reshaped) > 1 else reshaped[0]
def mult(self, mat, x, y): '''y = A*x''' y *= 0 # Now x shall be comming as a nested vector # Convert x_bvec = block_vec(map(PETScVector, x.getNestSubVecs())) # Apply y_bvec = self.A * x_bvec # Convert back y.axpy(1., as_petsc_nest(y_bvec))
def matvec(self, b): '''Reduce''' # print type(b), b.size(), self.offsets # assert b.size() == self.offsets[-1] reduced = [] for f, l in zip(self.offsets[:-1], self.offsets[1:]): if (l - f) == 1: reduced.append(b[f]) else: reduced.append(PETScVector(as_petsc_nest(block_vec(b.blocks[f:l])))) return block_vec(reduced) if len(reduced) > 1 else reduced[0]
def multTranspose(self, mat, x, y): '''y = A.T*x''' AT = block_transpose(self.A) y *= 0 # Now x shall be comming as a nested vector # Convert x_bvec = block_vec(list(map(PETScVector, x.getNestSubVecs()))) # Apply y_bvec = AT*x_bvec # Convert back y.axpy(1., as_petsc_nest(y_bvec))