1*c7a4214aSPierre Jolivet #include <petsc/private/matimpl.h> 2*c7a4214aSPierre Jolivet #include <htool/misc/petsc.hpp> 3*c7a4214aSPierre Jolivet 4*c7a4214aSPierre Jolivet class WrapperHtool : public htool::IMatrix<PetscScalar> { 5*c7a4214aSPierre Jolivet PetscInt dim; 6*c7a4214aSPierre Jolivet MatHtoolKernel& kernel; 7*c7a4214aSPierre Jolivet void* ctx; 8*c7a4214aSPierre Jolivet 9*c7a4214aSPierre Jolivet public: 10*c7a4214aSPierre Jolivet WrapperHtool(PetscInt M,PetscInt N,PetscInt sdim,MatHtoolKernel& g,void* kernelctx) : IMatrix(M,N), dim(sdim), kernel(g), ctx(kernelctx) { } 11*c7a4214aSPierre Jolivet PetscScalar get_coef(const PetscInt& i,const PetscInt& j) const { return kernel(dim,i,j,ctx); } 12*c7a4214aSPierre Jolivet }; 13*c7a4214aSPierre Jolivet 14*c7a4214aSPierre Jolivet struct Mat_Htool { 15*c7a4214aSPierre Jolivet PetscInt dim; 16*c7a4214aSPierre Jolivet PetscReal *gcoords_target; 17*c7a4214aSPierre Jolivet PetscReal *gcoords_source; 18*c7a4214aSPierre Jolivet PetscScalar *work_target; 19*c7a4214aSPierre Jolivet PetscScalar *work_source; 20*c7a4214aSPierre Jolivet PetscScalar s; 21*c7a4214aSPierre Jolivet PetscInt bs[2]; 22*c7a4214aSPierre Jolivet PetscReal epsilon; 23*c7a4214aSPierre Jolivet PetscReal eta; 24*c7a4214aSPierre Jolivet PetscInt depth[2]; 25*c7a4214aSPierre Jolivet MatHtoolCompressorType compressor; 26*c7a4214aSPierre Jolivet MatHtoolKernel kernel; 27*c7a4214aSPierre Jolivet void* kernelctx; 28*c7a4214aSPierre Jolivet WrapperHtool *wrapper; 29*c7a4214aSPierre Jolivet htool::HMatrixVirtual<PetscScalar> *hmatrix; 30*c7a4214aSPierre Jolivet }; 31*c7a4214aSPierre Jolivet 32*c7a4214aSPierre Jolivet struct MatHtoolKernelTranspose { 33*c7a4214aSPierre Jolivet Mat A; 34*c7a4214aSPierre Jolivet MatHtoolKernel kernel; 35*c7a4214aSPierre Jolivet void* kernelctx; 36*c7a4214aSPierre Jolivet }; 37