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