Go to the documentation of this file.
   49 #include "libmesh/mesh.h" 
   50 #include "libmesh/equation_systems.h" 
   51 #include "libmesh/linear_implicit_system.h" 
   52 #include "libmesh/exodusII_io.h" 
   53 #include "libmesh/tecplot_io.h" 
   54 #include "libmesh/fe.h" 
   55 #include "libmesh/quadrature_gauss.h" 
   56 #include "libmesh/dense_matrix.h" 
   57 #include "libmesh/dense_vector.h" 
   58 #include "libmesh/sparse_matrix.h" 
   59 #include "libmesh/mesh_refinement.h" 
   60 #include "libmesh/error_vector.h" 
   61 #include "libmesh/discontinuity_measure.h" 
   62 #include "libmesh/exact_error_estimator.h" 
   63 #include "libmesh/kelly_error_estimator.h" 
   64 #include "libmesh/patch_recovery_error_estimator.h" 
   65 #include "libmesh/uniform_refinement_estimator.h" 
   66 #include "libmesh/hp_coarsentest.h" 
   67 #include "libmesh/hp_singular.h" 
   68 #include "libmesh/sibling_coupling.h" 
   69 #include "libmesh/mesh_generation.h" 
   70 #include "libmesh/mesh_modification.h" 
   71 #include "libmesh/perf_log.h" 
   72 #include "libmesh/getpot.h" 
   73 #include "libmesh/exact_solution.h" 
   74 #include "libmesh/dof_map.h" 
   75 #include "libmesh/numeric_vector.h" 
   76 #include "libmesh/elem.h" 
   77 #include "libmesh/string_to_enum.h" 
   78 #include "libmesh/enum_solver_package.h" 
   79 #include "libmesh/dirichlet_boundaries.h" 
   80 #include "libmesh/wrapped_function.h" 
   92                       const std::string & system_name);
 
  100                       const std::string &); 
 
  106                           const std::string &); 
 
  122 int main(
int argc, 
char ** argv)
 
  129                            "--enable-petsc, --enable-trilinos, or --enable-eigen");
 
  132   libmesh_example_requires(
sizeof(
Real) > 4, 
"--disable-singleprecision");
 
  135 #ifndef LIBMESH_ENABLE_AMR 
  136   libmesh_example_requires(
false, 
"--enable-amr");
 
  140   GetPot input_file(
"adaptivity_ex3.in");
 
  143   input_file.parse_command_line(argc, argv);
 
  146   const unsigned int max_r_steps    = input_file(
"max_r_steps", 3);
 
  147   const unsigned int max_r_level    = input_file(
"max_r_level", 3);
 
  148   const Real refine_percentage      = input_file(
"refine_percentage", 0.5);
 
  149   const Real coarsen_percentage     = input_file(
"coarsen_percentage", 0.5);
 
  150   const unsigned int uniform_refine = input_file(
"uniform_refine",0);
 
  151   const std::string refine_type     = input_file(
"refinement_type", 
"h");
 
  152   const std::string approx_type     = input_file(
"approx_type", 
"LAGRANGE");
 
  153   const unsigned int approx_order   = input_file(
"approx_order", 1);
 
  155   const std::string element_type    = input_file(
"element_type", 
"tensor");
 
  156   const int extra_error_quadrature  = input_file(
"extra_error_quadrature", 0);
 
  157   const int max_linear_iterations   = input_file(
"max_linear_iterations", 5000);
 
  159 #ifdef LIBMESH_HAVE_EXODUS_API 
  160   const bool output_intermediate    = input_file(
"output_intermediate", 
false);
 
  166 #if !defined(LIBMESH_ENABLE_SECOND_DERIVATIVES) 
  167   libmesh_example_requires(approx_type != 
"HERMITE", 
"--enable-second");
 
  170   dim = input_file(
"dimension", 2);
 
  171   const std::string indicator_type = input_file(
"indicator_type", 
"kelly");
 
  175   libmesh_example_requires(
dim <= LIBMESH_DIM, 
"2D/3D support");
 
  179   std::string approx_name = 
"";
 
  180   if (element_type == 
"tensor")
 
  182   if (approx_order == 1)
 
  183     approx_name += 
"linear";
 
  184   else if (approx_order == 2)
 
  185     approx_name += 
"quadratic";
 
  186   else if (approx_order == 3)
 
  187     approx_name += 
"cubic";
 
  188   else if (approx_order == 4)
 
  189     approx_name += 
