30 const std::vector<double>& local_x_data,
31 const std::vector<double>& local_x_prev_data,
32 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data)
34 std::vector<double> local_M_data(local_Jac_data.size());
35 std::vector<double> local_K_data(local_Jac_data.size());
41 "The number of specified epsilons ({:d}) and the number of local "
42 "d.o.f.s ({:d}) do not match, i.e., the latter is not divisible by "
48 static_cast<Eigen::MatrixXd::Index
>(local_x_data.size());
54 Eigen::VectorXd
const local_xdot = (x - x_prev) / dt;
59 auto const num_dofs_per_component =
64 local_assembler.
assemble(t, dt, local_x_data, local_x_prev_data,
65 local_M_data, local_K_data, local_b_data);
77 for (Eigen::MatrixXd::Index i = 0; i < num_r_c; ++i)
79 if ((vds != std::nullopt) && i >= vds->start_index &&
80 (i < (vds->start_index + vds->size)))
87 auto const component = i / num_dofs_per_component;
100 auto const local_M_0 =
102 auto const local_M_p =
104 local_Jac.col(i).noalias() +=
106 (local_M_p - local_M_0) * local_xdot / eps;
111 auto const local_K_0 =
113 auto const local_K_p =
116 local_Jac.col(i).noalias() +=
118 (local_K_p - local_K_0) * x / eps;
123 auto const local_b_0 =
125 auto const local_b_p =
127 local_Jac.col(i).noalias() -= (local_b_p - local_b_0) / eps;
135 if (!local_M_data.empty())
138 local_Jac.noalias() += local_M / dt;
140 if (!local_K_data.empty())
143 local_Jac.noalias() += local_K;
151 if (!local_b_data.empty())
159 if (!local_M_data.empty())
162 b -= M * (x - x_prev) / dt;
163 local_M_data.clear();
165 if (!local_K_data.empty())
172 if (vds != std::nullopt)
174 K.block(vds->start_index, vds->start_index, vds->size, vds->size)
179 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_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)