1 #include <petsc/private/matimpl.h> 2 #include <htool/misc/petsc.hpp> 3 4 class WrapperHtool : public htool::VirtualGenerator<PetscScalar> { 5 PetscInt dim; 6 MatHtoolKernel& kernel; 7 void* ctx; 8 9 public: 10 WrapperHtool(PetscInt M,PetscInt N,PetscInt sdim,MatHtoolKernel& g,void* kernelctx) : VirtualGenerator(M,N), dim(sdim), kernel(g), ctx(kernelctx) { } 11 void copy_submatrix(PetscInt M, PetscInt N, const PetscInt *rows, const PetscInt *cols, PetscScalar *ptr) const { 12 PetscErrorCode ierr; 13 14 PetscFunctionBegin; 15 ierr = kernel(dim,M,N,rows,cols,ptr,ctx);CHKERRABORT(PETSC_COMM_SELF,ierr); 16 PetscFunctionReturnVoid(); 17 } 18 }; 19 20 struct Mat_Htool { 21 PetscInt dim; 22 PetscReal *gcoords_target; 23 PetscReal *gcoords_source; 24 PetscScalar *work_target; 25 PetscScalar *work_source; 26 PetscScalar s; 27 PetscInt bs[2]; 28 PetscReal epsilon; 29 PetscReal eta; 30 PetscInt depth[2]; 31 MatHtoolCompressorType compressor; 32 MatHtoolClusteringType clustering; 33 MatHtoolKernel kernel; 34 void* kernelctx; 35 WrapperHtool *wrapper; 36 htool::VirtualHMatrix<PetscScalar> *hmatrix; 37 }; 38 39 struct MatHtoolKernelTranspose { 40 Mat A; 41 MatHtoolKernel kernel; 42 void* kernelctx; 43 }; 44