NeoPZ
pzhyperplane.cpp
Go to the documentation of this file.
1 
6 #include "pzhyperplane.h"
7 
8 #include "pzgeoel.h"
9 #include "pzgmesh.h"
10 #include "pzgeoelrefless.h"
11 #include "pzlog.h"
12 #include "pzfmatrix.h"
13 #include "pzvec_extras.h"
14 #include "pznumeric.h"
15 
16 #include <iostream>
17 #include <sstream>
18 
19 #ifdef LOG4CXX
20 static LoggerPtr logger(Logger::getLogger("pz.pre.pzhyperplane"));
21 #endif
22 
23 // verify if the element is not warped
24 static void CheckElement(TPZGeoEl *gel);
25 
27 void TPZHyperPlaneIntersect::Intersect(TPZGeoMesh &inputmesh, const TPZHyperPlane &plane, TPZGeoMesh &targetmesh)
28 {
29  // data structure for keeping the correspondence between the edges and the intersecting node
30  typedef std::map<std::pair<int64_t, int64_t>, int64_t> midsidetype;
31  midsidetype midsidenodes;
32 
33  int64_t nelem = inputmesh.NElements();
34  for (int64_t iel = 0; iel<nelem ; iel++)
35  {
36  TPZGeoEl *gel = inputmesh.ElementVec()[iel];
37  // we only consider leaf elements
38  if (gel->HasSubElement()) {
39  continue;
40  }
41  // loop over the sides
42  int nsides = gel->NSides();
43  for (int is=0; is<nsides; is++) {
44  // we only consider ribs
45  if (gel->SideDimension(is) != 1) {
46  continue;
47  }
48  TPZGeoElSide gelside(gel,is);
49  TPZManVector<int64_t,2> sidenodeindexes(2);
50  sidenodeindexes[0] = gel->SideNodeIndex(is, 0);
51  sidenodeindexes[1] = gel->SideNodeIndex(is, 1);
52  // order the side
53  if (sidenodeindexes[0] > sidenodeindexes[1]) {
54  int64_t temp = sidenodeindexes[0];
55  sidenodeindexes[0] = sidenodeindexes[1];
56  sidenodeindexes[1] = temp;
57  }
58  std::pair<int64_t, int64_t> nodepair(sidenodeindexes[0],sidenodeindexes[1]);
59  // verify if this pair was already identified
60  if (midsidenodes.find(nodepair) != midsidenodes.end()) {
61  continue;
62  }
63  TPZManVector<REAL,3> x0(3),x1(3);
64  inputmesh.NodeVec()[sidenodeindexes[0]].GetCoordinates(x0);
65  inputmesh.NodeVec()[sidenodeindexes[1]].GetCoordinates(x1);
66  bool left0 = plane.IsLeft(x0);
67  bool left1 = plane.IsLeft(x1);
68  if (left0 != left1) {
69  // we found a new edge
70  REAL param = EdgeIntersect(gelside, plane);
71  TPZManVector<REAL,1> par(1,param);
72  TPZManVector<REAL, 3> xnew(3);
73  gelside.X(par, xnew);
74  int64_t newnode = targetmesh.NodeVec().AllocateNewElement();
75  targetmesh.NodeVec()[newnode].Initialize(xnew, targetmesh);
76  midsidenodes[nodepair] = newnode;
77  }
78  }
79  }
80  // at this point we have create a "cloud" of point intersecting the plane
81 
82  // now we will create the elements
83  for (int64_t iel = 0; iel<nelem ; iel++)
84  {
85  TPZGeoEl *gel = inputmesh.ElementVec()[iel];
86  // we only consider leaf elements
87  if (gel->HasSubElement()) {
88  continue;
89  }
90  if (gel->Dimension() != 3) {
91  continue;
92  }
93  // loop over the sides
94  int nsides = gel->NSides();
96  for (int is=0; is<nsides; is++) {
97  // we only consider ribs
98  if (gel->SideDimension(is) != 1) {
99  continue;
100  }
101  TPZGeoElSide gelside(gel,is);
102  TPZManVector<int64_t,2> sidenodeindexes(2);
103  sidenodeindexes[0] = gel->SideNodeIndex(is, 0);
104  sidenodeindexes[1] = gel->SideNodeIndex(is, 1);
105  // order the side
106  if (sidenodeindexes[0] > sidenodeindexes[1]) {
107  int64_t temp = sidenodeindexes[0];
108  sidenodeindexes[0] = sidenodeindexes[1];
109  sidenodeindexes[1] = temp;
110  }
111  std::pair<int64_t, int64_t> nodepair(sidenodeindexes[0],sidenodeindexes[1]);
112  // verify if this pair was already identified
113  if (midsidenodes.find(nodepair) == midsidenodes.end()) {
114  continue;
115  }
116  sidenodepair.Push(std::pair<int64_t,int64_t>(is,midsidenodes[nodepair]));
117  }
118  // if the element has no intersecting sides, there is nothing to do
119  if (sidenodepair.size() == 0) {
120  continue;
121  }
122  if (sidenodepair.size() == 3) {
123  TPZManVector<int64_t,3> nodeindices(3);
124  for (int i=0; i<3; i++) {
125  nodeindices[i] = sidenodepair[i].second;
126  }
127  // we should create an element with 3 nodes
128  new TPZGeoElRefLess<pzgeom::TPZGeoTriangle>(nodeindices,1,targetmesh);
129  }
130  else if (sidenodepair.size() == 4)
131  {
132 #ifdef LOG4CXX
133  if (logger->isDebugEnabled()) {
134  std::stringstream sout;
135  sout << "Corner coords\n";
136  TPZManVector<int64_t,4> isleft(gel->NNodes());
137  for (int i=0; i<gel->NNodes(); i++) {
138  TPZManVector<REAL,3> x(3,0.), jac(3,0.);
139  REAL distance;
140  gel->NodePtr(i)->GetCoordinates(x);
141  isleft[i] = plane.IsLeft(x);
142  distance = plane.Distance(x, jac);
143  sout << x << " distance " << distance << " isleft " << isleft[i] << std::endl;
144  }
145  LOGPZ_DEBUG(logger, sout.str())
146  }
147 #endif
148  Reorder(gel, targetmesh, sidenodepair);
149 
150 
151 #ifdef LOG4CXX
152  if (logger->isDebugEnabled()) {
153  std::stringstream sout;
154  // identify the X coordinates in the new order
156  for (int i=0; i<4; i++) {
157  XNodes[i].Resize(3, 0.);
158  targetmesh.NodeVec()[sidenodepair[i].second].GetCoordinates(XNodes[i]);
159  sout << "Node " << i << " coordinate " << XNodes[i] << std::endl;
160  }
161  LOGPZ_DEBUG(logger, sout.str())
162  }
163 #endif
164 
165  TPZManVector<int64_t,4> nodeindices(4);
166  for (int i=0; i<4; i++) {
167  nodeindices[i] = sidenodepair[i].second;
168  }
169  // create a quadrilateral or 2 triangles
170  TPZGeoEl *gelnew = new TPZGeoElRefLess<pzgeom::TPZGeoQuad>(nodeindices,1,targetmesh);
171  CheckElement(gelnew);
172  }
173  else {
174  int centerindex = ReorderGeneral(targetmesh, sidenodepair);
175 #ifdef LOG4CXX
176  if (logger->isDebugEnabled()) {
177  std::stringstream sout;
178  sout << "cornercoordinates\n";
179  int nc = gel->NCornerNodes();
180  for (int ic=0; ic<nc; ic++) {
182  gel->NodePtr(ic)->GetCoordinates(x);
183  sout << "node " << ic << ' ' << x << std::endl;
184  }
185  sout << "Intersection coordinates\n";
186  int64_t sz = sidenodepair.size();
187  // identify the X coordinates in the new order
188  TPZManVector<TPZManVector<REAL,3>,6> XNodes(sz);
189  for (int64_t i=0; i<sz; i++) {
190  XNodes[i].Resize(3, 0.);
191  targetmesh.NodeVec()[sidenodepair[i].second].GetCoordinates(XNodes[i]);
192  sout << "Node " << i << " side " << sidenodepair[i].first << " coordinate " << XNodes[i] << std::endl;
193  }
194  LOGPZ_DEBUG(logger, sout.str())
195  }
196 #endif
197  int64_t numnodes = sidenodepair.size();
198  for (int64_t in=0; in<numnodes; in++) {
199  TPZManVector<int64_t,3> nodeindices(3);
200  nodeindices[0] = centerindex;
201  nodeindices[1] = sidenodepair[in].second;
202  nodeindices[2] = sidenodepair[(in+1)%numnodes].second;
203  // we should create an element with 3 nodes
204  new TPZGeoElRefLess<pzgeom::TPZGeoTriangle>(nodeindices,1,targetmesh);
205  }
206  //DebugStop();
207  std::cout << "caso com " << sidenodepair.size() << " nos " << std::endl;
208  }
209  }
210  targetmesh.BuildConnectivity();
211 }
212 
215 {
216  TPZManVector<REAL, 1> edgeparam(1,0.);
217  TPZManVector<REAL,3> planejac(3), X(3);
218  gelside.X(edgeparam, X);
219  REAL distance = plane.Distance(X,planejac);
220  int niter = 0;
221  while (std::abs(distance) > 1.e-6 && niter < 5) {
222  TPZFNMatrix<1,REAL> edgejac(1,1), jacinv(1,1);
223  TPZFNMatrix<3,REAL> axes(1,3);
224  REAL detjac;
225  gelside.Jacobian(edgeparam,edgejac, axes, detjac, jacinv);
226  REAL inner = 0;
227  for (int i=0; i<3; i++) {
228  inner += axes(0,i)*planejac[i];
229  }
230  edgeparam[0] -= jacinv(0,0)*distance/inner;
231  gelside.X(edgeparam, X);
232  distance = plane.Distance(X, planejac);
233  niter++;
234  }
235  if (niter == 5) {
236  DebugStop();
237  }
238  return edgeparam[0];
239 }
240 
241 void TPZHyperPlaneIntersect::Reorder(TPZGeoEl *gel, TPZGeoMesh &target, TPZVec<std::pair<int64_t,int64_t> > &sidenodepair)
242 {
243  if (sidenodepair.size() != 4) {
244  // method is only made for reordering 4 nodes
245  // the methodology could be extended - ask me (philippe)
246  DebugStop();
247  }
248 #ifdef LOG4CXX
249  if (logger->isDebugEnabled()) {
250  std::stringstream sout;
251  gel->Print(sout);
252  // identify the X coordinates in the new order
254  for (int i=0; i<4; i++) {
255  XNodes[i].Resize(3, 0.);
256  target.NodeVec()[sidenodepair[i].second].GetCoordinates(XNodes[i]);
257  sout << "Node " << i << " coordinate " << XNodes[i] << std::endl;
258  }
259  LOGPZ_DEBUG(logger, sout.str())
260  }
261 #endif
262  TPZManVector<std::pair<int64_t, int64_t> > locnodes(4);
263  // look for the best permutation of the first three nodes to form a quadrilateral
264  for (int perm=0; perm<3; perm++) {
265  // permute the nodes
266  for (int i=0; i<3; i++) {
267  locnodes[(i+perm)%3] = sidenodepair[i];
268  }
269  locnodes[3] = sidenodepair[3];
270 
271  // identify the X coordinates in the new order
273  for (int i=0; i<4; i++) {
274  XNodes[i].Resize(3, 0.);
275  target.NodeVec()[locnodes[i].second].GetCoordinates(XNodes[i]);
276  }
277  // identify the vector corresponding to the second and third edge
278  TPZManVector<REAL,3> vecedge1(3),vecedge2(3,0.),vecedge3(3,0.), normaltri(3),vecpoint3(3),normaledge3(3);
279  vecedge1 = XNodes[1]-XNodes[0];
280  vecedge2 = XNodes[2]-XNodes[1];
281  vecedge3 = XNodes[0]-XNodes[2];
282  vecpoint3 = XNodes[3]-XNodes[2];
283  TPZNumeric::ProdVetorial(vecedge2, vecedge3, normaltri);
284  TPZNumeric::ProdVetorial(vecedge3, normaltri, normaledge3);
285  REAL inner = 0;
286  for (int i=0; i<3; i++) {
287  inner += vecpoint3[i]*normaledge3[i];
288  }
289  REAL normvecpoint3 = TPZNumeric::Norm(vecpoint3);
290  REAL normvecedge1 = TPZNumeric::Norm(vecedge1);
291  if (inner > 1.e-10 || normvecpoint3 < 1.e-8 || normvecedge1 < 1.e-8) {
292  // FOUND the orientation!!!
293 #ifdef LOG4CXX
294  if (logger->isDebugEnabled()) {
295  std::stringstream sout;
296  sout << "Permutation = " << perm << std::endl;
297  sout << "vecpoint3 " << vecpoint3 << std::endl;
298  sout << "vecedge1 " << vecedge1 << std::endl;
299  sout << "vecedge2 " << vecedge2 << std::endl;
300  sout << "vecedge3 " << vecedge3 << std::endl;
301  sout << "normaledge3 " << normaledge3 << std::endl;
302  sout << "inner " << inner << " normvecpoint3 " << normvecpoint3 << " normvecedge1 " << normvecedge1 << std::endl;
303  sout << "locnodes " << locnodes << std::endl;
304  sout << "sidenodepair = " << sidenodepair << std::endl;
305  LOGPZ_DEBUG(logger, sout.str())
306  }
307 #endif
308  sidenodepair = locnodes;
309  return;
310  }
311  }
312  // couldnt find any
313  DebugStop();
314 }
315 
316 // verify if the element is not warped
318 {
319  TPZManVector<TPZManVector<REAL,3>, 4> normals(4);
320  TPZFNMatrix<16,REAL> inner(4,4);
321  for (int node=0; node<4; node++) {
322  TPZFNMatrix<6,REAL> axes(2,3);
323  TPZFNMatrix<4,REAL> jac(2,2),jacinv(2,2);
324  TPZTransform<> tr(0,2);
325  tr = gel->SideToSideTransform(node, 8);
326  TPZManVector<REAL,2> pt0(0),ptnode(2);
327  tr.Apply(pt0, ptnode);
328  REAL detjac;
329  gel->Jacobian(ptnode, jac, axes, detjac, jacinv);
330  normals[node].Resize(3,0.);
331  if (fabs(detjac) < 1.e-10) {
332  continue;
333  }
334  TPZManVector<REAL,3> ax0(3),ax1(3);
335  for (int i=0; i<3; i++) {
336  ax0[i] = axes(0,i);
337  ax1[i] = axes(1,i);
338  }
339  TPZNumeric::ProdVetorial(ax0, ax1, normals[node]);
340  }
341  for (int i=0; i<4; i++) {
342  for (int j=0; j<4; j++) {
343  inner(i,j)= 0.;
344  for (int k=0; k<3; k++) {
345  inner(i,j) += normals[i][k]*normals[j][k];
346  }
347  }
348  }
349  for (int i=0; i<4; i++) {
350  for (int j=0; j<4; j++) {
351  if (inner(i,j) < 0.) {
352  inner.Print("inner");
353  DebugStop();
354  }
355  }
356  }
357 }
358 
360 int TPZHyperPlaneIntersect::ReorderGeneral(TPZGeoMesh &target, TPZVec<std::pair<int64_t,int64_t> > &sidenodepair)
361 {
362  int64_t numnodes = sidenodepair.size();
363 #ifdef LOG4CXX
364  if (logger->isDebugEnabled()) {
365  std::stringstream sout;
366  // identify the X coordinates in the new order
367  TPZManVector<TPZManVector<REAL,3>,8> XNodes(numnodes);
368  for (int64_t i=0; i<numnodes; i++) {
369  XNodes[i].Resize(3, 0.);
370  target.NodeVec()[sidenodepair[i].second].GetCoordinates(XNodes[i]);
371  sout << "Node " << i << " coordinate " << XNodes[i] << std::endl;
372  }
373  LOGPZ_DEBUG(logger, sout.str())
374  }
375 #endif
376  // compute the center coordinate
377  TPZManVector<REAL,3> center(3,0.);
378  TPZManVector<TPZManVector<REAL,3>,8> XNodes(numnodes);
379  for (int64_t i=0; i<numnodes; i++) {
380  XNodes[i].Resize(3, 0.);
381  target.NodeVec()[sidenodepair[i].second].GetCoordinates(XNodes[i]);
382  for (int j=0; j<3; j++) {
383  center[j] += XNodes[i][j]/numnodes;
384  }
385  }
386  int64_t centerindex = target.NodeVec().AllocateNewElement();
387  target.NodeVec()[centerindex].Initialize(center, target);
388  // compute the normal to the plane formed by the points
389  TPZFNMatrix<100,REAL> normalnorm(numnodes,numnodes,0.);
390  int imax=0, jmax = 0, maxnorm = 0.;
391 
392  for (int64_t in=0; in < numnodes; in++) {
393  TPZManVector<REAL,3> veci(3);
394  veci = XNodes[in]-center;
396  for (int64_t jn=0; jn<numnodes; jn++) {
397  TPZManVector<REAL,3> vecj(3), vecprod(3);
398  vecj = XNodes[jn]-center;
400  TPZNumeric::ProdVetorial(veci, vecj, vecprod);
401  REAL vecprodnorm = TPZNumeric::Norm(vecprod);
402  normalnorm(in,jn) = vecprodnorm;
403  if (vecprodnorm > maxnorm) {
404  maxnorm = vecprodnorm;
405  imax = in;
406  jmax = jn;
407  }
408  }
409  }
410  // compute the normal with imax,jmax
411  TPZManVector<REAL,3> veci(3),vecj(3), vecprod(3);
412  veci = XNodes[imax]-center;
413  vecj = XNodes[jmax]-center;
416  TPZNumeric::ProdVetorial(veci, vecj, vecprod);
418  TPZNumeric::ProdVetorial(vecj, vecprod, veci);
419  // compute the theta angles for each node
420  TPZManVector<REAL,20> angles(numnodes);
421  for (int64_t in=0; in<numnodes; in++) {
422  REAL x(0.),y(0.);
423  TPZManVector<REAL,3> vecnod(3);
424  vecnod = XNodes[in]-center;
425  for (int i=0; i<3; i++) {
426  x += veci[i]*vecnod[i];
427  y += vecj[i]*vecnod[i];
428  }
429  angles[in] = atan2(x, y);
430  }
431 
432  // ordena os nos de acordo com os angulos
433  std::multimap<REAL, std::pair<int64_t,int64_t> > ordered;
434  for (int64_t in=0; in<numnodes; in++) {
435  ordered.insert(std::pair<REAL,std::pair<int64_t,int64_t> >(angles[in],sidenodepair[in]));
436  }
437  std::multimap<REAL, std::pair<int64_t,int64_t> >::iterator it;
438  int64_t count = 0;
439  for (it=ordered.begin(); it!= ordered.end(); it++) {
440  sidenodepair[count] = it->second;
441  count++;
442  }
443  return centerindex;
444 }
virtual int64_t SideNodeIndex(int side, int nodenum) const =0
Returns the index of the nodenum node of side.
TPZFlopCounter atan2(const TPZFlopCounter &val1, const TPZFlopCounter &val2)
Returns the arc tangent in radians and increments the counter of the Arc Tangent. ATAN2 returns the ...
Definition: pzreal.h:544
expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ fabs
Definition: tfadfunc.h:140
int AllocateNewElement()
Makes more room for new elements.
Definition: pzadmchunk.h:184
TPZGeoNode * NodePtr(int i) const
Returns a pointer to the ith node of the element.
Definition: pzgeoel.cpp:2566
Contains definitions to LOGPZ_DEBUG, LOGPZ_INFO, LOGPZ_WARN, LOGPZ_ERROR and LOGPZ_FATAL, and the implementation of the inline InitializePZLOG(string) function using log4cxx library or not. It must to be called out of "#ifdef LOG4CXX" scope.
Contains declaration of TPZGeoElRefLess class which implements the mapping between the master element...
Implements a vector class which allows to use external storage provided by the user. Utility.
Definition: pzquad.h:16
virtual int NCornerNodes() const =0
Returns the number of corner nodes of the element.
int64_t NElements() const
Number of elements of the mesh.
Definition: pzgmesh.h:129
Utility class which represents an element with its side. The Geometric approximation classes Geometry...
Definition: pzgeoelside.h:83
Implements the mapping between the master element and deformed element. Geometry. ...
TinyFad< 8, T > abs(const TinyFad< 8, T > &in)
Definition: tinyfadeight.h:846
This class implements a simple vector storage scheme for a templated class T. Utility.
Definition: pzgeopoint.h:19
void Reorder(TPZGeoEl *gel, TPZGeoMesh &target, TPZVec< std::pair< int64_t, int64_t > > &sidenodepair)
reorder the nodes to form a convex figure
virtual int NSides() const =0
Returns the number of connectivities of the element.
virtual int SideDimension(int side) const =0
Return the dimension of side.
virtual void Resize(const int64_t newsize, const T &object)
Resizes the vector object.
Definition: pzmanvector.h:426
static void NormalizeVetor3(TPZVec< Tvar > &vetor)
Normalizes the vector with 3 elements.
Definition: pznumeric.cpp:26
static void ProdVetorial(TPZVec< Tvar > &u, TPZVec< Tvar > &v, TPZVec< Tvar > &result)
Computes the vectorial product u x v.
Definition: pznumeric.cpp:96
static void CheckElement(TPZGeoEl *gel)
int64_t size() const
Returns the number of elements of the vector.
Definition: pzvec.h:196
Contains declaration of TPZMesh class which defines a geometrical mesh and contains a corresponding l...
void Push(const T object)
Pushes a copy of the object on the stack.
Definition: pzstack.h:80
Defines the behaviour of all geometric elements. GeometryTPZGeoEl is the common denominator for all g...
Definition: pzgeoel.h:43
Contains TPZMatrixclass which implements full matrix (using column major representation).
#define DebugStop()
Returns a message to user put a breakpoint in.
Definition: pzerror.h:20
#define LOGPZ_DEBUG(A, B)
Define log for debug info.
Definition: pzlog.h:87
void X(TPZVec< REAL > &loc, TPZVec< REAL > &result) const
X coordinate of a point loc of the side.
Contains the TPZReadMeshHR class which reads a mesh in a "human readable" format. ...
void Jacobian(TPZVec< REAL > &qsi, TPZFMatrix< REAL > &jac, TPZFMatrix< REAL > &axes, REAL &detjac, TPZFMatrix< REAL > &jacinv) const
Compute a decomposition of the gradient of the mapping function, as a rotation matrix (Jacobian) and ...
Definition: pzgeoel.cpp:1144
TPZAdmChunkVector< TPZGeoNode > & NodeVec()
Definition: pzgmesh.h:140
void Intersect(TPZGeoMesh &input, const TPZHyperPlane &plane, TPZGeoMesh &target)
Compute the intersection of the geometric mesh with the plane (only leaf elements) ...
bool IsLeft(TPZVec< REAL > &point) const
Definition: pzhyperplane.h:49
REAL Distance(const TPZVec< REAL > &point, TPZVec< REAL > &jacobian) const
Definition: pzhyperplane.h:58
virtual int HasSubElement() const =0
Return 1 if the element has subelements.
virtual int NNodes() const =0
Returns the number of nodes of the element.
void BuildConnectivity()
Build the connectivity of the grid.
Definition: pzgmesh.cpp:967
virtual int Dimension() const =0
Returns the dimension of the element.
virtual TPZTransform< REAL > SideToSideTransform(int sidefrom, int sideto)=0
Compute the transformation between the master element space of one side of an element to the master e...
int ReorderGeneral(TPZGeoMesh &target, TPZVec< std::pair< int64_t, int64_t > > &sidenodepair)
a version which allows for more than 4 nodes
static Tvar Norm(const TPZVec< Tvar > &vetor)
Returns the L2-norm of the vector.
Definition: pznumeric.cpp:16
This class implements a geometric mesh for the pz environment. Geometry.
Definition: pzgmesh.h:48
This class implements a stack object. Utility.
Definition: pzcheckmesh.h:14
void Jacobian(TPZVec< REAL > &param, TPZFMatrix< REAL > &jacobian, TPZFMatrix< REAL > &axes, REAL &detjac, TPZFMatrix< REAL > &jacinv) const
Jacobian associated with the side of the element.
virtual void Print(std::ostream &out) const
Definition: pzmatrix.h:253
Implements an affine transformation between points in parameter space. Topology Utility.
Definition: pzmganalysis.h:14
Extra utilities for TPZVec. Implementations of the saxpy, sscal, sdot, intercept, max and min functio...
void GetCoordinates(TPZVec< REAL > &co)
Fill the coordinates of the node.
Definition: pzgnode.cpp:83
Reads a mesh in a "human readable" format, i.e. in text format and with coments. Getting Data...
Definition: pzhyperplane.h:33
virtual void Print(std::ostream &out=std::cout)
Print all relevant data of the element to cout.
Definition: pzgeoel.cpp:238
Contains declaration of the TPZNumeric class which implements several methods to calculation.
void Apply(TPZVec< T > &vectorin, TPZVec< T > &vectorout)
Transforms the vector.
Definition: pztrnsform.cpp:121
Non abstract class which implements full matrices with preallocated storage with (N+1) entries...
Definition: pzfmatrix.h:716
REAL EdgeIntersect(const TPZGeoElSide &gelside, const TPZHyperPlane &plane)
Compute the intersection between the edge and the plane.
TPZAdmChunkVector< TPZGeoEl * > & ElementVec()
Methods for handling pzlists.
Definition: pzgmesh.h:138