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

#include <drive.h>

Collaboration diagram for DriveHandler:

Classes

class  MyClosestNext
 
class  MyMeter
 
class  MyRand
 
class  MySH
 

Public Member Functions

 DriveHandler (MathParser &mp)
 
 ~DriveHandler (void)
 
void PutSymbolTable (Table &T)
 
void SetVar (const doublereal &dVar)
 
doublereal dGet (InputStream &InStr) const
 
doublereal dGetTime (void) const
 
doublereal dGetTimeStep (void) const
 
integer iGetStep (void) const
 
long int iGetRand (integer iNumber) const
 
bool bGetMeter (integer iNumber) const
 
bool bGetClosestNext (integer iNumber) const
 
doublereal dGetSH (integer iNumber) const
 
const DriveCallerpGetSHFunc (integer iNumber) const
 
const DriveCallerpGetSHTrigger (integer iNumber) const
 
const doublereal dGetSHVal0 (integer iNumber) const
 

Protected Member Functions

void SetTime (const doublereal &dt, const doublereal &dts, const integer &s)
 
void LinkToSolution (const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
 
integer iRandInit (integer iSteps)
 
integer iMeterInit (integer iSteps)
 
integer iClosestNextInit (const DriveCaller *pIncrement, doublereal dStartTime)
 
integer iSHInit (const DriveCaller *pFunc, const DriveCaller *pTrigger, const doublereal dVal0)
 

Private Attributes

MathParserParser
 
VarpTime
 
VarpTimeStep
 
VarpStep
 
VarpVar
 
VectorHandlerpXCurr
 
VectorHandlerpXPrimeCurr
 
integer iCurrStep
 
std::vector< MyMeter * > Meter
 
std::vector< MyRand * > Rand
 
std::vector< MyClosestNext * > ClosestNext
 
std::vector< MySH * > SH
 

Static Private Attributes

static doublereal dDriveHandlerReturnValue = 0.
 

Friends

class DataManager
 
class RandDriveCaller
 
class MeterDriveCaller
 
class ClosestNextDriveCaller
 
class SHDriveCaller
 

Detailed Description

Definition at line 171 of file drive.h.

Constructor & Destructor Documentation

DriveHandler::DriveHandler ( MathParser mp)

Definition at line 59 of file drive.cc.

References Table::Get(), MathParser::GetSymbolTable(), NamedValue::IsVar(), MBDYN_EXCEPT_ARGS, Parser, pStep, pTime, pTimeStep, Table::Put(), and pVar.

60 : Parser(mp),
61 pTime(0),
62 pTimeStep(0),
63 pStep(0),
64 pVar(0),
65 pXCurr(0),
66 pXPrimeCurr(0),
67 iCurrStep(0),
68 Meter(0),
69 Rand(0),
70 ClosestNext(0),
71 SH(0)
72 {
73 #ifdef USE_MULTITHREAD
74  pthread_mutexattr_t ma;
75  pthread_mutexattr_init(&ma);
76  pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE);
77  int rc = pthread_mutex_init(&parser_mutex, &ma);
78  pthread_mutexattr_destroy(&ma);
79  if (rc) {
80  silent_cerr("DriveHandler::DriveHandler(): mutex init failed"
81  << std::endl);
83  }
84 #endif /* USE_MULTITHREAD */
85 
86  NamedValue *v;
87 
88  /* Inserisce la variabile Time nella tabella dei simboli; sara'
89  * mantenuta aggiornata dal DriveHandler */
90  v = Parser.GetSymbolTable().Get("Time");
91  if (v == 0) {
92  pTime = Parser.GetSymbolTable().Put("Time", Real(0));
93  if (pTime == 0) {
94  silent_cerr("DriveHandler::DriveHandler(): "
95  "error while inserting symbol 'Time'"
96  << std::endl);
98  }
99 
100  } else {
101  if (!v->IsVar()) {
102  silent_cerr("Symbol 'Time' must be a variable"
103  << std::endl);
105  }
106  pTime = dynamic_cast<Var *>(v);
107  }
108 
109  /* Inserisce la variabile TimeStep nella tabella dei simboli; sara'
110  * mantenuta aggiornata dal DriveHandler */
111  v = Parser.GetSymbolTable().Get("TimeStep");
112  if (v == 0) {
113  pTimeStep = Parser.GetSymbolTable().Put("TimeStep", Real(-1.));
114  if (pTimeStep == 0) {
115  silent_cerr("DriveHandler::DriveHandler(): "
116  "error while inserting symbol 'TimeStep'"
117  << std::endl);
119  }
120 
121  } else {
122  if (!v->IsVar()) {
123  silent_cerr("Symbol 'TimeStep' must be a variable"
124  << std::endl);
126  }
127  pTimeStep = dynamic_cast<Var *>(v);
128  }
129 
130  /* Inserisce la variabile Step nella tabella dei simboli; sara'
131  * mantenuta aggiornata dal DriveHandler */
132  v = Parser.GetSymbolTable().Get("Step");
133  if (v == 0) {
134  pStep = Parser.GetSymbolTable().Put("Step", Int(-1));
135  if (pStep == 0) {
136  silent_cerr("DriveHandler::DriveHandler(): "
137  "error while inserting symbol 'Step'"
138  << std::endl);
140  }
141 
142  } else {
143  if (!v->IsVar()) {
144  silent_cerr("Symbol 'Step' must be a variable"
145  << std::endl);
147  }
148  pStep = dynamic_cast<Var *>(v);
149  }
150 
151  /* Inserisce la variabile Var nella tabella dei simboli; sara'
152  * mantenuta aggiornata dai DriveCaller attraverso il DriveHandler */
153  v = Parser.GetSymbolTable().Get("Var");
154  if (v == 0) {
155  pVar = Parser.GetSymbolTable().Put("Var", Real(0));
156  if (pVar == 0) {
157  silent_cerr("DriveHandler::DriveHandler(): "
158  "error while insterting symbol 'Var'"
159  << std::endl);
161  }
162 
163  } else {
164  if (!v->IsVar()) {
165  silent_cerr("Symbol 'Var' must be a variable"
166  << std::endl);
168  }
169  pVar = dynamic_cast<Var *>(v);
170  }
171 
172  /* Calcola il seed di riferimento per i numeri random */
173  srand(time(NULL));
174 }
Definition: mathtyp.h:175
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
Var * Put(const std::string &name, const TypedValue &v)
Definition: table.cc:110
Var * pTime
Definition: drive.h:185
MathParser & Parser
Definition: drive.h:182
int Int
Definition: mathtyp.h:40
std::vector< MyMeter * > Meter
Definition: drive.h:265
std::vector< MyClosestNext * > ClosestNext
Definition: drive.h:267
VectorHandler * pXCurr
Definition: drive.h:192
std::vector< MyRand * > Rand
Definition: drive.h:266
Var * pStep
Definition: drive.h:187
VectorHandler * pXPrimeCurr
Definition: drive.h:193
Var * pVar
Definition: drive.h:188
NamedValue * Get(const std::string &name) const
Definition: table.cc:150
std::vector< MySH * > SH
Definition: drive.h:268
integer iCurrStep
Definition: drive.h:195
Var * pTimeStep
Definition: drive.h:186
double Real
Definition: mathtyp.h:39
Table & GetSymbolTable(void) const
Definition: mathp.cc:1931
virtual bool IsVar(void) const
Definition: mathp.cc:1745

