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