42 , solver_control(
"Solver control", 1000, 1
e-12, 1
e-12)
98 "last_used_parameters.prm",
121 const auto vars = dim == 1 ?
"x" : dim == 2 ?
"x,y" :
"x,y,z";
122 pre_refinement.initialize(vars, pre_refinement_expression, constants);
124 grid_generator_function,
125 grid_generator_arguments);
127 for (
unsigned int i = 0; i < n_refinements; ++i)
130 if (pre_refinement.value(cell->center()) < cell->diameter())
131 cell->set_refine_flag();
135 std::cout <<
"Number of active cells: " <<
triangulation.n_active_cells()
159 fe = std::make_unique<FE_Q<dim>>(fe_degree);
160 mapping = std::make_unique<MappingQGeneric<dim>>(mapping_degree);
161 const auto vars = dim == 1 ?
"x" : dim == 2 ?
"x,y" :
"x,y,z";
162 forcing_term.initialize(vars, forcing_term_expression, constants);
163 coefficient.initialize(vars, coefficient_expression, constants);
164 exact_solution.initialize(vars, exact_solution_expression, constants);
166 dirichlet_boundary_condition.initialize(
167 vars, dirichlet_boundary_conditions_expression, constants);
169 neumann_boundary_condition.initialize(
170 vars, neumann_boundary_conditions_expression, constants);
173 dof_handler.distribute_dofs(*fe);
174 std::cout <<
"Number of degrees of freedom: " << dof_handler.n_dofs()
179 for (
const auto &
id : dirichlet_ids)
181 *mapping, dof_handler,
id, dirichlet_boundary_condition, constraints);
187 sparsity_pattern.copy_from(dsp);
188 system_matrix.reinit(sparsity_pattern);
189 solution.reinit(dof_handler.n_dofs());
190 system_rhs.reinit(dof_handler.n_dofs());
204 auto &cell_rhs =
copy.vectors[0];
206 cell->get_dof_indices(
copy.local_dof_indices[0]);
208 const auto &fe_values = scratch.
reinit(cell);
212 for (
const unsigned int q_index : fe_values.quadrature_point_indices())
214 for (
const unsigned int i : fe_values.dof_indices())
215 for (
const unsigned int j : fe_values.dof_indices())
217 (coefficient.value(fe_values.quadrature_point(q_index)) *
218 fe_values.shape_grad(i, q_index) *
219 fe_values.shape_grad(j, q_index) *
220 fe_values.JxW(q_index));
221 for (
const unsigned int i : fe_values.dof_indices())
223 (fe_values.shape_value(i, q_index) *
224 forcing_term.value(fe_values.quadrature_point(q_index)) *
225 fe_values.JxW(q_index));
228 if (cell->at_boundary())
230 for (
unsigned int f = 0; f < GeometryInfo<dim>::faces_per_cell; ++f)
231 if (neumann_ids.find(cell->face(f)->boundary_id()) != neumann_ids.end())
233 auto &fe_face_values = scratch.
reinit(cell, f);
234 for (
const unsigned int q_index :
235 fe_face_values.quadrature_point_indices())
236 for (
const unsigned int i : fe_face_values.dof_indices())
237 cell_rhs(i) += fe_face_values.shape_value(i, q_index) *
238 neumann_boundary_condition.value(
239 fe_face_values.quadrature_point(q_index)) *
240 fe_face_values.JxW(q_index);
250 constraints.distribute_local_to_global(
copy.matrices[0],
252 copy.local_dof_indices[0],
266 QGauss<dim - 1> face_quadrature_formula(fe->degree + 1);
273 face_quadrature_formula,
281 for (
auto cell =
begin; cell !=
end; ++cell)
283 assemble_system_one_cell(cell, scratch,
copy);
284 assemble_mutex.lock();
286 assemble_mutex.unlock();
298 QGauss<dim - 1> face_quadrature_formula(fe->degree + 1);
305 face_quadrature_formula,
327 if (use_direct_solver ==
true)
330 system_matrix_inverse.
initialize(system_matrix);
331 system_matrix_inverse.
vmult(solution, system_rhs);
336 #ifdef DEAL_II_WITH_TRILINOS
339 solver.
solve(system_matrix, solution, system_rhs, amg);
344 constraints.distribute(solution);
354 if (estimator_type ==
"exact")
366 else if (estimator_type ==
"kelly")
368 std::map<types::boundary_id, const Function<dim> *> neumann;
369 for (
const auto id : neumann_ids)
370 neumann[id] = &neumann_boundary_condition;
372 QGauss<dim - 1> face_quad(fe->degree + 1);
382 else if (estimator_type ==
"residual")
388 QGauss<dim - 1> face_quad(fe->degree + 1);
391 std::map<types::boundary_id, const Function<dim> *> neumann;
392 for (
const auto id : neumann_ids)
393 neumann[id] = &neumann_boundary_condition;
410 std::vector<double> local_laplacians(quad.
size());
413 double residual_L2_norm = 0;
415 unsigned int cell_index = 0;
416 for (
const auto &cell : dof_handler.active_cell_iterators())
421 residual_L2_norm = 0;
425 (local_laplacians[q_index] +
427 residual_L2_norm += arg * arg * fe_values.
JxW(q_index);
429 error_per_cell[cell_index] +=
430 cell->diameter() * std::sqrt(residual_L2_norm);
439 auto global_estimator = error_per_cell.l2_norm();
440 error_table.add_extra_column(
"estimator", [global_estimator]() {
441 return global_estimator;
443 error_table.error_from_exact(*mapping, dof_handler, solution, exact_solution);
453 if (marking_strategy ==
"global")
455 for (
const auto &cell :
triangulation.active_cell_iterators())
456 cell->set_refine_flag();
458 else if (marking_strategy ==
"fixed_fraction")
463 coarsening_and_refinement_factors.second,
464 coarsening_and_refinement_factors.first);
466 else if (marking_strategy ==
"fixed_number")
471 coarsening_and_refinement_factors.second,
472 coarsening_and_refinement_factors.first);
491 auto interpolated_exact = solution;
499 std::max(mapping_degree, fe_degree),
501 std::string fname = output_filename +
"_" + std::to_string(cycle) +
".vtu";
502 std::ofstream output(fname);
512 if (number_of_threads != -1 && number_of_threads > 0)
514 static_cast<unsigned int>(number_of_threads));
529 for (
unsigned int cycle = 0; cycle < n_refinement_cycles; ++cycle)
535 output_results(cycle);
536 if (cycle < n_refinement_cycles - 1)
542 error_table.output_table(std::cout);
void write_vtu(std::ostream &out) const
void set_flags(const FlagType &flags)
void attach_dof_handler(const DoFHandler< dim > &)
void add_data_vector(const VectorType &data, const std::vector< std::string > &names, const DataVectorType type=type_automatic, const std::vector< DataComponentInterpretation::DataComponentInterpretation > &data_component_interpretation=std::vector< DataComponentInterpretation::DataComponentInterpretation >())
virtual void build_patches(const unsigned int n_subdivisions=0)
void get_function_laplacians(const InputVector &fe_function, std::vector< typename InputVector::value_type > &laplacians) const
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
const Point< spacedim > & quadrature_point(const unsigned int q) const
double JxW(const unsigned int quadrature_point) const
void reinit(const TriaIterator< DoFCellAccessor< DoFHandlerType< dim, dim >, level_dof_access >> &cell)
static void estimate(const Mapping< dim, spacedim > &mapping, const DoFHandlerType &dof, const Quadrature< dim - 1 > &quadrature, const std::map< types::boundary_id, const Function< spacedim, typename InputVector::value_type > * > &neumann_bc, const InputVector &solution, Vector< float > &error, const ComponentMask &component_mask=ComponentMask(), const Function< spacedim > *coefficients=nullptr, const unsigned int n_threads=numbers::invalid_unsigned_int, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id, const types::material_id material_id=numbers::invalid_material_id, const Strategy strategy=cell_diameter_over_24)
const FEValues< dim, spacedim > & reinit(const typename DoFHandler< dim, spacedim >::active_cell_iterator &cell)
static unsigned int n_cores()
static unsigned int n_threads()
static void set_thread_limit(const unsigned int max_threads=numbers::invalid_unsigned_int)
static void initialize(const std::string &filename="", const std::string &output_filename="", const ParameterHandler::OutputStyle output_style_for_output_filename=ParameterHandler::Short, ParameterHandler &prm=ParameterAcceptor::prm, const ParameterHandler::OutputStyle output_style_for_filename=ParameterHandler::DefaultStyle)
static ParameterHandler prm
static void parse_all_parameters(ParameterHandler &prm=ParameterAcceptor::prm)
void add_parameter(const std::string &entry, ParameterType ¶meter, const std::string &documentation="", ParameterHandler &prm_=prm, const Patterns::PatternBase &pattern=*Patterns::Tools::Convert< ParameterType >::to_pattern())
virtual void parse_input_from_string(const std::string &s, const std::string &last_line="", const bool skip_undefined=false)
void enter_subsection(const std::string &subsection)
void add_parameters(ParameterHandler &prm)
unsigned int size() const
void solve(const MatrixType &A, VectorType &x, const VectorType &b, const PreconditionerType &preconditioner)
void initialize(const SparsityPattern &sparsity_pattern)
void vmult(Vector< double > &dst, const Vector< double > &src) const
void initialize(const SparseMatrix &matrix, const AdditionalData &additional_data=AdditionalData())
std::set< types::boundary_id > neumann_ids
std::set< types::boundary_id > dirichlet_ids
void assemble_system_one_cell(const typename DoFHandler< dim >::active_cell_iterator &cell, ScratchData &scratch, CopyData ©)
std::map< std::string, double > constants
std::string neumann_boundary_conditions_expression
void assemble_system_on_range(const typename DoFHandler< dim >::active_cell_iterator &begin, const typename DoFHandler< dim >::active_cell_iterator &end)
std::string exact_solution_expression
std::string forcing_term_expression
std::string pre_refinement_expression
void parse_string(const std::string &par)
void output_results(const unsigned cycle) const
void initialize(const std::string &filename)
std::pair< double, double > coarsening_and_refinement_factors
ParsedConvergenceTable error_table
std::string marking_strategy
std::string grid_generator_function
std::string coefficient_expression
unsigned int mapping_degree
unsigned int n_refinement_cycles
std::string grid_generator_arguments
std::string output_filename
std::string dirichlet_boundary_conditions_expression
void copy_one_cell(const CopyData ©)
std::string estimator_type
unsigned int n_refinements
static ::ExceptionBase & ExcInternalError()
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
#define AssertThrow(cond, exc)
void make_sparsity_pattern(const DoFHandlerType &dof_handler, SparsityPatternType &sparsity_pattern, const AffineConstraints< number > &constraints=AffineConstraints< number >(), const bool keep_constrained_dofs=true, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id)
void make_hanging_node_constraints(const DoFHandlerType &dof_handler, AffineConstraints< number > &constraints)
void generate_from_name_and_arguments(Triangulation< dim, spacedim > &tria, const std::string &grid_generator_function_name, const std::string &grid_generator_function_arguments)
void refine_and_coarsen_fixed_number(Triangulation< dim, spacedim > &triangulation, const Vector< Number > &criteria, const double top_fraction_of_cells, const double bottom_fraction_of_cells, const unsigned int max_n_cells=std::numeric_limits< unsigned int >::max())
void refine_and_coarsen_fixed_fraction(Triangulation< dim, spacedim > &tria, const Vector< Number > &criteria, const double top_fraction, const double bottom_fraction, const unsigned int max_n_cells=std::numeric_limits< unsigned int >::max())
void cell_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, const FEValuesBase< dim > &fetest, const ArrayView< const std::vector< double >> &velocity, const double factor=1.)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
VectorType::value_type * begin(VectorType &V)
VectorType::value_type * end(VectorType &V)
void run(const std::vector< std::vector< Iterator >> &colored_iterators, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length=2 *MultithreadInfo::n_threads(), const unsigned int chunk_size=8)
void copy(const T *begin, const T *end, U *dest)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation
bool write_higher_order_cells