76 if (data.
x_prev.size() != data.
x.size())
84 for (
size_t ii = 0; ii < bs.global.size(); ++ii)
86 local_disp.row(i) += bs.global[ii].val * data.
x.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
87 local_prev_disp.row(i) += bs.global[ii].val * data.
x_prev.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
91 Eigen::MatrixXd local_vel = (local_disp - local_prev_disp) / data.
dt;
96 const int n_pts = data.
da.size();
98 Eigen::MatrixXd def_grad, vel_def_grad;
99 Eigen::MatrixXd delF_delU;
100 Eigen::MatrixXd dRdF, dRdFdot;
101 for (
long p = 0; p < n_pts; ++p)
111 def_grad = local_disp.transpose() * delF_delU + Eigen::MatrixXd::Identity(
size(),
size());
112 vel_def_grad = local_vel.transpose() * delF_delU;
115 G -= delF_delU * dRdFdot * (data.
da(p) / data.
dt);
118 G.transposeInPlace();
120 Eigen::VectorXd temp(Eigen::Map<Eigen::VectorXd>(G.data(), G.size()));
129 if (data.
x_prev.size() != data.
x.size())
137 for (
size_t ii = 0; ii < bs.global.size(); ++ii)
139 local_disp.row(i) += bs.global[ii].val * data.
x.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
140 local_prev_disp.row(i) += bs.global[ii].val * data.
x_prev.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
144 Eigen::MatrixXd local_vel = (local_disp - local_prev_disp) / data.
dt;
149 const int n_pts = data.
da.size();
151 Eigen::MatrixXd def_grad, dFdt, dEdt;
152 for (
long p = 0; p < n_pts; ++p)
161 Eigen::MatrixXd delF_delU = grad * data.
vals.
jac_it[p];
163 def_grad = local_disp.transpose() * delF_delU + Eigen::MatrixXd::Identity(
size(),
size());
164 dFdt = local_vel.transpose() * delF_delU;
166 dEdt = dFdt.transpose() * def_grad;
167 dEdt = (dEdt + dEdt.transpose()).eval() / 2.;
170 G += delF_delU * ((dFdt + def_grad / data.
dt) * tmp).transpose() * data.
da(p);
173 G.transposeInPlace();
175 Eigen::VectorXd temp(Eigen::Map<Eigen::VectorXd>(G.data(), G.size()));
184 Eigen::MatrixXd hessian;
186 if (data.
x_prev.size() != data.
x.size())
194 for (
size_t ii = 0; ii < bs.global.size(); ++ii)
196 local_disp.row(i) += bs.global[ii].val * data.
x.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
197 local_prev_disp.row(i) += bs.global[ii].val * data.
x_prev.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
201 Eigen::MatrixXd local_vel = (local_disp - local_prev_disp) / data.
dt;
203 const int n_pts = data.
da.size();
205 Eigen::MatrixXd def_grad, dFdt;
206 Eigen::MatrixXd d2RdF2, d2RdFdFdot, d2RdFdot2;
207 Eigen::MatrixXd hessian_temp, delF_delU_tensor;
208 for (
long p = 0; p < n_pts; ++p)
217 Eigen::MatrixXd delF_delU = grad * data.
vals.
jac_it[p];
219 def_grad = local_disp.transpose() * delF_delU + Eigen::MatrixXd::Identity(
size(),
size());
220 dFdt = local_vel.transpose() * delF_delU;
223 hessian_temp = d2RdF2 + (1. / data.
dt) * (d2RdFdFdot + d2RdFdFdot.transpose()) + (1. / data.
dt / data.
dt) * d2RdFdot2;
225 delF_delU_tensor = Eigen::MatrixXd::Zero(
size() *
size(), grad.size());
226 for (
size_t i = 0; i < local_disp.rows(); ++i)
227 for (
size_t j = 0; j <
size(); ++j)
228 for (
size_t d = 0; d <
size(); d++)
229 delF_delU_tensor(
size() * j + d, i *
size() + j) = delF_delU(i, d);
231 hessian += delF_delU_tensor.transpose() * hessian_temp * delF_delU_tensor * data.
da(p);
241 Eigen::MatrixXd stress_grad_Ut;
243 if (data.
x_prev.size() != data.
x.size())
244 return stress_grad_Ut;
251 for (
size_t ii = 0; ii < bs.global.size(); ++ii)
253 local_disp.row(i) += bs.global[ii].val * data.
x.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
254 local_prev_disp.row(i) += bs.global[ii].val * data.
x_prev.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
258 Eigen::MatrixXd local_vel = (local_disp - local_prev_disp) / data.
dt;
260 const int n_pts = data.
da.size();
262 Eigen::MatrixXd def_grad, dFdt;
263 Eigen::MatrixXd d2RdF2, d2RdFdFdot, d2RdFdot2;
264 Eigen::MatrixXd stress_grad_Ut_temp, delF_delU_tensor;
265 for (
long p = 0; p < n_pts; ++p)
274 Eigen::MatrixXd delF_delU = grad * data.
vals.
jac_it[p];
276 def_grad = local_disp.transpose() * delF_delU + Eigen::MatrixXd::Identity(
size(),
size());
277 dFdt = local_vel.transpose() * delF_delU;
280 stress_grad_Ut_temp = -(1. / data.
dt) * d2RdFdFdot - (1. / data.
dt / data.
dt) * d2RdFdot2;
282 delF_delU_tensor = Eigen::MatrixXd::Zero(
size() *
size(), grad.size());
283 for (
size_t i = 0; i < local_disp.rows(); ++i)
284 for (
size_t j = 0; j <
size(); ++j)
285 for (
size_t d = 0; d <
size(); d++)
286 delF_delU_tensor(
size() * j + d, i *
size() + j) = delF_delU(i, d);
288 stress_grad_Ut += delF_delU_tensor.transpose() * stress_grad_Ut_temp * delF_delU_tensor * data.
da(p);
291 return stress_grad_Ut;
297 if (data.
x_prev.size() != data.
x.size())
305 for (
size_t ii = 0; ii < bs.global.size(); ++ii)
307 local_disp.row(i) += bs.global[ii].val * data.
x.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
308 local_prev_disp.row(i) += bs.global[ii].val * data.
x_prev.block(bs.global[ii].index *
size(), 0,
size(), 1).transpose();
312 Eigen::MatrixXd local_vel = (local_disp - local_prev_disp) / data.
dt;
315 const int n_pts = data.
da.size();
317 Eigen::MatrixXd def_grad, dFdt, dEdt;
318 for (
long p = 0; p < n_pts; ++p)
327 const Eigen::MatrixXd delF_delU = grad * data.
vals.
jac_it[p];
328 def_grad = local_disp.transpose() * delF_delU + Eigen::MatrixXd::Identity(
size(),
size());
329 dFdt = local_vel.transpose() * delF_delU;
331 dEdt = dFdt.transpose() * def_grad;
332 dEdt = (dEdt + dEdt.transpose()).eval() / 2.;
335 energy +=
val * data.
da(p);