6#include <deal.II/base/bounding_box.h>
7#include <deal.II/fe/fe_values.h>
22#include <prismspf/config.h>
28template <
unsigned int dim,
unsigned int degree,
typename number>
46 std::map<std::string, Types::Index> field_indices =
48 for (
const auto &[name, field_criterion] :
49 solve_context->get_user_inputs().spatial_discretization.refinement_criteria)
52 const unsigned field_index = field_indices.at(name);
54 solve_context->get_field_attributes().at(field_index).field_type;
113 if (!
solve_context->get_user_inputs().spatial_discretization.has_adaptivity)
120 bool first_iteration =
true;
125 first_iteration =
false;
136 for (
auto &solver : solvers)
138 solver->update_ghosts();
155 const std::vector<std::shared_ptr<const CellMarkerBase<dim>>> &
175 dealii::types::global_dof_index old_dofs = dof_manager.
get_total_dofs();
176 dealii::types::global_dof_index new_dofs = 0;
177 for (
unsigned int remesh_index = 0; remesh_index < (space_parameters.
max_refinement -
187 for (
auto &solver : solvers)
189 solver->update_ghosts();
197 if (old_dofs == new_dofs)
218 solve_context->get_triangulation_manager().clear_user_flags();
221 for (
const auto &cell :
solve_context->get_triangulation_manager()
223 .active_cell_iterators())
225 if (cell->is_locally_owned())
228 bool should_refine =
false;
232 std::map<std::string, Types::Index> field_indices =
234 for (
const auto &[name, field_criterion] :
236 .spatial_discretization.refinement_criteria)
239 const unsigned int index = field_indices.at(name);
246 const auto dof_iterator = cell->as_dof_handler_iterator(
247 solve_context->get_dof_manager().get_field_dof_handler(index));
250 dealii::FEValues<dim> fe_values(
255 fe_values.reinit(dof_iterator);
256 const auto &solution_vector =
257 solve_context->get_solution_indexer().get_solution_vector(index);
264 fe_values.get_function_values(solution_vector, values);
270 std::vector<dealii::Vector<number>> vector_values(
272 dealii::Vector<number>(dim));
273 fe_values.get_function_values(solution_vector, vector_values);
277 values[q_point] = vector_values[q_point].l2_norm();
284 if (field_criterion.value_in_open_range(values[q_point]))
286 should_refine =
true;
303 std::vector<dealii::Tensor<1, dim, number>> scalar_gradients(
305 fe_values.get_function_gradients(solution_vector,
310 values[q_point] = scalar_gradients[q_point].norm();
316 std::vector<std::vector<dealii::Tensor<1, dim, number>>>
318 std::vector<dealii::Tensor<1, dim, number>>(
320 fe_values.get_function_gradients(solution_vector,
325 dealii::Vector<number> vector_gradient_component_magnitude(
327 for (
unsigned int dimension = 0; dimension < dim; dimension++)
329 vector_gradient_component_magnitude[dimension] =
330 vector_gradients[q_point][dimension].norm();
333 vector_gradient_component_magnitude.l2_norm();
340 if (field_criterion.gradient_magnitude_above_threshold(
343 should_refine =
true;
356 Assert(cell->level() > 0,
357 dealii::ExcMessage(
"Cell refinement level is less than one, which "
358 "will lead to underflow."));
359 const auto cell_refinement =
static_cast<unsigned int>(cell->level());
362 cell->set_user_flag();
363 cell->clear_coarsen_flag();
364 cell->set_refine_flag();
368 cell->set_user_flag();
369 cell->clear_coarsen_flag();
372 !cell->user_flag_set())
374 cell->set_coarsen_flag();
389 bool any_cell_marked =
false;
390 for (
const auto &cell :
solve_context->get_triangulation_manager()
392 .active_cell_iterators())
394 if (cell->is_locally_owned())
396 const unsigned int cell_refinement = cell->level();
402 return marker_function->flag(*cell,
403 solve_context->get_simulation_timer());
406 cell->set_user_flag();
407 cell->clear_coarsen_flag();
410 cell->set_refine_flag();
411 any_cell_marked =
true;
416 return any_cell_marked;
432 for (
auto solver : solvers)
434 solver->update_ghosts();
439 for (
auto &solver : solvers)
441 solver->prepare_for_solution_transfer();
448 triangulation_manager.
reinit();
449 dof_manager.
reinit(triangulation_manager);
453 for (
auto &solver : solvers)
456 solver->execute_solution_transfer();
493PRISMS_PF_END_NAMESPACE
Base class for cell markers.
Definition cell_marker_base.h:25
static dealii::ConditionalOStream & pout_base()
Generic parallel output stream. Used for essential information in release and debug mode.
Definition conditional_ostreams.cc:43
The class handles the generation and application of boundary conditions based on the user-inputs.
Definition constraint_manager.h:50
void reinit(const std::vector< FieldAttributes > &field_attributes)
Make constraints based on the inputs of the constructor.
Definition constraint_manager.cc:98
Class that manages the deal.II DoFHandlers.
Definition dof_manager.h:27
dealii::types::global_dof_index get_total_dofs() const
Get the total DoFs excluding multigrid DoFs.
Definition dof_manager.h:90
void reinit(const TriangulationManager< dim > &triangulation_handler)
Reinitialize the DoFHandlers.
Definition dof_manager.cc:59
unsigned int min_refinement
Minimum global refinement level.
Definition refinement_manager.h:485
RefinementManager(const RefinementManager &grid_refiner)=delete
Copy constructor.
bool mark_cells_for_refinement()
Mark cells based on function. Note: cells are only marked for refinement but not coarsening.
Definition refinement_manager.h:387
unsigned int max_refinement
Maximum global refinement level.
Definition refinement_manager.h:480
std::array< dealii::UpdateFlags, 2 > fe_values_flags
Update flags for the FEValues determined by the grid refinement criterion. For now,...
Definition refinement_manager.h:470
void mark_cells_for_refinement_and_coarsening()
Mark cells for refinement and coarsening.
Definition refinement_manager.h:210
RefinementManager(SolveContext< dim, degree, number > &_solve_context)
Constructor. Init the flags for refinement.
Definition refinement_manager.h:35
RefinementManager(RefinementManager &&grid_refiner) noexcept=delete
Move constructor.
void clear_refinement_markers()
Definition refinement_manager.h:150
RefinementManager & operator=(RefinementManager &&grid_refiner) noexcept=delete
Move assignment.
~RefinementManager()=default
Destructor.
void add_refinement_marker(std::shared_ptr< const CellMarkerBase< dim > > marker)
Definition refinement_manager.h:144
const std::vector< std::shared_ptr< const CellMarkerBase< dim > > > & get_refinement_markers() const
Definition refinement_manager.h:156
void do_initial_refinement(std::vector< std::shared_ptr< SolverBase< dim, degree, number > > > &solvers)
Similar to do_adaptive_refinement but loops coarsening.
Definition refinement_manager.h:168
void do_adaptive_refinement(std::vector< std::shared_ptr< SolverBase< dim, degree, number > > > &solvers)
Do the adaptive refinement.
Definition refinement_manager.h:109
unsigned int num_quad_points
Number of quadrature points.
Definition refinement_manager.h:475
SolveContext< dim, degree, number > * solve_context
Grid refinement context.
Definition refinement_manager.h:463
void refine_grid(std::vector< std::shared_ptr< SolverBase< dim, degree, number > > > &solvers)
Refine the grid once.
Definition refinement_manager.h:423
RefinementManager & operator=(const RefinementManager &grid_refiner)=delete
Copy assignment.
std::list< std::shared_ptr< const CellMarkerBase< dim > > > marker_functions
Marker functions.
Definition refinement_manager.h:490
This class provides context for a solver with ptrs to all the relevant dependencies.
Definition solve_context.h:36
Definition solver_base.h:32
This is the main class that handles the construction and solving of user-specified PDEs.
Definition system_wide.h:24
static const std::array< const dealii::FESystem< dim >, 2 > fe_systems
Scalar and Vector FE systems.
Definition system_wide.h:29
static const dealii::QGaussLobatto< dim > quadrature
Quadrature rule.
Definition system_wide.h:41
static void start_section(const char *name)
Start a new timer section.
Definition timer.cc:116
static void end_section(const char *name)
End the timer section.
Definition timer.cc:127
This class handlers the generation and manipulation of triangulations.
Definition triangulation_manager.h:26
void reinit()
Reinitialize the triangulation handler. This is used for AMR with multigrid so the coarsened meshes c...
Definition triangulation_manager.cc:44
void execute_grid_refinement()
Execute grid refinement on the triangulation.
Definition triangulation_manager.h:109
void prepare_for_grid_refinement()
Prepare the triangulation for grid refinement.
Definition triangulation_manager.h:100
std::map< std::string, Types::Index > field_index_map(const std::vector< FieldAttributes > &fields)
Make a map that maps field names to field indices.
Definition field_attributes.h:64
@ Value
Use value of the variable as a criterion for refinement.
Definition grid_refiner_criterion.h:31
@ Gradient
Use gradient of the variable as a criterion for refinement.
Definition grid_refiner_criterion.h:36
Definition conditional_ostreams.cc:20
Struct that holds spatial discretization parameters.
Definition spatial_discretization.h:230
unsigned int min_refinement
Definition spatial_discretization.h:312
unsigned int max_refinement
Definition spatial_discretization.h:309
TensorRank
Tensor rank of the field.
Definition type_enums.h:52
@ Scalar
Definition type_enums.h:54