PolyFEM
Loading...
Searching...
No Matches
InertiaForceDerivative.cpp
Go to the documentation of this file.
2
3#include <vector>
4#include <Eigen/Core>
14
15namespace polyfem::solver
16{
17 namespace
18 {
19 class LocalThreadVecStorage
20 {
21 public:
22 Eigen::MatrixXd vec;
23 assembler::ElementAssemblyValues vals;
25
26 LocalThreadVecStorage(const int size)
27 {
28 vec.resize(size, 1);
29 vec.setZero();
30 }
31 };
32
33 double dot(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B) { return (A.array() * B.array()).sum(); }
34 } // namespace
35
37 const InertiaForm &form,
38 bool is_volume,
39 const int n_geom_bases,
40 const double t,
41 const std::vector<basis::ElementBases> &bases,
42 const std::vector<basis::ElementBases> &geom_bases,
43 const assembler::Mass &assembler,
44 const assembler::AssemblyValsCache &ass_vals_cache,
45 const Eigen::MatrixXd &velocity,
46 const Eigen::MatrixXd &adjoint,
47 Eigen::VectorXd &term)
48 {
49 (void)form;
50
51 const int dim = is_volume ? 3 : 2;
52 const int n_elements = int(bases.size());
53 term.setZero(n_geom_bases * dim, 1);
54
55 auto storage = utils::create_thread_storage(LocalThreadVecStorage(term.size()));
56
57 utils::maybe_parallel_for(n_elements, [&](int start, int end, int thread_id) {
58 LocalThreadVecStorage &local_storage = utils::get_local_thread_storage(storage, thread_id);
59
60 for (int e = start; e < end; ++e)
61 {
62 assembler::ElementAssemblyValues &vals = local_storage.vals;
63 ass_vals_cache.compute(e, is_volume, bases[e], geom_bases[e], vals);
65 gvals.compute(e, is_volume, vals.quadrature.points, geom_bases[e], geom_bases[e]);
66
67 const quadrature::Quadrature &quadrature = vals.quadrature;
68 local_storage.da = vals.det.array() * quadrature.weights.array();
69
70 Eigen::MatrixXd vel, grad_vel, p, grad_p;
71 io::Evaluator::interpolate_at_local_vals(e, dim, dim, vals, adjoint, p, grad_p);
72 io::Evaluator::interpolate_at_local_vals(e, dim, dim, vals, velocity, vel, grad_vel);
73
74 for (int q = 0; q < local_storage.da.size(); ++q)
75 {
76 const double rho = assembler.density()(quadrature.points.row(q), vals.val.row(q), t, e);
77 const double value = rho * dot(p.row(q), vel.row(q)) * local_storage.da(q);
78 for (const auto &v : gvals.basis_values)
79 {
80 local_storage.vec.block(v.global[0].index * dim, 0, dim, 1) += v.grad_t_m.row(q).transpose() * value;
81 }
82 }
83 }
84 });
85
86 for (const LocalThreadVecStorage &local_storage : storage)
87 term += local_storage.vec;
88 }
89} // namespace polyfem::solver
Eigen::MatrixXd vec
Definition Assembler.cpp:72
QuadratureVector da
Definition Assembler.cpp:23
ElementAssemblyValues vals
Definition Assembler.cpp:22
assembler::ElementAssemblyValues gvals
Quadrature quadrature
Caches basis evaluation and geometric mapping at every element.
void compute(const int el_index, const bool is_volume, const basis::ElementBases &basis, const basis::ElementBases &gbasis, ElementAssemblyValues &vals) const
retrieves cached basis evaluation and geometric for the given element if it doesn't exist,...
stores per element basis values at given quadrature points and geometric mapping
void compute(const int el_index, const bool is_volume, const Eigen::MatrixXd &pts, const basis::ElementBases &basis, const basis::ElementBases &gbasis)
computes the per element values at the local (ref el) points (pts) sets basis_values,...
const Density & density() const
class that stores and compute density per point
Definition Mass.hpp:29
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 force_shape_derivative(const InertiaForm &form, bool is_volume, const int n_geom_bases, const double t, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &geom_bases, const assembler::Mass &assembler, const assembler::AssemblyValsCache &ass_vals_cache, const Eigen::MatrixXd &velocity, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &term)
Form of the inertia.
auto & get_local_thread_storage(Storages &storage, int thread_id)
auto create_thread_storage(const LocalStorage &initial_local_storage)
void maybe_parallel_for(int size, const std::function< void(int, int, int)> &partial_for)
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, MAX_QUAD_POINTS, 1 > QuadratureVector
Definition Types.hpp:17