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