PolyFEM
Loading...
Searching...
No Matches
Mass.cpp
Go to the documentation of this file.
1#include "Mass.hpp"
2
3#include <utility>
4
5namespace polyfem::assembler
6{
8 : density_(std::make_shared<Density>())
9 {
10 }
11
12 Mass::Mass(std::shared_ptr<Density> density)
13 : density_(std::move(density))
14 {
15 assert(density_);
16 }
17
18 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 9, 1> Mass::assemble(const LinearAssemblerData &data) const
19 {
20 double tmp = 0;
21
22 // loop over quadrature points
23 for (int q = 0; q < data.da.size(); ++q)
24 {
25 const double rho = density()(data.vals.quadrature.points.row(q), data.vals.val.row(q), data.t, data.vals.element_id);
26 // phi_i * phi_j weighted by quadrature weights
27 tmp += rho * data.vals.basis_values[data.i].val(q) * data.vals.basis_values[data.j].val(q) * data.da(q);
28 }
29
30 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 9, 1> res(size() * size(), 1);
31 res.setZero();
32 for (int i = 0; i < size(); ++i)
33 res(i * size() + i) = tmp;
34
35 return res;
36 }
37
38 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> Mass::compute_rhs(const AutodiffHessianPt &pt) const
39 {
40 assert(false);
41 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> result;
42
43 return result;
44 }
45
46 void Mass::add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path)
47 {
48 assert(size_ == 1 || size_ == 2 || size_ == 3);
49
50 if (auto thermal_density = std::dynamic_pointer_cast<ThermalMassDensity>(density_))
51 thermal_density->add_multimaterial(index, params, units.density(), units.specific_heat_capacity(), root_path);
52 else
53 density_->add_multimaterial(index, params, units.density(), root_path);
54 }
55
56 std::map<std::string, Assembler::ParamFunc> Mass::parameters() const
57 {
58 std::map<std::string, ParamFunc> res;
59 if (auto thermal_density = std::dynamic_pointer_cast<ThermalMassDensity>(density_))
60 {
61 res["rho"] = [thermal_density](const RowVectorNd &, const RowVectorNd &p, double t, int e) {
62 return thermal_density->rho(p, t, e);
63 };
64 res["heat_capacity"] = [thermal_density](const RowVectorNd &, const RowVectorNd &p, double t, int e) {
65 return thermal_density->heat_capacity(p, t, e);
66 };
67 res["rho_heat_capacity"] = [this](const RowVectorNd &uv, const RowVectorNd &p, double t, int e) {
68 return this->density()(uv, p, t, e);
69 };
70 }
71 else
72 {
73 res["rho"] = [this](const RowVectorNd &uv, const RowVectorNd &p, double t, int e) {
74 return this->density()(uv, p, t, e);
75 };
76 }
77
78 return res;
79 }
80
81 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 9, 1> HRZMass::assemble(const LinearAssemblerData &data) const
82 {
83 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 9, 1> res(size() * size(), 1);
84 res.setZero();
85
86 if (data.i != data.j)
87 return res;
88
89 double sum_all_entries = 0;
90 double sum_all_diag_entries = 0;
91 double sum_target_diag_entries = 0;
92
93 for (int i = 0; i < data.vals.basis_values.size(); ++i)
94 {
95 for (int j = 0; j < data.vals.basis_values.size(); ++j)
96 {
97 double entry = 0;
98 for (int q = 0; q < data.da.size(); ++q)
99 {
100 entry += data.vals.basis_values[i].val(q) * data.vals.basis_values[j].val(q) * data.da(q);
101 }
102 sum_all_entries += entry;
103 if (i == j)
104 {
105 sum_all_diag_entries += entry;
106 if (i == data.i)
107 {
108 sum_target_diag_entries += entry;
109 }
110 }
111 }
112 }
113
114 for (int i = 0; i < size(); ++i)
115 res(i * size() + i) = sum_all_entries / sum_all_diag_entries * sum_target_diag_entries;
116
117 return res;
118 }
119
120} // namespace polyfem::assembler
std::string specific_heat_capacity() const
Definition Units.hpp:35
std::string density() const
Definition Units.hpp:28
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 9, 1 > assemble(const LinearAssemblerData &data) const override
computes and returns local stiffness matrix (1x1) for bases i,j (where i,j is passed in through data)...
Definition Mass.cpp:81
const ElementAssemblyValues & vals
stores the evaluation for that element
const QuadratureVector & da
contains both the quadrature weight and the change of metric in the integral
const Density & density() const
class that stores and compute density per point
Definition Mass.hpp:34
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > compute_rhs(const AutodiffHessianPt &pt) const override
uses autodiff to compute the rhs for a fabricated solution in this case it just return pt....
Definition Mass.cpp:38
virtual std::map< std::string, ParamFunc > parameters() const override
Definition Mass.cpp:56
std::shared_ptr< Density > density_
Definition Mass.hpp:41
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 9, 1 > assemble(const LinearAssemblerData &data) const override
computes and returns local stiffness matrix (1x1) for bases i,j (where i,j is passed in through data)...
Definition Mass.cpp:18
void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) override
inialize material parameter
Definition Mass.cpp:46
Used for test only.
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
nlohmann::json json
Definition Common.hpp:9
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13