Line data Source code
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 : 30 : namespace libMesh 31 : { 32 : 33 5688967 : Point Face::quasicircumcenter () const 34 : { 35 5796839 : 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 1973352 : Real total_area = 0; 40 1973352 : Point weighted_cc_sum; 41 : 42 11379518 : for (auto v : make_range(2u, this->n_vertices())) 43 : { 44 5798555 : const Point p1 = this->point(v-1); 45 5690551 : const Point p2 = this->point(v); 46 : 47 1973484 : const Point a = p1-p0; 48 1973484 : const Point b = p2-p0; 49 5582547 : const Point axb = a.cross(b); 50 1973484 : const Real norm2_axb = axb.norm_sq(); 51 5690551 : const Real area = sqrt(norm2_axb)/2; 52 : 53 5582547 : const Point cc_minus_p0 = ((a.norm_sq() * b - b.norm_sq() * a).cross(axb)) / 2 / norm2_axb; 54 : 55 1973484 : weighted_cc_sum += area*cc_minus_p0; 56 5690551 : total_area += area; 57 : } 58 : 59 1973352 : weighted_cc_sum /= total_area; 60 1973352 : weighted_cc_sum += p0; 61 : 62 7662319 : 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"