19#include <hyper.deal/base/config.h>
21#include <deal.II/fe/fe_dgq.h>
22#include <deal.II/fe/fe_values.h>
31 template <
int dim,
typename Number>
33 compute_critical_time_step(dealii::DoFHandler<dim> & dof_handler,
34 dealii::Tensor<1, dim, Number> u,
35 const unsigned int degree,
36 const unsigned int n_points,
42 template <
int dim_x,
int dim_v,
typename Number>
44 compute_critical_time_step(dealii::DoFHandler<dim_x> &dof_handler_x,
45 dealii::DoFHandler<dim_v> &dof_handler_v,
46 dealii::Tensor<1, dim_x + dim_v, Number> uu,
47 const unsigned int degree_x,
48 const unsigned int n_points_x,
50 const unsigned int degree_v,
51 const unsigned int n_points_v,
52 MPI_Comm comm_column);
56 template <
int dim,
typename Number>
58 compute_critical_time_step(dealii::DoFHandler<dim> & dof_handler,
59 dealii::Tensor<1, dim, Number> u,
60 const unsigned int degree,
61 const unsigned int n_points,
64 dealii::FE_DGQ<dim> fe(degree);
65 dealii::QGauss<dim> quad(n_points);
67 dealii::FEValues<dim> fe_values(fe,
69 dealii::update_inverse_jacobians);
73 for (
auto &cell : dof_handler.active_cell_iterators())
74 if (cell->is_locally_owned())
76 fe_values.reinit(cell);
77 for (
unsigned int q = 0; q < quad.size(); ++q)
79 dealii::Tensor<1, dim, Number> v;
80 for (
unsigned int i = 0; i < dim; i++)
81 for (
unsigned int j = 0; j < dim; j++)
82 v[j] += fe_values.inverse_jacobian(q)[i][j] * u[i];
84 for (
unsigned int i = 0; i < dim; i++)
85 v_max = std::max(v_max, std::abs(v[i]));
89 return 1.0 / dealii::Utilities::MPI::max(v_max, comm);
94 template <
int dim_x,
int dim_v,
typename Number>
96 compute_critical_time_step(dealii::DoFHandler<dim_x> &dof_handler_x,
97 dealii::DoFHandler<dim_v> &dof_handler_v,
98 dealii::Tensor<1, dim_x + dim_v, Number> uu,
99 const unsigned int degree_x,
100 const unsigned int n_points_x,
102 const unsigned int degree_v,
103 const unsigned int n_points_v,
104 MPI_Comm comm_column)
108 dealii::Tensor<1, dim_x, Number> u;
109 for (
unsigned int i = 0; i < dim_x; i++)
111 v1 = compute_critical_time_step(
112 dof_handler_x, u, degree_x, n_points_x, comm_row);
116 dealii::Tensor<1, dim_v, Number> u;
117 for (
unsigned int i = 0; i < dim_v; i++)
118 u[i] = uu[i + dim_x];
119 v2 = compute_critical_time_step(
120 dof_handler_v, u, degree_v, n_points_v, comm_column);
123 return std::min(v1, v2);