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

#include <stepsol.h>

Inheritance diagram for DerivativeSolver:
Collaboration diagram for DerivativeSolver:

Public Member Functions

 DerivativeSolver (const doublereal Tl, const doublereal dSolTl, const doublereal dC, const integer iMaxIt, const bool bmod_res_test, const integer iMaxIterCoef, const doublereal dFactorCoef)
 
 ~DerivativeSolver (void)
 
doublereal Advance (Solver *pS, const doublereal TStep, const doublereal, const StepChange, std::deque< MyVectorHandler * > &qX, std::deque< MyVectorHandler * > &qXPrime, MyVectorHandler *const pX, MyVectorHandler *const pXPrime, integer &EffIter, doublereal &Err, doublereal &SolErr)
 
void Residual (VectorHandler *pRes) const
 
void Jacobian (MatrixHandler *pJac) const
 
void Update (const VectorHandler *pSol) const
 
virtual doublereal TestScale (const NonlinearSolverTest *pTest, doublereal &dAlgebraicEqu) const
 
- Public Member Functions inherited from ImplicitStepIntegrator
 ImplicitStepIntegrator (const integer MaxIt, const doublereal dT, const doublereal dSolutionTol, const integer stp, const integer sts, const bool bmod_res_test)
 
virtual ~ImplicitStepIntegrator (void)
 
virtual void EvalProd (doublereal Tau, const VectorHandler &f0, const VectorHandler &w, VectorHandler &z) const
 
- Public Member Functions inherited from StepIntegrator
 StepIntegrator (const integer MaxIt, const doublereal dT, const doublereal dSolutionTol, const integer stp, const integer sts)
 
virtual ~StepIntegrator (void)
 
void SetDataManager (DataManager *pDatMan)
 
virtual integer GetIntegratorNumPreviousStates (void) const
 
virtual integer GetIntegratorNumUnknownStates (void) const
 
virtual integer GetIntegratorMaxIters (void) const
 
virtual doublereal GetIntegratorDTol (void) const
 
virtual doublereal GetIntegratorDSolTol (void) const
 
virtual void OutputTypes (const bool fpred)
 
virtual void SetDriveHandler (const DriveHandler *pDH)
 
- Public Member Functions inherited from NonlinearProblem
virtual ~NonlinearProblem (void)
 

Protected Member Functions

void UpdateDof (const int DCount, const DofOrder::Order Order, const VectorHandler *const pSol=0) const
 
- Protected Member Functions inherited from StepIntegrator
template<class T >
void UpdateLoop (const T *const t, void(T::*pUpd)(const int DCount, const DofOrder::Order Order, const VectorHandler *const pSol) const, const VectorHandler *const pSol=0) const
 

Private Attributes

doublereal dCoef
 
const int iMaxIterCoef
 
const doublereal dFactorCoef
 

Additional Inherited Members

- Public Types inherited from StepIntegrator
enum  { DIFFERENTIAL = 0, ALGEBRAIC = 1 }
 
enum  StepChange { NEWSTEP, REPEATSTEP }
 
- Protected Attributes inherited from ImplicitStepIntegrator
VectorHandlerpXCurr
 
VectorHandlerpXPrimeCurr
 
bool bModResTest
 
- Protected Attributes inherited from StepIntegrator
DataManagerpDM
 
const DataManager::DofVecTypepDofs
 
bool outputPred
 
integer MaxIters
 
doublereal dTol
 
doublereal dSolTol
 
integer steps
 
integer unkstates
 

Detailed Description

Definition at line 184 of file stepsol.h.

Constructor & Destructor Documentation

DerivativeSolver::DerivativeSolver ( const doublereal  Tl,
const doublereal  dSolTl,
const doublereal  dC,
const integer  iMaxIt,
const bool  bmod_res_test,
const integer  iMaxIterCoef,
const doublereal  dFactorCoef 
)

Definition at line 249 of file stepsol.cc.

References NO_OP.

256 : ImplicitStepIntegrator(iMaxIt, Tl, dSolTl, 1, 1, bmod_res_test),
257 dCoef(dC),
260 {
261  NO_OP;
262 }
const doublereal dFactorCoef
Definition: stepsol.h:189
doublereal dCoef
Definition: stepsol.h:187
ImplicitStepIntegrator(const integer MaxIt, const doublereal dT, const doublereal dSolutionTol, const integer stp, const integer sts, const bool bmod_res_test)
Definition: stepsol.cc:124
#define NO_OP
Definition: myassert.h:74
const int iMaxIterCoef
Definition: stepsol.h:188
DerivativeSolver::~DerivativeSolver ( void  )

Definition at line 264 of file stepsol.cc.

References NO_OP.

265 {
266  NO_OP;
267 }
#define NO_OP
Definition: myassert.h:74

Member Function Documentation

doublereal DerivativeSolver::Advance ( Solver pS,
const doublereal  TStep,
const doublereal  ,
const StepChange  ,
std::deque< MyVectorHandler * > &  qX,
std::deque< MyVectorHandler * > &  qXPrime,
MyVectorHandler *const  pX,
MyVectorHandler *const  pXPrime,
integer EffIter,
doublereal Err,
doublereal SolErr 
)
virtual

