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