Line data Source code
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 : 29 5688675 : Point Face::quasicircumcenter () const 30 : { 31 5796539 : 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 1973336 : Real total_area = 0; 36 1973336 : Point weighted_cc_sum; 37 : 38 11378934 : for (auto v : make_range(2u, this->n_vertices())) 39 : { 40 5798255 : const Point p1 = this->point(v-1); 41 5690259 : const Point p2 = this->point(v); 42 : 43 1973468 : const Point a = p1-p0; 44 1973468 : const Point b = p2-p0; 45 5582263 : const Point axb = a.cross(b); 46 1973468 : const Real norm2_axb = axb.norm_sq(); 47 5690259 : const Real area = sqrt(norm2_axb)/2; 48 : 49 5582263 : const Point cc_minus_p0 = ((a.norm_sq() * b - b.norm_sq() * a).cross(axb)) / 2 / norm2_axb; 50 : 51 1973468 : weighted_cc_sum += area*cc_minus_p0; 52 5690259 : total_area += area; 53 : } 54 : 55 1973336 : weighted_cc_sum /= total_area; 56 1973336 : weighted_cc_sum += p0; 57 : 58 7662011 : return weighted_cc_sum; 59 : } 60 : 61 : } // namespace libMesh