Implements StepIntegrator.

Definition at line 270 of file stepsol.cc.

References DataManager::AfterConvergence(), DataManager::AfterPredict(), ASSERT, dCoef, dFactorCoef, DataManager::dGetTime(), StepIntegrator::dSolTol, StepIntegrator::dTol, iMaxIterCoef, DataManager::LinkToSolution(), StepIntegrator::MaxIters, StepIntegrator::pDM, Solver::pGetNonlinearSolver(), ImplicitStepIntegrator::pXCurr, ImplicitStepIntegrator::pXPrimeCurr, and NonlinearSolver::Solve().

281 {
282  /* no predizione */
283  ASSERT(pDM != NULL);
284 
285  /* Make a deep copy of the current state in order to restore it later */
286  MyVectorHandler X(*pX);
287  MyVectorHandler XPrime(*pXPrime);
288 
289  pXCurr = &X;
290  pXPrimeCurr = &XPrime;
291 
292  try {
294 
295  bool bConverged = false;
296  const doublereal dInitialCoef = dCoef;
297  doublereal dCoefBest = dCoef;
298  doublereal dResErrMin = std::numeric_limits<doublereal>::max();
299  doublereal dSolErrMin = dResErrMin;
300  const integer iMaxPowerCoef = iMaxIterCoef > 0 ? 2 * iMaxIterCoef + 1 : 0;
301 
302  for (int i = 0; i <= iMaxPowerCoef; ++i) {
303  const bool bLastChance = i == iMaxPowerCoef;
304 
305  try {
306  Err = 0.;
307  pS->pGetNonlinearSolver()->Solve(this,
308  pS,
309  MaxIters,
310  dTol,
311  EffIter,
312  Err,
313  dSolTol,
314  SolErr);
315  bConverged = true;
317  if (bLastChance) {
318  throw;
319  }
321  if (bLastChance) {
322  throw;
323  }
324  } catch (LinearSolver::ErrFactor) {
325  if (bLastChance) {
326  throw;
327  }
328  }
329 
330  if (bConverged) {
331  break;
332  }
333 
334  /* Save smallest residual error and corresponding derivative coefficient. */
335  if (Err < dResErrMin) {
336  dResErrMin = Err;
337  dSolErrMin = SolErr;
338  dCoefBest = dCoef;
339  }
340 
341  /* Restore the state after assembly. */
342  *pXCurr = *pX;
343  *pXPrimeCurr = *pXPrime;
344 
346 
347  /* Reset reference rotation parameters and angular velocities */
348  pDM->AfterPredict();
349 
350  /* Try different values for derivatives coefficient. */
351  if (i < iMaxIterCoef) {
352  dCoef *= dFactorCoef;
353  } else if (i == iMaxIterCoef) {
354  dCoef = dInitialCoef / dFactorCoef;
355  } else if (i < 2 * iMaxIterCoef) {
356  dCoef /= dFactorCoef;
357  } else {
358  /* Convergence could not be achieved with any coefficient.
359  * Choose those coefficient with smallest residual error
360  * and increase the tolerance, so it will converge in any case. */
361  const doublereal dSafetyFactor = 1.01;
362 
363  dCoef = dCoefBest;
364  dTol = dSafetyFactor * dResErrMin;
365  dSolTol = dSafetyFactor * dSolErrMin;
366  }
367 
368  silent_cout("Derivatives(" << i + 1 << '/' << 2 * iMaxIterCoef + 1
369  << ") t=" << pDM->dGetTime()
370  << " coef=" << dCoef / TStep
371  << " tol=" << dTol
372  << std::endl);
373  }
374  /* if it gets here, it surely converged */
376 
377  *pX = *pXCurr;
378  *pXPrime = *pXPrimeCurr;
379 
380  pXCurr = 0;
381  pXPrimeCurr = 0;
382  } catch (...) {
383  /* Clean up pointers to local variables */
384  pXCurr = 0;
385  pXPrimeCurr = 0;
386  throw;
387  }
388 
389  return Err;
390 }
const doublereal dFactorCoef
Definition: stepsol.h:189
doublereal dCoef
Definition: stepsol.h:187
doublereal dGetTime(void) const
Definition: dataman2.cc:165
doublereal dSolTol
Definition: stepsol.h:99
virtual void AfterConvergence(void) const
Definition: dataman2.cc:2527
virtual void AfterPredict(void) const
Definition: dataman2.cc:2472
void LinkToSolution(VectorHandler &XCurr, VectorHandler &XPrimeCurr)
Definition: dataman2.cc:172
DataManager * pDM
Definition: stepsol.h:93
virtual NonlinearSolver * pGetNonlinearSolver(void) const
Definition: solver.h:404
VectorHandler * pXPrimeCurr
Definition: stepsol.h:164
VectorHandler * pXCurr
Definition: stepsol.h:163
integer MaxIters
Definition: stepsol.h:98
#define ASSERT(expression)
Definition: colamd.c:977
const int iMaxIterCoef
Definition: stepsol.h:188
virtual void Solve(const NonlinearProblem *pNLP, Solver *pS, const integer iMaxIter, const doublereal &Tol, integer &iIterCnt, doublereal &dErr, const doublereal &SolTol, doublereal &dSolErr)=0
double doublereal
Definition: colamd.c:52
long int integer
Definition: colamd.c:51
doublereal dTol
Definition: stepsol.h:99

