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