MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
MusclePennestriCLR Struct Reference
Inheritance diagram for MusclePennestriCLR:
Collaboration diagram for MusclePennestriCLR:

Public Member Functions

virtual ConstitutiveLaw
< doublereal, doublereal > * 
Read (const DataManager *pDM, MBDynParser &HP, ConstLawType::Type &CLType)
 
- Public Member Functions inherited from ConstitutiveLawRead< doublereal, doublereal >
virtual ~ConstitutiveLawRead (void)
 

Detailed Description

Definition at line 276 of file module-muscles.cc.

Member Function Documentation

virtual ConstitutiveLaw<doublereal, doublereal>* MusclePennestriCLR::Read ( const DataManager pDM,
MBDynParser HP,
ConstLawType::Type CLType 
)
inlinevirtual

Implements ConstitutiveLawRead< doublereal, doublereal >.

Definition at line 278 of file module-muscles.cc.

References MBDynParser::GetDriveCaller(), IncludeParser::GetLineData(), GetPreStress(), HighParser::GetReal(), HighParser::GetYesNoOrBool(), HighParser::IsArg(), HighParser::IsKeyWord(), MBDYN_EXCEPT_ARGS, SAFENEWWITHCONSTRUCTOR, and ConstLawType::VISCOELASTIC.

