PolyFEM
Loading...
Searching...
No Matches
Evaluator.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Core>
4
9
11
12namespace polyfem::io
13{
15 {
16 private:
18
19 public:
32 const mesh::Mesh &mesh,
33 const bool is_problem_scalar,
34 const std::vector<basis::ElementBases> &bases,
35 const std::vector<basis::ElementBases> &gbases,
36 const Eigen::VectorXi &disc_orders,
37 const Eigen::VectorXi &disc_ordersq,
38 const assembler::Assembler &assembler,
39 const Eigen::MatrixXd &fun,
40 const double t,
41 Eigen::MatrixXd &result,
42 Eigen::VectorXd &von_mises);
43
58 static void interpolate_function(
59 const mesh::Mesh &mesh,
60 const bool is_problem_scalar,
61 const std::vector<basis::ElementBases> &bases,
62 const Eigen::VectorXi &disc_orders,
63 const Eigen::VectorXi &disc_ordersq,
64 const std::map<int, Eigen::MatrixXd> &polys,
65 const std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> &polys_3d,
66 const utils::RefElementSampler &sampler,
67 const int n_points,
68 const Eigen::MatrixXd &fun,
69 Eigen::MatrixXd &result,
70 const bool use_sampler,
71 const bool boundary_only);
72
73 static void mark_flipped_cells(
74 const mesh::Mesh &mesh,
75 const std::vector<basis::ElementBases> &gbasis,
76 const std::vector<basis::ElementBases> &basis,
77 const Eigen::VectorXi &disc_orders,
78 const Eigen::VectorXi &disc_ordersq,
79 const std::map<int, Eigen::MatrixXd> &polys,
80 const std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> &polys_3d,
81 const utils::RefElementSampler &sampler,
82 const int n_points,
83 const Eigen::MatrixXd &fun,
84 Eigen::Vector<bool, -1> &result,
85 const bool use_sampler,
86 const bool boundary_only);
87
102 static void interpolate_function(
103 const mesh::Mesh &mesh,
104 const int actual_dim,
105 const std::vector<basis::ElementBases> &basis,
106 const Eigen::VectorXi &disc_orders,
107 const Eigen::VectorXi &disc_ordersq,
108 const std::map<int, Eigen::MatrixXd> &polys,
109 const std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> &polys_3d,
110 const utils::RefElementSampler &sampler,
111 const int n_points,
112 const Eigen::MatrixXd &fun,
113 Eigen::MatrixXd &result,
114 const bool use_sampler,
115 const bool boundary_only);
116
127 static void interpolate_at_local_vals(
128 const mesh::Mesh &mesh,
129 const bool is_problem_scalar,
130 const std::vector<basis::ElementBases> &bases,
131 const std::vector<basis::ElementBases> &gbases,
132 const int el_index,
133 const Eigen::MatrixXd &local_pts,
134 const Eigen::MatrixXd &fun,
135 Eigen::MatrixXd &result,
136 Eigen::MatrixXd &result_grad);
137
149 static void interpolate_at_local_vals(
150 const mesh::Mesh &mesh,
151 const int actual_dim,
152 const std::vector<basis::ElementBases> &bases,
153 const std::vector<basis::ElementBases> &gbases,
154 const int el_index,
155 const Eigen::MatrixXd &local_pts,
156 const Eigen::MatrixXd &fun,
157 Eigen::MatrixXd &result,
158 Eigen::MatrixXd &result_grad);
159
160 static void interpolate_at_local_vals(
161 const int el_index,
162 const int dim,
163 const int actual_dim,
165 const Eigen::MatrixXd &fun,
166 Eigen::MatrixXd &result,
167 Eigen::MatrixXd &result_grad);
168
185 const mesh::Mesh &mesh,
186 const bool is_problem_scalar,
187 const std::vector<basis::ElementBases> &bases,
188 const std::vector<basis::ElementBases> &gbases,
189 const Eigen::VectorXi &disc_orders,
190 const Eigen::VectorXi &disc_ordersq,
191 const std::map<int, Eigen::MatrixXd> &polys,
192 const std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> &polys_3d,
193 const assembler::Assembler &assembler,
194 const utils::RefElementSampler &sampler,
195 const Eigen::MatrixXd &fun,
196 const double t,
197 const bool use_sampler,
198 const bool boundary_only);
199
216 static void compute_scalar_value(
217 const mesh::Mesh &mesh,
218 const bool is_problem_scalar,
219 const std::vector<basis::ElementBases> &bases,
220 const std::vector<basis::ElementBases> &gbases,
221 const Eigen::VectorXi &disc_orders,
222 const Eigen::VectorXi &disc_ordersq,
223 const std::map<int, Eigen::MatrixXd> &polys,
224 const std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> &polys_3d,
225 const assembler::Assembler &assembler,
226 const utils::RefElementSampler &sampler,
227 const int n_points,
228 const Eigen::MatrixXd &fun,
229 const double t,
230 std::vector<assembler::Assembler::NamedMatrix> &result,
231 const bool use_sampler,
232 const bool boundary_only);
233
254 static void average_grad_based_function(
255 const mesh::Mesh &mesh,
256 const bool is_problem_scalar,
257 const int n_bases,
258 const std::vector<basis::ElementBases> &bases,
259 const std::vector<basis::ElementBases> &gbases,
260 const Eigen::VectorXi &disc_orders,
261 const Eigen::VectorXi &disc_ordersq,
262 const std::map<int, Eigen::MatrixXd> &polys,
263 const std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> &polys_3d,
264 const assembler::Assembler &assembler,
265 const utils::RefElementSampler &sampler,
266 const double t,
267 const int n_points,
268 const Eigen::MatrixXd &fun,
269 std::vector<assembler::Assembler::NamedMatrix> &result_scalar,
270 std::vector<assembler::Assembler::NamedMatrix> &result_tensor,
271 const bool use_sampler,
272 const bool boundary_only);
273
290 static void compute_tensor_value(
291 const mesh::Mesh &mesh,
292 const bool is_problem_scalar,
293 const std::vector<basis::ElementBases> &bases,
294 const std::vector<basis::ElementBases> &gbases,
295 const Eigen::VectorXi &disc_orders,
296 const Eigen::VectorXi &disc_ordersq,
297 const std::map<int, Eigen::MatrixXd> &polys,
298 const std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> &polys_3d,
299 const assembler::Assembler &assembler,
300 const utils::RefElementSampler &sampler,
301 const int n_points,
302 const Eigen::MatrixXd &fun,
303 const double t,
304 std::vector<assembler::Assembler::NamedMatrix> &result,
305 const bool use_sampler,
306 const bool boundary_only);
307
319 const mesh::Mesh &mesh,
320 const bool is_problem_scalar,
321 const std::vector<basis::ElementBases> &bases,
322 const std::vector<basis::ElementBases> &gbases,
323 const Eigen::MatrixXd &pts,
324 const Eigen::MatrixXi &faces,
325 const Eigen::MatrixXd &fun,
326 const bool compute_avg,
327 Eigen::MatrixXd &result);
328
329 static Eigen::MatrixXd generate_linear_field(
330 const int n_bases,
331 const std::shared_ptr<mesh::MeshNodes> mesh_nodes,
332 const Eigen::MatrixXd &grad);
333
334 static Eigen::MatrixXd get_bases_position(
335 const int n_bases,
336 const std::shared_ptr<mesh::MeshNodes> mesh_nodes);
337
338 static Eigen::VectorXd integrate_function(
339 const std::vector<basis::ElementBases> &bases,
340 const std::vector<basis::ElementBases> &gbases,
341 const Eigen::MatrixXd &fun,
342 const int dim,
343 const int actual_dim);
344 };
345} // namespace polyfem::io
ElementAssemblyValues vals
Definition Assembler.cpp:25
std::vector< Eigen::VectorXi > faces
stores per element basis values at given quadrature points and geometric mapping
static Eigen::MatrixXd generate_linear_field(const int n_bases, const std::shared_ptr< mesh::MeshNodes > mesh_nodes, const Eigen::MatrixXd &grad)
static void interpolate_at_local_vals(const mesh::Mesh &mesh, const bool is_problem_scalar, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const int el_index, const Eigen::MatrixXd &local_pts, const Eigen::MatrixXd &fun, Eigen::MatrixXd &result, Eigen::MatrixXd &result_grad)
interpolate solution and gradient at element (calls interpolate_at_local_vals with sol)
static void average_grad_based_function(const mesh::Mesh &mesh, const bool is_problem_scalar, const int n_bases, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const std::map< int, Eigen::MatrixXd > &polys, const std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > &polys_3d, const assembler::Assembler &assembler, const utils::RefElementSampler &sampler, const double t, const int n_points, const Eigen::MatrixXd &fun, std::vector< assembler::Assembler::NamedMatrix > &result_scalar, std::vector< assembler::Assembler::NamedMatrix > &result_tensor, const bool use_sampler, const bool boundary_only)
calls compute_scalar_value (i.e von mises for elasticity and norm of velocity for fluid) and compute_...
static Eigen::MatrixXd get_bases_position(const int n_bases, const std::shared_ptr< mesh::MeshNodes > mesh_nodes)
static void compute_scalar_value(const mesh::Mesh &mesh, const bool is_problem_scalar, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const std::map< int, Eigen::MatrixXd > &polys, const std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > &polys_3d, const assembler::Assembler &assembler, const utils::RefElementSampler &sampler, const int n_points, const Eigen::MatrixXd &fun, const double t, std::vector< assembler::Assembler::NamedMatrix > &result, const bool use_sampler, const bool boundary_only)
computes scalar quantity of funtion (ie von mises for elasticity and norm of velocity for fluid)
static void compute_tensor_value(const mesh::Mesh &mesh, const bool is_problem_scalar, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const std::map< int, Eigen::MatrixXd > &polys, const std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > &polys_3d, const assembler::Assembler &assembler, const utils::RefElementSampler &sampler, const int n_points, const Eigen::MatrixXd &fun, const double t, std::vector< assembler::Assembler::NamedMatrix > &result, const bool use_sampler, const bool boundary_only)
compute tensor quantity (ie stress tensor or velocity)
bool check_scalar_value(const mesh::Mesh &mesh, const bool is_problem_scalar, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const std::map< int, Eigen::MatrixXd > &polys, const std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > &polys_3d, const assembler::Assembler &assembler, const utils::RefElementSampler &sampler, const Eigen::MatrixXd &fun, const double t, const bool use_sampler, const bool boundary_only)
checks if mises are not nan
static void interpolate_boundary_function(const mesh::Mesh &mesh, const bool is_problem_scalar, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::MatrixXd &pts, const Eigen::MatrixXi &faces, const Eigen::MatrixXd &fun, const bool compute_avg, Eigen::MatrixXd &result)
computes integrated solution (fun) per surface face.
Definition Evaluator.cpp:80
static void interpolate_function(const mesh::Mesh &mesh, const bool is_problem_scalar, const std::vector< basis::ElementBases > &bases, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const std::map< int, Eigen::MatrixXd > &polys, const std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > &polys_3d, const utils::RefElementSampler &sampler, const int n_points, const Eigen::MatrixXd &fun, Eigen::MatrixXd &result, const bool use_sampler, const bool boundary_only)
interpolate the function fun.
static void compute_stress_at_quadrature_points(const mesh::Mesh &mesh, const bool is_problem_scalar, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const assembler::Assembler &assembler, const Eigen::MatrixXd &fun, const double t, Eigen::MatrixXd &result, Eigen::VectorXd &von_mises)
compute von mises stress at quadrature points for the function fun, also compute the interpolated fun...
static void mark_flipped_cells(const mesh::Mesh &mesh, const std::vector< basis::ElementBases > &gbasis, const std::vector< basis::ElementBases > &basis, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const std::map< int, Eigen::MatrixXd > &polys, const std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > &polys_3d, const utils::RefElementSampler &sampler, const int n_points, const Eigen::MatrixXd &fun, Eigen::Vector< bool, -1 > &result, const bool use_sampler, const bool boundary_only)
static Eigen::VectorXd integrate_function(const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::MatrixXd &fun, const int dim, const int actual_dim)
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:49