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