Here is the call graph for this function:

DriveHandler::~DriveHandler ( void  )

Definition at line 176 of file drive.cc.

References ClosestNext, Meter, Rand, SAFEDELETE, and SH.

177 {
178 #ifdef USE_MULTITHREAD
179  pthread_mutex_destroy(&parser_mutex);
180 #endif /* USE_MULTITHREAD */
181 
182  for (std::vector<MyMeter *>::iterator i = Meter.begin();
183  i != Meter.end(); ++i)
184  {
185  SAFEDELETE(*i);
186  }
187 
188  for (std::vector<MyRand *>::iterator i = Rand.begin();
189  i != Rand.end(); ++i)
190  {
191  SAFEDELETE(*i);
192  }
193 
194  for (std::vector<MyClosestNext*>::iterator i = ClosestNext.begin();
195  i != ClosestNext.end(); ++i)
196  {
197  SAFEDELETE(*i);
198  }
199 
200  for (std::vector<MySH *>::iterator i = SH.begin();
201  i != SH.end(); ++i)
202  {
203  SAFEDELETE(*i);
204  }
205 }
std::vector< MyMeter * > Meter
Definition: drive.h:265
std::vector< MyClosestNext * > ClosestNext
Definition: drive.h:267
std::vector< MyRand * > Rand
Definition: drive.h:266
std::vector< MySH * > SH
Definition: drive.h:268
#define SAFEDELETE(pnt)
Definition: mynewmem.h:710

