libMesh
face.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2025 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 // C++ includes
24 
25 
26 namespace libMesh
27 {
28 
30 {
31  const Point p0 = this->point(0);
32 
33  // We have to use vertex-polygon area rather than real area if we
34  // want this to be consistent for faces with curved edges
35  Real total_area = 0;
36  Point weighted_cc_sum;
37 
38  for (auto v : make_range(2u, this->n_vertices()))
39  {
40  const Point p1 = this->point(v-1);
41  const Point p2 = this->point(v);
42 
43  const Point a = p1-p0;
44  const Point b = p2-p0;
45  const Point axb = a.cross(b);
46  const Real norm2_axb = axb.norm_sq();
47  const Real area = sqrt(norm2_axb)/2;
48 
49  const Point cc_minus_p0 = ((a.norm_sq() * b - b.norm_sq() * a).cross(axb)) / 2 / norm2_axb;
50 
51  weighted_cc_sum += area*cc_minus_p0;
52  total_area += area;
53  }
54 
55  weighted_cc_sum /= total_area;
56  weighted_cc_sum += p0;
57 
58  return weighted_cc_sum;
59 }
60 
61 } // namespace libMesh
The libMesh namespace provides an interface to certain functionality in the library.
auto norm_sq() const -> decltype(std::norm(T()))
Definition: type_vector.h:926
TypeVector< typename CompareTypes< T, T2 >::supertype > cross(const TypeVector< T2 > &v) const
Definition: type_vector.h:884
virtual unsigned int n_vertices() const =0
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:140
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39
const Point & point(const unsigned int i) const
Definition: elem.h:2453
virtual Point quasicircumcenter() const override
Definition: face.C:29