MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
DiscreteCoulombFriction Class Reference

#include <friction.h>

Inheritance diagram for DiscreteCoulombFriction:
Collaboration diagram for DiscreteCoulombFriction:

Public Member Functions

 DiscreteCoulombFriction (const BasicScalarFunction *const ff, const doublereal s2, const doublereal vr)
 
void SetValue (DataManager *pDM, VectorHandler &X, VectorHandler &XP, SimulationEntity::Hints *ph=0, const unsigned int solution_startdof=0)
 
unsigned int iGetNumDof (void) const
 
virtual std::ostream & DescribeDof (std::ostream &out, const char *prefix="", bool bInitial=false) const
 
virtual void DescribeDof (std::vector< std::string > &desc, bool bInitial=false, int i=-1) const
 
virtual std::ostream & DescribeEq (std::ostream &out, const char *prefix="", bool bInitial=false) const
 
virtual void DescribeEq (std::vector< std::string > &desc, bool bInitial=false, int i=-1) const
 
DofOrder::Order GetDofType (unsigned int i) const
 
DofOrder::Order GetEqType (unsigned int i) const
 
doublereal fc (void) 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) throw (Elem::ChangedEquationStructure)
 
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
 
- Public Member Functions inherited from SimulationEntity
 SimulationEntity (void)
 
virtual ~SimulationEntity (void)
 
virtual bool bIsValidIndex (unsigned int i) const
 
virtual HintParseHint (DataManager *pDM, const char *s) const
 
virtual void BeforePredict (VectorHandler &, VectorHandler &, VectorHandler &, VectorHandler &) const
 
virtual void AfterPredict (VectorHandler &X, VectorHandler &XP)
 
