00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "rdModel.h"
00010 #include "rdForce.h"
00011
00012 #ifndef __rdContactForce_h__
00013 #define __rdContactForce_h__
00014
00015
00016
00017
00018
00019
00029 class RDSIMULATION_API rdContactForce : public rdForce
00030 {
00031
00032
00033
00034
00035 public:
00036 static const char PROP_NORMAL_A[];
00037 static const char PROP_NORMAL_B[];
00038
00039 protected:
00041 double _nB[3];
00043 double _nA[3];
00045 double _rnA[3];
00047 double _rn;
00050 double _vnA[3];
00052 double _vn;
00054 double _tA[3];
00056 double _rtA[3];
00058 double _rt;
00061 double _vtA[3];
00063 double _ktp;
00065 double _ktv;
00067 double _knp;
00069 double _knv;
00070
00072 double _fnMag;
00075 double _fnp[3];
00078 double _fnv[3];
00080 double _fn[3];
00083 double _ftMag;
00086 double _ftp[3];
00089 double _ftv[3];
00093 double _ft[3];
00097 double _dfFric[3];
00098
00099
00100
00101
00102
00103
00104
00105
00106 public:
00107 rdContactForce(int aBodyA=0,int aBodyB=0,int aNYP=0);
00108 rdContactForce(IDOM_Element *aElement,int aNYP=0);
00109 rdContactForce(const rdContactForce &aForce);
00110 virtual ~rdContactForce();
00111 private:
00112 void setNull();
00113
00114
00115
00116
00117 public:
00118 rdContactForce& operator=(const rdContactForce &aContact);
00119
00120
00121
00122
00123 public:
00124
00125 void setNormalA(const double aNormal[3]);
00126 void getNormalA(double rNormal[3]) const;
00127
00128 void setNormalB(const double aNormal[3]);
00129 void getNormalB(double rNormal[3]) const;
00130
00131 void getNormalDisplacement(double rDisplacement[3]) const;
00132
00133 double getNormalDistance() const;
00134
00135 void getNormalVelocity(double rVelocity[3]) const;
00136
00137 double getNormalSpeed() const;
00138
00139 void getTangent(double rTangent[3]) const;
00140
00141 void getTangentialDisplacement(double rDisplacement[3]) const;
00142
00143 double getTangentialDistance() const;
00144
00145 void getTangentialVelocity(double rVelocity[3]) const;
00146
00147 void getNormalForce(double rFP[3],double rFV[3],double rF[3]) const;
00148 void getTangentialForce(double rFP[3],double rFV[3],double rF[3]) const;
00149
00150 double getInstantaneousTangentialStiffness() const;
00151 double getInstantaneousNormalStiffness() const;
00152
00153 double getInstantaneousTangentialViscosity() const;
00154 double getInstantaneousNormalViscosity() const;
00155
00156 void getFrictionCorrection(double rDF[3]) const;
00157
00158
00159
00160
00161
00162 virtual void updatePseudoStates() = 0;
00163 virtual void computeDisplacements();
00164 virtual void computeVelocities();
00165
00166
00167
00168
00169
00170
00171
00172
00173 virtual bool check() const;
00174
00175
00176
00177
00178 virtual void
00179 computeLineOfActionComponents(double rNormal[3],
00180 double rTangential[3]) const;
00181
00182
00183
00184
00185 virtual void updateObject(bool aDeep=true);
00186 virtual void updateNode(bool aDeep=true);
00187 virtual void generateNode(IDOM_Element *aParent);
00188 void updateData();
00189
00190
00191 };
00192
00193
00194
00195 #endif // __rdContactForce_h__
00196
00197