"quartic";
 
  191   std::string output_file = approx_name;
 
  193   output_file += refine_type;
 
  194   if (uniform_refine == 0)
 
  195     output_file += 
"_adaptive.m";
 
  197     output_file += 
"_uniform.m";
 
  199   std::ofstream 
out (output_file.c_str());
 
  200   out << 
"% dofs     L2-error     H1-error" << std::endl;
 
  201   out << 
"e = [" << std::endl;
 
  221   if (refine_type == 
"hp")
 
  233   if (element_type == 
"simplex")
 
  239   if (approx_order > 1 || refine_type != 
"h")
 
  252     system.
add_variable(
"u", static_cast<Order>(approx_order),
 
  253                         Utility::string_to_enum<FEFamily>(approx_type));
 
  255   std::vector<unsigned int> all_vars(1, u_var);
 
  258   for (
unsigned int var_num=1; var_num < 
n_vars; ++var_num)
 
  260       std::ostringstream var_name;
 
  261       var_name << 
"u" << var_num;
 
  262       unsigned int next_var =
 
  264                             static_cast<Order>(approx_order),
 
  265                             Utility::string_to_enum<FEFamily>(approx_type));
 
  266       all_vars.push_back(next_var);
 
  274   std::set<boundary_id_type> all_bdys { 0 };
 
  282   equation_systems.init();
 
  285   equation_systems.parameters.set<
unsigned int>(
"linear solver maximum iterations")
 
  286     = max_linear_iterations;
 
  289   equation_systems.parameters.set<
Real>(
"linear solver tolerance") =
 
  293   equation_systems.print_info();
 
  308                << exact_sol.
l2_error(
"Laplace", 
"u")
 
  311                << exact_sol.
h1_error(
"Laplace", 
"u")
 
  315   for (
unsigned int r_step=0; r_step<max_r_steps; r_step++)
 
  317       libMesh::out << 
"Beginning Solve " << r_step << std::endl;
 
  323                    << equation_systems.n_active_dofs()
 
  324                    << 
" degrees of freedom." 
  329                    << 
", final residual: " 
  333 #ifdef LIBMESH_HAVE_EXODUS_API 
  336       if (output_intermediate)
 
  338           std::ostringstream outfile;
 
  339           outfile << 
"lshaped_" << r_step << 
".e";
 
  343 #endif // #ifdef LIBMESH_HAVE_EXODUS_API 
  350                    << exact_sol.
l2_error(
"Laplace", 
"u")
 
  353                    << exact_sol.
h1_error(
"Laplace", 
"u")
 
  362         Real mean_disc_error = disc_error.
mean();
 
  364         libMesh::out << 
"Mean discontinuity error = " << mean_disc_error << std::endl;
 
  367 #ifdef LIBMESH_ENABLE_PETSC 
  368         libmesh_assert_less (mean_disc_error, 1e-14);
 
  373       out << equation_systems.n_active_dofs() << 
" " 
  374           << exact_sol.
l2_error(
"Laplace", 
"u") << 
" " 
  375           << exact_sol.
h1_error(
"Laplace", 
"u") << std::endl;
 
  378       if (r_step+1 != max_r_steps)
 
  382           if (uniform_refine == 0)
 
  389               if (indicator_type == 
"exact")
 
  416               else if (indicator_type == 
"patch")
 
  425               else if (indicator_type == 
"uniform")
 
  435                   libmesh_assert_equal_to (indicator_type, 
"kelly");
 
  454               std::ostringstream ss;
 
  456 #ifdef LIBMESH_HAVE_EXODUS_API 
  457 #  ifdef LIBMESH_HAVE_NEMESIS_API 
  458               std::string error_output = 
"error_" + ss.str() + 
".n";
 
  460               std::string error_output = 
"error_" + ss.str() + 
".e";
 
  463               std::string error_output = 
"error_" + ss.str() + 
".gmv";
 
  478               if (refine_type == 
"p")
 
  482               else if (refine_type == 
"matchedhp")
 
  486               else if (refine_type == 
"hp")
 
  493               else if (refine_type == 
"singularhp")
 
  503               else if (refine_type != 
"h")
 
  504                 libmesh_error_msg(
"Unknown refinement_type = " << refine_type);
 
  511           else if (uniform_refine == 1)
 
  513               if (refine_type == 
"h" || refine_type == 
"hp" ||
 
  514                   refine_type == 
"matchedhp")
 
  516               if (refine_type == 
"p" || refine_type == 
"hp" ||
 
  517                   refine_type == 
"matchedhp")
 
  526           equation_systems.reinit ();
 
  530 #ifdef LIBMESH_HAVE_EXODUS_API 
  536 #endif // #ifdef LIBMESH_HAVE_EXODUS_API 
  539   out << 
