55 const unsigned int solution_startdof)
81 const unsigned int solution_startdof)
94 <<
"[1]: ModLugreFriction state" << std::endl;
100 ASSERT(i == -1 || i == 0);
102 desc[0] =
"ModLugreFriction state";
109 <<
"[1]: ModLugreFriction equation" << std::endl;
115 ASSERT(i == -1 || i == 0);
117 desc[0] =
"ModLugreFriction equation";
131 return fss(std::abs(v))*
sign(v);
145 if (std::abs(z) <= std::abs(zba)) {
146 }
else if ((std::abs(zba)<=std::abs(z)) &&
147 (std::abs(z)<=std::abs(zss))) {
212 const unsigned int startdof,
213 const unsigned int solution_startdof,
220 f = sigma0*z + sigma1*zp + sigma2*v;
221 WorkVec.IncCoef(startdof+1,zp-v+alpha(z,v)*v*z/fs(v)*sigma0);
227 const unsigned int startdof,
228 const unsigned int solution_startdof,
251 WorkMat.
IncCoef(startdof+1,startdof+1,-1.);
252 WorkMat.
IncCoef(startdof+1,startdof+1,
255 dv.
Add(WorkMat,startdof+1,
271 converged_sticked(
true),
273 transition_type(null),
277 previous_switch_v(0),
281 current_friction_force(0),
293 const unsigned int solution_startdof)
306 <<
"[1]: DiscreteCoulombFriction state" << std::endl;
312 ASSERT(i == -1 || i == 0);
314 desc[0] =
"DiscreteCoulombFriction state";
321 <<
"[1]: DiscreteCoulombFriction equation" << std::endl;
327 ASSERT(i == -1 || i == 0);
329 desc[0] =
"DiscreteCoulombFriction equation";
351 const unsigned int solution_startdof) {
352 f = X(solution_startdof+1);
376 const unsigned int startdof,
377 const unsigned int solution_startdof,
383 f = X(solution_startdof+1);
387 transition_type = null;
390 if (
std::fabs(f)-fss(0) > 1.0E-6*fss(0)) {
392 if (status == sticked) {
393 transition_type = from_sticked_to_sliding;
395 }
else if (status == sticking) {
396 transition_type = from_sticking_to_sliding;
398 }
else if (status == sliding) {
407 silent_cerr(
"DiscreteCoulombFriction::AssRes() "
408 "logical error1" << std::endl);
413 if (status == sliding) {
415 if (v*current_velocity < 0.) {
419 if (((transition_type != from_sticked_to_sliding) ||
420 (transition_type != from_sticking_to_sliding)) &&
422 (first_switch ==
true))) {
424 first_switch =
false;
426 transition_type = from_sliding_to_sticking;
427 previous_switch_v = vel_ratio*(v-current_velocity);
428 saved_sliding_velocity = v;
429 saved_sliding_friction = f;
439 current_friction_force = f;
440 WorkVec.IncCoef(startdof+1,v);
446 switch (transition_type) {
447 case from_sticked_to_sliding: {
449 current_friction_force =
sign(f)*fss(v)+sigma2*v;
452 case from_sticking_to_sliding: {
453 current_friction_force =
sign(saved_sliding_friction)*fss(v)+sigma2*v;
460 if (
sign(v) ==
sign(current_velocity)) {
461 current_friction_force =
sign(v)*fss(v)+sigma2*v;
464 current_friction_force =
sign(f)*fss(v)+sigma2*v;
469 current_friction_force =
sign(f)*fss(v)+sigma2*v;
471 if (std::abs(v) < std::abs(current_velocity) && !first_iter) {
473 current_velocity = v;
480 WorkVec.IncCoef(startdof+1,f-current_friction_force);
484 current_friction_force = f;
485 WorkVec.IncCoef(startdof+1,v);
489 silent_cerr(
"DiscreteCoulombFriction::AssRes() "
490 "logical error" << std::endl);
495 if (transition_type != null) {
504 const unsigned int startdof,
505 const unsigned int solution_startdof,
519 dv.
Sub(WorkMat,startdof+1);
521 dfc.
Set(1.,1,startdof+1);
530 WorkMat.
IncCoef(startdof+1,startdof+1,-1);
531 dv.
Add(WorkMat,startdof+1,
538 silent_cerr(
"DiscreteCoulombFriction::AssJac() "
539 "logical error" << std::endl);
611 const char* sKeyWords[] = {
613 "discrete" "coulomb",
638 case DISCRETECOULOMB: {
653 silent_cerr(
"ParseFriction(): unrecognized friction type "
663 const char* sKeyWords[] = {
665 "simple" "plane" "hinge",
686 case SIMPLEPLANEHINGE: {
695 pedantic_cerr(
"ScrewJointShapeCoefficient: missing keyword \"radius\" at line "
698 if (HP.
IsKeyWord(
"half" "thread" "angle")) {
701 pedantic_cerr(
"ScrewJointShapeCoefficient: missing keyword \"half thread angle\" at line "
708 silent_cerr(
"ParseShapeCoefficient(): "
709 "unrecognized shape coefficient type "
unsigned int iGetNumDof(void) const
doublereal current_friction_force
#define ASSERTMSGBREAK(expr, msg)
void Set(doublereal xx, integer i, integer iidx)
virtual doublereal Sh_c(void) const
GradientExpression< BinaryExpr< FuncPow, LhsExpr, RhsExpr > > pow(const GradientExpression< LhsExpr > &u, const GradientExpression< RhsExpr > &v)
#define MBDYN_EXCEPT_ARGS
GradientExpression< UnaryExpr< FuncSin, Expr > > sin(const GradientExpression< Expr > &u)
DiscreteCoulombFriction(const BasicScalarFunction *const ff, const doublereal s2, const doublereal vr)
doublereal alpha(const doublereal z, const doublereal v) const
void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph=0, const unsigned int solution_startdof=0)
void Add(doublereal xx, integer i)
const doublereal fs(const doublereal &v) const
DofOrder::Order GetDofType(unsigned int i) const
void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph=0)
const DifferentiableScalarFunction & fss
virtual std::ostream & DescribeDof(std::ostream &out, const char *prefix="", bool bInitial=false) const
BasicFriction *const ParseFriction(MBDynParser &HP, DataManager *pDM)
void AssJac(FullSubMatrixHandler &WorkMat, ExpandableRowVector &dfc, const unsigned int startdof, const unsigned int solution_startdof, const doublereal dCoef, const doublereal F, const doublereal v, const VectorHandler &X, const VectorHandler &XP, const ExpandableRowVector &dF, const ExpandableRowVector &dv) const
void SetValue(DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph=0, const unsigned int solution_startdof=0)
BasicShapeCoefficient *const ParseShapeCoefficient(MBDynParser &HP)
std::vector< Hint * > Hints
GradientExpression< UnaryExpr< FuncFabs, Expr > > fabs(const GradientExpression< Expr > &u)
void IncCoef(integer iRow, integer iCol, const doublereal &dCoef)
virtual std::ostream & DescribeEq(std::ostream &out, const char *prefix="", bool bInitial=false) const
void AfterConvergence(const doublereal F, const doublereal v, const VectorHandler &X, const VectorHandler &XP, const unsigned int solution_startdof)
void AssRes(SubVectorHandler &WorkVec, const unsigned int startdof, const unsigned int solution_startdof, const doublereal F, const doublereal v, const VectorHandler &X, const VectorHandler &XP)
void ReDim(const integer n)
DofOrder::Order GetDofType(unsigned int i) const
virtual void dSh_c(ExpandableRowVector &dShc, const doublereal f, const doublereal F, const doublereal v, const ExpandableRowVector &dfc, const ExpandableRowVector &dF, const ExpandableRowVector &dv) const
ModLugreFriction(const doublereal sigma0, const doublereal sigma1, const doublereal sigma2, const doublereal kappa, const BasicScalarFunction *const ff)
const doublereal fsd(const doublereal &v) const
virtual bool IsKeyWord(const char *sKeyWord)
SimplePlaneHingeJointSh_c(void)
virtual std::ostream & DescribeEq(std::ostream &out, const char *prefix="", bool bInitial=false) const
void AssJac(FullSubMatrixHandler &WorkMat, ExpandableRowVector &dfc, const unsigned int startdof, const unsigned int solution_startdof, const doublereal dCoef, const doublereal F, const doublereal v, const VectorHandler &X, const VectorHandler &XP, const ExpandableRowVector &dF, const ExpandableRowVector &dv) const
virtual doublereal Sh_c(void) const
doublereal alphad_z(const doublereal z, const doublereal v) const
void AssRes(SubVectorHandler &WorkVec, const unsigned int startdof, const unsigned int solution_startdof, const doublereal F, const doublereal v, const VectorHandler &X, const VectorHandler &XP)
DofOrder::Order GetEqType(unsigned int i) const
#define ASSERT(expression)
virtual doublereal ComputeDiff(const doublereal x, const integer order=1) const =0
virtual std::ostream & DescribeDof(std::ostream &out, const char *prefix="", bool bInitial=false) const
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
virtual void PutCoef(integer iRow, const doublereal &dCoef)=0
void Link(const integer i, const ExpandableRowVector *const xp, const integer rhs_block=1)
const DifferentiableScalarFunction & fss
void dSh_c(ExpandableRowVector &dShc, const doublereal f, const doublereal F, const doublereal v, const ExpandableRowVector &dfc, const ExpandableRowVector &dF, const ExpandableRowVector &dv) const
doublereal fc(void) const
unsigned int iGetNumDof(void) const
doublereal fc(void) const
doublereal previous_switch_v
doublereal current_velocity
void Sub(doublereal xx, integer i)
doublereal alphad_v(const doublereal z, const doublereal v) const
GradientExpression< UnaryExpr< FuncCos, Expr > > cos(const GradientExpression< Expr > &u)
int sign(const doublereal x)
virtual HighParser::ErrOut GetLineData(void) const
const BasicScalarFunction *const ParseScalarFunction(MBDynParser &HP, DataManager *const pDM)
DofOrder::Order GetEqType(unsigned int i) const
virtual doublereal GetReal(const doublereal &dDefval=0.0)