libMesh
Loading...
Searching...
No Matches
tao_optimization_solver.h
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 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
41namespace 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.
46extern "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
63template <typename T>
65{
66public:
67
72
76 explicit
78
83
88 virtual void clear () noexcept override;
89
93 virtual void init () override;
94
98 Tao tao() { this->init(); return _tao; }
99
103 virtual void solve () override;
104
110 virtual void get_dual_variables() override;
111
116 virtual void print_converged_reason() override;
117
124 virtual int get_converged_reason() override;
125
126protected:
127
131 Tao _tao;
132
143 TaoConvergedReason _reason;
144
145private:
146
147 friend PetscErrorCode __libmesh_tao_objective (Tao tao, Vec x, PetscReal * objective, void * ctx);
148 friend PetscErrorCode __libmesh_tao_gradient(Tao tao, Vec x, Vec g, void * ctx);
149 friend PetscErrorCode __libmesh_tao_hessian(Tao tao, Vec x, Mat h, Mat pc, void * ctx);
150 friend PetscErrorCode __libmesh_tao_equality_constraints(Tao tao, Vec x, Vec ce, void * ctx);
151 friend PetscErrorCode __libmesh_tao_equality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void * ctx);
152 friend PetscErrorCode __libmesh_tao_inequality_constraints(Tao tao, Vec x, Vec cineq, void * ctx);
153 friend PetscErrorCode __libmesh_tao_inequality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void * ctx);
154};
155
156
157
158} // namespace libMesh
159
160
161#endif // #if defined(LIBMESH_HAVE_PETSC_TAO) && !defined(LIBMESH_USE_COMPLEX_NUMBERS)
162#endif // LIBMESH_TAO_OPTIMIZATION_SOLVER_H
This base class can be inherited from to provide interfaces to optimization solvers from different pa...
const sys_type & system() const
This System subclass enables us to assemble an objective function, gradient, Hessian and bounds for o...
This class provides an interface to the Tao optimization solvers.
OptimizationSystem sys_type
The type of system that we use in conjunction with this solver.
virtual void solve() override
Call the Tao solver.
friend PetscErrorCode __libmesh_tao_inequality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
friend PetscErrorCode __libmesh_tao_equality_constraints(Tao tao, Vec x, Vec ce, void *ctx)
virtual int get_converged_reason() override
TaoConvergedReason _reason
Store the reason for Tao convergence/divergence for use even after _tao has been cleared.
friend PetscErrorCode __libmesh_tao_equality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
virtual void init() override
Initialize data structures if not done so already.
friend PetscErrorCode __libmesh_tao_inequality_constraints(Tao tao, Vec x, Vec cineq, void *ctx)
virtual void print_converged_reason() override
Prints a useful message about why the latest optimization solve con(di)verged.
Tao _tao
Optimization solver context.
friend PetscErrorCode __libmesh_tao_hessian(Tao tao, Vec x, Mat h, Mat pc, void *ctx)
friend PetscErrorCode __libmesh_tao_objective(Tao tao, Vec x, PetscReal *objective, void *ctx)
friend PetscErrorCode __libmesh_tao_gradient(Tao tao, Vec x, Vec g, void *ctx)
virtual void clear() noexcept override
Release all memory and clear data structures.
virtual void get_dual_variables() override
Get the current values of dual variables associated with inequality and equality constraints.
The libMesh namespace provides an interface to certain functionality in the library.
PetscErrorCode __libmesh_tao_gradient(Tao tao, Vec x, Vec g, void *ctx)
PetscErrorCode __libmesh_tao_objective(Tao tao, Vec x, PetscReal *objective, void *ctx)
PetscErrorCode __libmesh_tao_inequality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
PetscErrorCode __libmesh_tao_equality_constraints_jacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
PetscErrorCode __libmesh_tao_equality_constraints(Tao tao, Vec x, Vec ce, void *ctx)
PetscErrorCode __libmesh_tao_hessian(Tao tao, Vec x, Mat h, Mat pc, void *ctx)
PetscErrorCode __libmesh_tao_inequality_constraints(Tao tao, Vec x, Vec cineq, void *ctx)