14 std::vector<Eigen::Triplet<double>> &
entries)
16 for (
int k = 0; k < block.outerSize(); ++k)
17 for (StiffnessMatrix::InnerIterator it(block, k); it; ++it)
20 row_offset + it.row(), col_offset + it.col(), scale * it.value());
26 const int velocity_offset,
27 const int mesh_displacement_offset,
28 const int solid_displacement_offset,
29 const int fluid_multiplier_offset,
30 const int mesh_multiplier_offset,
37 : total_size_(total_size),
38 velocity_offset_(velocity_offset),
39 mesh_displacement_offset_(mesh_displacement_offset),
40 solid_displacement_offset_(solid_displacement_offset),
41 fluid_multiplier_offset_(fluid_multiplier_offset),
42 mesh_multiplier_offset_(mesh_multiplier_offset),
43 fluid_velocity_trace_(std::move(fluid_velocity_trace)),
44 fluid_solid_trace_(std::move(fluid_solid_trace)),
45 mesh_trace_(std::move(mesh_trace)),
46 mesh_solid_trace_(std::move(mesh_solid_trace)),
47 fluid_multiplier_mass_(make_multiplier_mass(fluid_velocity_trace_)),
48 mesh_multiplier_mass_(make_multiplier_mass(mesh_trace_)),
49 fluid_integrator_(fluid_integrator),
50 solid_integrator_(solid_integrator)
62 Eigen::VectorXd row_mass = Eigen::VectorXd::Zero(trace.rows());
63 for (
int k = 0; k < trace.outerSize(); ++k)
64 for (StiffnessMatrix::InnerIterator it(trace, k); it; ++it)
65 row_mass(it.row()) += std::abs(it.value());
66 std::vector<Eigen::Triplet<double>>
entries;
68 for (
int row = 0; row < trace.rows(); ++row)
69 entries.emplace_back(row, row, std::max(row_mass(row), 1e-12));
77 Eigen::VectorXd residual;
79 return residual.squaredNorm();
83 const Eigen::VectorXd &velocity,
const Eigen::VectorXd &solid_velocity)
const
91 const Eigen::VectorXd &mesh_displacement,
92 const Eigen::VectorXd &solid_displacement)
const
94 assert(mesh_displacement.size() ==
mesh_trace_.cols());
100 const Eigen::VectorXd &
x, Eigen::VectorXd &residual)
const
129 std::vector<Eigen::Triplet<double>>
entries;
145 jacobian.makeCompressed();
std::vector< Eigen::Triplet< double > > entries
Implicit time integrator of a second order ODE (equivently a system of coupled first order ODEs).
virtual Eigen::VectorXd compute_velocity(const Eigen::VectorXd &x) const =0
Compute the current velocity given the current solution and using the stored previous solution(s).
virtual double dv_dx(const unsigned prev_ti=0) const =0
Compute the derivative of the velocity with respect to the solution.
virtual double acceleration_scaling() const =0
Compute the acceleration scaling used to scale forces when integrating a second order ODE.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix