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