xref: /libCEED/examples/fluids/navierstokes.h (revision 69293791ba75885aee926dc69328d73a618631c8)
13d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
23d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
377841947SLeila Ghaffari //
43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause
577841947SLeila Ghaffari //
63d8e8822SJeremy L Thompson // This file is part of CEED:  http://github.com/ceed
777841947SLeila Ghaffari 
8b7c563b6SJeremy L Thompson #ifndef libceed_fluids_examples_navier_stokes_h
9b7c563b6SJeremy L Thompson #define libceed_fluids_examples_navier_stokes_h
1077841947SLeila Ghaffari 
1177841947SLeila Ghaffari #include <ceed.h>
1277841947SLeila Ghaffari #include <petscdm.h>
1377841947SLeila Ghaffari #include <petscdmplex.h>
1477841947SLeila Ghaffari #include <petscsys.h>
1577841947SLeila Ghaffari #include <petscts.h>
1677841947SLeila Ghaffari #include <stdbool.h>
17841e4c73SJed Brown #include "qfunctions/stabilization_types.h"
1897baf651SJames Wright #include "qfunctions/newtonian_types.h"
1977841947SLeila Ghaffari 
2077841947SLeila Ghaffari // -----------------------------------------------------------------------------
21b8962995SJeremy L Thompson // PETSc Version
2277841947SLeila Ghaffari // -----------------------------------------------------------------------------
23b8962995SJeremy L Thompson #if PETSC_VERSION_LT(3,17,0)
24b8962995SJeremy L Thompson #error "PETSc v3.17 or later is required"
2577841947SLeila Ghaffari #endif
2677841947SLeila Ghaffari 
2777841947SLeila Ghaffari // -----------------------------------------------------------------------------
2877841947SLeila Ghaffari // Enums
2977841947SLeila Ghaffari // -----------------------------------------------------------------------------
3077841947SLeila Ghaffari // Translate PetscMemType to CeedMemType
3177841947SLeila Ghaffari static inline CeedMemType MemTypeP2C(PetscMemType mem_type) {
3277841947SLeila Ghaffari   return PetscMemTypeDevice(mem_type) ? CEED_MEM_DEVICE : CEED_MEM_HOST;
3377841947SLeila Ghaffari }
3477841947SLeila Ghaffari 
3577841947SLeila Ghaffari // Advection - Wind Options
3677841947SLeila Ghaffari typedef enum {
3777841947SLeila Ghaffari   WIND_ROTATION    = 0,
3877841947SLeila Ghaffari   WIND_TRANSLATION = 1,
3977841947SLeila Ghaffari } WindType;
4077841947SLeila Ghaffari static const char *const WindTypes[] = {
4177841947SLeila Ghaffari   "rotation",
4277841947SLeila Ghaffari   "translation",
4377841947SLeila Ghaffari   "WindType", "WIND_", NULL
4477841947SLeila Ghaffari };
4577841947SLeila Ghaffari 
4677841947SLeila Ghaffari // Advection - Bubble Types
4777841947SLeila Ghaffari typedef enum {
4877841947SLeila Ghaffari   BUBBLE_SPHERE   = 0, // dim=3
4977841947SLeila Ghaffari   BUBBLE_CYLINDER = 1, // dim=2
5077841947SLeila Ghaffari } BubbleType;
5177841947SLeila Ghaffari static const char *const BubbleTypes[] = {
5277841947SLeila Ghaffari   "sphere",
5377841947SLeila Ghaffari   "cylinder",
5477841947SLeila Ghaffari   "BubbleType", "BUBBLE_", NULL
5577841947SLeila Ghaffari };
5677841947SLeila Ghaffari 
5777841947SLeila Ghaffari // Advection - Bubble Continuity Types
5877841947SLeila Ghaffari typedef enum {
5977841947SLeila Ghaffari   BUBBLE_CONTINUITY_SMOOTH     = 0,  // Original continuous, smooth shape
6077841947SLeila Ghaffari   BUBBLE_CONTINUITY_BACK_SHARP = 1,  // Discontinuous, sharp back half shape
6177841947SLeila Ghaffari   BUBBLE_CONTINUITY_THICK      = 2,  // Define a finite thickness
6277841947SLeila Ghaffari } BubbleContinuityType;
6377841947SLeila Ghaffari static const char *const BubbleContinuityTypes[] = {
6477841947SLeila Ghaffari   "smooth",
6577841947SLeila Ghaffari   "back_sharp",
6677841947SLeila Ghaffari   "thick",
6777841947SLeila Ghaffari   "BubbleContinuityType", "BUBBLE_CONTINUITY_", NULL
6877841947SLeila Ghaffari };
6977841947SLeila Ghaffari 
7077841947SLeila Ghaffari // Euler - test cases
7177841947SLeila Ghaffari typedef enum {
72bc7bbd5dSLeila Ghaffari   EULER_TEST_ISENTROPIC_VORTEX = 0,
7377841947SLeila Ghaffari   EULER_TEST_1 = 1,
7477841947SLeila Ghaffari   EULER_TEST_2 = 2,
7577841947SLeila Ghaffari   EULER_TEST_3 = 3,
7677841947SLeila Ghaffari   EULER_TEST_4 = 4,
7732f166c6SLeila Ghaffari   EULER_TEST_5 = 5,
7877841947SLeila Ghaffari } EulerTestType;
7977841947SLeila Ghaffari static const char *const EulerTestTypes[] = {
80bc7bbd5dSLeila Ghaffari   "isentropic_vortex",
81bc7bbd5dSLeila Ghaffari   "test_1",
82bc7bbd5dSLeila Ghaffari   "test_2",
83bc7bbd5dSLeila Ghaffari   "test_3",
84bc7bbd5dSLeila Ghaffari   "test_4",
8532f166c6SLeila Ghaffari   "test_5",
8677841947SLeila Ghaffari   "EulerTestType", "EULER_TEST_", NULL
8777841947SLeila Ghaffari };
8877841947SLeila Ghaffari 
8977841947SLeila Ghaffari // Stabilization methods
9077841947SLeila Ghaffari static const char *const StabilizationTypes[] = {
9177841947SLeila Ghaffari   "none",
9277841947SLeila Ghaffari   "SU",
9377841947SLeila Ghaffari   "SUPG",
9477841947SLeila Ghaffari   "StabilizationType", "STAB_", NULL
9577841947SLeila Ghaffari };
9677841947SLeila Ghaffari 
9777841947SLeila Ghaffari // -----------------------------------------------------------------------------
9877841947SLeila Ghaffari // Structs
9977841947SLeila Ghaffari // -----------------------------------------------------------------------------
10077841947SLeila Ghaffari // Structs declarations
10177841947SLeila Ghaffari typedef struct AppCtx_private    *AppCtx;
10277841947SLeila Ghaffari typedef struct CeedData_private  *CeedData;
10377841947SLeila Ghaffari typedef struct User_private      *User;
10477841947SLeila Ghaffari typedef struct Units_private     *Units;
10577841947SLeila Ghaffari typedef struct SimpleBC_private  *SimpleBC;
10677841947SLeila Ghaffari typedef struct Physics_private   *Physics;
10777841947SLeila Ghaffari 
10877841947SLeila Ghaffari // Application context from user command line options
10977841947SLeila Ghaffari struct AppCtx_private {
11077841947SLeila Ghaffari   // libCEED arguments
11177841947SLeila Ghaffari   char              ceed_resource[PETSC_MAX_PATH_LEN]; // libCEED backend
11277841947SLeila Ghaffari   PetscInt          degree;
11377841947SLeila Ghaffari   PetscInt          q_extra;
114544be873SJed Brown   // Solver arguments
115544be873SJed Brown   MatType           amat_type;
116544be873SJed Brown   PetscBool         pmat_pbdiagonal;
11777841947SLeila Ghaffari   // Post-processing arguments
11877841947SLeila Ghaffari   PetscInt          output_freq;
11977841947SLeila Ghaffari   PetscInt          viz_refine;
12077841947SLeila Ghaffari   PetscInt          cont_steps;
121*69293791SJames Wright   char              cont_file[PETSC_MAX_PATH_LEN];
122*69293791SJames Wright   char              cont_time_file[PETSC_MAX_PATH_LEN];
12377841947SLeila Ghaffari   char              output_dir[PETSC_MAX_PATH_LEN];
124*69293791SJames Wright   PetscBool         add_stepnum2bin;
12577841947SLeila Ghaffari   // Problem type arguments
12677841947SLeila Ghaffari   PetscFunctionList problems;
12777841947SLeila Ghaffari   char              problem_name[PETSC_MAX_PATH_LEN];
12877841947SLeila Ghaffari   // Test mode arguments
12977841947SLeila Ghaffari   PetscBool         test_mode;
13077841947SLeila Ghaffari   PetscScalar       test_tol;
13177841947SLeila Ghaffari   char              file_path[PETSC_MAX_PATH_LEN];
13277841947SLeila Ghaffari };
13377841947SLeila Ghaffari 
13477841947SLeila Ghaffari // libCEED data struct
13577841947SLeila Ghaffari struct CeedData_private {
13677841947SLeila Ghaffari   CeedVector           x_coord, q_data;
13777841947SLeila Ghaffari   CeedQFunction        qf_setup_vol, qf_ics, qf_rhs_vol, qf_ifunction_vol,
138e334ad8fSJed Brown                        qf_setup_sur,
139e334ad8fSJed Brown                        qf_apply_inflow, qf_apply_inflow_jacobian,
140f4ca79c2SJames Wright                        qf_apply_outflow, qf_apply_outflow_jacobian,
141f4ca79c2SJames Wright                        qf_apply_freestream, qf_apply_freestream_jacobian;
142959b8288SJames Wright   CeedBasis            basis_x, basis_xc, basis_q, basis_x_sur, basis_q_sur,
143959b8288SJames Wright                        basis_xc_sur;
14477841947SLeila Ghaffari   CeedElemRestriction  elem_restr_x, elem_restr_q, elem_restr_qd_i;
14577841947SLeila Ghaffari   CeedOperator         op_setup_vol, op_ics;
14677841947SLeila Ghaffari };
14777841947SLeila Ghaffari 
14877841947SLeila Ghaffari // PETSc user data
14977841947SLeila Ghaffari struct User_private {
15077841947SLeila Ghaffari   MPI_Comm     comm;
15177841947SLeila Ghaffari   DM           dm;
15277841947SLeila Ghaffari   DM           dm_viz;
15377841947SLeila Ghaffari   Mat          interp_viz;
15477841947SLeila Ghaffari   Ceed         ceed;
15577841947SLeila Ghaffari   Units        units;
1565e82a6e1SJeremy L Thompson   Vec          M, Q_loc, Q_dot_loc;
15777841947SLeila Ghaffari   Physics      phys;
15877841947SLeila Ghaffari   AppCtx       app_ctx;
159544be873SJed Brown   CeedVector   q_ceed, q_dot_ceed, g_ceed, coo_values_amat, coo_values_pmat,
160544be873SJed Brown                x_ceed;
161dada6cc0SJames Wright   CeedOperator op_rhs_vol, op_rhs, op_ifunction_vol, op_ifunction, op_ijacobian,
162dada6cc0SJames Wright                op_dirichlet;
163e334ad8fSJed Brown   bool matrices_set_up;
1645e82a6e1SJeremy L Thompson   CeedScalar time, dt;
16577841947SLeila Ghaffari };
16677841947SLeila Ghaffari 
16777841947SLeila Ghaffari // Units
16877841947SLeila Ghaffari struct Units_private {
16977841947SLeila Ghaffari   // fundamental units
17077841947SLeila Ghaffari   PetscScalar meter;
17177841947SLeila Ghaffari   PetscScalar kilogram;
17277841947SLeila Ghaffari   PetscScalar second;
17377841947SLeila Ghaffari   PetscScalar Kelvin;
17477841947SLeila Ghaffari   // derived units
17577841947SLeila Ghaffari   PetscScalar Pascal;
17677841947SLeila Ghaffari   PetscScalar J_per_kg_K;
17777841947SLeila Ghaffari   PetscScalar m_per_squared_s;
17877841947SLeila Ghaffari   PetscScalar W_per_m_K;
17977841947SLeila Ghaffari   PetscScalar Joule;
18077841947SLeila Ghaffari };
18177841947SLeila Ghaffari 
18277841947SLeila Ghaffari // Boundary conditions
18377841947SLeila Ghaffari struct SimpleBC_private {
1842fe7aee7SLeila Ghaffari   PetscInt  num_wall,    // Number of faces with wall BCs
1852fe7aee7SLeila Ghaffari             wall_comps[5], // An array of constrained component numbers
1862fe7aee7SLeila Ghaffari             num_comps,
1872fe7aee7SLeila Ghaffari             num_slip[3], // Number of faces with slip BCs
1882fe7aee7SLeila Ghaffari             num_inflow,
189f4ca79c2SJames Wright             num_outflow,
190f4ca79c2SJames Wright             num_freestream;
191f4ca79c2SJames Wright   PetscInt  walls[16], slips[3][16], inflows[16], outflows[16], freestreams[16];
19277841947SLeila Ghaffari   PetscBool user_bc;
19377841947SLeila Ghaffari };
19477841947SLeila Ghaffari 
19577841947SLeila Ghaffari // Struct that contains all enums and structs used for the physics of all problems
19677841947SLeila Ghaffari struct Physics_private {
19777841947SLeila Ghaffari   WindType                 wind_type;
19877841947SLeila Ghaffari   BubbleType               bubble_type;
19977841947SLeila Ghaffari   BubbleContinuityType     bubble_continuity_type;
20077841947SLeila Ghaffari   EulerTestType            euler_test;
20177841947SLeila Ghaffari   StabilizationType        stab;
20277841947SLeila Ghaffari   PetscBool                implicit;
20397baf651SJames Wright   StateVariable            state_var;
20477841947SLeila Ghaffari   PetscBool                has_curr_time;
20577841947SLeila Ghaffari   PetscBool                has_neumann;
20611436a05SJames Wright   CeedContextFieldLabel    solution_time_label;
207cd4035ffSJames Wright   CeedContextFieldLabel    stg_solution_time_label;
20888626eedSJames Wright   CeedContextFieldLabel    timestep_size_label;
209841e4c73SJed Brown   CeedContextFieldLabel    ics_time_label;
210e334ad8fSJed Brown   CeedContextFieldLabel    ijacobian_time_shift_label;
21177841947SLeila Ghaffari };
21277841947SLeila Ghaffari 
21391e5af17SJed Brown typedef struct {
21491e5af17SJed Brown   CeedQFunctionUser    qfunction;
21591e5af17SJed Brown   const char           *qfunction_loc;
216841e4c73SJed Brown   CeedQFunctionContext qfunction_context;
21791e5af17SJed Brown } ProblemQFunctionSpec;
21891e5af17SJed Brown 
21977841947SLeila Ghaffari // Problem specific data
22077841947SLeila Ghaffari // *INDENT-OFF*
221841e4c73SJed Brown typedef struct ProblemData_private ProblemData;
222841e4c73SJed Brown struct ProblemData_private {
223e334ad8fSJed Brown   CeedInt           dim, q_data_size_vol, q_data_size_sur, jac_data_size_sur;
2241864f1c2SLeila Ghaffari   CeedScalar        dm_scale;
22591e5af17SJed Brown   ProblemQFunctionSpec setup_vol, setup_sur, ics, apply_vol_rhs, apply_vol_ifunction,
226f4ca79c2SJames Wright     apply_vol_ijacobian, apply_inflow, apply_outflow, apply_freestream,
227f4ca79c2SJames Wright     apply_inflow_jacobian, apply_outflow_jacobian, apply_freestream_jacobian;
22877841947SLeila Ghaffari   bool              non_zero_time;
22977841947SLeila Ghaffari   PetscErrorCode    (*bc)(PetscInt, PetscReal, const PetscReal[], PetscInt,
23077841947SLeila Ghaffari                           PetscScalar[], void *);
231c95f9967SJed Brown   void *bc_ctx;
232dada6cc0SJames Wright   PetscBool bc_from_ics, use_dirichlet_ceed;
233b1289648SJed Brown   PetscErrorCode    (*print_info)(ProblemData*, AppCtx);
234841e4c73SJed Brown };
23577841947SLeila Ghaffari // *INDENT-ON*
23677841947SLeila Ghaffari 
237841e4c73SJed Brown extern int FreeContextPetsc(void *);
238841e4c73SJed Brown 
23977841947SLeila Ghaffari // -----------------------------------------------------------------------------
24077841947SLeila Ghaffari // Set up problems
24177841947SLeila Ghaffari // -----------------------------------------------------------------------------
24277841947SLeila Ghaffari // Set up function for each problem
243cea0a271SJames Wright extern PetscErrorCode NS_NEWTONIAN_WAVE(ProblemData *problem, DM dm,
244cea0a271SJames Wright                                         void *ctx);
24588626eedSJames Wright extern PetscErrorCode NS_CHANNEL(ProblemData *problem, DM dm,
246a0add3c9SJed Brown                                  void *ctx);
24788626eedSJames Wright extern PetscErrorCode NS_BLASIUS(ProblemData *problem, DM dm,
248a0add3c9SJed Brown                                  void *ctx);
24988b783a1SJames Wright extern PetscErrorCode NS_NEWTONIAN_IG(ProblemData *problem, DM dm,
250a0add3c9SJed Brown                                       void *ctx);
2511864f1c2SLeila Ghaffari extern PetscErrorCode NS_DENSITY_CURRENT(ProblemData *problem, DM dm,
252019b7682STimothy Aiken     void *ctx);
253019b7682STimothy Aiken 
2541864f1c2SLeila Ghaffari extern PetscErrorCode NS_EULER_VORTEX(ProblemData *problem, DM dm,
255019b7682STimothy Aiken                                       void *ctx);
256a0add3c9SJed Brown extern PetscErrorCode NS_SHOCKTUBE(ProblemData *problem, DM dm,
257a0add3c9SJed Brown                                    void *ctx);
258a0add3c9SJed Brown extern PetscErrorCode NS_ADVECTION(ProblemData *problem, DM dm,
25977841947SLeila Ghaffari                                    void *ctx);
2601864f1c2SLeila Ghaffari extern PetscErrorCode NS_ADVECTION2D(ProblemData *problem, DM dm,
261a0add3c9SJed Brown                                      void *ctx);
26277841947SLeila Ghaffari 
26377841947SLeila Ghaffari // Print function for each problem
264dc805cc4SLeila Ghaffari extern PetscErrorCode PRINT_NEWTONIAN(ProblemData *problem, AppCtx app_ctx);
26577841947SLeila Ghaffari 
266dc805cc4SLeila Ghaffari extern PetscErrorCode PRINT_EULER_VORTEX(ProblemData *problem, AppCtx app_ctx);
26777841947SLeila Ghaffari 
268dc805cc4SLeila Ghaffari extern PetscErrorCode PRINT_SHOCKTUBE(ProblemData *problem, AppCtx app_ctx);
269019b7682STimothy Aiken 
270dc805cc4SLeila Ghaffari extern PetscErrorCode PRINT_ADVECTION(ProblemData *problem, AppCtx app_ctx);
27177841947SLeila Ghaffari 
272dc805cc4SLeila Ghaffari extern PetscErrorCode PRINT_ADVECTION2D(ProblemData *problem, AppCtx app_ctx);
27377841947SLeila Ghaffari 
27477841947SLeila Ghaffari // -----------------------------------------------------------------------------
27577841947SLeila Ghaffari // libCEED functions
27677841947SLeila Ghaffari // -----------------------------------------------------------------------------
27777841947SLeila Ghaffari // Utility function - essential BC dofs are encoded in closure indices as -(i+1).
27877841947SLeila Ghaffari PetscInt Involute(PetscInt i);
27977841947SLeila Ghaffari 
28077841947SLeila Ghaffari // Utility function to create local CEED restriction
2817ed3e4cdSJeremy L Thompson PetscErrorCode CreateRestrictionFromPlex(Ceed ceed, DM dm, CeedInt height,
2827ed3e4cdSJeremy L Thompson     DMLabel domain_label, CeedInt value, CeedElemRestriction *elem_restr);
28377841947SLeila Ghaffari 
28477841947SLeila Ghaffari // Utility function to get Ceed Restriction for each domain
28577841947SLeila Ghaffari PetscErrorCode GetRestrictionForDomain(Ceed ceed, DM dm, CeedInt height,
28677841947SLeila Ghaffari                                        DMLabel domain_label, PetscInt value,
2877ed3e4cdSJeremy L Thompson                                        CeedInt Q, CeedInt q_data_size,
28877841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_q,
28977841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_x,
29077841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_qd_i);
29177841947SLeila Ghaffari 
29277841947SLeila Ghaffari // Utility function to create CEED Composite Operator for the entire domain
29377841947SLeila Ghaffari PetscErrorCode CreateOperatorForDomain(Ceed ceed, DM dm, SimpleBC bc,
29477841947SLeila Ghaffari                                        CeedData ceed_data, Physics phys,
295e334ad8fSJed Brown                                        CeedOperator op_apply_vol,
296e334ad8fSJed Brown                                        CeedOperator op_apply_ijacobian_vol,
297e334ad8fSJed Brown                                        CeedInt height,
298e334ad8fSJed Brown                                        CeedInt P_sur, CeedInt Q_sur,
299e334ad8fSJed Brown                                        CeedInt q_data_size_sur, CeedInt jac_data_size_sur,
300e334ad8fSJed Brown                                        CeedOperator *op_apply, CeedOperator *op_apply_ijacobian);
30177841947SLeila Ghaffari 
30277841947SLeila Ghaffari PetscErrorCode SetupLibceed(Ceed ceed, CeedData ceed_data, DM dm, User user,
303c95f9967SJed Brown                             AppCtx app_ctx, ProblemData *problem, SimpleBC bc);
30477841947SLeila Ghaffari 
30577841947SLeila Ghaffari // -----------------------------------------------------------------------------
30677841947SLeila Ghaffari // Time-stepping functions
30777841947SLeila Ghaffari // -----------------------------------------------------------------------------
30877841947SLeila Ghaffari // Compute mass matrix for explicit scheme
30977841947SLeila Ghaffari PetscErrorCode ComputeLumpedMassMatrix(Ceed ceed, DM dm, CeedData ceed_data,
31077841947SLeila Ghaffari                                        Vec M);
31177841947SLeila Ghaffari 
31277841947SLeila Ghaffari // RHS (Explicit time-stepper) function setup
31377841947SLeila Ghaffari PetscErrorCode RHS_NS(TS ts, PetscReal t, Vec Q, Vec G, void *user_data);
31477841947SLeila Ghaffari 
31577841947SLeila Ghaffari // Implicit time-stepper function setup
31677841947SLeila Ghaffari PetscErrorCode IFunction_NS(TS ts, PetscReal t, Vec Q, Vec Q_dot, Vec G,
31777841947SLeila Ghaffari                             void *user_data);
31877841947SLeila Ghaffari 
31977841947SLeila Ghaffari // User provided TS Monitor
32077841947SLeila Ghaffari PetscErrorCode TSMonitor_NS(TS ts, PetscInt step_no, PetscReal time, Vec Q,
32177841947SLeila Ghaffari                             void *ctx);
32277841947SLeila Ghaffari 
32377841947SLeila Ghaffari // TS: Create, setup, and solve
32477841947SLeila Ghaffari PetscErrorCode TSSolve_NS(DM dm, User user, AppCtx app_ctx, Physics phys,
32577841947SLeila Ghaffari                           Vec *Q, PetscScalar *f_time, TS *ts);
32677841947SLeila Ghaffari 
32777841947SLeila Ghaffari // -----------------------------------------------------------------------------
32877841947SLeila Ghaffari // Setup DM
32977841947SLeila Ghaffari // -----------------------------------------------------------------------------
3301864f1c2SLeila Ghaffari // Create mesh
3314ea65e7bSJed Brown PetscErrorCode CreateDM(MPI_Comm comm, ProblemData *problem,
3324ea65e7bSJed Brown                         MatType, VecType, DM *dm);
33377841947SLeila Ghaffari 
33477841947SLeila Ghaffari // Set up DM
33577841947SLeila Ghaffari PetscErrorCode SetUpDM(DM dm, ProblemData *problem, PetscInt degree,
336c95f9967SJed Brown                        SimpleBC bc, Physics phys);
33777841947SLeila Ghaffari 
33877841947SLeila Ghaffari // Refine DM for high-order viz
33977841947SLeila Ghaffari PetscErrorCode VizRefineDM(DM dm, User user, ProblemData *problem,
340c95f9967SJed Brown                            SimpleBC bc, Physics phys);
34177841947SLeila Ghaffari 
34277841947SLeila Ghaffari // -----------------------------------------------------------------------------
34377841947SLeila Ghaffari // Process command line options
34477841947SLeila Ghaffari // -----------------------------------------------------------------------------
34577841947SLeila Ghaffari // Register problems to be available on the command line
34677841947SLeila Ghaffari PetscErrorCode RegisterProblems_NS(AppCtx app_ctx);
34777841947SLeila Ghaffari 
34877841947SLeila Ghaffari // Process general command line options
3492fe7aee7SLeila Ghaffari PetscErrorCode ProcessCommandLineOptions(MPI_Comm comm, AppCtx app_ctx,
3502fe7aee7SLeila Ghaffari     SimpleBC bc);
35177841947SLeila Ghaffari 
35277841947SLeila Ghaffari // -----------------------------------------------------------------------------
35377841947SLeila Ghaffari // Miscellaneous utility functions
35477841947SLeila Ghaffari // -----------------------------------------------------------------------------
355841e4c73SJed Brown PetscErrorCode ICs_FixMultiplicity(DM dm, CeedData ceed_data, User user,
356841e4c73SJed Brown                                    Vec Q_loc, Vec Q,
35777841947SLeila Ghaffari                                    CeedScalar time);
35877841947SLeila Ghaffari 
35977841947SLeila Ghaffari PetscErrorCode DMPlexInsertBoundaryValues_NS(DM dm,
36077841947SLeila Ghaffari     PetscBool insert_essential, Vec Q_loc, PetscReal time, Vec face_geom_FVM,
36177841947SLeila Ghaffari     Vec cell_geom_FVM, Vec grad_FVM);
36277841947SLeila Ghaffari 
36377841947SLeila Ghaffari // Compare reference solution values with current test run for CI
36477841947SLeila Ghaffari PetscErrorCode RegressionTests_NS(AppCtx app_ctx, Vec Q);
36577841947SLeila Ghaffari 
36677841947SLeila Ghaffari // Get error for problems with exact solutions
367841e4c73SJed Brown PetscErrorCode GetError_NS(CeedData ceed_data, DM dm, User user, Vec Q,
36877841947SLeila Ghaffari                            PetscScalar final_time);
36977841947SLeila Ghaffari 
37077841947SLeila Ghaffari // Post-processing
37177841947SLeila Ghaffari PetscErrorCode PostProcess_NS(TS ts, CeedData ceed_data, DM dm,
372841e4c73SJed Brown                               ProblemData *problem, User user,
37377841947SLeila Ghaffari                               Vec Q, PetscScalar final_time);
37477841947SLeila Ghaffari 
37577841947SLeila Ghaffari // -- Gather initial Q values in case of continuation of simulation
37677841947SLeila Ghaffari PetscErrorCode SetupICsFromBinary(MPI_Comm comm, AppCtx app_ctx, Vec Q);
37777841947SLeila Ghaffari 
37877841947SLeila Ghaffari // Record boundary values from initial condition
37977841947SLeila Ghaffari PetscErrorCode SetBCsFromICs_NS(DM dm, Vec Q, Vec Q_loc);
38077841947SLeila Ghaffari 
38177841947SLeila Ghaffari // -----------------------------------------------------------------------------
382dada6cc0SJames Wright // Boundary Condition Related Functions
383dada6cc0SJames Wright // -----------------------------------------------------------------------------
384dada6cc0SJames Wright 
385dada6cc0SJames Wright // Setup StrongBCs that use QFunctions
386dada6cc0SJames Wright PetscErrorCode SetupStrongBC_Ceed(Ceed ceed, CeedData ceed_data, DM dm,
387dada6cc0SJames Wright                                   User user, AppCtx app_ctx, ProblemData *problem,
388dada6cc0SJames Wright                                   SimpleBC bc, CeedInt Q_sur, CeedInt q_data_size_sur);
389b7c563b6SJeremy L Thompson 
39089e3cb53SJames Wright PetscErrorCode FreestreamBCSetup(ProblemData *problem, DM dm, void *ctx);
391b7c563b6SJeremy L Thompson #endif // libceed_fluids_examples_navier_stokes_h
392