xref: /petsc/src/mat/impls/htool/htool.hpp (revision 8434afd195968570cfdb5bc7b9cfc0a316d974ae)
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