virtual void Update (const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
virtual void DerivativesUpdate (const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
virtual void Update (const VectorHandler &XCurr, InverseDynamics::Order iOrder)
 
virtual void AfterConvergence (const VectorHandler &X, const VectorHandler &XP)
 
virtual void AfterConvergence (const VectorHandler &X, const VectorHandler &XP, const VectorHandler &XPP)
 
virtual unsigned int iGetNumPrivData (void) const
 
virtual unsigned int iGetPrivDataIdx (const char *s) const
 
virtual doublereal dGetPrivData (unsigned int i) const
 
virtual std::ostream & OutputAppend (std::ostream &out) const
 
virtual void ReadInitialState (MBDynParser &HP)
 

Private Types

enum  tr_type {
  null, from_sticked_to_sliding, from_sticking_to_sliding, from_sliding_to_sticked,
  from_sliding_to_sticking
}
 
enum  status_type { sticked, sticking, sliding }
 

Private Attributes

logical converged_sticked
 
status_type status
 
tr_type transition_type
 
doublereal converged_v
 
logical first_iter
 
logical first_switch
 
doublereal previous_switch_v
 
doublereal current_velocity
 
doublereal saved_sliding_velocity
 
doublereal saved_sliding_friction
 
doublereal sigma2
 
doublereal vel_ratio
 
doublereal current_friction_force
 
const
DifferentiableScalarFunction
fss
 
doublereal f
 

Additional Inherited Members

- Public Types inherited from SimulationEntity
typedef std::vector< Hint * > Hints
 

Detailed Description

A Coulomb model based on Morandini's ideas

Definition at line 207 of file friction.h.

Member Enumeration Documentation

Enumerator
sticked 
sticking 
sliding 

Definition at line 215 of file friction.h.

Constructor & Destructor Documentation

DiscreteCoulombFriction::DiscreteCoulombFriction ( const BasicScalarFunction *const  ff,
const doublereal  s2,
const doublereal  vr 
)

Definition at line 267 of file friction.cc.

References NO_OP.

270  :
271 converged_sticked(true),
272 status(sticked),
274 converged_v(0),
275 first_iter(true),
276 first_switch(true),
279 sigma2(s2),
280 vel_ratio(vr),
282 fss(dynamic_cast<const DifferentiableScalarFunction&>(*ff)),
283 f(0)
284 {
285  NO_OP;
286 }
doublereal current_friction_force
Definition: friction.h:231
#define NO_OP
Definition: myassert.h:74
status_type status
Definition: friction.h:220
const DifferentiableScalarFunction & fss
Definition: friction.h:233
doublereal previous_switch_v
Definition: friction.h:225
doublereal current_velocity
Definition: friction.h:226
doublereal vel_ratio
Definition: friction.h:230
doublereal converged_v
Definition: friction.h:222

Member Function Documentation

void DiscreteCoulombFriction::AfterConvergence ( const doublereal  F,
const doublereal  v,
const VectorHandler X,
const VectorHandler XP,
const unsigned int  solution_startdof 
)
virtual

Reimplemented from BasicFriction.

Definition at line 346 of file friction.cc.

References converged_v, current_velocity, f, first_iter, first_switch, null, previous_switch_v, sliding, status, sticked, sticking, and transition_type.

351  {
352  f = X(solution_startdof+1);
353 // std::cerr << " ** ";
354 // std::cerr << f << " " << v << " " << status << " " << transition_type << " ";
355  converged_v = v;
356  current_velocity = v;
357  previous_switch_v = v;
359  first_iter = true;
360  first_switch = true;
361  if (status == sticking) {
362 //* std::cerr << "sticking" << std::endl;
363  status = sticked;
364  } else if (status == sliding) {
365 //* std::cerr << "sliding" << std::endl;
366  } else {
367 //* std::cerr << "sticked" << std::endl;
368  }
369 // std::cerr << status << " " << transition_type << std::endl;
370 //* std::cerr << "CONVERGENZA; v = " << v << "; f = " << f << std::endl;
371 };
status_type status
Definition: friction.h:220
doublereal previous_switch_v
Definition: friction.h:225
doublereal current_velocity
Definition: friction.h:226
doublereal converged_v
Definition: friction.h:222
void DiscreteCoulombFriction::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

Compute self jacobian and friction coefficient derivatives

Implements BasicFriction.

Definition at line 501 of file friction.cc.

References ExpandableRowVector::Add(), DifferentiableScalarFunction::ComputeDiff(), current_friction_force, fss, FullSubMatrixHandler::IncCoef(), ExpandableRowVector::Link(), ExpandableRowVector::ReDim(), ExpandableRowVector::Set(), sigma2, sign(), sliding, status, sticked, sticking, and ExpandableRowVector::Sub().

512  {
513 //* std::cerr << "Chimata jacobiano. Status:" << status << std::endl;
514  switch (status) {
515  case sticking:
516  case sticked: {
517  //null velocity at the end of time step
518  //WorkVec.IncCoef(startdof+1,v);
519  dv.Sub(WorkMat,startdof+1);
520  dfc.ReDim(1);
521  dfc.Set(1.,1,startdof+1);
522  break;
523  }
524  case sliding: {
525  //still sliding
527  //cur_sticking = false;
528  //save friction force value in the (algebric) state
529  //WorkVec.IncCoef(startdof+1,f-current_friction_force);
530  WorkMat.IncCoef(startdof+1,startdof+1,-1);
531  dv.Add(WorkMat,startdof+1,
533  dfc.ReDim(1);
534  dfc.Set(sign(current_friction_force-sigma2*v)*fss.ComputeDiff(v)+sigma2,1); dfc.Link(1, &dv);
535  break;
536  }
537  default: {
538  silent_cerr("DiscreteCoulombFriction::AssJac() "
539  "logical error" << std::endl);
540  }
541  }
542 };
doublereal current_friction_force
Definition: friction.h:231
void Set(doublereal xx, integer i, integer iidx)
Definition: JacSubMatrix.cc:95
void Add(doublereal xx, integer i)
void IncCoef(integer iRow, integer iCol, const doublereal &dCoef)
Definition: submat.h:683
void ReDim(const integer n)
Definition: JacSubMatrix.cc:50
virtual doublereal ComputeDiff(const doublereal x, const integer order=1) const =0
void Link(const integer i, const ExpandableRowVector *const xp, const integer rhs_block=1)
Definition: JacSubMatrix.cc:68
status_type status
Definition: friction.h:220
const DifferentiableScalarFunction & fss
Definition: friction.h:233
void Sub(doublereal xx, integer i)
int sign(const doublereal x)
Definition: friction.cc:42

Here is the call graph for this function:

void DiscreteCoulombFriction::AssRes ( SubVectorHandler WorkVec,
const unsigned int  startdof,
const unsigned int  solution_startdof,
const doublereal  F,
const doublereal  v,
const VectorHandler X,
const VectorHandler XP 
)
throw (Elem::ChangedEquationStructure
)
virtual

Compute self residual and friction coefficient

Implements BasicFriction.

Definition at line 374 of file friction.cc.

References grad::fabs(), MBDYN_EXCEPT_ARGS, and sign().

381  {
382 // std::cerr << "Chimata residuo. Status:" << status << std::endl;
383  f = X(solution_startdof+1);
384 // if ((std::fabs(f)-fss(0) > 1.0E-6) && (first_iter == false)) {
385 //* std::cerr << "Attrito: " << f << " " << (std::fabs(f)-fss(0))/fss(0) << " - " << std::endl;
386 //* std::cerr << "v: " << v << std::endl;
388 // std::cerr << "Attrito: " << f << " " << std::fabs(f)/fss(0) << " - " << std::endl;
389 // if ((std::fabs(std::fabs(f)-fss(0))/fss(0) > 1.0E-6)) {
390  if (std::fabs(f)-fss(0) > 1.0E-6*fss(0)) {
391  //unconditionally switch to sliding
392  if (status == sticked) {
394 //* std::cerr << "switch to sliding from sticked: " << transition_type << std::endl;
395  } else if (status == sticking) {
397 //* std::cerr << "switch to sliding from sticking: " << transition_type << std::endl;
398  } else if (status == sliding) {
399  //do nothing
400 // std::cerr << "DiscreteCoulombFriction::AssRes message:\n"
401 // << "you shold not go here1! What's wrong?\n"
402 // << "status: " << status << "\n"
403 // << "transition: " << transition_type << "\n"
404 // << "error: " << fabs(f)-fss(0)
405 // << std::endl;
406  } else {
407  silent_cerr("DiscreteCoulombFriction::AssRes() "
408  "logical error1" << std::endl);
409  }
410  status = sliding;
411  }
412  //else
413  if (status == sliding) {
414 // std::cerr << "v*current_velocity: " << v*current_velocity << std::endl;
415  if (v*current_velocity < 0.) {
416 //* std::cerr << "sono dentro; v: " << v <<
417 //* " previous_switch_v: " << previous_switch_v << std::endl;
418 //* std::cerr << "current velocity: " << current_velocity << std::endl;
422  (first_switch == true))) {
423 //* std::cerr << "Passo a sticking $$" << std::endl;;
424  first_switch = false;
425  status = sticking;
430 // std::cerr << "switch to sticking: " << transition_type << std::endl;
431  }
432  }
433  }
434 
435  switch (status) {
436  case sticking: {
437  //switch to sticking: null velocity at the end of time step
438 // std::cerr << "sono qui1" << std::endl;
440  WorkVec.IncCoef(startdof+1,v);
441  break;
442  }
443  case sliding: {
444  //still sliding
445  //cur_sticking = false;
446  switch (transition_type) {
448 // std::cerr << "sono qui2" << std::endl;
450  break;
451  }
454  break;
455  }
456  default: {
457  if (std::fabs(v) > 0.) {
458 // std::cerr << "sono qui3" << std::endl;
459 // std::cerr << "v: " << v << std::endl;
460  if (sign(v) == sign(current_velocity)) {
462 //* std::cerr << "quixxxx" << std::endl;
463  } else {
465 //* std::cerr << "quiyyyy" << std::endl;
466  }
467  } else {
468  //limit the force value while taking the sticking force direction
470  }
471  if (std::abs(v) < std::abs(current_velocity) && !first_iter) {
472 //* std::cerr << "Aggiorno current velocity" << std::endl;
473  current_velocity = v;
474  }
475  break;
476  }
477  }
478  //save friction force value in the (algebric) state
479 // std::cerr << "sono qui5" << std::endl;
480  WorkVec.IncCoef(startdof+1,f-current_friction_force);
481  break;
482  }
483  case sticked: {
485  WorkVec.IncCoef(startdof+1,v);
486  break;
487  }
488  default: {
489  silent_cerr("DiscreteCoulombFriction::AssRes() "
490  "logical error" << std::endl);
491  }
492  }
493  //update status
494  first_iter = false;
495  if (transition_type != null) {
497  }
498 // current_velocity = v;
499 };
doublereal saved_sliding_velocity
Definition: friction.h:227
doublereal current_friction_force
Definition: friction.h:231
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
virtual void IncCoef(integer iRow, const doublereal &dCoef)=0
GradientExpression< UnaryExpr< FuncFabs, Expr > > fabs(const GradientExpression< Expr > &u)
Definition: gradient.h:2973
doublereal saved_sliding_friction
Definition: friction.h:228
status_type status
Definition: friction.h:220
const DifferentiableScalarFunction & fss
Definition: friction.h:233
doublereal previous_switch_v
Definition: friction.h:225
doublereal current_velocity
Definition: friction.h:226
doublereal vel_ratio
Definition: friction.h:230
int sign(const doublereal x)
Definition: friction.cc:42

