Serac  0.1
Serac is an implicit thermal strucural mechanics simulation code.
solid_mechanics_input.cpp
1 // Copyright (c) 2019-2024, Lawrence Livermore National Security, LLC and
2 // other Serac Project Developers. See the top-level LICENSE file for
3 // details.
4 //
5 // SPDX-License-Identifier: (BSD-3-Clause)
6 
8 
9 namespace serac {
10 
11 void SolidMechanicsInputOptions::defineInputFileSchema(axom::inlet::Container& container)
12 {
13  // interpolation order - currently up to 3rd order is allowed
14  container.addInt("order", "polynomial order of the basis functions.").defaultValue(1).range(1, 3);
15 
16  auto& material_container = container.addStructArray("materials", "Container for array of materials");
18 
19  // Geometric nonlinearities flag
20  container.addBool("geometric_nonlin", "Flag to include geometric nonlinearities in the residual calculation.")
21  .defaultValue(true);
22 
23  auto& equation_solver_container =
24  container.addStruct("equation_solver", "Linear and Nonlinear stiffness Solver Parameters.");
25  EquationSolver::defineInputFileSchema(equation_solver_container);
26 
27  auto& dynamics_container = container.addStruct("dynamics", "Parameters for mass matrix inversion");
28  dynamics_container.addString("timestepper", "Timestepper (ODE) method to use");
29  dynamics_container.addString("enforcement_method", "Time-varying constraint enforcement method to use");
30 
31  auto& bc_container = container.addStructDictionary("boundary_conds", "Container of boundary conditions");
33 
34  auto& init_displ = container.addStruct("initial_displacement", "Coefficient for initial condition");
36  auto& init_velo = container.addStruct("initial_velocity", "Coefficient for initial condition");
38 }
39 
40 } // namespace serac
41 
43  const axom::inlet::Container& base)
44 {
46 
47  result.order = base["order"];
48 
49  // Solver parameters
50  auto equation_solver = base["equation_solver"];
51  result.lin_solver_options = equation_solver["linear"].get<serac::LinearSolverOptions>();
52  result.nonlin_solver_options = equation_solver["nonlinear"].get<serac::NonlinearSolverOptions>();
53 
54  if (base.contains("dynamics")) {
55  serac::TimesteppingOptions timestepping_options;
56  auto dynamics = base["dynamics"];
57 
58  // FIXME: Implement all supported methods as part of an ODE schema
59  const static std::map<std::string, serac::TimestepMethod> timestep_methods = {
60  {"AverageAcceleration", serac::TimestepMethod::AverageAcceleration},
61  {"NewmarkBeta", serac::TimestepMethod::Newmark},
62  {"BackwardEuler", serac::TimestepMethod::BackwardEuler}};
63  std::string timestep_method = dynamics["timestepper"];
64  SLIC_ERROR_ROOT_IF(timestep_methods.count(timestep_method) == 0,
65  "Unrecognized timestep method: " << timestep_method);
66  timestepping_options.timestepper = timestep_methods.at(timestep_method);
67 
68  // FIXME: Implement all supported methods as part of an ODE schema
69  const static std::map<std::string, serac::DirichletEnforcementMethod> enforcement_methods = {
71  std::string enforcement_method = dynamics["enforcement_method"];
72  SLIC_ERROR_ROOT_IF(enforcement_methods.count(enforcement_method) == 0,
73  "Unrecognized enforcement method: " << enforcement_method);
74  timestepping_options.enforcement_method = enforcement_methods.at(enforcement_method);
75 
76  result.timestepping_options = std::move(timestepping_options);
77  }
78 
79  result.materials = base["materials"].get<std::vector<serac::var_solid_material_t>>();
80 
81  // Set the geometric nonlinearities flag
82  bool input_geom_nonlin = base["geometric_nonlin"];
83  if (input_geom_nonlin) {
85  } else {
87  }
88 
89  if (base.contains("boundary_conds")) {
90  result.boundary_conditions =
91  base["boundary_conds"].get<std::unordered_map<std::string, serac::input::BoundaryConditionInputOptions>>();
92  }
93 
94  if (base.contains("initial_displacement")) {
95  result.initial_displacement = base["initial_displacement"].get<serac::input::CoefficientInputOptions>();
96  }
97  if (base.contains("initial_velocity")) {
98  result.initial_velocity = base["initial_velocity"].get<serac::input::CoefficientInputOptions>();
99  }
100  return result;
101 }
static void defineInputFileSchema(axom::inlet::Container &container)
Accelerator functionality.
Definition: serac.cpp:38
An object containing all input file options for the solver for total Lagrangian finite deformation so...
serac::SolidMechanicsInputOptions operator()(const axom::inlet::Container &base)
Returns created object from Inlet container.
Parameters for an iterative linear solution scheme.
Nonlinear solution scheme parameters.
static void defineInputFileSchema(axom::inlet::Container &container)
Input file parameters specific to this class.
Stores all information held in the input file that is used to configure the solver.
std::optional< input::CoefficientInputOptions > initial_displacement
The initial displacement.
static void defineInputFileSchema(axom::inlet::Container &container)
Input file parameters specific to this class.
NonlinearSolverOptions nonlin_solver_options
The linear solver options.
int order
The order of the discretization.
std::vector< var_solid_material_t > materials
The material options.
std::unordered_map< std::string, input::BoundaryConditionInputOptions > boundary_conditions
Boundary condition information.
TimesteppingOptions timestepping_options
The timestepping options.
std::optional< input::CoefficientInputOptions > initial_velocity
The initial velocity.
GeometricNonlinearities geom_nonlin
Geometric nonlinearities flag.
LinearSolverOptions lin_solver_options
The linear solver options.
A timestep and boundary condition enforcement method for a dynamic solver.
TimestepMethod timestepper
The timestepping method to be applied.
DirichletEnforcementMethod enforcement_method
The essential boundary enforcement method to use.
static void defineInputFileSchema(axom::inlet::Container &container)
Input file parameters specific to this class.
Definition: input.cpp:105
The information required from the input file for an mfem::(Vector)(Function)Coefficient.
Definition: input.hpp:88
static void defineInputFileSchema(axom::inlet::Container &container)
Defines the input file schema on the provided inlet container.
Definition: input.cpp:190