ug4
element_aspect_ratios.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2018: G-CSC, Goethe University Frankfurt
3  * Author: Martin Stepniewski
4  *
5  * This file is part of UG4.
6  *
7  * UG4 is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License version 3 (as published by the
9  * Free Software Foundation) with the following additional attribution
10  * requirements (according to LGPL/GPL v3 §7):
11  *
12  * (1) The following notice must be displayed in the Appropriate Legal Notices
13  * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14  *
15  * (2) The following notice must be displayed at a prominent place in the
16  * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17  *
18  * (3) The following bibliography is recommended for citation and must be
19  * preserved in all covered files:
20  * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21  * parallel geometric multigrid solver on hierarchically distributed grids.
22  * Computing and visualization in science 16, 4 (2013), 151-164"
23  * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24  * flexible software system for simulating pde based models on high performance
25  * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26  *
27  * This program is distributed in the hope that it will be useful,
28  * but WITHOUT ANY WARRANTY; without even the implied warranty of
29  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30  * GNU Lesser General Public License for more details.
31  */
32 
33 #ifndef __H__UG_ELEMENT_ASPECT_RATIOS
34 #define __H__UG_ELEMENT_ASPECT_RATIOS
35 
36 #ifdef UG_PARALLEL
38 #endif
39 
41 
42 /* system includes */
43 #include <stddef.h>
44 #include <cmath>
45 #include <stdlib.h>
46 #include <stdio.h>
47 #include <string.h>
48 #include <fstream>
49 #include <vector>
50 #include <string>
51 #include <algorithm>
52 
53 #include "lib_grid/lib_grid.h"
54 
55 
56 using namespace std;
57 
58 
59 namespace ug {
60 
61 
63 // CalculateMinTriangleHeight
65 
66 template <class TAAPosVRT>
67 number CalculateMinTriangleHeight(Face* face, TAAPosVRT& aaPos)
68 {
69  //PROFILE_FUNC();
70  if(face->num_vertices() == 3)
71  {
72  // Get type of vertex attachment in aaPos and define it as ValueType
73  typedef typename TAAPosVRT::ValueType ValueType;
74 
75  number minHeight, tmpMinHeight;
76  ValueType v = aaPos[face->vertex(2)];
77  ValueType dir;
78 
79  // Calculate start height and set to minHeight
80  VecSubtract(dir, aaPos[face->vertex(1)], aaPos[face->vertex(0)]);
81  minHeight = DistancePointToRay( v, aaPos[face->vertex(0)], dir);
82 
83  for(uint i = 1; i < 3; ++i)
84  {
85  v = aaPos[face->vertex((i+2)%3)];
86  VecSubtract(dir, aaPos[face->vertex((i+1)%3)], aaPos[face->vertex((i))]);
87  tmpMinHeight = DistancePointToRay(v, aaPos[face->vertex(i )], dir);
88 
89  if(tmpMinHeight < minHeight)
90  {
91  minHeight = tmpMinHeight;
92  }
93  }
94 
95  return minHeight;
96  }
97  else
98  UG_ASSERT(false, "Error. Face is not a triangle.");
99 
100  return NAN;
101 }
102 
103 
105 // CalculateAspectRatio
107 
109 template <class TElem, class TAAPosVRT>
110 number CalculateAspectRatio(Grid& grid, TElem* elem, TAAPosVRT& aaPos);
111 
113 template <class TAAPosVRT>
114 number CalculateAspectRatio(Grid& grid, Quadrilateral* quad, TAAPosVRT& aaPos) {
116  Vertex* const* vrts = quad->vertices();
117  box_t box(aaPos[vrts[0]], aaPos[vrts[0]]);
118  for (size_t i = 1; i < quad->num_vertices(); ++i){
119  box = box_t(box, aaPos[vrts[i]]);
120  }
121  const number xDist = box.max.x() - box.min.x();
122  const number yDist = box.max.y() - box.min.y();
123  return xDist > yDist ? xDist/yDist : yDist/xDist;
124 }
125 
127 template <class TAAPosVRT>
128 number CalculateAspectRatio(Grid& grid, Triangle* tri, TAAPosVRT& aaPos)
129 {
130  number maxEdgeLength;
131 
132  // Collect element edges, find longest edge and calculate its length
133  vector<Edge*> edges;
134  CollectAssociated(edges, grid, tri);
135  Edge* longestEdge = FindLongestEdge(edges.begin(), edges.end(), aaPos);
136  maxEdgeLength = EdgeLength(longestEdge, aaPos);
137 
138  /*
139  * optimal aspect ratio of a regular tetrahedron with edge lengths a:
140  * Q = hmin/lmax = sqrt(3)/2*a / a = 0.866...
141  *
142  * Info: return value is normalized by factor 2/sqrt(3)
143  * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002)
144  */
145 
146  // Calculate minimal triangle height
147  number minTriangleHeight = CalculateMinTriangleHeight(tri, aaPos);
148 
149  // Calculate the aspect ratio
150  return 2/std::sqrt(3.0) * minTriangleHeight / maxEdgeLength;
151 }
152 
154 template <class TAAPosVRT>
155 number CalculateAspectRatio(Grid& grid, Face* face, TAAPosVRT& aaPos)
156 {
157  switch (face->reference_object_id())
158  {
159  case ROID_TRIANGLE:
160  {
161  return CalculateAspectRatio(grid, static_cast<Triangle*>(face), aaPos);
162  }
163 
164  case ROID_QUADRILATERAL:
165  {
166  return CalculateAspectRatio(grid, static_cast<Quadrilateral*>(face), aaPos);
167  }
168 
169  default:
170  {
171  UG_THROW("Note: Currently only faces of type triangle and quadrilateral"
172  " supported in aspect ratio calculation.");
173  break;
174  }
175  }
176  return NAN;
177 }
178 
180 template <class TAAPosVRT>
181 number CalculateAspectRatio(Grid& grid, Tetrahedron* tet, TAAPosVRT& aaPos)
182 {
183  /*
184  * optimal Aspect Ratio of a regular tetrahedron with edge lengths a:
185  * Q = hmin/lmax = sqrt(2/3)*a / a = 0.8164...
186  *
187  * Info: return value is normalized by factor sqrt(3/2)
188  * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002)
189  */
190  return CalculateTetrahedronAspectRatio(grid, tet, aaPos);
191 }
192 
194 template <class TAAPosVRT>
195 number CalculateAspectRatio(Grid& grid, Hexahedron* hex, TAAPosVRT& aaPos)
196 {
197  return CalculateHexahedronAspectRatio(grid, hex, aaPos);
198 }
199 
201 template <class TAAPosVRT>
202 number CalculateAspectRatio(Grid& grid, Pyramid* pyr, TAAPosVRT& aaPos) {
203  return CalculatePyramidAspectRatio(grid, pyr, aaPos);
204 }
205 
207 template <class TAAPosVRT>
208 number CalculateAspectRatio(Grid& grid, Volume* vol, TAAPosVRT& aaPos)
209 {
210  switch (vol->reference_object_id())
211  {
212  case ROID_TETRAHEDRON:
213  {
214  return CalculateAspectRatio(grid, static_cast<Tetrahedron*>(vol), aaPos);
215  }
216 
217  case ROID_HEXAHEDRON:
218  {
219  return CalculateAspectRatio(grid, static_cast<Hexahedron*>(vol), aaPos);
220  }
221 
222  case ROID_PYRAMID:
223  {
224  return CalculateAspectRatio(grid, static_cast<Pyramid*>(vol), aaPos);
225  }
226 
227  default:
228  {
229  UG_THROW("Note: Currently only volumes of type tetrahedron, hexahedron"
230  "and pyramids supported in aspect ratio calculation.");
231  break;
232  }
233  }
234 
235  return NAN;
236 }
237 
238 
240 // CalculateVolToRMSFaceAreaRatio
242 
244 template <class TElem, class TAAPosVRT>
245 number CalculateVolToRMSFaceAreaRatio(Grid& grid, TElem* elem, TAAPosVRT& aaPos);
246 
248 template <class TAAPosVRT>
249 number CalculateVolToRMSFaceAreaRatio(Grid& grid, Face* face, TAAPosVRT& aaPos)
250 {
251  UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron"
252  " supported in volume to root-mean-square face area ratio calculation.");
253  return NAN;
254 }
255 
257 template <class TAAPosVRT>
259 {
260  //PROFILE_FUNC();
261  number ratio;
262 
263  /*
264  * optimal volume to root-mean-square face area ratio of a
265  * regular tetrahedron with edge lengths a:
266  * Q = V/A_rms^(3/2)
267  *
268  * Info: return value is normalized by factor pow(3, 7/4.0) / 2.0 / sqrt(2);
269  * (s. Shewchuk, "What is a Good Linear Element? Interpolation, Conditioning, and Quality Measures?", 2002)
270  */
271 
272  // Calculate the ratio
273  ratio = CalculateTetrahedronVolToRMSFaceAreaRatio(grid, tet, aaPos);
274 
275  return ratio;
276 }
277 
279 template <class TAAPosVRT>
280 number CalculateVolToRMSFaceAreaRatio(Grid& grid, Hexahedron* hex, TAAPosVRT& aaPos)
281 {
282  //PROFILE_FUNC();
283  number ratio;
284 
285  // Calculate the ratio
286  ratio = CalculateHexahedronVolToRMSFaceAreaRatio(grid, hex, aaPos);
287 
288  return ratio;
289 }
290 
292 template <class TAAPosVRT>
293 number CalculateVolToRMSFaceAreaRatio(Grid& grid, Volume* vol, TAAPosVRT& aaPos)
294 {
295  switch (vol->reference_object_id())
296  {
297  case ROID_TETRAHEDRON:
298  {
299  return CalculateVolToRMSFaceAreaRatio(grid, static_cast<Tetrahedron*>(vol), aaPos);
300  }
301 
302  case ROID_HEXAHEDRON:
303  {
304  return CalculateVolToRMSFaceAreaRatio(grid, static_cast<Hexahedron*>(vol), aaPos);
305  }
306 
307  default:
308  {
309  UG_THROW("CalculateVolToRMSFaceAreaRatio: Currently only volumes of type tetrahedron"
310  " supported in volume to root-mean-square face area ratio calculation.");
311  break;
312  }
313  }
314 
315  return NAN;
316 }
317 
318 
320 // FindLargestFace
321 template <class TIterator, class TAAPosVRT>
322 Face* FindLargestFace(TIterator facesBegin, TIterator facesEnd, TAAPosVRT& aaPos)
323 {
324  //PROFILE_FUNC();
325  // if facesBegin equals facesEnd, then the list is empty and we can
326  // immediately return NULL
327  if(facesBegin == facesEnd)
328  return NULL;
329 
330  // the first face is the first candidate for the smallest face.
331  Face* largestFace = *facesBegin;
332  number largestArea = FaceArea(largestFace, aaPos);
333  ++facesBegin;
334 
335  for(; facesBegin != facesEnd; ++facesBegin){
336  Face* curFace = *facesBegin;
337  number curArea = FaceArea(curFace, aaPos);
338  if(curArea > largestArea){
339  largestFace = curFace;
340  largestArea = curArea;
341  }
342  }
343 
344  return largestFace;
345 }
346 
347 
349 // FindSmallestVolumeElement
350 template <class TIterator, class TAAPosVRT>
351 typename TIterator::value_type
352 FindSmallestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT& aaPos)
353 {
354  //PROFILE_FUNC();
355 // if volumesBegin equals volumesBegin, then the list is empty and we can
356 // immediately return NULL
357  if(volumesBegin == volumesEnd)
358  return NULL;
359 
360 // Initializations
361  typename TIterator::value_type smallestVolume = *volumesBegin;
362  number smallestVolumeVolume = CalculateVolume(smallestVolume, aaPos);
363  ++volumesBegin;
364 
365 // compare all tetrahedrons and find minimal volume
366  for(; volumesBegin != volumesEnd; ++volumesBegin)
367  {
368  Volume* curVolume = *volumesBegin;
369  number curVolumeVolume = CalculateVolume(curVolume, aaPos);
370 
371  if(curVolumeVolume < smallestVolumeVolume)
372  {
373  smallestVolume = curVolume;
374  smallestVolumeVolume = curVolumeVolume;
375  }
376  }
377 
378  return smallestVolume;
379 }
380 
381 
383 // FindLargestVolumeElement
384 template <class TIterator, class TAAPosVRT>
385 typename TIterator::value_type
386 FindLargestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT& aaPos)
387 {
388  //PROFILE_FUNC();
389 // if volumesBegin equals volumesBegin, then the list is empty and we can
390 // immediately return NULL
391  if(volumesBegin == volumesEnd)
392  return NULL;
393 
394 // Initializations
395  typename TIterator::value_type largestVolume = *volumesBegin;
396  number largestVolumeVolume = CalculateVolume(largestVolume, aaPos);
397  ++volumesBegin;
398 
399 // compare all tetrahedrons and find minimal volume
400  for(; volumesBegin != volumesEnd; ++volumesBegin)
401  {
402  Volume* curVolume = *volumesBegin;
403  number curVolumeVolume = CalculateVolume(curVolume, aaPos);
404 
405  if(curVolumeVolume > largestVolumeVolume)
406  {
407  largestVolume = curVolume;
408  largestVolumeVolume = curVolumeVolume;
409  }
410  }
411 
412  return largestVolume;
413 }
414 
415 
417 // FindElementWithSmallestAspectRatio
418 template <class TIterator, class TAAPosVRT>
419 typename TIterator::value_type
420 FindElementWithSmallestAspectRatio(Grid& grid, TIterator elemsBegin,
421  TIterator elemsEnd, TAAPosVRT& aaPos)
422 {
423  //PROFILE_FUNC();
424 // if volumesBegin equals volumesBegin, then the list is empty and we can
425 // immediately return NULL
426  if(elemsBegin == elemsEnd)
427  return NULL;
428 
429 // Initializations
430  typename TIterator::value_type elementWithSmallestAspectRatio = *elemsBegin;
431  number smallestAspectRatio = CalculateAspectRatio(grid, elementWithSmallestAspectRatio, aaPos);
432  ++elemsBegin;
433 
434 // compare all tetrahedrons and find that one with minimal aspect ratio
435  for(; elemsBegin != elemsEnd; ++elemsBegin)
436  {
437  typename TIterator::value_type curElement = *elemsBegin;
438  //TElem* curElement = *elemsBegin;
439  number curSmallestAspectRatio = CalculateAspectRatio(grid, curElement, aaPos);
440 
441  if(curSmallestAspectRatio < smallestAspectRatio)
442  {
443  elementWithSmallestAspectRatio = curElement;
444  smallestAspectRatio = curSmallestAspectRatio;
445  }
446  }
447 
448  return elementWithSmallestAspectRatio;
449 }
450 
451 
453 // FindElementWithLargestAspectRatio
454 template <class TIterator, class TAAPosVRT>
455 typename TIterator::value_type
456 FindElementWithLargestAspectRatio(Grid& grid, TIterator elemsBegin,
457  TIterator elemsEnd, TAAPosVRT& aaPos)
458 {
459  //PROFILE_FUNC();
460 // if volumesBegin equals volumesBegin, then the list is empty and we can
461 // immediately return NULL
462  if(elemsBegin == elemsEnd)
463  return NULL;
464 
465 // Initializations
466  typename TIterator::value_type elementWithLargestAspectRatio = *elemsBegin;
467  number largestAspectRatio = CalculateAspectRatio(grid, elementWithLargestAspectRatio, aaPos);
468  ++elemsBegin;
469 
470 // compare all tetrahedrons and find that one with maximal aspect ratio
471  for(; elemsBegin != elemsEnd; ++elemsBegin)
472  {
473  typename TIterator::value_type curElement = *elemsBegin;
474  //TElem* curElement = *elemsBegin;
475  number curSmallestAspectRatio = CalculateAspectRatio(grid, curElement, aaPos);
476 
477  if(curSmallestAspectRatio > largestAspectRatio)
478  {
479  elementWithLargestAspectRatio = curElement;
480  largestAspectRatio = curSmallestAspectRatio;
481  }
482  }
483 
484  return elementWithLargestAspectRatio;
485 }
486 
487 
489 // FindElementWithSmallestVolToRMSFaceAreaRatio
490 template <class TIterator, class TAAPosVRT>
491 typename TIterator::value_type
493  TIterator elemsEnd, TAAPosVRT& aaPos)
494 {
495  //PROFILE_FUNC();
496 // if volumesBegin equals volumesBegin, then the list is empty and we can
497 // immediately return NULL
498  if(elemsBegin == elemsEnd)
499  return NULL;
500 
501 // Initializations
502  typename TIterator::value_type elementWithSmallestRatio = *elemsBegin;
503  number smallestRatio = CalculateVolToRMSFaceAreaRatio(grid, elementWithSmallestRatio, aaPos);
504  ++elemsBegin;
505 
506 // compare all tetrahedrons and find that one with minimal aspect ratio
507  for(; elemsBegin != elemsEnd; ++elemsBegin)
508  {
509  typename TIterator::value_type curElement = *elemsBegin;
510  //TElem* curElement = *elemsBegin;
511  number curSmallestRatio = CalculateVolToRMSFaceAreaRatio(grid, curElement, aaPos);
512 
513  if(curSmallestRatio < smallestRatio)
514  {
515  elementWithSmallestRatio = curElement;
516  smallestRatio = curSmallestRatio;
517  }
518  }
519 
520  return elementWithSmallestRatio;
521 }
522 
523 
525 // FindElementWithLargestVolToRMSFaceAreaRatio
526 template <class TIterator, class TAAPosVRT>
527 typename TIterator::value_type
529  TIterator elemsEnd, TAAPosVRT& aaPos)
530 {
531  //PROFILE_FUNC();
532 // if volumesBegin equals volumesBegin, then the list is empty and we can
533 // immediately return NULL
534  if(elemsBegin == elemsEnd)
535  return NULL;
536 
537 // Initializations
538  typename TIterator::value_type elementWithLargestRatio = *elemsBegin;
539  number largestRatio = CalculateVolToRMSFaceAreaRatio(grid, elementWithLargestRatio, aaPos);
540  ++elemsBegin;
541 
542 // compare all tetrahedrons and find that one with maximal aspect ratio
543  for(; elemsBegin != elemsEnd; ++elemsBegin)
544  {
545  typename TIterator::value_type curElement = *elemsBegin;
546  //TElem* curElement = *elemsBegin;
547  number curSmallestRatio = CalculateVolToRMSFaceAreaRatio(grid, curElement, aaPos);
548 
549  if(curSmallestRatio > largestRatio)
550  {
551  elementWithLargestRatio = curElement;
552  largestRatio = curSmallestRatio;
553  }
554  }
555 
556  return elementWithLargestRatio;
557 }
558 }
559 #endif
virtual Face::ConstVertexArray vertices() const
Definition: grid_objects_2d.h:266
virtual size_t num_vertices() const
Definition: grid_objects_2d.h:267
Base-class for edges.
Definition: grid_base_objects.h:397
Faces are 2-dimensional objects.
Definition: grid_base_objects.h:510
virtual ReferenceObjectID reference_object_id() const
Definition: grid_base_objects.h:550
virtual Vertex * vertex(size_t index) const
Definition: grid_base_objects.h:486
virtual size_t num_vertices() const
Definition: grid_base_objects.h:488
Manages the elements of a grid and their interconnection.
Definition: grid.h:132
A volume element with 6 quadrilateral sides.
Definition: grid_objects_3d.h:227
A volume element with 4 triangle and 1 quadrilateral sides.
Definition: grid_objects_3d.h:493
a face with four points.
Definition: grid_objects_2d.h:323
the most simple volume-element.
Definition: grid_objects_3d.h:91
the most simple form of a face
Definition: grid_objects_2d.h:174
Base-class for all vertex-types.
Definition: grid_base_objects.h:231
Volumes are 3-dimensional objects.
Definition: grid_base_objects.h:754
virtual ReferenceObjectID reference_object_id() const
Definition: grid_base_objects.h:927
static number FaceArea(TDomain &dom, ISubsetHandler &sh, int si, size_t lvl)
Definition: domain_bridge.cpp:262
UG_API number EdgeLength(const EdgeVertices *e, TAAPosVRT &aaPos)
Calculates the length of the given edge.
Definition: edge_util_impl.hpp:80
UG_API void CollectAssociated(std::vector< Vertex * > &vVertexOut, Grid &grid, GridObject *obj, bool clearContainer=true)
Definition: grid_util_impl.hpp:169
number CalculateVolume(Volume *elem, TAAPos aaPos)
Calculates the volume of the given element.
Definition: volume_calculation_impl.hpp:43
UG_API number CalculateHexahedronVolToRMSFaceAreaRatio(Grid &grid, Hexahedron *hex, Grid::VertexAttachmentAccessor< APosition > &aaPos)
Definition: volume_util.cpp:313
UG_API number CalculateTetrahedronVolToRMSFaceAreaRatio(Grid &grid, Tetrahedron *tet, Grid::VertexAttachmentAccessor< APosition > &aaPos)
Definition: volume_util.cpp:285
number CalculatePyramidAspectRatio(Grid &grid, Pyramid *pyr, Grid::VertexAttachmentAccessor< AVector3 > &aaPos)
calculates the aspect ratio of a pyramidal element Pyramid aspect ratio (AR) is the ratio of the heig...
Definition: volume_util.cpp:228
number CalculateHexahedronAspectRatio(Grid &grid, Hexahedron *hex, Grid::VertexAttachmentAccessor< AVector3 > &aaPos)
calculates the aspect ratio of a hexahedral element
Definition: volume_util.cpp:171
number CalculateTetrahedronAspectRatio(Grid &grid, Tetrahedron *tet, Grid::VertexAttachmentAccessor< AVector3 > &aaPos)
calculates the aspect ratio of a tetrahedral element
Definition: volume_util.cpp:138
#define UG_ASSERT(expr, msg)
Definition: assert.h:70
#define UG_THROW(msg)
Definition: error.h:57
unsigned int uint
Definition: types.h:114
double number
Definition: types.h:124
number DistancePointToRay(const vector_t &v, const vector_t &from, const vector_t &dir)
calculates the distance of a point to a ray
Definition: math_util_impl.hpp:225
void VecSubtract(vector_t &vOut, const vector_t &v1, const vector_t &v2)
subtracts v2 from v1 and stores the result in a vOut
Definition: math_vector_functions_common_impl.hpp:226
Definition: smart_pointer.h:814
the ug namespace
TIterator::value_type FindElementWithLargestVolToRMSFaceAreaRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:528
TIterator::value_type FindElementWithSmallestVolToRMSFaceAreaRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:492
@ ROID_TETRAHEDRON
Definition: grid_base_objects.h:80
@ ROID_QUADRILATERAL
Definition: grid_base_objects.h:79
@ ROID_PYRAMID
Definition: grid_base_objects.h:83
@ ROID_HEXAHEDRON
Definition: grid_base_objects.h:81
@ ROID_TRIANGLE
Definition: grid_base_objects.h:78
Edge * FindLongestEdge(TEdgeIterator edgesBegin, TEdgeIterator edgesEnd, TAAPosVRT &aaPos)
Definition: edge_util_impl.hpp:332
number CalculateVolToRMSFaceAreaRatio(Grid &grid, Volume *vol, TAAPosVRT &aaPos)
Volume.
Definition: element_aspect_ratios.h:293
TIterator::value_type FindLargestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:386
TIterator::value_type FindElementWithSmallestAspectRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:420
TIterator::value_type FindSmallestVolume(TIterator volumesBegin, TIterator volumesEnd, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:352
TIterator::value_type FindElementWithLargestAspectRatio(Grid &grid, TIterator elemsBegin, TIterator elemsEnd, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:456
number CalculateAspectRatio(Grid &grid, Volume *vol, TAAPosVRT &aaPos)
Volume.
Definition: element_aspect_ratios.h:208
Face * FindLargestFace(TIterator facesBegin, TIterator facesEnd, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:322
number CalculateMinTriangleHeight(Face *face, TAAPosVRT &aaPos)
Definition: element_aspect_ratios.h:67
T value_type
Definition: sparsematrix_interface.h:2
Definition: shapes.h:60