libMesh
Loading...
Searching...
No Matches
face.C
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4// This library is free software; you can redistribute it and/or
5// modify it under the terms of the GNU Lesser General Public
6// License as published by the Free Software Foundation; either
7// version 2.1 of the License, or (at your option) any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Lesser General Public License for more details.
13
14// You should have received a copy of the GNU Lesser General Public
15// License along with this library; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18// Local includes
19#include "libmesh/face.h"
20#include "libmesh/int_range.h"
21#include "libmesh/point.h"
22
23
24// We'd like reproduceability in our quasi-circumcenter calculations,
25// because different FP rounding can lead to different triangle
26// splitting decisions
27#include "libmesh/enforce_ieee754.h"
28
29
30namespace libMesh
31{
32
34{
35 const Point p0 = this->point(0);
36
37 // We have to use vertex-polygon area rather than real area if we
38 // want this to be consistent for faces with curved edges
39 Real total_area = 0;
40 Point weighted_cc_sum;
41
42 for (auto v : make_range(2u, this->n_vertices()))
43 {
44 const Point p1 = this->point(v-1);
45 const Point p2 = this->point(v);
46
47 const Point a = p1-p0;
48 const Point b = p2-p0;
49 const Point axb = a.cross(b);
50 const Real norm2_axb = axb.norm_sq();
51 const Real area = sqrt(norm2_axb)/2;
52
53 const Point cc_minus_p0 = ((a.norm_sq() * b - b.norm_sq() * a).cross(axb)) / 2 / norm2_axb;
54
55 weighted_cc_sum += area*cc_minus_p0;
56 total_area += area;
57 }
58
59 weighted_cc_sum /= total_area;
60 weighted_cc_sum += p0;
61
62 return weighted_cc_sum;
63}
64
65} // namespace libMesh
66 //
67
68// Unnecessary at end of file, *except* maybe we'll do a unity build
69// someday, and in the meantime test coverage is nice.
70#include "libmesh/restore_ieee754.h"
virtual unsigned int n_vertices() const =0
const Point & point(const unsigned int i) const
Definition elem.h:2462
virtual Point quasicircumcenter() const override
Definition face.C:33
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition point.h:40
auto norm_sq() const
TypeVector< typename CompareTypes< T, T2 >::supertype > cross(const TypeVector< T2 > &v) const
static const Real b
The libMesh namespace provides an interface to certain functionality in the library.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition int_range.h:176