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