@@ -10,12 +10,17 @@ CModelSBKelvin::CModelSBKelvin()
1010 m_uniqueKey = " 09405654485642A686561E1FC646DF1E" ;
1111 m_helpFileName = " /Solid Bond/Kelvin.pdf" ;
1212
13- AddParameter (" CONSIDER_BREAKAGE" , " Consider breakage Yes=1/No=0" , 1 );
13+ /* 0 */ AddParameter (" CONSIDER_BREAKAGE" , " Consider breakage Yes=1/No=0" , 1 );
14+ /* 1 */ AddParameter (" MAX_DAMP_RATIO" , " Max ratio of the damping force to the elastic force" , 1 );
1415 m_hasGPUSupport = true ;
1516}
1617
1718void CModelSBKelvin::CalculateSB (double _time, double _timeStep, size_t _iLeft, size_t _iRight, size_t _iBond, SSolidBondStruct& _bonds, unsigned * _brokenBondsNum) const
1819{
20+ // model parameters
21+ const bool considerBreakage = m_parameters[0 ].value != 0.0 ;
22+ const double maxDampRatio = m_parameters[1 ].value ;
23+
1924 // relative angle velocity of contact partners
2025 const CVector3 relAngleVel = Particles ().AnglVel (_iLeft) - Particles ().AnglVel (_iRight);
2126
@@ -55,15 +60,21 @@ void CModelSBKelvin::CalculateSB(double _time, double _timeStep, size_t _iLeft,
5560 const CVector3 normalForce = currentContact * (-1 * Bonds ().CrossCut (_iBond) * Bonds ().NormalStiffness (_iBond) * strainTotal);
5661
5762 CVector3 dampingForceNorm = -mu * normalVelocity * Bonds ().CrossCut (_iBond) * Bonds ().NormalStiffness (_iBond) * fabs (strainTotal);
58- if (dampingForceNorm.Length () > 0.5 * normalForce.Length ())
59- dampingForceNorm *= 0.5 * normalForce.Length () / dampingForceNorm.Length ();
63+ if (maxDampRatio != 0.0 )
64+ {
65+ if (dampingForceNorm.Length () > maxDampRatio * normalForce.Length ())
66+ dampingForceNorm *= maxDampRatio * normalForce.Length () / dampingForceNorm.Length ();
67+ }
6068
6169 _bonds.TangentialOverlap (_iBond) = M * Bonds ().TangentialOverlap (_iBond) - tangentialVelocity * _timeStep;
6270 _bonds.TangentialForce (_iBond) = Bonds ().TangentialOverlap (_iBond) * (Bonds ().TangentialStiffness (_iBond) * Bonds ().CrossCut (_iBond) / Bonds ().InitialLength (_iBond));
6371
6472 CVector3 dampingForceTang = -mu * tangentialVelocity * Bonds ().TangentialOverlap (_iBond).Length () * (Bonds ().TangentialStiffness (_iBond) * Bonds ().CrossCut (_iBond) / Bonds ().InitialLength (_iBond));
65- if (dampingForceTang.Length () > 0.5 * Bonds ().TangentialForce (_iBond).Length ())
66- dampingForceTang *= 0.5 * Bonds ().TangentialForce (_iBond).Length () / dampingForceTang.Length ();
73+ if (maxDampRatio != 0.0 )
74+ {
75+ if (dampingForceTang.Length () > maxDampRatio * Bonds ().TangentialForce (_iBond).Length ())
76+ dampingForceTang *= maxDampRatio * Bonds ().TangentialForce (_iBond).Length () / dampingForceTang.Length ();
77+ }
6778
6879 _bonds.NormalMoment (_iBond) = M * Bonds ().NormalMoment (_iBond) - normalAngleVel * (_timeStep * 2 * Bonds ().AxialMoment (_iBond) * Bonds ().TangentialStiffness (_iBond) / Bonds ().InitialLength (_iBond));
6980 _bonds.TangentialMoment (_iBond) = M * Bonds ().TangentialMoment (_iBond) - tangAngleVel * (_timeStep * Bonds ().NormalStiffness (_iBond) * Bonds ().AxialMoment (_iBond) / Bonds ().InitialLength (_iBond));
@@ -72,7 +83,7 @@ void CModelSBKelvin::CalculateSB(double _time, double _timeStep, size_t _iLeft,
7283 _bonds.UnsymMoment (_iBond) = currentBond * 0.5 * Bonds ().TangentialForce (_iBond);
7384 _bonds.PrevBond (_iBond) = currentBond;
7485
75- if (m_parameters[ 0 ]. value == 0.0 ) return ; // consider breakage
86+ if (!considerBreakage ) return ;
7687
7788 // check the bond destruction
7889 double forceLength = normalForce.Length ();
0 commit comments