// Fill the SparseMat void BlockCSRMatrix::fill(SP::InteractionsGraph indexSet) { // ======> Aim: find inter1 and inter2 both in indexSets[level] and which // have common DynamicalSystems. Then get the corresponding matrix // from map blocks. assert(indexSet); // Number of blocks in a row = number of active constraints. _nr = indexSet->size(); // (re)allocate memory for ublas matrix _blockCSR->resize(_nr, _nr, false); _diagsize0->resize(_nr); _diagsize1->resize(_nr); // === Loop through "active" Interactions (ie present in // indexSets[level]) === int sizeV = 0; InteractionsGraph::VIterator vi, viend; for (std11::tie(vi, viend) = indexSet->vertices(); vi != viend; ++vi) { SP::Interaction inter = indexSet->bundle(*vi); assert(inter->nonSmoothLaw()->size() > 0); sizeV += inter->nonSmoothLaw()->size(); (*_diagsize0)[indexSet->index(*vi)] = sizeV; (*_diagsize1)[indexSet->index(*vi)] = sizeV; assert((*_diagsize0)[indexSet->index(*vi)] > 0); assert((*_diagsize1)[indexSet->index(*vi)] > 0); (*_blockCSR)(indexSet->index(*vi), indexSet->index(*vi)) = indexSet->properties(*vi).block->getArray(); } InteractionsGraph::EIterator ei, eiend; for (std11::tie(ei, eiend) = indexSet->edges(); ei != eiend; ++ei) { InteractionsGraph::VDescriptor vd1 = indexSet->source(*ei); InteractionsGraph::VDescriptor vd2 = indexSet->target(*ei); SP::Interaction inter1 = indexSet->bundle(vd1); SP::Interaction inter2 = indexSet->bundle(vd2); assert(indexSet->index(vd1) < _nr); assert(indexSet->index(vd2) < _nr); assert(indexSet->is_vertex(inter2)); assert(vd2 == indexSet->descriptor(inter2)); assert(indexSet->index(vd2) == indexSet->index(indexSet->descriptor(inter2))); unsigned int pos = indexSet->index(vd1); unsigned int col = indexSet->index(vd2); assert(pos != col); (*_blockCSR)(std::min(pos, col), std::max(pos, col)) = indexSet->properties(*ei).upper_block->getArray(); (*_blockCSR)(std::max(pos, col), std::min(pos, col)) = indexSet->properties(*ei).lower_block->getArray(); } DEBUG_EXPR(display(););
// Fill the matrix void OSNSMatrix::fill(SP::InteractionsGraph indexSet, bool update) { DEBUG_BEGIN("void OSNSMatrix::fill(SP::InteractionsGraph indexSet, bool update)\n"); assert(indexSet); if (update) { // Computes _dimRow and interactionBlocksPositions according to indexSet _dimColumn = updateSizeAndPositions(indexSet); _dimRow = _dimColumn; } if (_storageType == NM_DENSE) { // === Memory allocation, if required === // Mem. is allocate only if !M or if its size has changed. if (update) { if (! _M1) _M1.reset(new SimpleMatrix(_dimRow, _dimColumn)); else { if (_M1->size(0) != _dimRow || _M1->size(1) != _dimColumn) _M1->resize(_dimRow, _dimColumn); _M1->zero(); } } // ======> Aim: find inter1 and inter2 both in indexSet and which have // common DynamicalSystems. Then get the corresponding matrix // from map interactionBlocks, and copy it into M unsigned int pos = 0, col = 0; // index position used for // interactionBlock copy into M, see // below. // === Loop through "active" Interactions (ie present in // indexSets[level]) === InteractionsGraph::VIterator vi, viend; for (std11::tie(vi, viend) = indexSet->vertices(); vi != viend; ++vi) { SP::Interaction inter = indexSet->bundle(*vi); pos = inter->absolutePosition(); std11::static_pointer_cast<SimpleMatrix>(_M1) ->setBlock(pos, pos, *indexSet->properties(*vi).block); DEBUG_PRINTF("OSNSMatrix _M1: %i %i\n", _M1->size(0), _M1->size(1)); DEBUG_PRINTF("OSNSMatrix block: %i %i\n", indexSet->properties(*vi).block->size(0), indexSet->properties(*vi).block->size(1)); } InteractionsGraph::EIterator ei, eiend; for (std11::tie(ei, eiend) = indexSet->edges(); ei != eiend; ++ei) { InteractionsGraph::VDescriptor vd1 = indexSet->source(*ei); InteractionsGraph::VDescriptor vd2 = indexSet->target(*ei); SP::Interaction inter1 = indexSet->bundle(vd1); SP::Interaction inter2 = indexSet->bundle(vd2); pos = inter1->absolutePosition(); assert(indexSet->is_vertex(inter2)); col = inter2->absolutePosition(); assert(pos < _dimRow); assert(col < _dimColumn); DEBUG_PRINTF("OSNSMatrix _M1: %i %i\n", _M1->size(0), _M1->size(1)); DEBUG_PRINTF("OSNSMatrix upper: %i %i\n", indexSet->properties(*ei).upper_block->size(0), indexSet->properties(*ei).upper_block->size(1)); DEBUG_PRINTF("OSNSMatrix lower: %i %i\n", indexSet->properties(*ei).lower_block->size(0), indexSet->properties(*ei).lower_block->size(1)); assert(indexSet->properties(*ei).lower_block); assert(indexSet->properties(*ei).upper_block); std11::static_pointer_cast<SimpleMatrix>(_M1) ->setBlock(std::min(pos, col), std::max(pos, col), *indexSet->properties(*ei).upper_block); std11::static_pointer_cast<SimpleMatrix>(_M1) ->setBlock(std::max(pos, col), std::min(pos, col), *indexSet->properties(*ei).lower_block); } } else if (_storageType == NM_SPARSE_BLOCK) { if (! _M2) { DEBUG_PRINT("Reset _M2 shared pointer using new BlockCSRMatrix(indexSet) \n "); _M2.reset(new BlockCSRMatrix(indexSet)); } else { DEBUG_PRINT("fill existing _M2\n"); _M2->fill(indexSet); } } if (update) convert(); DEBUG_END("void OSNSMatrix::fill(SP::InteractionsGraph indexSet, bool update)\n"); }