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