68 "--enable-petsc, --enable-trilinos, or --enable-eigen");
71 #ifdef LIBMESH_DEFAULT_SINGLE_PRECISION
72 libmesh_example_requires(
false,
"--disable-singleprecision");
75 #ifndef LIBMESH_ENABLE_AMR
76 libmesh_example_requires(
false,
"--enable-amr");
80 #ifndef LIBMESH_ENABLE_DIRICHLET
81 libmesh_example_requires(
false,
"--enable-dirichlet");
90 GetPot infile(
"fem_system_ex1.in");
93 infile.parse_command_line(argc, argv);
96 const Real global_tolerance = infile(
"global_tolerance", 0.);
97 const unsigned int nelem_target = infile(
"n_elements", 400);
98 const bool transient = infile(
"transient",
true);
99 const Real deltat = infile(
"deltat", 0.005);
100 unsigned int n_timesteps = infile(
"n_timesteps", 20);
101 const unsigned int coarsegridsize = infile(
"coarsegridsize", 1);
102 const unsigned int coarserefinements = infile(
"coarserefinements", 0);
103 const unsigned int max_adaptivesteps = infile(
"max_adaptivesteps", 10);
104 const unsigned int dim = infile(
"dimension", 2);
105 const std::string slvr_type = infile(
"solver_type",
"newton");
106 const std::string mesh_type = infile(
"mesh_type" ,
"replicated");
108 #ifdef LIBMESH_HAVE_EXODUS_API
109 const unsigned int write_interval = infile(
"write_interval", 5);
113 libmesh_example_requires(
dim <= LIBMESH_DIM,
"2D/3D support");
120 std::shared_ptr<UnstructuredMesh>
mesh;
122 if (mesh_type ==
"distributed")
123 mesh = std::make_shared<DistributedMesh>(
init.comm());
124 else if (mesh_type ==
"replicated")
125 mesh = std::make_shared<ReplicatedMesh>(
init.comm());
127 libmesh_error_msg(
"Error: specified mesh_type not understood");
131 mesh_refinement.coarsen_by_parents() =
true;
132 mesh_refinement.absolute_global_tolerance() = global_tolerance;
133 mesh_refinement.nelem_target() = nelem_target;
134 mesh_refinement.refine_fraction() = 0.3;
135 mesh_refinement.coarsen_fraction() = 0.3;
136 mesh_refinement.coarsen_threshold() = 0.1;
160 if (slvr_type ==
"petscdiff")
167 mesh_refinement.uniformly_refine(coarserefinements);
177 equation_systems.add_system<
NavierSystem> (
"Navier-Stokes");
181 system.
time_solver = libmesh_make_unique<EulerSolver>(system);
184 system.
time_solver = libmesh_make_unique<SteadySolver>(system);
185 libmesh_assert_equal_to (n_timesteps, 1);
189 equation_systems.init ();
195 if (slvr_type ==
"newton")
196 system.
time_solver->diff_solver() = libmesh_make_unique<NewtonSolver>(system);
197 else if (slvr_type ==
"petscdiff")
198 #if defined(LIBMESH_HAVE_PETSC) && defined(LIBMESH_HAVE_METAPHYSICL)
199 system.
time_solver->diff_solver() = libmesh_make_unique<PetscDiffSolver>(system);
201 libmesh_example_requires(
false,
"--enable-petsc --enable-metaphysicl-required");
204 libmesh_error_msg(
"Error: specified solver_type not understood");
209 solver.
quiet = infile(
"solver_quiet",
true);
212 infile(
"max_nonlinear_iterations", 15);
214 infile(
"relative_step_tolerance", 1.e-3);
216 infile(
"relative_residual_tolerance", 0.0);
218 infile(
"absolute_residual_tolerance", 0.0);
222 infile(
"max_linear_iterations", 50000);
224 infile(
"initial_linear_tolerance", 1.e-3);
227 equation_systems.print_info();
231 for (
unsigned int t_step=0; t_step != n_timesteps; ++t_step)
241 unsigned int a_step = 0;
242 for (; a_step != max_adaptivesteps; ++a_step)
250 std::unique_ptr<ErrorEstimator> error_estimator;
254 if (global_tolerance != 0.)
258 libmesh_assert_equal_to (nelem_target, 0);
260 error_estimator = libmesh_make_unique<UniformRefinementEstimator>();
264 error_estimator->error_norm =
L2;
270 libmesh_assert_greater (nelem_target, 0);
276 error_estimator = libmesh_make_unique<KellyErrorEstimator>();
280 std::vector<Real> weights(2,1.0);
282 weights.push_back(1.0);
283 weights.push_back(0.0);
285 std::vector<FEMNormType>
286 norms(1, error_estimator->error_norm.type(0));
287 error_estimator->error_norm =
SystemNorm(norms, weights);
289 error_estimator->estimate_error(system, error);
298 if (global_tolerance != 0.)
303 if (global_tolerance != 0.)
310 if (global_tolerance != 0.)
314 if (global_error < global_tolerance)
316 mesh_refinement.flag_elements_by_error_tolerance(error);
322 if (mesh_refinement.flag_elements_by_nelem_target(error))
324 mesh_refinement.refine_and_coarsen_elements();
325 equation_systems.reinit();
326 a_step = max_adaptivesteps;
332 mesh_refinement.refine_and_coarsen_elements();
333 equation_systems.reinit();
337 <<
" active elements and "
338 << equation_systems.n_active_dofs()
343 if (a_step == max_adaptivesteps)
353 #ifdef LIBMESH_HAVE_EXODUS_API
355 if ((t_step+1)%write_interval == 0)
357 std::ostringstream file_name;
373 #endif // #ifdef LIBMESH_HAVE_EXODUS_API
375 #endif // #ifndef LIBMESH_ENABLE_AMR