30 const std::vector<double>& local_x_data,
31 const std::vector<double>& local_x_prev_data,
32 std::vector<double>& local_M_data, std::vector<double>& local_K_data,
33 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data)
39 "The number of specified epsilons ({:d}) and the number of local "
40 "d.o.f.s ({:d}) do not match, i.e., the latter is not divisible by "
46 static_cast<Eigen::MatrixXd::Index
>(local_x_data.size());
48 auto const x = MathLib::toVector<Eigen::VectorXd>(local_x_data, num_r_c);
50 MathLib::toVector<Eigen::VectorXd>(local_x_prev_data, num_r_c);
55 auto const num_dofs_per_component =
60 local_assembler.
assemble(t, dt, local_x_data, local_x_prev_data,
61 local_M_data, local_K_data, local_b_data);
66 for (Eigen::MatrixXd::Index i = 0; i < num_r_c; ++i)
69 auto const component = i / num_dofs_per_component;
75 auto const x_p = MathLib::toVector<Eigen::VectorXd>(
84 auto const local_M_0 =
86 auto const local_M_p =
88 local_Jac.col(i).noalias() +=
89 (local_M_p * (x_p - x_prev) - local_M_0 * (x - x_prev)) /
95 auto const local_K_0 =
97 auto const local_K_p =
99 local_Jac.col(i).noalias() +=
100 (local_K_p * x_p - local_K_0 * x) / eps;
105 auto const local_b_0 =
106 MathLib::toVector<Eigen::VectorXd>(local_b_data, num_r_c);
107 auto const local_b_p =
109 local_Jac.col(i).noalias() -= (local_b_p - local_b_0) / eps;
114 local_M_data.clear();
115 local_K_data.clear();
116 local_b_data.clear();
119 local_assembler.
assemble(t, dt, local_x_data, local_x_prev_data,
120 local_M_data, local_K_data, local_b_data);
127 if (!local_b_data.empty())
129 return MathLib::toVector<Eigen::VectorXd>(local_b_data, num_r_c);
131 return MathLib::createZeroedVector<Eigen::VectorXd>(local_b_data,
135 if (!local_M_data.empty())
138 b -= M * (x - x_prev) / dt;
139 local_M_data.clear();
141 if (!local_K_data.empty())
145 local_K_data.clear();
void assembleWithJacobian(LocalAssemblerInterface &local_assembler, double const t, double const dt, std::vector< double > const &local_x_data, std::vector< double > const &local_x_prev_data, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data) override
virtual void assemble(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data)