gmsh-TingyuanDoc  0.1
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
groupOfElements.h
Go to the documentation of this file.
1 // Gmsh - Copyright (C) 1997-2022 C. Geuzaine, J.-F. Remacle
2 //
3 // See the LICENSE.txt file in the Gmsh root directory for license information.
4 // Please report all issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
5 
6 #ifndef GROUPOFELEMENTS_H
7 #define GROUPOFELEMENTS_H
8 
9 #include <set>
10 #include "GFace.h"
11 #include "MElement.h"
12 
14 public:
15  virtual ~elementFilter() {}
16  virtual bool operator()(MElement *) const = 0;
17 };
18 
20 public:
21  bool operator()(MElement *) const { return true; }
22 };
23 
25 public:
26  typedef std::set<MElement *> elementContainer;
27  typedef std::set<MVertex *> vertexContainer;
28 
29 protected:
33 
34 public:
36  groupOfElements(int dim, int physical) { addPhysical(dim, physical); }
39  groupOfElements(std::vector<MElement *> &elems);
40 
41  virtual ~groupOfElements() {}
42 
43  virtual void addPhysical(int dim, int physical)
44  {
45  elementFilterTrivial filter;
46  addPhysical(dim, physical, filter);
47  }
48 
49  virtual void addElementary(GEntity *ge, const elementFilter &f);
50 
51  virtual void addPhysical(int dim, int physical, const elementFilter &);
52 
53  vertexContainer::const_iterator vbegin() const { return _vertices.begin(); }
54  vertexContainer::const_iterator vend() const { return _vertices.end(); }
55  elementContainer::const_iterator begin() const { return _elements.begin(); }
56  elementContainer::const_iterator end() const { return _elements.end(); }
57 
58  size_t size() const { return _elements.size(); }
59  size_t vsize() const { return _vertices.size(); }
60 
61  // FIXME : NOT VERY ELEGANT !!!
62  bool find(
63  MElement *e) const // if same parent but different physicals return true ?!
64  {
65  if(e->getParent() && _parents.find(e->getParent()) != _parents.end())
66  return true;
67  return (_elements.find(e) != _elements.end());
68  }
69 
70  bool find(MVertex *v) const { return (_vertices.find(v) != _vertices.end()); }
71 
72  inline void insert(MElement *e)
73  {
74  _elements.insert(e);
75 
76  if(e->getParent()) {
77  _parents.insert(e->getParent());
78  for(std::size_t i = 0; i < e->getParent()->getNumVertices(); i++) {
79  _vertices.insert(e->getParent()->getVertex(i));
80  }
81  }
82  else {
83  for(std::size_t i = 0; i < e->getNumVertices(); i++) {
84  _vertices.insert(e->getVertex(i));
85  }
86  }
87  }
88 
89  inline void clearAll()
90  {
91  _vertices.clear();
92  _elements.clear();
93  _parents.clear();
94  }
95 };
96 
97 // child elements in pElem restricted to elements who have parent in sElem
99 private:
101  {
102  auto itp = pElem.begin();
103  for(; itp != pElem.end(); itp++) {
104  if((*itp)->getParent()) {
105  if(sElem.find(*itp))
106  insert((
107  *itp)); // warning : find method used to check if parent is in sElem
108  }
109  else
110  std::cout << "groupOfLagMultElements : Warning, level set element has "
111  "no parent ?! "
112  << std::endl;
113  }
114  }
115 
116 public:
117  groupOfLagMultElements(int dim, int physical, groupOfElements &sElem)
118  : groupOfElements()
119  {
120  groupOfElements pElem(dim, physical);
121  fillElementContainer(pElem, sElem);
122  }
123 
124  groupOfLagMultElements(int dim, int physical,
125  std::vector<groupOfElements *> sElem)
126  : groupOfElements()
127  {
128  groupOfElements pElem(dim, physical);
129  for(unsigned int i = 0; i < sElem.size(); i++) {
130  fillElementContainer(pElem, (*sElem[i]));
131  }
132  }
133 };
134 
135 #endif
groupOfElements::vend
vertexContainer::const_iterator vend() const
Definition: groupOfElements.h:54
groupOfElements::end
elementContainer::const_iterator end() const
Definition: groupOfElements.h:56
groupOfElements::clearAll
void clearAll()
Definition: groupOfElements.h:89
GFace.h
groupOfElements::_elements
elementContainer _elements
Definition: groupOfElements.h:31
elementFilter::operator()
virtual bool operator()(MElement *) const =0
GFace
Definition: GFace.h:33
elementFilter::~elementFilter
virtual ~elementFilter()
Definition: groupOfElements.h:15
MVertex
Definition: MVertex.h:24
groupOfElements::addPhysical
virtual void addPhysical(int dim, int physical)
Definition: groupOfElements.h:43
LegendrePolynomials::f
void f(int n, double u, double *val)
Definition: orthogonalBasis.cpp:77
MElement::getParent
virtual MElement * getParent() const
Definition: MElement.h:231
groupOfElements::vertexContainer
std::set< MVertex * > vertexContainer
Definition: groupOfElements.h:27
groupOfElements
Definition: groupOfElements.h:24
GEntity
Definition: GEntity.h:31
MElement::getNumVertices
virtual std::size_t getNumVertices() const =0
groupOfLagMultElements::fillElementContainer
void fillElementContainer(groupOfElements &pElem, groupOfElements &sElem)
Definition: groupOfElements.h:100
groupOfLagMultElements::groupOfLagMultElements
groupOfLagMultElements(int dim, int physical, groupOfElements &sElem)
Definition: groupOfElements.h:117
MElement::getVertex
virtual const MVertex * getVertex(int num) const =0
groupOfElements::size
size_t size() const
Definition: groupOfElements.h:58
MElement
Definition: MElement.h:30
groupOfElements::_vertices
vertexContainer _vertices
Definition: groupOfElements.h:30
elementFilter
Definition: groupOfElements.h:13
groupOfElements::groupOfElements
groupOfElements(int dim, int physical)
Definition: groupOfElements.h:36
groupOfElements::elementContainer
std::set< MElement * > elementContainer
Definition: groupOfElements.h:26
GRegion
Definition: GRegion.h:28
groupOfElements::find
bool find(MVertex *v) const
Definition: groupOfElements.h:70
groupOfElements::~groupOfElements
virtual ~groupOfElements()
Definition: groupOfElements.h:41
groupOfElements::_parents
elementContainer _parents
Definition: groupOfElements.h:32
groupOfElements::begin
elementContainer::const_iterator begin() const
Definition: groupOfElements.h:55
groupOfElements::vsize
size_t vsize() const
Definition: groupOfElements.h:59
elementFilterTrivial
Definition: groupOfElements.h:19
groupOfLagMultElements
Definition: groupOfElements.h:98
groupOfElements::insert
void insert(MElement *e)
Definition: groupOfElements.h:72
elementFilterTrivial::operator()
bool operator()(MElement *) const
Definition: groupOfElements.h:21
MElement.h
groupOfElements::groupOfElements
groupOfElements()
Definition: groupOfElements.h:35
groupOfElements::vbegin
vertexContainer::const_iterator vbegin() const
Definition: groupOfElements.h:53
ElementType::getNumVertices
int getNumVertices(int type)
Definition: ElementType.cpp:456
groupOfElements::addElementary
virtual void addElementary(GEntity *ge, const elementFilter &f)
Definition: groupOfElements.cpp:34
groupOfElements::find
bool find(MElement *e) const
Definition: groupOfElements.h:62
groupOfLagMultElements::groupOfLagMultElements
groupOfLagMultElements(int dim, int physical, std::vector< groupOfElements * > sElem)
Definition: groupOfElements.h:124