SPHinXsys  alpha version
elastic_solid.h
Go to the documentation of this file.
1 /* -----------------------------------------------------------------------------*
2  * SPHinXsys *
3  * -----------------------------------------------------------------------------*
4  * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle *
5  * Hydrodynamics for industrial compleX systems. It provides C++ APIs for *
6  * physical accurate simulation and aims to model coupled industrial dynamic *
7  * systems including fluid, solid, multi-body dynamics and beyond with SPH *
8  * (smoothed particle hydrodynamics), a meshless computational method using *
9  * particle discretization. *
10  * *
11  * SPHinXsys is partially funded by German Research Foundation *
12  * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1, *
13  * HU1527/12-1 and HU1527/12-4. *
14  * *
15  * Portions copyright (c) 2017-2022 Technical University of Munich and *
16  * the authors' affiliations. *
17  * *
18  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
19  * not use this file except in compliance with the License. You may obtain a *
20  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
21  * *
22  * -----------------------------------------------------------------------------*/
32 #ifndef ELASTIC_SOLID_H
33 #define ELASTIC_SOLID_H
34 
35 #include "base_material.h"
36 #include <fstream>
37 
38 namespace SPH
39 {
44  class ElasticSolid : public Solid
45  {
46  protected:
47  Real E0_; /*< Youngs or tensile modules */
48  Real G0_; /*< shear modules */
49  Real K0_; /*< bulk modules */
50  Real nu_; /*< Poisson ratio */
51  Real c0_; /*< sound wave speed */
52  Real ct0_; /*< tensile wave speed */
53  Real cs0_; /*< shear wave speed */
54 
55  void setSoundSpeeds();
56 
57  public:
58  explicit ElasticSolid(Real rho0)
59  : Solid(rho0), c0_(0.0), ct0_(0.0), cs0_(0.0),
60  E0_(0.0), G0_(0.0), K0_(0.0), nu_(0.0)
61  {
62  material_type_name_ = "ElasticSolid";
63  };
64  virtual ~ElasticSolid(){};
65 
66  Real ReferenceSoundSpeed() { return c0_; };
67  Real TensileWaveSpeed() { return ct0_; };
68  Real ShearWaveSpeed() { return cs0_; };
69  Real YoungsModulus() { return E0_; };
70  Real ShearModulus() { return G0_; };
71  Real BulkModulus() { return K0_; };
72  Real PoissonRatio() { return nu_; };
73 
75  virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) = 0;
77  virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i) = 0;
79  virtual Matd NumericalDampingRightCauchy(Matd &deformation, Matd &deformation_rate, Real smoothing_length, size_t particle_index_i);
81  virtual Matd NumericalDampingLeftCauchy(Matd &deformation, Matd &deformation_rate, Real smoothing_length, size_t particle_index_i);
83  virtual Real PairNumericalDamping(Real dE_dt_ij, Real smoothing_length);
84 
87  virtual Matd DeviatoricKirchhoff(const Matd &deviatoric_be);
89  virtual Real VolumetricKirchhoff(Real J) = 0;
91  virtual std::string getRelevantStressMeasureName() = 0;
92 
93  virtual ElasticSolid *ThisObjectPtr() override { return this; };
94  };
95 
102  {
103  public:
104  explicit LinearElasticSolid(Real rho0, Real youngs_modulus, Real poisson_ratio);
105  virtual ~LinearElasticSolid(){};
106 
107  virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override;
108  virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i) override;
110  virtual Real VolumetricKirchhoff(Real J) override;
112  virtual std::string getRelevantStressMeasureName() override { return "PK2"; };
113 
115  Real getYoungsModulus() { return E0_; };
116  Real getPoissonRatio() { return nu_; };
117  Real getDensity() { return rho0_; };
118 
119  protected:
120  Real lambda0_; /*< first Lame parameter */
121  Real getBulkModulus(Real youngs_modulus, Real poisson_ratio);
122  Real getShearModulus(Real youngs_modulus, Real poisson_ratio);
123  Real getLambda(Real youngs_modulus, Real poisson_ratio);
124  };
125 
131  {
132  public:
133  explicit NeoHookeanSolid(Real rho0, Real youngs_modulus, Real poisson_ratio)
134  : LinearElasticSolid(rho0, youngs_modulus, poisson_ratio)
135  {
136  material_type_name_ = "NeoHookeanSolid";
137  };
138  virtual ~NeoHookeanSolid(){};
139 
141  virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override;
142  virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i) override;
144  virtual Real VolumetricKirchhoff(Real J) override;
146  virtual std::string getRelevantStressMeasureName() override { return "Cauchy"; };
147  };
148 
155  {
156  public:
157  NeoHookeanSolidIncompressible(Real rho_0, Real Youngs_modulus, Real poisson)
158  : LinearElasticSolid(rho_0, Youngs_modulus, poisson)
159  {
160  material_type_name_ = "NeoHookeanSolidIncompressible";
161  };
162  virtual ~NeoHookeanSolidIncompressible() {};
163 
165  virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override;
166  virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i) override;
168  virtual Real VolumetricKirchhoff(Real J) override;
169  };
170 
180  {
181  public:
182  OrthotropicSolid(Real rho_0, std::array<Vecd, 3> a, std::array<Real, 3> E, std::array<Real, 3> G, std::array<Real, 3> poisson);
183 
185  virtual Matd StressPK2(Matd& deformation, size_t particle_index_i) override;
187  virtual Real VolumetricKirchhoff(Real J) override;
188 
189  protected:
190  // input data
191  std::array<Vecd, 3> a_;
192  std::array<Real, 3> E_;
193  std::array<Real, 3> G_;
194  std::array<Real, 3> poisson_;
195  // calculated data
196  Real Mu_[3];
197  Matd Lambda_;
198  Matd A_[3];
199 
200  virtual void CalculateAllMu();
201  virtual void CalculateAllLambda();
202  virtual void CalculateA0();
203  };
204 
210  {
211  protected:
212  Real j1_m_;
213  public:
214  explicit FeneNeoHookeanSolid(Real rho0, Real youngs_modulus, Real poisson_ratio)
215  : LinearElasticSolid(rho0, youngs_modulus, poisson_ratio), j1_m_(1.0)
216  {
217  material_type_name_ = "FeneNeoHookeanSolid";
218  };
219  virtual ~FeneNeoHookeanSolid() {};
220  virtual Matd StressPK2(Matd& deformation, size_t particle_index_i) override;
222  virtual std::string getRelevantStressMeasureName() override { return "Cauchy"; };
223  };
224 
229  class Muscle : public NeoHookeanSolid
230  {
231  public:
232  explicit Muscle(Real rho0, Real bulk_modulus,
233  const Vecd &f0, const Vecd &s0, const Real (&a0)[4], const Real (&b0)[4])
234  : NeoHookeanSolid(rho0, this->getYoungsModulus(bulk_modulus, a0, b0), this->getPoissonRatio(bulk_modulus, a0, b0)),
235  f0_(f0), s0_(s0), f0f0_(SimTK::outer(f0_, f0_)), s0s0_(SimTK::outer(s0_, s0_)),
236  f0s0_(SimTK::outer(f0_, s0_))
237  {
238  material_type_name_ = "Muscle";
239  std::copy(a0, a0 + 4, a0_);
240  std::copy(b0, b0 + 4, b0_);
241  };
242  virtual ~Muscle(){};
243 
244  virtual Matd MuscleFiberDirection(size_t particle_index_i) { return f0f0_; };
246  virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override;
248  virtual Real VolumetricKirchhoff(Real J) override;
250  virtual std::string getRelevantStressMeasureName() override { return "Cauchy"; };
251 
252  virtual Muscle *ThisObjectPtr() override { return this; };
253 
254  protected:
255  Vecd f0_, s0_;
256  Matd f0f0_, s0s0_, f0s0_;
257  Real a0_[4], b0_[4];
259  private:
260  Real getPoissonRatio(Real bulk_modulus, const Real (&a0)[4], const Real (&b0)[4]);
261  Real getShearModulus(const Real (&a0)[4], const Real (&b0)[4]);
262  Real getYoungsModulus(Real bulk_modulus, const Real (&a0)[4], const Real (&b0)[4]);
263  };
264 
274  {
275  protected:
276  StdLargeVec<Matd> local_f0f0_, local_s0s0_, local_f0s0_;
279  virtual void initializeFiberAndSheet();
280  void initializeFiberAndSheetTensors();
281 
282  public:
286  explicit LocallyOrthotropicMuscle(Real rho0, Real bulk_modulus,
287  const Vecd &f0, const Vecd &s0, const Real (&a0)[4], const Real (&b0)[4])
288  : Muscle(rho0, bulk_modulus, f0, s0, a0, b0)
289  {
290  material_type_name_ = "LocallyOrthotropicMuscle";
291  };
292  virtual ~LocallyOrthotropicMuscle(){};
293 
294  virtual void assignBaseParticles(BaseParticles *base_particles) override;
295  virtual Matd MuscleFiberDirection(size_t particle_index_i) override { return local_f0f0_[particle_index_i]; };
297  virtual Matd StressPK2(Matd& deformation, size_t particle_index_i) override;
298  virtual void readFromXmlForLocalParameters(const std::string &filefullpath) override;
300  virtual std::string getRelevantStressMeasureName() override { return "Cauchy"; };
301  };
302 }
303 #endif //ELASTIC_SOLID_H
virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i)=0
Neo-Hookean solid, Incompressible formulation! Currently only works with KirchhoffStressRelaxationFir...
Definition: elastic_solid.h:154
Globally orthotropic muscle.
Definition: elastic_solid.h:229
virtual std::string getRelevantStressMeasureName() override
Definition: elastic_solid.h:250
Vecd s0_
Definition: elastic_solid.h:252
virtual Real PairNumericalDamping(Real dE_dt_ij, Real smoothing_length)
Definition: elastic_solid.cpp:40
virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i) override
Definition: elastic_solid.cpp:128
StdLargeVec< Vecd > local_s0_
Definition: elastic_solid.h:284
StdLargeVec< Matd > local_f0s0_
Definition: elastic_solid.h:276
virtual Real VolumetricKirchhoff(Real J)=0
virtual std::string getRelevantStressMeasureName() override
Definition: elastic_solid.h:222
Base class of all solid materials.
Definition: base_material.h:113
Isotropic linear elastic solid. Note that only basic parameters are used to set ElasticSolid paramete...
Definition: elastic_solid.h:101
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i)=0
virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i) override
Definition: elastic_solid.cpp:84
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override
Definition: elastic_solid.cpp:78
virtual Real VolumetricKirchhoff(Real J) override
Definition: elastic_solid.cpp:265
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override
Definition: elastic_solid.cpp:250
virtual Matd NumericalDampingRightCauchy(Matd &deformation, Matd &deformation_rate, Real smoothing_length, size_t particle_index_i)
Definition: elastic_solid.cpp:24
virtual Real VolumetricKirchhoff(Real J) override
Definition: elastic_solid.cpp:89
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override
Definition: elastic_solid.cpp:221
This is the base classes of all materials. A function in a derived material class returns a value wit...
virtual Matd DeviatoricKirchhoff(const Matd &deviatoric_be)
Definition: elastic_solid.cpp:45
Matd f0s0_
Definition: elastic_solid.h:256
Neo-Hookean solid with finite extension.
Definition: elastic_solid.h:209
Real getYoungsModulus()
Definition: elastic_solid.h:115
virtual std::string getRelevantStressMeasureName() override
Definition: elastic_solid.h:112
Real j1_m_
Definition: elastic_solid.h:212
virtual Matd NumericalDampingLeftCauchy(Matd &deformation, Matd &deformation_rate, Real smoothing_length, size_t particle_index_i)
Definition: elastic_solid.cpp:32
virtual Real VolumetricKirchhoff(Real J) override
Definition: elastic_solid.cpp:114
Abstract class for a generalized elastic solid.
Definition: elastic_solid.h:44
virtual void initializeFiberAndSheet()
Definition: elastic_solid.cpp:291
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override
Definition: elastic_solid.cpp:155
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override
Definition: elastic_solid.cpp:94
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override
Definition: elastic_solid.cpp:119
virtual std::string getRelevantStressMeasureName() override
Definition: elastic_solid.h:300
Neo-Hookean solid, Compressible formulation!
Definition: elastic_solid.h:130
virtual Real VolumetricKirchhoff(Real J) override
Definition: elastic_solid.cpp:134
muscle model is a anisotropic material in which there are local fiber direction and cross-fiber sheet...
Definition: elastic_solid.h:273
virtual std::string getRelevantStressMeasureName()=0
virtual std::string getRelevantStressMeasureName() override
Definition: elastic_solid.h:146
virtual Matd StressCauchy(Matd &almansi_strain, Matd &F, size_t particle_index_i) override
Definition: elastic_solid.cpp:104
virtual Real VolumetricKirchhoff(Real J) override
Definition: elastic_solid.cpp:174
Orthotropic solid - generic definition with 3 orthogonal directions + 9 independent parameters...
Definition: elastic_solid.h:179
virtual Matd StressPK2(Matd &deformation, size_t particle_index_i) override
Definition: elastic_solid.cpp:270
Real b0_[4]
Definition: elastic_solid.h:257
virtual void assignBaseParticles(BaseParticles *base_particles) override
Definition: elastic_solid.cpp:285
Definition: solid_body_supplementary.cpp:9
Real rho0_
Definition: base_material.h:57
StdLargeVec< Vecd > local_f0_
Definition: elastic_solid.h:283