Member Function Documentation

bool DriveHandler::bGetClosestNext ( integer  iNumber) const
inline

Definition at line 421 of file drive.h.

Referenced by ClosestNextDriveCaller::dGet().

422 {
423  return ClosestNext[iNumber]->bGetClosestNext();
424 }
std::vector< MyClosestNext * > ClosestNext
Definition: drive.h:267
bool DriveHandler::bGetMeter ( integer  iNumber) const
inline

Definition at line 415 of file drive.h.

Referenced by MeterDriveCaller::dGet().

416 {
417  return Meter[iNumber]->bGetMeter();
418 }
std::vector< MyMeter * > Meter
Definition: drive.h:265
doublereal DriveHandler::dGet ( InputStream InStr) const

Definition at line 358 of file drive.cc.

References MathParser::GetLastStmt(), Parser, and MBDynErrBase::what().

Referenced by StringDriveCaller::dGet().

359 {
360  doublereal d;
361 
362 #ifdef USE_MULTITHREAD
363  // FIXME: risk recursive lock
364  pthread_mutex_lock(&parser_mutex);
365 #endif /* USE_MULTITHREAD */
366 
367  try {
368  d = Parser.GetLastStmt(InStr);
369 
370  } catch (MBDynErrBase& e) {
371  silent_cerr("StringDrive: " << e.what() << std::endl);
372 
373 #ifdef USE_MULTITHREAD
374  pthread_mutex_unlock(&parser_mutex);
375 #endif /* USE_MULTITHREAD */
376 
377  throw e;
378 
379 #if 0
380  } catch (ErrGeneric e) {
381  silent_cerr("StringDrive: " << e.what() << std::endl);
382  throw e;
383 #endif
384 
385  } catch (...) {
386  silent_cerr("StringDrive generic error" << std::endl);
387 
388 #ifdef USE_MULTITHREAD
389  pthread_mutex_unlock(&parser_mutex);
390 #endif /* USE_MULTITHREAD */
391 
392  throw;
393  }
394 
395 #ifdef USE_MULTITHREAD
396  pthread_mutex_unlock(&parser_mutex);
397 #endif /* USE_MULTITHREAD */
398 
399  return d;
400 }
const char * what(void) const
Definition: except.cc:54
MathParser & Parser
Definition: drive.h:182
Real GetLastStmt(Real d=0., Token t=ARGSEP)
Definition: mathp.cc:4402
double doublereal
Definition: colamd.c:52

Here is the call graph for this function:

doublereal DriveHandler::dGetSH ( integer  iNumber) const
inline

Definition at line 427 of file drive.h.

Referenced by SHDriveCaller::dGet().

428 {
429  return SH[iNumber]->dGetSH();
430 }
std::vector< MySH * > SH
Definition: drive.h:268
const doublereal DriveHandler::dGetSHVal0 ( integer  iNumber) const

