const IntArray &Set :: giveNodeList() { // Lazy evaluation, we compute the unique set of nodes if needed (and store it). if ( this->totalNodes.giveSize() == 0 ) { IntArray afflictedNodes( this->domain->giveNumberOfDofManagers() ); afflictedNodes.zero(); for ( int ielem = 1; ielem <= this->elements.giveSize(); ++ielem ) { Element *e = this->domain->giveElement( this->elements.at(ielem) ); for ( int inode = 1; inode <= e->giveNumberOfNodes(); ++inode ) { afflictedNodes.at( e->giveNode(inode)->giveNumber() ) = 1; } } /* boundary entities are obsolete, use edges and/or surfaces instead */ IntArray bNodes; for ( int ibnd = 1; ibnd <= this->elementBoundaries.giveSize() / 2; ++ibnd ) { Element *e = this->domain->giveElement( this->elementBoundaries.at(ibnd * 2 - 1) ); int boundary = this->elementBoundaries.at(ibnd * 2); FEInterpolation *fei = e->giveInterpolation(); fei->boundaryGiveNodes(bNodes, boundary); for ( int inode = 1; inode <= bNodes.giveSize(); ++inode ) { afflictedNodes.at( e->giveNode( bNodes.at(inode) )->giveNumber() ) = 1; } } IntArray eNodes; for ( int iedge = 1; iedge <= this->elementEdges.giveSize() / 2; ++iedge ) { Element *e = this->domain->giveElement( this->elementEdges.at(iedge * 2 - 1) ); int edge = this->elementEdges.at(iedge * 2); FEInterpolation *fei = e->giveInterpolation(); fei->boundaryEdgeGiveNodes(eNodes, edge); for ( int inode = 1; inode <= eNodes.giveSize(); ++inode ) { afflictedNodes.at( e->giveNode( eNodes.at(inode) )->giveNumber() ) = 1; } } for ( int isurf = 1; isurf <= this->elementSurfaces.giveSize() / 2; ++isurf ) { Element *e = this->domain->giveElement( this->elementSurfaces.at(isurf * 2 - 1) ); int surf = this->elementSurfaces.at(isurf * 2); FEInterpolation *fei = e->giveInterpolation(); fei->boundarySurfaceGiveNodes(eNodes, surf); for ( int inode = 1; inode <= eNodes.giveSize(); ++inode ) { afflictedNodes.at( e->giveNode( eNodes.at(inode) )->giveNumber() ) = 1; } } for ( int inode = 1; inode <= this->nodes.giveSize(); ++inode ) { afflictedNodes.at( this->nodes.at(inode) ) = 1; } totalNodes.findNonzeros(afflictedNodes); } return this->totalNodes; }
const IntArray &Set :: giveNodeList() { // Lazy evaluation, we compute the unique set of nodes if needed (and store it). if ( this->totalNodes.giveSize() == 0 ) { IntArray afflictedNodes( this->domain->giveNumberOfDofManagers() ); afflictedNodes.zero(); for ( int ielem = 1; ielem <= this->elements.giveSize(); ++ielem ) { Element *e = this->domain->giveElement( this->elements.at(ielem) ); for ( int inode = 1; inode <= e->giveNumberOfNodes(); ++inode ) { afflictedNodes.at( e->giveNode(inode)->giveNumber() ) = 1; } } IntArray bNodes; for ( int ibnd = 1; ibnd <= this->elementBoundaries.giveSize() / 2; ++ibnd ) { Element *e = this->domain->giveElement( this->elementBoundaries.at(ibnd * 2 - 1) ); int boundary = this->elementBoundaries.at(ibnd * 2); FEInterpolation *fei = e->giveInterpolation(); fei->boundaryGiveNodes(bNodes, boundary); for ( int inode = 1; inode <= bNodes.giveSize(); ++inode ) { afflictedNodes.at( e->giveNode( bNodes.at(inode) )->giveNumber() ) = 1; } } IntArray eNodes; for ( int iedge = 1; iedge <= this->elementEdges.giveSize() / 2; ++iedge ) { Element *e = this->domain->giveElement( this->elementEdges.at(iedge * 2 - 1) ); int edge = this->elementEdges.at(iedge * 2); FEInterpolation3d *fei = static_cast< FEInterpolation3d * >( e->giveInterpolation() ); fei->computeLocalEdgeMapping(eNodes, edge); for ( int inode = 1; inode <= eNodes.giveSize(); ++inode ) { afflictedNodes.at( e->giveNode( eNodes.at(inode) )->giveNumber() ) = 1; } } for ( int inode = 1; inode <= this->nodes.giveSize(); ++inode ) { afflictedNodes.at( this->nodes.at(inode) ) = 1; } totalNodes.findNonzeros(afflictedNodes); } return this->totalNodes; }
void Set :: computeIntArray(IntArray& answer, const IntArray& specified, std::list< Range > ranges) { // Find the max value; int maxIndex = specified.giveSize() == 0 ? 0 : specified.maximum(); for (std::list< Range >::iterator it = ranges.begin(); it != ranges.end(); ++it) { if ( it->giveEnd() > maxIndex ) maxIndex = it->giveEnd(); } IntArray afflictedNodes(maxIndex); afflictedNodes.zero(); for (int i = 1; i <= specified.giveSize(); ++i) { afflictedNodes.at(specified.at(i)) = 1; } for (std::list< Range >::iterator it = ranges.begin(); it != ranges.end(); ++it) { for (int i = it->giveStart(); i <= it->giveEnd(); ++i) { afflictedNodes.at(i) = 1; } } answer.findNonzeros(afflictedNodes); }
void Set :: computeIntArray(IntArray &answer, const IntArray &specified, std :: list< Range >ranges) { // Find the max value; int maxIndex = specified.giveSize() == 0 ? 0 : specified.maximum(); for ( auto &range: ranges ) { if ( range.giveEnd() > maxIndex ) { maxIndex = range.giveEnd(); } } IntArray afflictedNodes(maxIndex); afflictedNodes.zero(); for ( int i = 1; i <= specified.giveSize(); ++i ) { afflictedNodes.at( specified.at(i) ) = 1; } for ( auto &range: ranges ) { for ( int i = range.giveStart(); i <= range.giveEnd(); ++i ) { afflictedNodes.at(i) = 1; } } answer.findNonzeros(afflictedNodes); }