22 const std::vector<double>& local_x_data,
23 const std::vector<double>& local_x_prev_data,
24 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data)
26 std::vector<double> local_M_data(local_Jac_data.size());
27 std::vector<double> local_K_data(local_Jac_data.size());
30 static_cast<Eigen::MatrixXd::Index
>(local_x_data.size());
34 auto const local_x_prev =
36 Eigen::VectorXd
const local_xdot = (local_x - local_x_prev) / dt;
43 auto const num_dofs_per_component =
59 auto const num_purterbated_colums = num_r_c - nved;
61 for (Eigen::MatrixXd::Index i = 0; i < num_purterbated_colums; ++i)
64 auto const component = i / num_dofs_per_component;
65 auto const eps = perturbations[component];
69 local_x_prev_data, local_M_data, local_K_data,
79 if (!local_M_data.empty())
81 auto const local_M_p =
83 auto const local_M_m =
85 local_Jac.col(i).noalias() +=
87 (local_M_p - local_M_m) * local_xdot / (2.0 * eps);
91 if (!local_K_data.empty())
93 auto const local_K_p =
95 auto const local_K_m =
97 local_Jac.col(i).noalias() +=
99 (local_K_p - local_K_m) * local_x / (2.0 * eps);
100 local_K_data.clear();
103 if (!local_b_data.empty())
105 auto const local_b_p =
107 auto const local_b_m =
109 local_Jac.col(i).noalias() -=
111 (local_b_p - local_b_m) / (2.0 * eps);
112 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);
123 if (!local_M_data.empty())
126 local_Jac.noalias() += local_M / dt;
128 if (!local_K_data.empty())
131 local_Jac.noalias() += local_K;
139 if (!local_b_data.empty())
147 if (!local_M_data.empty())
151 local_M_data.clear();
153 if (!local_K_data.empty())
162 auto const dm_start_index = num_purterbated_colums;
163 auto const dm_size = nved;
164 K.block(dm_start_index, dm_start_index, dm_size, dm_size).setZero();
168 local_K_data.clear();
void assembleWithJacobian(std::size_t const mesh_item_id, 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)