File kernel/src/modelingTools/Interaction.hpp

Contents

File kernel/src/modelingTools/Interaction.hpp#

Go to the source code of this file

Interaction class and related typedef.

class Interaction : public std::enable_shared_from_this<Interaction>
#include <Interaction.hpp>

Description of a non-smooth interaction.

The object Interaction is used to defined a “link” between one or two DynamicalSystem, like unilateral constraints and some nonsmooth law (e.g. complementarity).

It holds two vectors of “local” variables, \( y \) and \( \lambda \) and their derivatives, which are related to the state variables and the inputs of the DynamicalSystem (x,R) through constraints defined in a Relation and completed with a NonSmoothLaw involving those variables.

Remarks:

void __initDataFirstOrder(VectorOfBlockVectors &DSlink, DynamicalSystem &ds1, DynamicalSystem &ds2)#

update DSlink property content with dynamical systems members, FirstOrder relations case.

Parameters:
void __initDSDataFirstOrder(DynamicalSystem &ds, VectorOfBlockVectors &DSlink)#

Initialize the link with the DynamicalSystem, FirstOrderDS variant.

Parameters:
void __initDataLagrangian(VectorOfBlockVectors &DSlink, DynamicalSystem &ds1, DynamicalSystem &ds2)#

update DSlink property content with dynamical systems members, Lagrangian relations case.

Parameters:
void __initDSDataLagrangian(DynamicalSystem &ds, VectorOfBlockVectors &DSlink)#

Initialize the link with the DynamicalSystem, LagrangianDS variant.

Parameters:
void __initDataNewtonEuler(VectorOfBlockVectors &DSlink, DynamicalSystem &ds1, DynamicalSystem &ds2)#

update DSlink property content with dynamical systems members, NewtonEuler relations case.

Parameters:
void __initDSDataNewtonEuler(DynamicalSystem &ds, VectorOfBlockVectors &DSlink)#

Initialize the link with the DynamicalSystem, NewtonEulerDS variant.

Parameters:

Public Functions

Interaction(SP::NonSmoothLaw NSL, SP::Relation rel)

Interaction constructor.

Parameters:
  • NSL – pointer object describing the nonsmooth law; the interaction size if infered from the size of this law.

  • rel – a pointer object describing the functions used to compute the constraints

inline ~Interaction()

destructor

void reset()

Update interactions attributes.

Must be called when levels have been modified.

void initializeLinkToDsVariables(DynamicalSystem &ds1, DynamicalSystem &ds2)

set the links to the DynamicalSystem(s) and allocate the required workspaces

Parameters:
  • interProp – the InteractionProperties of this Interaction

  • ds1 – first ds linked to this Interaction (i.e IG->vertex.source)

  • workV1 – work vectors of ds1

  • ds2 – second ds linked to this Interaction (i.e IG->vertex.target) ds1 == ds2 is allowed.

  • workV2 – work vectors of ds2 set the links between the interaction and the DynamicalSystem(s) members.

  • ds1 – first ds linked to this Interaction (i.e IG->vertex.source)

  • ds2 – second ds linked to this Interaction (i.e IG->vertex.target) ds1 == ds2 is allowed

void resetAllLambda()

set all lambda to zero

void resetLambda(unsigned int level)

set lambda to zero for a given level

Parameters:

level

void initializeMemory(unsigned int steps)

build memories vectors for y and \( \lambda \)

Parameters:
  • computeResiduY – true if interaction should compute extra residu value

  • steps – number of required memories (depends on the OSI)

inline size_t number() const
Returns:

the id of the interaction

inline void setLowerLevelForOutput(const unsigned int newVal)

Set the lower level for output y.

Parameters:

newVal – : an unsigned int

inline void setUpperLevelForOutput(const unsigned int newVal)

Set the upper level for output y.

Parameters:

newVal – : an unsigned int

inline unsigned int lowerLevelForOutput()

Get the lower level for output y.

Returns:

an unsigned int.

inline unsigned int upperLevelForOutput()

Get the upper level for output y.

Returns:

an unsigned int.

inline void setLowerLevelForInput(const unsigned int newVal)

Set the lower level for input Lambda.

Parameters:

newVal – : an unsigned int

inline void setUpperLevelForInput(const unsigned int newVal)

Set the upper level for input Lambda.

Parameters:

newVal – : an unsigned int.

inline unsigned int lowerLevelForInput()

Get the lower level for input Lambda.

Returns:

an unsigned int.

inline unsigned int upperLevelForInput()

Get the upper level for input Lambda.

Returns:

an unsigned int.

inline unsigned int dimension() const

