284 for (
unsigned int face =
range.first; face <
range.second; ++face)
297 [&](
const auto &data,
auto &dst,
const auto &src,
const auto range) {
302 for (
unsigned int face =
range.first; face <
range.second; ++face)
320 [&](
const auto &data,
auto &dst,
const auto &src,
const auto range) {
325 for (
unsigned int cell =
range.first; cell <
range.second; ++cell)
337 if (data.get_faces_by_cells_boundary_id(cell, face)[0] ==
382additional_data.hold_all_faces_to_owned_cells =
true;
383additional_data.mapping_update_flags_faces_by_cells =
384 additional_data.mapping_update_flags_inner_faces |
385 additional_data.mapping_update_flags_boundary_faces;
391for all faces
of the cells.
413 const VectorType & src,
414 const std::pair<unsigned int, unsigned int> &
range)
const
417 for (
unsigned int cell =
range.first; cell <
range.second; ++cell)
430matrix_free.cell_loop(&Operator::local_apply_cell,
this, dst, src);
438 [&](
const auto &
data,
auto &dst,
const auto &src,
const auto range) {
440 for (
unsigned int cell =
range.first; cell <
range.second; ++cell)
454<a name=
"VectorizedArrayType"></a><
h3>VectorizedArrayType</
h3>
473<table align="center" class="doxtable">
482 <td>(auto-vectorization)</td>
504degrees (and dimensions).
516<table align="center" class="doxtable">
519 <th>std::simd (C++23)</th>
523 <td><code>std::experimental::native_simd<Number></code></td>
527 <td><code>std::experimental::fixed_size_simd<Number, size></code></td>
532 * <a name="CommProg"></a>
536 * <a name="Parametersandutilityfunctions"></a>
544 *
 #
include <deal.II/base/conditional_ostream.h>
545 *
 #
include <deal.II/base/function.h>
546 *
 #
include <deal.II/base/logstream.h>
547 *
 #
include <deal.II/base/time_stepping.h>
549 *
 #
include <deal.II/base/utilities.h>
550 *
 #
include <deal.II/base/vectorization.h>
552 *
 #
include <deal.II/distributed/tria.h>
554 *
 #
include <deal.II/dofs/dof_handler.h>
557 *
 #
include <deal.II/fe/fe_system.h>
559 *
 #
include <deal.II/grid/grid_generator.h>
561 *
 #
include <deal.II/grid/tria_accessor.h>
562 *
 #
include <deal.II/grid/tria_iterator.h>
564 *
 #
include <deal.II/lac/affine_constraints.h>
565 *
 #
include <deal.II/lac/la_parallel_vector.h>
567 *
 #
include <deal.II/matrix_free/fe_evaluation.h>
568 *
 #
include <deal.II/matrix_free/matrix_free.h>
569 *
 #
include <deal.II/matrix_free/operators.h>
571 *
 #
include <deal.II/numerics/data_out.h>
582 *
 #
include <deal.II/matrix_free/tools.h>
592 *
The same input parameters
as in @
ref step_67
"step-67":
596 *
 constexpr unsigned int dimension = 2;
598 *
 constexpr unsigned int fe_degree = 5;
599 *
 constexpr unsigned int n_q_points_1d = fe_degree + 2;
611 *
 using Number = double;
631 *
 constexpr double gamma = 1.4;
632 *
 constexpr double final_time =
testcase == 0 ? 10 : 2.0;
688 *
 std::vector<double> ci;
692 *
 unsigned int n_stages()
const
697 *
 template <
typename VectorType,
typename Operator>
699 *
 const double current_time,
701 *
 VectorType & solution,
730 *
 std::vector<double>
bi;
731 *
 std::vector<double>
ai;
749 *
 template <
int dim>
758 *
 const unsigned int component = 0)
const override;
763 *
 template <
int dim>
765 *
 const unsigned int component)
const
773 *
 Assert(dim == 2, ExcNotImplemented());
774 *
 const double beta = 5;
779 *
 (
x -
x0).norm_square() - 2. * (
x[0] -
x0[0]) * t + t * t;
780 *
 const double factor =
783 *
 std::abs(1. - (gamma - 1.) / gamma * 0.25 * factor * factor));
785 *
 const double u = 1. - factor * (
x[1] -
x0[1]);
786 *
 const double v = factor * (
x[0] - t -
x0[0]);
788 *
 if (component == 0)
790 *
 else if (component == 1)
792 *
 else if (component == 2)