Here is the call graph for this function:

std::ostream & DiscreteCoulombFriction::DescribeDof ( std::ostream &  out,
const char *  prefix = "",
bool  bInitial = false 
) const
virtual

Implements SimulationEntity.

Definition at line 303 of file friction.cc.

304 {
305  return out << prefix
306  << "[1]: DiscreteCoulombFriction state" << std::endl;
307 }
void DiscreteCoulombFriction::DescribeDof ( std::vector< std::string > &  desc,
bool  bInitial = false,
int  i = -1 
) const
virtual

Implements SimulationEntity.

Definition at line 310 of file friction.cc.

References ASSERT.

311 {
312  ASSERT(i == -1 || i == 0);
313  desc.resize(1);
314  desc[0] = "DiscreteCoulombFriction state";
315 }
#define ASSERT(expression)
Definition: colamd.c:977
std::ostream & DiscreteCoulombFriction::DescribeEq ( std::ostream &  out,
const char *  prefix = "",
bool  bInitial = false 
) const
virtual

Implements SimulationEntity.

Definition at line 318 of file friction.cc.

319 {
320  return out << prefix
321  << "[1]: DiscreteCoulombFriction equation" << std::endl;
322 }
void DiscreteCoulombFriction::DescribeEq ( std::vector< std::string > &  desc,
bool  bInitial = false,
int  i = -1 
) const
virtual

