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