void BackwardEulerOperator::Mult(const Vector &k, Vector &y) const { // compute: y = H(x + dt*(v + dt*k)) + M*k + S*(v + dt*k) add(*v, dt, k, w); add(*x, dt, w, z); H->Mult(z, y); M->TrueAddMult(k, y); S->TrueAddMult(w, y); }
void HyperelasticOperator::Mult(const Vector &vx, Vector &dvx_dt) const { // Create views to the sub-vectors v, x of vx, and dv_dt, dx_dt of dvx_dt int sc = height/2; Vector v(vx.GetData() + 0, sc); Vector x(vx.GetData() + sc, sc); Vector dv_dt(dvx_dt.GetData() + 0, sc); Vector dx_dt(dvx_dt.GetData() + sc, sc); H.Mult(x, z); if (viscosity != 0.0) S.TrueAddMult(v, z); z.Neg(); // z = -z M_solver.Mult(z, dv_dt); dx_dt = v; }