Implements SimulationEntity.

Definition at line 325 of file friction.cc.

References ASSERT.

326 {
327  ASSERT(i == -1 || i == 0);
328  desc.resize(1);
329  desc[0] = "DiscreteCoulombFriction equation";
330 }
#define ASSERT(expression)
Definition: colamd.c:977
doublereal DiscreteCoulombFriction::fc ( void  ) const
virtual

Return last computed friction coefficient

Implements BasicFriction.

Definition at line 342 of file friction.cc.

References current_friction_force.

342  {
343  return current_friction_force;
344 };
doublereal current_friction_force
Definition: friction.h:231
DofOrder::Order DiscreteCoulombFriction::GetDofType ( unsigned int  i) const
virtual

Implements SimulationEntity.

Definition at line 332 of file friction.cc.

References DofOrder::ALGEBRAIC, ASSERTMSGBREAK, and iGetNumDof().

332  {
333  ASSERTMSGBREAK(i<iGetNumDof(), "INDEX ERROR in ModLugreFriction::GetDofType");
334  return DofOrder::ALGEBRAIC;
335 };
#define ASSERTMSGBREAK(expr, msg)
Definition: myassert.h:222
unsigned int iGetNumDof(void) const
Definition: friction.cc:298

Here is the call graph for this function:

