xref: /libCEED/examples/fluids/navierstokes.h (revision 7ed3e4cde27d28430628eaa24b22da48dc51cc32)
177841947SLeila Ghaffari // Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
277841947SLeila Ghaffari // the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
377841947SLeila Ghaffari // reserved. See files LICENSE and NOTICE for details.
477841947SLeila Ghaffari //
577841947SLeila Ghaffari // This file is part of CEED, a collection of benchmarks, miniapps, software
677841947SLeila Ghaffari // libraries and APIs for efficient high-order finite element and spectral
777841947SLeila Ghaffari // element discretizations for exascale applications. For more information and
877841947SLeila Ghaffari // source code availability see http://github.com/ceed.
977841947SLeila Ghaffari //
1077841947SLeila Ghaffari // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
1177841947SLeila Ghaffari // a collaborative effort of two U.S. Department of Energy organizations (Office
1277841947SLeila Ghaffari // of Science and the National Nuclear Security Administration) responsible for
1377841947SLeila Ghaffari // the planning and preparation of a capable exascale ecosystem, including
1477841947SLeila Ghaffari // software, applications, hardware, advanced system engineering and early
1577841947SLeila Ghaffari // testbed platforms, in support of the nation's exascale computing imperative.
1677841947SLeila Ghaffari 
1777841947SLeila Ghaffari #ifndef navierstokes_h
1877841947SLeila Ghaffari #define navierstokes_h
1977841947SLeila Ghaffari 
2077841947SLeila Ghaffari #include <ceed.h>
2177841947SLeila Ghaffari #include <petscdm.h>
2277841947SLeila Ghaffari #include <petscdmplex.h>
2377841947SLeila Ghaffari #include <petscsys.h>
2477841947SLeila Ghaffari #include <petscts.h>
2577841947SLeila Ghaffari #include <stdbool.h>
2677841947SLeila Ghaffari 
2777841947SLeila Ghaffari // -----------------------------------------------------------------------------
2877841947SLeila Ghaffari // PETSc Macros
2977841947SLeila Ghaffari // -----------------------------------------------------------------------------
3077841947SLeila Ghaffari #if PETSC_VERSION_LT(3,14,0)
3177841947SLeila Ghaffari #  define DMPlexGetClosureIndices(a,b,c,d,e,f,g,h,i) DMPlexGetClosureIndices(a,b,c,d,f,g,i)
3277841947SLeila Ghaffari #  define DMPlexRestoreClosureIndices(a,b,c,d,e,f,g,h,i) DMPlexRestoreClosureIndices(a,b,c,d,f,g,i)
3377841947SLeila Ghaffari #endif
3477841947SLeila Ghaffari 
3577841947SLeila Ghaffari #if PETSC_VERSION_LT(3,14,0)
3677841947SLeila Ghaffari #  define DMAddBoundary(a,b,c,d,e,f,g,h,i,j,k,l,m,n) DMAddBoundary(a,b,c,e,h,i,j,k,f,g,m)
3777841947SLeila Ghaffari #elif PETSC_VERSION_LT(3,16,0)
3877841947SLeila Ghaffari #  define DMAddBoundary(a,b,c,d,e,f,g,h,i,j,k,l,m,n) DMAddBoundary(a,b,c,e,h,i,j,k,l,f,g,m)
3977841947SLeila Ghaffari #else
4077841947SLeila Ghaffari #  define DMAddBoundary(a,b,c,d,e,f,g,h,i,j,k,l,m,n) DMAddBoundary(a,b,c,d,f,g,h,i,j,k,l,m,n)
4177841947SLeila Ghaffari #endif
4277841947SLeila Ghaffari 
4377841947SLeila Ghaffari // -----------------------------------------------------------------------------
4477841947SLeila Ghaffari // Enums
4577841947SLeila Ghaffari // -----------------------------------------------------------------------------
4677841947SLeila Ghaffari // Translate PetscMemType to CeedMemType
4777841947SLeila Ghaffari static inline CeedMemType MemTypeP2C(PetscMemType mem_type) {
4877841947SLeila Ghaffari   return PetscMemTypeDevice(mem_type) ? CEED_MEM_DEVICE : CEED_MEM_HOST;
4977841947SLeila Ghaffari }
5077841947SLeila Ghaffari 
5177841947SLeila Ghaffari // Advection - Wind Options
5277841947SLeila Ghaffari typedef enum {
5377841947SLeila Ghaffari   WIND_ROTATION    = 0,
5477841947SLeila Ghaffari   WIND_TRANSLATION = 1,
5577841947SLeila Ghaffari } WindType;
5677841947SLeila Ghaffari static const char *const WindTypes[] = {
5777841947SLeila Ghaffari   "rotation",
5877841947SLeila Ghaffari   "translation",
5977841947SLeila Ghaffari   "WindType", "WIND_", NULL
6077841947SLeila Ghaffari };
6177841947SLeila Ghaffari 
6277841947SLeila Ghaffari // Advection - Bubble Types
6377841947SLeila Ghaffari typedef enum {
6477841947SLeila Ghaffari   BUBBLE_SPHERE   = 0, // dim=3
6577841947SLeila Ghaffari   BUBBLE_CYLINDER = 1, // dim=2
6677841947SLeila Ghaffari } BubbleType;
6777841947SLeila Ghaffari static const char *const BubbleTypes[] = {
6877841947SLeila Ghaffari   "sphere",
6977841947SLeila Ghaffari   "cylinder",
7077841947SLeila Ghaffari   "BubbleType", "BUBBLE_", NULL
7177841947SLeila Ghaffari };
7277841947SLeila Ghaffari 
7377841947SLeila Ghaffari // Advection - Bubble Continuity Types
7477841947SLeila Ghaffari typedef enum {
7577841947SLeila Ghaffari   BUBBLE_CONTINUITY_SMOOTH     = 0,  // Original continuous, smooth shape
7677841947SLeila Ghaffari   BUBBLE_CONTINUITY_BACK_SHARP = 1,  // Discontinuous, sharp back half shape
7777841947SLeila Ghaffari   BUBBLE_CONTINUITY_THICK      = 2,  // Define a finite thickness
7877841947SLeila Ghaffari } BubbleContinuityType;
7977841947SLeila Ghaffari static const char *const BubbleContinuityTypes[] = {
8077841947SLeila Ghaffari   "smooth",
8177841947SLeila Ghaffari   "back_sharp",
8277841947SLeila Ghaffari   "thick",
8377841947SLeila Ghaffari   "BubbleContinuityType", "BUBBLE_CONTINUITY_", NULL
8477841947SLeila Ghaffari };
8577841947SLeila Ghaffari 
8677841947SLeila Ghaffari // Euler - test cases
8777841947SLeila Ghaffari typedef enum {
88bc7bbd5dSLeila Ghaffari   EULER_TEST_ISENTROPIC_VORTEX = 0,
8977841947SLeila Ghaffari   EULER_TEST_1 = 1,
9077841947SLeila Ghaffari   EULER_TEST_2 = 2,
9177841947SLeila Ghaffari   EULER_TEST_3 = 3,
9277841947SLeila Ghaffari   EULER_TEST_4 = 4,
9332f166c6SLeila Ghaffari   EULER_TEST_5 = 5,
9477841947SLeila Ghaffari } EulerTestType;
9577841947SLeila Ghaffari static const char *const EulerTestTypes[] = {
96bc7bbd5dSLeila Ghaffari   "isentropic_vortex",
97bc7bbd5dSLeila Ghaffari   "test_1",
98bc7bbd5dSLeila Ghaffari   "test_2",
99bc7bbd5dSLeila Ghaffari   "test_3",
100bc7bbd5dSLeila Ghaffari   "test_4",
10132f166c6SLeila Ghaffari   "test_5",
10277841947SLeila Ghaffari   "EulerTestType", "EULER_TEST_", NULL
10377841947SLeila Ghaffari };
10477841947SLeila Ghaffari 
10577841947SLeila Ghaffari // Stabilization methods
10677841947SLeila Ghaffari typedef enum {
10777841947SLeila Ghaffari   STAB_NONE = 0,
10877841947SLeila Ghaffari   STAB_SU   = 1, // Streamline Upwind
10977841947SLeila Ghaffari   STAB_SUPG = 2, // Streamline Upwind Petrov-Galerkin
11077841947SLeila Ghaffari } StabilizationType;
11177841947SLeila Ghaffari static const char *const StabilizationTypes[] = {
11277841947SLeila Ghaffari   "none",
11377841947SLeila Ghaffari   "SU",
11477841947SLeila Ghaffari   "SUPG",
11577841947SLeila Ghaffari   "StabilizationType", "STAB_", NULL
11677841947SLeila Ghaffari };
11777841947SLeila Ghaffari 
11877841947SLeila Ghaffari // -----------------------------------------------------------------------------
11977841947SLeila Ghaffari // Structs
12077841947SLeila Ghaffari // -----------------------------------------------------------------------------
12177841947SLeila Ghaffari // Structs declarations
12277841947SLeila Ghaffari typedef struct AppCtx_private    *AppCtx;
12377841947SLeila Ghaffari typedef struct CeedData_private  *CeedData;
12477841947SLeila Ghaffari typedef struct User_private      *User;
12577841947SLeila Ghaffari typedef struct Units_private     *Units;
12677841947SLeila Ghaffari typedef struct SimpleBC_private  *SimpleBC;
12777841947SLeila Ghaffari typedef struct Physics_private   *Physics;
12877841947SLeila Ghaffari 
12977841947SLeila Ghaffari // Application context from user command line options
13077841947SLeila Ghaffari struct AppCtx_private {
13177841947SLeila Ghaffari   // libCEED arguments
13277841947SLeila Ghaffari   char              ceed_resource[PETSC_MAX_PATH_LEN]; // libCEED backend
13377841947SLeila Ghaffari   PetscInt          degree;
13477841947SLeila Ghaffari   PetscInt          q_extra;
13577841947SLeila Ghaffari   // Post-processing arguments
13677841947SLeila Ghaffari   PetscInt          output_freq;
13777841947SLeila Ghaffari   PetscInt          viz_refine;
13877841947SLeila Ghaffari   PetscInt          cont_steps;
13977841947SLeila Ghaffari   char              output_dir[PETSC_MAX_PATH_LEN];
14077841947SLeila Ghaffari   // Problem type arguments
14177841947SLeila Ghaffari   PetscFunctionList problems;
14277841947SLeila Ghaffari   char              problem_name[PETSC_MAX_PATH_LEN];
14377841947SLeila Ghaffari   // Test mode arguments
14477841947SLeila Ghaffari   PetscBool         test_mode;
14577841947SLeila Ghaffari   PetscScalar       test_tol;
14677841947SLeila Ghaffari   char              file_path[PETSC_MAX_PATH_LEN];
14777841947SLeila Ghaffari };
14877841947SLeila Ghaffari 
14977841947SLeila Ghaffari // libCEED data struct
15077841947SLeila Ghaffari struct CeedData_private {
15177841947SLeila Ghaffari   CeedVector           x_coord, q_data;
15277841947SLeila Ghaffari   CeedQFunctionContext setup_context, dc_context, advection_context,
15377841947SLeila Ghaffari                        euler_context;
15477841947SLeila Ghaffari   CeedQFunction        qf_setup_vol, qf_ics, qf_rhs_vol, qf_ifunction_vol,
15577841947SLeila Ghaffari                        qf_setup_sur, qf_apply_sur;
156e6225c47SLeila Ghaffari   CeedBasis            basis_x, basis_xc, basis_q, basis_x_sur, basis_q_sur;
15777841947SLeila Ghaffari   CeedElemRestriction  elem_restr_x, elem_restr_q, elem_restr_qd_i;
15877841947SLeila Ghaffari   CeedOperator         op_setup_vol, op_ics;
15977841947SLeila Ghaffari };
16077841947SLeila Ghaffari 
16177841947SLeila Ghaffari // PETSc user data
16277841947SLeila Ghaffari struct User_private {
16377841947SLeila Ghaffari   MPI_Comm     comm;
16477841947SLeila Ghaffari   DM           dm;
16577841947SLeila Ghaffari   DM           dm_viz;
16677841947SLeila Ghaffari   Mat          interp_viz;
16777841947SLeila Ghaffari   Ceed         ceed;
16877841947SLeila Ghaffari   Units        units;
16977841947SLeila Ghaffari   Vec          M;
17077841947SLeila Ghaffari   Physics      phys;
17177841947SLeila Ghaffari   AppCtx       app_ctx;
17277841947SLeila Ghaffari   CeedVector   q_ceed, q_dot_ceed, g_ceed;
17377841947SLeila Ghaffari   CeedOperator op_rhs_vol, op_rhs, op_ifunction_vol, op_ifunction;
17477841947SLeila Ghaffari };
17577841947SLeila Ghaffari 
17677841947SLeila Ghaffari // Units
17777841947SLeila Ghaffari struct Units_private {
17877841947SLeila Ghaffari   // fundamental units
17977841947SLeila Ghaffari   PetscScalar meter;
18077841947SLeila Ghaffari   PetscScalar kilogram;
18177841947SLeila Ghaffari   PetscScalar second;
18277841947SLeila Ghaffari   PetscScalar Kelvin;
18377841947SLeila Ghaffari   // derived units
18477841947SLeila Ghaffari   PetscScalar Pascal;
18577841947SLeila Ghaffari   PetscScalar J_per_kg_K;
18677841947SLeila Ghaffari   PetscScalar m_per_squared_s;
18777841947SLeila Ghaffari   PetscScalar W_per_m_K;
18877841947SLeila Ghaffari   PetscScalar Joule;
18977841947SLeila Ghaffari };
19077841947SLeila Ghaffari 
19177841947SLeila Ghaffari // Boundary conditions
19277841947SLeila Ghaffari struct SimpleBC_private {
19377841947SLeila Ghaffari   PetscInt  num_wall, num_slip[3];
19477841947SLeila Ghaffari   PetscInt  walls[6], slips[3][6];
19577841947SLeila Ghaffari   PetscBool user_bc;
19677841947SLeila Ghaffari };
19777841947SLeila Ghaffari 
19877841947SLeila Ghaffari // Initial conditions
19977841947SLeila Ghaffari #ifndef setup_context_struct
20077841947SLeila Ghaffari #define setup_context_struct
20177841947SLeila Ghaffari typedef struct SetupContext_ *SetupContext;
20277841947SLeila Ghaffari struct SetupContext_ {
20377841947SLeila Ghaffari   CeedScalar theta0;
20477841947SLeila Ghaffari   CeedScalar thetaC;
20577841947SLeila Ghaffari   CeedScalar P0;
20677841947SLeila Ghaffari   CeedScalar N;
20777841947SLeila Ghaffari   CeedScalar cv;
20877841947SLeila Ghaffari   CeedScalar cp;
20977841947SLeila Ghaffari   CeedScalar g;
21077841947SLeila Ghaffari   CeedScalar rc;
21177841947SLeila Ghaffari   CeedScalar lx;
21277841947SLeila Ghaffari   CeedScalar ly;
21377841947SLeila Ghaffari   CeedScalar lz;
21477841947SLeila Ghaffari   CeedScalar center[3];
21577841947SLeila Ghaffari   CeedScalar dc_axis[3];
21677841947SLeila Ghaffari   CeedScalar wind[3];
21777841947SLeila Ghaffari   CeedScalar time;
21877841947SLeila Ghaffari   int wind_type;              // See WindType: 0=ROTATION, 1=TRANSLATION
21977841947SLeila Ghaffari   int bubble_type;            // See BubbleType: 0=SPHERE, 1=CYLINDER
22077841947SLeila Ghaffari   int bubble_continuity_type; // See BubbleContinuityType: 0=SMOOTH, 1=BACK_SHARP 2=THICK
22177841947SLeila Ghaffari };
22277841947SLeila Ghaffari #endif
22377841947SLeila Ghaffari 
22477841947SLeila Ghaffari // DENSITY_CURRENT
22577841947SLeila Ghaffari #ifndef dc_context_struct
22677841947SLeila Ghaffari #define dc_context_struct
22777841947SLeila Ghaffari typedef struct DCContext_ *DCContext;
22877841947SLeila Ghaffari struct DCContext_ {
22977841947SLeila Ghaffari   CeedScalar lambda;
23077841947SLeila Ghaffari   CeedScalar mu;
23177841947SLeila Ghaffari   CeedScalar k;
23277841947SLeila Ghaffari   CeedScalar cv;
23377841947SLeila Ghaffari   CeedScalar cp;
23477841947SLeila Ghaffari   CeedScalar g;
235932417b3SJed Brown   CeedScalar c_tau;
23677841947SLeila Ghaffari   int stabilization; // See StabilizationType: 0=none, 1=SU, 2=SUPG
23777841947SLeila Ghaffari };
23877841947SLeila Ghaffari #endif
23977841947SLeila Ghaffari 
24077841947SLeila Ghaffari // EULER_VORTEX
24177841947SLeila Ghaffari #ifndef euler_context_struct
24277841947SLeila Ghaffari #define euler_context_struct
24377841947SLeila Ghaffari typedef struct EulerContext_ *EulerContext;
24477841947SLeila Ghaffari struct EulerContext_ {
24577841947SLeila Ghaffari   CeedScalar center[3];
24677841947SLeila Ghaffari   CeedScalar curr_time;
24777841947SLeila Ghaffari   CeedScalar vortex_strength;
248932417b3SJed Brown   CeedScalar c_tau;
24977841947SLeila Ghaffari   CeedScalar mean_velocity[3];
25077841947SLeila Ghaffari   bool implicit;
251e6225c47SLeila Ghaffari   int euler_test;
252e6225c47SLeila Ghaffari   int stabilization; // See StabilizationType: 0=none, 1=SU, 2=SUPG
25377841947SLeila Ghaffari };
25477841947SLeila Ghaffari #endif
25577841947SLeila Ghaffari 
25677841947SLeila Ghaffari // ADVECTION and ADVECTION2D
25777841947SLeila Ghaffari #ifndef advection_context_struct
25877841947SLeila Ghaffari #define advection_context_struct
25977841947SLeila Ghaffari typedef struct AdvectionContext_ *AdvectionContext;
26077841947SLeila Ghaffari struct AdvectionContext_ {
26177841947SLeila Ghaffari   CeedScalar CtauS;
26277841947SLeila Ghaffari   CeedScalar strong_form;
26377841947SLeila Ghaffari   CeedScalar E_wind;
26477841947SLeila Ghaffari   bool implicit;
26577841947SLeila Ghaffari   int stabilization; // See StabilizationType: 0=none, 1=SU, 2=SUPG
26677841947SLeila Ghaffari };
26777841947SLeila Ghaffari #endif
26877841947SLeila Ghaffari 
26977841947SLeila Ghaffari // Struct that contains all enums and structs used for the physics of all problems
27077841947SLeila Ghaffari struct Physics_private {
27177841947SLeila Ghaffari   DCContext            dc_ctx;
27277841947SLeila Ghaffari   EulerContext         euler_ctx;
27377841947SLeila Ghaffari   AdvectionContext     advection_ctx;
27477841947SLeila Ghaffari   WindType             wind_type;
27577841947SLeila Ghaffari   BubbleType           bubble_type;
27677841947SLeila Ghaffari   BubbleContinuityType bubble_continuity_type;
27777841947SLeila Ghaffari   EulerTestType        euler_test;
27877841947SLeila Ghaffari   StabilizationType    stab;
27977841947SLeila Ghaffari   PetscBool            implicit;
28077841947SLeila Ghaffari   PetscBool            has_curr_time;
28177841947SLeila Ghaffari   PetscBool            has_neumann;
28277841947SLeila Ghaffari };
28377841947SLeila Ghaffari 
28477841947SLeila Ghaffari // Problem specific data
28577841947SLeila Ghaffari // *INDENT-OFF*
28677841947SLeila Ghaffari typedef struct {
28777841947SLeila Ghaffari   CeedInt           dim, q_data_size_vol, q_data_size_sur;
28877841947SLeila Ghaffari   CeedQFunctionUser setup_vol, setup_sur, ics, apply_vol_rhs, apply_vol_ifunction,
28977841947SLeila Ghaffari                     apply_sur;
29077841947SLeila Ghaffari   const char        *setup_vol_loc, *setup_sur_loc, *ics_loc,
29177841947SLeila Ghaffari                     *apply_vol_rhs_loc, *apply_vol_ifunction_loc, *apply_sur_loc;
29277841947SLeila Ghaffari   bool              non_zero_time;
29377841947SLeila Ghaffari   PetscErrorCode    (*bc)(PetscInt, PetscReal, const PetscReal[], PetscInt,
29477841947SLeila Ghaffari                           PetscScalar[], void *);
295d0b732dbSLeila Ghaffari   PetscErrorCode    (*setup_ctx)(Ceed, CeedData, AppCtx, SetupContext, Physics);
29677841947SLeila Ghaffari   PetscErrorCode    (*bc_func)(DM, SimpleBC, Physics, void *);
29777841947SLeila Ghaffari   PetscErrorCode    (*print_info)(Physics, SetupContext, AppCtx);
29877841947SLeila Ghaffari } ProblemData;
29977841947SLeila Ghaffari // *INDENT-ON*
30077841947SLeila Ghaffari 
30177841947SLeila Ghaffari // -----------------------------------------------------------------------------
30277841947SLeila Ghaffari // Set up problems
30377841947SLeila Ghaffari // -----------------------------------------------------------------------------
30477841947SLeila Ghaffari // Set up function for each problem
30577841947SLeila Ghaffari extern PetscErrorCode NS_DENSITY_CURRENT(ProblemData *problem, void *setup_ctx,
30677841947SLeila Ghaffari     void *ctx);
30777841947SLeila Ghaffari 
30877841947SLeila Ghaffari extern PetscErrorCode NS_EULER_VORTEX(ProblemData *problem, void *setup_ctx,
30977841947SLeila Ghaffari                                       void *ctx);
31077841947SLeila Ghaffari 
31177841947SLeila Ghaffari extern PetscErrorCode NS_ADVECTION(ProblemData *problem, void *setup_ctx,
31277841947SLeila Ghaffari                                    void *ctx);
31377841947SLeila Ghaffari 
31477841947SLeila Ghaffari extern PetscErrorCode NS_ADVECTION2D(ProblemData *problem, void *setup_ctx,
31577841947SLeila Ghaffari                                      void *ctx);
31677841947SLeila Ghaffari 
317d0b732dbSLeila Ghaffari // Set up context for each problem
318d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_DENSITY_CURRENT(Ceed ceed,
319d0b732dbSLeila Ghaffari     CeedData ceed_data, AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
320d0b732dbSLeila Ghaffari 
321d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_EULER_VORTEX(Ceed ceed, CeedData ceed_data,
322d0b732dbSLeila Ghaffari     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
323d0b732dbSLeila Ghaffari 
324d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_ADVECTION(Ceed ceed, CeedData ceed_data,
325d0b732dbSLeila Ghaffari     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
326d0b732dbSLeila Ghaffari 
327d0b732dbSLeila Ghaffari extern PetscErrorCode SetupContext_ADVECTION2D(Ceed ceed, CeedData ceed_data,
328d0b732dbSLeila Ghaffari     AppCtx app_ctx, SetupContext setup_ctx, Physics phys);
329d0b732dbSLeila Ghaffari 
33077841947SLeila Ghaffari // Boundary condition function for each problem
33177841947SLeila Ghaffari extern PetscErrorCode BC_DENSITY_CURRENT(DM dm, SimpleBC bc, Physics phys,
33277841947SLeila Ghaffari     void *setup_ctx);
33377841947SLeila Ghaffari 
33477841947SLeila Ghaffari extern PetscErrorCode BC_EULER_VORTEX(DM dm, SimpleBC bc, Physics phys,
33577841947SLeila Ghaffari                                       void *setup_ctx);
33677841947SLeila Ghaffari 
33777841947SLeila Ghaffari extern PetscErrorCode BC_ADVECTION(DM dm, SimpleBC bc, Physics phys,
33877841947SLeila Ghaffari                                    void *setup_ctx);
33977841947SLeila Ghaffari 
34077841947SLeila Ghaffari extern PetscErrorCode BC_ADVECTION2D(DM dm, SimpleBC bc, Physics phys,
34177841947SLeila Ghaffari                                      void *setup_ctx);
34277841947SLeila Ghaffari 
34377841947SLeila Ghaffari // Print function for each problem
34477841947SLeila Ghaffari extern PetscErrorCode PRINT_DENSITY_CURRENT(Physics phys,
34577841947SLeila Ghaffari     SetupContext setup_ctx, AppCtx app_ctx);
34677841947SLeila Ghaffari 
34777841947SLeila Ghaffari extern PetscErrorCode PRINT_EULER_VORTEX(Physics phys, SetupContext setup_ctx,
34877841947SLeila Ghaffari     AppCtx app_ctx);
34977841947SLeila Ghaffari 
35077841947SLeila Ghaffari extern PetscErrorCode PRINT_ADVECTION(Physics phys, SetupContext setup_ctx,
35177841947SLeila Ghaffari                                       AppCtx app_ctx);
35277841947SLeila Ghaffari 
35377841947SLeila Ghaffari extern PetscErrorCode PRINT_ADVECTION2D(Physics phys, SetupContext setup_ctx,
35477841947SLeila Ghaffari                                         AppCtx app_ctx);
35577841947SLeila Ghaffari 
35677841947SLeila Ghaffari // -----------------------------------------------------------------------------
35777841947SLeila Ghaffari // libCEED functions
35877841947SLeila Ghaffari // -----------------------------------------------------------------------------
35977841947SLeila Ghaffari // Utility function - essential BC dofs are encoded in closure indices as -(i+1).
36077841947SLeila Ghaffari PetscInt Involute(PetscInt i);
36177841947SLeila Ghaffari 
36277841947SLeila Ghaffari // Utility function to create local CEED restriction
363*7ed3e4cdSJeremy L Thompson PetscErrorCode CreateRestrictionFromPlex(Ceed ceed, DM dm, CeedInt height,
364*7ed3e4cdSJeremy L Thompson     DMLabel domain_label, CeedInt value, CeedElemRestriction *elem_restr);
36577841947SLeila Ghaffari 
36677841947SLeila Ghaffari // Utility function to get Ceed Restriction for each domain
36777841947SLeila Ghaffari PetscErrorCode GetRestrictionForDomain(Ceed ceed, DM dm, CeedInt height,
36877841947SLeila Ghaffari                                        DMLabel domain_label, PetscInt value,
369*7ed3e4cdSJeremy L Thompson                                        CeedInt Q, CeedInt q_data_size,
37077841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_q,
37177841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_x,
37277841947SLeila Ghaffari                                        CeedElemRestriction *elem_restr_qd_i);
37377841947SLeila Ghaffari 
37477841947SLeila Ghaffari // Utility function to create CEED Composite Operator for the entire domain
37577841947SLeila Ghaffari PetscErrorCode CreateOperatorForDomain(Ceed ceed, DM dm, SimpleBC bc,
37677841947SLeila Ghaffari                                        CeedData ceed_data, Physics phys,
37777841947SLeila Ghaffari                                        CeedOperator op_apply_vol, CeedInt height,
37877841947SLeila Ghaffari                                        CeedInt P_sur, CeedInt Q_sur, CeedInt q_data_size_sur,
37977841947SLeila Ghaffari                                        CeedOperator *op_apply);
38077841947SLeila Ghaffari 
38177841947SLeila Ghaffari PetscErrorCode SetupLibceed(Ceed ceed, CeedData ceed_data, DM dm, User user,
38277841947SLeila Ghaffari                             AppCtx app_ctx, ProblemData *problem, SimpleBC bc);
38377841947SLeila Ghaffari 
38477841947SLeila Ghaffari // -----------------------------------------------------------------------------
38577841947SLeila Ghaffari // Time-stepping functions
38677841947SLeila Ghaffari // -----------------------------------------------------------------------------
38777841947SLeila Ghaffari // Compute mass matrix for explicit scheme
38877841947SLeila Ghaffari PetscErrorCode ComputeLumpedMassMatrix(Ceed ceed, DM dm, CeedData ceed_data,
38977841947SLeila Ghaffari                                        Vec M);
39077841947SLeila Ghaffari 
39177841947SLeila Ghaffari // RHS (Explicit time-stepper) function setup
39277841947SLeila Ghaffari PetscErrorCode RHS_NS(TS ts, PetscReal t, Vec Q, Vec G, void *user_data);
39377841947SLeila Ghaffari 
39477841947SLeila Ghaffari // Implicit time-stepper function setup
39577841947SLeila Ghaffari PetscErrorCode IFunction_NS(TS ts, PetscReal t, Vec Q, Vec Q_dot, Vec G,
39677841947SLeila Ghaffari                             void *user_data);
39777841947SLeila Ghaffari 
39877841947SLeila Ghaffari // User provided TS Monitor
39977841947SLeila Ghaffari PetscErrorCode TSMonitor_NS(TS ts, PetscInt step_no, PetscReal time, Vec Q,
40077841947SLeila Ghaffari                             void *ctx);
40177841947SLeila Ghaffari 
40277841947SLeila Ghaffari // TS: Create, setup, and solve
40377841947SLeila Ghaffari PetscErrorCode TSSolve_NS(DM dm, User user, AppCtx app_ctx, Physics phys,
40477841947SLeila Ghaffari                           Vec *Q, PetscScalar *f_time, TS *ts);
40577841947SLeila Ghaffari 
40677841947SLeila Ghaffari // -----------------------------------------------------------------------------
40777841947SLeila Ghaffari // Setup DM
40877841947SLeila Ghaffari // -----------------------------------------------------------------------------
40977841947SLeila Ghaffari // Read mesh and distribute DM in parallel
41077841947SLeila Ghaffari PetscErrorCode CreateDistributedDM(MPI_Comm comm, ProblemData *problem,
41177841947SLeila Ghaffari                                    SetupContext setup_ctx, DM *dm);
41277841947SLeila Ghaffari 
41377841947SLeila Ghaffari // Set up DM
41477841947SLeila Ghaffari PetscErrorCode SetUpDM(DM dm, ProblemData *problem, PetscInt degree,
41577841947SLeila Ghaffari                        SimpleBC bc, Physics phys, void *setup_ctx);
41677841947SLeila Ghaffari 
41777841947SLeila Ghaffari // Refine DM for high-order viz
41877841947SLeila Ghaffari PetscErrorCode VizRefineDM(DM dm, User user, ProblemData *problem,
41977841947SLeila Ghaffari                            SimpleBC bc, Physics phys, void *setup_ctx);
42077841947SLeila Ghaffari 
42177841947SLeila Ghaffari // -----------------------------------------------------------------------------
42277841947SLeila Ghaffari // Process command line options
42377841947SLeila Ghaffari // -----------------------------------------------------------------------------
42477841947SLeila Ghaffari // Register problems to be available on the command line
42577841947SLeila Ghaffari PetscErrorCode RegisterProblems_NS(AppCtx app_ctx);
42677841947SLeila Ghaffari 
42777841947SLeila Ghaffari // Process general command line options
42877841947SLeila Ghaffari PetscErrorCode ProcessCommandLineOptions(MPI_Comm comm, AppCtx app_ctx);
42977841947SLeila Ghaffari 
43077841947SLeila Ghaffari // -----------------------------------------------------------------------------
43177841947SLeila Ghaffari // Miscellaneous utility functions
43277841947SLeila Ghaffari // -----------------------------------------------------------------------------
43377841947SLeila Ghaffari PetscErrorCode ICs_FixMultiplicity(DM dm, CeedData ceed_data, Vec Q_loc, Vec Q,
43477841947SLeila Ghaffari                                    CeedScalar time);
43577841947SLeila Ghaffari 
43677841947SLeila Ghaffari PetscErrorCode DMPlexInsertBoundaryValues_NS(DM dm,
43777841947SLeila Ghaffari     PetscBool insert_essential, Vec Q_loc, PetscReal time, Vec face_geom_FVM,
43877841947SLeila Ghaffari     Vec cell_geom_FVM, Vec grad_FVM);
43977841947SLeila Ghaffari 
44077841947SLeila Ghaffari // Compare reference solution values with current test run for CI
44177841947SLeila Ghaffari PetscErrorCode RegressionTests_NS(AppCtx app_ctx, Vec Q);
44277841947SLeila Ghaffari 
44377841947SLeila Ghaffari // Get error for problems with exact solutions
44477841947SLeila Ghaffari PetscErrorCode GetError_NS(CeedData ceed_data, DM dm, AppCtx app_ctx, Vec Q,
44577841947SLeila Ghaffari                            PetscScalar final_time);
44677841947SLeila Ghaffari 
44777841947SLeila Ghaffari // Post-processing
44877841947SLeila Ghaffari PetscErrorCode PostProcess_NS(TS ts, CeedData ceed_data, DM dm,
44977841947SLeila Ghaffari                               ProblemData *problem, AppCtx app_ctx,
45077841947SLeila Ghaffari                               Vec Q, PetscScalar final_time);
45177841947SLeila Ghaffari 
45277841947SLeila Ghaffari // -- Gather initial Q values in case of continuation of simulation
45377841947SLeila Ghaffari PetscErrorCode SetupICsFromBinary(MPI_Comm comm, AppCtx app_ctx, Vec Q);
45477841947SLeila Ghaffari 
45577841947SLeila Ghaffari // Record boundary values from initial condition
45677841947SLeila Ghaffari PetscErrorCode SetBCsFromICs_NS(DM dm, Vec Q, Vec Q_loc);
45777841947SLeila Ghaffari 
45877841947SLeila Ghaffari // -----------------------------------------------------------------------------
45977841947SLeila Ghaffari #endif
460