805 *
 if (component == 0)
807 *
 else if (component == 1)
809 *
 else if (component == dim + 1)
810 *
 return 3.097857142857143;
816 *
 Assert(
false, ExcNotImplemented());
823 *
 template <
int dim,
typename Number>
831 *
 for (
unsigned int d = 0;
d < dim; ++
d)
837 *
 template <
int dim,
typename Number>
846 *
 for (
unsigned int d = 1;
d < dim; ++
d)
852 *
 template <
int dim,
typename Number>
862 *
 for (
unsigned int d = 0;
d < dim; ++
d)
865 *
 for (
unsigned int e = 0;
e < dim; ++
e)
875 *
 template <
int n_components,
int dim,
typename Number>
882 *
 for (
unsigned int d = 0;
d < n_components; ++
d)
883 *
 result[d] = matrix[d] * vector;
887 *
 template <
int dim,
typename Number>
914 *
 0.5 * lambda * (
u_m -
u_p);
937 *
 Assert(
false, ExcNotImplemented());
950 *
 template <
int dim,
typename VectorizedArrayType>
951 *
 VectorizedArrayType
954 *
 const unsigned int component)
956 *
 VectorizedArrayType
result;
957 *
 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
960 *
 for (
unsigned int d = 0;
d < dim; ++
d)
962 *
 result[v] = function.value(p, component);
968 *
 template <
int dim,
typename VectorizedArrayType,
int n_components = dim + 2>
975 *
 for (
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
978 *
 for (
unsigned int d = 0;
d < dim; ++
d)
980 *
 for (
unsigned int d = 0;
d < n_components; ++
d)
981 *
 result[d][v] = function.value(p, d);
990 * <a name=
"EuleroperatorusingacellcentricloopandMPI30sharedmemory"></a>
998 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1025 *
 const Number
bi,
1026 *
 const Number
ai,
1054 *
 MatrixFree<dim, Number, VectorizedArrayType> data;
1103 *
 Assert(
false, ExcNotImplemented());
1118 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1140 *
 const std::vector<const DoFHandler<dim> *> dof_handlers = {&dof_handler};
1142 *
 const std::vector<const AffineConstraints<double> *> constraints = {&
dummy};
1147 *
 additional_data;
1148 *
 additional_data.mapping_update_flags =
1151 *
 additional_data.mapping_update_flags_inner_faces =
1154 *
 additional_data.mapping_update_flags_boundary_faces =
1157 *
 additional_data.tasks_parallel_scheme =
1169 *
 MatrixFreeTools::categorize_by_boundary_ids(dof_handler.get_triangulation(),
1170 *
 additional_data);
1181 *
 mapping, dof_handlers, constraints,
quadratures, additional_data);
1215 *
 const Number current_time,
1223 *
 i.
second->set_time(current_time);
1225 *
 i.
second->set_time(current_time);
1242 *
 VectorizedArrayType>;
1248 *
 VectorizedArrayType>;
1269 *
 VectorizedArrayType>
1271 *
 data.get_shape_info().
data[0].shape_gradients_collocation_eo,
1275 *
 phi.n_components);
1287 *
 if (
ai != Number())
1293 * quadrature points:
1296 *
 if (
ai != Number() &&
stage == 0)
1298 *
 phi.read_dof_values(src);
1300 *
 for (
unsigned int i = 0;
1301 *
 i <
phi.static_dofs_per_component * (dim + 2);
1303 *
 phi_temp.begin_dof_values()[i] =
phi.begin_dof_values()[i];
1319 *
 for (
unsigned int i = 0; i <
phi.static_n_q_points * (dim + 2); ++i)
1326 * @
ref step_67 "step-67":
1329 *
 for (
unsigned int q = 0;
q <
phi.n_q_points; ++
q)
1331 *
 const auto w_q =
phi.get_value(
q);
1342 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1344 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1357 *
as the final step.
1364 *
 for (
unsigned int c = 0; c < dim + 2; ++c)
1369 *
 else if (dim >= 1)
1389 *
 for (
unsigned int face = 0;
1401 *
 const auto boundary_ids =
1402 *
 data.get_faces_by_cells_boundary_id(cell, face);
1405 *
 boundary_ids.
begin() +
1406 *
 data.n_active_entries_per_cell_batch(cell),
1407 *
 boundary_ids.
begin()),
1408 *
 ExcMessage(
"Boundary IDs of lanes differ."));
1423 *
 VectorizedArrayType>::