278  {
280 
282 
283  if (HP.IsKeyWord("help")) {
284  silent_cerr("MusclePennestriCL:\n"
285  " muscle Pennestri ,\n"
286  " [ initial length , <Li> , ]\n"
287  " reference length , <L0> ,\n"
288  " [ reference velocity , <V0> , ]\n"
289  " reference force , <F0> ,\n"
290  " activation , (DriveCaller) <activation>\n"
291  " [ , activation check , (bool)<activation_check> ]\n"
292  " [ , ergonomy , { yes | no } , ]\n"
293  " [ , reflexive , # only when ergonomy == no\n"
294  " proportional gain , <kp> ,\n"
295  " derivative gain , <kd> ,\n"
296  " reference length, (DriveCaller) <lref> ]\n"
297  " [ , prestress, <prestress> ]\n"
298  " [ , prestrain, (DriveCaller) <prestrain> ]\n"
299  << std::endl);
300 
301  if (!HP.IsArg()) {
302  throw NoErr(MBDYN_EXCEPT_ARGS);
303  }
304  }
305 
306  bool bErgo(false);
307  bool bGotErgo(false);
308  if (HP.IsKeyWord("ergonomy")) {
309  silent_cerr("MusclePennestriCL: deprecated, \"ergonomy\" "
310  "at line " << HP.GetLineData()
311  << " should be at end of definition" << std::endl);
312  bErgo = HP.GetYesNoOrBool(bErgo);
313  bGotErgo = true;
314  }
315 
316  doublereal Li = -1.;
317  if (HP.IsKeyWord("initial" "length")) {
318  Li = HP.GetReal();
319  if (Li <= 0.) {
320  silent_cerr("MusclePennestriCL: null or negative initial length "
321  "at line " << HP.GetLineData() << std::endl);
323  }
324  }
325 
326  if (!HP.IsKeyWord("reference" "length")) {
327  silent_cerr("MusclePennestriCL: \"reference length\" expected "
328  "at line " << HP.GetLineData() << std::endl);
330  }
331  doublereal L0 = HP.GetReal();
332  if (L0 <= 0.) {
333  silent_cerr("MusclePennestriCL: null or negative reference length "
334  "at line " << HP.GetLineData() << std::endl);
336  }
337 
338  // default (mm/s? m/s?)
339  doublereal V0 = 2.5;
340  if (HP.IsKeyWord("reference" "velocity")) {
341  V0 = HP.GetReal();
342  if (V0 <= 0.) {
343  silent_cerr("MusclePennestriCL: null or negative reference velocity "
344  "at line " << HP.GetLineData() << std::endl);
346  }
347  }
348 
349  if (!HP.IsKeyWord("reference" "force")) {
350  silent_cerr("MusclePennestriCL: \"reference force\" expected "
351  "at line " << HP.GetLineData() << std::endl);
353  }
354  doublereal F0 = HP.GetReal();
355  if (F0 <= 0.) {
356  silent_cerr("MusclePennestriCL: null or negative reference force "
357  "at line " << HP.GetLineData() << std::endl);
359  }
360 
361  if (!HP.IsKeyWord("activation")) {
362  silent_cerr("MusclePennestriCL: \"activation\" expected "
363  "at line " << HP.GetLineData() << std::endl);
365  }
366  const DriveCaller *pAct = HP.GetDriveCaller();
367 
368  bool bActivationOverflow(false);
369  if (HP.IsKeyWord("activation" "check")) {
370  bActivationOverflow = HP.GetYesNoOrBool(bActivationOverflow);
371  }
372 
373  // FIXME: "ergonomy" must be here
374  if (!bGotErgo && HP.IsKeyWord("ergonomy")) {
375  bErgo = HP.GetYesNoOrBool(bErgo);
376  }
377 
378  bool bReflexive(false);
379  doublereal dKp(0.);
380  doublereal dKd(0.);
381  const DriveCaller *pRefLen(0);
382  if (HP.IsKeyWord("reflexive")) {
383  if (bErgo) {
384  silent_cerr("MusclePennestriCL: "
385  "\"reflexive\" and \"ergonomy\" incompatible "
386  "at line " << HP.GetLineData() << std::endl);
388  }
389  bReflexive = true;
390 
391  if (!HP.IsKeyWord("proportional" "gain")) {
392  silent_cerr("MusclePennestriCL: \"proportional gain\" expected "
393  "at line " << HP.GetLineData() << std::endl);
395  }
396  dKp = HP.GetReal();
397 
398  if (!HP.IsKeyWord("derivative" "gain")) {
399  silent_cerr("MusclePennestriCL: \"derivative gain\" expected "
400  "at line " << HP.GetLineData() << std::endl);
402  }
403  dKd = HP.GetReal();
404 
405  if (!HP.IsKeyWord("reference" "length")) {
406  silent_cerr("MusclePennestriCL: \"reference length\" expected "
407  "at line " << HP.GetLineData() << std::endl);
409  }
410  pRefLen = HP.GetDriveCaller();
411  }
412 
413  /* Prestress and prestrain */
414  doublereal PreStress(0.);
415  GetPreStress(HP, PreStress);
416  TplDriveCaller<doublereal> *pTplDC = GetPreStrain<doublereal>(pDM, HP);
417 
418  if (Li == -1.) {
419  Li = L0;
420  }
421 
422  if (bErgo) {
424  MusclePennestriErgoCL(pTplDC, PreStress,
425  Li, L0, V0, F0, pAct,
426  bActivationOverflow));
427 
428  } else if (bReflexive) {
430  MusclePennestriReflexiveCL(pTplDC, PreStress,
431  Li, L0, V0, F0, pAct,
432  bActivationOverflow,
433  dKp, dKd, pRefLen));
434 
435  } else {
437  MusclePennestriCL(pTplDC, PreStress,
438  Li, L0, V0, F0, pAct,
439  bActivationOverflow));
440  }
441 
442  return pCL;
443  };
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
virtual bool GetYesNoOrBool(bool bDefval=false)
Definition: parser.cc:1038
virtual bool IsKeyWord(const char *sKeyWord)
Definition: parser.cc:910
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
Definition: mynewmem.h:698
void GetPreStress(MBDynParser &HP, T &PreStress)
Definition: except.h:79
virtual bool IsArg(void)
Definition: parser.cc:807
DriveCaller * GetDriveCaller(bool bDeferred=false)
Definition: mbpar.cc:2033
double doublereal
Definition: colamd.c:52
virtual HighParser::ErrOut GetLineData(void) const
Definition: parsinc.cc:697
virtual doublereal GetReal(const doublereal &dDefval=0.0)
Definition: parser.cc:1056

Here is the call graph for this function:


The documentation for this struct was generated from the following file: