7#include <deal.II/base/quadrature_lib.h>
8#include <deal.II/fe/fe_q.h>
9#include <deal.II/fe/fe_system.h>
10#include <deal.II/fe/mapping_q1.h>
12#include <prismspf/config.h>
13#include <prismspf/core/conditional_ostreams.h>
14#include <prismspf/core/constraint_handler.h>
15#include <prismspf/core/dof_handler.h>
16#include <prismspf/core/invm_handler.h>
17#include <prismspf/core/matrix_free_handler.h>
18#include <prismspf/core/solution_handler.h>
19#include <prismspf/core/solution_output.h>
20#include <prismspf/core/timer.h>
21#include <prismspf/core/triangulation_handler.h>
22#include <prismspf/core/type_enums.h>
23#include <prismspf/core/variable_attributes.h>
24#include <prismspf/solvers/explicit_postprocess_solver.h>
25#include <prismspf/solvers/explicit_solver.h>
26#include <prismspf/solvers/nonexplicit_auxiliary_solver.h>
27#include <prismspf/solvers/nonexplicit_linear_solver.h>
28#include <prismspf/solvers/nonexplicit_self_nonlinear_solver.h>
29#include <prismspf/user_inputs/user_input_parameters.h>
30#include <prismspf/utilities/element_volume.h>
34#ifdef PRISMS_PF_WITH_CALIPER
35# include <caliper/cali.h>
38PRISMS_PF_BEGIN_NAMESPACE
44template <
int dim,
int degree>
108 dealii::MGLevelObject<matrixfreeHandler<dim, float>> multigrid_matrix_free_handler;
130 std::map<fieldType, dealii::FESystem<dim>> fe_system;
135 const dealii::MappingQ1<dim> mapping;
173template <
int dim,
int degree>
175 : user_inputs(_user_inputs)
176 , triangulation_handler(_user_inputs)
177 , constraint_handler(_user_inputs)
178 , matrix_free_handler(_user_inputs)
179 , multigrid_matrix_free_handler(0, 0, _user_inputs)
180 , invm_handler(_user_inputs.var_attributes)
181 , solution_handler(_user_inputs.var_attributes)
182 , dof_handler(_user_inputs)
183 , explicit_constant_solver(user_inputs,
190 , explicit_solver(user_inputs,
197 , postprocess_explicit_solver(user_inputs,
204 , nonexplicit_auxiliary_solver(user_inputs,
206 triangulation_handler,
211 multigrid_matrix_free_handler,
213 , nonexplicit_linear_solver(user_inputs,
215 triangulation_handler,
220 multigrid_matrix_free_handler,
222 , nonexplicit_self_nonlinear_solver(user_inputs,
224 triangulation_handler,
229 multigrid_matrix_free_handler,
233template <
int dim,
int degree>
239 const unsigned int n_proc = dealii::Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD);
243 const unsigned int n_vect_doubles = dealii::VectorizedArray<double>::size();
244 const unsigned int n_vect_bits = 8 *
sizeof(double) * n_vect_doubles;
247 <<
"vectorization over " << n_vect_doubles <<
" doubles = " << n_vect_bits
248 <<
" bits (" << dealii::Utilities::System::get_current_vectorization_level() <<
')'
254 for (
const auto &[index, variable] : user_inputs.var_attributes)
256 if (variable.field_type == fieldType::SCALAR &&
257 fe_system.find(fieldType::SCALAR) == fe_system.end())
259 fe_system.emplace(fieldType::SCALAR,
260 dealii::FESystem<dim>(dealii::FE_Q<dim>(
261 dealii::QGaussLobatto<1>(degree + 1)),
266 else if (variable.field_type == fieldType::VECTOR &&
267 fe_system.find(fieldType::VECTOR) == fe_system.end())
269 fe_system.emplace(fieldType::VECTOR,
270 dealii::FESystem<dim>(dealii::FE_Q<dim>(
271 dealii::QGaussLobatto<1>(degree + 1)),
280 triangulation_handler.generate_mesh();
284 dof_handler.init(triangulation_handler, fe_system);
288 constraint_handler.make_constraints(mapping, dof_handler.get_dof_handlers());
289 constraint_handler.make_mg_constraints(mapping, dof_handler.get_mg_dof_handlers());
294 matrix_free_handler.reinit(mapping,
295 dof_handler.get_dof_handlers(),
296 constraint_handler.get_constraints(),
297 dealii::QGaussLobatto<1>(degree + 1));
301 solution_handler.init(matrix_free_handler);
307 invm_handler.initialize(matrix_free_handler.get_matrix_free());
308 invm_handler.compute_invm();
315 element_volume.initialize(matrix_free_handler.get_matrix_free());
316 element_volume.compute_element_volume(fe_system.begin()->second);
321 explicit_constant_solver.init();
322 explicit_solver.init();
323 postprocess_explicit_solver.init();
324 nonexplicit_auxiliary_solver.init();
325 nonexplicit_linear_solver.init();
326 nonexplicit_self_nonlinear_solver.init();
329 solution_handler.update_ghosts();
334 nonexplicit_auxiliary_solver.solve();
338 <<
"solving linear time-independent variables in 0th timestep...\n"
340 nonexplicit_linear_solver.solve();
344 <<
"solving self-nonlinear time-independent variables in 0th timestep...\n"
346 nonexplicit_self_nonlinear_solver.solve();
350 <<
"solving postprocessed variables in 0th timestep...\n"
352 postprocess_explicit_solver.solve();
357 dof_handler.get_dof_handlers(),
365template <
int dim,
int degree>
372 solution_handler.update_ghosts();
373 explicit_solver.solve();
374 nonexplicit_auxiliary_solver.solve();
375 nonexplicit_linear_solver.solve();
376 nonexplicit_self_nonlinear_solver.solve();
381template <
int dim,
int degree>
386 <<
"================================================\n"
388 <<
"================================================\n"
391 CALI_MARK_BEGIN(
"Initialization");
393 CALI_MARK_END(
"Initialization");
398 <<
"================================================\n"
400 <<
"================================================\n"
402 while (user_inputs.temporal_discretization.increment <
403 user_inputs.temporal_discretization.total_increments)
405 user_inputs.temporal_discretization.increment++;
406 user_inputs.temporal_discretization.time += user_inputs.temporal_discretization.dt;
408 CALI_MARK_BEGIN(
"Solve Increment");
410 CALI_MARK_END(
"Solve Increment");
412 if (user_inputs.output_parameters.should_output(
413 user_inputs.temporal_discretization.increment))
415 postprocess_explicit_solver.solve();
418 dof_handler.get_dof_handlers(),
425 <<
"Iteration: " << user_inputs.temporal_discretization.increment <<
"\n";
426 for (
const auto &[pair, vector] : solution_handler.solution_set)
429 <<
" Solution index " << pair.first <<
" type " << to_string(pair.second)
430 <<
" l2-norm: " << vector->l2_norm() <<
"\n";
437template <
int dim,
int degree>
443#ifndef PRISMS_PF_WITH_CALIPER
448PRISMS_PF_END_NAMESPACE
This is the main class that handles the construction and solving of user-specified PDEs.
Definition pde_problem.h:46
PDEProblem(const userInputParameters< dim > &_user_inputs)
Constructor.
Definition pde_problem.h:174
void run()
Run initialization and solving steps of the given problem.
Definition pde_problem.h:439
static dealii::ConditionalOStream & pout_base()
Generic parallel output stream. Used for essential information in release and debug mode.
Definition conditional_ostreams.cc:31
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:22
The class handles the generation and application of boundary conditions based on the user-inputs.
Definition constraint_handler.h:25
Class that manages the deal.II DoFHandlers.
Definition dof_handler.h:25
Compute the element volume.
Definition element_volume.h:24
This class handles the explicit solves of all constant fields.
Definition explicit_constant_solver.h:28
This class handles the explicit solves of all postprocessed fields.
Definition explicit_postprocess_solver.h:29
This class handles the explicit solves of all explicit fields.
Definition explicit_solver.h:34
This class handles the computation and access of the inverted mass matrix for explicit solves.
Definition invm_handler.h:25
This class handlers the management and access of the matrix-free objects.
Definition matrix_free_handler.h:25
This class handles all auxiliary solves.
Definition nonexplicit_auxiliary_solver.h:35
This class handles all linear solves.
Definition nonexplicit_linear_solver.h:40
This class handles the self-nonlinear solves of a single nonexplicit field.
Definition nonexplicit_self_nonlinear_solver.h:26
Class that manages solution initialization and swapping with old solutions.
Definition solution_handler.h:22
Class that outputs a passed solution to vtu, vtk, or pvtu.
Definition solution_output.h:25
static dealii::TimerOutput & serial_timer()
deal.II timer for the 0th MPI process
Definition timer.cc:17
static void print_summary()
Print a sorted summary of the timed sections.
Definition timer.cc:38
This class handlers the generation and manipulation of triangulations.
Definition triangulation_handler.h:24