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