"];" << std::endl;
 
  540   out << 
"hold on" << std::endl;
 
  541   out << 
"plot(e(:,1), e(:,2), 'bo-');" << std::endl;
 
  542   out << 
"plot(e(:,1), e(:,3), 'ro-');" << std::endl;
 
  545   out << 
"xlabel('dofs');" << std::endl;
 
  546   out << 
"title('" << approx_name << 
" elements');" << std::endl;
 
  547   out << 
"legend('L2-error', 'H1-error');" << std::endl;
 
  552 #endif // #ifndef LIBMESH_ENABLE_AMR 
  570   const Real y = (
dim > 1) ? p(1) : 0.;
 
  576       Real theta = atan2(y, x);
 
  583       const Real z = (
dim > 2) ? p(2) : 0;
 
  585       return pow(x*x + y*y, 1./3.)*sin(2./3.*theta) + z;
 
  591       const Real z = (
dim > 2) ? p(2) : 0;
 
  593       return cos(x) * exp(y) * (1. - z);
 
  614   const Real y = 
dim > 1 ? p(1) : 0.;
 
  619       libmesh_assert_not_equal_to (x, 0.);
 
  622       const Real tt = 2./3.;
 
  623       const Real ot = 1./3.;
 
  626       const Real r2 = x*x + y*y;
 
  630       Real theta = atan2(y, x);
 
  637       gradu(0) = tt*x*
pow(r2,-tt)*sin(tt*theta) - 
pow(r2,ot)*cos(tt*theta)*tt/(1.+y*y/x/x)*y/x/x;
 
  641         gradu(1) = tt*y*
pow(r2,-tt)*sin(tt*theta) + 
pow(r2,ot)*cos(tt*theta)*tt/(1.+y*y/x/x)*1./x;
 
  648       const Real z = (
dim > 2) ? p(2) : 0;
 
  650       gradu(0) = -sin(x) * exp(y) * (1. - z);
 
  652         gradu(1) = cos(x) * exp(y) * (1. - z);
 
  654         gradu(2) = -cos(x) * exp(y);
 
  671                       const std::string & system_name)
 
  676 #ifdef LIBMESH_ENABLE_AMR 
  679   libmesh_assert_equal_to (system_name, 
"Laplace");
 
  685   PerfLog perf_log (
"Matrix Assembly", 
false);
 
  704   FEType fe_type = dof_map.variable_type(0);
 
  710   std::unique_ptr<FEBase> fe      (
FEBase::build(mesh_dim, fe_type));
 
  711   std::unique_ptr<FEBase> fe_face (
FEBase::build(mesh_dim, fe_type));
 
  718   fe->attach_quadrature_rule      (qrule.get());
 
  719   fe_face->attach_quadrature_rule (qface.get());
 
  725   const std::vector<Real> & JxW      = fe->get_JxW();
 
  730   const std::vector<Point> & q_point = fe->get_xyz();
 
  733   const std::vector<std::vector<Real>> & phi = fe->get_phi();
 
  737   const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
 
  749   std::vector<dof_id_type> dof_indices;
 
  765       perf_log.
push(
"elem init");
 
  771       dof_map.dof_indices (elem, dof_indices);
 
  779       const unsigned int n_dofs =
 
  780         cast_int<unsigned int>(dof_indices.size());
 
  788       Ke.
resize (n_dofs, n_dofs);
 
  795       perf_log.
pop(
"elem init");
 
  803       perf_log.
push (
"Ke");
 
  805       std::vector<dof_id_type> dof_indices_u;
 
  806       dof_map.dof_indices (elem, dof_indices_u, 0);
 
  807       const unsigned int n_u_dofs = dof_indices_u.size();
 
  808       libmesh_assert_equal_to (n_u_dofs, phi.size());
 
  809       libmesh_assert_equal_to (n_u_dofs, dphi.size());
 
  811       for (
unsigned int v=0; v != 
n_vars; ++v)
 
  814           Kuu.
