19 class LocalThreadVecStorage
23 assembler::ElementAssemblyValues
vals;
26 LocalThreadVecStorage(
const int size)
33 double dot(
const Eigen::MatrixXd &A,
const Eigen::MatrixXd &B) {
return (A.array() * B.array()).sum(); }
39 const int n_geom_bases,
41 const std::vector<basis::ElementBases> &bases,
42 const std::vector<basis::ElementBases> &geom_bases,
45 const Eigen::MatrixXd &velocity,
46 const Eigen::MatrixXd &adjoint,
47 Eigen::VectorXd &term)
51 const int dim = is_volume ? 3 : 2;
52 const int n_elements = int(bases.size());
53 term.setZero(n_geom_bases * dim, 1);
60 for (
int e = start; e < end; ++e)
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]);
70 Eigen::MatrixXd vel, grad_vel, p, grad_p;
74 for (
int q = 0; q < local_storage.da.size(); ++q)
77 const double value = rho * dot(p.row(q), vel.row(q)) * local_storage.da(q);
78 for (
const auto &v :
gvals.basis_values)
80 local_storage.vec.block(v.global[0].index * dim, 0, dim, 1) += v.grad_t_m.row(q).transpose() * value;
86 for (
const LocalThreadVecStorage &local_storage : storage)
87 term += local_storage.vec;
ElementAssemblyValues vals
assembler::ElementAssemblyValues gvals
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
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)
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