Skip to content

Commit d994fd7

Browse files
committed
feat: Make MAX_DAMP_RATIO a parameter in SBKelvin
1 parent 5404e33 commit d994fd7

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

Models/SolidBonds/BondModelKelvin/ModelSBKelvin.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1718
void 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();

Models/SolidBonds/BondModelKelvin/ModelSBKelvin.cu

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ void __global__ CUDA_CalcSBForce_Kelvin_kernel(
8686
{
8787
if (!_bondActivities[i]) continue;
8888

89+
// model parameters
90+
const bool considerBreakage = m_vConstantModelParameters[0] != 0.0;
91+
const double& maxDampRatio = m_vConstantModelParameters[1];
92+
8993
// relative angle velocity of contact partners
9094
const CVector3 relAngleVel = _partAnglVels[_bondLeftIDs[i]] - _partAnglVels[_bondRightIDs[i]];
9195

@@ -118,15 +122,21 @@ void __global__ CUDA_CalcSBForce_Kelvin_kernel(
118122
const CVector3 normalForce = currentContact * (-1 * _bondCrossCuts[i] * _bondNormalStiffnesses[i] * strainTotal);
119123

120124
CVector3 dampingForceNorm = -_bondViscosities[i] * normalVelocity * _bondCrossCuts[i] * _bondNormalStiffnesses[i] * fabs(strainTotal);
121-
if (dampingForceNorm.Length() > 0.5 * normalForce.Length())
122-
dampingForceNorm *= 0.5 * normalForce.Length() / dampingForceNorm.Length();
125+
if (maxDampRatio != 0.0)
126+
{
127+
if (dampingForceNorm.Length() > maxDampRatio * normalForce.Length())
128+
dampingForceNorm *= maxDampRatio * normalForce.Length() / dampingForceNorm.Length();
129+
}
123130

124131
_bondTangentialOverlaps[i] = M * _bondTangentialOverlaps[i] - tangentialVelocity * _timeStep;
125132
const CVector3 tangentialForce = _bondTangentialOverlaps[i] * (_bondTangentialStiffnesses[i] * _bondCrossCuts[i] / _bondInitialLengths[i]);
126133

127134
CVector3 dampingForceTang = -_bondViscosities[i] * tangentialVelocity * _bondTangentialOverlaps[i].Length() * (_bondTangentialStiffnesses[i] * _bondCrossCuts[i] / _bondInitialLengths[i]);
128-
if (dampingForceTang.Length() > 0.5 * tangentialForce.Length())
129-
dampingForceTang *= 0.5 * tangentialForce.Length() / dampingForceTang.Length();
135+
if (maxDampRatio != 0.0)
136+
{
137+
if (dampingForceTang.Length() > maxDampRatio * tangentialForce.Length())
138+
dampingForceTang *= maxDampRatio * tangentialForce.Length() / dampingForceTang.Length();
139+
}
130140

131141
const CVector3 bondNormalMoment = M * _bondNormalMoments[i] - normalAngleVel * (_timeStep * 2 * _bondAxialMoments[i] * _bondTangentialStiffnesses[i] / _bondInitialLengths[i]);
132142
const CVector3 bondTangentialMoment = M * _bondTangentialMoments[i] - tangAngleVel * (_timeStep * _bondNormalStiffnesses[i] * _bondAxialMoments[i] / _bondInitialLengths[i]);
@@ -137,7 +147,7 @@ void __global__ CUDA_CalcSBForce_Kelvin_kernel(
137147
_bondPrevBonds[i] = currentBond;
138148
_bondTotalForces[i] = normalForce + tangentialForce + dampingForceNorm + dampingForceTang;
139149

140-
if (m_vConstantModelParameters[0])
150+
if (considerBreakage)
141151
{
142152
double forceLength = normalForce.Length();
143153
if (strainTotal <= 0) // compression

0 commit comments

Comments
 (0)