45 #include "Teuchos_LAPACK.hpp"
46 #include "Teuchos_GlobalMPISession.hpp"
47 #include "Teuchos_Comm.hpp"
48 #include "Teuchos_DefaultComm.hpp"
49 #include "Teuchos_CommHelpers.hpp"
51 #include "ROL_ParameterList.hpp"
65 #include "ROL_StdTeuchosBatchManager.hpp"
74 return std::sqrt(
dot(r,r));
77 Real
dot(
const std::vector<Real> &x,
const std::vector<Real> &y) {
79 Real c = (((int)x.size()==
nx_) ? 4.0 : 2.0);
80 for (
unsigned i=0; i<x.size(); i++) {
82 ip +=
dx_/6.0*(c*x[i] + x[i+1])*y[i];
84 else if ( i == x.size()-1 ) {
85 ip +=
dx_/6.0*(x[i-1] + c*x[i])*y[i];
88 ip +=
dx_/6.0*(x[i-1] + 4.0*x[i] + x[i+1])*y[i];
96 void update(std::vector<Real> &u,
const std::vector<Real> &s,
const Real alpha=1.0) {
97 for (
unsigned i=0; i<u.size(); i++) {
102 void scale(std::vector<Real> &u,
const Real alpha=0.0) {
103 for (
unsigned i=0; i<u.size(); i++) {
109 const std::vector<Real> &z) {
110 r.clear(); r.resize(
nx_,0.0);
111 const std::vector<Real> param =
113 Real nu = std::pow(10.0,param[0]-2.0);
114 Real f = param[1]/100.0;
115 Real u0 = 1.0+param[2]/1000.0;
116 Real u1 = param[3]/1000.0;
117 for (
int i=0; i<
nx_; i++) {
120 r[i] = nu/
dx_*(2.0*u[i]-u[i+1]);
123 r[i] = nu/
dx_*(2.0*u[i]-u[i-1]);
126 r[i] = nu/
dx_*(2.0*u[i]-u[i-1]-u[i+1]);
130 r[i] += u[i+1]*(u[i]+u[i+1])/6.0;
133 r[i] -= u[i-1]*(u[i-1]+u[i])/6.0;
136 r[i] -=
dx_/6.0*(z[i]+4.0*z[i+1]+z[i+2]);
141 r[ 0] -= u0*u[ 0]/6.0 + u0*u0/6.0 + nu*u0/
dx_;
142 r[
nx_-1] += u1*u[
nx_-1]/6.0 + u1*u1/6.0 - nu*u1/
dx_;
146 const std::vector<Real> &u) {
147 const std::vector<Real> param =
149 Real nu = std::pow(10.0,param[0]-2.0);
150 Real u0 = 1.0+param[2]/1000.0;
151 Real u1 = param[3]/1000.0;
153 d.clear(); d.resize(
nx_,nu*2.0/
dx_);
154 dl.clear(); dl.resize(
nx_-1,-nu/
dx_);
155 du.clear(); du.resize(
nx_-1,-nu/
dx_);
157 for (
int i=0; i<
nx_; i++) {
159 dl[i] += (-2.0*u[i]-u[i+1])/6.0;
164 du[i-1] += (u[i-1]+2.0*u[i])/6.0;
172 void linear_solve(std::vector<Real> &u, std::vector<Real> &dl, std::vector<Real> &d, std::vector<Real> &du,
173 const std::vector<Real> &r,
const bool transpose =
false) {
174 u.assign(r.begin(),r.end());
176 Teuchos::LAPACK<int,Real> lp;
177 std::vector<Real> du2(
nx_-2,0.0);
178 std::vector<int> ipiv(
nx_,0);
182 lp.GTTRF(
nx_,&dl[0],&d[0],&du[0],&du2[0],&ipiv[0],&info);
187 lp.GTTRS(trans,
nx_,nhrs,&dl[0],&d[0],&du[0],&du2[0],&ipiv[0],&u[0],ldb,&info);
196 ROL::Ptr<std::vector<Real> > cp =
198 ROL::Ptr<const std::vector<Real> > up =
200 ROL::Ptr<const std::vector<Real> > zp =
206 ROL::Ptr<std::vector<Real> > up =
208 up->assign(up->size(),static_cast<Real>(1));
214 ROL::Ptr<std::vector<Real> > jvp =
216 ROL::Ptr<const std::vector<Real> > vp =
218 ROL::Ptr<const std::vector<Real> > up =
220 ROL::Ptr<const std::vector<Real> > zp =
222 const std::vector<Real> param =
224 Real nu = std::pow(10.0,param[0]-2.0);
225 Real u0 = 1.0+param[2]/1000.0;
226 Real u1 = param[3]/1000.0;
228 for (
int i = 0; i <
nx_; i++) {
229 (*jvp)[i] = nu/
dx_*2.0*(*vp)[i];
231 (*jvp)[i] += -nu/
dx_*(*vp)[i-1]
232 -(*up)[i-1]/6.0*(*vp)[i]
233 -((*up)[i]+2.0*(*up)[i-1])/6.0*(*vp)[i-1];
236 (*jvp)[i] += -nu/
dx_*(*vp)[i+1]
237 +(*up)[i+1]/6.0*(*vp)[i]
238 +((*up)[i]+2.0*(*up)[i+1])/6.0*(*vp)[i+1];
241 (*jvp)[ 0] -= u0/6.0*(*vp)[0];
242 (*jvp)[
nx_-1] += u1/6.0*(*vp)[
nx_-1];
247 ROL::Ptr<std::vector<Real> > jvp =
249 ROL::Ptr<const std::vector<Real>> vp =
251 ROL::Ptr<const std::vector<Real>> up =
253 ROL::Ptr<const std::vector<Real>> zp =
255 for (
int i=0; i<
nx_; i++) {
257 (*jvp)[i] = -
dx_/6.0*((*vp)[i]+4.0*(*vp)[i+1]+(*vp)[i+2]);
263 ROL::Ptr<std::vector<Real> > ijvp =
265 ROL::Ptr<const std::vector<Real> > vp =
267 ROL::Ptr<const std::vector<Real> > up =
269 ROL::Ptr<const std::vector<Real> > zp =
272 std::vector<Real> d(
nx_,0.0);
273 std::vector<Real> dl(
nx_-1,0.0);
274 std::vector<Real> du(
nx_-1,0.0);
282 ROL::Ptr<std::vector<Real> > jvp =
284 ROL::Ptr<const std::vector<Real> > vp =
286 ROL::Ptr<const std::vector<Real> > up =
288 ROL::Ptr<const std::vector<Real> > zp =
290 const std::vector<Real> param =
292 Real nu = std::pow(10.0,param[0]-2.0);
293 Real u0 = 1.0+param[2]/1000.0;
294 Real u1 = param[3]/1000.0;
296 for (
int i = 0; i <
nx_; i++) {
297 (*jvp)[i] = nu/
dx_*2.0*(*vp)[i];
299 (*jvp)[i] += -nu/
dx_*(*vp)[i-1]
300 -(*up)[i-1]/6.0*(*vp)[i]
301 +((*up)[i-1]+2.0*(*up)[i])/6.0*(*vp)[i-1];
304 (*jvp)[i] += -nu/
dx_*(*vp)[i+1]
305 +(*up)[i+1]/6.0*(*vp)[i]
306 -((*up)[i+1]+2.0*(*up)[i])/6.0*(*vp)[i+1];
309 (*jvp)[ 0] -= u0/6.0*(*vp)[0];
310 (*jvp)[
nx_-1] += u1/6.0*(*vp)[
nx_-1];
315 ROL::Ptr<std::vector<Real> > jvp =
317 ROL::Ptr<const std::vector<Real> > vp =
319 ROL::Ptr<const std::vector<Real> > up =
321 ROL::Ptr<const std::vector<Real> > zp =
323 for (
int i=0; i<
nx_+2; i++) {
325 (*jvp)[i] = -
dx_/6.0*(*vp)[i];
328 (*jvp)[i] = -
dx_/6.0*(4.0*(*vp)[i-1]+(*vp)[i]);
330 else if ( i ==
nx_ ) {
331 (*jvp)[i] = -
dx_/6.0*(4.0*(*vp)[i-1]+(*vp)[i-2]);
333 else if ( i ==
nx_+1 ) {
334 (*jvp)[i] = -
dx_/6.0*(*vp)[i-2];
337 (*jvp)[i] = -
dx_/6.0*((*vp)[i-2]+4.0*(*vp)[i-1]+(*vp)[i]);
344 ROL::Ptr<std::vector<Real> > iajvp =
346 ROL::Ptr<const std::vector<Real> > vp =
348 ROL::Ptr<const std::vector<Real>> up =
351 std::vector<Real> d(
nx_,0.0);
352 std::vector<Real> du(
nx_-1,0.0);
353 std::vector<Real> dl(
nx_-1,0.0);
361 ROL::Ptr<std::vector<Real> > ahwvp =
363 ROL::Ptr<const std::vector<Real> > wp =
365 ROL::Ptr<const std::vector<Real> > vp =
367 ROL::Ptr<const std::vector<Real> > up =
369 ROL::Ptr<const std::vector<Real> > zp =
371 for (
int i=0; i<
nx_; i++) {
375 (*ahwvp)[i] += ((*wp)[i]*(*vp)[i+1] - (*wp)[i+1]*(2.0*(*vp)[i]+(*vp)[i+1]))/6.0;
378 (*ahwvp)[i] += ((*wp)[i-1]*((*vp)[i-1]+2.0*(*vp)[i]) - (*wp)[i]*(*vp)[i-1])/6.0;
412 case 1: val = ((x<0.5) ? 1.0 : 0.0);
break;
413 case 2: val = 1.0;
break;
414 case 3: val = std::abs(std::sin(8.0*M_PI*x));
break;
415 case 4: val = std::exp(-0.5*(x-0.5)*(x-0.5));
break;
420 Real
dot(
const std::vector<Real> &x,
const std::vector<Real> &y) {
422 Real c = (((int)x.size()==
nx_) ? 4.0 : 2.0);
423 for (
unsigned i=0; i<x.size(); i++) {
425 ip +=
dx_/6.0*(c*x[i] + x[i+1])*y[i];
427 else if ( i == x.size()-1 ) {
428 ip +=
dx_/6.0*(x[i-1] + c*x[i])*y[i];
431 ip +=
dx_/6.0*(x[i-1] + 4.0*x[i] + x[i+1])*y[i];
437 void apply_mass(std::vector<Real> &Mu,
const std::vector<Real> &u ) {
438 Mu.resize(u.size(),0.0);
439 Real c = (((int)u.size()==
nx_) ? 4.0 : 2.0);
440 for (
unsigned i=0; i<u.size(); i++) {
442 Mu[i] =
dx_/6.0*(c*u[i] + u[i+1]);
444 else if ( i == u.size()-1 ) {
445 Mu[i] =
dx_/6.0*(u[i-1] + c*u[i]);
448 Mu[i] =
dx_/6.0*(u[i-1] + 4.0*u[i] + u[i+1]);
459 dx_ = 1.0/((Real)nx+1.0);
465 ROL::Ptr<const std::vector<Real> > up =
467 ROL::Ptr<const std::vector<Real> > zp =
470 Real res1 = 0.0, res2 = 0.0, res3 = 0.0;
471 Real valu = 0.0, valz =
dot(*zp,*zp);
472 for (
int i=0; i<
nx_; i++) {
476 valu +=
dx_/6.0*(4.0*res1 + res2)*res1;
478 else if ( i ==
nx_-1 ) {
481 valu +=
dx_/6.0*(res1 + 4.0*res2)*res2;
487 valu +=
dx_/6.0*(res1 + 4.0*res2 + res3)*res2;
490 return 0.5*(valu +
alpha_*valz);
495 ROL::Ptr<std::vector<Real> > gup =
498 ROL::Ptr<const std::vector<Real> > up =
500 ROL::Ptr<const std::vector<Real> > zp =
503 std::vector<Real> diff(
nx_,0.0);
504 for (
int i=0; i<
nx_; i++) {
512 ROL::Ptr<std::vector<Real> > gzp =
515 ROL::Ptr<const std::vector<Real> > up =
517 ROL::Ptr<const std::vector<Real> > zp =
520 for (
int i=0; i<
nx_+2; i++) {
522 (*gzp)[i] =
alpha_*
dx_/6.0*(2.0*(*zp)[i]+(*zp)[i+1]);
525 (*gzp)[i] =
alpha_*
dx_/6.0*(2.0*(*zp)[i]+(*zp)[i-1]);
528 (*gzp)[i] =
alpha_*
dx_/6.0*((*zp)[i-1]+4.0*(*zp)[i]+(*zp)[i+1]);
535 ROL::Ptr<std::vector<Real> > hvup =
538 ROL::Ptr<const std::vector<Real> > vup =
556 ROL::Ptr<std::vector<Real> > hvzp =
559 ROL::Ptr<const std::vector<Real> > vzp =
562 for (
int i=0; i<
nx_+2; i++) {
564 (*hvzp)[i] =
alpha_*
dx_/6.0*(2.0*(*vzp)[i]+(*vzp)[i+1]);
567 (*hvzp)[i] =
alpha_*
dx_/6.0*(2.0*(*vzp)[i]+(*vzp)[i-1]);
570 (*hvzp)[i] =
alpha_*
dx_/6.0*((*vzp)[i-1]+4.0*(*vzp)[i]+(*vzp)[i+1]);