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