xref: /libCEED/examples/solids/include/structs.h (revision 5754ecac3b7d1ff97b39b25dc78c06350f2c900d)
1*5754ecacSJeremy L Thompson #ifndef structs_h
2*5754ecacSJeremy L Thompson #define structs_h
3*5754ecacSJeremy L Thompson 
4*5754ecacSJeremy L Thompson #include <ceed.h>
5*5754ecacSJeremy L Thompson #include <petsc.h>
6*5754ecacSJeremy L Thompson #include "../problems/cl-problems.h"
7*5754ecacSJeremy L Thompson 
8*5754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
9*5754ecacSJeremy L Thompson // Command Line Options
10*5754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
11*5754ecacSJeremy L Thompson // Forcing function options
12*5754ecacSJeremy L Thompson typedef enum {
13*5754ecacSJeremy L Thompson   FORCE_NONE = 0, FORCE_CONST = 1, FORCE_MMS = 2
14*5754ecacSJeremy L Thompson } forcingType;
15*5754ecacSJeremy L Thompson static const char *const forcing_types[] = {"none",
16*5754ecacSJeremy L Thompson                                             "constant",
17*5754ecacSJeremy L Thompson                                             "mms",
18*5754ecacSJeremy L Thompson                                             "forcingType","FORCE_",0
19*5754ecacSJeremy L Thompson                                            };
20*5754ecacSJeremy L Thompson static const char *const forcing_types_for_disp[] = {"None",
21*5754ecacSJeremy L Thompson                                                      "Constant",
22*5754ecacSJeremy L Thompson                                                      "Manufactured solution"
23*5754ecacSJeremy L Thompson                                                     };
24*5754ecacSJeremy L Thompson 
25*5754ecacSJeremy L Thompson // Multigrid options
26*5754ecacSJeremy L Thompson typedef enum {
27*5754ecacSJeremy L Thompson   MULTIGRID_LOGARITHMIC = 0, MULTIGRID_UNIFORM = 1, MULTIGRID_NONE = 2
28*5754ecacSJeremy L Thompson } multigridType;
29*5754ecacSJeremy L Thompson static const char *const multigrid_types [] = {"logarithmic",
30*5754ecacSJeremy L Thompson                                                "uniform",
31*5754ecacSJeremy L Thompson                                                "none",
32*5754ecacSJeremy L Thompson                                                "multigridType","MULTIGRID",0
33*5754ecacSJeremy L Thompson                                               };
34*5754ecacSJeremy L Thompson static const char *const multigrid_types_for_disp[] = {"P-multigrid, logarithmic coarsening",
35*5754ecacSJeremy L Thompson                                                        "P-multigrind, uniform coarsening",
36*5754ecacSJeremy L Thompson                                                        "No multigrid"
37*5754ecacSJeremy L Thompson                                                       };
38*5754ecacSJeremy L Thompson 
39*5754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
40*5754ecacSJeremy L Thompson // Application data structs
41*5754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
42*5754ecacSJeremy L Thompson // Units
43*5754ecacSJeremy L Thompson typedef struct Units_ *Units;
44*5754ecacSJeremy L Thompson struct Units_ {
45*5754ecacSJeremy L Thompson   // Fundamental units
46*5754ecacSJeremy L Thompson   PetscScalar meter;
47*5754ecacSJeremy L Thompson   PetscScalar kilogram;
48*5754ecacSJeremy L Thompson   PetscScalar second;
49*5754ecacSJeremy L Thompson   // Derived unit
50*5754ecacSJeremy L Thompson   PetscScalar Pascal;
51*5754ecacSJeremy L Thompson };
52*5754ecacSJeremy L Thompson 
53*5754ecacSJeremy L Thompson // Application context from user command line options
54*5754ecacSJeremy L Thompson typedef struct AppCtx_ *AppCtx;
55*5754ecacSJeremy L Thompson struct AppCtx_ {
56*5754ecacSJeremy L Thompson   const char    *name, *name_for_disp;                 // problem name
57*5754ecacSJeremy L Thompson   char          ceed_resource[PETSC_MAX_PATH_LEN];     // libCEED backend
58*5754ecacSJeremy L Thompson   char          mesh_file[PETSC_MAX_PATH_LEN];         // exodusII mesh file
59*5754ecacSJeremy L Thompson   char          output_dir[PETSC_MAX_PATH_LEN];
60*5754ecacSJeremy L Thompson   PetscBool     test_mode;
61*5754ecacSJeremy L Thompson   PetscBool     view_soln;
62*5754ecacSJeremy L Thompson   PetscBool     view_final_soln;
63*5754ecacSJeremy L Thompson   PetscViewer   energy_viewer;
64*5754ecacSJeremy L Thompson   problemType   problem_choice;
65*5754ecacSJeremy L Thompson   forcingType   forcing_choice;
66*5754ecacSJeremy L Thompson   multigridType multigrid_choice;
67*5754ecacSJeremy L Thompson   PetscInt      degree;
68*5754ecacSJeremy L Thompson   PetscInt      q_extra;
69*5754ecacSJeremy L Thompson   PetscInt      num_levels;
70*5754ecacSJeremy L Thompson   PetscInt      *level_degrees;
71*5754ecacSJeremy L Thompson   PetscInt      num_increments;                        // Number of steps
72*5754ecacSJeremy L Thompson   PetscInt      bc_clamp_count;
73*5754ecacSJeremy L Thompson   PetscInt      bc_clamp_faces[16];
74*5754ecacSJeremy L Thompson   // [translation; 3] [rotation axis; 3] [rotation magnitude c_0, c_1]
75*5754ecacSJeremy L Thompson   // The rotations are (c_0 + c_1 s) \pi, where s = x · axis
76*5754ecacSJeremy L Thompson   PetscScalar   bc_clamp_max[16][8];
77*5754ecacSJeremy L Thompson   PetscInt      bc_traction_count;
78*5754ecacSJeremy L Thompson   PetscInt      bc_traction_faces[16];
79*5754ecacSJeremy L Thompson   PetscScalar   bc_traction_vector[16][3];
80*5754ecacSJeremy L Thompson   PetscScalar   forcing_vector[3];
81*5754ecacSJeremy L Thompson   PetscReal     test_tol;
82*5754ecacSJeremy L Thompson   PetscReal     expect_final_strain;
83*5754ecacSJeremy L Thompson };
84*5754ecacSJeremy L Thompson 
85*5754ecacSJeremy L Thompson // Problem specific data
86*5754ecacSJeremy L Thompson // *INDENT-OFF*
87*5754ecacSJeremy L Thompson typedef struct {
88*5754ecacSJeremy L Thompson   CeedInt           geo_data_size;
89*5754ecacSJeremy L Thompson   CeedQFunctionUser setup_geo, apply, jacob, energy, diagnostic;
90*5754ecacSJeremy L Thompson   const char        *setup_geo_loc, *apply_loc, *jacob_loc, *energy_loc,
91*5754ecacSJeremy L Thompson                     *diagnostic_loc;
92*5754ecacSJeremy L Thompson   CeedQuadMode      quad_mode;
93*5754ecacSJeremy L Thompson } problemData;
94*5754ecacSJeremy L Thompson // *INDENT-ON*
95*5754ecacSJeremy L Thompson 
96*5754ecacSJeremy L Thompson // Forcing function data
97*5754ecacSJeremy L Thompson typedef struct {
98*5754ecacSJeremy L Thompson   CeedQFunctionUser setup_forcing;
99*5754ecacSJeremy L Thompson   const char        *setup_forcing_loc;
100*5754ecacSJeremy L Thompson } forcingData;
101*5754ecacSJeremy L Thompson 
102*5754ecacSJeremy L Thompson extern forcingData forcing_options[3];
103*5754ecacSJeremy L Thompson 
104*5754ecacSJeremy L Thompson // Data for PETSc Matshell
105*5754ecacSJeremy L Thompson typedef struct UserMult_ *UserMult;
106*5754ecacSJeremy L Thompson struct UserMult_ {
107*5754ecacSJeremy L Thompson   MPI_Comm        comm;
108*5754ecacSJeremy L Thompson   DM              dm;
109*5754ecacSJeremy L Thompson   Vec             X_loc, Y_loc, neumann_bcs;
110*5754ecacSJeremy L Thompson   CeedVector      x_ceed, y_ceed;
111*5754ecacSJeremy L Thompson   CeedOperator    op;
112*5754ecacSJeremy L Thompson   CeedQFunction   qf;
113*5754ecacSJeremy L Thompson   Ceed            ceed;
114*5754ecacSJeremy L Thompson   PetscScalar     load_increment;
115*5754ecacSJeremy L Thompson   CeedQFunctionContext ctx_phys, ctx_phys_smoother;
116*5754ecacSJeremy L Thompson };
117*5754ecacSJeremy L Thompson 
118*5754ecacSJeremy L Thompson // Data for Jacobian setup routine
119*5754ecacSJeremy L Thompson typedef struct FormJacobCtx_ *FormJacobCtx;
120*5754ecacSJeremy L Thompson struct FormJacobCtx_ {
121*5754ecacSJeremy L Thompson   UserMult     *jacob_ctx;
122*5754ecacSJeremy L Thompson   PetscInt     num_levels;
123*5754ecacSJeremy L Thompson   SNES         snes_coarse;
124*5754ecacSJeremy L Thompson   Mat          *jacob_mat, jacob_mat_coarse;
125*5754ecacSJeremy L Thompson   Vec          u_coarse;
126*5754ecacSJeremy L Thompson };
127*5754ecacSJeremy L Thompson 
128*5754ecacSJeremy L Thompson // Data for PETSc Prolongation/Restriction Matshell
129*5754ecacSJeremy L Thompson typedef struct UserMultProlongRestr_ *UserMultProlongRestr;
130*5754ecacSJeremy L Thompson struct UserMultProlongRestr_ {
131*5754ecacSJeremy L Thompson   MPI_Comm     comm;
132*5754ecacSJeremy L Thompson   DM           dm_c, dm_f;
133*5754ecacSJeremy L Thompson   Vec          loc_vec_c, loc_vec_f;
134*5754ecacSJeremy L Thompson   CeedVector   ceed_vec_c, ceed_vec_f;
135*5754ecacSJeremy L Thompson   CeedOperator op_prolong, op_restrict;
136*5754ecacSJeremy L Thompson   Ceed         ceed;
137*5754ecacSJeremy L Thompson };
138*5754ecacSJeremy L Thompson 
139*5754ecacSJeremy L Thompson #define SOLIDS_MAX_NUMBER_FIELDS 16
140*5754ecacSJeremy L Thompson 
141*5754ecacSJeremy L Thompson // libCEED data struct for level
142*5754ecacSJeremy L Thompson typedef struct CeedData_ *CeedData;
143*5754ecacSJeremy L Thompson struct CeedData_ {
144*5754ecacSJeremy L Thompson   Ceed                ceed;
145*5754ecacSJeremy L Thompson   CeedBasis           basis_x, basis_u, basis_c_to_f, basis_energy,
146*5754ecacSJeremy L Thompson                       basis_diagnostic;
147*5754ecacSJeremy L Thompson   CeedElemRestriction elem_restr_x, elem_restr_u, elem_restr_geo_data_i,
148*5754ecacSJeremy L Thompson                       elem_restr_energy, elem_restr_diagnostic,
149*5754ecacSJeremy L Thompson                       elem_restr_geo_data_diagnostic_i,
150*5754ecacSJeremy L Thompson                       elem_restr_stored_fields_i[SOLIDS_MAX_NUMBER_FIELDS];
151*5754ecacSJeremy L Thompson   CeedQFunction       qf_residual, qf_jacobian, qf_energy, qf_diagnostic;
152*5754ecacSJeremy L Thompson   CeedOperator        op_residual, op_jacobian, op_restrict, op_prolong,
153*5754ecacSJeremy L Thompson                       op_energy,
154*5754ecacSJeremy L Thompson                       op_diagnostic;
155*5754ecacSJeremy L Thompson   CeedVector          geo_data, geo_data_diagnostic, x_ceed, y_ceed,
156*5754ecacSJeremy L Thompson                       true_soln, stored_fields[SOLIDS_MAX_NUMBER_FIELDS];
157*5754ecacSJeremy L Thompson };
158*5754ecacSJeremy L Thompson 
159*5754ecacSJeremy L Thompson typedef struct {
160*5754ecacSJeremy L Thompson   CeedQFunctionUser setup_geo, residual, jacobian, energy,
161*5754ecacSJeremy L Thompson                     diagnostic, true_soln;
162*5754ecacSJeremy L Thompson   const char *setup_geo_loc, *residual_loc, *jacobian_loc, *energy_loc,
163*5754ecacSJeremy L Thompson         *diagnostic_loc, *true_soln_loc;
164*5754ecacSJeremy L Thompson   CeedQuadMode quadrature_mode;
165*5754ecacSJeremy L Thompson   CeedInt geo_data_size, number_fields_stored;
166*5754ecacSJeremy L Thompson   CeedInt *field_sizes;
167*5754ecacSJeremy L Thompson   const char *const *field_names;
168*5754ecacSJeremy L Thompson } ProblemData;
169*5754ecacSJeremy L Thompson 
170*5754ecacSJeremy L Thompson #endif // structs_h
171