v0.16.0
Loading...
Searching...
No Matches
AnalyticalSolutions.hpp
Go to the documentation of this file.
1#ifndef __ANALYTICAL_SOLUTIONS_HPP__
2#define __ANALYTICAL_SOLUTIONS_HPP__
3
4#include <cmath>
5
7
8/**
9 * \brief Lamé analytical solution for a hollow cylinder under radial pressure
10 * with a linear isotropic Hooke material.
11 *
12 * The cylinder axis is aligned with z, while the solution is evaluated in the
13 * x-y cross-section. The z coordinate is ignored. SPACE_DIM == 2 is the
14 * plane-strain case with only the in-plane stress and displacement components
15 * returned. For SPACE_DIM == 3 this uses the plane-strain axial stress and zero
16 * axial displacement.
17 */
18template <int SPACE_DIM> struct HollowCylinderUnderRadialPressure {
19
21 const double inner_radius, const double outer_radius,
22 const double inner_pressure, const double outer_pressure,
23 const double young_modulus, const double poisson_ratio)
25 const double a2 = sqr(inner_radius);
26 const double b2 = sqr(outer_radius);
27 const double denom = b2 - a2;
28
29 A = (inner_pressure * a2 - outer_pressure * b2) / denom;
30 B = (inner_pressure - outer_pressure) * a2 * b2 / denom;
31 }
32
33 /**
34 * \brief Return the Cauchy stress in symmetric tensor storage at point
35 * (x, y, z).
36 */
37 MoFEM::MatrixDouble stress(const double x, const double y,
38 const double) const {
40 stress.clear();
41
42 const double r2 = sqr(x) + sqr(y);
43 const double sigma_r = A - B / r2;
44 const double sigma_t = A + B / r2;
45 const double inv_r = 1. / std::sqrt(r2);
46 const double c = x * inv_r;
47 const double s = y * inv_r;
48
50 SPACE_DIM, -1,
52 t_stress(0, 0) = sigma_r * sqr(c) + sigma_t * sqr(s);
53 t_stress(1, 1) = sigma_r * sqr(s) + sigma_t * sqr(c);
54 t_stress(0, 1) = (sigma_r - sigma_t) * s * c;
55 if constexpr (SPACE_DIM == 3)
56 t_stress(2, 2) = 2. * nu * A;
57
58 return stress;
59 }
60
61 /**
62 * \brief Return the displacement vector at point (x, y, z).
63 */
64 MoFEM::VectorDouble displacement(const double x, const double y,
65 const double) const {
67 disp.clear();
68
69 const double r2 = sqr(x) + sqr(y);
70 const double r = std::sqrt(r2);
71 const double u_r =
72 (1. + nu) / E * ((1. - 2. * nu) * A * r + B / r);
73
74 disp[0] = u_r * x / r;
75 disp[1] = u_r * y / r;
76 if constexpr (SPACE_DIM == 3)
77 disp[2] = 0.;
78
79 return disp;
80 }
81
82private:
83 static constexpr double sqr(const double v) { return v * v; }
84
85 const double E;
86 const double nu;
87 double A;
88 double B;
89};
90
91} // namespace AnalyticalSolutions
92
93#endif // __ANALYTICAL_SOLUTIONS_HPP__
constexpr int SPACE_DIM
constexpr double a2
const double c
speed of light (cm/ns)
const double v
phase velocity of light in medium (cm/ns)
static auto getFTensor2SymmetricFromMat(M &data)
Get symmetric tensor rank 2 (matrix) form data matrix.
Lamé analytical solution for a hollow cylinder under radial pressure with a linear isotropic Hooke ma...
HollowCylinderUnderRadialPressure(const double inner_radius, const double outer_radius, const double inner_pressure, const double outer_pressure, const double young_modulus, const double poisson_ratio)
MoFEM::VectorDouble displacement(const double x, const double y, const double) const
Return the displacement vector at point (x, y, z).
MoFEM::MatrixDouble stress(const double x, const double y, const double) const
Return the Cauchy stress in symmetric tensor storage at point (x, y, z).
double young_modulus
Young modulus.
Definition plastic.cpp:126
double poisson_ratio
Poisson ratio.
Definition plastic.cpp:127