54 #include "ROL_TeuchosBatchManager.hpp"
56 #include "Teuchos_LAPACK.hpp"
84 void update(std::vector<Real> &u,
const std::vector<Real> &s,
const Real alpha=1.0)
const {
85 for (
unsigned i=0; i<u.size(); i++) {
90 void axpy(std::vector<Real> &out,
const Real a,
const std::vector<Real> &x,
const std::vector<Real> &y)
const {
91 for (
unsigned i=0; i < x.size(); i++) {
92 out[i] = a*x[i] + y[i];
96 void scale(std::vector<Real> &u,
const Real alpha=0.0)
const {
97 for (
unsigned i=0; i<u.size(); i++) {
102 void linear_solve(std::vector<Real> &u, std::vector<Real> &dl, std::vector<Real> &d, std::vector<Real> &du,
103 const std::vector<Real> &r,
const bool transpose =
false)
const {
104 if ( r.size() == 1 ) {
105 u.resize(1,r[0]/d[0]);
107 else if ( r.size() == 2 ) {
109 Real det = d[0]*d[1] - dl[0]*du[0];
110 u[0] = (d[1]*r[0] - du[0]*r[1])/det;
111 u[1] = (d[0]*r[1] - dl[0]*r[0])/det;
114 u.assign(r.begin(),r.end());
116 Teuchos::LAPACK<int,Real> lp;
117 std::vector<Real> du2(r.size()-2,0.0);
118 std::vector<int> ipiv(r.size(),0);
123 lp.GTTRF(dim,&dl[0],&d[0],&du[0],&du2[0],&ipiv[0],&info);
128 lp.GTTRS(trans,dim,nhrs,&dl[0],&d[0],&du[0],&du2[0],&ipiv[0],&u[0],ldb,&info);
133 BurgersFEM(
int nx = 128, Real nl = 1.0, Real cH1 = 1.0, Real cL2 = 1.0)
137 nu_ = std::pow(10.0,nu-2.0);
159 Real
compute_L2_dot(
const std::vector<Real> &x,
const std::vector<Real> &y)
const {
161 Real c = (((int)x.size()==
nx_) ? 4.0 : 2.0);
162 for (
unsigned i=0; i<x.size(); i++) {
164 ip +=
dx_/6.0*(c*x[i] + x[i+1])*y[i];
166 else if ( i == x.size()-1 ) {
167 ip +=
dx_/6.0*(x[i-1] + c*x[i])*y[i];
170 ip +=
dx_/6.0*(x[i-1] + 4.0*x[i] + x[i+1])*y[i];
182 void apply_mass(std::vector<Real> &Mu,
const std::vector<Real> &u )
const {
183 Mu.resize(u.size(),0.0);
184 Real c = (((int)u.size()==
nx_) ? 4.0 : 2.0);
185 for (
unsigned i=0; i<u.size(); i++) {
187 Mu[i] =
dx_/6.0*(c*u[i] + u[i+1]);
189 else if ( i == u.size()-1 ) {
190 Mu[i] =
dx_/6.0*(u[i-1] + c*u[i]);
193 Mu[i] =
dx_/6.0*(u[i-1] + 4.0*u[i] + u[i+1]);
200 unsigned nx = u.size();
202 std::vector<Real> dl(nx-1,
dx_/6.0);
203 std::vector<Real> d(nx,2.0*
dx_/3.0);
204 std::vector<Real> du(nx-1,
dx_/6.0);
205 if ( (
int)nx !=
nx_ ) {
214 std::vector<Real> u(
nx_,0.0), Mu(
nx_,0.0), iMMu(
nx_,0.0), diff(
nx_,0.0);
215 for (
int i = 0; i <
nx_; i++) {
216 u[i] = 2.0*(Real)rand()/(Real)RAND_MAX - 1.0;
220 axpy(diff,-1.0,iMMu,u);
223 outStream <<
"Test Inverse State Mass Matrix\n";
224 outStream <<
" ||u - inv(M)Mu|| = " << error <<
"\n";
225 outStream <<
" ||u|| = " << normu <<
"\n";
226 outStream <<
" Relative Error = " << error/normu <<
"\n";
229 u.resize(
nx_+2,0.0); Mu.resize(
nx_+2,0.0); iMMu.resize(
nx_+2,0.0); diff.resize(
nx_+2,0.0);
230 for (
int i = 0; i <
nx_+2; i++) {
231 u[i] = 2.0*(Real)rand()/(Real)RAND_MAX - 1.0;
235 axpy(diff,-1.0,iMMu,u);
238 outStream <<
"Test Inverse Control Mass Matrix\n";
239 outStream <<
" ||z - inv(M)Mz|| = " << error <<
"\n";
240 outStream <<
" ||z|| = " << normu <<
"\n";
241 outStream <<
" Relative Error = " << error/normu <<
"\n";
249 Real
compute_H1_dot(
const std::vector<Real> &x,
const std::vector<Real> &y)
const {
251 for (
int i=0; i<
nx_; i++) {
253 ip +=
cL2_*
dx_/6.0*(4.0*x[i] + x[i+1])*y[i];
254 ip +=
cH1_*(2.0*x[i] - x[i+1])/
dx_*y[i];
256 else if ( i ==
nx_-1 ) {
257 ip +=
cL2_*
dx_/6.0*(x[i-1] + 4.0*x[i])*y[i];
258 ip +=
cH1_*(2.0*x[i] - x[i-1])/
dx_*y[i];
261 ip +=
cL2_*
dx_/6.0*(x[i-1] + 4.0*x[i] + x[i+1])*y[i];
262 ip +=
cH1_*(2.0*x[i] - x[i-1] - x[i+1])/
dx_*y[i];
274 void apply_H1(std::vector<Real> &Mu,
const std::vector<Real> &u )
const {
276 for (
int i=0; i<
nx_; i++) {
278 Mu[i] =
cL2_*
dx_/6.0*(4.0*u[i] + u[i+1])
279 +
cH1_*(2.0*u[i] - u[i+1])/
dx_;
281 else if ( i ==
nx_-1 ) {
282 Mu[i] =
cL2_*
dx_/6.0*(u[i-1] + 4.0*u[i])
283 +
cH1_*(2.0*u[i] - u[i-1])/
dx_;
286 Mu[i] =
cL2_*
dx_/6.0*(u[i-1] + 4.0*u[i] + u[i+1])
287 +
cH1_*(2.0*u[i] - u[i-1] - u[i+1])/
dx_;
302 std::vector<Real> u(
nx_,0.0), Mu(
nx_,0.0), iMMu(
nx_,0.0), diff(
nx_,0.0);
303 for (
int i = 0; i <
nx_; i++) {
304 u[i] = 2.0*(Real)rand()/(Real)RAND_MAX - 1.0;
308 axpy(diff,-1.0,iMMu,u);
311 outStream <<
"Test Inverse State H1 Matrix\n";
312 outStream <<
" ||u - inv(M)Mu|| = " << error <<
"\n";
313 outStream <<
" ||u|| = " << normu <<
"\n";
314 outStream <<
" Relative Error = " << error/normu <<
"\n";
323 const std::vector<Real> &z)
const {
326 for (
int i=0; i<
nx_; i++) {
329 r[i] =
nu_/
dx_*(2.0*u[i]-u[i+1]);
332 r[i] =
nu_/
dx_*(2.0*u[i]-u[i-1]);
335 r[i] =
nu_/
dx_*(2.0*u[i]-u[i-1]-u[i+1]);
339 r[i] +=
nl_*u[i+1]*(u[i]+u[i+1])/6.0;
342 r[i] -=
nl_*u[i-1]*(u[i-1]+u[i])/6.0;
345 r[i] -=
dx_/6.0*(z[i]+4.0*z[i+1]+z[i+2]);
359 std::vector<Real> &d,
360 std::vector<Real> &du,
361 const std::vector<Real> &u)
const {
370 for (
int i=0; i<
nx_; i++) {
372 dl[i] +=
nl_*(-2.0*u[i]-u[i+1])/6.0;
373 d[i] +=
nl_*u[i+1]/6.0;
376 d[i] -=
nl_*u[i-1]/6.0;
377 du[i-1] +=
nl_*(u[i-1]+2.0*u[i])/6.0;
387 const std::vector<Real> &v,
388 const std::vector<Real> &u,
389 const std::vector<Real> &z)
const {
391 for (
int i = 0; i <
nx_; i++) {
394 jv[i] += -
nu_/
dx_*v[i-1]-
nl_*(u[i-1]/6.0*v[i]+(u[i]+2.0*u[i-1])/6.0*v[i-1]);
397 jv[i] += -
nu_/
dx_*v[i+1]+
nl_*(u[i+1]/6.0*v[i]+(u[i]+2.0*u[i+1])/6.0*v[i+1]);
400 jv[ 0] -=
nl_*
u0_/6.0*v[0];
406 const std::vector<Real> &v,
407 const std::vector<Real> &u,
408 const std::vector<Real> &z)
const {
410 std::vector<Real> d(
nx_,0.0);
411 std::vector<Real> dl(
nx_-1,0.0);
412 std::vector<Real> du(
nx_-1,0.0);
420 const std::vector<Real> &v,
421 const std::vector<Real> &u,
422 const std::vector<Real> &z)
const {
424 for (
int i = 0; i <
nx_; i++) {
425 ajv[i] =
nu_/
dx_*2.0*v[i];
427 ajv[i] += -
nu_/
dx_*v[i-1]-
nl_*(u[i-1]/6.0*v[i]
428 -(u[i-1]+2.0*u[i])/6.0*v[i-1]);
431 ajv[i] += -
nu_/
dx_*v[i+1]+
nl_*(u[i+1]/6.0*v[i]
432 -(u[i+1]+2.0*u[i])/6.0*v[i+1]);
435 ajv[ 0] -=
nl_*
u0_/6.0*v[0];
441 const std::vector<Real> &v,
442 const std::vector<Real> &u,
443 const std::vector<Real> &z)
const {
445 std::vector<Real> d(
nx_,0.0);
446 std::vector<Real> du(
nx_-1,0.0);
447 std::vector<Real> dl(
nx_-1,0.0);
458 const std::vector<Real> &v,
459 const std::vector<Real> &u,
460 const std::vector<Real> &z)
const {
461 for (
int i=0; i<
nx_; i++) {
463 jv[i] = -
dx_/6.0*(v[i]+4.0*v[i+1]+v[i+2]);
469 const std::vector<Real> &v,
470 const std::vector<Real> &u,
471 const std::vector<Real> &z)
const {
472 for (
int i=0; i<
nx_+2; i++) {
474 jv[i] = -
dx_/6.0*v[i];
477 jv[i] = -
dx_/6.0*(4.0*v[i-1]+v[i]);
479 else if ( i ==
nx_ ) {
480 jv[i] = -
dx_/6.0*(4.0*v[i-1]+v[i-2]);
482 else if ( i ==
nx_+1 ) {
483 jv[i] = -
dx_/6.0*v[i-2];
486 jv[i] = -
dx_/6.0*(v[i-2]+4.0*v[i-1]+v[i]);
495 const std::vector<Real> &w,
496 const std::vector<Real> &v,
497 const std::vector<Real> &u,
498 const std::vector<Real> &z)
const {
499 for (
int i=0; i<
nx_; i++) {
503 ahwv[i] += (w[i]*v[i+1] - w[i+1]*(2.0*v[i]+v[i+1]))/6.0;
506 ahwv[i] += (w[i-1]*(v[i-1]+2.0*v[i]) - w[i]*v[i-1])/6.0;
512 const std::vector<Real> &w,
513 const std::vector<Real> &v,
514 const std::vector<Real> &u,
515 const std::vector<Real> &z) {
516 ahwv.assign(u.size(),0.0);
519 const std::vector<Real> &w,
520 const std::vector<Real> &v,
521 const std::vector<Real> &u,
522 const std::vector<Real> &z) {
523 ahwv.assign(z.size(),0.0);
526 const std::vector<Real> &w,
527 const std::vector<Real> &v,
528 const std::vector<Real> &u,
529 const std::vector<Real> &z) {
530 ahwv.assign(z.size(),0.0);
537 ROL::Ptr<std::vector<Real> >
vec_;
538 ROL::Ptr<BurgersFEM<Real> >
fem_;
540 mutable ROL::Ptr<L2VectorDual<Real> >
dual_vec_;
548 const L2VectorPrimal &ex = dynamic_cast<const L2VectorPrimal&>(x);
549 const std::vector<Real>& xval = *ex.
getVector();
550 std::copy(xval.begin(),xval.end(),
vec_->begin());
554 const L2VectorPrimal &ex = dynamic_cast<const L2VectorPrimal&>(x);
555 const std::vector<Real>& xval = *ex.
getVector();
558 (*vec_)[i] += xval[i];
570 const L2VectorPrimal & ex = dynamic_cast<const L2VectorPrimal&>(x);
571 const std::vector<Real>& xval = *ex.
getVector();
572 return fem_->compute_L2_dot(xval,*
vec_);
577 val = std::sqrt(
dot(*
this) );
581 ROL::Ptr<ROL::Vector<Real> >
clone()
const {
582 return ROL::makePtr<L2VectorPrimal>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
593 ROL::Ptr<ROL::Vector<Real> >
basis(
const int i )
const {
594 ROL::Ptr<L2VectorPrimal> e
595 = ROL::makePtr<L2VectorPrimal>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
596 (*e->getVector())[i] = 1.0;
605 dual_vec_ = ROL::makePtr<L2VectorDual<Real>>(
606 ROL::makePtr<std::vector<Real>>(*vec_),
fem_);
608 fem_->apply_mass(*(ROL::constPtrCast<std::vector<Real> >(
dual_vec_->getVector())),*
vec_);
617 ROL::Ptr<std::vector<Real> >
vec_;
618 ROL::Ptr<BurgersFEM<Real> >
fem_;
620 mutable ROL::Ptr<L2VectorPrimal<Real> >
dual_vec_;
628 const L2VectorDual &ex = dynamic_cast<const L2VectorDual&>(x);
629 const std::vector<Real>& xval = *ex.
getVector();
630 std::copy(xval.begin(),xval.end(),
vec_->begin());
634 const L2VectorDual &ex = dynamic_cast<const L2VectorDual&>(x);
635 const std::vector<Real>& xval = *ex.
getVector();
638 (*vec_)[i] += xval[i];
650 const L2VectorDual & ex = dynamic_cast<const L2VectorDual&>(x);
651 const std::vector<Real>& xval = *ex.
getVector();
654 fem_->apply_inverse_mass(Mx,xval);
656 for (
unsigned i = 0; i <
dimension; i++) {
657 val += Mx[i]*(*vec_)[i];
664 val = std::sqrt(
dot(*
this) );
668 ROL::Ptr<ROL::Vector<Real> >
clone()
const {
669 return ROL::makePtr<L2VectorDual>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
680 ROL::Ptr<ROL::Vector<Real> >
basis(
const int i )
const {
681 ROL::Ptr<L2VectorDual> e
682 = ROL::makePtr<L2VectorDual>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
683 (*e->getVector())[i] = 1.0;
692 dual_vec_ = ROL::makePtr<L2VectorPrimal<Real>>(
693 ROL::makePtr<std::vector<Real>>(*vec_),
fem_);
695 fem_->apply_inverse_mass(*(ROL::constPtrCast<std::vector<Real> >(
dual_vec_->getVector())),*
vec_);
704 ROL::Ptr<std::vector<Real> >
vec_;
705 ROL::Ptr<BurgersFEM<Real> >
fem_;
707 mutable ROL::Ptr<H1VectorDual<Real> >
dual_vec_;
715 const H1VectorPrimal &ex = dynamic_cast<const H1VectorPrimal&>(x);
716 const std::vector<Real>& xval = *ex.
getVector();
717 std::copy(xval.begin(),xval.end(),
vec_->begin());
721 const H1VectorPrimal &ex = dynamic_cast<const H1VectorPrimal&>(x);
722 const std::vector<Real>& xval = *ex.
getVector();
725 (*vec_)[i] += xval[i];
737 const H1VectorPrimal & ex = dynamic_cast<const H1VectorPrimal&>(x);
738 const std::vector<Real>& xval = *ex.
getVector();
739 return fem_->compute_H1_dot(xval,*
vec_);
744 val = std::sqrt(
dot(*
this) );
748 ROL::Ptr<ROL::Vector<Real> >
clone()
const {
749 return ROL::makePtr<H1VectorPrimal>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
760 ROL::Ptr<ROL::Vector<Real> >
basis(
const int i )
const {
761 ROL::Ptr<H1VectorPrimal> e
762 = ROL::makePtr<H1VectorPrimal>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
763 (*e->getVector())[i] = 1.0;
772 dual_vec_ = ROL::makePtr<H1VectorDual<Real>>(
773 ROL::makePtr<std::vector<Real>>(*vec_),
fem_);
775 fem_->apply_H1(*(ROL::constPtrCast<std::vector<Real> >(
dual_vec_->getVector())),*
vec_);
784 ROL::Ptr<std::vector<Real> >
vec_;
785 ROL::Ptr<BurgersFEM<Real> >
fem_;
787 mutable ROL::Ptr<H1VectorPrimal<Real> >
dual_vec_;
795 const H1VectorDual &ex = dynamic_cast<const H1VectorDual&>(x);
796 const std::vector<Real>& xval = *ex.
getVector();
797 std::copy(xval.begin(),xval.end(),
vec_->begin());
801 const H1VectorDual &ex = dynamic_cast<const H1VectorDual&>(x);
802 const std::vector<Real>& xval = *ex.
getVector();
805 (*vec_)[i] += xval[i];
817 const H1VectorDual & ex = dynamic_cast<const H1VectorDual&>(x);
818 const std::vector<Real>& xval = *ex.
getVector();
821 fem_->apply_inverse_H1(Mx,xval);
823 for (
unsigned i = 0; i <
dimension; i++) {
824 val += Mx[i]*(*vec_)[i];
831 val = std::sqrt(
dot(*
this) );
835 ROL::Ptr<ROL::Vector<Real> >
clone()
const {
836 return ROL::makePtr<H1VectorDual>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
847 ROL::Ptr<ROL::Vector<Real> >
basis(
const int i )
const {
848 ROL::Ptr<H1VectorDual> e
849 = ROL::makePtr<H1VectorDual>( ROL::makePtr<std::vector<Real>>(
vec_->size(),0.0),
fem_);
850 (*e->getVector())[i] = 1.0;
859 dual_vec_ = ROL::makePtr<H1VectorPrimal<Real>>(
860 ROL::makePtr<std::vector<Real>>(*vec_),
fem_);
862 fem_->apply_inverse_H1(*(ROL::constPtrCast<std::vector<Real> >(
dual_vec_->getVector())),*
vec_);
883 ROL::Ptr<BurgersFEM<Real> >
fem_;
892 ROL::Ptr<std::vector<Real> > cp =
893 dynamic_cast<PrimalConstraintVector&>(c).getVector();
894 ROL::Ptr<const std::vector<Real> > up =
895 dynamic_cast<const PrimalStateVector& >(u).getVector();
896 ROL::Ptr<const std::vector<Real> > zp =
897 dynamic_cast<const PrimalControlVector&>(z).getVector();
899 const std::vector<Real> param
901 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
903 fem_->compute_residual(*cp,*up,*zp);
908 ROL::Ptr<std::vector<Real> > jvp =
909 dynamic_cast<PrimalConstraintVector&>(jv).getVector();
910 ROL::Ptr<const std::vector<Real> > vp =
911 dynamic_cast<const PrimalStateVector&>(v).getVector();
912 ROL::Ptr<const std::vector<Real> > up =
913 dynamic_cast<const PrimalStateVector&>(u).getVector();
914 ROL::Ptr<const std::vector<Real> > zp =
915 dynamic_cast<const PrimalControlVector&>(z).getVector();
917 const std::vector<Real> param
919 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
921 fem_->apply_pde_jacobian(*jvp,*vp,*up,*zp);
926 ROL::Ptr<std::vector<Real> > jvp =
927 dynamic_cast<PrimalConstraintVector&>(jv).getVector();
928 ROL::Ptr<const std::vector<Real> > vp =
929 dynamic_cast<const PrimalControlVector&>(v).getVector();
930 ROL::Ptr<const std::vector<Real> > up =
931 dynamic_cast<const PrimalStateVector&>(u).getVector();
932 ROL::Ptr<const std::vector<Real> > zp =
933 dynamic_cast<const PrimalControlVector&>(z).getVector();
935 const std::vector<Real> param
937 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
939 fem_->apply_control_jacobian(*jvp,*vp,*up,*zp);
944 ROL::Ptr<std::vector<Real> > ijvp =
945 dynamic_cast<PrimalStateVector&>(ijv).getVector();
946 ROL::Ptr<const std::vector<Real> > vp =
947 dynamic_cast<const PrimalConstraintVector&>(v).getVector();
948 ROL::Ptr<const std::vector<Real> > up =
949 dynamic_cast<const PrimalStateVector&>(u).getVector();
950 ROL::Ptr<const std::vector<Real> > zp =
951 dynamic_cast<const PrimalControlVector&>(z).getVector();
953 const std::vector<Real> param
955 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
957 fem_->apply_inverse_pde_jacobian(*ijvp,*vp,*up,*zp);
962 ROL::Ptr<std::vector<Real> > jvp =
963 dynamic_cast<DualStateVector&>(ajv).getVector();
964 ROL::Ptr<const std::vector<Real> > vp =
965 dynamic_cast<const DualConstraintVector&>(v).getVector();
966 ROL::Ptr<const std::vector<Real> > up =
967 dynamic_cast<const PrimalStateVector&>(u).getVector();
968 ROL::Ptr<const std::vector<Real> > zp =
969 dynamic_cast<const PrimalControlVector&>(z).getVector();
971 const std::vector<Real> param
973 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
975 fem_->apply_adjoint_pde_jacobian(*jvp,*vp,*up,*zp);
980 ROL::Ptr<std::vector<Real> > jvp =
981 dynamic_cast<DualControlVector&>(jv).getVector();
982 ROL::Ptr<const std::vector<Real> > vp =
983 dynamic_cast<const DualConstraintVector&>(v).getVector();
984 ROL::Ptr<const std::vector<Real> > up =
985 dynamic_cast<const PrimalStateVector&>(u).getVector();
986 ROL::Ptr<const std::vector<Real> > zp =
987 dynamic_cast<const PrimalControlVector&>(z).getVector();
989 const std::vector<Real> param
991 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
993 fem_->apply_adjoint_control_jacobian(*jvp,*vp,*up,*zp);
998 ROL::Ptr<std::vector<Real> > iajvp =
999 dynamic_cast<DualConstraintVector&>(iajv).getVector();
1000 ROL::Ptr<const std::vector<Real> > vp =
1001 dynamic_cast<const DualStateVector&>(v).getVector();
1002 ROL::Ptr<const std::vector<Real> > up =
1003 dynamic_cast<const PrimalStateVector&>(u).getVector();
1004 ROL::Ptr<const std::vector<Real> > zp =
1005 dynamic_cast<const PrimalControlVector&>(z).getVector();
1007 const std::vector<Real> param
1009 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
1011 fem_->apply_inverse_adjoint_pde_jacobian(*iajvp,*vp,*up,*zp);
1017 ROL::Ptr<std::vector<Real> > ahwvp =
1018 dynamic_cast<DualStateVector&>(ahwv).getVector();
1019 ROL::Ptr<const std::vector<Real> > wp =
1020 dynamic_cast<const DualConstraintVector&>(w).getVector();
1021 ROL::Ptr<const std::vector<Real> > vp =
1022 dynamic_cast<const PrimalStateVector&>(v).getVector();
1023 ROL::Ptr<const std::vector<Real> > up =
1024 dynamic_cast<const PrimalStateVector&>(u).getVector();
1025 ROL::Ptr<const std::vector<Real> > zp =
1026 dynamic_cast<const PrimalControlVector&>(z).getVector();
1028 const std::vector<Real> param
1030 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
1032 fem_->apply_adjoint_pde_hessian(*ahwvp,*wp,*vp,*up,*zp);
1042 ROL::Ptr<std::vector<Real> > ahwvp =
1043 dynamic_cast<DualControlVector&>(ahwv).getVector();
1044 ROL::Ptr<const std::vector<Real> > wp =
1045 dynamic_cast<const DualConstraintVector&>(w).getVector();
1046 ROL::Ptr<const std::vector<Real> > vp =
1047 dynamic_cast<const PrimalStateVector&>(v).getVector();
1048 ROL::Ptr<const std::vector<Real> > up =
1049 dynamic_cast<const PrimalStateVector&>(u).getVector();
1050 ROL::Ptr<const std::vector<Real> > zp =
1051 dynamic_cast<const PrimalControlVector&>(z).getVector();
1053 const std::vector<Real> param
1055 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
1057 fem_->apply_adjoint_control_pde_hessian(*ahwvp,*wp,*vp,*up,*zp);
1066 ROL::Ptr<std::vector<Real> > ahwvp =
1067 dynamic_cast<DualStateVector&>(ahwv).getVector();
1068 ROL::Ptr<const std::vector<Real> > wp =
1069 dynamic_cast<const DualConstraintVector&>(w).getVector();
1070 ROL::Ptr<const std::vector<Real> > vp =
1071 dynamic_cast<const PrimalControlVector&>(v).getVector();
1072 ROL::Ptr<const std::vector<Real> > up =
1073 dynamic_cast<const PrimalStateVector&>(u).getVector();
1074 ROL::Ptr<const std::vector<Real> > zp =
1075 dynamic_cast<const PrimalControlVector&>(z).getVector();
1077 const std::vector<Real> param
1079 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
1081 fem_->apply_adjoint_pde_control_hessian(*ahwvp,*wp,*vp,*up,*zp);
1090 ROL::Ptr<std::vector<Real> > ahwvp =
1091 dynamic_cast<DualControlVector&>(ahwv).getVector();
1092 ROL::Ptr<const std::vector<Real> > wp =
1093 dynamic_cast<const DualConstraintVector&>(w).getVector();
1094 ROL::Ptr<const std::vector<Real> > vp =
1095 dynamic_cast<const PrimalControlVector&>(v).getVector();
1096 ROL::Ptr<const std::vector<Real> > up =
1097 dynamic_cast<const PrimalStateVector&>(u).getVector();
1098 ROL::Ptr<const std::vector<Real> > zp =
1099 dynamic_cast<const PrimalControlVector&>(z).getVector();
1101 const std::vector<Real> param
1103 fem_->set_problem_data(param[0],param[1],param[2],param[3]);
1105 fem_->apply_adjoint_control_hessian(*ahwvp,*wp,*vp,*up,*zp);
1113 template<
class Real>
1125 ROL::Ptr<BurgersFEM<Real> >
fem_;
1132 Real x = 0.0) :
fem_(fem),
x_(x) {
1133 for (
int i = 1; i <
fem_->num_dof()+1; i++) {
1134 if ( (Real)i*(
fem_->mesh_spacing()) >=
x_ ) {
1143 ROL::Ptr<const std::vector<Real> > up =
1144 dynamic_cast<const PrimalStateVector&>(u).getVector();
1153 Real val = 0.5*((((Real)
indices_[0]+1.)*(
fem_->mesh_spacing())-
x_)
1163 ROL::Ptr<std::vector<Real> > gp =
1164 dynamic_cast<DualStateVector&>(g).getVector();
1165 ROL::Ptr<const std::vector<Real> > up =
1166 dynamic_cast<const PrimalStateVector&>(u).getVector();
1179 +(
fem_->mesh_spacing()));
1225 template<
class Real>
1229 std::vector<Real>
x_lo_;
1230 std::vector<Real>
x_up_;
1233 ROL::Ptr<BurgersFEM<Real> >
fem_;
1234 ROL::Ptr<ROL::Vector<Real> >
l_;
1235 ROL::Ptr<ROL::Vector<Real> >
u_;
1242 catch (std::exception &e) {
1252 catch (std::exception &e) {
1257 void axpy(std::vector<Real> &out,
const Real a,
1258 const std::vector<Real> &x,
const std::vector<Real> &y)
const{
1259 out.resize(
dim_,0.0);
1260 for (
unsigned i = 0; i <
dim_; i++) {
1261 out[i] = a*x[i] + y[i];
1266 for (
int i = 0; i <
dim_; i++ ) {
1267 x[i] = std::max(
x_lo_[i],std::min(
x_up_[i],x[i]));
1276 for (
int i = 0; i <
dim_; i++ ) {
1285 l_ = ROL::makePtr<L2VectorPrimal<Real>>(
1286 ROL::makePtr<std::vector<Real>>(l), fem);
1287 u_ = ROL::makePtr<L2VectorPrimal<Real>>(
1288 ROL::makePtr<std::vector<Real>>(u), fem);
1295 for (
int i = 0; i <
dim_; i++ ) {
1296 if ( (*ex)[i] >=
x_lo_[i] && (*ex)[i] <=
x_up_[i] ) { cnt *= 1; }
1299 if ( cnt == 0 ) { val =
false; }
1304 ROL::Ptr<std::vector<Real> > ex;
cast_vector(ex,x);
1310 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1312 for (
int i = 0; i <
dim_; i++ ) {
1313 if ( ((*ex)[i] <=
x_lo_[i]+epsn) ) {
1321 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1323 for (
int i = 0; i <
dim_; i++ ) {
1324 if ( ((*ex)[i] >=
x_up_[i]-epsn) ) {
1332 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1334 for (
int i = 0; i <
dim_; i++ ) {
1335 if ( ((*ex)[i] <=
x_lo_[i]+epsn) ||
1336 ((*ex)[i] >=
x_up_[i]-epsn) ) {
1345 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1347 for (
int i = 0; i <
dim_; i++ ) {
1348 if ( ((*ex)[i] <=
x_lo_[i]+epsn && (*eg)[i] > 0.0) ) {
1357 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1359 for (
int i = 0; i <
dim_; i++ ) {
1360 if ( ((*ex)[i] >=
x_up_[i]-epsn && (*eg)[i] < 0.0) ) {
1369 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1371 for (
int i = 0; i <
dim_; i++ ) {
1372 if ( ((*ex)[i] <=
x_lo_[i]+epsn && (*eg)[i] > 0.0) ||
1373 ((*ex)[i] >=
x_up_[i]-epsn && (*eg)[i] < 0.0) ) {
1388 template<
class Real>
1392 std::vector<Real>
x_lo_;
1393 std::vector<Real>
x_up_;
1396 ROL::Ptr<BurgersFEM<Real> >
fem_;
1397 ROL::Ptr<ROL::Vector<Real> >
l_;
1398 ROL::Ptr<ROL::Vector<Real> >
u_;
1403 xvec = ROL::constPtrCast<std::vector<Real> >(
1406 catch (std::exception &e) {
1407 xvec = ROL::constPtrCast<std::vector<Real> >(
1418 catch (std::exception &e) {
1424 void axpy(std::vector<Real> &out,
const Real a,
1425 const std::vector<Real> &x,
const std::vector<Real> &y)
const{
1426 out.resize(
dim_,0.0);
1427 for (
unsigned i = 0; i <
dim_; i++) {
1428 out[i] = a*x[i] + y[i];
1433 for (
int i = 0; i <
dim_; i++ ) {
1434 x[i] = std::max(
x_lo_[i],std::min(
x_up_[i],x[i]));
1443 for (
int i = 0; i <
dim_; i++ ) {
1452 l_ = ROL::makePtr<H1VectorPrimal<Real>>(
1453 ROL::makePtr<std::vector<Real>>(l), fem);
1454 u_ = ROL::makePtr<H1VectorPrimal<Real>>(
1455 ROL::makePtr<std::vector<Real>>(u), fem);
1462 for (
int i = 0; i <
dim_; i++ ) {
1463 if ( (*ex)[i] >=
x_lo_[i] && (*ex)[i] <=
x_up_[i] ) { cnt *= 1; }
1466 if ( cnt == 0 ) { val =
false; }
1471 ROL::Ptr<std::vector<Real> > ex;
cast_vector(ex,x);
1477 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1479 for (
int i = 0; i <
dim_; i++ ) {
1480 if ( ((*ex)[i] <=
x_lo_[i]+epsn) ) {
1488 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1490 for (
int i = 0; i <
dim_; i++ ) {
1491 if ( ((*ex)[i] >=
x_up_[i]-epsn) ) {
1499 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1501 for (
int i = 0; i <
dim_; i++ ) {
1502 if ( ((*ex)[i] <=
x_lo_[i]+epsn) ||
1503 ((*ex)[i] >=
x_up_[i]-epsn) ) {
1512 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1514 for (
int i = 0; i <
dim_; i++ ) {
1515 if ( ((*ex)[i] <=
x_lo_[i]+epsn && (*eg)[i] > 0.0) ) {
1524 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1526 for (
int i = 0; i <
dim_; i++ ) {
1527 if ( ((*ex)[i] >=
x_up_[i]-epsn && (*eg)[i] < 0.0) ) {
1536 ROL::Ptr<std::vector<Real> > ev;
cast_vector(ev,v);
1538 for (
int i = 0; i <
dim_; i++ ) {
1539 if ( ((*ex)[i] <=
x_lo_[i]+epsn && (*eg)[i] > 0.0) ||
1540 ((*ex)[i] >=
x_up_[i]-epsn && (*eg)[i] < 0.0) ) {
1555 template<
class Real,
class Ordinal>
1561 xvec = ROL::constPtrCast<std::vector<Real> >(
1564 catch (std::exception &e) {
1565 xvec = ROL::constPtrCast<std::vector<Real> >(
1572 :
ROL::TeuchosBatchManager<Real,Ordinal>(comm) {}
1574 ROL::Ptr<std::vector<Real> > input_ptr;
1576 int dim_i = input_ptr->size();
1577 ROL::Ptr<std::vector<Real> > output_ptr;
1579 int dim_o = output_ptr->size();
1580 if ( dim_i != dim_o ) {
1581 std::cout <<
"L2VectorBatchManager: DIMENSION MISMATCH ON RANK "
1582 << ROL::TeuchosBatchManager<Real,Ordinal>::batchID() <<
"\n";
1585 ROL::TeuchosBatchManager<Real,Ordinal>::sumAll(&(*input_ptr)[0],&(*output_ptr)[0],dim_i);
1590 template<
class Real,
class Ordinal>
1596 xvec = ROL::constPtrCast<std::vector<Real> >(
1599 catch (std::exception &e) {
1600 xvec = ROL::constPtrCast<std::vector<Real> >(
1607 :
ROL::TeuchosBatchManager<Real,Ordinal>(comm) {}
1609 ROL::Ptr<std::vector<Real> > input_ptr;
1611 int dim_i = input_ptr->size();
1612 ROL::Ptr<std::vector<Real> > output_ptr;
1614 int dim_o = output_ptr->size();
1615 if ( dim_i != dim_o ) {
1616 std::cout <<
"H1VectorBatchManager: DIMENSION MISMATCH ON RANK "
1617 << ROL::TeuchosBatchManager<Real,Ordinal>::batchID() <<
"\n";
1620 ROL::TeuchosBatchManager<Real,Ordinal>::sumAll(&(*input_ptr)[0],&(*output_ptr)[0],dim_i);
1625 template<
class Real>
1626 Real
random(
const ROL::Ptr<
const Teuchos::Comm<int> > &comm) {
1628 if ( Teuchos::rank<int>(*comm)==0 ) {
1629 val = (Real)rand()/(Real)RAND_MAX;
1631 Teuchos::broadcast<int,Real>(*comm,0,1,&val);