gmsh-TingyuanDoc  0.1
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
MLine.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 MLINE_H
7 #define MLINE_H
8 
9 #include "MElement.h"
10 
11 /*
12  * MLine
13  *
14  * v
15  * ^
16  * |
17  * |
18  * 0-----+-----1 --> u
19  *
20  */
21 class MLine : public MElement {
22 protected:
23  MVertex *_v[2];
24  void _getEdgeVertices(std::vector<MVertex *> &v) const
25  {
26  v[0] = _v[0];
27  v[1] = _v[1];
28  }
29 
30 public:
31  MLine(MVertex *v0, MVertex *v1, int num = 0, int part = 0)
32  : MElement(num, part)
33  {
34  _v[0] = v0;
35  _v[1] = v1;
36  }
37  MLine(const std::vector<MVertex *> &v, int num = 0, int part = 0)
38  : MElement(num, part)
39  {
40  for(int i = 0; i < 2; i++) _v[i] = v[i];
41  }
42  ~MLine() {}
43  virtual int getDim() const { return 1; }
44  virtual std::size_t getNumVertices() const { return 2; }
45  virtual MVertex *getVertex(int num) { return _v[num]; }
46  virtual const MVertex *getVertex(int num) const { return _v[num]; }
47  virtual void setVertex(int num, MVertex *v) { _v[num] = v; }
48  virtual double getInnerRadius(); // half-length of segment line
49  virtual double getLength(); // length of segment line
50  virtual double getVolume();
51  virtual void getVertexInfo(const MVertex *vertex, int &ithVertex) const
52  {
53  ithVertex = _v[0] == vertex ? 0 : 1;
54  }
55  virtual int getNumEdges() const { return 1; }
56  virtual MEdge getEdge(int num) const { return MEdge(_v[0], _v[1]); }
57  virtual int getNumEdgesRep(bool curved) { return 1; }
58  virtual void getEdgeRep(bool curved, int num, double *x, double *y, double *z,
59  SVector3 *n)
60  {
61  _getEdgeRep(_v[0], _v[1], x, y, z, n);
62  }
63  virtual void getEdgeVertices(const int num, std::vector<MVertex *> &v) const
64  {
65  v.resize(2);
67  }
68  virtual int getNumFaces() { return 0; }
69  virtual MFace getFace(int num) const { return MFace(); }
70  virtual int getNumFacesRep(bool curved) { return 0; }
71  virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z,
72  SVector3 *n)
73  {
74  }
75  virtual int getType() const { return TYPE_LIN; }
76  virtual int getTypeForMSH() const { return MSH_LIN_2; }
77  virtual int getTypeForUNV() const { return 21; } // linear beam
78  virtual int getTypeForVTK() const { return 3; }
79  virtual const char *getStringForPOS() const { return "SL"; }
80  virtual const char *getStringForBDF() const { return "CBAR"; }
81  virtual const char *getStringForINP() const { return "T3D2" /*"C1D2"*/; }
82  virtual const char *getStringForKEY() const { return "_BEAM"; }
83  virtual const char *getStringForRAD() const { return "/TRUSS"; }
84  virtual const char *getStringForTOCHNOG() const { return "-bar2"; }
85  virtual void reverse()
86  {
87  MVertex *tmp = _v[0];
88  _v[0] = _v[1];
89  _v[1] = tmp;
90  }
91  virtual bool isInside(double u, double v, double w) const
92  {
93  double tol = getTolerance();
94  if(u < -(1. + tol) || u > (1. + tol) || fabs(v) > tol || fabs(w) > tol)
95  return false;
96  return true;
97  }
98  virtual void getNode(int num, double &u, double &v, double &w) const
99  {
100  v = w = 0.;
101  switch(num) {
102  case 0: u = -1.; break;
103  case 1: u = 1.; break;
104  default: u = 0.; break;
105  }
106  }
107  virtual SPoint3 barycenterUVW() const { return SPoint3(0, 0, 0); }
108  virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts);
109  virtual void discretize(double tol, std::vector<SPoint3> &dpts,
110  std::vector<double> &ts);
111  virtual int numCommonNodesInDualGraph(const MElement *const other) const
112  {
113  return ((other->getType() == TYPE_LIN || other->getType() == TYPE_PNT) ? 1 :
114  2);
115  }
116 };
117 
118 /*
119  * MLine3
120  *
121  * v
122  * ^
123  * |
124  * |
125  * 0-----2-----1 --> u
126  *
127  */
128 class MLine3 : public MLine {
129 protected:
131 
132 public:
133  MLine3(MVertex *v0, MVertex *v1, MVertex *v2, int num = 0, int part = 0)
134  : MLine(v0, v1, num, part)
135  {
136  _vs[0] = v2;
137  _vs[0]->setPolynomialOrder(2);
138  }
139  MLine3(const std::vector<MVertex *> &v, int num = 0, int part = 0)
140  : MLine(v, num, part)
141  {
142  _vs[0] = v[2];
143  _vs[0]->setPolynomialOrder(2);
144  }
145  ~MLine3() {}
146  virtual int getPolynomialOrder() const { return 2; }
147  virtual std::size_t getNumVertices() const { return 3; }
148  virtual MVertex *getVertex(int num)
149  {
150  return num < 2 ? _v[num] : _vs[num - 2];
151  }
152  virtual const MVertex *getVertex(int num) const
153  {
154  return num < 2 ? _v[num] : _vs[num - 2];
155  }
156  virtual void setVertex(int num, MVertex *v)
157  {
158  if(num < 2)
159  _v[num] = v;
160  else
161  _vs[num - 2] = v;
162  }
163  virtual MVertex *getVertexUNV(int num)
164  {
165  static const int map[3] = {0, 2, 1};
166  return getVertex(map[num]);
167  }
168  virtual MVertex *getVertexINP(int num) { return getVertexUNV(num); }
169  virtual MVertex *getVertexKEY(int num) { return getVertexUNV(num); }
170  virtual MVertex *getVertexRAD(int num) { return getVertexUNV(num); }
171  virtual int getNumEdgeVertices() const { return 1; }
172  virtual int getNumEdgesRep(bool curved);
173  virtual void getEdgeRep(bool curved, int num, double *x, double *y, double *z,
174  SVector3 *n);
175  virtual void getEdgeVertices(const int num, std::vector<MVertex *> &v) const
176  {
177  v.resize(3);
179  v[2] = _vs[0];
180  }
181  virtual int getTypeForMSH() const { return MSH_LIN_3; }
182  virtual int getTypeForUNV() const { return 24; } // parabolic beam
183  virtual int getTypeForVTK() const { return 21; }
184  virtual const char *getStringForPOS() const { return "SL2"; }
185  virtual const char *getStringForINP() const { return "T3D3" /*"C1D3"*/; }
186  virtual const char *getStringForKEY() const { return "_BEAM_ELBOW"; }
187  virtual const char *getStringForRAD() const { return "/BEAM"; }
188  virtual const char *getStringForTOCHNOG() const { return "-bar3"; }
189  virtual void getNode(int num, double &u, double &v, double &w) const
190  {
191  num < 2 ? MLine::getNode(num, u, v, w) : MElement::getNode(num, u, v, w);
192  }
193  virtual void discretize(double tol, std::vector<SPoint3> &dpts,
194  std::vector<double> &ts);
195 };
196 
197 /*
198  * MLineN
199  *
200  * v
201  * ^
202  * |
203  * |
204  * 0--2--...--(N-1)--1 --> u
205  *
206  */
207 class MLineN : public MLine {
208 protected:
209  std::vector<MVertex *> _vs;
210 
211 public:
212  MLineN(MVertex *v0, MVertex *v1, const std::vector<MVertex *> &vs,
213  int num = 0, int part = 0)
214  : MLine(v0, v1, num, part), _vs(vs)
215  {
216  for(std::size_t i = 0; i < _vs.size(); i++)
217  _vs[i]->setPolynomialOrder(_vs.size() + 1);
218  }
219  MLineN(const std::vector<MVertex *> &v, int num = 0, int part = 0)
220  : MLine(v[0], v[1], num, part)
221  {
222  for(std::size_t i = 2; i < v.size(); i++) _vs.push_back(v[i]);
223  for(std::size_t i = 0; i < _vs.size(); i++)
224  _vs[i]->setPolynomialOrder(_vs.size() + 1);
225  }
226  ~MLineN() {}
227  virtual int getPolynomialOrder() const { return _vs.size() + 1; }
228  virtual std::size_t getNumVertices() const { return _vs.size() + 2; }
229  virtual MVertex *getVertex(int num)
230  {
231  return num < 2 ? _v[num] : _vs[num - 2];
232  }
233  virtual const MVertex *getVertex(int num) const
234  {
235  return num < 2 ? _v[num] : _vs[num - 2];
236  }
237  virtual void setVertex(int num, MVertex *v)
238  {
239  if(num < 2)
240  _v[num] = v;
241  else
242  _vs[num - 2] = v;
243  }
244  virtual int getNumEdgeVertices() const { return _vs.size(); }
245  virtual int getNumEdgesRep(bool curved);
246  virtual void getEdgeRep(bool curved, int num, double *x, double *y, double *z,
247  SVector3 *n);
248  virtual void getEdgeVertices(const int num, std::vector<MVertex *> &v) const
249  {
250  v.resize(2 + _vs.size());
252  for(std::size_t i = 0; i != _vs.size(); ++i) v[i + 2] = _vs[i];
253  }
254  virtual int getTypeForMSH() const
255  {
256  switch(_vs.size()) {
257  case 0: return MSH_LIN_2;
258  case 1: return MSH_LIN_3;
259  case 2: return MSH_LIN_4;
260  case 3: return MSH_LIN_5;
261  case 4: return MSH_LIN_6;
262  case 5: return MSH_LIN_7;
263  case 6: return MSH_LIN_8;
264  case 7: return MSH_LIN_9;
265  case 8: return MSH_LIN_10;
266  case 9: return MSH_LIN_11;
267  default:
268  Msg::Error("No MSH type found for line with %d nodes", 8 + _vs.size());
269  return 0;
270  }
271  }
272  virtual void reverse()
273  {
274  MVertex *tmp = _v[0];
275  _v[0] = _v[1];
276  _v[1] = tmp;
277  std::vector<MVertex *> inv;
278  inv.insert(inv.begin(), _vs.rbegin(), _vs.rend());
279  _vs = inv;
280  }
281  virtual void getNode(int num, double &u, double &v, double &w) const
282  {
283  num < 2 ? MLine::getNode(num, u, v, w) : MElement::getNode(num, u, v, w);
284  }
285  virtual void discretize(double tol, std::vector<SPoint3> &dpts,
286  std::vector<double> &ts);
287 };
288 
290  bool operator()(MLine *l1, MLine *l2) const
291  {
292  static MEdgeLessThan le;
293  return le(l1->getEdge(0), l2->getEdge(0));
294  }
295 };
296 
298  bool operator()(MLine *l1, MLine *l2) const
299  {
300  static MEdgeEqual le;
301  return le(l1->getEdge(0), l2->getEdge(0));
302  }
303 };
304 
305 #endif
MSH_LIN_2
#define MSH_LIN_2
Definition: GmshDefines.h:80
MLine::getDim
virtual int getDim() const
Definition: MLine.h:43
MLine3::setVertex
virtual void setVertex(int num, MVertex *v)
Definition: MLine.h:156
MLine::_getEdgeVertices
void _getEdgeVertices(std::vector< MVertex * > &v) const
Definition: MLine.h:24
MLine::getNumFaces
virtual int getNumFaces()
Definition: MLine.h:68
MLine3::getStringForINP
virtual const char * getStringForINP() const
Definition: MLine.h:185
MEdge
Definition: MEdge.h:14
MSH_LIN_10
#define MSH_LIN_10
Definition: GmshDefines.h:144
MLine::barycenterUVW
virtual SPoint3 barycenterUVW() const
Definition: MLine.h:107
MLine3::MLine3
MLine3(MVertex *v0, MVertex *v1, MVertex *v2, int num=0, int part=0)
Definition: MLine.h:133
MLine::reverse
virtual void reverse()
Definition: MLine.h:85
MLine3::getStringForTOCHNOG
virtual const char * getStringForTOCHNOG() const
Definition: MLine.h:188
MLineN::getNode
virtual void getNode(int num, double &u, double &v, double &w) const
Definition: MLine.h:281
MLine::getStringForKEY
virtual const char * getStringForKEY() const
Definition: MLine.h:82
MLine3::~MLine3
~MLine3()
Definition: MLine.h:145
TYPE_LIN
#define TYPE_LIN
Definition: GmshDefines.h:65
MLine::getVertex
virtual MVertex * getVertex(int num)
Definition: MLine.h:45
MLine3::getEdgeVertices
virtual void getEdgeVertices(const int num, std::vector< MVertex * > &v) const
Definition: MLine.h:175
MLine3
Definition: MLine.h:128
MLine::getTypeForUNV
virtual int getTypeForUNV() const
Definition: MLine.h:77
MVertex::setPolynomialOrder
void setPolynomialOrder(int order)
Definition: MVertex.h:57
MLine3::getStringForKEY
virtual const char * getStringForKEY() const
Definition: MLine.h:186
MLine::getVolume
virtual double getVolume()
Definition: MLine.cpp:25
MVertex
Definition: MVertex.h:24
MSH_LIN_9
#define MSH_LIN_9
Definition: GmshDefines.h:143
MLine3::getStringForRAD
virtual const char * getStringForRAD() const
Definition: MLine.h:187
Msg::Error
static void Error(const char *fmt,...)
Definition: GmshMessage.cpp:482
MSH_LIN_4
#define MSH_LIN_4
Definition: GmshDefines.h:105
MLine3::getPolynomialOrder
virtual int getPolynomialOrder() const
Definition: MLine.h:146
MLine3::getVertexRAD
virtual MVertex * getVertexRAD(int num)
Definition: MLine.h:170
SPoint3
Definition: SPoint3.h:14
MLineN::getNumEdgesRep
virtual int getNumEdgesRep(bool curved)
Definition: MLine.cpp:52
MLine::getEdgeVertices
virtual void getEdgeVertices(const int num, std::vector< MVertex * > &v) const
Definition: MLine.h:63
TYPE_PNT
#define TYPE_PNT
Definition: GmshDefines.h:64
SVector3
Definition: SVector3.h:16
MLineN::getEdgeRep
virtual void getEdgeRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
Definition: MLine.cpp:57
MLineN::getPolynomialOrder
virtual int getPolynomialOrder() const
Definition: MLine.h:227
MLine::~MLine
~MLine()
Definition: MLine.h:42
MLine::getNumEdges
virtual int getNumEdges() const
Definition: MLine.h:55
MLine::getEdge
virtual MEdge getEdge(int num) const
Definition: MLine.h:56
MEdgeLessThan
Definition: MEdge.h:122
MLine::getNumVertices
virtual std::size_t getNumVertices() const
Definition: MLine.h:44
MLine::setVertex
virtual void setVertex(int num, MVertex *v)
Definition: MLine.h:47
MLineN::discretize
virtual void discretize(double tol, std::vector< SPoint3 > &dpts, std::vector< double > &ts)
Definition: MLine.cpp:98
MLine::_v
MVertex * _v[2]
Definition: MLine.h:23
MLine
Definition: MLine.h:21
MLine::getFaceRep
virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
Definition: MLine.h:71
MLine::numCommonNodesInDualGraph
virtual int numCommonNodesInDualGraph(const MElement *const other) const
Definition: MLine.h:111
MLine::getStringForINP
virtual const char * getStringForINP() const
Definition: MLine.h:81
MLine3::getEdgeRep
virtual void getEdgeRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
Definition: MLine.cpp:32
MLine3::discretize
virtual void discretize(double tol, std::vector< SPoint3 > &dpts, std::vector< double > &ts)
Definition: MLine.cpp:88
MLine::getFace
virtual MFace getFace(int num) const
Definition: MLine.h:69
MFace
Definition: MFace.h:20
MSH_LIN_6
#define MSH_LIN_6
Definition: GmshDefines.h:107
MElement::_getEdgeRep
void _getEdgeRep(MVertex *v0, MVertex *v1, double *x, double *y, double *z, SVector3 *n, int faceIndex=-1)
Definition: MElement.cpp:107
MLine3::getVertexKEY
virtual MVertex * getVertexKEY(int num)
Definition: MLine.h:169
MElement::getType
virtual int getType() const =0
MLine::getIntegrationPoints
virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts)
Definition: MLine.cpp:15
MSH_LIN_3
#define MSH_LIN_3
Definition: GmshDefines.h:87
MLine::getVertex
virtual const MVertex * getVertex(int num) const
Definition: MLine.h:46
MLine::getEdgeRep
virtual void getEdgeRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
Definition: MLine.h:58
MLine3::getVertex
virtual MVertex * getVertex(int num)
Definition: MLine.h:148
MLinePtrEqual
Definition: MLine.h:297
MLine::isInside
virtual bool isInside(double u, double v, double w) const
Definition: MLine.h:91
MLineN
Definition: MLine.h:207
MLine::getNumFacesRep
virtual int getNumFacesRep(bool curved)
Definition: MLine.h:70
MLine::discretize
virtual void discretize(double tol, std::vector< SPoint3 > &dpts, std::vector< double > &ts)
Definition: MLine.cpp:77
MLineN::getNumVertices
virtual std::size_t getNumVertices() const
Definition: MLine.h:228
MSH_LIN_7
#define MSH_LIN_7
Definition: GmshDefines.h:141
MLine3::_vs
MVertex * _vs[1]
Definition: MLine.h:130
MLine3::getNumEdgesRep
virtual int getNumEdgesRep(bool curved)
Definition: MLine.cpp:27
MLineN::reverse
virtual void reverse()
Definition: MLine.h:272
MLineN::setVertex
virtual void setVertex(int num, MVertex *v)
Definition: MLine.h:237
MLine3::getVertexUNV
virtual MVertex * getVertexUNV(int num)
Definition: MLine.h:163
MLine::getStringForPOS
virtual const char * getStringForPOS() const
Definition: MLine.h:79
MSH_LIN_11
#define MSH_LIN_11
Definition: GmshDefines.h:145
MElement
Definition: MElement.h:30
MLine::getType
virtual int getType() const
Definition: MLine.h:75
MLineN::getEdgeVertices
virtual void getEdgeVertices(const int num, std::vector< MVertex * > &v) const
Definition: MLine.h:248
MLineN::getVertex
virtual MVertex * getVertex(int num)
Definition: MLine.h:229
MSH_LIN_5
#define MSH_LIN_5
Definition: GmshDefines.h:106
MLine3::getNumVertices
virtual std::size_t getNumVertices() const
Definition: MLine.h:147
MLinePtrLessThan
Definition: MLine.h:289
MLine3::getTypeForUNV
virtual int getTypeForUNV() const
Definition: MLine.h:182
MElement::getTolerance
double getTolerance() const
Definition: MElement.cpp:61
MLine3::getVertexINP
virtual MVertex * getVertexINP(int num)
Definition: MLine.h:168
MLine3::getTypeForMSH
virtual int getTypeForMSH() const
Definition: MLine.h:181
MLine::getInnerRadius
virtual double getInnerRadius()
Definition: MLine.cpp:21
MLine3::getNumEdgeVertices
virtual int getNumEdgeVertices() const
Definition: MLine.h:171
IntPt
Definition: GaussIntegration.h:12
MLineN::_vs
std::vector< MVertex * > _vs
Definition: MLine.h:209
MLineN::MLineN
MLineN(const std::vector< MVertex * > &v, int num=0, int part=0)
Definition: MLine.h:219
MLine3::getNode
virtual void getNode(int num, double &u, double &v, double &w) const
Definition: MLine.h:189
MLine::getVertexInfo
virtual void getVertexInfo(const MVertex *vertex, int &ithVertex) const
Definition: MLine.h:51
z
const double z
Definition: GaussQuadratureQuad.cpp:56
MLine::MLine
MLine(MVertex *v0, MVertex *v1, int num=0, int part=0)
Definition: MLine.h:31
MLine3::getTypeForVTK
virtual int getTypeForVTK() const
Definition: MLine.h:183
MElement.h
MLineN::~MLineN
~MLineN()
Definition: MLine.h:226
MLineN::getNumEdgeVertices
virtual int getNumEdgeVertices() const
Definition: MLine.h:244
MLine::getStringForBDF
virtual const char * getStringForBDF() const
Definition: MLine.h:80
MLine::getTypeForMSH
virtual int getTypeForMSH() const
Definition: MLine.h:76
MLine::MLine
MLine(const std::vector< MVertex * > &v, int num=0, int part=0)
Definition: MLine.h:37
MLineN::getTypeForMSH
virtual int getTypeForMSH() const
Definition: MLine.h:254
MElement::getNode
virtual void getNode(int num, double &u, double &v, double &w) const
Definition: MElement.cpp:448
MLineN::MLineN
MLineN(MVertex *v0, MVertex *v1, const std::vector< MVertex * > &vs, int num=0, int part=0)
Definition: MLine.h:212
MLinePtrLessThan::operator()
bool operator()(MLine *l1, MLine *l2) const
Definition: MLine.h:290
MEdgeEqual
Definition: MEdge.h:118
MLineN::getVertex
virtual const MVertex * getVertex(int num) const
Definition: MLine.h:233
MLine3::getVertex
virtual const MVertex * getVertex(int num) const
Definition: MLine.h:152
MLine::getStringForTOCHNOG
virtual const char * getStringForTOCHNOG() const
Definition: MLine.h:84
MLine::getStringForRAD
virtual const char * getStringForRAD() const
Definition: MLine.h:83
MLinePtrEqual::operator()
bool operator()(MLine *l1, MLine *l2) const
Definition: MLine.h:298
MSH_LIN_8
#define MSH_LIN_8
Definition: GmshDefines.h:142
MLine::getNumEdgesRep
virtual int getNumEdgesRep(bool curved)
Definition: MLine.h:57
MLine3::MLine3
MLine3(const std::vector< MVertex * > &v, int num=0, int part=0)
Definition: MLine.h:139
MLine3::getStringForPOS
virtual const char * getStringForPOS() const
Definition: MLine.h:184
MLine::getLength
virtual double getLength()
Definition: MLine.cpp:23
MLine::getTypeForVTK
virtual int getTypeForVTK() const
Definition: MLine.h:78
MLine::getNode
virtual void getNode(int num, double &u, double &v, double &w) const
Definition: MLine.h:98