xref: /honee/src/bc_definition.c (revision 487a3b6eda64cf40e061fc4581b3baf5568d446a)
1*487a3b6eSJames Wright // Copyright (c) 2017-2024, Lawrence Livermore National Security, LLC and other CEED contributors.
2*487a3b6eSJames Wright // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3*487a3b6eSJames Wright //
4*487a3b6eSJames Wright // SPDX-License-Identifier: BSD-2-Clause
5*487a3b6eSJames Wright //
6*487a3b6eSJames Wright // This file is part of CEED:  http://github.com/ceed
7*487a3b6eSJames Wright 
8*487a3b6eSJames Wright #include <bc_definition.h>
9*487a3b6eSJames Wright 
10*487a3b6eSJames Wright /**
11*487a3b6eSJames Wright    @brief Create `BCDefinition`
12*487a3b6eSJames Wright 
13*487a3b6eSJames Wright    @param[in]  name             Name of the boundary condition
14*487a3b6eSJames Wright    @param[in]  num_label_values Number of `DMLabel` values
15*487a3b6eSJames Wright    @param[in]  label_values     Array of label values that define the boundaries controlled by the `BCDefinition`, size `num_label_values`
16*487a3b6eSJames Wright    @param[out] bc_def           The new `BCDefinition`
17*487a3b6eSJames Wright **/
18*487a3b6eSJames Wright PetscErrorCode BCDefinitionCreate(const char *name, PetscInt num_label_values, PetscInt label_values[], BCDefinition *bc_def) {
19*487a3b6eSJames Wright   PetscFunctionBeginUser;
20*487a3b6eSJames Wright   PetscCall(PetscNew(bc_def));
21*487a3b6eSJames Wright 
22*487a3b6eSJames Wright   PetscCall(PetscStrallocpy(name, &(*bc_def)->name));
23*487a3b6eSJames Wright   (*bc_def)->num_label_values = num_label_values;
24*487a3b6eSJames Wright   PetscCall(PetscMalloc1(num_label_values, &(*bc_def)->label_values));
25*487a3b6eSJames Wright   for (PetscInt i = 0; i < num_label_values; i++) (*bc_def)->label_values[i] = label_values[i];
26*487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
27*487a3b6eSJames Wright }
28*487a3b6eSJames Wright 
29*487a3b6eSJames Wright /**
30*487a3b6eSJames Wright    @brief Get base information for `BCDefinition`
31*487a3b6eSJames Wright 
32*487a3b6eSJames Wright    @param[in]  bc_def           `BCDefinition` to get information from
33*487a3b6eSJames Wright    @param[out] name             Name of the `BCDefinition`
34*487a3b6eSJames Wright    @param[out] num_label_values Number of `DMLabel` values
35*487a3b6eSJames Wright    @param[out] label_values     Array of label values that define the boundaries controlled by the `BCDefinition`, size `num_label_values`
36*487a3b6eSJames Wright **/
37*487a3b6eSJames Wright PetscErrorCode BCDefinitionGetInfo(BCDefinition bc_def, const char *name[], PetscInt *num_label_values, const PetscInt *label_values[]) {
38*487a3b6eSJames Wright   PetscFunctionBeginUser;
39*487a3b6eSJames Wright   if (name) *name = bc_def->name;
40*487a3b6eSJames Wright   if (label_values) {
41*487a3b6eSJames Wright     *num_label_values = bc_def->num_label_values;
42*487a3b6eSJames Wright     *label_values     = bc_def->label_values;
43*487a3b6eSJames Wright   }
44*487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
45*487a3b6eSJames Wright }
46*487a3b6eSJames Wright 
47*487a3b6eSJames Wright /**
48*487a3b6eSJames Wright    @brief Destory a `BCDefinition` object
49*487a3b6eSJames Wright 
50*487a3b6eSJames Wright    @param[in,out] bc_def `BCDefinition` to be destroyed
51*487a3b6eSJames Wright **/
52*487a3b6eSJames Wright PetscErrorCode BCDefinitionDestroy(BCDefinition *bc_def) {
53*487a3b6eSJames Wright   PetscFunctionBeginUser;
54*487a3b6eSJames Wright   if ((*bc_def)->name) PetscCall(PetscFree((*bc_def)->name));
55*487a3b6eSJames Wright   if ((*bc_def)->label_values) PetscCall(PetscFree((*bc_def)->label_values));
56*487a3b6eSJames Wright   if ((*bc_def)->essential_comps) PetscCall(PetscFree((*bc_def)->essential_comps));
57*487a3b6eSJames Wright   PetscCall(PetscFree(*bc_def));
58*487a3b6eSJames Wright   *bc_def = NULL;
59*487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
60*487a3b6eSJames Wright }
61*487a3b6eSJames Wright 
62*487a3b6eSJames Wright /**
63*487a3b6eSJames Wright    @brief Set `DM_BC_ESSENTIAL` boundary condition values
64*487a3b6eSJames Wright 
65*487a3b6eSJames Wright    @param[in,out] bc_def              `BCDefinition` to set values to
66*487a3b6eSJames Wright    @param[in]     num_essential_comps Number of components to set
67*487a3b6eSJames Wright    @param[in]     essential_comps     Array of components to set, size `num_essential_comps`
68*487a3b6eSJames Wright **/
69*487a3b6eSJames Wright PetscErrorCode BCDefinitionSetEssential(BCDefinition bc_def, PetscInt num_essential_comps, PetscInt essential_comps[]) {
70*487a3b6eSJames Wright   PetscFunctionBeginUser;
71*487a3b6eSJames Wright   bc_def->num_essential_comps = num_essential_comps;
72*487a3b6eSJames Wright   PetscCall(PetscMalloc1(num_essential_comps, &bc_def->essential_comps));
73*487a3b6eSJames Wright   PetscCall(PetscArraycpy(bc_def->essential_comps, essential_comps, num_essential_comps));
74*487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
75*487a3b6eSJames Wright }
76*487a3b6eSJames Wright 
77*487a3b6eSJames Wright /**
78*487a3b6eSJames Wright    @brief Get `DM_BC_ESSENTIAL` boundary condition values
79*487a3b6eSJames Wright 
80*487a3b6eSJames Wright    @param[in]  bc_def              `BCDefinition` to set values to
81*487a3b6eSJames Wright    @param[out] num_essential_comps Number of components to set
82*487a3b6eSJames Wright    @param[out] essential_comps     Array of components to set, size `num_essential_comps`
83*487a3b6eSJames Wright **/
84*487a3b6eSJames Wright PetscErrorCode BCDefinitionGetEssential(BCDefinition bc_def, PetscInt *num_essential_comps, const PetscInt *essential_comps[]) {
85*487a3b6eSJames Wright   PetscFunctionBeginUser;
86*487a3b6eSJames Wright   *num_essential_comps = bc_def->num_essential_comps;
87*487a3b6eSJames Wright   *essential_comps     = bc_def->essential_comps;
88*487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
89*487a3b6eSJames Wright }
90*487a3b6eSJames Wright 
91*487a3b6eSJames Wright #define LABEL_ARRAY_SIZE 256
92*487a3b6eSJames Wright 
93*487a3b6eSJames Wright // @brief See `PetscOptionsBCDefinition`
94*487a3b6eSJames Wright PetscErrorCode PetscOptionsBCDefinition_Private(PetscOptionItems *PetscOptionsObject, const char opt[], const char text[], const char man[],
95*487a3b6eSJames Wright                                                 const char name[], BCDefinition *bc_def, PetscBool *set) {
96*487a3b6eSJames Wright   PetscInt num_label_values = LABEL_ARRAY_SIZE, label_values[LABEL_ARRAY_SIZE] = {0};
97*487a3b6eSJames Wright 
98*487a3b6eSJames Wright   PetscFunctionBeginUser;
99*487a3b6eSJames Wright   PetscCall(PetscOptionsIntArray(opt, text, man, label_values, &num_label_values, set));
100*487a3b6eSJames Wright   if (num_label_values > 0) {
101*487a3b6eSJames Wright     PetscCall(BCDefinitionCreate(name, num_label_values, label_values, bc_def));
102*487a3b6eSJames Wright   } else {
103*487a3b6eSJames Wright     *bc_def = NULL;
104*487a3b6eSJames Wright   }
105*487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
106*487a3b6eSJames Wright }
107