ExaDG
Loading...
Searching...
No Matches
incompressible_neo_hookean.h
1/* ______________________________________________________________________
2 *
3 * ExaDG - High-Order Discontinuous Galerkin for the Exa-Scale
4 *
5 * Copyright (C) 2023 by the ExaDG authors
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 * ______________________________________________________________________
20 */
21
22#ifndef EXADG_STRUCTURE_MATERIAL_LIBRARY_INCOMPRESSIBLE_NEO_HOOKEAN_H_
23#define EXADG_STRUCTURE_MATERIAL_LIBRARY_INCOMPRESSIBLE_NEO_HOOKEAN_H_
24
25// deal.II
26#include <deal.II/base/function.h>
27#include <deal.II/base/point.h>
28#include <deal.II/matrix_free/matrix_free.h>
29
30// ExaDG
31#include <exadg/matrix_free/integrators.h>
32#include <exadg/operators/variable_coefficients.h>
33#include <exadg/structure/material/material.h>
34
35namespace ExaDG
36{
37namespace Structure
38{
39template<int dim>
40struct IncompressibleNeoHookeanData : public MaterialData
41{
42 IncompressibleNeoHookeanData(
43 MaterialType const & type,
44 double const & shear_modulus,
45 double const & bulk_modulus,
46 Type2D const & type_two_dim,
47 std::shared_ptr<dealii::Function<dim>> const shear_modulus_function = nullptr)
48 : MaterialData(type),
49 shear_modulus(shear_modulus),
50 shear_modulus_function(shear_modulus_function),
51 bulk_modulus(bulk_modulus),
52 type_two_dim(type_two_dim)
53 {
54 }
55
56 double shear_modulus;
57 std::shared_ptr<dealii::Function<dim>> shear_modulus_function;
58
59 double bulk_modulus;
60 Type2D type_two_dim;
61};
62
63template<int dim, typename Number>
64class IncompressibleNeoHookean : public Material<dim, Number>
65{
66public:
67 typedef typename Material<dim, Number>::VectorType VectorType;
68 typedef typename Material<dim, Number>::Range Range;
69 typedef typename Material<dim, Number>::IntegratorCell IntegratorCell;
70
71 typedef typename Material<dim, Number>::scalar scalar;
72 typedef typename Material<dim, Number>::tensor tensor;
73 typedef typename Material<dim, Number>::symmetric_tensor symmetric_tensor;
74
75 IncompressibleNeoHookean(dealii::MatrixFree<dim, Number> const & matrix_free,
76 unsigned int const dof_index,
77 unsigned int const quad_index,
79
80 /*
81 * The second Piola-Kirchhoff stress is defined as S = S_vol + S_iso (Flory split),
82 * where we have strain energy density functions Psi_vol and Psi_iso defined as
83 *
84 * Psi_vol = bulk_modulus / 4 * ( J^2 - 1 - ln(J) )
85 *
86 * and
87 *
88 * Psi_iso = shear_modulus / 2 * ( I_1_bar - trace(I) )
89 *
90 * with the classic relations
91 *
92 * F = I + Grad(displacement) ,
93 *
94 * J = det(F) ,
95 *
96 * C = F^T * F ,
97 *
98 * I_1 = tr(C) ,
99 *
100 * I_1_bar = J^(-2/3) * I_1
101 *
102 * such that we end up with
103 *
104 * S_vol = bulk_modulus / 2 * (J^2 - 1) C^(-1)
105 *
106 * S_iso = J^(-2/3) * ( I - 1/3 * I_1 * C^(-1) )
107 *
108 */
109 symmetric_tensor
110 second_piola_kirchhoff_stress(tensor const & gradient_displacement,
111 unsigned int const cell,
112 unsigned int const q) const final;
113
114 symmetric_tensor
115 second_piola_kirchhoff_stress_displacement_derivative(tensor const & gradient_increment,
116 tensor const & deformation_gradient,
117 unsigned int const cell,
118 unsigned int const q) const final;
119
120private:
121 /*
122 * Store factors involving (potentially variable) shear modulus.
123 */
124 void
125 cell_loop_set_coefficients(dealii::MatrixFree<dim, Number> const & matrix_free,
126 VectorType &,
127 VectorType const & src,
128 Range const & cell_range) const;
129
130 unsigned int dof_index;
131 unsigned int quad_index;
132
134
135 mutable scalar shear_modulus_stored;
136
137 // cache coefficients for spatially varying material parameters
138 bool shear_modulus_is_variable;
139 mutable VariableCoefficients<scalar> shear_modulus_coefficients;
140
141 Number static constexpr one_third = 1.0 / 3.0;
142};
143} // namespace Structure
144} // namespace ExaDG
145
146#endif /* EXADG_STRUCTURE_MATERIAL_LIBRARY_INCOMPRESSIBLE_NEO_HOOKEAN_H_ */
Definition material.h:38
Definition variable_coefficients.h:40
Definition driver.cpp:33
Definition incompressible_neo_hookean.h:41