diff --git a/Solver/filters.cpp b/Solver/filters.cpp index 9869181b16cf3e12a6f9a7c63d636035a0b7cbfe..3db2a5ddb468e62d8cfa25c26db31a9a5bf7001e 100644 --- a/Solver/filters.cpp +++ b/Solver/filters.cpp @@ -9,259 +9,5 @@ // #include "filters.h" -#include "MTriangle.h" -#include "MQuadrangle.h" -#include "MLine.h" -#include "MTetrahedron.h" -#include "MHexahedron.h" -#include "MElementCut.h" -#include "MElement.h" -void FilterLevelSetForLagMultSpace::SortNodes (void) -{ - - std::set< EdgeType > Se; // edges - std::set< NodeType > Sn; // level set nodes kept - std::map < NodeType, int > NodesScore; - std::map < NodeType , EdgeType > NodeToEdgeMap; - std::set< NodeType >::iterator itn; - - // initialization - fillNodeToEdgeMap (NodeToEdgeMap,Se,Sn); - - //-- decimation algorithm -- - - - while (!Sn.empty()) - { - // compute score of Sn - ComputeScore(NodeToEdgeMap,Se,Sn,NodesScore); - // take the lowest score - NodeType v = getNodeWithLowestScore(NodesScore); - // if NOT marked as looser then it s a winner - if (_looser_nodes.find(v) != _looser_nodes.end()) _winner_nodes.insert(v); - // kill all connected edges and nodes (then mark them as loosers) - killConnectedEdges (NodeToEdgeMap,Se,Sn,v); - } - - -} - -void FilterLevelSetForLagMultSpace::fillNodeToEdgeMap(std::map < NodeType , EdgeType > & NodeToEdgeMap, std::set< EdgeType > & Se , std::set< NodeType > & Sn) -{ - std::set<MElement*>::const_iterator it = _LevelSetElements->begin(); - for (; it != _LevelSetElements->end(); it++) - { - MElement *e = *it; - for (int i = 0 ; i < e->getNumVertices() ; i ++) // warning getnumvertices polygon : vertices + inner ? - { - NodeType v = e->getVertex(i); - EdgeType edge = findEdge(v,e); - Sn.insert(v); - Se.insert(edge); - NodeToEdgeMap[v] = edge; - } - } -} - -std::pair <MVertex * , MVertex * > FilterLevelSetForLagMultSpace::findEdge(NodeType v, MElement * e) -{ - MElement *ep; - if (e->getParent()) ep = e->getParent(); - switch (ep->getType()) - { - case TYPE_TRI : - { - EdgeType edge; - for (int i = 0 ; i < 3 ; i ++) // for all edges - { - int n1,n2; - n1 = i; - n2 = (i+1)%3; - // if it s an element vertex - if (v->getNum() == ep->getVertex(n1)->getNum()) - { - edge = EdgeType (ep->getVertex(n1),ep->getVertex(n1)); - return edge; - } - if (v->getNum() == ep->getVertex(n2)->getNum()) - { - edge = EdgeType (ep->getVertex(n2),ep->getVertex(n2)); - return edge; - } - // else if it s not an element vertex - edge = EdgeType(ep->getVertex(n1),ep->getVertex(n2)); - if (NodeBelongToEdge(v,edge)) return edge; - } - } - case TYPE_QUA : - { - EdgeType edge; - for (int i = 0 ; i < 4 ; i ++) // for all edges - { - int n1,n2; - n1 = i; - n2 = (i+1)%4; - // if it s an element vertex - if (v->getNum() == ep->getVertex(n1)->getNum()) - { - edge = EdgeType (ep->getVertex(n1),ep->getVertex(n1)); - return edge; - } - if (v->getNum() == ep->getVertex(n2)->getNum()) - { - edge = EdgeType (ep->getVertex(n2),ep->getVertex(n2)); - return edge; - } - // else if it s not an element vertex - edge = EdgeType(ep->getVertex(n1),ep->getVertex(n2)); - if (NodeBelongToEdge(v,edge)) return edge; - } - } - case TYPE_TET : - { - int tab[6][2] = {{0, 1}, {0, 3}, {0, 2}, {1, 2}, {2, 3}, {3, 1}}; // edges - EdgeType edge; - for (int i = 0 ; i < 6 ; i ++) // for all edges - { - int n1,n2; - n1 = tab[i][0]; - n2 = tab[i][1]; - // if it s an element vertex - if (v->getNum() == ep->getVertex(n1)->getNum()) - { - edge = EdgeType (ep->getVertex(n1),ep->getVertex(n1)); - return edge; - } - if (v->getNum() == ep->getVertex(n2)->getNum()) - { - edge = EdgeType (ep->getVertex(n2),ep->getVertex(n2)); - return edge; - } - // else if it s not an element vertex - edge = EdgeType(ep->getVertex(n1),ep->getVertex(n2)); - if (NodeBelongToEdge(v,edge)) return edge; - } - } - case TYPE_HEX : - { - int tab[12][2] = {{0, 1}, {0, 4}, {0, 3}, {1, 2}, {1, 5}, - {2, 3},{2,6},{3, 7}, {4, 7}, {4, 5},{5, 6},{6, 7}};// edges - EdgeType edge; - for (int i = 0 ; i < 12 ; i ++) // for all edges - { - int n1,n2; - n1 = tab[i][0]; - n2 = tab[i][1]; - // if it s an element vertex - if (v->getNum() == ep->getVertex(n1)->getNum()) - { - edge = EdgeType (ep->getVertex(n1),ep->getVertex(n1)); - return edge; - } - if (v->getNum() == ep->getVertex(n2)->getNum()) - { - edge = EdgeType (ep->getVertex(n2),ep->getVertex(n2)); - return edge; - } - // else if it s not an element vertex - edge = EdgeType(ep->getVertex(n1),ep->getVertex(n2)); - if (NodeBelongToEdge(v,edge)) return edge; - } - } - default : std::cout << "findEdge warning..." << std::endl; - } -} - - -bool FilterLevelSetForLagMultSpace::NodeBelongToEdge(NodeType v, EdgeType edge) -{ - - double eps = 1e-10; - - double distn, edgelength; - - edgelength = edge.first->distance(edge.second); - distn = v->distance(edge.first) + v->distance(edge.second); - - if (std::abs(edgelength - distn) < eps) return true; - else return false; - -} - - -void FilterLevelSetForLagMultSpace::ComputeScore( -std::map < NodeType , EdgeType > & NodeToEdgeMap, std::set< EdgeType > & Se, std::set< NodeType > & Sn, std::map < NodeType , int > & NodesScore) -{ - NodesScore.clear(); - std::set < NodeType >::iterator it = Sn.begin(); - for (;it!=Sn.end();it++) - { - int score; - EdgeType edge; - edge = NodeToEdgeMap[(*it)]; - if (edge.first->getNum() == edge.second->getNum()) score = 0; // regular mesh nodes score - else score = ComputeIncidentEdges(Se,edge.first) + ComputeIncidentEdges(Se,edge.second); - NodesScore[(*it)] = score; - } -} - - -int FilterLevelSetForLagMultSpace::ComputeIncidentEdges(std::set< EdgeType > & Se, NodeType & v) -{ - int n = 0; - std::set < EdgeType >::iterator it = Se.begin(); - for (;it!=Se.end();it++) - { - if ((*it).first == v | (*it).second == v) n++; - } - return n; -} - - -MVertex * FilterLevelSetForLagMultSpace::getNodeWithLowestScore(std::map < NodeType , int > & NodesScore) -{ - NodeType v; - std::map < NodeType , int >::iterator it = NodesScore.begin(); - v = (*it).first; - for (;it!=NodesScore.end() ; it ++) - { - if ((*it).second < NodesScore[v]) v = (*it).first ; - } - return v; -} - -void FilterLevelSetForLagMultSpace::killConnectedEdges (std::map < NodeType , EdgeType > & NodeToEdgeMap, std::set< EdgeType > & Se , std::set< NodeType > & Sn, NodeType v) -{ - - std::vector < EdgeType > EdgesToErase; - std::vector < NodeType > NodesToErase; - - NodeType v1 = NodeToEdgeMap[v].first; - NodeType v2 = NodeToEdgeMap[v].second; - - std::set < EdgeType >::iterator ite = Se.begin(); - for (;ite!=Se.end();ite++) - { - if ((*ite).first == v1 | (*ite).second == v1) EdgesToErase.push_back(*ite); - if ((*ite).first == v2 | (*ite).second == v2) EdgesToErase.push_back(*ite); - } - for (int i = 0 ; i < EdgesToErase.size() ; i ++) - { - Se.erase(EdgesToErase[i]); - } - - - std::set < NodeType >::iterator itn = Sn.begin(); - for (; itn != Sn.end() ; itn ++) - { - if (Se.find(NodeToEdgeMap[(*itn)]) == Se.end()) NodesToErase.push_back(*itn); - } - for (int i = 0 ; i < NodesToErase.size() ; i ++) - { - if (NodesToErase[i]->getNum() != v->getNum()) _looser_nodes.insert(NodesToErase[i]); - Sn.erase(NodesToErase[i]); - } - -} diff --git a/Solver/filters.h b/Solver/filters.h index d07a3051c86aab4db3840556a96f1f8accb1f1e2..be341656e410cb2893bdb24600b421aacea1ff0c 100644 --- a/Solver/filters.h +++ b/Solver/filters.h @@ -80,13 +80,13 @@ class FilterElementsCutByLevelSet FilterElementsCutByLevelSet(std::pair<int,int> LevelSetEntity , std::set<int> * EnrichComp) { - + _EnrichComp = EnrichComp; _LevelSetEntity = LevelSetEntity; - + // groupOfElements to get all the elements associate with the level set -- (work with *current GModel) groupOfElements *LevelSetElements = new groupOfElements (_LevelSetEntity.first, _LevelSetEntity.second); - + // tag enriched vertex determination std::set<MElement*>::const_iterator it = LevelSetElements->begin(); for (; it != LevelSetElements->end(); it++) @@ -100,7 +100,7 @@ class FilterElementsCutByLevelSet } } } - + } virtual bool operator () (Dof & key) const @@ -122,58 +122,4 @@ class FilterElementsCutByLevelSet }; -class FilterLevelSetForLagMultSpace -{ - - private : - - typedef MVertex * NodeType; - typedef std::pair <NodeType , NodeType > EdgeType; - typedef std::pair <EdgeType , double > EdgeScoreType; - - - private : - - groupOfElements * _LevelSetElements; - std::pair<int,int> _LevelSetEntity; - std::set< NodeType > _winner_nodes; - std::set< NodeType > _looser_nodes; - gLevelset *_ls; - - private : - - // decimation algorithm result in _winner_nodes set - void SortNodes (void) ; - // initialisation of needed sets - void fillNodeToEdgeMap(std::map < NodeType , EdgeType > & NodeToEdgeMap, std::set< EdgeType > & Se , std::set< NodeType > & Sn) ; - // find edge in the element associate with node - EdgeType findEdge(NodeType v, MElement * e); - // verify if node belong to edge // ...normaly has to be done when cutting model ... - bool NodeBelongToEdge(NodeType v, EdgeType edge); - // compute score - void ComputeScore(std::map < NodeType , EdgeType > & NodeToEdgeMap, std::set< EdgeType > & Se, std::set< NodeType > & Sn, std::map < NodeType , int > & NodesScore); - // compute number of incident edges in Se to node v - int ComputeIncidentEdges(std::set< EdgeType > & Se, NodeType & v); - // get lowest (no need to sort just get the lowest) - NodeType getNodeWithLowestScore(std::map < NodeType , int > & NodesScore); - // kill connected edges - void killConnectedEdges (std::map < NodeType , EdgeType > & NodeToEdgeMap, std::set< EdgeType > & Se , std::set< NodeType > & Sn, NodeType v); - - public : - - FilterLevelSetForLagMultSpace(std::pair<int,int> LevelSetEntity , gLevelset *ls) : _LevelSetEntity(LevelSetEntity), _ls(ls) - { - groupOfElements *_LevelSetElements = new groupOfElements (_LevelSetEntity.first, _LevelSetEntity.second); - SortNodes(); - } - - virtual bool operator () (Dof & key) const - { - ; - } - -}; - - - #endif