libMesh
Classes | Functions
optimization_ex1.C File Reference

Go to the source code of this file.

Classes

class  AssembleOptimization
 This class encapsulate all functionality required for assembling the objective function, gradient, and hessian. More...
 

Functions

int main (int argc, char **argv)
 

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 239 of file optimization_ex1.C.

240 {
241  LibMeshInit init (argc, argv);
242 
243 #ifndef LIBMESH_HAVE_PETSC_TAO
244 
245  libmesh_example_requires(false, "PETSc >= 3.5.0 with built-in TAO support");
246 
247 #elif !defined(LIBMESH_ENABLE_GHOSTED)
248 
249  libmesh_example_requires(false, "--enable-ghosted");
250 
251 #elif LIBMESH_USE_COMPLEX_NUMBERS
252 
253  // According to
254  // http://www.mcs.anl.gov/research/projects/tao/documentation/installation.html
255  // TAO & PETSc-complex are currently mutually exclusive
256  libmesh_example_requires(false, "PETSc >= 3.5.0 with built-in TAO support & real-numbers only");
257 
258 #endif
259 
260  // We use a 2D domain.
261  libmesh_example_requires(LIBMESH_DIM > 1, "--disable-1D-only");
262 
263  // We use Dirichlet boundary conditions here
264 #ifndef LIBMESH_ENABLE_DIRICHLET
265  libmesh_example_requires(false, "--enable-dirichlet");
266 #endif
267 
268  if (libMesh::on_command_line ("--use-eigen"))
269  {
270  libMesh::err << "This example requires an OptimizationSolver, and therefore does not "
271  << "support --use-eigen on the command line."
272  << std::endl;
273  return 0;
274  }
275 
276  GetPot infile("optimization_ex1.in");
277  const std::string approx_order = infile("approx_order", "FIRST");
278  const std::string fe_family = infile("fe_family", "LAGRANGE");
279  const unsigned int n_elem = infile("n_elem", 10);
280 
281  Mesh mesh(init.comm());
283  n_elem,
284  n_elem,
285  -1., 1.,
286  -1., 1.,
287  QUAD9);
288 
289  mesh.print_info();
290 
291  EquationSystems equation_systems (mesh);
292 
293  OptimizationSystem & system =
294  equation_systems.add_system<OptimizationSystem> ("Optimization");
295 
296  // The default is to use PETSc/Tao solvers, but let the user change
297  // the optimization solver package on the fly.
298  {
299  const std::string optimization_solver_type = infile("optimization_solver_type",
300  "PETSC_SOLVERS");
301  SolverPackage sp = Utility::string_to_enum<SolverPackage>(optimization_solver_type);
302  std::unique_ptr<OptimizationSolver<Number>> new_solver =
304  system.optimization_solver.reset(new_solver.release());
305  }
306 
307  // Set tolerances and maximum iteration counts directly on the optimization solver.
308  system.optimization_solver->max_objective_function_evaluations = 128;
309  system.optimization_solver->objective_function_relative_tolerance = 1.e-4;
310  system.optimization_solver->verbose = true;
311 
312  AssembleOptimization assemble_opt(system);
313 
314  system.optimization_solver->objective_object = &assemble_opt;
315  system.optimization_solver->gradient_object = &assemble_opt;
316  system.optimization_solver->hessian_object = &assemble_opt;
317 
318  // system.matrix and system.rhs are used for the gradient and Hessian,
319  // so in this case we add an extra matrix and vector to store A and F.
320  // This makes it easy to write the code for evaluating the objective,
321  // gradient, and hessian.
322  system.add_matrix("A_matrix");
323  system.add_vector("F_vector");
324  assemble_opt.A_matrix = &system.get_matrix("A_matrix");
325  assemble_opt.F_vector = &system.get_vector("F_vector");
326 
327 #ifdef LIBMESH_ENABLE_DIRICHLET
328  unsigned int u_var = system.add_variable("u",
329  Utility::string_to_enum<Order> (approx_order),
330  Utility::string_to_enum<FEFamily>(fe_family));
331 
332  // Apply Dirichlet constraints. This will be used to apply constraints
333  // to the objective function, gradient and Hessian.
334  std::set<boundary_id_type> boundary_ids;
335  boundary_ids.insert(0);
336  boundary_ids.insert(1);
337  boundary_ids.insert(2);
338  boundary_ids.insert(3);
339  std::vector<unsigned int> variables;
340  variables.push_back(u_var);
341  ZeroFunction<> zf;
342 
343  // Most DirichletBoundary users will want to supply a "locally
344  // indexed" functor
345  DirichletBoundary dirichlet_bc(boundary_ids, variables, zf,
347  system.get_dof_map().add_dirichlet_boundary(dirichlet_bc);
348 #endif // LIBMESH_ENABLE_DIRICHLET
349 
350  equation_systems.init();
351  equation_systems.print_info();
352 
353  assemble_opt.assemble_A_and_F();
354 
355  // We need to close the matrix so that we can use it to store the
356  // Hessian during the solve.
357  system.matrix->close();
358  system.solve();
359 
360  // Print convergence information
361  system.optimization_solver->print_converged_reason();
362 
363 #ifdef LIBMESH_HAVE_EXODUS_API
364  std::stringstream filename;
365  ExodusII_IO (mesh).write_equation_systems("optimization_soln.exo",
366  equation_systems);
367 #endif
368 
369  return 0;
370 }

