1 // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
2 // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
3
4 #include <ceed.h>
5 #include <petsc-ceed.h>
6 #include "../qfunctions/mass.h"
7
8 /**
9 @brief Create mass CeedQFunction for number of components `N`
10
11 Output QFunction has two inputs ("u", and "qdata") and one output ("v").
12 "qdata" is assumed to have `wdetJ` as it's first component; all other components are ignored.
13
14 @param[in] ceed Ceed object
15 @param[in] N Number of components
16 @param[in] q_data_size Number of components of `CeedVector` holding wdetJ
17 @param[out] qf CeedQFunction of mass operator
18 **/
HoneeMassQFunctionCreate(Ceed ceed,CeedInt N,CeedInt q_data_size,CeedQFunction * qf)19 PetscErrorCode HoneeMassQFunctionCreate(Ceed ceed, CeedInt N, CeedInt q_data_size, CeedQFunction *qf) {
20 PetscFunctionBeginUser;
21 switch (N) {
22 case 1:
23 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_1, Mass_1_loc, qf));
24 break;
25 case 2:
26 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_2, Mass_2_loc, qf));
27 break;
28 case 3:
29 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_3, Mass_3_loc, qf));
30 break;
31 case 4:
32 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_4, Mass_4_loc, qf));
33 break;
34 case 5:
35 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_5, Mass_5_loc, qf));
36 break;
37 case 6:
38 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_6, Mass_6_loc, qf));
39 break;
40 case 7:
41 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_7, Mass_7_loc, qf));
42 break;
43 case 9:
44 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_9, Mass_9_loc, qf));
45 break;
46 case 12:
47 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_12, Mass_12_loc, qf));
48 break;
49 case 22:
50 PetscCallCeed(ceed, CeedQFunctionCreateInterior(ceed, 1, Mass_22, Mass_22_loc, qf));
51 break;
52 default:
53 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP,
54 "Mass qfunction of size %" CeedInt_FMT " does not exist.\nA new mass qfunction can be easily added; see source code for pattern.", N);
55 }
56
57 PetscCallCeed(ceed, CeedQFunctionAddInput(*qf, "u", N, CEED_EVAL_INTERP));
58 PetscCallCeed(ceed, CeedQFunctionAddInput(*qf, "qdata", q_data_size, CEED_EVAL_NONE));
59 PetscCallCeed(ceed, CeedQFunctionAddOutput(*qf, "v", N, CEED_EVAL_INTERP));
60 PetscCallCeed(ceed, CeedQFunctionSetUserFlopsEstimate(*qf, N));
61 PetscFunctionReturn(PETSC_SUCCESS);
62 }
63