xref: /libCEED/examples/fluids/navierstokes.h (revision 019b76820d7ff306c177822c4e76ffe5939c204b)
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>
1777841947SLeila Ghaffari 
1877841947SLeila Ghaffari // -----------------------------------------------------------------------------
19b8962995SJeremy L Thompson // PETSc Version
2077841947SLeila Ghaffari // -----------------------------------------------------------------------------
21b8962995SJeremy L Thompson #if PETSC_VERSION_LT(3,17,0)
22b8962995SJeremy L Thompson #error "PETSc v3.17 or later is required"
2377841947SLeila Ghaffari #endif
2477841947SLeila Ghaffari 
2577841947SLeila Ghaffari // -----------------------------------------------------------------------------
2677841947SLeila Ghaffari // Enums
2777841947SLeila Ghaffari // -----------------------------------------------------------------------------
2877841947SLeila Ghaffari // Translate PetscMemType to CeedMemType
2977841947SLeila Ghaffari static inline CeedMemType MemTypeP2C(PetscMemType mem_type) {
3077841947SLeila Ghaffari   return PetscMemTypeDevice(mem_type) ? CEED_MEM_DEVICE : CEED_MEM_HOST;
3177841947SLeila Ghaffari }
3277841947SLeila Ghaffari 
3377841947SLeila Ghaffari // Advection - Wind Options
3477841947SLeila Ghaffari typedef enum {
3577841947SLeila Ghaffari   WIND_ROTATION    = 0,
3677841947SLeila Ghaffari   WIND_TRANSLATION = 1,
3777841947SLeila Ghaffari } WindType;
3877841947SLeila Ghaffari static const char *const WindTypes[] = {
3977841947SLeila Ghaffari   "rotation",
4077841947SLeila Ghaffari   "translation",
4177841947SLeila Ghaffari   "WindType", "WIND_", NULL
4277841947SLeila Ghaffari };
4377841947SLeila Ghaffari 
4477841947SLeila Ghaffari // Advection - Bubble Types
4577841947SLeila Ghaffari typedef enum {
4677841947SLeila Ghaffari   BUBBLE_SPHERE   = 0, // dim=3
4777841947SLeila Ghaffari   BUBBLE_CYLINDER = 1, // dim=2
4877841947SLeila Ghaffari } BubbleType;
4977841947SLeila Ghaffari static const char *const BubbleTypes[] = {
5077841947SLeila Ghaffari   "sphere",
5177841947SLeila Ghaffari   "cylinder",
5277841947SLeila Ghaffari   "BubbleType", "BUBBLE_", NULL
5377841947SLeila Ghaffari };
5477841947SLeila Ghaffari 
5577841947SLeila Ghaffari // Advection - Bubble Continuity Types
5677841947SLeila Ghaffari typedef enum {
5777841947SLeila Ghaffari   BUBBLE_CONTINUITY_SMOOTH     = 0,  // Original continuous, smooth shape
5877841947SLeila Ghaffari   BUBBLE_CONTINUITY_BACK_SHARP = 1,  // Discontinuous, sharp back half shape
5977841947SLeila Ghaffari   BUBBLE_CONTINUITY_THICK      = 2,  // Define a finite thickness
6077841947SLeila Ghaffari } BubbleContinuityType;
6177841947SLeila Ghaffari static const char *const BubbleContinuityTypes[] = {
6277841947SLeila Ghaffari   "smooth",
6377841947SLeila Ghaffari   "back_sharp",
6477841947SLeila Ghaffari   "thick",
6577841947SLeila Ghaffari   "BubbleContinuityType", "BUBBLE_CONTINUITY_", NULL
6677841947SLeila Ghaffari };
6777841947SLeila Ghaffari 
6877841947SLeila Ghaffari // Euler - test cases
6977841947SLeila Ghaffari typedef enum {
70bc7bbd5dSLeila Ghaffari   EULER_TEST_ISENTROPIC_VORTEX = 0,
7177841947SLeila Ghaffari   EULER_TEST_1 = 1,
7277841947SLeila Ghaffari   EULER_TEST_2 = 2,
7377841947SLeila Ghaffari   EULER_TEST_3 = 3,
7477841947SLeila Ghaffari   EULER_TEST_4 = 4,
7532f166c6SLeila Ghaffari   EULER_TEST_5 = 5,
7677841947SLeila Ghaffari } EulerTestType;
7777841947SLeila Ghaffari static const char *const EulerTestTypes[] = {
78bc7bbd5dSLeila Ghaffari   "isentropic_vortex",
79bc7bbd5dSLeila Ghaffari   "test_1",
80bc7bbd5dSLeila Ghaffari   "test_2",
81bc7bbd5dSLeila Ghaffari   "test_3",
82bc7bbd5dSLeila Ghaffari   "test_4",
8332f166c6SLeila Ghaffari   "test_5",
8477841947SLeila Ghaffari   "EulerTestType", "EULER_TEST_", NULL
8577841947SLeila Ghaffari };
8677841947SLeila Ghaffari 
8777841947SLeila Ghaffari // Stabilization methods
8877841947SLeila Ghaffari typedef enum {
8977841947SLeila Ghaffari   STAB_NONE = 0,
9077841947SLeila Ghaffari   STAB_SU   = 1, // Streamline Upwind
9177841947SLeila Ghaffari   STAB_SUPG = 2, // Streamline Upwind Petrov-Galerkin
9277841947SLeila Ghaffari } StabilizationType;
9377841947SLeila Ghaffari static const char *const StabilizationTypes[] = {
9477841947SLeila Ghaffari   "none",
9577841947SLeila Ghaffari   "SU",
9677841947SLeila Ghaffari   "SUPG",
9777841947SLeila Ghaffari   "StabilizationType", "STAB_", NULL
9877841947SLeila Ghaffari };
9977841947SLeila Ghaffari 
10077841947SLeila Ghaffari // -----------------------------------------------------------------------------
10177841947SLeila Ghaffari // Structs
10277841947SLeila Ghaffari // -----------------------------------------------------------------------------
10377841947SLeila Ghaffari // Structs declarations
10477841947SLeila Ghaffari typedef struct AppCtx_private    *AppCtx;
10577841947SLeila Ghaffari typedef struct CeedData_private  *CeedData;
10677841947SLeila Ghaffari typedef struct User_private      *User;
10777841947SLeila Ghaffari typedef struct Units_private     *Units;
10877841947SLeila Ghaffari typedef struct SimpleBC_private  *SimpleBC;
10977841947SLeila Ghaffari typedef struct Physics_private   *Physics;
11077841947SLeila Ghaffari 
11177841947SLeila Ghaffari // Application context from user command line options
11277841947SLeila Ghaffari struct AppCtx_private {
11377841947SLeila Ghaffari   // libCEED arguments
11477841947SLeila Ghaffari   char              ceed_resource[PETSC_MAX_PATH_LEN]; // libCEED backend
11577841947SLeila Ghaffari   PetscInt          degree;
11677841947SLeila Ghaffari   PetscInt          q_extra;
11777841947SLeila Ghaffari   // Post-processing arguments
11877841947SLeila Ghaffari   PetscInt          output_freq;
11977841947SLeila Ghaffari   PetscInt          viz_refine;
12077841947SLeila Ghaffari   PetscInt          cont_steps;
12177841947SLeila Ghaffari   char              output_dir[PETSC_MAX_PATH_LEN];
12277841947SLeila Ghaffari   // Problem type arguments
12377841947SLeila Ghaffari   PetscFunctionList problems;
12477841947SLeila Ghaffari   char              problem_name[PETSC_MAX_PATH_LEN];
12577841947SLeila Ghaffari   // Test mode arguments
12677841947SLeila Ghaffari   PetscBool         test_mode;
12777841947SLeila Ghaffari   PetscScalar       test_tol;
12877841947SLeila Ghaffari   char              file_path[PETSC_MAX_PATH_LEN];
12977841947SLeila Ghaffari };
13077841947SLeila Ghaffari 
13177841947SLeila Ghaffari // libCEED data struct
13277841947SLeila Ghaffari struct CeedData_private {
13377841947SLeila Ghaffari   CeedVector           x_coord, q_data;
13488b783a1SJames Wright   CeedQFunctionContext setup_context, newt_ig_context, advection_context,
135*019b7682STimothy Aiken                        euler_context, shocktube_context, channel_context, blasius_context;
13677841947SLeila Ghaffari   CeedQFunction        qf_setup_vol, qf_ics, qf_rhs_vol, qf_ifunction_vol,
1372fe7aee7SLeila Ghaffari                        qf_setup_sur, qf_apply_inflow, qf_apply_outflow;
138e6225c47SLeila Ghaffari   CeedBasis            basis_x, basis_xc, basis_q, basis_x_sur, basis_q_sur;
13977841947SLeila Ghaffari   CeedElemRestriction  elem_restr_x, elem_restr_q, elem_restr_qd_i;
14077841947SLeila Ghaffari   CeedOperator         op_setup_vol, op_ics;
14177841947SLeila Ghaffari };
14277841947SLeila Ghaffari 
14377841947SLeila Ghaffari // PETSc user data
14477841947SLeila Ghaffari struct User_private {
14577841947SLeila Ghaffari   MPI_Comm     comm;
14677841947SLeila Ghaffari   DM           dm;
14777841947SLeila Ghaffari   DM           dm_viz;
14877841947SLeila Ghaffari   Mat          interp_viz;
14977841947SLeila Ghaffari   Ceed         ceed;
15077841947SLeila Ghaffari   Units        units;
15177841947SLeila Ghaffari   Vec          M;
15277841947SLeila Ghaffari   Physics      phys;
15377841947SLeila Ghaffari   AppCtx       app_ctx;
15477841947SLeila Ghaffari   CeedVector   q_ceed, q_dot_ceed, g_ceed;
15577841947SLeila Ghaffari   CeedOperator op_rhs_vol, op_rhs, op_ifunction_vol, op_ifunction;
15677841947SLeila Ghaffari };
15777841947SLeila Ghaffari 
15877841947SLeila Ghaffari // Units
15977841947SLeila Ghaffari struct Units_private {
16077841947SLeila Ghaffari   // fundamental units
16177841947SLeila Ghaffari   PetscScalar meter;
16277841947SLeila Ghaffari   PetscScalar kilogram;
16377841947SLeila Ghaffari   PetscScalar second;
16477841947SLeila Ghaffari   PetscScalar Kelvin;
16577841947SLeila Ghaffari   // derived units
16677841947SLeila Ghaffari   PetscScalar Pascal;
16777841947SLeila Ghaffari   PetscScalar J_per_kg_K;
16877841947SLeila Ghaffari   PetscScalar m_per_squared_s;
16977841947SLeila Ghaffari   PetscScalar W_per_m_K;
17077841947SLeila Ghaffari   PetscScalar Joule;
17177841947SLeila Ghaffari };
17277841947SLeila Ghaffari 
17377841947SLeila Ghaffari // Boundary conditions
17477841947SLeila Ghaffari struct SimpleBC_private {
1752fe7aee7SLeila Ghaffari   PetscInt  num_wall,    // Number of faces with wall BCs
1762fe7aee7SLeila Ghaffari             wall_comps[5], // An array of constrained component numbers
1772fe7aee7SLeila Ghaffari             num_comps,
1782fe7aee7SLeila Ghaffari             num_slip[3], // Number of faces with slip BCs
1792fe7aee7SLeila Ghaffari             num_inflow,
1802fe7aee7SLeila Ghaffari             num_outflow;
1812fe7aee7SLeila Ghaffari   PetscInt  walls[16], slips[3][16], inflows[16], outflows[16];
18277841947SLeila Ghaffari   PetscBool user_bc;
18377841947SLeila Ghaffari };
18477841947SLeila Ghaffari 
18577841947SLeila Ghaffari // Initial conditions
18677841947SLeila Ghaffari #ifndef setup_context_struct
18777841947SLeila Ghaffari #define setup_context_struct
18877841947SLeila Ghaffari typedef struct SetupContext_ *SetupContext;
18977841947SLeila Ghaffari struct SetupContext_ {
19077841947SLeila Ghaffari   CeedScalar theta0;
19177841947SLeila Ghaffari   CeedScalar thetaC;
19277841947SLeila Ghaffari   CeedScalar P0;
19377841947SLeila Ghaffari   CeedScalar N;
19477841947SLeila Ghaffari   CeedScalar cv;
19577841947SLeila Ghaffari   CeedScalar cp;
19688626eedSJames Wright   CeedScalar g[3];
19777841947SLeila Ghaffari   CeedScalar rc;
19877841947SLeila Ghaffari   CeedScalar lx;
19977841947SLeila Ghaffari   CeedScalar ly;
20077841947SLeila Ghaffari   CeedScalar lz;
20177841947SLeila Ghaffari   CeedScalar center[3];
20277841947SLeila Ghaffari   CeedScalar dc_axis[3];
20377841947SLeila Ghaffari   CeedScalar wind[3];
20477841947SLeila Ghaffari   CeedScalar time;
205*019b7682STimothy Aiken   CeedScalar mid_point;
206*019b7682STimothy Aiken   CeedScalar P_high;
207*019b7682STimothy Aiken   CeedScalar rho_high;
208*019b7682STimothy Aiken   CeedScalar P_low;
209*019b7682STimothy Aiken   CeedScalar rho_low;
21077841947SLeila Ghaffari   int wind_type;              // See WindType: 0=ROTATION, 1=TRANSLATION
21177841947SLeila Ghaffari   int bubble_type;            // See BubbleType: 0=SPHERE, 1=CYLINDER
21277841947SLeila Ghaffari   int bubble_continuity_type; // See BubbleContinuityType: 0=SMOOTH, 1=BACK_SHARP 2=THICK
21377841947SLeila Ghaffari };
21477841947SLeila Ghaffari #endif
21577841947SLeila Ghaffari 
21677841947SLeila Ghaffari // DENSITY_CURRENT
21777841947SLeila Ghaffari #ifndef dc_context_struct
21877841947SLeila Ghaffari #define dc_context_struct
21977841947SLeila Ghaffari typedef struct DCContext_ *DCContext;
22077841947SLeila Ghaffari struct DCContext_ {
22177841947SLeila Ghaffari   CeedScalar lambda;
22277841947SLeila Ghaffari   CeedScalar mu;
22377841947SLeila Ghaffari   CeedScalar k;
22477841947SLeila Ghaffari   CeedScalar cv;
22577841947SLeila Ghaffari   CeedScalar cp;
22677841947SLeila Ghaffari   CeedScalar g;
227932417b3SJed Brown   CeedScalar c_tau;
22877841947SLeila Ghaffari   int stabilization; // See StabilizationType: 0=none, 1=SU, 2=SUPG
22977841947SLeila Ghaffari };
23077841947SLeila Ghaffari #endif
23177841947SLeila Ghaffari 
23277841947SLeila Ghaffari // EULER_VORTEX
23377841947SLeila Ghaffari #ifndef euler_context_struct
23477841947SLeila Ghaffari #define euler_context_struct
23577841947SLeila Ghaffari typedef struct EulerContext_ *EulerContext;
23677841947SLeila Ghaffari struct EulerContext_ {
23777841947SLeila Ghaffari   CeedScalar center[3];
23877841947SLeila Ghaffari   CeedScalar curr_time;
23977841947SLeila Ghaffari   CeedScalar vortex_strength;
240932417b3SJed Brown   CeedScalar c_tau;
24177841947SLeila Ghaffari   CeedScalar mean_velocity[3];
24277841947SLeila Ghaffari   bool implicit;
243e6225c47SLeila Ghaffari   int euler_test;
244e6225c47SLeila Ghaffari   int stabilization; // See StabilizationType: 0=none, 1=SU, 2=SUPG
24577841947SLeila Ghaffari };
24677841947SLeila Ghaffari #endif
24777841947SLeila Ghaffari 
248*019b7682STimothy Aiken // SHOCKTUBE
249*019b7682STimothy Aiken #ifndef shocktube_context_struct
250*019b7682STimothy Aiken #define shocktube_context_struct
251*019b7682STimothy Aiken typedef struct ShockTubeContext_ *ShockTubeContext;
252*019b7682STimothy Aiken struct ShockTubeContext_ {
253*019b7682STimothy Aiken   CeedScalar Cyzb;
254*019b7682STimothy Aiken   CeedScalar Byzb;
255*019b7682STimothy Aiken   CeedScalar c_tau;
256*019b7682STimothy Aiken   bool implicit;
257*019b7682STimothy Aiken   bool yzb;
258*019b7682STimothy Aiken   int stabilization;
259*019b7682STimothy Aiken };
260*019b7682STimothy Aiken #endif
261*019b7682STimothy Aiken 
26277841947SLeila Ghaffari // ADVECTION and ADVECTION2D
26377841947SLeila Ghaffari #ifndef advection_context_struct
26477841947SLeila Ghaffari #define advection_context_struct
26577841947SLeila Ghaffari typedef struct AdvectionContext_ *AdvectionContext;
26677841947SLeila Ghaffari struct AdvectionContext_ {
26777841947SLeila Ghaffari   CeedScalar CtauS;
26877841947SLeila Ghaffari   CeedScalar strong_form;
26977841947SLeila Ghaffari   CeedScalar E_wind;
27077841947SLeila Ghaffari   bool implicit;
27177841947SLeila Ghaffari   int stabilization; // See StabilizationType: 0=none, 1=SU, 2=SUPG
27277841947SLeila Ghaffari };
27377841947SLeila Ghaffari #endif
27477841947SLeila Ghaffari 
27588b783a1SJames Wright // Newtonian Ideal Gas
27688b783a1SJames Wright #ifndef newtonian_context_struct
27788b783a1SJames Wright #define newtonian_context_struct
27888b783a1SJames Wright typedef struct NewtonianIdealGasContext_ *NewtonianIdealGasContext;
27988b783a1SJames Wright struct NewtonianIdealGasContext_ {
28088b783a1SJames Wright   CeedScalar lambda;
28188b783a1SJames Wright   CeedScalar mu;
28288b783a1SJames Wright   CeedScalar k;
28388b783a1SJames Wright   CeedScalar cv;
28488b783a1SJames Wright   CeedScalar cp;
28588626eedSJames Wright   CeedScalar g[3];
28688b783a1SJames Wright   CeedScalar c_tau;
28788626eedSJames Wright   CeedScalar Ctau_t;
28888626eedSJames Wright   CeedScalar Ctau_v;
28988626eedSJames Wright   CeedScalar Ctau_C;
29088626eedSJames Wright   CeedScalar Ctau_M;
29188626eedSJames Wright   CeedScalar Ctau_E;
29288626eedSJames Wright   CeedScalar dt;
29388b783a1SJames Wright   StabilizationType stabilization;
29488b783a1SJames Wright };
29588b783a1SJames Wright #endif
29688b783a1SJames Wright 
29788626eedSJames Wright #ifndef channel_context_struct
29888626eedSJames Wright #define channel_context_struct
29988626eedSJames Wright typedef struct ChannelContext_ *ChannelContext;
30088626eedSJames Wright struct ChannelContext_ {
30188626eedSJames Wright   bool       implicit; // !< Using implicit timesteping or not
30288626eedSJames Wright   CeedScalar theta0;   // !< Reference temperature
30388626eedSJames Wright   CeedScalar P0;       // !< Reference Pressure
30488626eedSJames Wright   CeedScalar umax;     // !< Centerline velocity
30588626eedSJames Wright   CeedScalar center;   // !< Y Coordinate for center of channel
30688626eedSJames Wright   CeedScalar H;        // !< Channel half-height
30788626eedSJames Wright   CeedScalar B;        // !< Body-force driving the flow
30888626eedSJames Wright   struct NewtonianIdealGasContext_ newtonian_ctx;
30988626eedSJames Wright };
31088626eedSJames Wright #endif
31188626eedSJames Wright 
31288626eedSJames Wright #ifndef blasius_context_struct
31388626eedSJames Wright #define blasius_context_struct
31488626eedSJames Wright typedef struct BlasiusContext_ *BlasiusContext;
31588626eedSJames Wright struct BlasiusContext_ {
31688626eedSJames Wright   bool       implicit;  // !< Using implicit timesteping or not
317871db79fSKenneth E. Jansen   bool       weakT;     // !< flag to set Temperature at inflow
31888626eedSJames Wright   CeedScalar delta0;    // !< Boundary layer height at inflow
31988626eedSJames Wright   CeedScalar Uinf;      // !< Velocity at boundary layer edge
32088626eedSJames Wright   CeedScalar P0;        // !< Pressure at outflow
32188626eedSJames Wright   CeedScalar theta0;    // !< Temperature at inflow
32288626eedSJames Wright   struct NewtonianIdealGasContext_ newtonian_ctx;
32388626eedSJames Wright };
32488626eedSJames Wright #endif
32588626eedSJames Wright 
32677841947SLeila Ghaffari // Struct that contains all enums and structs used for the physics of all problems
32777841947SLeila Ghaffari struct Physics_private {
32888626eedSJames Wright   BlasiusContext           blasius_ctx;
32988626eedSJames Wright   ChannelContext           channel_ctx;
33088b783a1SJames Wright   NewtonianIdealGasContext newtonian_ig_ctx;
33177841947SLeila Ghaffari   EulerContext             euler_ctx;
332*019b7682STimothy Aiken   ShockTubeContext         shocktube_ctx;
33377841947SLeila Ghaffari   AdvectionContext         advection_ctx;
33477841947SLeila Ghaffari   WindType                 wind_type;
33577841947SLeila Ghaffari   BubbleType               bubble_type;
33677841947SLeila Ghaffari   BubbleContinuityType     bubble_continuity_type;
33777841947SLeila Ghaffari   EulerTestType            euler_test;
33877841947SLeila Ghaffari   StabilizationType        stab;
33977841947SLeila Ghaffari   PetscBool                implicit;
34077841947SLeila Ghaffari   PetscBool                has_curr_time;
34177841947SLeila Ghaffari   PetscBool                has_neumann;
34211436a05SJames Wright   CeedContextFieldLabel    solution_time_label;
34388626eedSJames Wright   CeedContextFieldLabel    timestep_size_label;
34477841947SLeila Ghaffari };
34577841947SLeila Ghaffari 
34677841947SLeila Ghaffari // Problem specific data
34777841947SLeila Ghaffari // *INDENT-OFF*
34877841947SLeila Ghaffari typedef struct {
34977841947SLeila Ghaffari   CeedInt           dim, q_data_size_vol, q_data_size_sur;
3501864f1c2SLeila Ghaffari   CeedScalar        dm_scale;
35177841947SLeila Ghaffari   CeedQFunctionUser setup_vol, setup_sur, ics, apply_vol_rhs, apply_vol_ifunction,
3522fe7aee7SLeila Ghaffari                     apply_inflow, apply_outflow;
35377841947SLeila Ghaffari   const char        *setup_vol_loc, *setup_sur_loc, *ics_loc,
3542fe7aee7SLeila Ghaffari                     *apply_vol_rhs_loc, *apply_vol_ifunction_loc, *apply_inflow_loc, *apply_outflow_loc;
35577841947SLeila Ghaffari   bool              non_zero_time;
35677841947SLeila Ghaffari   PetscErrorCode    (*bc)(PetscInt, PetscReal, const PetscReal[], PetscInt,
35777841947SLeila Ghaffari                           PetscScalar[], void *);
358d0b732dbSLeila Ghaffari   PetscErrorCode    (*setup_ctx)(Ceed, CeedData, AppCtx, SetupContext, Physics);
35977841947SLeila Ghaffari   PetscErrorCode    (*print_info)(Physics, SetupContext, AppCtx);
36077841947SLeila Ghaffari } ProblemData;
36177841947SLeila Ghaffari // *INDENT-ON*
36277841947SLeila Ghaffari 
36377841947SLeila Ghaffari // -----------------------------------------------------------------------------
36477841947SLeila Ghaffari // Set up problems
36577841947SLeila Ghaffari // -----------------------------------------------------------------------------
36677841947SLeila Ghaffari // Set up function for each problem
36788626eedSJames Wright extern PetscErrorCode NS_CHANNEL(ProblemData *problem, DM dm,
36888626eedSJames Wright                                  void *setup_ctx, void *ctx);
36988626eedSJames Wright extern PetscErrorCode NS_BLASIUS(ProblemData *problem, DM dm,
37088626eedSJames Wright                                  void *setup_ctx, void *ctx);
37188b783a1SJames Wright extern PetscErrorCode NS_NEWTONIAN_IG(ProblemData *problem, DM dm,
37288b783a1SJames Wright                                       void *setup_ctx, void *ctx);
3731864f1c2SLeila Ghaffari extern PetscErrorCode NS_DENSITY_CURRENT(ProblemData *problem, DM dm,
374*019b7682STimothy Aiken     void *setup_ctx,
375*019b7682STimothy Aiken     void *ctx);
376*019b7682STimothy Aiken 
3771864f1c2SLeila Ghaffari extern PetscErrorCode NS_EULER_VORTEX(ProblemData *problem, DM dm,
3781864f1c2SLeila Ghaffari                                       void *setup_ctx, void *ctx);
379*019b7682STimothy Aiken extern PetscErrorCode NS_SHOCKTUBE(ProblemData *problem, DM dm, void *setup_ctx,
380*019b7682STimothy Aiken                                    void *ctx);
3811864f1c2SLeila Ghaffari extern PetscErrorCode NS_ADVECTION(ProblemData *problem, DM dm, void *setup_ctx,
38277841947SLeila Ghaffari                                    void *ctx);
3831864f1c2SLeila Ghaffari extern PetscErrorCode NS_ADVECTION2D(ProblemData *problem, DM dm,
3841864f1c2SLeila Ghaffari                                      void *setup_ctx, void *ctx);
38577841947SLeila Ghaffari 
386d0b732dbSLeila Ghaffari // Set up context for each problem
38788626eedSJames Wright extern PetscErrorCode SetupContext_CHANNEL(Ceed ceed, CeedData ceed_data,
38888626eedSJames Wright     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
38988626eedSJames Wright 
39088626eedSJames Wright extern PetscErrorCode SetupContext_BLASIUS(Ceed ceed, CeedData ceed_data,
39188626eedSJames Wright     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
39288626eedSJames Wright 
39388b783a1SJames Wright extern PetscErrorCode SetupContext_NEWTONIAN_IG(Ceed ceed, CeedData ceed_data,
39488b783a1SJames Wright     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
39588b783a1SJames Wright 
396d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_DENSITY_CURRENT(Ceed ceed,
397d0b732dbSLeila Ghaffari     CeedData ceed_data, AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
398d0b732dbSLeila Ghaffari 
399d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_EULER_VORTEX(Ceed ceed, CeedData ceed_data,
400d0b732dbSLeila Ghaffari     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
401d0b732dbSLeila Ghaffari 
402*019b7682STimothy Aiken extern PetscErrorCode SetupContext_SHOCKTUBE(Ceed ceed, CeedData ceed_data,
403*019b7682STimothy Aiken     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
404*019b7682STimothy Aiken 
405d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_ADVECTION(Ceed ceed, CeedData ceed_data,
406d0b732dbSLeila Ghaffari     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
407d0b732dbSLeila Ghaffari 
408d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_ADVECTION2D(Ceed ceed, CeedData ceed_data,
409d0b732dbSLeila Ghaffari     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
410d0b732dbSLeila Ghaffari 
41177841947SLeila Ghaffari // Boundary condition function for each problem
41277841947SLeila Ghaffari extern PetscErrorCode BC_DENSITY_CURRENT(DM dm, SimpleBC bc, Physics phys,
41377841947SLeila Ghaffari     void *setup_ctx);
41477841947SLeila Ghaffari 
41577841947SLeila Ghaffari extern PetscErrorCode BC_EULER_VORTEX(DM dm, SimpleBC bc, Physics phys,
41677841947SLeila Ghaffari                                       void *setup_ctx);
41777841947SLeila Ghaffari 
418*019b7682STimothy Aiken extern PetscErrorCode BC_SHOCKTUBE(DM dm, SimpleBC bc, Physics phys,
419*019b7682STimothy Aiken                                    void *setup_ctx);
420*019b7682STimothy Aiken 
42177841947SLeila Ghaffari extern PetscErrorCode BC_ADVECTION(DM dm, SimpleBC bc, Physics phys,
42277841947SLeila Ghaffari                                    void *setup_ctx);
42377841947SLeila Ghaffari 
42477841947SLeila Ghaffari extern PetscErrorCode BC_ADVECTION2D(DM dm, SimpleBC bc, Physics phys,
42577841947SLeila Ghaffari                                      void *setup_ctx);
42677841947SLeila Ghaffari 
42777841947SLeila Ghaffari // Print function for each problem
42877841947SLeila Ghaffari extern PetscErrorCode PRINT_DENSITY_CURRENT(Physics phys,
42977841947SLeila Ghaffari     SetupContext setup_ctx, AppCtx app_ctx);
43077841947SLeila Ghaffari 
43177841947SLeila Ghaffari extern PetscErrorCode PRINT_EULER_VORTEX(Physics phys, SetupContext setup_ctx,
43277841947SLeila Ghaffari     AppCtx app_ctx);
43377841947SLeila Ghaffari 
434*019b7682STimothy Aiken extern PetscErrorCode PRINT_SHOCKTUBE(Physics phys, SetupContext setup_ctx,
435*019b7682STimothy Aiken                                       AppCtx app_ctx);
436*019b7682STimothy Aiken 
43777841947SLeila Ghaffari extern PetscErrorCode PRINT_ADVECTION(Physics phys, SetupContext setup_ctx,
43877841947SLeila Ghaffari                                       AppCtx app_ctx);
43977841947SLeila Ghaffari 
44077841947SLeila Ghaffari extern PetscErrorCode PRINT_ADVECTION2D(Physics phys, SetupContext setup_ctx,
44177841947SLeila Ghaffari                                         AppCtx app_ctx);
44277841947SLeila Ghaffari 
44377841947SLeila Ghaffari // -----------------------------------------------------------------------------
44477841947SLeila Ghaffari // libCEED functions
44577841947SLeila Ghaffari // -----------------------------------------------------------------------------
44677841947SLeila Ghaffari // Utility function - essential BC dofs are encoded in closure indices as -(i+1).
44777841947SLeila Ghaffari PetscInt Involute(PetscInt i);
44877841947SLeila Ghaffari 
44977841947SLeila Ghaffari // Utility function to create local CEED restriction
4507ed3e4cdSJeremy L Thompson PetscErrorCode CreateRestrictionFromPlex(Ceed ceed, DM dm, CeedInt height,
4517ed3e4cdSJeremy L Thompson     DMLabel domain_label, CeedInt value, CeedElemRestriction *elem_restr);
45277841947SLeila Ghaffari 
45377841947SLeila Ghaffari // Utility function to get Ceed Restriction for each domain
45477841947SLeila Ghaffari PetscErrorCode GetRestrictionForDomain(Ceed ceed, DM dm, CeedInt height,
45577841947SLeila Ghaffari                                        DMLabel domain_label, PetscInt value,
4567ed3e4cdSJeremy L Thompson                                        CeedInt Q, CeedInt q_data_size,
45777841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_q,
45877841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_x,
45977841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_qd_i);
46077841947SLeila Ghaffari 
46177841947SLeila Ghaffari // Utility function to create CEED Composite Operator for the entire domain
46277841947SLeila Ghaffari PetscErrorCode CreateOperatorForDomain(Ceed ceed, DM dm, SimpleBC bc,
46377841947SLeila Ghaffari                                        CeedData ceed_data, Physics phys,
46477841947SLeila Ghaffari                                        CeedOperator op_apply_vol, CeedInt height,
46577841947SLeila Ghaffari                                        CeedInt P_sur, CeedInt Q_sur, CeedInt q_data_size_sur,
46677841947SLeila Ghaffari                                        CeedOperator *op_apply);
46777841947SLeila Ghaffari 
46877841947SLeila Ghaffari PetscErrorCode SetupLibceed(Ceed ceed, CeedData ceed_data, DM dm, User user,
46911436a05SJames Wright                             AppCtx app_ctx, ProblemData *problem, SimpleBC bc, SetupContext setup_ctx);
47077841947SLeila Ghaffari 
47177841947SLeila Ghaffari // -----------------------------------------------------------------------------
47277841947SLeila Ghaffari // Time-stepping functions
47377841947SLeila Ghaffari // -----------------------------------------------------------------------------
47477841947SLeila Ghaffari // Compute mass matrix for explicit scheme
47577841947SLeila Ghaffari PetscErrorCode ComputeLumpedMassMatrix(Ceed ceed, DM dm, CeedData ceed_data,
47677841947SLeila Ghaffari                                        Vec M);
47777841947SLeila Ghaffari 
47877841947SLeila Ghaffari // RHS (Explicit time-stepper) function setup
47977841947SLeila Ghaffari PetscErrorCode RHS_NS(TS ts, PetscReal t, Vec Q, Vec G, void *user_data);
48077841947SLeila Ghaffari 
48177841947SLeila Ghaffari // Implicit time-stepper function setup
48277841947SLeila Ghaffari PetscErrorCode IFunction_NS(TS ts, PetscReal t, Vec Q, Vec Q_dot, Vec G,
48377841947SLeila Ghaffari                             void *user_data);
48477841947SLeila Ghaffari 
48577841947SLeila Ghaffari // User provided TS Monitor
48677841947SLeila Ghaffari PetscErrorCode TSMonitor_NS(TS ts, PetscInt step_no, PetscReal time, Vec Q,
48777841947SLeila Ghaffari                             void *ctx);
48877841947SLeila Ghaffari 
48977841947SLeila Ghaffari // TS: Create, setup, and solve
49077841947SLeila Ghaffari PetscErrorCode TSSolve_NS(DM dm, User user, AppCtx app_ctx, Physics phys,
49177841947SLeila Ghaffari                           Vec *Q, PetscScalar *f_time, TS *ts);
49277841947SLeila Ghaffari 
49377841947SLeila Ghaffari // -----------------------------------------------------------------------------
49477841947SLeila Ghaffari // Setup DM
49577841947SLeila Ghaffari // -----------------------------------------------------------------------------
4961864f1c2SLeila Ghaffari // Create mesh
4971864f1c2SLeila Ghaffari PetscErrorCode CreateDM(MPI_Comm comm, ProblemData *problem, DM *dm);
49877841947SLeila Ghaffari 
49977841947SLeila Ghaffari // Set up DM
50077841947SLeila Ghaffari PetscErrorCode SetUpDM(DM dm, ProblemData *problem, PetscInt degree,
50177841947SLeila Ghaffari                        SimpleBC bc, Physics phys, void *setup_ctx);
50277841947SLeila Ghaffari 
50377841947SLeila Ghaffari // Refine DM for high-order viz
50477841947SLeila Ghaffari PetscErrorCode VizRefineDM(DM dm, User user, ProblemData *problem,
50577841947SLeila Ghaffari                            SimpleBC bc, Physics phys, void *setup_ctx);
50677841947SLeila Ghaffari 
50777841947SLeila Ghaffari // -----------------------------------------------------------------------------
50877841947SLeila Ghaffari // Process command line options
50977841947SLeila Ghaffari // -----------------------------------------------------------------------------
51077841947SLeila Ghaffari // Register problems to be available on the command line
51177841947SLeila Ghaffari PetscErrorCode RegisterProblems_NS(AppCtx app_ctx);
51277841947SLeila Ghaffari 
51377841947SLeila Ghaffari // Process general command line options
5142fe7aee7SLeila Ghaffari PetscErrorCode ProcessCommandLineOptions(MPI_Comm comm, AppCtx app_ctx,
5152fe7aee7SLeila Ghaffari     SimpleBC bc);
51677841947SLeila Ghaffari 
51777841947SLeila Ghaffari // -----------------------------------------------------------------------------
51877841947SLeila Ghaffari // Miscellaneous utility functions
51977841947SLeila Ghaffari // -----------------------------------------------------------------------------
52077841947SLeila Ghaffari PetscErrorCode ICs_FixMultiplicity(DM dm, CeedData ceed_data, Vec Q_loc, Vec Q,
52177841947SLeila Ghaffari                                    CeedScalar time);
52277841947SLeila Ghaffari 
52377841947SLeila Ghaffari PetscErrorCode DMPlexInsertBoundaryValues_NS(DM dm,
52477841947SLeila Ghaffari     PetscBool insert_essential, Vec Q_loc, PetscReal time, Vec face_geom_FVM,
52577841947SLeila Ghaffari     Vec cell_geom_FVM, Vec grad_FVM);
52677841947SLeila Ghaffari 
52777841947SLeila Ghaffari // Compare reference solution values with current test run for CI
52877841947SLeila Ghaffari PetscErrorCode RegressionTests_NS(AppCtx app_ctx, Vec Q);
52977841947SLeila Ghaffari 
53077841947SLeila Ghaffari // Get error for problems with exact solutions
53177841947SLeila Ghaffari PetscErrorCode GetError_NS(CeedData ceed_data, DM dm, AppCtx app_ctx, Vec Q,
53277841947SLeila Ghaffari                            PetscScalar final_time);
53377841947SLeila Ghaffari 
53477841947SLeila Ghaffari // Post-processing
53577841947SLeila Ghaffari PetscErrorCode PostProcess_NS(TS ts, CeedData ceed_data, DM dm,
53677841947SLeila Ghaffari                               ProblemData *problem, AppCtx app_ctx,
53777841947SLeila Ghaffari                               Vec Q, PetscScalar final_time);
53877841947SLeila Ghaffari 
53977841947SLeila Ghaffari // -- Gather initial Q values in case of continuation of simulation
54077841947SLeila Ghaffari PetscErrorCode SetupICsFromBinary(MPI_Comm comm, AppCtx app_ctx, Vec Q);
54177841947SLeila Ghaffari 
54277841947SLeila Ghaffari // Record boundary values from initial condition
54377841947SLeila Ghaffari PetscErrorCode SetBCsFromICs_NS(DM dm, Vec Q, Vec Q_loc);
54477841947SLeila Ghaffari 
54577841947SLeila Ghaffari // -----------------------------------------------------------------------------
546b7c563b6SJeremy L Thompson 
547b7c563b6SJeremy L Thompson #endif // libceed_fluids_examples_navier_stokes_h
548