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