1*24a65d3dSJeremy L Thompson // Copyright (c) 2017-2023, Lawrence Livermore National Security, LLC and other CEED contributors. 2*24a65d3dSJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3*24a65d3dSJeremy L Thompson // 4*24a65d3dSJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 5*24a65d3dSJeremy L Thompson // 6*24a65d3dSJeremy L Thompson // This file is part of CEED: http://github.com/ceed 7*24a65d3dSJeremy L Thompson #pragma once 8c8564c30SJames Wright 9c8564c30SJames Wright #include <ceed.h> 10c8564c30SJames Wright #include <petscdm.h> 11c8564c30SJames Wright #include <petscmat.h> 12c8564c30SJames Wright 13c8564c30SJames Wright #if defined(__clang_analyzer__) 14c8564c30SJames Wright #define MATCEED_EXTERN extern 15c8564c30SJames Wright #elif defined(__cplusplus) 16c8564c30SJames Wright #define MATCEED_EXTERN extern "C" 17c8564c30SJames Wright #else 18c8564c30SJames Wright #define MATCEED_EXTERN extern 19c8564c30SJames Wright #endif 20c8564c30SJames Wright 21c8564c30SJames Wright #if defined(__clang_analyzer__) 22c8564c30SJames Wright #define MATCEED_INTERN 23c8564c30SJames Wright #else 24c8564c30SJames Wright #define MATCEED_INTERN MATCEED_EXTERN __attribute__((visibility("hidden"))) 25c8564c30SJames Wright #endif 26c8564c30SJames Wright 27c8564c30SJames Wright /** 28c8564c30SJames Wright @brief Calls a libCEED function and then checks the resulting error code. 29c8564c30SJames Wright If the error code is non-zero, then a PETSc error is set with the libCEED error message. 30c8564c30SJames Wright **/ 31d0593705SJames Wright #ifndef PetscCallCeed 3254831c5fSJames Wright #define PetscCallCeed(ceed_, ...) \ 33c8564c30SJames Wright do { \ 34c8564c30SJames Wright int ierr_q_ = __VA_ARGS__; \ 35c8564c30SJames Wright if (ierr_q_ != CEED_ERROR_SUCCESS) { \ 36c8564c30SJames Wright const char *error_message; \ 37c8564c30SJames Wright CeedGetErrorMessage(ceed_, &error_message); \ 38c8564c30SJames Wright SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "%s", error_message); \ 39c8564c30SJames Wright } \ 40c8564c30SJames Wright } while (0) 41d0593705SJames Wright #endif 42c8564c30SJames Wright 43c8564c30SJames Wright // MatCeed context for applying composite CeedOperator on a DM 44c8564c30SJames Wright typedef struct MatCeedContext_private *MatCeedContext; 45c8564c30SJames Wright struct MatCeedContext_private { 46c8564c30SJames Wright Ceed ceed; 47c8564c30SJames Wright char *name, *internal_mat_type; 48c8564c30SJames Wright PetscMemType mem_type; 49c8564c30SJames Wright PetscInt ref_count, num_mats_assembled_full, num_mats_assembled_pbd; 50c8564c30SJames Wright PetscBool is_destroyed, is_ceed_pbd_valid, is_ceed_vpbd_valid; 51c8564c30SJames Wright PetscLogEvent log_event_mult, log_event_mult_transpose; 52c8564c30SJames Wright DM dm_x, dm_y; 53c8564c30SJames Wright Mat *mats_assembled_full, *mats_assembled_pbd, mat_assembled_full_internal, mat_assembled_pbd_internal; 54c8564c30SJames Wright Vec X_loc, Y_loc_transpose; 55c8564c30SJames Wright CeedVector x_loc, y_loc, coo_values_full, coo_values_pbd; 56c8564c30SJames Wright CeedOperator op_mult, op_mult_transpose; 57c8564c30SJames Wright PetscLogDouble flops_mult, flops_mult_transpose; 58c8564c30SJames Wright }; 59c8564c30SJames Wright 60c8564c30SJames Wright // Context data 61c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextCreate(DM dm_x, DM dm_y, Vec X_loc, Vec Y_loc_transpose, CeedOperator op_mult, 62c8564c30SJames Wright CeedOperator op_mult_transpose, PetscLogEvent log_event_mult, 63c8564c30SJames Wright PetscLogEvent log_event_mult_transpose, MatCeedContext *ctx); 64c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextReference(MatCeedContext ctx); 65c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextReferenceCopy(MatCeedContext ctx, MatCeedContext *ctx_copy); 66c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatCeedContextDestroy(MatCeedContext ctx); 67c8564c30SJames Wright 68c8564c30SJames Wright // Mat Ceed 69c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatGetDiagonal_Ceed(Mat A, Vec D); 70c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatMult_Ceed(Mat A, Vec X, Vec Y); 71c8564c30SJames Wright MATCEED_INTERN PetscErrorCode MatMultTranspose_Ceed(Mat A, Vec Y, Vec X); 72c8564c30SJames Wright 73c8564c30SJames Wright extern PetscClassId MATCEED_CLASSID; 74c8564c30SJames Wright extern PetscLogEvent MATCEED_MULT, MATCEED_MULT_TRANSPOSE; 75