File: RotFricInteraction.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 (160 lines) | stat: -rw-r--r-- 4,866 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
155
156
157
158
159
160
/////////////////////////////////////////////////////////////
//                                                         //
// 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 __ROTFRICTIONINTERACTION_H
#define __ROTFRICTIONINTERACTION_H

// -- project includes --
#include "Model/RotPairInteraction.h"
#include "Model/RotParticle.h"
#include "Model/IGParam.h"
#include "Foundation/vec3.h"

// -- I/O includes --
#include <iostream>
using std::ostream;


//double calc_angle( double , double ) ;


/*!
  \struct CRotFrictionIGP
  \brief Interaction parameters for frictional interaction between rotational particles
  \author Shane Latham, Steffen Abe
  $Revision$
  $Date$
*/
class CRotFrictionIGP : public AIGParam
{
public:
  CRotFrictionIGP();
  
  CRotFrictionIGP(
    const  std::string &name,
    double k,
    double mu_d,
    double mu_s,
    double k_s,
    double dt,
    bool   scaling,
    bool   rigid,
    bool   meanR_scaling
  );

  CRotFrictionIGP(
    const  std::string &name,
    double youngsModulus,
    double poissonsRatio,
    double mu_d,
    double mu_s,
    double dt,
    bool   rigid,
    bool   meanR_scaling
  );

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

  void setTimeStepSize(double dt);

  double k;
  double mu_d;    // sliding frictional coefficient
  double mu_s;     // max static frictional coefficient
  double k_s;
  double dt;
  bool   scaling;
  bool   rigid;
  bool   meanR_scaling;
};

/*!
   \class CRotFrictionInteraction
   \brief Frictional+Elastic interaction between particles between rotational particles
   \author Shane Latham, Steffen Abe
   $Revision$
   $Date$
*/
class CRotFrictionInteraction : public ARotPairInteraction
{
 public: // types
  typedef CRotFrictionIGP ParameterType;

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

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

// protected:
 private:

  double m_k;     //!< spring constant
  double m_r0;    //!< equilibrium distance
  double m_mu_d;  //!< coefficient of dynamic friction
  double m_mu_s;  //!< coefficient of static 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
  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
  bool m_scaling; //!< toggles scaling of elastic properties by particle size
  bool m_rigid; //!< toggles whether to use rigid body friction interactions
  bool m_meanR_scaling; //!< toggles whether to use the mean particle radius or minimum particle radius to define bond radius 
  
  //Quaternion m_init_q1, m_init_q2;
  //Vec3 m_init_pos1 , m_init_pos2;

 public:
  CRotFrictionInteraction();
  CRotFrictionInteraction(CRotParticle*,CRotParticle*,const CRotFrictionIGP&);
  virtual ~CRotFrictionInteraction();

  static string getType() {return "RotFriction";};

  virtual void calcForces();
  virtual void calcSimpleForces();
  virtual void calcRigidBodyForces();
  virtual bool isPersistent();

  void setTimeStepSize(double dt);
  
  void calcNormalForce();
  double getAbsForceDeficit()const;
  double getPotentialEnergy()const;
  double getSlipping()const;
  double getSticking()const;
  double getDissipatedEnergy() const;
  double getAbsSlip() const;
  virtual double Count() const;
  virtual Vec3 getPos() const {return m_cpos;};
  Vec3 getForce() const;
  Vec3 getNormalForce() const;
  Vec3 getTangentialForce() const;

  friend ostream& operator<<(ostream&,const CRotFrictionInteraction&);
  friend class TML_PackedMessageInterface;

  // checkpointing 
  virtual void saveRestartData(std::ostream &oStream);
  virtual void loadRestartData(std::istream &iStream);
};

#endif //__ROTFRICTIONINTERACTION_H