xref: /petsc/src/mat/impls/htool/htool.hpp (revision a496304597bacff3545e802853d69e8765312868)
1*a4963045SJacob 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;
8c7a4214aSPierre Jolivet   MatHtoolKernel &kernel;
9c7a4214aSPierre Jolivet   void           *ctx;
10c7a4214aSPierre Jolivet 
11c7a4214aSPierre Jolivet public:
12cab00e0dSPierre Jolivet   WrapperHtool(PetscInt M, PetscInt N, PetscInt sdim, MatHtoolKernel &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;
38c7a4214aSPierre Jolivet   MatHtoolKernel                      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;
46c7a4214aSPierre Jolivet   MatHtoolKernel kernel;
47c7a4214aSPierre Jolivet   void          *kernelctx;
48c7a4214aSPierre Jolivet };
49