xref: /libCEED/examples/solids/include/structs.h (revision 17f0843f67ecf218e5d91454f4fa3c6a433ccc04)
15754ecacSJeremy L Thompson #ifndef structs_h
25754ecacSJeremy L Thompson #define structs_h
35754ecacSJeremy L Thompson 
45754ecacSJeremy L Thompson #include <ceed.h>
55754ecacSJeremy L Thompson #include <petsc.h>
65754ecacSJeremy L Thompson #include "../problems/cl-problems.h"
75754ecacSJeremy L Thompson 
85754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
95754ecacSJeremy L Thompson // Command Line Options
105754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
115754ecacSJeremy L Thompson // Forcing function options
125754ecacSJeremy L Thompson typedef enum {
135754ecacSJeremy L Thompson   FORCE_NONE = 0, FORCE_CONST = 1, FORCE_MMS = 2
145754ecacSJeremy L Thompson } forcingType;
155754ecacSJeremy L Thompson static const char *const forcing_types[] = {"none",
165754ecacSJeremy L Thompson                                             "constant",
175754ecacSJeremy L Thompson                                             "mms",
185754ecacSJeremy L Thompson                                             "forcingType","FORCE_",0
195754ecacSJeremy L Thompson                                            };
205754ecacSJeremy L Thompson static const char *const forcing_types_for_disp[] = {"None",
215754ecacSJeremy L Thompson                                                      "Constant",
225754ecacSJeremy L Thompson                                                      "Manufactured solution"
235754ecacSJeremy L Thompson                                                     };
245754ecacSJeremy L Thompson 
255754ecacSJeremy L Thompson // Multigrid options
265754ecacSJeremy L Thompson typedef enum {
275754ecacSJeremy L Thompson   MULTIGRID_LOGARITHMIC = 0, MULTIGRID_UNIFORM = 1, MULTIGRID_NONE = 2
285754ecacSJeremy L Thompson } multigridType;
295754ecacSJeremy L Thompson static const char *const multigrid_types [] = {"logarithmic",
305754ecacSJeremy L Thompson                                                "uniform",
315754ecacSJeremy L Thompson                                                "none",
325754ecacSJeremy L Thompson                                                "multigridType","MULTIGRID",0
335754ecacSJeremy L Thompson                                               };
345754ecacSJeremy L Thompson static const char *const multigrid_types_for_disp[] = {"P-multigrid, logarithmic coarsening",
355754ecacSJeremy L Thompson                                                        "P-multigrind, uniform coarsening",
365754ecacSJeremy L Thompson                                                        "No multigrid"
375754ecacSJeremy L Thompson                                                       };
385754ecacSJeremy L Thompson 
395754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
405754ecacSJeremy L Thompson // Application data structs
415754ecacSJeremy L Thompson // -----------------------------------------------------------------------------
425754ecacSJeremy L Thompson // Units
435754ecacSJeremy L Thompson typedef struct Units_ *Units;
445754ecacSJeremy L Thompson struct Units_ {
455754ecacSJeremy L Thompson   // Fundamental units
465754ecacSJeremy L Thompson   PetscScalar meter;
475754ecacSJeremy L Thompson   PetscScalar kilogram;
485754ecacSJeremy L Thompson   PetscScalar second;
495754ecacSJeremy L Thompson   // Derived unit
505754ecacSJeremy L Thompson   PetscScalar Pascal;
515754ecacSJeremy L Thompson };
525754ecacSJeremy L Thompson 
535754ecacSJeremy L Thompson // Application context from user command line options
545754ecacSJeremy L Thompson typedef struct AppCtx_ *AppCtx;
555754ecacSJeremy L Thompson struct AppCtx_ {
565754ecacSJeremy L Thompson   const char    *name, *name_for_disp;                 // problem name
575754ecacSJeremy L Thompson   char          ceed_resource[PETSC_MAX_PATH_LEN];     // libCEED backend
585754ecacSJeremy L Thompson   char          mesh_file[PETSC_MAX_PATH_LEN];         // exodusII mesh file
595754ecacSJeremy L Thompson   char          output_dir[PETSC_MAX_PATH_LEN];
605754ecacSJeremy L Thompson   PetscBool     test_mode;
615754ecacSJeremy L Thompson   PetscBool     view_soln;
625754ecacSJeremy L Thompson   PetscBool     view_final_soln;
635754ecacSJeremy L Thompson   PetscViewer   energy_viewer;
645754ecacSJeremy L Thompson   problemType   problem_choice;
655754ecacSJeremy L Thompson   forcingType   forcing_choice;
665754ecacSJeremy L Thompson   multigridType multigrid_choice;
675754ecacSJeremy L Thompson   PetscInt      degree;
685754ecacSJeremy L Thompson   PetscInt      q_extra;
695754ecacSJeremy L Thompson   PetscInt      num_levels;
705754ecacSJeremy L Thompson   PetscInt      *level_degrees;
715754ecacSJeremy L Thompson   PetscInt      num_increments;                        // Number of steps
725754ecacSJeremy L Thompson   PetscInt      bc_clamp_count;
735754ecacSJeremy L Thompson   PetscInt      bc_clamp_faces[16];
745754ecacSJeremy L Thompson   // [translation; 3] [rotation axis; 3] [rotation magnitude c_0, c_1]
755754ecacSJeremy L Thompson   // The rotations are (c_0 + c_1 s) \pi, where s = x · axis
765754ecacSJeremy L Thompson   PetscScalar   bc_clamp_max[16][8];
775754ecacSJeremy L Thompson   PetscInt      bc_traction_count;
785754ecacSJeremy L Thompson   PetscInt      bc_traction_faces[16];
795754ecacSJeremy L Thompson   PetscScalar   bc_traction_vector[16][3];
805754ecacSJeremy L Thompson   PetscScalar   forcing_vector[3];
815754ecacSJeremy L Thompson   PetscReal     test_tol;
825754ecacSJeremy L Thompson   PetscReal     expect_final_strain;
835754ecacSJeremy L Thompson };
845754ecacSJeremy L Thompson 
855754ecacSJeremy L Thompson // Forcing function data
865754ecacSJeremy L Thompson typedef struct {
875754ecacSJeremy L Thompson   CeedQFunctionUser setup_forcing;
885754ecacSJeremy L Thompson   const char        *setup_forcing_loc;
895754ecacSJeremy L Thompson } forcingData;
905754ecacSJeremy L Thompson 
915754ecacSJeremy L Thompson extern forcingData forcing_options[3];
925754ecacSJeremy L Thompson 
935754ecacSJeremy L Thompson // Data for PETSc Matshell
945754ecacSJeremy L Thompson typedef struct UserMult_ *UserMult;
955754ecacSJeremy L Thompson struct UserMult_ {
965754ecacSJeremy L Thompson   MPI_Comm        comm;
975754ecacSJeremy L Thompson   DM              dm;
985754ecacSJeremy L Thompson   Vec             X_loc, Y_loc, neumann_bcs;
995754ecacSJeremy L Thompson   CeedVector      x_ceed, y_ceed;
1005754ecacSJeremy L Thompson   CeedOperator    op;
1015754ecacSJeremy L Thompson   CeedQFunction   qf;
1025754ecacSJeremy L Thompson   Ceed            ceed;
1035754ecacSJeremy L Thompson   PetscScalar     load_increment;
1045754ecacSJeremy L Thompson   CeedQFunctionContext ctx_phys, ctx_phys_smoother;
1055754ecacSJeremy L Thompson };
1065754ecacSJeremy L Thompson 
1075754ecacSJeremy L Thompson // Data for Jacobian setup routine
1085754ecacSJeremy L Thompson typedef struct FormJacobCtx_ *FormJacobCtx;
1095754ecacSJeremy L Thompson struct FormJacobCtx_ {
1105754ecacSJeremy L Thompson   UserMult     *jacob_ctx;
1115754ecacSJeremy L Thompson   PetscInt     num_levels;
1125754ecacSJeremy L Thompson   Mat          *jacob_mat, jacob_mat_coarse;
113*17f0843fSJeremy L Thompson   CeedVector   coo_values;
114*17f0843fSJeremy L Thompson   CeedOperator op_coarse;
1155754ecacSJeremy L Thompson };
1165754ecacSJeremy L Thompson 
1175754ecacSJeremy L Thompson // Data for PETSc Prolongation/Restriction Matshell
1185754ecacSJeremy L Thompson typedef struct UserMultProlongRestr_ *UserMultProlongRestr;
1195754ecacSJeremy L Thompson struct UserMultProlongRestr_ {
1205754ecacSJeremy L Thompson   MPI_Comm     comm;
1215754ecacSJeremy L Thompson   DM           dm_c, dm_f;
1225754ecacSJeremy L Thompson   Vec          loc_vec_c, loc_vec_f;
1235754ecacSJeremy L Thompson   CeedVector   ceed_vec_c, ceed_vec_f;
1245754ecacSJeremy L Thompson   CeedOperator op_prolong, op_restrict;
1255754ecacSJeremy L Thompson   Ceed         ceed;
1265754ecacSJeremy L Thompson };
1275754ecacSJeremy L Thompson 
1285754ecacSJeremy L Thompson #define SOLIDS_MAX_NUMBER_FIELDS 16
1295754ecacSJeremy L Thompson 
1305754ecacSJeremy L Thompson // libCEED data struct for level
1315754ecacSJeremy L Thompson typedef struct CeedData_ *CeedData;
1325754ecacSJeremy L Thompson struct CeedData_ {
1335754ecacSJeremy L Thompson   Ceed                ceed;
1345754ecacSJeremy L Thompson   CeedBasis           basis_x, basis_u, basis_c_to_f, basis_energy,
1355754ecacSJeremy L Thompson                       basis_diagnostic;
1365754ecacSJeremy L Thompson   CeedElemRestriction elem_restr_x, elem_restr_u, elem_restr_geo_data_i,
1375754ecacSJeremy L Thompson                       elem_restr_energy, elem_restr_diagnostic,
1385754ecacSJeremy L Thompson                       elem_restr_geo_data_diagnostic_i,
1395754ecacSJeremy L Thompson                       elem_restr_stored_fields_i[SOLIDS_MAX_NUMBER_FIELDS];
1405754ecacSJeremy L Thompson   CeedQFunction       qf_residual, qf_jacobian, qf_energy, qf_diagnostic;
1415754ecacSJeremy L Thompson   CeedOperator        op_residual, op_jacobian, op_restrict, op_prolong,
1425754ecacSJeremy L Thompson                       op_energy,
1435754ecacSJeremy L Thompson                       op_diagnostic;
1445754ecacSJeremy L Thompson   CeedVector          geo_data, geo_data_diagnostic, x_ceed, y_ceed,
1455754ecacSJeremy L Thompson                       true_soln, stored_fields[SOLIDS_MAX_NUMBER_FIELDS];
1465754ecacSJeremy L Thompson };
1475754ecacSJeremy L Thompson 
1485754ecacSJeremy L Thompson typedef struct {
1495754ecacSJeremy L Thompson   CeedQFunctionUser setup_geo, residual, jacobian, energy,
1505754ecacSJeremy L Thompson                     diagnostic, true_soln;
1515754ecacSJeremy L Thompson   const char *setup_geo_loc, *residual_loc, *jacobian_loc, *energy_loc,
1525754ecacSJeremy L Thompson         *diagnostic_loc, *true_soln_loc;
1535754ecacSJeremy L Thompson   CeedQuadMode quadrature_mode;
154a61c78d6SJeremy L Thompson   CeedInt q_data_size, number_fields_stored;
1555754ecacSJeremy L Thompson   CeedInt *field_sizes;
1565754ecacSJeremy L Thompson   const char *const *field_names;
1575754ecacSJeremy L Thompson } ProblemData;
1585754ecacSJeremy L Thompson 
1595754ecacSJeremy L Thompson #endif // structs_h
160