Definition at line 336 of file drive.cc.

References SH.

Referenced by SHDriveCaller::SHDriveCaller().

337 {
338  return SH[iNumber]->dGetVal0();
339 }
std::vector< MySH * > SH
Definition: drive.h:268
doublereal DriveHandler::dGetTime ( void  ) const
inline
doublereal DriveHandler::dGetTimeStep ( void  ) const
inline

Definition at line 393 of file drive.h.

References ASSERT.

Referenced by DataManager::AssConstrJac(), DataManager::AssConstrRes(), ModuleNonsmoothNode::AssRes(), TimeStepDriveCaller::dGet(), ModuleNonsmoothNode::ModuleNonsmoothNode(), DataManager::PrintResidual(), and DataManager::PrintSolution().

394 {
395  ASSERT(pTimeStep != 0);
396  return pTimeStep->GetVal().GetReal();
397 }
Real GetReal(void) const
Definition: mathp.cc:1228
TypedValue GetVal(void) const
Definition: mathp.cc:1823
#define ASSERT(expression)
Definition: colamd.c:977
Var * pTimeStep
Definition: drive.h:186
integer DriveHandler::iClosestNextInit ( const DriveCaller pIncrement,
doublereal  dStartTime 
)
protected

Definition at line 294 of file drive.cc.

References ClosestNext, and SAFENEWWITHCONSTRUCTOR.

Referenced by ClosestNextDriveCaller::ClosestNextDriveCaller().

296 {
297  MyClosestNext* pmc = 0;
298  integer iNumber = ClosestNext.size();
300  MyClosestNext,
301  MyClosestNext((unsigned int)iNumber, this,
302  pIncrement, dStartTime));
303  ClosestNext.push_back(pmc);
304 
305  return iNumber;
306 }
std::vector< MyClosestNext * > ClosestNext
Definition: drive.h:267
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
Definition: mynewmem.h:698
doublereal dStartTime
long int integer
Definition: colamd.c:51
long int DriveHandler::iGetRand ( integer  iNumber) const
inline

Definition at line 408 of file drive.h.

Referenced by RandDriveCaller::dGet().

409 {
410  return Rand[iNumber]->iGetRand();
411 }
std::vector< MyRand * > Rand
Definition: drive.h:266
integer DriveHandler::iGetStep ( void  ) const
inline

Definition at line 400 of file drive.h.

References ASSERT.

Referenced by ModuleNonsmoothNode::AssRes(), DataManager::PrintResidual(), and DataManager::PrintSolution().

401 {
402  ASSERT(pStep != 0);
403  return pStep->GetVal().GetInt();
404 }
TypedValue GetVal(void) const
Definition: mathp.cc:1823
Var * pStep
Definition: drive.h:187
#define ASSERT(expression)
Definition: colamd.c:977
Int GetInt(void) const
Definition: mathp.cc:1209
integer DriveHandler::iMeterInit ( integer  iSteps)
protected

Definition at line 281 of file drive.cc.

References Meter, and SAFENEWWITHCONSTRUCTOR.

Referenced by MeterDriveCaller::MeterDriveCaller().

282 {
283  MyMeter* pmm = 0;
284  integer iNumber = Meter.size();
286  MyMeter,
287  MyMeter((unsigned int)iNumber, iSteps));
288  Meter.push_back(pmm);
289 
290  return iNumber;
291 }
std::vector< MyMeter * > Meter
Definition: drive.h:265
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
Definition: mynewmem.h:698
long int integer
Definition: colamd.c:51
integer DriveHandler::iRandInit ( integer  iSteps)
protected

Definition at line 268 of file drive.cc.

References Rand, and SAFENEWWITHCONSTRUCTOR.

Referenced by RandDriveCaller::RandDriveCaller().