1427 *
 data.get_shape_info(),
1429 *
 phi_m.begin_values(),
1444 * <
code>EulerDG::EulerOperator::local_apply_face</
code>
1445 *
from @
ref step_67
"step-67":
1451 *
 for (
unsigned int q = 0;
q <
phi_m.n_q_points; ++
q)
1466 * <
code>EulerDG::EulerOperator::local_apply_boundary_face</
code>
1467 *
from @
ref step_67
"step-67":
1470 *
 for (
unsigned int q = 0;
q <
phi_m.n_q_points; ++
q)
1473 *
 const auto normal =
phi_m.normal_vector(
q);
1476 *
 for (
unsigned int d = 1;
d < dim; ++
d)
1487 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1490 *
 w_p[dim + 1] =
w_m[dim + 1];
1496 *
 phi_m.quadrature_point(
q));
1504 *
 .find(boundary_id)
1506 *
 phi_m.quadrature_point(
q),
1513 *
 "Unknown boundary id, did "
1514 *
 "you set a boundary condition for "
1515 *
 "this part of the domain boundary?"));
1520 *
 for (
unsigned int v = 0;
1521 *
 v < VectorizedArrayType::size();
1525 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1526 *
 flux[d + 1][v] = 0.;
1541 *
 VectorizedArrayType>::
1545 *
 data.get_shape_info(),
1546 *
 phi_m.begin_values(),
1547 *
 phi.begin_values(),
1555 * <
code>EulerDG::EulerOperator::local_apply_inverse_mass_matrix()</
code>
1556 *
from @
ref step_67
"step-67":
1559 *
 for (
unsigned int q = 0;
q <
phi.static_n_q_points; ++
q)
1561 *
 const auto factor = VectorizedArrayType(1.0) /
phi.JxW(
q);
1562 *
 for (
unsigned int c = 0; c < dim + 2; ++c)
1563 *
 phi.begin_values()[c *
phi.static_n_q_points +
q] =
1564 *
 phi.begin_values()[c *
phi.static_n_q_points +
q] * factor;
1579 *
 data.get_shape_info()
1581 *
 .inverse_shape_values_eo,
1583 *
 phi.begin_values(),
1584 *
 phi.begin_dof_values());
1592 *
 if (
ai == Number())
1594 *
 for (
unsigned int q = 0;
q <
phi.static_dofs_per_cell; ++
q)
1595 *
 phi.begin_dof_values()[
q] =
bi *
phi.begin_dof_values()[
q];
1596 *
 phi.distribute_local_to_global(solution);
1603 *
 for (
unsigned int q = 0;
q <
phi.static_dofs_per_cell; ++
q)
1605 *
 const auto K_i =
phi.begin_dof_values()[
q];
1607 *
 phi.begin_dof_values()[
q] =
1612 *
 phi.set_dof_values(dst);
1630 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1634 *
 data.initialize_dof_vector(vector);
1639 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1647 *
 ExcMessage(
"You already set the boundary with id " +
1648 *
 std::to_string(
static_cast<int>(boundary_id)) +
1649 *
 " to another type of boundary before now setting " +
1650 *
 "it as inflow"));
1652 *
 ExcMessage(
"Expected function with dim+2 components"));
1659 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1667 *
 ExcMessage(
"You already set the boundary with id " +
1668 *
 std::to_string(
static_cast<int>(boundary_id)) +
1669 *
 " to another type of boundary before now setting " +
1670 *
 "it as subsonic outflow"));
1672 *
 ExcMessage(
"Expected function with dim+2 components"));
1679 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1687 *
 ExcMessage(
"You already set the boundary with id " +
1688 *
 std::to_string(
static_cast<int>(boundary_id)) +
1689 *
 " to another type of boundary before now setting " +
1690 *
 "it as wall boundary"));
1697 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1708 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1714 *
 phi(data, 0, 1);
1719 *
 VectorizedArrayType>
1721 *
 solution.zero_out_ghost_values();
1722 *
 for (
unsigned int cell = 0; cell < data.n_cell_batches(); ++cell)
1725 *
 for (
unsigned int q = 0;
q <
phi.n_q_points; ++
q)
1727 *
 phi.quadrature_point(
q)),
1729 *
 inverse.transform_from_q_points_to_basis(dim + 2,
1730 *
 phi.begin_dof_values(),
1731 *
 phi.begin_dof_values());
1732 *
 phi.set_dof_values(solution);
1738 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1746 *
 phi(data, 0, 0);
