Siconos call

The goal of this document is to give a global view of the timestepping implementation in SICONOS.

# Global Stack

- Model::initialize
  - Topology::initialize
  calculate relative degrees and number of index sets
  - Simulation::initalize
  - EventManager::initialize
  e.g. save data
  - DynamicSystem::initialize
  - OneStepIntegrator::initialize
  - TimeStepping::initLevelMax
  define number of index sets by Simulation strategy and relative degree of UnitaryRelation
  - Topology::indexSetsResize
  resizes vector of UnitaryRelationsGraph to include graphs of active UnitaryRelation in specific updateIndexSet method
  - Timestepping::initOSNS
  initialize position depending index sets and OSNS
- TimeStepping::computeOneStep -> TimeStepping::advanceToEvent -> TimeStepping::NewtonSolve
- TimeStepping::nextStep

## TimeStepping::newtonSolve

- TimeStepping::computeInitialResidu
- CASE : LINEAR

- TimeStepping::prepareNewtonIteration
- TimeStepping::computeFreeState
- TimeStepping::computeOneStepNSProblem(SICONOS_OSNSP_TimeStepping_VELOCITY)
- TimeStepping::(Default)CheckSolverOutput
- TimeStepping::update
- TimeStepping::saveYandLambdaInMemory

- CASE : NONLINEAR -> LOOP WITH INDIVIDUAL STEP :

- TimeStepping::prepareNewtonIteration
- TimeStepping::computeFreeState
- TimeStepping::computeOneStepNSProblem(SICONOS_OSNSP_TimeStepping_VELOCITY)
- TimeStepping::(Default)CheckSolverOutput
- TimeStepping::update
- TimeStepping:newtonCheckConvergence
- TimeStepping::saveYandLambdaInMemory

### TimeStepping::computeInitialResidu

- Relation::computeh (virtual) -> Relation::computeOutput
compute local gaps for all Relations
- Relation::computeg (virtual) -> Relation::computeInput
compute local forces for all Relations
- DynamicalSystem::updatePlugins
update plugin functions for the DynamicalSystem graph
- OneStepIntegrator::computeResidu (virtual)
compute the global free residu DS->residuFree and the global residu DS->workFree for all OneStepIntegrators to cope with nonlinearities in velocity equation
- Relation::computeResiduY (virtual)
compute the local free residu for output Relations (gaps) to cope their nonlinearities if switched on

### TimeStepping::prepareNewtonIteration

- Moreau::computeW
compute the iteration matrix for OneStepIntegrators
- Relation::computeJach (virtual)
compute output Jacobians for all Relations
- Relation::computeJacg (virtual)
compute input Jacobians for all Relations
- DynamicalSystem::preparStep
prepare the DynamicalSystem graph : only to prepare for external software
- Relation::preparNewtonIteration
prepare all Relations : only to prepare for external software
- OneStepNonsmoothProblem::setHasBeUpdated
inform all OneStepNonsmoothProblems about changed topology due to new index sets after Timestepping::nextStep

### TimeStepping::computeFreeState

-> OneStepIntegrator::computeFreeState (virtual)
compute the global free state for all OneStepIntegrators in connected DynamicalSystems in DS->workFree

### Simulation::computeOneStepNSProblem

-> OneStepNonsmoothProblem::compute (virtual)
solve all OneStepNonsmoothProblems

- OneStepNonsmoothProblem::preCompute (virtual) -
calculate input for numerical solution method from local values (cf. Section 'Building of Numerics Matrix')
- Solve OneStepNonsmoothProblem
interface to numerical solution method
- OneStepNonsmoothProblem::postCompute (virtual)
restore local gap and force from numerical solution method output

### TimeStepping::(Default)CheckSolverOutput

reaction on numerical solution method flags

### TimeStepping::update

- Simulation::updateInput

- OneStepIntegrator::resetNonsmoothPart (virtual)
set global force to zero for all Interactions
- Interaction::computeInput -> Relation::computeInput (virtual)
compute global force from local forces for all Interactions

- OneStepIntegrator::updateState (virtual)
compute new state for all OneStepIntegrators
- TimeStepping::updateWorldFromDS
update connected software, e.g. CAD, with new state
- Simulation::updateOutput -> Interaction::computeOutput -> Relation::computeOutput (virtual)
compute local gaps from global values for all Interactions

### TimeStepping::newtonCheckConvergence

- OneStepIntegrator::computeResidu (virtual)
compute the global free residu DS->residuFree and the global residu DS->workFree for all OneStepIntegrators to cope with nonlinearities in velocity equation
- Relation::computeResiduY (virtual)
compute the local free residu for output Relations (gaps) to cope their nonlinearities if switched on
- Relation::computeResiduR (virtual)
compute the local free residu for input Relations (forces) to cope their nonlinearities if switched on

### TimeStepping::saveYandLambdaInMemory

-> Interaction::swapInMemory (virtual)
-> Interaction::swapTimeStepInMemory (virtual)
save local gap and force for having initial guess and possibility to calculate Jacobians in next Newton step

### Building of Numerics Matrix

-> OneStepNonsmoothProblem::preCompute
implemented only for LinearOSNS involving LinearOSNS::_M OSNSMatrix, LinearOSNS::_q SiconosVector

- OneStepNonsmoothProblem::updateUnitaryBlocks

- OneStepNonsmoothProblem::computeDiagUnitaryBlocks
- OneStepNonsmoothProblem::computeUnitaryBlocks

- OSNSMatrix_M::fill(indexset)
- _keepLambdaAndYState if switched on
- LinearOSNS::computeq -> LinearOSNS::computeqBlock -> OneStepIntegrator::computeFreeOutput
not implemented for Moreau2

## TimeStepping::nextStep

-> Simulation::processEvent -> EventsManager::processEvents -> EventsManager::OptimizedProcessEvent

- TimeDiscretizationEvent::process -> Simulation::saveInMemory

- OneStepIntegrator::saveInMemory -> DynamicalSystem::swapInMemory (virtual)
save state and set global force to zero WHY
- OneStepNonsmoothProblem::saveInMemory -> Interaction::swapInMemory (virtual)
- OneStepNonsmoothProblem::saveTimeStepInMemory -> Interaction::swapTimeStepInMemory (virtual)
save local gap and force

- Simulation::updateIndexSets
only position depending for TimeStepping and Newton loop does not depend on position

- TimeStepping::updateIndexSet
- Topology::indexSet::update_vertices_indices
- Topology::indexSet::update_edges_indices

- TimeDiscretization::increment
- EventManager::update

## TimeSteppingProjectOnConstraints::newtonSolve

projection on position only for NewtonEulerDS with kinetic metric

- TimeSteppingProjectOnConstraints::newtonSolve

- TimeStepping::computeOneStepNSProblem
- NewtonEulerDS::normalizeq
- NewtonEulerDS::updateT
- TimeStepping::updateWorldFromDS
- Relation::computeh
- Relation::computeJach