269 {
270  MyRand* pmr = 0;
271  integer iNumber = Rand.size();
273  MyRand,
274  MyRand((unsigned int)iNumber, iSteps, rand()));
275  Rand.push_back(pmr);
276 
277  return iNumber;
278 }
std::vector< MyRand * > Rand
Definition: drive.h:266
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
Definition: mynewmem.h:698
long int integer
Definition: colamd.c:51
integer DriveHandler::iSHInit ( const DriveCaller pFunc,
const DriveCaller pTrigger,
const doublereal  dVal0 
)
protected

Definition at line 310 of file drive.cc.

References SAFENEWWITHCONSTRUCTOR, and SH.

Referenced by SHDriveCaller::SHDriveCaller().

312 {
313  MySH* pms = 0;
314  integer iNumber = SH.size();
316  MySH,
317  MySH((unsigned int)iNumber, pFunc, pTrigger, dVal0));
318  SH.push_back(pms);
319 
320  return iNumber;
321 }
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
Definition: mynewmem.h:698
std::vector< MySH * > SH
Definition: drive.h:268
long int integer
Definition: colamd.c:51
void DriveHandler::LinkToSolution ( const VectorHandler XCurr,
const VectorHandler XPrimeCurr 
)
protected

Definition at line 260 of file drive.cc.

References pXCurr, and pXPrimeCurr.

Referenced by DataManager::LinkToSolution().

262 {
263  pXCurr = const_cast<VectorHandler *>(&XCurr);
264  pXPrimeCurr = const_cast<VectorHandler *>(&XPrimeCurr);
265 }
VectorHandler * pXCurr
Definition: drive.h:192
VectorHandler * pXPrimeCurr
Definition: drive.h:193
const DriveCaller * DriveHandler::pGetSHFunc ( integer  iNumber) const

Definition at line 324 of file drive.cc.

References SH.

Referenced by SHDriveCaller::Restart().

325 {
326  return SH[iNumber]->pGetFunc();
327 }
std::vector< MySH * > SH
Definition: drive.h:268
const DriveCaller * DriveHandler::pGetSHTrigger ( integer  iNumber) const

Definition at line 330 of file drive.cc.

References SH.

Referenced by SHDriveCaller::Restart().

331 {
332  return SH[iNumber]->pGetTrigger();
333 }
std::vector< MySH * > SH
Definition: drive.h:268
void DriveHandler::PutSymbolTable ( Table T)

Definition at line 342 of file drive.cc.

References Parser, and MathParser::PutSymbolTable().

343 {
345 }
MathParser & Parser
Definition: drive.h:182
void PutSymbolTable(Table &T)
Definition: mathp.cc:1937

Here is the call graph for this function:

void DriveHandler::SetTime ( const doublereal dt,
const doublereal dts,
const integer s 
)
protected

Definition at line 208 of file drive.cc.

References ASSERT, ClosestNext, iCurrStep, Meter, pStep, pTime, pTimeStep, Rand, Var::SetVal(), and SH.

Referenced by DataManager::SetTime().

210 {
211  /* Setta la variabile Time nella tabella dei simboli */
212  ASSERT(pTime != 0);
213  pTime->SetVal(dt);
214 
215  /* Setta la variabile TimeStep nella tabella dei simboli */
216  if (dts >= 0.) {
217  ASSERT(pTimeStep != 0);
218  pTimeStep->SetVal(dts);
219  }
220 
221  /* Setta la variabile Step nella tabella dei simboli */
222  if (s >= 0) {
223  ASSERT(pStep != 0);
224  pStep->SetVal(s);
225 
226  /* in case of new step */
227  if (s != iCurrStep) {
228  ASSERT(iCurrStep + 1 == s);
229  iCurrStep = s;
230 
231  for (std::vector<MyMeter *>::iterator i = Meter.begin();
232  i != Meter.end(); ++i)
233  {
234  (*i)->Set();
235  }
236 
237  for (std::vector<MyRand *>::iterator i = Rand.begin();
238  i != Rand.end(); ++i)
239  {
240  (*i)->Set();
241  }
242 
243  for (std::vector<MyClosestNext*>::iterator i = ClosestNext.begin();
244  i != ClosestNext.end(); ++i)
245  {
246  (*i)->Set();
247  }
248 
249  for (std::vector<MySH *>::iterator i = SH.begin();
250  i != SH.end(); ++i)
251  {
252  (*i)->Set();
253  }
254  }
255  }
256 }
Var * pTime
Definition: drive.h:185
std::vector< MyMeter * > Meter
Definition: drive.h:265
std::vector< MyClosestNext * > ClosestNext
Definition: drive.h:267
std::vector< MyRand * > Rand
Definition: drive.h:266
Var * pStep
Definition: drive.h:187
#define ASSERT(expression)
Definition: colamd.c:977
std::vector< MySH * > SH
Definition: drive.h:268
integer iCurrStep
Definition: drive.h:195
Var * pTimeStep
Definition: drive.h:186
void SetVal(const bool &b)
Definition: mathp.cc:1829