1748 *
 for (
unsigned int cell = 0; cell < data.n_cell_batches(); ++cell)
1753 *
 for (
unsigned int q = 0;
q <
phi.n_q_points; ++
q)
1757 *
 phi.get_value(
q);
1758 *
 const auto JxW =
phi.JxW(
q);
1761 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1765 *
 for (
unsigned int v = 0; v < data.n_active_entries_per_cell_batch(cell);
1767 *
 for (
unsigned int d = 0;
d < 3; ++
d)
1773 *
 std::array<double, 3>
errors;
1774 *
 for (
unsigned int d = 0;
d < 3; ++
d)
1782 *
 template <
int dim,
int degree,
int n_po
ints_1d>
1789 *
 phi(data, 0, 1);
1791 *
 for (
unsigned int cell = 0; cell < data.n_cell_batches(); ++cell)
1796 *
 for (
unsigned int q = 0;
q <
phi.n_q_points; ++
q)
1798 *
 const auto solution =
phi.get_value(
q);
1802 *
 const auto inverse_jacobian =
phi.inverse_jacobian(
q);
1805 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1813 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1815 *
 for (
unsigned int i = 0; i < 5; ++i)
1820 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1833 *
 for (
unsigned int v = 0; v < data.n_active_entries_per_cell_batch(cell);
1835 *
 for (
unsigned int d = 0;
d < 3; ++
d)
1846 *
 template <
int dim>
1884 *
 virtual void evaluate_vector_field(
1888 *
 virtual std::vector<std::string> get_names()
const override;
1890 *
 virtual std::vector<
1892 *
 get_data_component_interpretation()
const override;
1894 *
 virtual UpdateFlags get_needed_update_flags()
const override;
1903 *
 template <
int dim>
1910 *
 template <
int dim>
1919 *
 ExcInternalError());
1922 *
 ExcInternalError());
1926 *
 ExcInternalError());
1931 *
 for (
unsigned int d = 0;
d < dim + 2; ++
d)
1932 *
 solution[d] =
inputs.solution_values[p](d);
1934 *
 const double density = solution[0];
1938 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1945 *
 inputs.solution_gradients[p][0] *
inputs.solution_gradients[p][0];
1951 *
 template <
int dim>
1954 *
 std::vector<std::string> names;
1955 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1956 *
 names.emplace_back(
"velocity");
1957 *
 names.emplace_back(
"pressure");
1958 *
 names.emplace_back(
"speed_of_sound");
1961 *
 names.emplace_back(
"schlieren_plot");
1968 *
 template <
int dim>
1969 *
 std::vector<DataComponentInterpretation::DataComponentInterpretation>
1972 *
 std::vector<DataComponentInterpretation::DataComponentInterpretation>
1974 *
 for (
unsigned int d = 0;
d < dim; ++
d)
1989 *
 template <
int dim>
2000 *
 template <
int dim>
2007 *
 , mapping(fe_degree)
2017 *
 template <
int dim>
2025 *
 for (
unsigned int d = 1;
d < dim; ++
d)
2030 *
 for (
unsigned int d = 1;
d < dim; ++
d)
2060 *
 std::vector<double>({0., 0., -0.2})));
2066 *
 Assert(
false, ExcNotImplemented());
2071 *
 dof_handler.distribute_dofs(fe);
2076 *
 std::locale s =
pcout.get_stream().getloc();
2077 *
 pcout.get_stream().imbue(std::locale(
""));
2078 *
 pcout <<
"Number of degrees of freedom: " << dof_handler.n_dofs()
2079 *
 <<
" ( = " << (dim + 2) <<
" [vars] x "
2083 *
 pcout.get_stream().imbue(s);
2088 *
 template <
int dim>
2091 *
 const std::array<double, 3>
errors =
2095 *
 pcout <<
"Time:" << std::setw(8) << std::setprecision(3) << time
2096 *
 <<
", dt: " << std::setw(8) << std::setprecision(2) <<
time_step
2098 *
 << std::setw(10) <<
errors[0] <<
", rho * u: " << std::setprecision(4)
2099 *
 << std::setw(10) <<
errors[1] <<
", energy:" << std::setprecision(4)
2100 *
 << std::setw(10) <<
errors[2] << std::endl;
2109 *
 flags.write_higher_order_cells =
true;
2110 *
 data_out.set_flags(flags);
2112 *
 data_out.attach_dof_handler(dof_handler);
2114 *
 std::vector<std::string> names;
