void EventDriven::updateIndexSetsWithDoubleCondition() { assert(_nsds); assert(_nsds->topology()); // for all Interactions in indexSet[i-1], compute y[i-1] and // update the indexSet[i] SP::Topology topo = _nsds->topology(); SP::InteractionsGraph indexSet2 = topo->indexSet(2); InteractionsGraph::VIterator ui, uiend, vnext; std11::tie(ui, uiend) = indexSet2->vertices(); for (vnext = ui; ui != uiend; ui = vnext) { ++vnext; SP::Interaction inter = indexSet2->bundle(*ui); double gamma = inter->getYRef(2); double F = inter->getLambdaRef(2); if (fabs(F) < _TOL_ED) indexSet2->remove_vertex(inter); else if ((gamma < -_TOL_ED) || (F < -_TOL_ED)) RuntimeException::selfThrow("EventDriven::updateIndexSetsWithDoubleCondition(), output[2] and lambda[2] for Interactionof indexSet[2] must be higher or equal to zero."); else if (((fabs(gamma) > _TOL_ED) && (fabs(F) > _TOL_ED))) RuntimeException::selfThrow("EventDriven::updateIndexSetsWithDoubleCondition(), something is wrong for the LCP resolution."); } }
void EventDriven::updateIndexSet(unsigned int i) { assert(_nsds); assert(_nsds->topology()); SP::Topology topo = _nsds->topology(); assert(i < topo->indexSetsSize() && "EventDriven::updateIndexSet(i), indexSets[i] does not exist."); // IndexSets[0] must not be updated in simulation, since it belongs to Topology. assert(i > 0 && "EventDriven::updateIndexSet(i=0), indexSets[0] cannot be updated."); // For all Interactions in indexSet[i-1], compute y[i-1] and // update the indexSet[i]. SP::InteractionsGraph indexSet1 = topo->indexSet(1); SP::InteractionsGraph indexSet2 = topo->indexSet(2); assert(_indexSet0); assert(indexSet1); assert(indexSet2); // DEBUG_PRINTF("update indexSets start : indexSet0 size : %ld\n", indexSet0->size()); // DEBUG_PRINTF("update IndexSets start : indexSet1 size : %ld\n", indexSet1->size()); // DEBUG_PRINTF("update IndexSets start : indexSet2 size : %ld\n", indexSet2->size()); InteractionsGraph::VIterator uibegin, uipend, uip; std11::tie(uibegin, uipend) = _indexSet0->vertices(); // loop over all vertices of the indexSet[i-1] for (uip = uibegin; uip != uipend; ++uip) { SP::Interaction inter = _indexSet0->bundle(*uip); if (i == 1) // IndexSet[1] { // if indexSet[1]=>getYRef(0): output y // if indexSet[2]=>getYRef(1): output ydot double y = inter->getYRef(0); // output to define the IndexSets at this Interaction if (y < -_TOL_ED) // y[0] < 0 { inter->display(); cout << "y = " << y << " < -_TOL_ED = " << -_TOL_ED <<endl; RuntimeException::selfThrow("EventDriven::updateIndexSet, output of level 0 must be positive!!! "); } // 1 - If the Interaction is not yet in the set if (!indexSet1->is_vertex(inter)) // Interaction is not yet in the indexSet[i] { if (fabs(y) <= _TOL_ED) { // vertex and edges insertions indexSet1->copy_vertex(inter, *_indexSet0); } } else // if the Interaction was already in the set { if (fabs(y) > _TOL_ED) { indexSet1->remove_vertex(inter); // remove the Interaction from IndexSet[1] inter->lambda(1)->zero(); // reset the lambda[1] to zero } } } else if (i == 2) // IndexSet[2] { if (indexSet1->is_vertex(inter)) // Interaction is in the indexSet[1] { double y = inter->getYRef(1); // output of level 1 at this Interaction if (!indexSet2->is_vertex(inter)) // Interaction is not yet in the indexSet[2] { if (fabs(y) <= _TOL_ED) { // vertex and edges insertions indexSet2->copy_vertex(inter, *_indexSet0); } } else // if the Interaction was already in the set { if (fabs(y) > _TOL_ED) { indexSet2->remove_vertex(inter); // remove the Interaction from IndexSet[1] inter->lambda(2)->zero(); // reset the lambda[i] to zero } } } else // Interaction is not in the indexSet[1] { if (indexSet2->is_vertex(inter)) // Interaction is in the indexSet[2] { indexSet2->remove_vertex(inter); // remove the Interaction from IndexSet[2] inter->lambda(2)->zero(); // reset the lambda[i] to zero } } } else { RuntimeException::selfThrow("EventDriven::updateIndexSet, IndexSet[i > 2] doesn't exist"); } } // DEBUG_PRINTF("update indexSets end : indexSet0 size : %ld\n", indexSet0->size()); // DEBUG_PRINTF("update IndexSets end : indexSet1 size : %ld\n", indexSet1->size()); // DEBUG_PRINTF("update IndexSets end : indexSet2 size : %ld\n", indexSet2->size()); }