File: HertzianViscoElasticFrictionInteraction.h

package info (click to toggle)
esys-particle 2.3.4%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 13,036 kB
  • ctags: 10,805
  • sloc: cpp: 80,009; python: 5,872; makefile: 1,243; sh: 313; perl: 225
file content (154 lines) | stat: -rw-r--r-- 4,937 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/////////////////////////////////////////////////////////////
//                                                         //
// Copyright (c) 2003-2014 by The University of Queensland //
// Centre for Geoscience Computing                         //
// http://earth.uq.edu.au/centre-geoscience-computing      //
//                                                         //
// Primary Business: Brisbane, Queensland, Australia       //
// Licensed under the Open Software License version 3.0    //
// http://www.apache.org/licenses/LICENSE-2.0          //
//                                                         //
/////////////////////////////////////////////////////////////

#ifndef __HERTZIANVISCOELASTICFRICTIONINTERACTION_H
#define __HERTZIANVISCOELASTICFRICTIONINTERACTION_H

#include "Model/IGParam.h"
#include "Model/Interaction.h"
#include "Model/Particle.h"
#include "Foundation/vec3.h"

#include <iostream>
#include <utility>

/*!
  \brief Interaction group parameters for Hertzian viscoelastic interactions with friction
*/
class CHertzianViscoElasticFrictionIGP : public AIGParam
{
public:
  CHertzianViscoElasticFrictionIGP();

  CHertzianViscoElasticFrictionIGP(
    const std::string &name,
    double A,
    double E,
    double nu,
    double fricCoef,
    double shearK,
    double dT
  );

  virtual std::string getTypeString() const
  {
    return "HertzianViscoElasticFriction";
  }

  void setTimeStepSize(double dt);
  
  double m_A;  // Dissipative constant
  double m_E;  // Young's modulus
  double m_nu; // Poisson ratio
  double mu;   // Friction coefficient
  double k_s;  // Shear coefficient
  double dt;
};

/*!
   \class CHertzianViscoElasticFrictionInteraction
   \brief Frictional+ViscoElastic interaction between particles
   \author Laura Heredia & Pablo Richeri
   $Date: 2009-12-26 20:00:00 (sat, 26 dec 2009) $
*/
class CHertzianViscoElasticFrictionInteraction : public APairInteraction
{
 public: // types
  typedef CHertzianViscoElasticFrictionIGP ParameterType;

  typedef
    double (CHertzianViscoElasticFrictionInteraction::* ScalarFieldFunction)(
    ) const;
  typedef
    std::pair<bool,double>
    (CHertzianViscoElasticFrictionInteraction::* CheckedScalarFieldFunction)(
    ) const;
  typedef
    Vec3 (CHertzianViscoElasticFrictionInteraction::* VectorFieldFunction)(
    ) const;

  static ScalarFieldFunction getScalarFieldFunction(const string&);
  static CheckedScalarFieldFunction getCheckedScalarFieldFunction(
    const string&
  );
  static VectorFieldFunction getVectorFieldFunction(const string&);

 protected:
  double m_A;     //!< Dissipative constant
  double m_E;     //!< Young's modulus
  double m_nu;    //!< Poisson ratio
  double m_r0;    //!< equilibrium distance
  double m_mu;    //!< coefficient of friction
  double m_ks;    //!< shear stiffness (Cundall)
  double m_dt;    //!< time step
  Vec3 m_Ffric;   //!< current frictional force
  Vec3 m_force_deficit; //!< difference between fric. force & force necessary for slip
  Vec3 m_cpos; //!< contact position
  Vec3 m_normal_force; //!< current normal force
  double m_dn; //!< caching displacement for E_pot
  bool m_is_slipping; //!< static/dynamic status of the interaction
  bool m_is_touching; //!< contact status of the interaction
  double m_E_diss; //!< dissipated energy

 public:
  CHertzianViscoElasticFrictionInteraction();
  CHertzianViscoElasticFrictionInteraction(CParticle*,CParticle*);
  CHertzianViscoElasticFrictionInteraction(
    CParticle*,
    CParticle*,
    const CHertzianViscoElasticFrictionIGP&
  );
  virtual ~CHertzianViscoElasticFrictionInteraction();

  static string getType() {return "HertzianViscoElasticFriction";};
  
  virtual void calcForces();
  virtual bool isPersistent();

  void setTimeStepSize(double dt);

  std::pair<bool,double> getAbsFrictionalForce() const;
  std::pair<bool,double> getAbsFN() const;
  std::pair<bool,double> getAbsMuFN() const;
  std::pair<bool,double> getSlipVelocity() const;
  std::pair<bool,double> getNormalStress() const;
  std::pair<bool,double> getMaxFricStress() const;
  std::pair<bool,double> getAbsFrictionalStress() const;

  double getAbsForceDeficit() const;
  double getPotentialEnergy() const;
  double getSlipping()const;
  double getSticking()const;
  double getDissipatedEnergy() const;
  double Count() const;
  Vec3 getForce() const;
  Vec3 getNormalForce() const;
  virtual Vec3 getPos() const {return m_cpos;};

  std::pair<bool,double> getMuEff(const Vec3&,const Vec3&) const;
  std::pair<bool,double> getMuEffXY() const
  {
    return getMuEff(Vec3(1.0,0.0,0.0),Vec3(0.0,1.0,0.0));
  };
  std::pair<bool,double> getMuEffXZ() const
  {
    return getMuEff(Vec3(1.0,0.0,0.0),Vec3(0.0,0.0,1.0));
  };

  friend std::ostream& operator<<(
    std::ostream&,
    const CHertzianViscoElasticFrictionInteraction&
  );
  friend class TML_PackedMessageInterface;
};

#endif //__HERTZIANVISCOELASTICFRICTIONINTERACTION_H