2115 *
 names.emplace_back(
"density");
2116 *
 for (
unsigned int d = 0;
d < dim; ++
d)
2117 *
 names.emplace_back(
"momentum");
2118 *
 names.emplace_back(
"energy");
2120 *
 std::vector<DataComponentInterpretation::DataComponentInterpretation>
2124 *
 for (
unsigned int d = 0;
d < dim; ++
d)
2130 *
 data_out.add_data_vector(dof_handler, solution, names,
interpretation);
2132 *
 data_out.add_data_vector(solution, postprocessor);
2137 *
 reference.
reinit(solution);
2139 *
 reference.sadd(-1., 1, solution);
2140 *
 std::vector<std::string> names;
2141 *
 names.emplace_back(
"error_density");
2142 *
 for (
unsigned int d = 0;
d < dim; ++
d)
2143 *
 names.emplace_back(
"error_momentum");
2144 *
 names.emplace_back(
"error_energy");
2146 *
 std::vector<DataComponentInterpretation::DataComponentInterpretation>
2150 *
 for (
unsigned int d = 0;
d < dim; ++
d)
2156 *
 data_out.add_data_vector(dof_handler,
2164 *
 data_out.add_data_vector(
mpi_owner,
"owner");
2166 *
 data_out.build_patches(mapping,
2178 *
 template <
int dim>
2182 *
 const unsigned int n_vect_number = VectorizedArrayType::size();
2185 *
 pcout <<
"Running with "
2187 *
 <<
" MPI processes" << std::endl;
2189 *
 << (std::is_same<Number, double>::value ?
"doubles" :
"floats")
2208 *
 for (
const auto &cell :
triangulation.active_cell_iterators())
2209 *
 if (cell->is_locally_owned())
2219 *
 <<
", initial transport scaling: "
2251 *
 time >= final_time - 1e-12)
2253 *
 static_cast<unsigned int>(std::round(time /
output_tick)));
2277 *
 catch (std::exception &exc)
2279 *
 std::cerr << std::endl
2281 *
 <<
"----------------------------------------------------"
2283 *
 std::cerr <<
"Exception on processing: " << std::endl
2284 *
 << exc.what() << std::endl
2285 *
 <<
"Aborting!" << std::endl
2286 *
 <<
"----------------------------------------------------"
2293 *
 std::cerr << std::endl
2295 *
 <<
"----------------------------------------------------"
2297 *
 std::cerr <<
"Unknown exception!" << std::endl
2298 *
 <<
"Aborting!" << std::endl
2299 *
 <<
