Go to the documentation of this file.
61 #include "libmesh/equation_systems.h"
62 #include "libmesh/linear_solver.h"
63 #include "libmesh/error_vector.h"
64 #include "libmesh/mesh.h"
65 #include "libmesh/mesh_generation.h"
66 #include "libmesh/mesh_modification.h"
67 #include "libmesh/mesh_refinement.h"
68 #include "libmesh/newton_solver.h"
69 #include "libmesh/numeric_vector.h"
70 #include "libmesh/steady_solver.h"
71 #include "libmesh/system_norm.h"
72 #include "libmesh/petsc_vector.h"
73 #include "libmesh/auto_ptr.h"
74 #include "libmesh/enum_solver_package.h"
77 #include "libmesh/qoi_set.h"
78 #include "libmesh/adjoint_refinement_estimator.h"
81 #include "libmesh/getpot.h"
82 #include "libmesh/gmv_io.h"
85 #include "femparameters.h"
99 std::string solution_type)
101 #ifdef LIBMESH_HAVE_GMV
104 std::ostringstream file_name_gmv;
105 file_name_gmv << solution_type
113 (file_name_gmv.str(), es);
139 system.
time_solver = libmesh_make_unique<SteadySolver>(system);
144 system.
time_solver->diff_solver() = std::unique_ptr<DiffSolver>(solver);
153 if (system.
time_solver->reduce_deltat_on_diffsolver_failure)
167 #ifdef LIBMESH_ENABLE_AMR
181 return std::unique_ptr<MeshRefinement>(mesh_refinement);
192 libMesh::out <<
"Computing the error estimate using the Adjoint Refinement Error Estimator\n" << std::endl;
196 adjoint_refinement_estimator->
qoi_set() = qois;
201 return std::unique_ptr<AdjointRefinementEstimator>(adjoint_refinement_estimator);
204 #endif // LIBMESH_ENABLE_AMR
208 int main (
int argc,
char ** argv)
214 #ifndef LIBMESH_ENABLE_AMR
215 libmesh_example_requires(
false,
"--enable-amr");
219 #ifndef LIBMESH_ENABLE_DIRICHLET
220 libmesh_example_requires(
false,
"--enable-dirichlet");
226 "--enable-petsc or --enable-trilinos");
232 std::ifstream i(
"general.in");
234 libmesh_error_msg(
'[' <<
init.comm().rank() <<
"] Can't find general.in; exiting early.");
236 GetPot infile(
"general.in");
243 libmesh_example_requires(2 <= LIBMESH_DIM,
"2D support");
250 std::unique_ptr<MeshRefinement> mesh_refinement =
256 libMesh::out <<
"Reading in and building the mesh" << std::endl;
284 equation_systems.
init ();
298 unsigned int a_step = 0;
299 for (; a_step != param.max_adaptivesteps; ++a_step)
303 if (param.global_tolerance != 0.)
304 libmesh_assert_equal_to (param.nelem_target, 0);
308 libmesh_assert_greater (param.nelem_target, 0);
323 std::vector<unsigned int> qoi_indices;
324 qoi_indices.push_back(0);
352 primal_solution.
swap(dual_solution_0);
356 primal_solution.
swap(dual_solution_0);
359 <<
" active elements and "
361 <<
" active dofs." << std::endl ;
371 libMesh::out <<
"The computed QoI 0 is " << std::setprecision(17)
372 << QoI_0_computed << std::endl;
373 libMesh::out <<
"The relative error in QoI 0 is " << std::setprecision(17)
374 <<
std::abs(QoI_0_computed - QoI_0_exact) << std::endl;
380 std::unique_ptr<AdjointRefinementEstimator> adjoint_refinement_error_estimator =
384 adjoint_refinement_error_estimator->estimate_error(system, QoI_elementwise_error);
388 libMesh::out <<
"The computed relative error in QoI 0 is " << std::setprecision(17)
389 <<
std::abs(adjoint_refinement_error_estimator->get_global_QoI_error_estimate(0)) << std::endl;
392 libMesh::out <<
"The effectivity index for the computed error in QoI 0 is " << std::setprecision(17)
393 <<
std::abs(adjoint_refinement_error_estimator->get_global_QoI_error_estimate(0)) /
394 std::abs(QoI_0_computed - QoI_0_exact) << std::endl;
398 if (!param.refine_uniformly)
399 for (std::size_t i=0; i<QoI_elementwise_error.size(); i++)
400 if (QoI_elementwise_error[i] != 0.)
401 QoI_elementwise_error[i] =
std::abs(QoI_elementwise_error[i]);
408 if (param.refine_uniformly)
410 mesh_refinement->uniformly_refine(1);
413 else if (param.global_tolerance >= 0. && param.nelem_target == 0.)
415 mesh_refinement->flag_elements_by_error_tolerance (QoI_elementwise_error);
417 mesh_refinement->refine_and_coarsen_elements();
424 libMesh::out <<
"We reached the target number of elements.\n" << std::endl;
428 mesh_refinement->flag_elements_by_nelem_target (QoI_elementwise_error);
430 mesh_refinement->refine_and_coarsen_elements();
434 equation_systems.
reinit();
438 <<
" active elements and "
440 <<
" active dofs." << std::endl;
444 if (a_step == param.max_adaptivesteps)
454 std::vector<unsigned int> qoi_indices;
456 qoi_indices.push_back(0);
469 primal_solution.
swap(dual_solution_0);
472 primal_solution.
swap(dual_solution_0);
475 <<
" active elements and "
477 <<
" active dofs." << std::endl ;
486 libMesh::out <<
"The computed QoI 0 is " << std::setprecision(17)
487 << QoI_0_computed << std::endl;
488 libMesh::out <<
"The relative error in QoI 0 is " << std::setprecision(17)
489 <<
std::abs(QoI_0_computed - QoI_0_exact) << std::endl;
501 std::unique_ptr<AdjointRefinementEstimator> adjoint_refinement_error_estimator =
505 adjoint_refinement_error_estimator->estimate_error(system, QoI_elementwise_error);
510 libMesh::out <<
"The computed relative error in QoI 0 is " << std::setprecision(17)
511 <<
std::abs(adjoint_refinement_error_estimator->get_global_QoI_error_estimate(0)) << std::endl;
514 libMesh::out <<
"The effectivity index for the computed error in QoI 0 is " << std::setprecision(17)
515 <<
std::abs(adjoint_refinement_error_estimator->get_global_QoI_error_estimate(0)) /
516 std::abs(QoI_0_computed - QoI_0_exact) << std::endl;
537 <<
"] Completing output." << std::endl;
539 #endif // #ifndef LIBMESH_ENABLE_AMR
virtual void reuse_preconditioner(bool)
Set the same_preconditioner flag, which indicates if we reuse the same preconditioner for subsequent ...
unsigned int & fe_order()
virtual void solve() override
Invokes the solver associated with the system.
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
bool print_jacobian_norms
Set print_jacobian_norms to true to print |J| whenever it is assembled.
Real & coarsen_threshold()
The coarsen_threshold provides hysteresis in AMR/C strategies.
virtual System & add_system(const std::string &system_type, const std::string &name)
Add the system of type system_type named name to the systems array.
const MeshBase & get_mesh() const
libMesh::Real coarsen_fraction
bool print_residual_norms
Set print_residual_norms to true to print |F| whenever it is assembled.
unsigned int max_nonlinear_iterations
virtual void postprocess(void)
Runs a postprocessing loop over all elements, and if postprocess_sides is true over all sides.
bool require_residual_reduction
If this is set to true, the solver is forced to test the residual after each Newton step,...
virtual void all_second_order(const bool full_ordered=true)=0
Converts a (conforming, non-refined) mesh with linear elements into a mesh with second-order elements...
virtual void swap(NumericVector< T > &v)
Swaps the contents of this with v.
bool print_solution_norms
bool print_residual_norms
bool print_residuals
Set print_residuals to true to print F whenever it is assembled.
NumericVector< Number > & get_adjoint_solution(unsigned int i=0)
std::unique_ptr< AdjointRefinementEstimator > build_adjoint_refinement_error_estimator(QoISet &qois)
The libMesh namespace provides an interface to certain functionality in the library.
bool continue_after_backtrack_failure
Defaults to false, telling the DiffSolver to throw an error when the backtracking scheme fails to fin...
libMesh::Real refine_fraction
bool print_solution_norms
Set print_residual_norms to true to print |U| whenever it is used in an assembly() call.
SolverPackage default_solver_package()
double initial_linear_tolerance
This class implements writing meshes in the GMV format.
double linear_tolerance_multiplier
The tolerance for linear solves is kept below this multiplier (which defaults to 1e-3) times the norm...
std::vector< unsigned int > fe_order
bool require_residual_reduction
libMesh::Real coarsen_threshold
unsigned int max_linear_iterations
std::unique_ptr< TimeSolver > time_solver
A pointer to the solver object we're going to use.
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
Implements (adaptive) mesh refinement algorithms for a MeshBase.
void set_system_parameters(PoissonSystem &system, FEMParameters ¶m)
std::vector< std::string > fe_family
This is the MeshBase class.
MetaPhysicL::DualNumber< T, D > abs(const MetaPhysicL::DualNumber< T, D > &in)
std::size_t n_active_dofs() const
double minimum_linear_tolerance
The tolerance for linear solves is kept above this minimum.
Real relative_step_tolerance
Data structure for specifying which Quantities of Interest should be calculated in an adjoint or a pa...
std::unique_ptr< MeshRefinement > build_mesh_refinement(MeshBase &mesh, FEMParameters ¶m)
processor_id_type processor_id() const
bool print_jacobians
Set print_jacobians to true to print J whenever it is assembled.
virtual void init()
Initialize all the systems.
bool continue_after_max_iterations
Defaults to true, telling the DiffSolver to continue rather than exit when a solve has reached its ma...
void write_output(EquationSystems &es, unsigned int a_step, std::string solution_type)
virtual LinearSolver< Number > * get_linear_solver() const override
libMesh::Real relative_residual_tolerance
The ErrorVector is a specialization of the StatisticsVector for error data computed on a finite eleme...
unsigned char number_h_refinements
How many h refinements to perform to get the fine grid.
void set_weight(std::size_t, Real)
Set the weight for this index.
libMesh::Real relative_step_tolerance
virtual std::pair< unsigned int, Real > adjoint_solve(const QoISet &qoi_indices=QoISet()) override
This function sets the _is_adjoint boolean member of TimeSolver to true and then calls the adjoint_so...
double minimum_linear_tolerance
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
This class defines a solver which uses the default libMesh linear solver in a quasiNewton method to h...
dof_id_type & nelem_target()
If nelem_target is set to a nonzero value, methods like flag_elements_by_nelem_target() will attempt ...
void print_info(std::ostream &os=libMesh::out) const
Prints information about the equation systems, by default to libMesh::out.
This is the EquationSystems class.
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 ...
bool quiet
The DiffSolver should not print anything to libMesh::out unless quiet is set to false; default is tru...
bool assemble_qoi_sides
If assemble_qoi_sides is true (it is false by default), the assembly loop for a quantity of interest ...
virtual void reinit()
Handle any mesh changes and reinitialize all the systems on the updated mesh.
Real & coarsen_fraction()
The coarsen_fraction sets either a desired target or a desired maximum number of elements to flag for...
Real relative_residual_tolerance
libMesh::Real global_tolerance
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
QoISet & qoi_set()
Access to the QoISet (default: weight all QoIs equally) to use when computing errors.
Real & refine_fraction()
The refine_fraction sets either a desired target or a desired maximum number of elements to flag for ...
libMesh::Real min_step_length
void read(GetPot &input, const std::vector< std::string > *other_variable_names=nullptr)
Real verify_analytic_jacobians
If verify_analytic_jacobian is equal to zero (as it is by default), no numeric jacobians will be calc...
void print_info(std::ostream &os=libMesh::out) const
Prints relevant information about the mesh.
This class implements a "brute force" goal-oriented error estimator which computes an estimate of err...
void add_indices(const std::vector< unsigned int > &indices)
Add this indices to the set to be calculated.
unsigned int max_linear_iterations
Each linear solver step should exit after max_linear_iterations is exceeded.
Real & absolute_global_tolerance()
If absolute_global_tolerance is set to a nonzero value, methods like flag_elements_by_global_toleranc...
bool & coarsen_by_parents()
If coarsen_by_parents is true, complete groups of sibling elements (elements with the same parent) wi...
bool postprocess_sides
If postprocess_sides is true (it is false by default), the postprocessing loop will loop over all sid...
bool print_solutions
Set print_solutions to true to print U whenever it is used in an assembly() call.
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.
libMesh::Real verify_analytic_jacobians
bool print_jacobian_norms
unsigned int max_nonlinear_iterations
The DiffSolver should exit in failure if max_nonlinear_iterations is exceeded and continue_after_max_...
int main(int argc, char **argv)
unsigned int nelem_target
double linear_tolerance_multiplier
Number & get_QoI_value(std::string type, unsigned int QoI_index)
Real minsteplength
If the quasi-Newton step length must be reduced to below this factor to give a residual reduction,...
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times.
std::string & fe_family()
virtual dof_id_type n_active_elem() const =0
bool & analytic_jacobians()
double initial_linear_tolerance
Any required linear solves will at first be done with this tolerance; the DiffSolver may tighten the ...
void set_adjoint_already_solved(bool setting)
Setter for the adjoint_already_solved boolean.