85 #include "Teuchos_GlobalMPISession.hpp"
87 #include "ROL_ParameterList.hpp"
100 template <
class Real,
class Element=Real>
103 template <
class Real,
class Element=Real>
106 template <
class Real,
class Element=Real>
109 template <
class Real,
class Element=Real>
116 template <
class Real,
class Element>
123 ROL::Ptr<std::vector<Element> > std_vec_;
124 mutable ROL::Ptr<OptDualStdVector<Real> > dual_vec_;
126 ROL::Ptr<FiniteDifference<Real> >
fd_;
132 std_vec_(std_vec), dual_vec_(
ROL::nullPtr), fd_(fd) {}
135 const OptStdVector &ex = dynamic_cast<const OptStdVector&>(x);
136 ROL::Ptr<const vector> xvalptr = ex.
getVector();
137 uint dimension = std_vec_->size();
138 for (
uint i=0; i<dimension; i++) {
139 (*std_vec_)[i] += (*xvalptr)[i];
144 uint dimension = std_vec_->size();
145 for (
uint i=0; i<dimension; i++) {
146 (*std_vec_)[i] *= alpha;
155 ROL::Ptr<const vector> xvalptr = ex.
getVector();
157 ROL::Ptr<vector> kxvalptr = ROL::makePtr<vector>(std_vec_->size(), 0.0);
159 fd_->apply(xvalptr,kxvalptr);
161 uint dimension = std_vec_->size();
162 for (
uint i=0; i<dimension; i++) {
163 val += (*std_vec_)[i]*(*kxvalptr)[i];
170 val = std::sqrt( dot(*
this) );
174 ROL::Ptr<Vector<Real> >
clone()
const {
175 return ROL::makePtr<OptStdVector>( ROL::makePtr<vector>(std_vec_->size()), fd_ );
186 ROL::Ptr<Vector<Real> >
basis(
const int i )
const {
187 ROL::Ptr<vector> e_ptr = ROL::makePtr<vector>(std_vec_->size(),0.0);
188 ROL::Ptr<OptStdVector> e = ROL::makePtr<OptStdVector>( e_ptr, fd_ );
193 int dimension()
const {
return static_cast<int>(std_vec_->size());}
198 ROL::Ptr<vector> dual_vecp = ROL::makePtr<vector>(*std_vec_);
199 dual_vec_ = ROL::makePtr<OptDualStdVector<Real>>( dual_vecp, fd_ );
200 fd_->apply(dual_vecp);
208 template <
class Real,
class Element>
215 ROL::Ptr<std::vector<Element> > std_vec_;
216 mutable ROL::Ptr<OptStdVector<Real> > dual_vec_;
217 ROL::Ptr<FiniteDifference<Real> >
fd_;
222 std_vec_(std_vec), dual_vec_(
ROL::nullPtr), fd_(fd) {}
226 ROL::Ptr<const vector> xvalptr = ex.
getVector();
227 uint dimension = std_vec_->size();
228 for (
uint i=0; i<dimension; i++) {
229 (*std_vec_)[i] += (*xvalptr)[i];
234 uint dimension = std_vec_->size();
235 for (
uint i=0; i<dimension; i++) {
236 (*std_vec_)[i] *= alpha;
243 ROL::Ptr<const vector> kxvalptr = ex.
getVector();
244 ROL::Ptr<vector> xvalptr = ROL::makePtr<vector>(std_vec_->size(), 0.0);
245 fd_->solve(kxvalptr,xvalptr);
247 uint dimension = std_vec_->size();
248 for (
unsigned i=0; i<dimension; i++) {
249 val += (*std_vec_)[i]*(*xvalptr)[i];
256 val = std::sqrt( dot(*
this) );
260 ROL::Ptr<Vector<Real> >
clone()
const {
261 return ROL::makePtr<OptDualStdVector>( ROL::makePtr<std::vector<Element>>(std_vec_->size()), fd_ );
264 ROL::Ptr<const std::vector<Element> >
getVector()
const {
272 ROL::Ptr<Vector<Real> >
basis(
const int i )
const {
273 ROL::Ptr<vector> e_ptr = ROL::makePtr<vector>(std_vec_->size(), 0.0 );
274 ROL::Ptr<OptDualStdVector> e = ROL::makePtr<OptDualStdVector>( e_ptr,fd_ );
279 int dimension()
const {
return static_cast<int>(std_vec_->size());}
282 ROL::Ptr<vector> dual_vecp = ROL::makePtr<vector>(*std_vec_);
283 dual_vec_ = ROL::makePtr<OptStdVector<Real>>( dual_vecp, fd_ );
285 fd_->solve(dual_vecp);
295 template <
class Real,
class Element>
302 ROL::Ptr<std::vector<Element> > std_vec_;
303 mutable ROL::Ptr<ConDualStdVector<Real> > dual_vec_;
307 ConStdVector(
const ROL::Ptr<std::vector<Element> > & std_vec) : std_vec_(std_vec), dual_vec_(
ROL::nullPtr) {}
310 const ConStdVector &ex = dynamic_cast<const ConStdVector&>(x);
311 ROL::Ptr<const vector> xvalptr = ex.
getVector();
312 uint dimension = std_vec_->size();
313 for (
uint i=0; i<dimension; i++) {
314 (*std_vec_)[i] += (*xvalptr)[i];
319 uint dimension = std_vec_->size();
320 for (
uint i=0; i<dimension; i++) {
321 (*std_vec_)[i] *= alpha;
328 ROL::Ptr<const vector> xvalptr = ex.
getVector();
330 uint dimension = std_vec_->size();
331 for (
uint i=0; i<dimension; i++) {
332 val += (*std_vec_)[i]*(*xvalptr)[i];
339 val = std::sqrt( dot(*
this) );
343 ROL::Ptr<Vector<Real> >
clone()
const {
344 return ROL::makePtr<ConStdVector>( ROL::makePtr<vector>(std_vec_->size()));
347 ROL::Ptr<const std::vector<Element> >
getVector()
const {
355 ROL::Ptr<Vector<Real> >
basis(
const int i )
const {
356 ROL::Ptr<vector> e_ptr = ROL::makePtr<vector>(std_vec_->size(),0.0);
357 ROL::Ptr<ConStdVector> e = ROL::makePtr<ConStdVector>( e_ptr);
362 int dimension()
const {
return static_cast<int>(std_vec_->size());}
365 dual_vec_ = ROL::makePtr<ConDualStdVector<Real>>( ROL::makePtr<std::vector<Element>>(*std_vec_) );
373 template <
class Real,
class Element>
381 ROL::Ptr<std::vector<Element> > std_vec_;
382 mutable ROL::Ptr<ConStdVector<Real> > dual_vec_;
386 ConDualStdVector(
const ROL::Ptr<std::vector<Element> > & std_vec) : std_vec_(std_vec), dual_vec_(
ROL::nullPtr) {}
390 ROL::Ptr<const vector> xvalptr = ex.
getVector();
391 uint dimension = std_vec_->size();
392 for (
uint i=0; i<dimension; i++) {
393 (*std_vec_)[i] += (*xvalptr)[i];
398 uint dimension = std_vec_->size();
399 for (
uint i=0; i<dimension; i++) {
400 (*std_vec_)[i] *= alpha;
407 ROL::Ptr<const vector> xvalptr = ex.
getVector();
408 uint dimension = std_vec_->size();
409 for (
uint i=0; i<dimension; i++) {
410 val += (*std_vec_)[i]*(*xvalptr)[i];
417 val = std::sqrt( dot(*
this) );
421 ROL::Ptr<Vector<Real> >
clone()
const {
422 return ROL::makePtr<ConDualStdVector>( ROL::makePtr<std::vector<Element>>(std_vec_->size()));
425 ROL::Ptr<const std::vector<Element> >
getVector()
const {
433 ROL::Ptr<Vector<Real> >
basis(
const int i )
const {
434 ROL::Ptr<vector> e_ptr = ROL::makePtr<vector>(std_vec_->size(),0.0);
435 ROL::Ptr<ConDualStdVector> e = ROL::makePtr<ConDualStdVector>( e_ptr );
440 int dimension()
const {
return static_cast<int>(std_vec_->size());}
443 dual_vec_ = ROL::makePtr<ConStdVector<Real>>( ROL::makePtr<std::vector<Element>>(*std_vec_) );
454 template<
class Real,
class XPrim=StdVector<Real>,
class XDual=StdVector<Real> >
472 ROL::Ptr<const std::vector<Real> >
Vp_;
474 ROL::Ptr<FiniteDifference<Real> >
fd_;
484 ROL::Ptr<const vector> vp = dynamic_cast<const XPrim&>(v).getVector();
487 ROL::Ptr<vector> kvp = dynamic_cast<XDual&>(kv).getVector();
491 (*kvp)[0] = (2.0*(*vp)[0]-(*vp)[1])/dx2;
493 for(
uint i=1;i<nx_-1;++i) {
494 (*kvp)[i] = (2.0*(*vp)[i]-(*vp)[i-1]-(*vp)[i+1])/dx2;
497 (*kvp)[nx_-1] = (2.0*(*vp)[nx_-1]-(*vp)[nx_-2])/dx2;
504 Vp_((dynamic_cast<const
StdVector<Real>&>(
V)).getVector()), fd_(fd) {
507 dx_ = (1.0/(1.0+nx_));
520 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
523 ROL::Ptr<vector> kpsip = ROL::makePtr<vector>(nx_, 0.0);
524 XDual kpsi(kpsip,fd_);
530 for(
uint i=0;i<nx_;++i) {
531 J += (*psip)[i]*(*kpsip)[i] + (*Vp_)[i]*pow((*psip)[i],2) + g_*pow((*psip)[i],4);
547 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
550 ROL::Ptr<vector> gp = dynamic_cast<XDual&>(g).getVector();
553 ROL::Ptr<vector> kpsip = ROL::makePtr<vector>(nx_, 0.0);
554 XDual kpsi(kpsip,fd_);
558 for(
uint i=0;i<nx_;++i) {
559 (*gp)[i] = ((*kpsip)[i] + (*Vp_)[i]*(*psip)[i] + 2.0*g_*pow((*psip)[i],3))*dx_;
573 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
576 ROL::Ptr<const vector> vp = dynamic_cast<const XPrim&>(v).getVector();
579 ROL::Ptr<vector> hvp = dynamic_cast<XDual&>(hv).getVector();
583 for(
uint i=0;i<nx_;++i) {
585 (*hvp)[i] += ( (*Vp_)[i] + 6.0*g_*pow((*psip)[i],2) )*(*vp)[i]*dx_;
594 template<
class Real,
class XPrim=StdVector<Real>,
class XDual=StdVector<Real>,
class CPrim=StdVector<Real>,
class CDual=StdVector<Real> >
603 ROL::Ptr<FiniteDifference<Real> >
fd_;
608 nx_(n), dx_(dx), fd_(fd), exactsolve_(exactsolve) {}
620 ROL::Ptr<vector> cp = dynamic_cast<CPrim&>(c).getVector();
623 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
626 for(
uint i=0;i<nx_;++i) {
627 (*cp)[0] += dx_*pow((*psip)[i],2);
639 ROL::Ptr<vector> jvp = dynamic_cast<CPrim&>(jv).getVector();
642 ROL::Ptr<const vector> vp = dynamic_cast<const XPrim&>(v).getVector();
645 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
648 for(
uint i=0;i<nx_;++i) {
649 (*jvp)[0] += 2.0*dx_*(*psip)[i]*(*vp)[i];
661 ROL::Ptr<vector> ajvp = dynamic_cast<XDual&>(ajv).getVector();
664 ROL::Ptr<const vector> vp = dynamic_cast<const CDual&>(v).getVector();
667 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
669 for(
uint i=0;i<nx_;++i) {
670 (*ajvp)[i] = 2.0*dx_*(*psip)[i]*(*vp)[0];
685 ROL::Ptr<vector> ahuvp = dynamic_cast<XDual&>(ahuv).getVector();
688 ROL::Ptr<const vector> up = dynamic_cast<const CDual&>(u).getVector();
691 ROL::Ptr<const vector> vp = dynamic_cast<const XPrim&>(v).getVector();
694 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
696 for(
uint i=0;i<nx_;++i) {
697 (*ahuvp)[i] = 2.0*dx_*(*vp)[i]*(*up)[0];
712 ROL::Ptr<vector> v1p = dynamic_cast<XPrim&>(v1).getVector();
713 ROL::Ptr<vector> v2p = dynamic_cast<CDual&>(v2).getVector();
714 ROL::Ptr<const vector> b1p = dynamic_cast<const XDual&>(b1).getVector();
715 ROL::Ptr<const vector> b2p = dynamic_cast<const CPrim&>(b2).getVector();
716 ROL::Ptr<const vector> psip = dynamic_cast<const XPrim&>(psi).getVector();
718 ROL::Ptr<vector> jacp = ROL::makePtr<vector>(nx_, 0.0);
719 ROL::Ptr<vector> b1dp = ROL::makePtr<vector>(nx_, 0.0);
721 for(
uint i=0;i<nx_;++i) {
722 (*jacp)[i] = (*psip)[i];
723 (*b1dp)[i] = (*b1p)[i];
734 Real d = 1.0/jac.dot(jac);
735 Real p = jac.dot(b1d);
737 (*v2p)[0] = d*(p-(*b2p)[0]);
740 v1.
scale(-(*v2p)[0]);
743 return std::vector<Real>(0);