returns dimension (i.e.

nslaw size == y and lambda size)

inline unsigned int getSizeOfDS() const
Returns:

the sum of DS sizes, for DS involved in interaction

inline void setHas2Bodies(bool val)

Set the number of dynamical systems concerned by this interaction.

Warning FP: this function is supposed to be called only during topology->link(inter, ds1, ds2) call.

Parameters:

val – : true if two ds, else false

inline bool has2Bodies() const

Check the number of dynamical systems concerned by this interaction.

Returns:

bool : true if two ds, else false

inline const SiconosVector getCopyOfy(const unsigned int i) const

Get y[i], derivative number i of output.

Parameters:

i – : the derivative number

Returns:

BlockVector

inline const VectorOfVectors y() const

get vector of output derivatives

Returns:

a VectorOfVectors

inline SP::SiconosVector y(const unsigned int i) const

get y[i], derivative number i of output

Parameters:

i – derivative number i of output

Returns:

pointer on a SiconosVector

void setY(const VectorOfVectors &v)

set the output vector y to newVector with copy of the y[i] (ie memory allocation)

Parameters:

v – VectorOfVectors

void setYPtr(const VectorOfVectors &v)

set the output vector y to newVector with direct pointer equality for the y[i]

Parameters:

v – VectorOfVectors

void setY(const unsigned int i, const SiconosVector &v)

set y[i] to newValue

Parameters:
  • i – derivative number i of output

  • v – a SiconosVector and an unsigned int

void setYPtr(const unsigned int i, SP::SiconosVector v)

set y[i] to pointer newPtr

Parameters:
  • i – derivative number i of output

  • v – a SP::SiconosVector and an unsigned int

inline SiconosMemory &yMemory(unsigned int level)

get all the values of the output y stored in memory

Parameters:

level

Returns:

a memory

inline const SiconosVector &y_k(const unsigned int i) const

get the last value of the output y stored in memory

Parameters:

level

Returns:

a SiconosVector reference

inline const VectorOfVectors getLambda() const

get vector of input derivatives

Returns:

a VectorOfVectors

inline const SiconosVector getLambda(const unsigned int i) const

get _lambda[i], derivative number i of input

Parameters:

i – derivative number i of output

Returns:

SiconosVector

inline SP::SiconosVector lambda(const unsigned int i) const

get _lambda[i], derivative number i of input

Parameters:

i – derivative number i of output

Returns:

pointer on a SiconosVector

inline SiconosMemory &lambdaMemory(unsigned int level)

get all the values of the multiplier lambda stored in memory

Parameters:

level

Returns:

a memory

inline const SiconosVector &lambda_k(const unsigned int i) const

get the last value of the multiplier lambda stored in memory

Parameters:

level

Returns:

a SiconosVector reference

void setLambda(const VectorOfVectors &v)

set the input vector _lambda to newVector

Parameters:

v – VectorOfVectors

void setLambdaPtr(const VectorOfVectors &v)

set vector _lambda to newVector with direct pointer equality for the _lambda[i]

Parameters:

v – VectorOfVectors

void setLambda(const unsigned int i, const SiconosVector &newValue)

set _lambda[i] to newValue

Parameters:
  • i – derivative number i of output

  • newValue – a SiconosVector

void setLambdaPtr(const unsigned int i, SP::SiconosVector newPtr)

set _lambda[i] to pointer newPtr

Parameters:
  • i – derivative number i of output

  • newPtr – a SP::SiconosVector

inline SP::Relation relation() const

get the Relation of this Interaction

Returns:

a pointer on this Relation

inline SP::NonSmoothLaw nonSmoothLaw() const

get the NonSmoothLaw of this Interaction

Returns:

a pointer on this NonSmoothLaw

inline VectorOfBlockVectors &linkToDSVariables()#
inline VectorOfVectors &relationVectors()#
inline VectorOfSMatrices &relationMatrices()#
inline void setDSSizes(unsigned int s1)

set interaction ‘ds-dimension’, i.e.

sum of all sizes of the dynamical systems linked by the current interaction. This must be done by topology during call to link(inter, ds, …).

Parameters:

s1 – int sum of ds sizes

void swapInMemory()

Must be call to fill the memory.

(after convergence of the Newton iterations)

void display(bool brief = true) const

print the data to the screen

void computeOutput(double time, unsigned int derivativeNumber = 0)

Computes output y, depends on the relation type.

Parameters:
  • time – current time

  • derivativeNumber – number of the derivative to compute, optional, default = 0

void computeInput(double time, unsigned int level = 0)

Compute input r of all Dynamical Systems involved in the present Interaction.

