libMesh
Loading...
Searching...
No Matches
variational_smoother_system.h
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#ifndef LIBMESH_VARIATIONAL_SMOOTHER_SYSTEM_H
19#define LIBMESH_VARIATIONAL_SMOOTHER_SYSTEM_H
20
21// libMesh includes
22#include "libmesh/enum_fe_family.h"
23#include "libmesh/enum_quadrature_type.h"
24#include "libmesh/fem_function_base.h"
25#include "libmesh/fem_system.h"
26#include "libmesh/libmesh_common.h"
27
28// C++ includes
29#include <map>
30#include <memory>
31
32namespace libMesh
33{
34
39{
40 // dof_id_types will hold the id of the Elem where the metric occurs
41 // IMPORTANT: the Real should be the first entry of the pair so that taking
42 // the min/max accross processors will compare the numeric values instead of
43 // the element ids.
44
45 std::pair<Real, dof_id_type> max_elem_distortion{std::numeric_limits<Real>::lowest(),
47 std::pair<Real, dof_id_type> min_elem_distortion{std::numeric_limits<Real>::max(),
50
51 std::pair<Real, dof_id_type> max_elem_dilation{std::numeric_limits<Real>::lowest(),
53 std::pair<Real, dof_id_type> min_elem_dilation{std::numeric_limits<Real>::max(),
56
57 std::pair<Real, dof_id_type> max_elem_combined{std::numeric_limits<Real>::lowest(),
59 std::pair<Real, dof_id_type> min_elem_combined{std::numeric_limits<Real>::max(),
62
63 std::pair<Real, dof_id_type> max_elem_det_S{std::numeric_limits<Real>::lowest(),
65 std::pair<Real, dof_id_type> min_elem_det_S{std::numeric_limits<Real>::max(),
68 Real max_qp_det_S = std::numeric_limits<Real>::lowest();
69 Real min_qp_det_S = std::numeric_limits<Real>::max();
70
71 bool mesh_is_tangled = false;
72 bool initialized = false;
73};
74
75// FEMSystem, TimeSolver and NewtonSolver will handle most tasks,
76// but we must specify element residuals
78{
88public:
90 const std::string & name,
91 const unsigned int number)
93 _verbosity(0),
96 _ref_vol(0.),
98 _untangling_solve(false),
100 {}
101
102 // Default destructor
104
108 virtual void assembly (bool get_residual,
109 bool get_jacobian,
110 bool apply_heterogeneous_constraints = false,
111 bool apply_no_constraints = false) override;
112
114
129
135
141 virtual void solve() override;
142
151 static void get_target_to_reference_jacobian(const Elem * const target_elem,
152 const FEMContext & femcontext,
153 std::vector<RealTensor> & jacobians,
154 std::vector<Real> & jacobian_dets);
155
161
162 /*
163 * Computes information about the mesh quality and sets the _mesh_info attribute.
164 */
166
167 /*
168 * Sets the verbosity of the object.
169 */
170 void set_verbosity(const unsigned int verbosity) { _verbosity = verbosity; }
171
172protected:
173
174 // System initialization
175 virtual void init_data () override;
176
177 // Context initialization
178 virtual void init_context (libMesh::DiffContext & context) override;
179
180 // Element residual and jacobian calculations
181 // Time dependent parts
182 virtual bool element_time_derivative (bool request_jacobian,
183 libMesh::DiffContext & context) override;
184
185 /* Computes the element reference volume used in the dilation metric
186 * The reference value is set to the averaged value of all elements' average
187 * |J|. Also computes any applicable target element inverse Jacobians. Target
188 * elements are relavant when the reference element does not minimize the
189 * distortion metric.
190 */
192
215 unsigned int _verbosity;
216
221
227
232
237
238 /* Map to hold target qp-dependent element target-to-reference mapping
239 * Jacobians, if any
240 */
241 std::map<ElemType, std::vector<RealTensor>> _target_jacobians;
242
243 /*
244 * Map to hold the determinants of _target_jacobians.
245 */
246 std::map<ElemType, std::vector<Real>> _target_jacobian_dets;
247
252
257
263};
264
265} // namespace libMesh
266
267#endif // LIBMESH_VARIATIONAL_SMOOTHER_SYSTEM_H
This class provides all data required for a physics package (e.g.
static constexpr dof_id_type invalid_id
An invalid id to distinguish an uninitialized DofObject.
Definition dof_object.h:473
This is the base class from which all geometric element types are derived.
Definition elem.h:96
This is the EquationSystems class.
This class provides all data required for a physics package (e.g.
Definition fem_context.h:64
This class provides a specific system class.
Definition fem_system.h:55
const std::string & name() const
Definition system.h:2385
unsigned int number() const
Definition system.h:2393
MeshQualityInfo _mesh_info
Information about the mesh quality.
bool _untangling_solve
Flag to indicate if the current solve is to untangle or smooth.
const MeshQualityInfo & get_mesh_info()
Getter for the _mesh_info attribute.
QuadratureType _quadrature_type
The quadrature rule type used to integrate the distortion-dilation metric.
Real _dilation_weight
The relative weight to give the dilation metric.
const Real _epsilon_squared
The small nonzero constant to prevent zero denominators (degenerate meshes only)
QuadratureType get_quadrature_type() const
Get the quadrature rule type used to integrate the distortion-dilation metric.
Real _epsilon_squared_assembly
Epsilon squared value determined at runtime during each assembly.
virtual void assembly(bool get_residual, bool get_jacobian, bool apply_heterogeneous_constraints=false, bool apply_no_constraints=false) override
Assembly method to update the mesh based on the smoother solve.
Real _ref_vol
The reference volume for each element.
std::map< ElemType, std::vector< RealTensor > > _target_jacobians
virtual void init_data() override
Initializes the member data fields associated with the system, so that, e.g., assemble() may be used.
virtual bool element_time_derivative(bool request_jacobian, libMesh::DiffContext &context) override
Adds the time derivative contribution on elem to elem_residual.
static void get_target_to_reference_jacobian(const Elem *const target_elem, const FEMContext &femcontext, std::vector< RealTensor > &jacobians, std::vector< Real > &jacobian_dets)
Get the jacobians (and determinants) of the target-to-reference element mapping.
VariationalSmootherSystem(libMesh::EquationSystems &es, const std::string &name, const unsigned int number)
This is an FEMSystem to solve the optimization probelem posed by the VariationalMeshSmoother class.
std::map< ElemType, std::vector< Real > > _target_jacobian_dets
void set_quadrature_type(QuadratureType qt)
Set the quadrature rule type used to integrate the distortion-dilation metric over each element.
void set_verbosity(const unsigned int verbosity)
virtual void solve() override
Solves the system to smooth the mesh.
virtual void init_context(libMesh::DiffContext &context) override
The libMesh namespace provides an interface to certain functionality in the library.
QuadratureType
Defines an enum for currently available quadrature rules.
static constexpr Real TOLERANCE
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Struct to hold smoother-relevant information about the mesh quality.
std::pair< Real, dof_id_type > min_elem_distortion
std::pair< Real, dof_id_type > max_elem_combined
std::pair< Real, dof_id_type > max_elem_dilation
std::pair< Real, dof_id_type > max_elem_det_S
std::pair< Real, dof_id_type > min_elem_dilation
std::pair< Real, dof_id_type > min_elem_det_S
std::pair< Real, dof_id_type > max_elem_distortion
std::pair< Real, dof_id_type > min_elem_combined