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