NuTo
Numerics Tool
PlateWithHoleAnalytic.h
Go to the documentation of this file.
1 #pragma once
2 #include <iostream>
3 #include <cmath>
4 #include <Eigen/Core>
5 
6 using ExactStress = Eigen::Vector3d;
7 constexpr double load = 10;
8 
9 namespace NuTo
10 {
11 namespace Test
12 {
13 
15 {
16 public:
17  // @brief returns the analytical solution (sxx, syy, sxy) taken from
18  // https://en.wikiversity.org/wiki/Introduction_to_Elasticity/Plate_with_hole_in_tension
19  static ExactStress AnalyticStress(Eigen::VectorXd cartesianCoordinate)
20  {
21  constexpr double a = 1.0;
22  double r = cartesianCoordinate.norm();
23  double theta = std::atan(cartesianCoordinate[1] / cartesianCoordinate[0]);
24 
25  double cos2t = std::cos(2 * theta);
26  double cos4t = std::cos(4 * theta);
27  double sin2t = std::sin(2 * theta);
28  double sin4t = std::sin(4 * theta);
29 
30  double fac1 = (a * a) / (r * r);
31  double fac2 = 1.5 * fac1 * fac1;
32  ExactStress stress;
33  stress[0] = 1. - fac1 * (1.5 * cos2t + cos4t) + fac2 * cos4t;
34  stress[1] = -fac1 * (0.5 * cos2t - cos4t) - fac2 * cos4t;
35  stress[2] = -fac1 * (0.5 * sin2t + sin4t) + fac2 * sin4t;
36 
37  return stress * load;
38  }
39 
40  static Eigen::VectorXd AnalyticDisplacement(Eigen::Vector2d cartesianCoordinate, double E, double nu)
41  {
42  double a = 1.0;
43  double T = -load;
44  double r = cartesianCoordinate.norm();
45  double theta = std::atan(cartesianCoordinate[1] / cartesianCoordinate[0]);
46 
47  double ct = std::cos(theta);
48  double c3t = std::cos(3 * theta);
49  double st = std::sin(theta);
50  double s3t = std::sin(3 * theta);
51 
52  double mu = E / (2. + 2. * nu);
53  double k = (3. - nu) / (1. + nu);
54 
55  double ux = ((T * a) / (8. * mu)) * ((r / a) * (k + 1.) * ct + ((2. * a) / r) * ((1. + k) * ct + c3t) -
56  ((2. * a * a * a) / (r * r * r)) * c3t);
57  double uy = ((T * a) / (8. * mu)) * ((r / a) * (k - 3.) * st + ((2. * a) / r) * ((1. - k) * st + s3t) -
58  ((2. * a * a * a) / (r * r * r)) * s3t);
59 
60  return Eigen::Vector2d(ux, uy);
61  }
62 
63  static Eigen::Vector2d Pressure(Eigen::Vector2d cartesianCoordinate, Eigen::Vector2d rN)
64  {
65  ExactStress s = AnalyticStress(cartesianCoordinate);
66  Eigen::Matrix2d stress;
67  stress << s[0], s[2], s[2], s[1];
68  Eigen::Vector2d pressure = stress * rN;
69  std::cout << "Apply pressure " << pressure.transpose() << " at cartesian coordinate "
70  << cartesianCoordinate.transpose() << std::endl;
71  return pressure;
72  }
73 
74  static Eigen::Vector2d PressureRight(Eigen::Vector2d cartesianCoordinate)
75  {
76  return Pressure(cartesianCoordinate, Eigen::Vector2d::UnitX());
77  }
78 
79  static Eigen::Vector2d PressureTop(Eigen::Vector2d cartesianCoordinate)
80  {
81  return Pressure(cartesianCoordinate, Eigen::Vector2d::UnitY());
82  }
83 
84  static Eigen::Vector2d PressureLeft(Eigen::Vector2d cartesianCoordinate)
85  {
86  return Pressure(cartesianCoordinate, -Eigen::Vector2d::UnitX());
87  }
88 
89  static Eigen::Vector2d PressureBottom(Eigen::Vector2d cartesianCoordinate)
90  {
91  return Pressure(cartesianCoordinate, -Eigen::Vector2d::UnitY());
92  }
93 };
94 } // namespace Test
95 } // namespace NuTo
static Eigen::Vector2d PressureLeft(Eigen::Vector2d cartesianCoordinate)
Definition: PlateWithHoleAnalytic.h:84
static Eigen::Vector2d PressureRight(Eigen::Vector2d cartesianCoordinate)
Definition: PlateWithHoleAnalytic.h:74
static Eigen::Vector2d PressureBottom(Eigen::Vector2d cartesianCoordinate)
Definition: PlateWithHoleAnalytic.h:89
static Eigen::Vector2d Pressure(Eigen::Vector2d cartesianCoordinate, Eigen::Vector2d rN)
Definition: PlateWithHoleAnalytic.h:63
const double nu
Definition: LinearElasticDamageBenchmark.cpp:7
double pressure
Definition: SurfaceLoad.cpp:17
Definition: PlateWithHoleAnalytic.h:14
static ExactStress AnalyticStress(Eigen::VectorXd cartesianCoordinate)
Definition: PlateWithHoleAnalytic.h:19
s
Definition: WaveFieldSynthesis.py:99
static Eigen::VectorXd AnalyticDisplacement(Eigen::Vector2d cartesianCoordinate, double E, double nu)
Definition: PlateWithHoleAnalytic.h:40
Definition: Exception.h:6
Eigen::Vector3d ExactStress
Definition: PlateWithHoleAnalytic.h:6
constexpr double load
Definition: PlateWithHoleAnalytic.h:7
const double E
Definition: LinearElasticDamageBenchmark.cpp:6
static Eigen::Vector2d PressureTop(Eigen::Vector2d cartesianCoordinate)
Definition: PlateWithHoleAnalytic.h:79