12 const int n_phi_bases,
13 const int n_psi_bases,
14 const std::vector<basis::ElementBases> &phi_bases,
15 const std::vector<basis::ElementBases> &psi_bases,
16 const std::vector<basis::ElementBases> &geom_bases,
23 : n_phi_bases_(n_phi_bases),
24 n_psi_bases_(n_psi_bases),
25 phi_bases_(phi_bases),
26 psi_bases_(psi_bases),
27 geom_bases_(geom_bases),
28 assembler_(assembler),
29 phi_cache_(phi_cache),
30 psi_cache_(psi_cache),
39 mat_cache_ = std::make_unique<utils::SparseMatrixCache>();
44 assert(std::isfinite(phi_weight));
45 assert(std::isfinite(psi_weight));
70 assert(std::abs(out.sum() -
value_unweighted(
x)) < std::max(1e-10 * std::abs(out.sum()), 1e-10));
94 hessian.resize(
x.size(),
x.size());
97 mat_cache_ = std::make_unique<utils::SparseMatrixCache>();
108 for (
int k = 0; k < hessian.outerSize(); ++k)
110 for (StiffnessMatrix::InnerIterator it(hessian, k); it; ++it)
129 return [
this](
const Eigen::MatrixXd &
x, Eigen::MatrixXd &x_phi, Eigen::MatrixXd &x_psi) {
131 assert(
x.cols() == 1);
#define POLYFEM_SCOPED_TIMER(...)
Caches basis evaluation and geometric mapping at every element.
void assemble_gradient(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution, Eigen::MatrixXd &grad) const
void assemble_hessian(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const bool project_to_psd, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution, utils::MatrixCache &mat_cache, StiffnessMatrix &hessian) const
Eigen::VectorXd assemble_energy_per_element(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution) const
std::function< void(const Eigen::MatrixXd &x, Eigen::MatrixXd &x_phi, Eigen::MatrixXd &x_psi)> SolutionSplitter
double assemble_energy(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution) const
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix