xref: /honee/src/bc_definition.c (revision ddf6e2485b1945e3f3b13e0d521328e77b7bb6e7)
1ae2b091fSJames Wright // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
2ae2b091fSJames Wright // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
3487a3b6eSJames Wright 
4487a3b6eSJames Wright #include <bc_definition.h>
5487a3b6eSJames Wright 
6487a3b6eSJames Wright /**
7487a3b6eSJames Wright    @brief Create `BCDefinition`
8487a3b6eSJames Wright 
9487a3b6eSJames Wright    @param[in]  name             Name of the boundary condition
10487a3b6eSJames Wright    @param[in]  num_label_values Number of `DMLabel` values
11487a3b6eSJames Wright    @param[in]  label_values     Array of label values that define the boundaries controlled by the `BCDefinition`, size `num_label_values`
12487a3b6eSJames Wright    @param[out] bc_def           The new `BCDefinition`
13487a3b6eSJames Wright **/
14487a3b6eSJames Wright PetscErrorCode BCDefinitionCreate(const char *name, PetscInt num_label_values, PetscInt label_values[], BCDefinition *bc_def) {
15487a3b6eSJames Wright   PetscFunctionBeginUser;
16487a3b6eSJames Wright   PetscCall(PetscNew(bc_def));
17487a3b6eSJames Wright 
18487a3b6eSJames Wright   PetscCall(PetscStrallocpy(name, &(*bc_def)->name));
19487a3b6eSJames Wright   (*bc_def)->num_label_values = num_label_values;
20487a3b6eSJames Wright   PetscCall(PetscMalloc1(num_label_values, &(*bc_def)->label_values));
21487a3b6eSJames Wright   for (PetscInt i = 0; i < num_label_values; i++) (*bc_def)->label_values[i] = label_values[i];
22487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
23487a3b6eSJames Wright }
24487a3b6eSJames Wright 
25487a3b6eSJames Wright /**
26487a3b6eSJames Wright    @brief Get base information for `BCDefinition`
27487a3b6eSJames Wright 
28487a3b6eSJames Wright    @param[in]  bc_def           `BCDefinition` to get information from
29487a3b6eSJames Wright    @param[out] name             Name of the `BCDefinition`
30487a3b6eSJames Wright    @param[out] num_label_values Number of `DMLabel` values
31487a3b6eSJames Wright    @param[out] label_values     Array of label values that define the boundaries controlled by the `BCDefinition`, size `num_label_values`
32487a3b6eSJames Wright **/
33487a3b6eSJames Wright PetscErrorCode BCDefinitionGetInfo(BCDefinition bc_def, const char *name[], PetscInt *num_label_values, const PetscInt *label_values[]) {
34487a3b6eSJames Wright   PetscFunctionBeginUser;
35487a3b6eSJames Wright   if (name) *name = bc_def->name;
36487a3b6eSJames Wright   if (label_values) {
37487a3b6eSJames Wright     *num_label_values = bc_def->num_label_values;
38487a3b6eSJames Wright     *label_values     = bc_def->label_values;
39487a3b6eSJames Wright   }
40487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
41487a3b6eSJames Wright }
42487a3b6eSJames Wright 
43487a3b6eSJames Wright /**
44487a3b6eSJames Wright    @brief Destory a `BCDefinition` object
45487a3b6eSJames Wright 
46487a3b6eSJames Wright    @param[in,out] bc_def `BCDefinition` to be destroyed
47487a3b6eSJames Wright **/
48487a3b6eSJames Wright PetscErrorCode BCDefinitionDestroy(BCDefinition *bc_def) {
49487a3b6eSJames Wright   PetscFunctionBeginUser;
50487a3b6eSJames Wright   if ((*bc_def)->name) PetscCall(PetscFree((*bc_def)->name));
51487a3b6eSJames Wright   if ((*bc_def)->label_values) PetscCall(PetscFree((*bc_def)->label_values));
52487a3b6eSJames Wright   if ((*bc_def)->essential_comps) PetscCall(PetscFree((*bc_def)->essential_comps));
53487a3b6eSJames Wright   PetscCall(PetscFree(*bc_def));
54487a3b6eSJames Wright   *bc_def = NULL;
55487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
56487a3b6eSJames Wright }
57487a3b6eSJames Wright 
58487a3b6eSJames Wright /**
59487a3b6eSJames Wright    @brief Set `DM_BC_ESSENTIAL` boundary condition values
60487a3b6eSJames Wright 
61487a3b6eSJames Wright    @param[in,out] bc_def              `BCDefinition` to set values to
62487a3b6eSJames Wright    @param[in]     num_essential_comps Number of components to set
63487a3b6eSJames Wright    @param[in]     essential_comps     Array of components to set, size `num_essential_comps`
64487a3b6eSJames Wright **/
65487a3b6eSJames Wright PetscErrorCode BCDefinitionSetEssential(BCDefinition bc_def, PetscInt num_essential_comps, PetscInt essential_comps[]) {
66487a3b6eSJames Wright   PetscFunctionBeginUser;
67487a3b6eSJames Wright   bc_def->num_essential_comps = num_essential_comps;
68487a3b6eSJames Wright   PetscCall(PetscMalloc1(num_essential_comps, &bc_def->essential_comps));
69487a3b6eSJames Wright   PetscCall(PetscArraycpy(bc_def->essential_comps, essential_comps, num_essential_comps));
70487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
71487a3b6eSJames Wright }
72487a3b6eSJames Wright 
73487a3b6eSJames Wright /**
74487a3b6eSJames Wright    @brief Get `DM_BC_ESSENTIAL` boundary condition values
75487a3b6eSJames Wright 
76487a3b6eSJames Wright    @param[in]  bc_def              `BCDefinition` to set values to
77487a3b6eSJames Wright    @param[out] num_essential_comps Number of components to set
78487a3b6eSJames Wright    @param[out] essential_comps     Array of components to set, size `num_essential_comps`
79487a3b6eSJames Wright **/
80487a3b6eSJames Wright PetscErrorCode BCDefinitionGetEssential(BCDefinition bc_def, PetscInt *num_essential_comps, const PetscInt *essential_comps[]) {
81487a3b6eSJames Wright   PetscFunctionBeginUser;
82487a3b6eSJames Wright   *num_essential_comps = bc_def->num_essential_comps;
83487a3b6eSJames Wright   *essential_comps     = bc_def->essential_comps;
84487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
85487a3b6eSJames Wright }
86487a3b6eSJames Wright 
87487a3b6eSJames Wright #define LABEL_ARRAY_SIZE 256
88487a3b6eSJames Wright 
89487a3b6eSJames Wright // @brief See `PetscOptionsBCDefinition`
90*ddf6e248SJames Wright PetscErrorCode PetscOptionsBCDefinition_Private(PetscOptionItems PetscOptionsObject, const char opt[], const char text[], const char man[],
91487a3b6eSJames Wright                                                 const char name[], BCDefinition *bc_def, PetscBool *set) {
92487a3b6eSJames Wright   PetscInt num_label_values = LABEL_ARRAY_SIZE, label_values[LABEL_ARRAY_SIZE] = {0};
93487a3b6eSJames Wright 
94487a3b6eSJames Wright   PetscFunctionBeginUser;
95487a3b6eSJames Wright   PetscCall(PetscOptionsIntArray(opt, text, man, label_values, &num_label_values, set));
96487a3b6eSJames Wright   if (num_label_values > 0) {
97487a3b6eSJames Wright     PetscCall(BCDefinitionCreate(name, num_label_values, label_values, bc_def));
98487a3b6eSJames Wright   } else {
99487a3b6eSJames Wright     *bc_def = NULL;
100487a3b6eSJames Wright   }
101487a3b6eSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
102487a3b6eSJames Wright }
103