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