DGMulti
solver¶Note: To improve responsiveness via caching, the notebooks are updated only once a week. They are only available for the latest stable release of Trixi.jl at the time of caching.
For a tutorial about DG schemes via the DGMulti
solver please visit the previous tutorial.
The DGMulti
solver also supports other methods than DG. The important property a method has to
fulfill is the summation-by-parts (SBP) property. The package SummationByPartsOperators.jl
provides such methods, like a finite difference SBP (FD SBP) scheme. To do this,
you need to create an SBP derivative operator and pass that as approximation_type
to the DGMulti
constructor. For example, the classical second-order FD SBP operator
can be created as
using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly
D = derivative_operator(MattssonNordström2004(), derivative_order=1, accuracy_order=2,
xmin=0.0, xmax=1.0, N=11)
Here, the arguments xmin
and xmax
do not matter beyond setting the real type
used for the operator - they just set a reference element and are rescaled on the
physical elements. The parameter N
determines the number of finite difference nodes.
Then, D
can be used as approximation_type
like SBP()
in a multi-block fashion.
In multiple dimensions, such a 1D SBP operator will be used in a tensor product fashion,
i.e., in each coordinate direction. In particular, you can use them only on 1D, 2D Quad()
,
and 3D Hex()
elements.
You can also use fully periodic single-block FD methods by creating a periodic SBP operator. For example, a fully periodic FD operator can be constructed as
D = periodic_derivative_operator(derivative_order=1, accuracy_order=2,
xmin=0.0, xmax=1.0, N=11)
An example using such an FD method is implemented in
elixir_euler_fdsbp_periodic.jl
.
For all parameters and other calling options, please have a look in the
documentation of SummationByPartsOperators.jl.
Another possible method is for instance a continuous Galerkin (CGSEM) method. You can use such a
method with polynomial degree of 3
(N=4
Legendre Lobatto nodes on [0, 1]
) coupled continuously
on a uniform mesh with Nx=10
elements by setting approximation_type
to
using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly
D = couple_continuously(legendre_derivative_operator(xmin=0.0, xmax=1.0, N=4),
UniformPeriodicMesh1D(xmin=-1.0, xmax=1.0, Nx=10))
To choose a discontinuous coupling (DGSEM), use couple_discontinuously()
instead of couple_continuously()
.
For more information and other SBP operators, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.
These results were obtained using the following versions.
using InteractiveUtils
versioninfo()
using Pkg
Pkg.status(["Trixi", "StartUpDG", "SummationByPartsOperators"],
mode=PKGMODE_MANIFEST)