1ae2b091fSJames Wright // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors. 2ae2b091fSJames Wright // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause 3487a3b6eSJames Wright 4149fb536SJames Wright #include <navierstokes.h> 5487a3b6eSJames Wright 6487a3b6eSJames Wright /** 7487a3b6eSJames Wright @brief Add `BCDefinition` to a `PetscSegBuffer` 8487a3b6eSJames Wright 9487a3b6eSJames Wright @param[in] bc_def `BCDefinition` to add 10487a3b6eSJames Wright @param[in,out] bc_defs_seg `PetscSegBuffer` to add to 11487a3b6eSJames Wright **/ 12487a3b6eSJames Wright static PetscErrorCode AddBCDefinitionToSegBuffer(BCDefinition bc_def, PetscSegBuffer bc_defs_seg) { 13487a3b6eSJames Wright BCDefinition *bc_def_ptr; 14487a3b6eSJames Wright 15487a3b6eSJames Wright PetscFunctionBeginUser; 16487a3b6eSJames Wright if (bc_def == NULL) PetscFunctionReturn(PETSC_SUCCESS); 17487a3b6eSJames Wright PetscCall(PetscSegBufferGet(bc_defs_seg, 1, &bc_def_ptr)); 18487a3b6eSJames Wright *bc_def_ptr = bc_def; 19487a3b6eSJames Wright PetscFunctionReturn(PETSC_SUCCESS); 20487a3b6eSJames Wright } 21487a3b6eSJames Wright 22487a3b6eSJames Wright /** 23487a3b6eSJames Wright @brief Create and setup `BCDefinition`s and `SimpleBC` from commandline options 24487a3b6eSJames Wright 25*0c373b74SJames Wright @param[in] honee `Honee` 26487a3b6eSJames Wright @param[in,out] problem `ProblemData` 27487a3b6eSJames Wright @param[in] app_ctx `AppCtx` 28487a3b6eSJames Wright @param[in,out] bc `SimpleBC` 29487a3b6eSJames Wright **/ 30*0c373b74SJames Wright PetscErrorCode BoundaryConditionSetUp(Honee honee, ProblemData problem, AppCtx app_ctx, SimpleBC bc) { 31487a3b6eSJames Wright PetscSegBuffer bc_defs_seg; 32487a3b6eSJames Wright PetscBool flg; 33487a3b6eSJames Wright BCDefinition bc_def; 34487a3b6eSJames Wright 35487a3b6eSJames Wright PetscFunctionBeginUser; 36487a3b6eSJames Wright PetscCall(PetscSegBufferCreate(sizeof(BCDefinition), 4, &bc_defs_seg)); 37487a3b6eSJames Wright 38*0c373b74SJames Wright PetscOptionsBegin(honee->comm, NULL, "Boundary Condition Options", NULL); 39487a3b6eSJames Wright 40487a3b6eSJames Wright PetscCall(PetscOptionsBCDefinition("-bc_wall", "Face IDs to apply wall BC", NULL, "wall", &bc_def, NULL)); 41487a3b6eSJames Wright PetscCall(AddBCDefinitionToSegBuffer(bc_def, bc_defs_seg)); 42487a3b6eSJames Wright if (bc_def) { 43487a3b6eSJames Wright PetscInt num_essential_comps = 16, essential_comps[16]; 44487a3b6eSJames Wright 45487a3b6eSJames Wright PetscCall(PetscOptionsIntArray("-wall_comps", "An array of constrained component numbers", NULL, essential_comps, &num_essential_comps, &flg)); 46487a3b6eSJames Wright PetscCall(BCDefinitionSetEssential(bc_def, num_essential_comps, essential_comps)); 47487a3b6eSJames Wright 48487a3b6eSJames Wright app_ctx->wall_forces.num_wall = bc_def->num_label_values; 49487a3b6eSJames Wright PetscCall(PetscMalloc1(bc_def->num_label_values, &app_ctx->wall_forces.walls)); 50487a3b6eSJames Wright PetscCall(PetscArraycpy(app_ctx->wall_forces.walls, bc_def->label_values, bc_def->num_label_values)); 51487a3b6eSJames Wright } 52487a3b6eSJames Wright 53487a3b6eSJames Wright { // Symmetry Boundary Conditions 54487a3b6eSJames Wright const char *deprecated[3] = {"-bc_slip_x", "-bc_slip_y", "-bc_slip_z"}; 55487a3b6eSJames Wright const char *flags[3] = {"-bc_symmetry_x", "-bc_symmetry_y", "-bc_symmetry_z"}; 56487a3b6eSJames Wright 57487a3b6eSJames Wright for (PetscInt j = 0; j < 3; j++) { 58487a3b6eSJames Wright PetscCall(PetscOptionsDeprecated(deprecated[j], flags[j], "libCEED 0.12.0", 59487a3b6eSJames Wright "Use -bc_symmetry_[x,y,z] for direct equivalency, or -bc_slip for weak, Riemann-based, direction-invariant " 60487a3b6eSJames Wright "slip/no-penatration boundary conditions")); 61487a3b6eSJames Wright PetscCall(PetscOptionsBCDefinition(flags[j], "Face IDs to apply symmetry BC", NULL, "symmetry", &bc_def, NULL)); 62487a3b6eSJames Wright if (!bc_def) { 63487a3b6eSJames Wright PetscCall(PetscOptionsBCDefinition(deprecated[j], "Face IDs to apply symmetry BC", NULL, "symmetry", &bc_def, NULL)); 64487a3b6eSJames Wright } 65487a3b6eSJames Wright PetscCall(AddBCDefinitionToSegBuffer(bc_def, bc_defs_seg)); 66487a3b6eSJames Wright if (bc_def) { 67487a3b6eSJames Wright PetscInt essential_comps[1] = {j + 1}; 68487a3b6eSJames Wright 69487a3b6eSJames Wright PetscCall(BCDefinitionSetEssential(bc_def, 1, essential_comps)); 70487a3b6eSJames Wright } 71487a3b6eSJames Wright } 72487a3b6eSJames Wright } 73487a3b6eSJames Wright 74487a3b6eSJames Wright // Inflow BCs 75487a3b6eSJames Wright bc->num_inflow = 16; 76487a3b6eSJames Wright PetscCall(PetscOptionsIntArray("-bc_inflow", "Face IDs to apply inflow BC", NULL, bc->inflows, &bc->num_inflow, NULL)); 77487a3b6eSJames Wright // Outflow BCs 78487a3b6eSJames Wright bc->num_outflow = 16; 79487a3b6eSJames Wright PetscCall(PetscOptionsIntArray("-bc_outflow", "Face IDs to apply outflow BC", NULL, bc->outflows, &bc->num_outflow, NULL)); 80487a3b6eSJames Wright // Freestream BCs 81487a3b6eSJames Wright bc->num_freestream = 16; 82487a3b6eSJames Wright PetscCall(PetscOptionsIntArray("-bc_freestream", "Face IDs to apply freestream BC", NULL, bc->freestreams, &bc->num_freestream, NULL)); 83487a3b6eSJames Wright 84487a3b6eSJames Wright bc->num_slip = 16; 85487a3b6eSJames Wright PetscCall(PetscOptionsIntArray("-bc_slip", "Face IDs to apply slip BC", NULL, bc->slips, &bc->num_slip, NULL)); 86487a3b6eSJames Wright 87487a3b6eSJames Wright PetscOptionsEnd(); 88487a3b6eSJames Wright 89487a3b6eSJames Wright PetscCall(PetscSegBufferGetSize(bc_defs_seg, &problem->num_bc_defs)); 90487a3b6eSJames Wright PetscCall(PetscSegBufferExtractAlloc(bc_defs_seg, &problem->bc_defs)); 91487a3b6eSJames Wright PetscCall(PetscSegBufferDestroy(&bc_defs_seg)); 92487a3b6eSJames Wright 93487a3b6eSJames Wright //TODO: Verify that the BCDefinition don't have overlapping claims to boundary faces 94487a3b6eSJames Wright 95487a3b6eSJames Wright PetscFunctionReturn(PETSC_SUCCESS); 96487a3b6eSJames Wright } 97