Real value(const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) { Teuchos::RCP<const Tpetra::MultiVector<> > up = (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real> >(u)).getVector(); Teuchos::RCP<const Tpetra::MultiVector<> > zp = (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real> >(z)).getVector(); data_->updateMaterialDensity (zp); // K u Teuchos::RCP<Tpetra::MultiVector<> > matvecp = Teuchos::rcp(new Tpetra::MultiVector<>(*up, Teuchos::Copy)); data_->ApplyJacobian1ToVec(matvecp, up); Teuchos::Array<Real> dotvalU(1, 0); Teuchos::Array<Real> dotvalZ(1, 0); //u K u up->dot(*matvecp, dotvalU); //z z zp->dot(*zp, dotvalZ); return(0.5*dotvalU[0] + 0.5*alpha_*dotvalZ[0]); }
Real value(const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol) { Teuchos::RCP<const Tpetra::MultiVector<> > up = (Teuchos::dyn_cast<const ROL::TpetraMultiVector<Real> >(u)).getVector(); Teuchos::Array<Real> dotvalU(1, 0); if ( useFU_ ) { data_->updateF(ROL::Objective_SimOpt<Real>::getParameter()); up->dot(*(data_->getVecF()), dotvalU.view(0,1)); } else { Teuchos::RCP<Tpetra::MultiVector<> > matvecp = Teuchos::rcp(new Tpetra::MultiVector<>(*up, Teuchos::Copy)); data_->ApplyJacobian1ToVec(matvecp, up); up->dot(*matvecp, dotvalU.view(0,1)); } return scale_*dotvalU[0]; }