Parameters:
  • time – current time

  • level – order of _lambda used to compute input.

SP::SiconosMatrix getLeftInteractionBlock() const

gets the matrix used in interactionBlock computation, (left * W * right), depends on the relation type (ex, LinearTIR, left = C, right = B).

Returns:

InteractionBlock a pointer to SiconosMatrix (in-out parameter): the resulting interactionBlock matrix

SP::SiconosMatrix getLeftInteractionBlockForDS(unsigned int pos, unsigned int size, unsigned int sizeDS) const

gets the matrix used in interactionBlock computation

(left * W * right), depends on the relation type (ex, LinearTIR, left = C, right = B). We get only the part corresponding to one ds.

Parameters:
  • pos – int, relative position of the beginning of the required block in relation matrix.

  • size – int, size(0) of the block

  • sizeDS – int, size(1) of the block

Returns:

InteractionBlock a pointer to SiconosMatrix (in-out parameter): the resulting interactionBlock matrix

void getLeftInteractionBlockForDSProjectOnConstraints(unsigned int pos, SP::SiconosMatrix InteractionBlock) const

gets the matrix used in interactionBlock computation.

Used only for the formulation projecting on the constraints. We get only the part corresponding to ds.

Parameters:
  • pos – int, relative position of the beginning of the required block in relation matrix.

  • InteractionBlock – a pointer to SiconosMatrix (in-out parameter): the resulting interactionBlock matrix

SP::SiconosMatrix getRightInteractionBlockForDS(unsigned int pos, unsigned int sizeDS, unsigned size) const

gets the matrix used in interactionBlock computation

(left * W * rigth), depends on the relation type (ex, LinearTIR, left = C, right = B). We get only the part corresponding to ds.

Parameters:
  • pos – int, relative position of the beginning of the required block in relation matrix.

  • sizeDS – int, size(0) of the block

  • size – int, size(1) of the block

Returns:

InteractionBlock a pointer to SiconosMatrix (in-out parameter): the resulting interactionBlock matrix

void getExtraInteractionBlock(SP::SiconosMatrix InteractionBlock) const

gets extra interactionBlock corresponding to the present Interaction

Parameters:

InteractionBlock[inout] SP::SiconosMatrix

Public Static Functions

static inline size_t resetCount(size_t new_count = 0)

reset the global Interaction counter (for ids)

Returns:

the previous value of count

Protected Functions

inline Interaction()#

Private Functions

ACCEPT_SERIALIZATION(Interaction)#
Interaction(const Interaction &inter) = delete#
Interaction &operator=(const Interaction&) = delete#

Private Members

size_t _number#

Interaction id.

unsigned int _lowerLevelForOutput = 0#

Minimum required ‘level’ for output y y will be initialized from y[_lowerLevelForOutput] to y[_upperLevelForOutput].

unsigned int _upperLevelForOutput = 0#

Maximum required ‘level’ for output y y will be initialized from y[_lowerLevelForOutput] to y[_upperLevelForOutput].

unsigned int _lowerLevelForInput = 0#

Minimum required ‘level’ for input lambda lambda will be initialized from lambda[_lowerLevelForIntput] to lambda[_upperLevelForInput].

unsigned int _upperLevelForInput = 0#

Maximum required ‘level’ for input lambda lambda will be initialized from lambda[_lowerLevelForIntput] to lambda[_upperLevelForInput].

unsigned int _interactionSize = 0#

size of the interaction, ie size of y[i] and _lambda[i]

unsigned int _sizeOfDS = 0#

sum of all DS sizes, for DS involved in the interaction

bool _has2Bodies = false#

Bool to check the number of DS concerned by this interaction (1 or 2 indeed) True if 2 DS.

Note FP : usefull in NewtonEuler jacobians computation.

VectorOfVectors _y#

relation between constrained variables and states variables vector of output derivatives y[0] is y, y[1] is yDot and so on

VectorOfMemories _yMemory#

memory of previous coordinates of the system

VectorOfVectors _lambda#

result of the computeInput function

VectorOfMemories _lambdaMemory#

memory of previous coordinates of the system

SP::NonSmoothLaw _nslaw#

the Non-smooth Law of the interaction

SP::Relation _relation#

the type of Relation of the interaction

VectorOfBlockVectors _linkToDSVariables#

pointer links to DS variables needed for computation, mostly used in Relations (computeOutput and computeInput) and OneStepIntegrator classes.

VectorOfSMatrices _relationMatrices#
VectorOfVectors _relationVectors#

Private Static Attributes

static size_t __count#

Friends

friend struct Interaction::_setLevels