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 "../navierstokes.h"
9a8748852SJames Wright
10a8748852SJames Wright /**
11a8748852SJames Wright @brief Add `BCDefinition` to a `PetscSegBuffer`
12a8748852SJames Wright
13a8748852SJames Wright @param[in] bc_def `BCDefinition` to add
14a8748852SJames Wright @param[in,out] bc_defs_seg `PetscSegBuffer` to add to
15a8748852SJames Wright **/
AddBCDefinitionToSegBuffer(BCDefinition bc_def,PetscSegBuffer bc_defs_seg)16a8748852SJames Wright static PetscErrorCode AddBCDefinitionToSegBuffer(BCDefinition bc_def, PetscSegBuffer bc_defs_seg) {
17a8748852SJames Wright BCDefinition *bc_def_ptr;
18a8748852SJames Wright
19a8748852SJames Wright PetscFunctionBeginUser;
20a8748852SJames Wright if (bc_def == NULL) PetscFunctionReturn(PETSC_SUCCESS);
21a8748852SJames Wright PetscCall(PetscSegBufferGet(bc_defs_seg, 1, &bc_def_ptr));
22a8748852SJames Wright *bc_def_ptr = bc_def;
23a8748852SJames Wright PetscFunctionReturn(PETSC_SUCCESS);
24a8748852SJames Wright }
25a8748852SJames Wright
26a8748852SJames Wright /**
27a8748852SJames Wright @brief Create and setup `BCDefinition`s and `SimpleBC` from commandline options
28a8748852SJames Wright
29a8748852SJames Wright @param[in] user `User`
30a8748852SJames Wright @param[in,out] problem `ProblemData`
31a8748852SJames Wright @param[in] app_ctx `AppCtx`
32a8748852SJames Wright @param[in,out] bc `SimpleBC`
33a8748852SJames Wright **/
BoundaryConditionSetUp(User user,ProblemData problem,AppCtx app_ctx,SimpleBC bc)34a8748852SJames Wright PetscErrorCode BoundaryConditionSetUp(User user, ProblemData problem, AppCtx app_ctx, SimpleBC bc) {
35a8748852SJames Wright PetscSegBuffer bc_defs_seg;
36a8748852SJames Wright PetscBool flg;
37a8748852SJames Wright BCDefinition bc_def;
38a8748852SJames Wright
39a8748852SJames Wright PetscFunctionBeginUser;
40a8748852SJames Wright PetscCall(PetscSegBufferCreate(sizeof(BCDefinition), 4, &bc_defs_seg));
41a8748852SJames Wright
42a8748852SJames Wright PetscOptionsBegin(user->comm, NULL, "Boundary Condition Options", NULL);
43a8748852SJames Wright
44a8748852SJames Wright PetscCall(PetscOptionsBCDefinition("-bc_wall", "Face IDs to apply wall BC", NULL, "wall", &bc_def, NULL));
45a8748852SJames Wright PetscCall(AddBCDefinitionToSegBuffer(bc_def, bc_defs_seg));
46a8748852SJames Wright if (bc_def) {
47a8748852SJames Wright PetscInt num_essential_comps = 16, essential_comps[16];
48a8748852SJames Wright
49a8748852SJames Wright PetscCall(PetscOptionsIntArray("-wall_comps", "An array of constrained component numbers", NULL, essential_comps, &num_essential_comps, &flg));
50a8748852SJames Wright PetscCall(BCDefinitionSetEssential(bc_def, num_essential_comps, essential_comps));
51a8748852SJames Wright
52a8748852SJames Wright app_ctx->wall_forces.num_wall = bc_def->num_label_values;
53a8748852SJames Wright PetscCall(PetscMalloc1(bc_def->num_label_values, &app_ctx->wall_forces.walls));
54a8748852SJames Wright PetscCall(PetscArraycpy(app_ctx->wall_forces.walls, bc_def->label_values, bc_def->num_label_values));
55a8748852SJames Wright }
56a8748852SJames Wright
57a8748852SJames Wright { // Symmetry Boundary Conditions
58a8748852SJames Wright const char *deprecated[3] = {"-bc_slip_x", "-bc_slip_y", "-bc_slip_z"};
59a8748852SJames Wright const char *flags[3] = {"-bc_symmetry_x", "-bc_symmetry_y", "-bc_symmetry_z"};
60a8748852SJames Wright
61a8748852SJames Wright for (PetscInt j = 0; j < 3; j++) {
62a8748852SJames Wright PetscCall(PetscOptionsDeprecated(deprecated[j], flags[j], "libCEED 0.12.0",
63a8748852SJames Wright "Use -bc_symmetry_[x,y,z] for direct equivalency, or -bc_slip for weak, Riemann-based, direction-invariant "
64a8748852SJames Wright "slip/no-penatration boundary conditions"));
65a8748852SJames Wright PetscCall(PetscOptionsBCDefinition(flags[j], "Face IDs to apply symmetry BC", NULL, "symmetry", &bc_def, NULL));
66a8748852SJames Wright if (!bc_def) {
67a8748852SJames Wright PetscCall(PetscOptionsBCDefinition(deprecated[j], "Face IDs to apply symmetry BC", NULL, "symmetry", &bc_def, NULL));
68a8748852SJames Wright }
69a8748852SJames Wright PetscCall(AddBCDefinitionToSegBuffer(bc_def, bc_defs_seg));
70a8748852SJames Wright if (bc_def) {
71a8748852SJames Wright PetscInt essential_comps[1] = {j + 1};
72a8748852SJames Wright
73a8748852SJames Wright PetscCall(BCDefinitionSetEssential(bc_def, 1, essential_comps));
74a8748852SJames Wright }
75a8748852SJames Wright }
76a8748852SJames Wright }
77a8748852SJames Wright
78a8748852SJames Wright // Inflow BCs
79a8748852SJames Wright bc->num_inflow = 16;
80a8748852SJames Wright PetscCall(PetscOptionsIntArray("-bc_inflow", "Face IDs to apply inflow BC", NULL, bc->inflows, &bc->num_inflow, NULL));
81a8748852SJames Wright // Outflow BCs
82a8748852SJames Wright bc->num_outflow = 16;
83a8748852SJames Wright PetscCall(PetscOptionsIntArray("-bc_outflow", "Face IDs to apply outflow BC", NULL, bc->outflows, &bc->num_outflow, NULL));
84a8748852SJames Wright // Freestream BCs
85a8748852SJames Wright bc->num_freestream = 16;
86a8748852SJames Wright PetscCall(PetscOptionsIntArray("-bc_freestream", "Face IDs to apply freestream BC", NULL, bc->freestreams, &bc->num_freestream, NULL));
87a8748852SJames Wright
88a8748852SJames Wright bc->num_slip = 16;
89a8748852SJames Wright PetscCall(PetscOptionsIntArray("-bc_slip", "Face IDs to apply slip BC", NULL, bc->slips, &bc->num_slip, NULL));
90a8748852SJames Wright
91a8748852SJames Wright PetscOptionsEnd();
92a8748852SJames Wright
93a8748852SJames Wright PetscCall(PetscSegBufferGetSize(bc_defs_seg, &problem->num_bc_defs));
94a8748852SJames Wright PetscCall(PetscSegBufferExtractAlloc(bc_defs_seg, &problem->bc_defs));
95a8748852SJames Wright PetscCall(PetscSegBufferDestroy(&bc_defs_seg));
96a8748852SJames Wright
97a8748852SJames Wright //TODO: Verify that the BCDefinition don't have overlapping claims to boundary faces
98a8748852SJames Wright
99a8748852SJames Wright PetscFunctionReturn(PETSC_SUCCESS);
100a8748852SJames Wright }
101