libMesh
tao_optimization_solver.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2019 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 
20 #ifndef LIBMESH_TAO_OPTIMIZATION_SOLVER_H
21 #define LIBMESH_TAO_OPTIMIZATION_SOLVER_H
22 
23 #include "libmesh/libmesh_config.h"
24 
25 // Petsc include files.
26 #if defined(LIBMESH_HAVE_PETSC_TAO) && !defined(LIBMESH_USE_COMPLEX_NUMBERS)
27 
28 // Local includes
29 #include "libmesh/petsc_macro.h"
30 #include "libmesh/optimization_solver.h"
31 
32 // Include header for the Tao optimization library
33 #ifdef I
34 # define LIBMESH_SAW_I
35 #endif
36 #include <petsctao.h>
37 #ifndef LIBMESH_SAW_I
38 # undef I // Avoid complex.h contamination
39 #endif
40 
41 namespace libMesh
42 {
43 
44 // Allow users access to these functions in case they want to reuse them. Users shouldn't
45 // need access to these most of the time as they are used internally by this object.
46 extern "C"
47 {
48  PetscErrorCode __libmesh_tao_objective (Tao tao, Vec x, PetscReal * objective, void * ctx);
49  PetscErrorCode __libmesh_tao_gradient(Tao tao, Vec x, Vec g, void * ctx);
50  PetscErrorCode __libmesh_tao_hessian(Tao tao, Vec x, Mat h, Mat pc, void * ctx);
51  PetscErrorCode __libmesh_tao_equality_constraints(Tao tao, Vec x, Vec ce, void * ctx);
52  PetscErrorCode __libmesh_tao_equality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void * ctx);
53  PetscErrorCode __libmesh_tao_inequality_constraints(Tao tao, Vec x, Vec cineq, void * ctx);
54  PetscErrorCode __libmesh_tao_inequality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void * ctx);
55 }
56 
63 template <typename T>
65 {
66 public:
67 
72 
76  explicit
78 
83 
87  virtual void clear () override;
88 
92  virtual void init () override;
93 
97  Tao tao() { this->init(); return _tao; }
98 
102  virtual void solve () override;
103 
109  virtual void get_dual_variables() override;
110 
115  virtual void print_converged_reason() override;
116 
123  virtual int get_converged_reason() override;
124 
125 protected:
126 
130  Tao _tao;
131 
142  TaoConvergedReason _reason;
143 
144 private:
145 
146  friend PetscErrorCode __libmesh_tao_objective (Tao tao, Vec x, PetscReal * objective, void * ctx);
147  friend PetscErrorCode __libmesh_tao_gradient(Tao tao, Vec x, Vec g, void * ctx);
148  friend PetscErrorCode __libmesh_tao_hessian(Tao tao, Vec x, Mat h, Mat pc, void * ctx);
149  friend PetscErrorCode __libmesh_tao_equality_constraints(Tao tao, Vec x, Vec ce, void * ctx);
150  friend PetscErrorCode __libmesh_tao_equality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void * ctx);
151  friend PetscErrorCode __libmesh_tao_inequality_constraints(Tao tao, Vec x, Vec cineq, void * ctx);
152  friend PetscErrorCode __libmesh_tao_inequality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void * ctx);
153 };
154 
155 
156 
157 } // namespace libMesh
158 
159 
160 #endif // #if defined(LIBMESH_HAVE_PETSC_TAO) && !defined(LIBMESH_USE_COMPLEX_NUMBERS)
161 #endif // LIBMESH_TAO_OPTIMIZATION_SOLVER_H
libMesh::OptimizationSystem
This System subclass enables us to assemble an objective function, gradient, Hessian and bounds for o...
Definition: optimization_system.h:43
libMesh::TaoOptimizationSolver::TaoOptimizationSolver
TaoOptimizationSolver(sys_type &system)
Constructor.
Definition: tao_optimization_solver.C:413
libMesh::TaoOptimizationSolver::_reason
TaoConvergedReason _reason
Store the reason for Tao convergence/divergence for use even after _tao has been cleared.
Definition: tao_optimization_solver.h:142
libMesh::TaoOptimizationSolver::solve
virtual void solve() override
Call the Tao solver.
Definition: tao_optimization_solver.C:461
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
libMesh::__libmesh_tao_gradient
PetscErrorCode __libmesh_tao_gradient(Tao tao, Vec x, Vec g, void *ctx)
Definition: tao_optimization_solver.C:98
libMesh::TaoOptimizationSolver::get_dual_variables
virtual void get_dual_variables() override
Get the current values of dual variables associated with inequality and equality constraints.
Definition: tao_optimization_solver.C:611
libMesh::TaoOptimizationSolver::_tao
Tao _tao
Optimization solver context.
Definition: tao_optimization_solver.h:130
libMesh::TaoOptimizationSolver::sys_type
OptimizationSystem sys_type
The type of system that we use in conjunction with this solver.
Definition: tao_optimization_solver.h:71
libMesh::OptimizationSolver
This base class can be inherited from to provide interfaces to optimization solvers from different pa...
Definition: optimization_solver.h:60
libMesh::TaoOptimizationSolver::get_converged_reason
virtual int get_converged_reason() override
Definition: tao_optimization_solver.C:641
libMesh::TaoOptimizationSolver::__libmesh_tao_hessian
friend PetscErrorCode __libmesh_tao_hessian(Tao tao, Vec x, Mat h, Mat pc, void *ctx)
Definition: tao_optimization_solver.C:149
libMesh::__libmesh_tao_objective
PetscErrorCode __libmesh_tao_objective(Tao tao, Vec x, PetscReal *objective, void *ctx)
Definition: tao_optimization_solver.C:50
libMesh::TaoOptimizationSolver::print_converged_reason
virtual void print_converged_reason() override
Prints a useful message about why the latest optimization solve con(di)verged.
Definition: tao_optimization_solver.C:632
libMesh::TaoOptimizationSolver::init
virtual void init() override
Initialize data structures if not done so already.
Definition: tao_optimization_solver.C:446
libMesh::__libmesh_tao_hessian
PetscErrorCode __libmesh_tao_hessian(Tao tao, Vec x, Mat h, Mat pc, void *ctx)
Definition: tao_optimization_solver.C:149
libMesh::TaoOptimizationSolver::__libmesh_tao_objective
friend PetscErrorCode __libmesh_tao_objective(Tao tao, Vec x, PetscReal *objective, void *ctx)
Definition: tao_optimization_solver.C:50
libMesh::OptimizationSolver::system
const sys_type & system() const
Definition: optimization_solver.h:182
libMesh::TaoOptimizationSolver::tao
Tao tao()
Definition: tao_optimization_solver.h:97
libMesh::__libmesh_tao_inequality_constraints
PetscErrorCode __libmesh_tao_inequality_constraints(Tao tao, Vec x, Vec cineq, void *ctx)
Definition: tao_optimization_solver.C:307
libMesh::TaoOptimizationSolver::__libmesh_tao_gradient
friend PetscErrorCode __libmesh_tao_gradient(Tao tao, Vec x, Vec g, void *ctx)
Definition: tao_optimization_solver.C:98
libMesh::TaoOptimizationSolver::__libmesh_tao_equality_constraints
friend PetscErrorCode __libmesh_tao_equality_constraints(Tao tao, Vec x, Vec ce, void *ctx)
Definition: tao_optimization_solver.C:206
libMesh::TaoOptimizationSolver
This class provides an interface to the Tao optimization solvers.
Definition: tao_optimization_solver.h:64
libMesh::ctx
void * ctx
Definition: petsc_dm_wrapper.C:71
libMesh::__libmesh_tao_equality_constraints
PetscErrorCode __libmesh_tao_equality_constraints(Tao tao, Vec x, Vec ce, void *ctx)
Definition: tao_optimization_solver.C:206
libMesh::__libmesh_tao_inequality_constraints_jacobian
PetscErrorCode __libmesh_tao_inequality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
Definition: tao_optimization_solver.C:359
libMesh::TaoOptimizationSolver::__libmesh_tao_inequality_constraints_jacobian
friend PetscErrorCode __libmesh_tao_inequality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
Definition: tao_optimization_solver.C:359
libMesh::__libmesh_tao_equality_constraints_jacobian
PetscErrorCode __libmesh_tao_equality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
Definition: tao_optimization_solver.C:258
libMesh::TaoOptimizationSolver::clear
virtual void clear() override
Release all memory and clear data structures.
Definition: tao_optimization_solver.C:430
libMesh::TaoOptimizationSolver::~TaoOptimizationSolver
~TaoOptimizationSolver()
Destructor.
Definition: tao_optimization_solver.C:422
libMesh::TaoOptimizationSolver::__libmesh_tao_equality_constraints_jacobian
friend PetscErrorCode __libmesh_tao_equality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
Definition: tao_optimization_solver.C:258
libMesh::TaoOptimizationSolver::__libmesh_tao_inequality_constraints
friend PetscErrorCode __libmesh_tao_inequality_constraints(Tao tao, Vec x, Vec cineq, void *ctx)
Definition: tao_optimization_solver.C:307