shear Force in a cohesive contact
Hi folks,
I've got a problem in shear force calculation in a cohesive contact.
That's the case:
Imagine two spheres are in contact like this:
O.bodies.
O.bodies.
so the contact normal is in Z direction.
Now imagine the material is cohFrictMat and the contact is cohesive. If a force in Y direction is applied to the upper sphere;
O.forces.
the sphere is going to move to left and the contact normal is now parallel to Y axis.
That's what happens with CohFrictMat and it's normal.
However, in a new contact model that I have developed, it seems that there's a problem in calculating the shear force that the above mentioned scenario causes the upper sphere to rotate around the lower sphere by an ever increasing speed and the shear force is always increasing. I copy the force calculation code here and I appreciate if one can have a look to see what's the problem.
Thank you.
bool Law2_ScGeom6D_
{
Vector3r force = Vector3r::Zero();
Vector3r torque1 = Vector3r::Zero();
Vector3r torque2 = Vector3r::Zero();
if (computeForceTo
const int id1 = I->getId1();
const int id2 = I->getId2();
addForce (id1,-force,scene);
addForce (id2, force,scene);
addTorque(id1, torque1,scene);
addTorque(id2, torque2,scene);
return true;
} else return false;
}
bool computeForceTor
const ScGeom6D& geom=*YADE_
CohBurgersPhys& phys=*YADE_
Scene* scene=Omega:
const int id1 = I->getId1();
const int id2 = I->getId2();
const BodyContainer& bodies = *scene->bodies;
const State& de1 = *YADE_CAST<
const State& de2 = *YADE_CAST<
const Real& dt = scene->dt;
if (geom.penetrati
phys.
return false;
}
if (phys.fragile && phys.shearAdhesion > 0 && phys.shearForce
phys.
return false;
}
if (I->isFresh(scene)) {
phys.ukn = Vector3r(0,0,0);
phys.uks = Vector3r(0,0,0);
phys.
phys.
return true;
} else {
Real An = 1.0 + phys.kkn * dt / (2.0 * phys.ckn);
Real Bn = 1.0 - phys.kkn * dt / (2.0 * phys.ckn);
Real Cn = dt / (2.0 * phys.ckn * An) + 1.0 / phys.kmn + dt / (2.0 * phys.cmn);
Real Dn = dt / (2.0 * phys.ckn * An) - 1.0 / phys.kmn + dt / (2.0 * phys.cmn);
Real As = 1.0 + phys.kks * dt / (2.0 * phys.cks);
Real Bs = 1.0 - phys.kks * dt / (2.0 * phys.cks);
Real Cs = dt / (2.0 * phys.cks * As) + 1.0 / phys.kms + dt / (2.0 * phys.cms);
Real Ds = dt / (2.0 * phys.cks * As) - 1.0 / phys.kms + dt / (2.0 * phys.cms);
const Vector3r shift2 = scene->isPeriodic ? scene->
const Vector3r shiftVel = scene->isPeriodic ? scene->
const Vector3r c1x = (geom.contactPoint - de1.pos);
const Vector3r c2x = (geom.contactPoint - de2.pos - shift2);
const Vector3r relativeVelocity = (de1.vel+
const Vector3r normalVelocity = geom.normal.
const Vector3r shearVelocity = relativeVelocit
const Vector3r normalForceT = (normalVelocity * dt + phys.ukn * (1.0 - Bn / An) - phys.normalForce * Dn) / Cn;
phys.ukn = (phys.ukn * Bn + (normalForceT + phys.normalForce) * dt / (2.0 * phys.ckn)) / An;
phys.
const Vector3r shearForceT = -1.0*(shearVelocity * dt + phys.uks * (1.0 - Bs / As) - phys.shearForce * Ds) / Cs;
phys.uks = (phys.uks * Bs + (shearForceT + phys.shearForce) * dt / (2.0 * phys.cks)) / As;
phys.
const Real maxFs = phys.normalForc
if( phys.shearForce
const Real ratio = sqrt(maxFs) / phys.shearForce
}
force = phys.normalForce + phys.shearForce;
torque1 = -c1x.cross(force);
torque2 = c2x.cross(force);
return true;
}
}
Question information
- Language:
- English Edit question
- Status:
- Answered
- For:
- Yade Edit question
- Assignee:
- No assignee Edit question
- Last query:
- Last reply:
Can you help with this problem?
Provide an answer of your own, or ask behzad for more information if necessary.