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