Here is the call graph for this function:

void DriveHandler::SetVar ( const doublereal dVar)

Definition at line 349 of file drive.cc.

References ASSERT, pVar, and Var::SetVal().

Referenced by StringDriveCaller::dGet().

350 {
351  ASSERT(pVar != 0);
352  pVar->SetVal(dVar);
353 }
#define ASSERT(expression)
Definition: colamd.c:977
Var * pVar
Definition: drive.h:188
void SetVal(const bool &b)
Definition: mathp.cc:1829

Here is the call graph for this function:

Friends And Related Function Documentation

friend class ClosestNextDriveCaller
friend

Definition at line 175 of file drive.h.

friend class DataManager
friend

Definition at line 172 of file drive.h.

friend class MeterDriveCaller
friend

Definition at line 174 of file drive.h.

friend class RandDriveCaller
friend

Definition at line 173 of file drive.h.

friend class SHDriveCaller
friend

Definition at line 176 of file drive.h.

Member Data Documentation

std::vector<MyClosestNext *> DriveHandler::ClosestNext
private

Definition at line 267 of file drive.h.

Referenced by iClosestNextInit(), SetTime(), and ~DriveHandler().

doublereal DriveHandler::dDriveHandlerReturnValue = 0.
staticprivate

Definition at line 190 of file drive.h.

integer DriveHandler::iCurrStep
private

Definition at line 195 of file drive.h.

Referenced by SetTime().

std::vector<MyMeter *> DriveHandler::Meter
private

Definition at line 265 of file drive.h.

Referenced by iMeterInit(), SetTime(), and ~DriveHandler().

MathParser& DriveHandler::Parser
private

Definition at line 182 of file drive.h.

Referenced by dGet(), DriveHandler(), and PutSymbolTable().

Var* DriveHandler::pStep
private

Definition at line 187 of file drive.h.

Referenced by DriveHandler(), and SetTime().

Var* DriveHandler::pTime
private

Definition at line 185 of file drive.h.

Referenced by DriveHandler(), and SetTime().

Var* DriveHandler::pTimeStep
private

Definition at line 186 of file drive.h.

Referenced by DriveHandler(), and SetTime().

Var* DriveHandler::pVar
private

Definition at line 188 of file drive.h.

Referenced by DriveHandler(), and SetVar().

VectorHandler* DriveHandler::pXCurr
mutableprivate

Definition at line 192 of file drive.h.

Referenced by LinkToSolution().

VectorHandler* DriveHandler::pXPrimeCurr
mutableprivate

Definition at line 193 of file drive.h.

Referenced by LinkToSolution().

std::vector<MyRand *> DriveHandler::Rand
private

Definition at line 266 of file drive.h.

Referenced by iRandInit(), SetTime(), and ~DriveHandler().

std::vector<MySH *> DriveHandler::SH
private

Definition at line 268 of file drive.h.

Referenced by dGetSHVal0(), iSHInit(), pGetSHFunc(), pGetSHTrigger(), SetTime(), and ~DriveHandler().


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