reposition (v*n_u_dofs, v*n_u_dofs, n_u_dofs, n_u_dofs);
 
  816           for (
unsigned int qp=0; qp<qrule->n_points(); qp++)
 
  817             for (
unsigned int i=0; i != n_u_dofs; i++)
 
  818               for (
unsigned int j=0; j != n_u_dofs; j++)
 
  819                 Kuu(i,j) += JxW[qp]*(dphi[i][qp]*dphi[j][qp]);
 
  827               for (
unsigned int qp=0; qp<qrule->n_points(); qp++)
 
  829                   Real x = q_point[qp](0);
 
  832                   for (
unsigned int i=0; i != n_u_dofs; ++i)
 
  833                     Fu(i) += JxW[qp]*phi[i][qp]*f;
 
  847       LOG_SCOPE_WITH(
"matrix insertion", 
"", perf_log);
 
  851       dof_map.heterogenously_constrain_element_matrix_and_vector(Ke, Fe, dof_indices);
 
  859 #endif // #ifdef LIBMESH_ENABLE_AMR 
  
void plot_error(const std::string &filename, const MeshBase &mesh) const
Plots a data file, of a type determined by looking at the file extension in filename,...
 
void add_algebraic_ghosting_functor(GhostingFunctor &evaluable_functor, bool to_mesh=true)
Adds a functor which can specify algebraic ghosting requirements for use with distributed vectors.
 
This class handles the computation of the L2 and/or H1 error for the Systems in the EquationSystems o...
 
Gradient exact_grad(const Point &, const Parameters &, const std::string &, const std::string &)
 
bool refine_and_coarsen_elements()
Refines and coarsens user-requested elements.
 
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
 
int main(int argc, char **argv)
 
const MeshBase & get_mesh() const
 
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false)=0
Interfaces for reading/writing a mesh to/from a file.
 
NumericVector< Number > * rhs
The system matrix.
 
This class implements the Patch Recovery error indicator.
 
void uniformly_p_refine(unsigned int n=1)
Uniformly p refines the mesh n times.
 
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...
 
void add_dirichlet_boundary(const DirichletBoundary &dirichlet_boundary)
Adds a copy of the specified Dirichlet boundary to the system.
 
virtual void estimate_error(const System &system, ErrorVector &error_per_cell, const NumericVector< Number > *solution_vector=nullptr, bool estimate_parent_error=false) override
This function uses the derived class's jump error estimate formula to estimate the error on each cell...
 
virtual SimpleRange< element_iterator > active_local_element_ptr_range()=0
 
Defines a dense submatrix for use in Finite Element-type computations.
 
The libMesh namespace provides an interface to certain functionality in the library.
 
void attach_exact_deriv(unsigned int sys_num, FunctionBase< Gradient > *g)
Clone and attach an arbitrary functor which computes the exact gradient of the system sys_num solutio...
 
This class uses a user-provided list of singularity locations to choose between h refining and p elev...
 
const T_sys & get_system(const std::string &name) const
 
Real h1_error(const std::string &sys_name, const std::string &unknown_name)
 
MetaPhysicL::DualNumber< T, D > sqrt(const MetaPhysicL::DualNumber< T, D > &in)
 
static const Real TOLERANCE
 
Gradient exact_derivative(const Point &p, const Parameters &, const std::string &, const std::string &)
 
virtual void solve() override
Assembles & solves the linear system A*x=b.
 
SolverPackage default_solver_package()
 
unsigned int mesh_dimension() const
 
The ExodusII_IO class implements reading meshes in the ExodusII file format from Sandia National Labs...
 
void resize(const unsigned int new_m, const unsigned int new_n)
Resize the matrix.
 
This class defines a vector in LIBMESH_DIM dimensional Real or Complex space.
 
void init(triangulateio &t)
Initializes the fields of t to nullptr/0 as necessary.
 
Implements (adaptive) mesh refinement algorithms for a MeshBase.
 
virtual void estimate_error(const System &system, ErrorVector &error_per_cell, const NumericVector< Number > *solution_vector=nullptr, bool estimate_parent_error=false) override
This function uses the exact solution function to estimate the error on each cell.
 
This class implements the Kelly error indicator which is based on the flux jumps between elements.
 
void attach_exact_value(unsigned int sys_num, FunctionBase< Number > *f)
Clone and attach an arbitrary functor which computes the exact value of the system sys_num solution a...
 
void attach_assemble_function(void fptr(EquationSystems &es, const std::string &name))
Register a user function to use in assembling the system matrix and RHS.
 
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i].
 
This is the MeshBase class.
 
void extra_quadrature_order(const int extraorder)
Increases or decreases the order of the quadrature rule used for numerical integration.
 