References AssembleOptimization::A_matrix, libMesh::DofMap::add_dirichlet_boundary(), libMesh::ImplicitSystem::add_matrix(), libMesh::EquationSystems::add_system(), libMesh::System::add_variable(), libMesh::System::add_vector(), AssembleOptimization::assemble_A_and_F(), libMesh::MeshTools::Generation::build_square(), libMesh::SparseMatrix< T >::close(), libMesh::err, AssembleOptimization::F_vector, libMesh::System::get_dof_map(), libMesh::ImplicitSystem::get_matrix(), libMesh::System::get_vector(), libMesh::TriangleWrapper::init(), libMesh::EquationSystems::init(), libMesh::LOCAL_VARIABLE_ORDER, libMesh::ImplicitSystem::matrix, mesh, libMesh::MeshTools::n_elem(), libMesh::on_command_line(), libMesh::OptimizationSystem::optimization_solver, libMesh::EquationSystems::print_info(), libMesh::MeshBase::print_info(), libMesh::QUAD9, libMesh::OptimizationSystem::solve(), and libMesh::MeshOutput< MT >::write_equation_systems().

libMesh::OptimizationSystem
This System subclass enables us to assemble an objective function, gradient, Hessian and bounds for o...
Definition: optimization_system.h:43
libMesh::SparseMatrix::close
virtual void close()=0
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
libMesh::SolverPackage
SolverPackage
Defines an enum for various linear solver packages.
Definition: enum_solver_package.h:34
libMesh::Mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50
libMesh::MeshTools::n_elem
dof_id_type n_elem(const MeshBase::const_element_iterator &begin, const MeshBase::const_element_iterator &end)
Count up the number of elements of a specific type (as defined by an iterator range).
Definition: mesh_tools.C:705
libMesh::DofMap::add_dirichlet_boundary
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
Definition: dof_map_constraints.C:4390
libMesh::OptimizationSystem::solve
virtual void solve() override
Solves the optimization problem.
Definition: optimization_system.C:162
libMesh::ImplicitSystem::add_matrix
SparseMatrix< Number > & add_matrix(const std::string &mat_name)
Adds the additional matrix mat_name to this system.
Definition: implicit_system.C:202
AssembleOptimization
This class encapsulate all functionality required for assembling the objective function,...
Definition: optimization_ex1.C:66
mesh
MeshBase & mesh
Definition: mesh_communication.C:1257
libMesh::ExodusII_IO
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
Definition: exodusII_io.h:51
libMesh::TriangleWrapper::init
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
libMesh::LOCAL_VARIABLE_ORDER
Definition: dirichlet_boundaries.h:62
libMesh::MeshTools::Generation::build_square
void build_square(UnstructuredMesh &mesh, const unsigned int nx, const unsigned int ny, const Real xmin=0., const Real xmax=1., const Real ymin=0., const Real ymax=1., const ElemType type=INVALID_ELEM, const bool gauss_lobatto_grid=false)
A specialized build_cube() for 2D meshes.
Definition: mesh_generation.C:1501
libMesh::OptimizationSolver
This base class can be inherited from to provide interfaces to optimization solvers from different pa...
Definition: optimization_solver.h:60
libMesh::OptimizationSystem::optimization_solver
std::unique_ptr< OptimizationSolver< Number > > optimization_solver
The OptimizationSolver that is used for performing the optimization.
Definition: optimization_system.h:268
libMesh::System::add_variable
unsigned int add_variable(const std::string &var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1069
libMesh::ImplicitSystem::matrix
SparseMatrix< Number > * matrix
The system matrix.
Definition: implicit_system.h:393
libMesh::LibMeshInit
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
Definition: libmesh.h:83
libMesh::ZeroFunction
ConstFunction that simply returns 0.
Definition: zero_function.h:36
libMesh::EquationSystems
This is the EquationSystems class.
Definition: equation_systems.h:74
libMesh::MeshOutput::write_equation_systems
virtual void write_equation_systems(const std::string &, const EquationSystems &, const std::set< std::string > *system_names=nullptr)
This method implements writing a mesh with data to a specified file where the data is taken from the ...
Definition: mesh_output.C:31
libMesh::MeshBase::print_info
void print_info(std::ostream &os=libMesh::out) const
Prints relevant information about the mesh.
Definition: mesh_base.C:585
libMesh::DirichletBoundary
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
Definition: dirichlet_boundaries.h:88
libMesh::on_command_line
bool on_command_line(std::string arg)
Definition: libmesh.C:898
libMesh::System::add_vector
NumericVector< Number > & add_vector(const std::string &vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
Definition: system.C:661
libMesh::QUAD9
Definition: enum_elem_type.h:43
libMesh::System::get_dof_map
const DofMap & get_dof_map() const
Definition: system.h:2099
libMesh::err
OStreamProxy err
libMesh::ImplicitSystem::get_matrix
const SparseMatrix< Number > & get_matrix(const std::string &mat_name) const
Definition: implicit_system.C:262
libMesh::System::get_vector
const NumericVector< Number > & get_vector(const std::string &vec_name) const
Definition: system.C:774