51 #ifndef ROL_CANTILEVERBEAM_HPP 52 #define ROL_CANTILEVERBEAM_HPP 72 : nseg_(nseg), len_(500) {
73 l_.clear(); l_.resize(nseg, len_/static_cast<Real>(nseg_));
76 Real
value(
const std::vector<Real> &x, Real &tol ) {
78 for (
int i = 0; i <
nseg_; ++i) {
79 val += l_[i]*x[i]*x[i+
nseg_];
84 void gradient( std::vector<Real> &g,
const std::vector<Real> &x, Real &tol ) {
85 for (
int i = 0; i <
nseg_; ++i) {
86 g[i] = l_[i]*x[i+
nseg_];
87 g[i+
nseg_] = l_[i]*x[i];
91 void hessVec( std::vector<Real> &hv,
const std::vector<Real> &v,
const std::vector<Real> &x, Real &tol ) {
92 for (
int i = 0; i <
nseg_; ++i) {
93 hv[i] = l_[i]*v[i+
nseg_];
94 hv[i+
nseg_] = l_[i]*v[i];
109 : nseg_(nseg), len_(500), P_(50e3), E_(200e5), Sigma_max_(14e3), tip_max_(2.5), suml_(0) {
110 const Real half(0.5);
112 l_.resize(nseg_, len_/static_cast<Real>(nseg_));
116 for (
int i = 0; i <
nseg_; ++i) {
117 suml_[i] =
static_cast<Real
>(i+1)*l_[i];
118 M_[i] = P_*(len_ - suml_[i] + l_[i]);
119 dyp_[i] = (len_ - suml_[i] + half*l_[i])*static_cast<Real>(nseg_-i-1);
123 void value( std::vector<Real> &c,
const std::vector<Real> &x, Real &tol ) {
124 const Real one(1), two(2), three(3), twelve(12), twenty(20);
125 std::vector<Real> y1(nseg_), yp(nseg_);
126 Real Inertia(0), sigma(0), sumy1(0), sumypl(0);
127 for (
int i = 0; i <
nseg_; ++i) {
129 Inertia = x[i]*std::pow(x[i+nseg_],3)/twelve;
130 sigma = M_[i]*(x[i+
nseg_]/two)/Inertia;
131 c[i] = sigma / Sigma_max_ - one;
135 y1[i] = P_*std::pow(l_[i],2)/(two*E_*Inertia) * (len_ - suml_[i] + two/three*l_[i]);
136 yp[i] = P_*l_[i]/(E_*Inertia) * (len_ - suml_[i] + l_[i]/two);
140 for (
int i = 1; i <
nseg_; ++i) {
142 sumypl += yp[i-1]*l_[i];
144 Real yN = sumy1 + sumypl;
145 c[2*
nseg_] = yN / tip_max_ - one;
149 const std::vector<Real> &x, Real &tol ) {
150 const Real two(2), three(3), six(6), twelve(12), twenty(20);
152 Real Inertia(0), dyN(0), sumW(0), sumH(0);
153 for (
int i = 0; i <
nseg_; ++i) {
155 jv[i] = -six/Sigma_max_*M_[i]*v[i]/std::pow(x[i]*x[i+nseg_],2)
156 -twelve/Sigma_max_*M_[i]*v[i+
nseg_]/(x[i]*std::pow(x[i+nseg_],3));
160 Inertia = x[i]*std::pow(x[i+nseg_],3)/twelve;
161 dyN = -P_/E_ * std::pow(l_[i],2)/Inertia*((len_ - suml_[i] + two/three*l_[i])/two + dyp_[i]);
162 sumW += v[i]*(dyN/x[i])/tip_max_;
163 sumH += three*v[i+
nseg_]*(dyN/x[i+
nseg_])/tip_max_;
166 jv[2*
nseg_] = sumW+sumH;
170 const std::vector<Real> &x, Real &tol ) {
171 const Real two(2), three(3), six(6), twelve(12), twenty(20);
173 Real Inertia(0), dyN(0);
174 for (
int i = 0; i <
nseg_; ++i) {
176 ajv[i] = -six/Sigma_max_*M_[i]*v[i]/std::pow(x[i]*x[i+nseg_],2);
177 ajv[i+
nseg_] = -twelve/Sigma_max_*M_[i]*v[i]/(x[i]*std::pow(x[i+nseg_],3));
179 ajv[i] += -twenty*v[i+
nseg_];
182 Inertia = x[i]*std::pow(x[i+nseg_],3)/twelve;
183 dyN = -P_/E_ * std::pow(l_[i],2)/Inertia*((len_ - suml_[i] + two/three*l_[i])/two + dyp_[i]);
184 ajv[i] += v[2*
nseg_]*(dyN/x[i])/tip_max_;
207 return makePtr<Objective_CantileverBeam<Real>>(
nseg_);
211 return makePtr<Constraint_CantileverBeam<Real>>(
nseg_);
216 Ptr<std::vector<Real>> lp = makePtr<std::vector<Real>>(2*
nseg_);
217 for (
int i = 0; i <
nseg_; ++i) {
218 (*lp)[i] =
static_cast<Real
>(1);
219 (*lp)[i+
nseg_] =
static_cast<Real
>(5);
223 Ptr<std::vector<Real>> up = makePtr<std::vector<Real>>(2*
nseg_,ROL_INF<Real>());
225 Ptr<Vector<Real>> l = makePtr<StdVector<Real>>(lp);
226 Ptr<Vector<Real>> u = makePtr<StdVector<Real>>(up);
228 return makePtr<Bounds<Real>>(l,u);
232 Ptr<std::vector<Real> > x0p = makePtr<std::vector<Real>>(2*
nseg_,0);
233 for (
int i = 0; i <
nseg_; ++i) {
234 (*x0p)[i] =
static_cast<Real
>(5);
235 (*x0p)[i+
nseg_] =
static_cast<Real
>(40);
238 return makePtr<StdVector<Real>>(x0p);
246 Ptr<std::vector<Real>> xp = makePtr<std::vector<Real>>(2*
nseg_);
247 for (
int i = 0; i <
nseg_; ++i) {
249 (*xp)[i+
nseg_] = std::sqrt(3.0);
252 return makePtr<StdVector<Real>>(xp);
256 Ptr<std::vector<Real> > lp = makePtr<std::vector<Real>>(2*nseg_+1,0.0);
257 return makePtr<StdVector<Real>>(lp);
262 Ptr<std::vector<Real> > lp = makePtr<std::vector<Real>>(2*nseg_+1,ROL_NINF<Real>());
265 Ptr<std::vector<Real> > up = makePtr<std::vector<Real>>(2*nseg_+1,0);
267 Ptr<Vector<Real> > l = makePtr<StdVector<Real>>(lp);
268 Ptr<Vector<Real> > u = makePtr<StdVector<Real>>(up);
270 return makePtr<Bounds<Real>>(l,u);
278 #endif // ROL_CANTILEVERBEAM_HPP Ptr< Vector< Real > > getSolution(const int i=0) const
void applyJacobian(std::vector< Real > &jv, const std::vector< Real > &v, const std::vector< Real > &x, Real &tol)
Ptr< Vector< Real > > getInequalityMultiplier(void) const
Real value(const std::vector< Real > &x, Real &tol)
Defines the equality constraint operator interface for StdVectors.
Ptr< Constraint< Real > > getInequalityConstraint(void) const
Ptr< BoundConstraint< Real > > getBoundConstraint(void) const
Specializes the ROL::Objective interface for objective functions that operate on ROL::StdVector's.
getCantileverBeam(int nseg=5)
Contains definitions of test objective functions.
Constraint_CantileverBeam(const int nseg=5)
Ptr< BoundConstraint< Real > > getSlackBoundConstraint(void) const
Objective_CantileverBeam(const int nseg=5)
std::vector< Real > suml_
void hessVec(std::vector< Real > &hv, const std::vector< Real > &v, const std::vector< Real > &x, Real &tol)
void value(std::vector< Real > &c, const std::vector< Real > &x, Real &tol)
Ptr< Objective< Real > > getObjective(void) const
void applyAdjointJacobian(std::vector< Real > &ajv, const std::vector< Real > &v, const std::vector< Real > &x, Real &tol)
void gradient(std::vector< Real > &g, const std::vector< Real > &x, Real &tol)
Ptr< Vector< Real > > getInitialGuess(void) const