コード例 #1
0
 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]
コード例 #2
0
ファイル: block_utils.py プロジェクト: fanronghong/fenics_ii
 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))
コード例 #3
0
ファイル: block_utils.py プロジェクト: HomaiRS/fenics_ii
    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]
コード例 #4
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))