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 **/ 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