Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 : #include <optional>
8 : #include <ostream>
9 :
10 : #include "DataStructures/DataBox/Prefixes.hpp"
11 : #include "DataStructures/DataVector.hpp"
12 : #include "DataStructures/Tensor/TypeAliases.hpp"
13 : #include "DataStructures/Variables.hpp"
14 : #include "NumericalAlgorithms/DiscontinuousGalerkin/Formulation.hpp"
15 : #include "NumericalAlgorithms/LinearOperators/Divergence.hpp"
16 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp"
17 : #include "NumericalAlgorithms/Spectral/Mesh.hpp"
18 : #include "Utilities/Gsl.hpp"
19 : #include "Utilities/TMPL.hpp"
20 :
21 : namespace evolution::dg::Actions::detail {
22 : /*
23 : * Computes the volume terms for a discontinuous Galerkin scheme.
24 : *
25 : * The function does the following (in order):
26 : *
27 : * 1. Compute the partial derivatives of the `System::gradient_variables`.
28 : *
29 : * The partial derivatives are needed in the nonconservative product terms
30 : * of the evolution equations. Any variable whose evolution equation does
31 : * not contain a flux must contain a nonconservative product and the
32 : * variable must be listed in the `System::gradient_variables` type alias.
33 : * The partial derivatives are also needed for adding the moving mesh terms
34 : * to the equations that do not have a flux term.
35 : *
36 : * 2. The volume time derivatives are calculated from
37 : * `System::compute_volume_time_derivative_terms`
38 : *
39 : * The source terms and nonconservative products are contributed directly
40 : * to the `dt_vars` arguments passed to the time derivative function, while
41 : * the volume fluxes are computed into the `volume_fluxes` arguments. The
42 : * divergence of the volume fluxes will be computed and added to the time
43 : * derivatives later in the function.
44 : *
45 : * 3. If the mesh is moving the appropriate mesh velocity terms are added to
46 : * the equations.
47 : *
48 : * For equations with fluxes this means that \f$-v^i_g u_\alpha\f$ is
49 : * added to the fluxes and \f$-u_\alpha \partial_i v^i_g\f$ is added
50 : * to the time derivatives. For equations without fluxes
51 : * \f$v^i\partial_i u_\alpha\f$ is added to the time derivatives.
52 : *
53 : * 4. Compute flux divergence contribution and add it to the time derivatives.
54 : *
55 : * Either the weak or strong form can be used. Currently only the strong
56 : * form is coded, but adding the weak form is quite easy.
57 : *
58 : * Note that the computation of the flux divergence and adding that to the
59 : * time derivative must be done *after* the mesh velocity is subtracted
60 : * from the fluxes.
61 : */
62 : template <typename ComputeVolumeTimeDerivativeTerms, size_t Dim,
63 : typename... TimeDerivativeArguments, typename... VariablesTags,
64 : typename... SourceVarsTags, typename... PartialDerivTags,
65 : typename... FluxVariablesTags, typename... TemporaryTags>
66 : void volume_terms(
67 : const gsl::not_null<Variables<tmpl::list<::Tags::dt<VariablesTags>...>>*>
68 : dt_vars_ptr,
69 : [[maybe_unused]] const gsl::not_null<Variables<tmpl::list<::Tags::Flux<
70 : FluxVariablesTags, tmpl::size_t<Dim>, Frame::Inertial>...>>*>
71 : volume_fluxes,
72 : [[maybe_unused]] const gsl::not_null<Variables<tmpl::list<::Tags::deriv<
73 : PartialDerivTags, tmpl::size_t<Dim>, Frame::Inertial>...>>*>
74 : partial_derivs,
75 : [[maybe_unused]] const gsl::not_null<
76 : Variables<tmpl::list<TemporaryTags...>>*>
77 : temporaries,
78 : [[maybe_unused]] const gsl::not_null<
79 : Variables<tmpl::list<::Tags::div<::Tags::Flux<
80 : FluxVariablesTags, tmpl::size_t<Dim>, Frame::Inertial>>...>>*>
81 : div_fluxes,
82 : const Variables<tmpl::list<SourceVarsTags...>>& source_vars,
83 : const ::dg::Formulation dg_formulation, const Mesh<Dim>& mesh,
84 : [[maybe_unused]] const tnsr::I<DataVector, Dim, Frame::Inertial>&
85 : inertial_coordinates,
86 : const InverseJacobian<DataVector, Dim, Frame::ElementLogical,
87 : Frame::Inertial>&
88 : logical_to_inertial_inverse_jacobian,
89 : [[maybe_unused]] const Scalar<DataVector>* const det_inverse_jacobian,
90 : const std::optional<tnsr::I<DataVector, Dim, Frame::Inertial>>&
91 : mesh_velocity,
92 : const std::optional<Scalar<DataVector>>& div_mesh_velocity,
93 : const TimeDerivativeArguments&... time_derivative_args);
94 : } // namespace evolution::dg::Actions::detail
|