"----------------------------------------------------"
2316Number
of degrees
of freedom: 27.648.000 ( = 5 [vars]
x 25.600 [cells]
x 216 [dofs/cell/
var] )
2319+--------------------------------------+------------------+------------+------------------+
2323+--------------------------------------+------------------+------------+------------------+
2324| compute
errors | 1 | 0.009594s 16 | 0.009705s | 0.009819s 8 |
2325| compute
transport speed | 22 | 0.1366s 0 | 0.1367s | 0.1368s 18 |
2326| output | 1 | 1.233s 0 | 1.233s | 1.233s 32 |
2329+--------------------------------------+------------------+------------+------------------+
2337 <
img src=
"https://www.dealii.org/images/steps/developer/step-67.pressure_010.png" alt=
"" width=
"100%">
2340 <
img src=
"https://www.dealii.org/images/steps/developer/step-67.pressure_025.png" alt=
"" width=
"100%">
2345 <
img src=
"https://www.dealii.org/images/steps/developer/step-67.pressure_050.png" alt=
"" width=
"100%">
2348 <
img src=
"https://www.dealii.org/images/steps/developer/step-67.pressure_100.png" alt=
"" width=
"100%">
2358Number
of degrees
of freedom: 27.648.000 ( = 5 [vars]
x 25.600 [cells]
x 216 [dofs/cell/
var] )
2361+-------------------------------------------+------------------+------------+------------------+
2365+-------------------------------------------+------------------+------------+------------------+
2366| compute
errors | 1 | 0.007977s 10 | 0.008053s | 0.008161s 30 |
2367| compute
transport speed | 22 | 0.1228s 34 | 0.2227s | 0.3845s 0 |
2368| output | 1 | 1.255s 3 | 1.257s | 1.259s 27 |
2372+-------------------------------------------+------------------+------------+------------------+
2382<a
href=
"https://github.com/hyperdeal/hyperdeal/blob/a9e67b4e625ff1dde2fed93ad91cdfacfaa3acdf/include/hyper.deal/operators/advection/advection_operation.h#L219-L569">
advection operator based on cell-
centric loops</a>
2414Vector<Number>
visit_flags(data.n_cell_batches () + data.n_ghost_cell_batches ());
2418 [&](
const auto &data,
auto &dst,
const auto &src,
const auto cell_range) {
2426 const auto boundary_id = data.get_faces_by_cells_boundary_id(cell, face)[0];
2435 flags().
begin() + data.n_active_entries_per_cell_batch(cell) == 1;
2478<a name=
"PlainProg"></a>
value_type * data() const noexcept
void reinit(value_type *starting_element, const std::size_t n_elements)
void submit_value(const value_type val_in, const unsigned int q_point)
unsigned int depth_console(const unsigned int n)
Abstract base class for mapping classes.
void loop_cell_centric(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, const CLASS *owning_class, OutVector &dst, const InVector &src, const bool zero_dst_vector=false, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
void reinit(const MappingType &mapping, const DoFHandler< dim > &dof_handler, const AffineConstraints< number2 > &constraint, const QuadratureType &quad, const AdditionalData &additional_data=AdditionalData())
std::enable_if_t< std::is_floating_point< T >::value &&std::is_floating_point< U >::value, typename ProductType< std::complex< T >, std::complex< U > >::type > operator*(const std::complex< T > &left, const std::complex< U > &right)
#define DEAL_II_ALWAYS_INLINE
#define DEAL_II_WITH_P4EST
__global__ void reduction(Number *result, const Number *v, const size_type N)
__global__ void set(Number *val, const Number s, const size_type N)
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertThrow(cond, exc)
void loop(ITERATOR begin, std_cxx20::type_identity_t< ITERATOR > end, DOFINFO &dinfo, INFOBOX &info, const std::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &cell_worker, const std::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &boundary_worker, const std::function< void(DOFINFO &, DOFINFO &, typename INFOBOX::CellInfo &, typename INFOBOX::CellInfo &)> &face_worker, ASSEMBLER &assembler, const LoopControl &lctrl=LoopControl())
@ update_values
Shape function values.
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_gradients
Shape function gradients.
@ update_quadrature_points
Transformed quadrature points.
DataComponentInterpretation
@ component_is_part_of_vector
void hyper_rectangle(Triangulation< dim, spacedim > &tria, const Point< dim > &p1, const Point< dim > &p2, const bool colorize=false)
void channel_with_cylinder(Triangulation< dim > &tria, const double shell_region_width=0.03, const unsigned int n_shells=2, const double skewness=2.0, const bool colorize=false)
@ matrix
Contents is actually a matrix.
@ general
No special properties.
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim > > > &Du)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
SymmetricTensor< 2, dim, Number > C(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
@ LOW_STORAGE_RK_STAGE9_ORDER5
@ LOW_STORAGE_RK_STAGE3_ORDER3
@ LOW_STORAGE_RK_STAGE7_ORDER4
@ LOW_STORAGE_RK_STAGE5_ORDER4
VectorType::value_type * begin(VectorType &V)
T sum(const T &t, const MPI_Comm mpi_communicator)
unsigned int n_mpi_processes(const MPI_Comm mpi_communicator)
T max(const T &t, const MPI_Comm mpi_communicator)
T min(const T &t, const MPI_Comm mpi_communicator)
unsigned int this_mpi_process(const MPI_Comm mpi_communicator)
T reduce(const T &local_value, const MPI_Comm comm, const std::function< T(const T &, const T &)> &combiner, const unsigned int root_process=0)
const std::string get_current_vectorization_level()
constexpr T pow(const T base, const int iexp)
Number truncate_to_n_digits(const Number number, const unsigned int n_digits)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
void run(const Iterator &begin, const std_cxx20::type_identity_t< Iterator > &end, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length, const unsigned int chunk_size)
long double gamma(const unsigned int n)
void copy(const T *begin, const T *end, U *dest)
int(&) functions(const void *v1, const void *v2)
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
static constexpr double PI
const types::boundary_id internal_face_boundary_id
static const unsigned int invalid_unsigned_int
void transform(const InputIterator &begin_in, const InputIterator &end_in, OutputIterator out, const Function &function, const unsigned int grainsize)
::VectorizedArray< Number, width > exp(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > pow(const ::VectorizedArray< Number, width > &, const Number p)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation
const TriangulationDescription::Settings settings