Here is the call graph for this function:

void DerivativeSolver::Jacobian ( MatrixHandler pJac) const
virtual

Implements NonlinearProblem.

Definition at line 400 of file stepsol.cc.

References ASSERT, DataManager::AssJac(), dCoef, and StepIntegrator::pDM.

401 {
402  ASSERT(pDM != NULL);
403  pDM->AssJac(*pJac, dCoef);
404 }
doublereal dCoef
Definition: stepsol.h:187
DataManager * pDM
Definition: stepsol.h:93
virtual void AssJac(MatrixHandler &JacHdl, doublereal dCoef)
Definition: elman.cc:392
#define ASSERT(expression)
Definition: colamd.c:977

Here is the call graph for this function:

void DerivativeSolver::Residual ( VectorHandler pRes) const
virtual

Implements NonlinearProblem.

Definition at line 393 of file stepsol.cc.

References ASSERT, DataManager::AssRes(), dCoef, and StepIntegrator::pDM.

394 {
395  ASSERT(pDM != NULL);
396  pDM->AssRes(*pRes, dCoef);
397 }
doublereal dCoef
Definition: stepsol.h:187
virtual void AssRes(VectorHandler &ResHdl, doublereal dCoef)
Definition: elman.cc:498
DataManager * pDM
Definition: stepsol.h:93
#define ASSERT(expression)
Definition: colamd.c:977

Here is the call graph for this function:

doublereal DerivativeSolver::TestScale ( const NonlinearSolverTest pTest,
doublereal dAlgebraicEqu 
) const
virtual

Reimplemented from ImplicitStepIntegrator.

Definition at line 439 of file stepsol.cc.

References dCoef.

440 {
441  dAlgebraicEqu = dCoef;
442  return 1.;
443 }
doublereal dCoef
Definition: stepsol.h:187
void DerivativeSolver::Update ( const VectorHandler pSol) const
virtual

Implements NonlinearProblem.

Definition at line 428 of file stepsol.cc.

References ASSERT, DEBUGCOUTFNAME, DataManager::DerivativesUpdate(), StepIntegrator::pDM, UpdateDof(), and StepIntegrator::UpdateLoop().

429 {
430  DEBUGCOUTFNAME("DerivativeSolver::Update");
431  ASSERT(pDM != NULL);
432 
435 }
void UpdateDof(const int DCount, const DofOrder::Order Order, const VectorHandler *const pSol=0) const
Definition: stepsol.cc:407
#define DEBUGCOUTFNAME(fname)
Definition: myassert.h:256
virtual void DerivativesUpdate(void) const
Definition: dataman2.cc:2587
DataManager * pDM
Definition: stepsol.h:93
#define ASSERT(expression)
Definition: colamd.c:977
void UpdateLoop(const T *const t, void(T::*pUpd)(const int DCount, const DofOrder::Order Order, const VectorHandler *const pSol) const, const VectorHandler *const pSol=0) const

Here is the call graph for this function:

void DerivativeSolver::UpdateDof ( const int  DCount,
const DofOrder::Order  Order,
const VectorHandler *const  pSol = 0 
) const
protected

Definition at line 407 of file stepsol.cc.

References dCoef, DofOrder::DIFFERENTIAL, VectorHandler::IncCoef(), ImplicitStepIntegrator::pXCurr, and ImplicitStepIntegrator::pXPrimeCurr.

Referenced by Update().

410 {
411  doublereal d = pSol->operator()(DCount);
412  if (Order == DofOrder::DIFFERENTIAL) {
413  pXPrimeCurr->IncCoef(DCount, d);
414 
415 #if 1 /* FIXME: update state derivatives only */
416  pXCurr->IncCoef(DCount, dCoef*d);
417 #endif
418 
419  } else {
420  pXCurr->IncCoef(DCount, d);
421 #if 1 /* FIXME: update state only */
422  pXPrimeCurr->IncCoef(DCount, dCoef*d);
423 #endif
424  }
425 }
doublereal dCoef
Definition: stepsol.h:187
virtual void IncCoef(integer iRow, const doublereal &dCoef)=0
VectorHandler * pXPrimeCurr
Definition: stepsol.h:164
VectorHandler * pXCurr
Definition: stepsol.h:163
Order
Definition: shapefnc.h:42
double doublereal
Definition: colamd.c:52

Here is the call graph for this function:

Member Data Documentation

doublereal DerivativeSolver::dCoef
private

Definition at line 187 of file stepsol.h.

Referenced by Advance(), Jacobian(), Residual(), TestScale(), and UpdateDof().

const doublereal DerivativeSolver::dFactorCoef
private

Definition at line 189 of file stepsol.h.

Referenced by Advance().

const int DerivativeSolver::iMaxIterCoef
private

Definition at line 188 of file stepsol.h.

Referenced by Advance().


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