Пример #1
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::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]);
  }
Пример #2
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];
    }