void NonlinearForm::Mult(const Vector &x, Vector &y) const { Array<int> vdofs; Vector el_x, el_y; const FiniteElement *fe; ElementTransformation *T; y = 0.0; if (dfi.Size()) for (int i = 0; i < fes->GetNE(); i++) { fe = fes->GetFE(i); fes->GetElementVDofs(i, vdofs); T = fes->GetElementTransformation(i); x.GetSubVector(vdofs, el_x); for (int k = 0; k < dfi.Size(); k++) { dfi[k]->AssembleElementVector(*fe, *T, el_x, el_y); y.AddElementVector(vdofs, el_y); } } for (int i = 0; i < ess_vdofs.Size(); i++) y(ess_vdofs[i]) = 0.0; // y(ess_vdofs[i]) = x(ess_vdofs[i]); }