DofOrder::Order DiscreteCoulombFriction::GetEqType ( unsigned int  i) const
virtual

Reimplemented from SimulationEntity.

Definition at line 337 of file friction.cc.

References ASSERTMSGBREAK, DofOrder::DIFFERENTIAL, and iGetNumDof().

337  {
338  ASSERTMSGBREAK(i<iGetNumDof(), "INDEX ERROR in ModLugreFriction::GetEqType");
339  return DofOrder::DIFFERENTIAL;
340 };
#define ASSERTMSGBREAK(expr, msg)
Definition: myassert.h:222
unsigned int iGetNumDof(void) const
Definition: friction.cc:298

Here is the call graph for this function:

unsigned int DiscreteCoulombFriction::iGetNumDof ( void  ) const
virtual

Implements SimulationEntity.

Definition at line 298 of file friction.cc.

Referenced by GetDofType(), and GetEqType().

298  {
299  return 1;
300 };
void DiscreteCoulombFriction::SetValue ( DataManager pDM,
VectorHandler X,
VectorHandler XP,
SimulationEntity::Hints ph = 0,
const unsigned int  solution_startdof = 0 
)
virtual

Set Initial Values

Reimplemented from BasicFriction.

Definition at line 289 of file friction.cc.

References f, and VectorHandler::PutCoef().

294 {
295  X.PutCoef(solution_startdof+1,f);
296 }
virtual void PutCoef(integer iRow, const doublereal &dCoef)=0

Here is the call graph for this function:

Member Data Documentation

logical DiscreteCoulombFriction::converged_sticked
private

Definition at line 219 of file friction.h.

doublereal DiscreteCoulombFriction::converged_v
private

Definition at line 222 of file friction.h.

Referenced by AfterConvergence().

doublereal DiscreteCoulombFriction::current_friction_force
private

Definition at line 231 of file friction.h.

Referenced by AssJac(), and fc().

doublereal DiscreteCoulombFriction::current_velocity
private

Definition at line 226 of file friction.h.

Referenced by AfterConvergence().

doublereal DiscreteCoulombFriction::f
private

Definition at line 234 of file friction.h.

Referenced by AfterConvergence(), and SetValue().

logical DiscreteCoulombFriction::first_iter
private

Definition at line 223 of file friction.h.

Referenced by AfterConvergence().

logical DiscreteCoulombFriction::first_switch
private

Definition at line 224 of file friction.h.

Referenced by AfterConvergence().

const DifferentiableScalarFunction& DiscreteCoulombFriction::fss
private

Definition at line 233 of file friction.h.

Referenced by AssJac().

doublereal DiscreteCoulombFriction::previous_switch_v
private

Definition at line 225 of file friction.h.

Referenced by AfterConvergence().

doublereal DiscreteCoulombFriction::saved_sliding_friction
private

Definition at line 228 of file friction.h.

doublereal DiscreteCoulombFriction::saved_sliding_velocity
private

Definition at line 227 of file friction.h.

doublereal DiscreteCoulombFriction::sigma2
private

Definition at line 229 of file friction.h.

Referenced by AssJac().

status_type DiscreteCoulombFriction::status
private

Definition at line 220 of file friction.h.

Referenced by AfterConvergence(), and AssJac().

tr_type DiscreteCoulombFriction::transition_type
private

Definition at line 221 of file friction.h.

Referenced by AfterConvergence().

doublereal DiscreteCoulombFriction::vel_ratio
private

Definition at line 230 of file friction.h.


The documentation for this class was generated from the following files: