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