void visit(const NewtonImpactFrictionNSL& nslaw) { double e; e = nslaw.en(); // Only the normal part is multiplied by e SP::SiconosVector y_k_1 ; y_k_1 = _inter->yMemory(_osnsp->inputOutputLevel())->getSiconosVector(1); (*_inter->yForNSsolver())(0) += e * (*y_k_1)(0); }
void visit(const NewtonImpactNSL& nslaw) { double e; e = nslaw.e(); Index subCoord(4); subCoord[0] = 0; subCoord[1] = _inter->nonSmoothLaw()->size(); subCoord[2] = 0; subCoord[3] = subCoord[1]; subscal(e, *_inter->yOld(_osnsp->inputOutputLevel()), *(_inter->yForNSsolver()), subCoord, false); // q = q + e * q }
void visit(const NewtonImpactNSL& nslaw) { double e; e = nslaw.e(); Index subCoord(4); subCoord[0] = 0; subCoord[1] = _inter->nonSmoothLaw()->size(); subCoord[2] = 0; subCoord[3] = subCoord[1]; // Only the normal part is multiplied by e SP::SiconosVector y_k_1 ; y_k_1 = _inter->yMemory(_osnsp->inputOutputLevel())->getSiconosVector(1); // std::cout << "y_k_1 " << std::endl; // y_k_1->display(); subscal(e, *y_k_1, *(_inter->yForNSsolver()), subCoord, false); }
void LsodarOSI::computeFreeOutput(InteractionsGraph::VDescriptor& vertex_inter, OneStepNSProblem* osnsp) { SP::OneStepNSProblems allOSNS = simulationLink->oneStepNSProblems(); SP::InteractionsGraph indexSet = osnsp->simulation()->indexSet(osnsp->indexSetLevel()); SP::Interaction inter = indexSet->bundle(vertex_inter); VectorOfBlockVectors& DSlink = *indexSet->properties(vertex_inter).DSlink; // Get relation and non smooth law types RELATION::TYPES relationType = inter->relation()->getType(); RELATION::SUBTYPES relationSubType = inter->relation()->getSubType(); unsigned int sizeY = inter->nonSmoothLaw()->size(); unsigned int relativePosition = 0; SP::Interaction mainInteraction = inter; Index coord(8); coord[0] = relativePosition; coord[1] = relativePosition + sizeY; coord[2] = 0; coord[4] = 0; coord[6] = 0; coord[7] = sizeY; SP::SiconosMatrix C; // SP::SiconosMatrix D; // SP::SiconosMatrix F; SiconosVector& yForNSsolver = *inter->yForNSsolver(); SP::BlockVector Xfree; // All of these values should be stored in the node corrseponding to the Interactionwhen a MoreauJeanOSI scheme is used. /* V.A. 10/10/2010 * Following the type of OSNS we need to retrieve the velocity or the acceleration * This tricks is not very nice but for the moment the OSNS do not known if * it is in accelaration of not */ //SP::OneStepNSProblems allOSNS = _simulation->oneStepNSProblems(); if (((*allOSNS)[SICONOS_OSNSP_ED_SMOOTH_ACC]).get() == osnsp) { if (relationType == Lagrangian) { Xfree = DSlink[LagrangianR::xfree]; } // else if (relationType == NewtonEuler) // { // Xfree = inter->data(NewtonEulerR::free); // } assert(Xfree); // std::cout << "Computeqblock Xfree (Gamma)========" << std::endl; // Xfree->display(); } else if (((*allOSNS)[SICONOS_OSNSP_ED_IMPACT]).get() == osnsp) { Xfree = DSlink[LagrangianR::q1]; // std::cout << "Computeqblock Xfree (Velocity)========" << std::endl; // Xfree->display(); } else RuntimeException::selfThrow(" computeqBlock for Event Event-driven is wrong "); if (relationType == Lagrangian) { C = mainInteraction->relation()->C(); if (C) { assert(Xfree); coord[3] = C->size(1); coord[5] = C->size(1); subprod(*C, *Xfree, yForNSsolver, coord, true); } SP::SiconosMatrix ID(new SimpleMatrix(sizeY, sizeY)); ID->eye(); Index xcoord(8); xcoord[0] = 0; xcoord[1] = sizeY; xcoord[2] = 0; xcoord[3] = sizeY; xcoord[4] = 0; xcoord[5] = sizeY; xcoord[6] = 0; xcoord[7] = sizeY; // For the relation of type LagrangianRheonomousR if (relationSubType == RheonomousR) { if (((*allOSNS)[SICONOS_OSNSP_ED_SMOOTH_ACC]).get() == osnsp) { RuntimeException::selfThrow("LsodarOSI::computeFreeOutput not yet implemented for LCP at acceleration level with LagrangianRheonomousR"); } else if (((*allOSNS)[SICONOS_OSNSP_TS_VELOCITY]).get() == osnsp) { SiconosVector q = *DSlink[LagrangianR::q0]; SiconosVector z = *DSlink[LagrangianR::z]; std11::static_pointer_cast<LagrangianRheonomousR>(inter->relation())->computehDot(simulation()->getTkp1(), q, z); *DSlink[LagrangianR::z] = z; subprod(*ID, *(std11::static_pointer_cast<LagrangianRheonomousR>(inter->relation())->hDot()), yForNSsolver, xcoord, false); // y += hDot } else RuntimeException::selfThrow("LsodarOSI::computeFreeOutput not implemented for SICONOS_OSNSP "); } // For the relation of type LagrangianScleronomousR if (relationSubType == ScleronomousR) { if (((*allOSNS)[SICONOS_OSNSP_ED_SMOOTH_ACC]).get() == osnsp) { std11::static_pointer_cast<LagrangianScleronomousR>(inter->relation())->computedotjacqhXqdot(simulation()->getTkp1(), *inter, DSlink); subprod(*ID, *(std11::static_pointer_cast<LagrangianScleronomousR>(inter->relation())->dotjacqhXqdot()), yForNSsolver, xcoord, false); // y += NonLinearPart } } } else RuntimeException::selfThrow("LsodarOSI::computeFreeOutput not yet implemented for Relation of type " + relationType); if (((*allOSNS)[SICONOS_OSNSP_ED_IMPACT]).get() == osnsp) { if (inter->relation()->getType() == Lagrangian || inter->relation()->getType() == NewtonEuler) { SP::SiconosVisitor nslEffectOnFreeOutput(new _NSLEffectOnFreeOutput(osnsp, inter)); inter->nonSmoothLaw()->accept(*nslEffectOnFreeOutput); } } }
void SchatzmanPaoliOSI::computeFreeOutput(InteractionsGraph::VDescriptor& vertex_inter, OneStepNSProblem* osnsp) { /** \warning: ensures that it can also work with two different osi for two different ds ? */ SP::InteractionsGraph indexSet = osnsp->simulation()->indexSet(osnsp->indexSetLevel()); SP::Interaction inter = indexSet->bundle(vertex_inter); SP::OneStepNSProblems allOSNS = simulationLink->oneStepNSProblems(); VectorOfBlockVectors& DSlink = *indexSet->properties(vertex_inter).DSlink; // Get relation and non smooth law types RELATION::TYPES relationType = inter->relation()->getType(); RELATION::SUBTYPES relationSubType = inter->relation()->getSubType(); unsigned int sizeY = inter->nonSmoothLaw()->size(); unsigned int relativePosition = 0; Index coord(8); coord[0] = relativePosition; coord[1] = relativePosition + sizeY; coord[2] = 0; coord[4] = 0; coord[6] = 0; coord[7] = sizeY; SP::SiconosMatrix C; SP::SiconosMatrix D; SP::SiconosMatrix F; SP::BlockVector deltax; SiconosVector& yForNSsolver = *inter->yForNSsolver(); SP::SiconosVector e; SP::BlockVector Xfree; if (relationType == NewtonEuler) { Xfree = DSlink[NewtonEulerR::xfree]; } else if (relationType == Lagrangian) { Xfree = DSlink[LagrangianR::xfree]; } assert(Xfree); assert(Xfree); SP::Interaction mainInteraction = inter; assert(mainInteraction); assert(mainInteraction->relation()); if (relationSubType == LinearTIR) { if (((*allOSNS)[SICONOS_OSNSP_TS_VELOCITY]).get() != osnsp) RuntimeException::selfThrow("SchatzmanPaoliOSI::computeFreeOutput not yet implemented for SICONOS_OSNSP "); C = mainInteraction->relation()->C(); if (C) { assert(Xfree); coord[3] = C->size(1); coord[5] = C->size(1); // creates a POINTER link between workX[ds] (xfree) and the // corresponding interactionBlock in each Interactionfor each ds of the // current Interaction. if (_useGammaForRelation) { assert(deltax); subprod(*C, *deltax, yForNSsolver, coord, true); } else { subprod(*C, *Xfree, yForNSsolver, coord, true); // subprod(*C,*(*(mainInteraction->dynamicalSystemsBegin()))->workspace(DynamicalSystem::free),*Yp,coord,true); // if (mainInteraction->dynamicalSystems()->size() == 2) // { // subprod(*C,*(*++(mainInteraction->dynamicalSystemsBegin()))->workspace(DynamicalSystem::free),*Yp,coord,false); // } } } SP::LagrangianLinearTIR ltir = std11::static_pointer_cast<LagrangianLinearTIR> (mainInteraction->relation()); e = ltir->e(); if (e) { yForNSsolver += *e; } } else RuntimeException::selfThrow("SchatzmanPaoliOSI::ComputeFreeOutput not yet implemented for relation of Type : " + relationType); if (inter->relation()->getSubType() == LinearTIR) { SP::SiconosVisitor nslEffectOnFreeOutput(new _NSLEffectOnFreeOutput(osnsp, inter)); inter->nonSmoothLaw()->accept(*nslEffectOnFreeOutput); } }