Wrap a libMesh-style function pointer into a FunctionBase object.
 
void pop(const char *label, const char *header="")
Pop the event label off the stack, resuming any lower event.
 
void libmesh_ignore(const Args &...)
 
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
Builds a specific finite element type.
 
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.
 
The PerfLog class allows monitoring of specific events.
 
A Point defines a location in LIBMESH_DIM dimensional Real space.
 
SparseMatrix< Number > * matrix
The system matrix.
 
The ErrorVector is a specialization of the StatisticsVector for error data computed on a finite eleme...
 
double pow(double a, int b)
 
virtual void estimate_error(const System &system, ErrorVector &error_per_cell, const NumericVector< Number > *solution_vector=nullptr, bool estimate_parent_error=false) override
This function uses the Patch Recovery error estimate to estimate the error on each cell.
 
std::unique_ptr< QBase > default_quadrature_rule(const unsigned int dim, const int extraorder=0) const
 
The LibMeshInit class, when constructed, initializes the dependent libraries (e.g.
 
This class adds coupling (for use in send_list construction) between active elements and all descenda...
 
void switch_h_to_p_refinement()
Takes a mesh whose elements are flagged for h refinement and coarsening, and switches those flags to ...
 
Real l2_error(const std::string &sys_name, const std::string &unknown_name)
 
unsigned int & max_h_level()
The max_h_level is the greatest refinement level an element should reach.
 
void compute_error(const std::string &sys_name, const std::string &unknown_name)
Computes and stores the error in the solution value e = u-u_h, the gradient grad(e) = grad(u) - grad(...
 
This is the EquationSystems class.
 
unsigned int n_linear_iterations() const
 
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 ...
 
void resize(const unsigned int n)
Resize the vector.
 
Real & coarsen_fraction()
The coarsen_fraction sets either a desired target or a desired maximum number of elements to flag for...
 
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
 
Real & refine_fraction()
The refine_fraction sets either a desired target or a desired maximum number of elements to flag for ...
 
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
 
This class handles the numbering of degrees of freedom on a mesh.
 
virtual Real mean() const override
 
void attach_exact_value(unsigned int sys_num, FunctionBase< Number > *f)
Clone and attach an arbitrary functor which computes the exact value of the system sys_num solution a...
 
This class allows one to associate Dirichlet boundary values with a given set of mesh boundary ids an...
 
This class implements an "error estimator" based on the difference between the approximate and exact ...
 
Number exact_solution(const Point &p, const Parameters &, const std::string &, const std::string &)
 
bool use_unweighted_quadrature_rules
This boolean flag allows you to use "unweighted" quadrature rules (sized to exactly integrate unweigh...
 
std::list< Point > singular_points
This list, to be filled by the user, should include all singular points in the solution.
 
void push(const char *label, const char *header="")
Push the event label onto the stack, pausing any active event.
 
void reposition(const unsigned int ioff, const unsigned int n)
Changes the location of the subvector in the parent vector.
 
Real final_linear_residual() const
 
const DofMap & get_dof_map() const
 
This class measures discontinuities between elements for debugging purposes.
 
This class uses the error estimate given by different types of derefinement (h coarsening or p reduct...
 
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
 
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and linear solvers ...
 
void assemble_laplace(EquationSystems &es, const std::string &system_name)
 
void flag_elements_by_error_fraction(const ErrorVector &error_per_cell, const Real refine_fraction=0.3, const Real coarsen_fraction=0.0, const unsigned int max_level=libMesh::invalid_uint)
Flags elements for coarsening and refinement based on the computed error passed in error_per_cell.
 
virtual void select_refinement(System &system)
This pure virtual function must be redefined in derived classes to take a mesh flagged for h refineme...
 
virtual void select_refinement(System &system) override
This pure virtual function must be redefined in derived classes to take a mesh flagged for h refineme...
 
void attach_exact_deriv(unsigned int sys_num, FunctionBase< Gradient > *g)
Clone and attach an arbitrary functor which computes the exact gradient of the system sys_num solutio...
 
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times.
 
This class provides the ability to map between arbitrary, user-defined strings and several data types...
 
void reposition(const unsigned int ioff, const unsigned int joff, const unsigned int new_m, const unsigned int new_n)
Changes the location of the submatrix in the parent matrix.
 
void add_p_to_h_refinement()
Takes a mesh whose elements are flagged for h refinement and coarsening, and adds flags to request p ...