xref: /libCEED/examples/fluids/include/mat-ceed-impl.h (revision c8564c30f55def119ddd4dd977f1131cd364f231)
1*c8564c30SJames Wright #ifndef MAT_CEED_IMPL_H
2*c8564c30SJames Wright #define MAT_CEED_IMPL_H
3*c8564c30SJames Wright 
4*c8564c30SJames Wright #include <ceed.h>
5*c8564c30SJames Wright #include <petscdm.h>
6*c8564c30SJames Wright #include <petscmat.h>
7*c8564c30SJames Wright 
8*c8564c30SJames Wright #if defined(__clang_analyzer__)
9*c8564c30SJames Wright #define MATCEED_EXTERN extern
10*c8564c30SJames Wright #elif defined(__cplusplus)
11*c8564c30SJames Wright #define MATCEED_EXTERN extern "C"
12*c8564c30SJames Wright #else
13*c8564c30SJames Wright #define MATCEED_EXTERN extern
14*c8564c30SJames Wright #endif
15*c8564c30SJames Wright 
16*c8564c30SJames Wright #if defined(__clang_analyzer__)
17*c8564c30SJames Wright #define MATCEED_INTERN
18*c8564c30SJames Wright #else
19*c8564c30SJames Wright #define MATCEED_INTERN MATCEED_EXTERN __attribute__((visibility("hidden")))
20*c8564c30SJames Wright #endif
21*c8564c30SJames Wright 
22*c8564c30SJames Wright /**
23*c8564c30SJames Wright   @brief Calls a libCEED function and then checks the resulting error code.
24*c8564c30SJames Wright   If the error code is non-zero, then a PETSc error is set with the libCEED error message.
25*c8564c30SJames Wright **/
26*c8564c30SJames Wright #define PetscCeedCall(ceed_, ...)                                   \
27*c8564c30SJames Wright   do {                                                              \
28*c8564c30SJames Wright     int ierr_q_ = __VA_ARGS__;                                      \
29*c8564c30SJames Wright     if (ierr_q_ != CEED_ERROR_SUCCESS) {                            \
30*c8564c30SJames Wright       const char *error_message;                                    \
31*c8564c30SJames Wright       CeedGetErrorMessage(ceed_, &error_message);                   \
32*c8564c30SJames Wright       SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "%s", error_message); \
33*c8564c30SJames Wright     }                                                               \
34*c8564c30SJames Wright   } while (0)
35*c8564c30SJames Wright 
36*c8564c30SJames Wright // MatCeed context for applying composite CeedOperator on a DM
37*c8564c30SJames Wright typedef struct MatCeedContext_private *MatCeedContext;
38*c8564c30SJames Wright struct MatCeedContext_private {
39*c8564c30SJames Wright   Ceed           ceed;
40*c8564c30SJames Wright   char          *name, *internal_mat_type;
41*c8564c30SJames Wright   PetscMemType   mem_type;
42*c8564c30SJames Wright   PetscInt       ref_count, num_mats_assembled_full, num_mats_assembled_pbd;
43*c8564c30SJames Wright   PetscBool      is_destroyed, is_ceed_pbd_valid, is_ceed_vpbd_valid;
44*c8564c30SJames Wright   PetscLogEvent  log_event_mult, log_event_mult_transpose;
45*c8564c30SJames Wright   DM             dm_x, dm_y;
46*c8564c30SJames Wright   Mat           *mats_assembled_full, *mats_assembled_pbd, mat_assembled_full_internal, mat_assembled_pbd_internal;
47*c8564c30SJames Wright   Vec            X_loc, Y_loc_transpose;
48*c8564c30SJames Wright   CeedVector     x_loc, y_loc, coo_values_full, coo_values_pbd;
49*c8564c30SJames Wright   CeedOperator   op_mult, op_mult_transpose;
50*c8564c30SJames Wright   PetscLogDouble flops_mult, flops_mult_transpose;
51*c8564c30SJames Wright };
52*c8564c30SJames Wright 
53*c8564c30SJames Wright // Context data
54*c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextCreate(DM dm_x, DM dm_y, Vec X_loc, Vec Y_loc_transpose, CeedOperator op_mult,
55*c8564c30SJames Wright                                                    CeedOperator op_mult_transpose, PetscLogEvent log_event_mult,
56*c8564c30SJames Wright                                                    PetscLogEvent log_event_mult_transpose, MatCeedContext *ctx);
57*c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextReference(MatCeedContext ctx);
58*c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextReferenceCopy(MatCeedContext ctx, MatCeedContext *ctx_copy);
59*c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextDestroy(MatCeedContext ctx);
60*c8564c30SJames Wright 
61*c8564c30SJames Wright // Mat Ceed
62*c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatGetDiagonal_Ceed(Mat A, Vec D);
63*c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatMult_Ceed(Mat A, Vec X, Vec Y);
64*c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatMultTranspose_Ceed(Mat A, Vec Y, Vec X);
65*c8564c30SJames Wright 
66*c8564c30SJames Wright extern PetscClassId  MATCEED_CLASSID;
67*c8564c30SJames Wright extern PetscLogEvent MATCEED_MULT, MATCEED_MULT_TRANSPOSE;
68*c8564c30SJames Wright 
69*c8564c30SJames Wright #endif  // MAT_CEED_IMPL_H
70