From 9d97170d41e465b598065ebfed2acffda3153377 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Thu, 29 Feb 2024 14:20:58 +0000 Subject: [PATCH] build based on 3f2e907 --- previews/PR1624/.documenter-siteinfo.json | 2 +- previews/PR1624/authors/index.html | 2 +- previews/PR1624/callbacks/index.html | 4 +- previews/PR1624/code_of_conduct/index.html | 2 +- previews/PR1624/contributing/index.html | 4 +- previews/PR1624/conventions/index.html | 2 +- previews/PR1624/development/index.html | 4 +- previews/PR1624/github-git/index.html | 4 +- previews/PR1624/index.html | 4 +- previews/PR1624/license/index.html | 2 +- .../PR1624/meshes/dgmulti_mesh/index.html | 4 +- previews/PR1624/meshes/p4est_mesh/index.html | 224 +- .../PR1624/meshes/structured_mesh/index.html | 2 +- previews/PR1624/meshes/tree_mesh/index.html | 2 +- .../meshes/unstructured_quad_mesh/index.html | 4 +- .../PR1624/multi-physics_coupling/index.html | 2 + previews/PR1624/overview/index.html | 2 +- previews/PR1624/parallelization/index.html | 4 +- previews/PR1624/performance/index.html | 6 +- previews/PR1624/reference-trixi/index.html | 402 +- .../PR1624/reference-trixi2vtk/index.html | 4 +- .../PR1624/reference-trixibase/index.html | 10 + previews/PR1624/restart/index.html | 4 +- previews/PR1624/search_index.js | 2 +- previews/PR1624/styleguide/index.html | 2 +- previews/PR1624/testing/index.html | 4 +- previews/PR1624/time_integration/index.html | 2 +- previews/PR1624/troubleshooting/index.html | 4 +- .../DGMulti_1/{fbd159b8.svg => 0064e13f.svg} | 6334 ++++---- .../DGMulti_1/{fadf51f7.svg => 10abe6bf.svg} | 12350 ++++++++-------- .../DGMulti_1/{61e49aa9.svg => 208d42b7.svg} | 2756 ++-- .../DGMulti_1/{9bd05ce4.svg => 5d9b08f6.svg} | 2998 ++-- .../DGMulti_1/{f8f84043.svg => 95b64f7c.svg} | 8254 +++++------ .../DGMulti_1/{165f977b.svg => fba4076c.svg} | 3650 ++--- .../PR1624/tutorials/DGMulti_1/index.html | 104 +- .../PR1624/tutorials/DGMulti_2/index.html | 6 +- .../{464dc32e.svg => 081aafce.svg} | 230 +- .../{7294c625.svg => b2d0b36c.svg} | 230 +- .../tutorials/DGSEM_FluxDiff/index.html | 38 +- .../{1bd6887d.svg => 52aac2a9.svg} | 878 +- .../adaptive_mesh_refinement/index.html | 10 +- .../{ce6bbcfb.svg => b74794b6.svg} | 62 +- .../adding_new_parabolic_terms/index.html | 10 +- .../{e507ae71.svg => 81b075c6.svg} | 64 +- .../{8e74c7d4.svg => 9022340d.svg} | 56 +- .../{ffb38f98.svg => bff52588.svg} | 56 +- .../{31378d7b.svg => e3183096.svg} | 56 +- .../{a03f54bf.svg => ef0ee0e1.svg} | 58 +- .../adding_new_scalar_equations/index.html | 18 +- .../{76254cf8.svg => ad596dd0.svg} | 122 +- .../index.html | 10 +- .../f4d8e049.svg | 406 + .../index.html | 49 + .../{f6530f04.svg => 3937d78a.svg} | 68 +- .../{86f51692.svg => 3b4928d2.svg} | 72 +- .../{9ae14439.svg => 5b969adf.svg} | 72 +- .../{5b2f690f.svg => 609468ff.svg} | 72 +- .../{e8340c1c.svg => 6edf9480.svg} | 64 +- .../custom_semidiscretization/index.html | 160 +- .../{40aa74a7.svg => 03e57ed3.svg} | 64 +- .../{aaa20a0c.svg => 1b3a890e.svg} | 586 +- .../{0f9c8ab7.svg => 2f3e8a35.svg} | 3136 ++-- .../{2b2487ee.svg => 4287a5af.svg} | 2126 +-- .../{08ad012c.svg => 6a3d8c62.svg} | 1588 +- .../{cc21e91c.svg => 8d91dd5e.svg} | 1594 +- .../{781540f1.svg => ac36cec2.svg} | 64 +- .../{23db3480.svg => de5f17b3.svg} | 4172 +++--- .../differentiable_programming/index.html | 24 +- .../first_steps/changing_trixi/index.html | 12 + .../create_first_setup/2419cef9.svg | 1142 ++ .../create_first_setup/69e2f11d.svg | 896 ++ .../first_steps/create_first_setup/index.html | 307 + .../first_steps/getting_started/04672d8e.svg | 4101 +++++ .../first_steps/getting_started/6e85c410.svg | 705 + .../first_steps/getting_started/index.html | 227 + .../tutorials/hohqmesh_tutorial/index.html | 10 +- .../PR1624/tutorials/introduction/index.html | 2 +- .../{763e5217.svg => 18af4fab.svg} | 72 +- .../non_periodic_boundaries/index.html | 10 +- .../tutorials/notebooks/DGMulti_1.ipynb | 2 +- .../tutorials/notebooks/DGMulti_2.ipynb | 2 +- .../tutorials/notebooks/DGSEM_FluxDiff.ipynb | 2 +- .../notebooks/adaptive_mesh_refinement.ipynb | 2 +- .../adding_new_parabolic_terms.ipynb | 2 +- .../adding_new_scalar_equations.ipynb | 2 +- .../adding_nonconservative_equation.ipynb | 2 +- .../behind_the_scenes_simulation_setup.ipynb | 628 + .../notebooks/custom_semidiscretization.ipynb | 2 +- .../differentiable_programming.ipynb | 2 +- .../first_steps/changing_trixi.ipynb | 156 + .../first_steps/create_first_setup.ipynb | 597 + .../first_steps/getting_started.ipynb | 435 + .../notebooks/hohqmesh_tutorial.ipynb | 2 +- .../notebooks/non_periodic_boundaries.ipynb | 6 +- .../tutorials/notebooks/p4est_from_gmsh.ipynb | 559 + .../tutorials/notebooks/parabolic_terms.ipynb | 2 +- .../scalar_linear_advection_1d.ipynb | 2 +- .../tutorials/notebooks/shock_capturing.ipynb | 2 +- .../notebooks/structured_mesh_mapping.ipynb | 2 +- .../tutorials/notebooks/time_stepping.ipynb | 2 +- .../tutorials/notebooks/upwind_fdsbp.ipynb | 2 +- .../PR1624/tutorials/out/restart_000050.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/restart_000100.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/restart_000150.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/restart_000180.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000.pvd | 26 +- .../PR1624/tutorials/out/solution_000000.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000010.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000010.vtu | Bin 18962 -> 18969 bytes .../PR1624/tutorials/out/solution_000020.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000020.vtu | Bin 19007 -> 18994 bytes .../PR1624/tutorials/out/solution_000030.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000030.vtu | Bin 19040 -> 19043 bytes .../PR1624/tutorials/out/solution_000040.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000040.vtu | Bin 19074 -> 19079 bytes .../PR1624/tutorials/out/solution_000050.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000050.vtu | Bin 19114 -> 19107 bytes .../PR1624/tutorials/out/solution_000060.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000060.vtu | Bin 19135 -> 19136 bytes .../PR1624/tutorials/out/solution_000065.h5 | Bin 205696 -> 205696 bytes .../PR1624/tutorials/out/solution_000070.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000070.vtu | Bin 19162 -> 19146 bytes .../PR1624/tutorials/out/solution_000080.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000080.vtu | Bin 19161 -> 19157 bytes .../PR1624/tutorials/out/solution_000090.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000090.vtu | Bin 19180 -> 19175 bytes .../PR1624/tutorials/out/solution_000100.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000100.vtu | Bin 19199 -> 19199 bytes .../PR1624/tutorials/out/solution_000110.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000110.vtu | Bin 19193 -> 19209 bytes .../PR1624/tutorials/out/solution_000120.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000120.vtu | Bin 19152 -> 19146 bytes .../PR1624/tutorials/out/solution_000130.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000130.vtu | Bin 19166 -> 19174 bytes .../PR1624/tutorials/out/solution_000140.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000140.vtu | Bin 19172 -> 19174 bytes .../PR1624/tutorials/out/solution_000150.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000150.vtu | Bin 19164 -> 19169 bytes .../PR1624/tutorials/out/solution_000160.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000160.vtu | Bin 19183 -> 19168 bytes .../PR1624/tutorials/out/solution_000170.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000170.vtu | Bin 19194 -> 19193 bytes .../PR1624/tutorials/out/solution_000180.h5 | Bin 11976 -> 11976 bytes .../PR1624/tutorials/out/solution_000180.vtu | Bin 19171 -> 19173 bytes .../tutorials/out/solution_000_celldata.pvd | 26 +- .../tutorials/p4est_from_gmsh/index.html | 366 + .../{bed141da.svg => cda863ac.svg} | 62 +- .../tutorials/parabolic_terms/index.html | 10 +- .../{7bbbc1a1.svg => 1b78a1fd.svg} | 80 +- .../{00c0ec1b.svg => 51a3929a.svg} | 64 +- .../{4c20d287.svg => 5dbf4fa6.svg} | 64 +- .../{0cdc6371.svg => bdf59697.svg} | 68 +- .../{6c8c5e59.svg => e8522b82.svg} | 68 +- .../{b9ccf219.svg => fe5b2ffe.svg} | 64 +- .../scalar_linear_advection_1d/index.html | 20 +- .../{d2d35149.svg => 8985776c.svg} | 230 +- .../tutorials/shock_capturing/index.html | 10 +- .../structured_mesh_mapping/300da432.svg | 9477 ------------ .../{fb53b05b.svg => 5839e9cb.svg} | 246 +- .../structured_mesh_mapping/60cf2592.svg | 9749 ++++++++++++ .../{e3dbbc35.svg => d7d4dc96.svg} | 2114 +-- .../structured_mesh_mapping/index.html | 48 +- .../PR1624/tutorials/time_stepping/index.html | 6 +- .../PR1624/tutorials/upwind_fdsbp/index.html | 6 +- previews/PR1624/visualization/index.html | 4 +- 165 files changed, 48554 insertions(+), 37532 deletions(-) create mode 100644 previews/PR1624/multi-physics_coupling/index.html create mode 100644 previews/PR1624/reference-trixibase/index.html rename previews/PR1624/tutorials/DGMulti_1/{fbd159b8.svg => 0064e13f.svg} (58%) rename previews/PR1624/tutorials/DGMulti_1/{fadf51f7.svg => 10abe6bf.svg} (90%) rename previews/PR1624/tutorials/DGMulti_1/{61e49aa9.svg => 208d42b7.svg} (77%) rename previews/PR1624/tutorials/DGMulti_1/{9bd05ce4.svg => 5d9b08f6.svg} (76%) rename previews/PR1624/tutorials/DGMulti_1/{f8f84043.svg => 95b64f7c.svg} (90%) rename previews/PR1624/tutorials/DGMulti_1/{165f977b.svg => fba4076c.svg} (89%) rename previews/PR1624/tutorials/DGSEM_FluxDiff/{464dc32e.svg => 081aafce.svg} (94%) rename previews/PR1624/tutorials/DGSEM_FluxDiff/{7294c625.svg => b2d0b36c.svg} (95%) rename previews/PR1624/tutorials/adaptive_mesh_refinement/{1bd6887d.svg => 52aac2a9.svg} (85%) rename previews/PR1624/tutorials/adding_new_parabolic_terms/{ce6bbcfb.svg => b74794b6.svg} (93%) rename previews/PR1624/tutorials/adding_new_scalar_equations/{e507ae71.svg => 81b075c6.svg} (91%) rename previews/PR1624/tutorials/adding_new_scalar_equations/{8e74c7d4.svg => 9022340d.svg} (84%) rename previews/PR1624/tutorials/adding_new_scalar_equations/{ffb38f98.svg => bff52588.svg} (92%) rename previews/PR1624/tutorials/adding_new_scalar_equations/{31378d7b.svg => e3183096.svg} (92%) rename previews/PR1624/tutorials/adding_new_scalar_equations/{a03f54bf.svg => ef0ee0e1.svg} (85%) rename previews/PR1624/tutorials/adding_nonconservative_equation/{76254cf8.svg => ad596dd0.svg} (84%) create mode 100644 previews/PR1624/tutorials/behind_the_scenes_simulation_setup/f4d8e049.svg create mode 100644 previews/PR1624/tutorials/behind_the_scenes_simulation_setup/index.html rename previews/PR1624/tutorials/custom_semidiscretization/{f6530f04.svg => 3937d78a.svg} (86%) rename previews/PR1624/tutorials/custom_semidiscretization/{86f51692.svg => 3b4928d2.svg} (86%) rename previews/PR1624/tutorials/custom_semidiscretization/{9ae14439.svg => 5b969adf.svg} (86%) rename previews/PR1624/tutorials/custom_semidiscretization/{5b2f690f.svg => 609468ff.svg} (86%) rename previews/PR1624/tutorials/custom_semidiscretization/{e8340c1c.svg => 6edf9480.svg} (85%) rename previews/PR1624/tutorials/differentiable_programming/{40aa74a7.svg => 03e57ed3.svg} (84%) rename previews/PR1624/tutorials/differentiable_programming/{aaa20a0c.svg => 1b3a890e.svg} (69%) rename previews/PR1624/tutorials/differentiable_programming/{0f9c8ab7.svg => 2f3e8a35.svg} (67%) rename previews/PR1624/tutorials/differentiable_programming/{2b2487ee.svg => 4287a5af.svg} (68%) rename previews/PR1624/tutorials/differentiable_programming/{08ad012c.svg => 6a3d8c62.svg} (65%) rename previews/PR1624/tutorials/differentiable_programming/{cc21e91c.svg => 8d91dd5e.svg} (68%) rename previews/PR1624/tutorials/differentiable_programming/{781540f1.svg => ac36cec2.svg} (85%) rename previews/PR1624/tutorials/differentiable_programming/{23db3480.svg => de5f17b3.svg} (66%) create mode 100644 previews/PR1624/tutorials/first_steps/changing_trixi/index.html create mode 100644 previews/PR1624/tutorials/first_steps/create_first_setup/2419cef9.svg create mode 100644 previews/PR1624/tutorials/first_steps/create_first_setup/69e2f11d.svg create mode 100644 previews/PR1624/tutorials/first_steps/create_first_setup/index.html create mode 100644 previews/PR1624/tutorials/first_steps/getting_started/04672d8e.svg create mode 100644 previews/PR1624/tutorials/first_steps/getting_started/6e85c410.svg create mode 100644 previews/PR1624/tutorials/first_steps/getting_started/index.html rename previews/PR1624/tutorials/non_periodic_boundaries/{763e5217.svg => 18af4fab.svg} (81%) create mode 100644 previews/PR1624/tutorials/notebooks/behind_the_scenes_simulation_setup.ipynb create mode 100644 previews/PR1624/tutorials/notebooks/first_steps/changing_trixi.ipynb create mode 100644 previews/PR1624/tutorials/notebooks/first_steps/create_first_setup.ipynb create mode 100644 previews/PR1624/tutorials/notebooks/first_steps/getting_started.ipynb create mode 100644 previews/PR1624/tutorials/notebooks/p4est_from_gmsh.ipynb create mode 100644 previews/PR1624/tutorials/p4est_from_gmsh/index.html rename previews/PR1624/tutorials/parabolic_terms/{bed141da.svg => cda863ac.svg} (93%) rename previews/PR1624/tutorials/scalar_linear_advection_1d/{7bbbc1a1.svg => 1b78a1fd.svg} (79%) rename previews/PR1624/tutorials/scalar_linear_advection_1d/{00c0ec1b.svg => 51a3929a.svg} (83%) rename previews/PR1624/tutorials/scalar_linear_advection_1d/{4c20d287.svg => 5dbf4fa6.svg} (82%) rename previews/PR1624/tutorials/scalar_linear_advection_1d/{0cdc6371.svg => bdf59697.svg} (85%) rename previews/PR1624/tutorials/scalar_linear_advection_1d/{6c8c5e59.svg => e8522b82.svg} (85%) rename previews/PR1624/tutorials/scalar_linear_advection_1d/{b9ccf219.svg => fe5b2ffe.svg} (83%) rename previews/PR1624/tutorials/shock_capturing/{d2d35149.svg => 8985776c.svg} (96%) delete mode 100644 previews/PR1624/tutorials/structured_mesh_mapping/300da432.svg rename previews/PR1624/tutorials/structured_mesh_mapping/{fb53b05b.svg => 5839e9cb.svg} (96%) create mode 100644 previews/PR1624/tutorials/structured_mesh_mapping/60cf2592.svg rename previews/PR1624/tutorials/structured_mesh_mapping/{e3dbbc35.svg => d7d4dc96.svg} (86%) diff --git a/previews/PR1624/.documenter-siteinfo.json b/previews/PR1624/.documenter-siteinfo.json index e2d832f4dfd..e4bc38eca7a 100644 --- a/previews/PR1624/.documenter-siteinfo.json +++ b/previews/PR1624/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.9.4","generation_timestamp":"2024-01-11T16:12:41","documenter_version":"1.2.1"}} \ No newline at end of file +{"documenter":{"julia_version":"1.9.4","generation_timestamp":"2024-02-29T14:20:09","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/previews/PR1624/authors/index.html b/previews/PR1624/authors/index.html index d7a387bc430..5fc080da4ab 100644 --- a/previews/PR1624/authors/index.html +++ b/previews/PR1624/authors/index.html @@ -1,2 +1,2 @@ -Authors · Trixi.jl

Authors

Trixi.jl's development is coordinated by a group of principal developers, who are also its main contributors and who can be contacted in case of questions about Trixi.jl. In addition, there are contributors who have provided substantial additions or modifications. Together, these two groups form "The Trixi.jl Authors" as mentioned under License.

Principal Developers

Contributors

The following people contributed major additions or modifications to Trixi.jl and are listed in alphabetical order:

  • Maximilian D. Bertrand
  • Benjamin Bolm
  • Simon Candelaresi
  • Jesse Chan
  • Lars Christmann
  • Christof Czernik
  • Daniel Doehring
  • Patrick Ersing
  • Erik Faulhaber
  • Gregor Gassner
  • Lucas Gemein
  • Sven Goldberg
  • Joshua Lampert
  • Julia Odenthal
  • Sigrun Ortleb
  • Hendrik Ranocha
  • Andrés M. Rueda-Ramírez
  • Felipe Santillan
  • Michael Schlottke-Lakemper
  • Toskan Theine
  • Andrew Winters
+Authors · Trixi.jl

Authors

Trixi.jl's development is coordinated by a group of principal developers, who are also its main contributors and who can be contacted in case of questions about Trixi.jl. In addition, there are contributors who have provided substantial additions or modifications. Together, these two groups form "The Trixi.jl Authors" as mentioned under License.

Principal Developers

Contributors

The following people contributed major additions or modifications to Trixi.jl and are listed in alphabetical order:

  • Maximilian D. Bertrand
  • Benjamin Bolm
  • Simon Candelaresi
  • Jesse Chan
  • Lars Christmann
  • Christof Czernik
  • Daniel Doehring
  • Patrick Ersing
  • Erik Faulhaber
  • Gregor Gassner
  • Lucas Gemein
  • Sven Goldberg
  • Joshua Lampert
  • Julia Odenthal
  • Sigrun Ortleb
  • Hendrik Ranocha
  • Andrés M. Rueda-Ramírez
  • Felipe Santillan
  • Michael Schlottke-Lakemper
  • Toskan Theine
  • Andrew Winters
diff --git a/previews/PR1624/callbacks/index.html b/previews/PR1624/callbacks/index.html index 091f14ba5dd..08f53700f9a 100644 --- a/previews/PR1624/callbacks/index.html +++ b/previews/PR1624/callbacks/index.html @@ -1,5 +1,5 @@ -Callbacks · Trixi.jl

Callbacks

Many of the advanced features of Trixi.jl, such as adaptive mesh refinement, are implemented as callbacks. A callback is an algorithmic entity that gets passed to the ODE solver and is called at specific points during execution to perform certain tasks. Callbacks in Trixi.jl are either called after each time step (step callbacks) or after each stage of the ODE solver (stage callbacks).

callbacks_illustration

The advantage of callbacks over hard-coding all features is that it allows to extend Trixi.jl without modifying the internal source code. Trixi.jl provides callbacks for time step control, adaptive mesh refinement, I/O, and more.

Step callbacks

CFL-based time step control

Time step control can be performed with a StepsizeCallback. An example making use of this can be found at examples/tree_2d_dgsem/elixir_advection_basic.jl

Adaptive mesh refinement

Trixi.jl uses a hierarchical Cartesian mesh which can be locally refined in a solution-adaptive way. This can be used to speed up simulations with minimal loss in overall accuracy. Adaptive mesh refinement (AMR) can be used by passing an AMRCallback to the ODE solver. The AMRCallback requires a controller such as ControllerThreeLevel or ControllerThreeLevelCombined to tell the AMR algorithm which cells to refine/coarsen.

An example elixir using AMR can be found at examples/tree_2d_dgsem/elixir_advection_amr.jl.

Analyzing the numerical solution

The AnalysisCallback can be used to analyze the numerical solution, e.g. calculate errors or user-specified integrals, and print the results to the screen. The results can also be saved in a file. An example can be found at examples/tree_2d_dgsem/elixir_euler_vortex.jl. Note that the errors (e.g. L2 error or Linf error) are computed with respect to the initial condition. The percentage of the simulation time refers to the ratio of the current time and the final time, i.e. it does not consider the maximal number of iterations. So the simulation could finish before 100% are reached. Note that, e.g., due to AMR or smaller time step sizes, the simulation can actually take longer than the percentage indicates. In Performance metrics of the AnalysisCallback you can find a detailed description of the different performance metrics the AnalysisCallback computes.

I/O

Solution and restart files

To save the solution in regular intervals you can use a SaveSolutionCallback. It is also possible to create restart files using the SaveRestartCallback. An example making use of these can be found at examples/tree_2d_dgsem/elixir_advection_extended.jl. An example showing how to restart a simulation from a restart file can be found at examples/tree_2d_dgsem/elixir_advection_restart.jl.

Time series

Sometimes it is useful to record the evaluations of state variables over time at a given set of points. This can be achieved by the TimeSeriesCallback, which is used, e.g., in examples/tree_2d_dgsem/elixir_acoustics_gaussian_source.jl. The TimeSeriesCallback constructor expects a semidiscretization and a list of points at which the solution should be recorded in regular time step intervals. After the last time step, the entire record is stored in an HDF5 file.

For the points, two different input formats are supported: You can either provide them as a list of tuples, which is handy if you specify them by hand on the REPL. Alternatively, you can provide them as a two-dimensional array, where the first dimension is the point number and the second dimension is the coordinate dimension. This is especially useful when reading them from a file.

For example, to record the primitive variables at the points (0.0, 0.0) and (-1.0, 0.5) every five timesteps and storing the collected data in the file tseries.h5, you can create the TimeSeriesCallback as

time_series = TimeSeriesCallback(semi, [(0.0, 0.0), (-1.0, 0.5)];
+Callbacks · Trixi.jl

Callbacks

Many of the advanced features of Trixi.jl, such as adaptive mesh refinement, are implemented as callbacks. A callback is an algorithmic entity that gets passed to the ODE solver and is called at specific points during execution to perform certain tasks. Callbacks in Trixi.jl are either called after each time step (step callbacks) or after each stage of the ODE solver (stage callbacks).

callbacks_illustration

The advantage of callbacks over hard-coding all features is that it allows to extend Trixi.jl without modifying the internal source code. Trixi.jl provides callbacks for time step control, adaptive mesh refinement, I/O, and more.

Step callbacks

CFL-based time step control

Time step control can be performed with a StepsizeCallback. An example making use of this can be found at examples/tree_2d_dgsem/elixir_advection_basic.jl

Adaptive mesh refinement

Trixi.jl uses a hierarchical Cartesian mesh which can be locally refined in a solution-adaptive way. This can be used to speed up simulations with minimal loss in overall accuracy. Adaptive mesh refinement (AMR) can be used by passing an AMRCallback to the ODE solver. The AMRCallback requires a controller such as ControllerThreeLevel or ControllerThreeLevelCombined to tell the AMR algorithm which cells to refine/coarsen.

An example elixir using AMR can be found at examples/tree_2d_dgsem/elixir_advection_amr.jl.

Analyzing the numerical solution

The AnalysisCallback can be used to analyze the numerical solution, e.g. calculate errors or user-specified integrals, and print the results to the screen. The results can also be saved in a file. An example can be found at examples/tree_2d_dgsem/elixir_euler_vortex.jl. Note that the errors (e.g. L2 error or Linf error) are computed with respect to the initial condition. The percentage of the simulation time refers to the ratio of the current time and the final time, i.e. it does not consider the maximal number of iterations. So the simulation could finish before 100% are reached. Note that, e.g., due to AMR or smaller time step sizes, the simulation can actually take longer than the percentage indicates. In Performance metrics of the AnalysisCallback you can find a detailed description of the different performance metrics the AnalysisCallback computes.

I/O

Solution and restart files

To save the solution in regular intervals you can use a SaveSolutionCallback. It is also possible to create restart files using the SaveRestartCallback. An example making use of these can be found at examples/tree_2d_dgsem/elixir_advection_extended.jl. An example showing how to restart a simulation from a restart file can be found at examples/tree_2d_dgsem/elixir_advection_restart.jl.

Time series

Sometimes it is useful to record the evaluations of state variables over time at a given set of points. This can be achieved by the TimeSeriesCallback, which is used, e.g., in examples/tree_2d_dgsem/elixir_acoustics_gaussian_source.jl. The TimeSeriesCallback constructor expects a semidiscretization and a list of points at which the solution should be recorded in regular time step intervals. After the last time step, the entire record is stored in an HDF5 file.

For the points, two different input formats are supported: You can either provide them as a list of tuples, which is handy if you specify them by hand on the REPL. Alternatively, you can provide them as a two-dimensional array, where the first dimension is the point number and the second dimension is the coordinate dimension. This is especially useful when reading them from a file.

For example, to record the primitive variables at the points (0.0, 0.0) and (-1.0, 0.5) every five timesteps and storing the collected data in the file tseries.h5, you can create the TimeSeriesCallback as

time_series = TimeSeriesCallback(semi, [(0.0, 0.0), (-1.0, 0.5)];
                                  interval=5,
                                  solution_variables=cons2prim,
                                  filename="tseries.h5")

For a full list of possible arguments, please check the documentation for the TimeSeriesCallback. As an alternative to specifying the point coordinates directly in the elixir or on the REPL, you can read them from a file. For instance, with a text file points.dat with content

 0.0 0.0
@@ -12,4 +12,4 @@
 
 julia> pd2 = PlotData1D(time_series, 2)
 
-julia> plot(pd1["p_prime"]); plot!(pd2["p_prime"], xguide="t")

will yield the following plot:

image

Miscellaneous

Equation-specific callbacks

Some callbacks provided by Trixi.jl implement specific features for certain equations:

Usage of step callbacks

Step callbacks are passed to the solve method from the ODE solver via the keyword argument callback. If you want to use a single callback cb, pass it as callback=cb. When using two or more callbacks, you need to turn them into a CallbackSet first by calling callbacks = CallbackSet(cb1, cb2) and passing it as callback=callbacks.

Note

There are some restrictions regarding the order of callbacks in a CallbackSet.

The callbacks are called after each time step but some callbacks actually belong to the next time step. Therefore, the callbacks should be ordered in the following way:

  • Callbacks that belong to the current time step:
    • SummaryCallback controls, among other things, timers and should thus be first
    • SteadyStateCallback may mark a time step as the last one
    • AnalysisCallback may do some checks that mark a time step as the last one
    • AliveCallback should be nearby AnalysisCallback
    • SaveSolutionCallback/SaveRestartCallback should save the current solution before it is degraded by AMR
    • VisualizationCallback should be called before the mesh is adapted
  • Callbacks that belong to the next time step:
    • AMRCallback
    • StepsizeCallback must be called after AMRCallback to accommodate potential changes to the mesh
    • GlmSpeedCallback must be called after StepsizeCallback because the step size affects the value of c_h
    • LBMCollisionCallback is already part of the calculations of the next time step and should therefore be called after StepsizeCallback

Stage callbacks

PositivityPreservingLimiterZhangShu is a positivity-preserving limiter, used to enforce physical constraints. An example elixir using this feature can be found at examples/tree_2d_dgsem/elixir_euler_positivity.jl.

Implementing new callbacks

Since Trixi.jl is compatible with OrdinaryDiffEq.jl, both packages share the same callback interface. A detailed description of it can be found in the OrdinaryDiffEq.jl documentation. Step callbacks are just called callbacks. Stage callbacks are called stage_limiter!.

An example elixir showing how to implement a new simple stage callback and a new simple step callback can be found at examples/tree_2d_dgsem/elixir_advection_callbacks.jl.

+julia> plot(pd1["p_prime"]); plot!(pd2["p_prime"], xguide="t")

will yield the following plot:

image

Miscellaneous

Equation-specific callbacks

Some callbacks provided by Trixi.jl implement specific features for certain equations:

Usage of step callbacks

Step callbacks are passed to the solve method from the ODE solver via the keyword argument callback. If you want to use a single callback cb, pass it as callback=cb. When using two or more callbacks, you need to turn them into a CallbackSet first by calling callbacks = CallbackSet(cb1, cb2) and passing it as callback=callbacks.

Note

There are some restrictions regarding the order of callbacks in a CallbackSet.

The callbacks are called after each time step but some callbacks actually belong to the next time step. Therefore, the callbacks should be ordered in the following way:

  • Callbacks that belong to the current time step:
    • SummaryCallback controls, among other things, timers and should thus be first
    • SteadyStateCallback may mark a time step as the last one
    • AnalysisCallback may do some checks that mark a time step as the last one
    • AliveCallback should be nearby AnalysisCallback
    • SaveSolutionCallback/SaveRestartCallback should save the current solution before it is degraded by AMR
    • VisualizationCallback should be called before the mesh is adapted
  • Callbacks that belong to the next time step:
    • AMRCallback
    • StepsizeCallback must be called after AMRCallback to accommodate potential changes to the mesh
    • GlmSpeedCallback must be called after StepsizeCallback because the step size affects the value of c_h
    • LBMCollisionCallback is already part of the calculations of the next time step and should therefore be called after StepsizeCallback

Stage callbacks

PositivityPreservingLimiterZhangShu is a positivity-preserving limiter, used to enforce physical constraints. An example elixir using this feature can be found at examples/tree_2d_dgsem/elixir_euler_positivity.jl.

Implementing new callbacks

Since Trixi.jl is compatible with OrdinaryDiffEq.jl, both packages share the same callback interface. A detailed description of it can be found in the OrdinaryDiffEq.jl documentation. Step callbacks are just called callbacks. Stage callbacks are called stage_limiter!.

An example elixir showing how to implement a new simple stage callback and a new simple step callback can be found at examples/tree_2d_dgsem/elixir_advection_callbacks.jl.

diff --git a/previews/PR1624/code_of_conduct/index.html b/previews/PR1624/code_of_conduct/index.html index f5150f59e36..52aa14084d3 100644 --- a/previews/PR1624/code_of_conduct/index.html +++ b/previews/PR1624/code_of_conduct/index.html @@ -1,2 +1,2 @@ -Code of Conduct · Trixi.jl

Code of Conduct

Contributor Covenant Code of Conduct

Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting

Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to Michael Schlottke-Lakemper, Hendrik Ranocha, or any other of the principal developers responsible for enforcement listed in Authors. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/codeofconduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

+Code of Conduct · Trixi.jl

Code of Conduct

Contributor Covenant Code of Conduct

Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting

Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to Michael Schlottke-Lakemper, Hendrik Ranocha, or any other of the principal developers responsible for enforcement listed in Authors. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/codeofconduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

diff --git a/previews/PR1624/contributing/index.html b/previews/PR1624/contributing/index.html index ccfff267848..c446e761375 100644 --- a/previews/PR1624/contributing/index.html +++ b/previews/PR1624/contributing/index.html @@ -1,5 +1,5 @@ -Contributing · Trixi.jl

Contributing

Trixi.jl is an open-source project and we are very happy to accept contributions from the community. Please feel free to open issues or submit patches (preferably as merge requests) any time. For planned larger contributions, it is often beneficial to get in contact with one of the principal developers first (see Authors).

Trixi.jl and its contributions are licensed under the MIT license (see License). As a contributor, you certify that all your contributions are in conformance with the Developer Certificate of Origin (Version 1.1), which is reproduced below.

Developer Certificate of Origin (Version 1.1)

The following text was taken from https://developercertificate.org:

Developer Certificate of Origin
+Contributing · Trixi.jl

Contributing

Trixi.jl is an open-source project and we are very happy to accept contributions from the community. Please feel free to open issues or submit patches (preferably as merge requests) any time. For planned larger contributions, it is often beneficial to get in contact with one of the principal developers first (see Authors).

Trixi.jl and its contributions are licensed under the MIT license (see License). As a contributor, you certify that all your contributions are in conformance with the Developer Certificate of Origin (Version 1.1), which is reproduced below.

Developer Certificate of Origin (Version 1.1)

The following text was taken from https://developercertificate.org:

Developer Certificate of Origin
 Version 1.1
 
 Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
@@ -35,4 +35,4 @@
     are public and that a record of the contribution (including all
     personal information I submit with it, including my sign-off) is
     maintained indefinitely and may be redistributed consistent with
-    this project or the open source license(s) involved.
+ this project or the open source license(s) involved.
diff --git a/previews/PR1624/conventions/index.html b/previews/PR1624/conventions/index.html index 2dd46883b75..759514671ee 100644 --- a/previews/PR1624/conventions/index.html +++ b/previews/PR1624/conventions/index.html @@ -1,2 +1,2 @@ -Conventions · Trixi.jl

Conventions

Spatial dimensions and directions

We use the following numbering schemes on Cartesian or curved structured meshes.

  • The orientations are numbered as 1 => x, 2 => y, 3 => z. For example, numerical fluxes such as flux_central(u_ll, u_rr, orientation, equations::AbstractEquations) use the orientation in this way.
  • The directions are numbered as 1 => -x, 2 => +x, 3 => -y, 4 => +y, 5 => -z, 6 => +z. For example, the boundary_conditions are ordered in this way when a Tuple of boundary conditions per direction is passed to the constructor of a SemidiscretizationHyperbolic.
  • For structured and unstructured curved meshes the concept of direction is generalized via the variable normal_direction. This variable points in the normal direction at a given, curved surface. For the computation of boundary fluxes the normal_direction is normalized to be a normal_vector used, for example, in FluxRotated.

Cells vs. elements vs. nodes

To uniquely distinguish between different components of the discretization, we use the following naming conventions:

  • The computational domain is discretized by a mesh, which is made up of individual cells. In general, neither the mesh nor the cells should be aware of any solver-specific knowledge, i.e., they should not store anything that goes beyond the geometrical information and the connectivity.
  • The numerical solvers do not directly store their information inside the mesh, but use own data structures. Specifically, for each cell on which a solver wants to operate, the solver creates an element to store solver-specific data.
  • For discretization schemes such as the discontinuous Galerkin or the finite element method, inside each element multiple nodes may be defined, which hold nodal information. The nodes are again a solver-specific component, just like the elements.
  • We often identify elements, nodes, etc. with their (local or global) integer index. Convenience iterators such as eachelement, eachnode use these indices.

Keywords in elixirs

Trixi.jl is distributed with several examples in the form of elixirs, small Julia scripts containing everything to set up and run a simulation. Working interactively from the Julia REPL with these scripts can be quite convenient while for exploratory research and development of Trixi.jl. For example, you can use the convenience function trixi_include to include an elixir with some modified arguments. To enable this, it is helpful to use a consistent naming scheme in elixirs, since trixi_include can only perform simple replacements. Some standard variables names are

  • polydeg for the polynomial degree of a solver
  • surface_flux for the numerical flux at surfaces
  • volume_flux for the numerical flux used in flux differencing volume terms

Moreover, convergence_test requires that the spatial resolution is set via the keywords

Variable names

  • Use descriptive names (using snake_case for variables/functions and CamelCase for types)
  • Use a suffix _ as in name_ for local variables that would otherwise hide existing symbols.
  • Use a prefix _ as in _name to indicate internal methods/data that are "fragile" in the sense that there's no guarantee that they might get changed without notice. These are also not documented with a docstring (but maybe with comments using #).

Array types and wrapping

To allow adaptive mesh refinement efficiently when using time integrators from OrdinaryDiffEq, Trixi.jl allows to represent numerical solutions in two different ways. Some discussion can be found online and in form of comments describing Trixi.wrap_array and Trixi.wrap_array_native in the source code of Trixi.jl. The flexibility introduced by this possible wrapping enables additional performance optimizations. However, it comes at the cost of some additional abstractions (and needs to be used with caution, as described in the source code of Trixi.jl). Thus, we use the following conventions to distinguish between arrays visible to the time integrator and wrapped arrays mainly used internally.

  • Arrays visible to the time integrator have a suffix _ode, e.g., du_ode, u_ode.
  • Wrapped arrays do not have a suffix, e.g., du, u.

Methods either accept arrays visible to the time integrator or wrapped arrays based on the following rules.

  • When some solution is passed together with a semidiscretization semi, the solution must be a u_ode that needs to be wrapped via wrap_array(u_ode, semi) (or wrap_array_native(u_ode, semi)) for further processing.
  • When some solution is passed together with the mesh, equations, solver, cache, ..., it is already wrapped via wrap_array (or wrap_array_native).
  • Exceptions of this rule are possible, e.g. for AMR, but must be documented in the code.
  • wrap_array should be used as default option. wrap_array_native should only be used when necessary, e.g., to avoid additional overhead when interfacing with external C libraries such as HDF5, MPI, or visualization.
+Conventions · Trixi.jl

Conventions

Spatial dimensions and directions

We use the following numbering schemes on Cartesian or curved structured meshes.

  • The orientations are numbered as 1 => x, 2 => y, 3 => z. For example, numerical fluxes such as flux_central(u_ll, u_rr, orientation, equations::AbstractEquations) use the orientation in this way.
  • The directions are numbered as 1 => -x, 2 => +x, 3 => -y, 4 => +y, 5 => -z, 6 => +z. For example, the boundary_conditions are ordered in this way when a Tuple of boundary conditions per direction is passed to the constructor of a SemidiscretizationHyperbolic.
  • For structured and unstructured curved meshes the concept of direction is generalized via the variable normal_direction. This variable points in the normal direction at a given, curved surface. For the computation of boundary fluxes the normal_direction is normalized to be a normal_vector used, for example, in FluxRotated.

Cells vs. elements vs. nodes

To uniquely distinguish between different components of the discretization, we use the following naming conventions:

  • The computational domain is discretized by a mesh, which is made up of individual cells. In general, neither the mesh nor the cells should be aware of any solver-specific knowledge, i.e., they should not store anything that goes beyond the geometrical information and the connectivity.
  • The numerical solvers do not directly store their information inside the mesh, but use own data structures. Specifically, for each cell on which a solver wants to operate, the solver creates an element to store solver-specific data.
  • For discretization schemes such as the discontinuous Galerkin or the finite element method, inside each element multiple nodes may be defined, which hold nodal information. The nodes are again a solver-specific component, just like the elements.
  • We often identify elements, nodes, etc. with their (local or global) integer index. Convenience iterators such as eachelement, eachnode use these indices.

Keywords in elixirs

Trixi.jl is distributed with several examples in the form of elixirs, small Julia scripts containing everything to set up and run a simulation. Working interactively from the Julia REPL with these scripts can be quite convenient while for exploratory research and development of Trixi.jl. For example, you can use the convenience function trixi_include to include an elixir with some modified arguments. To enable this, it is helpful to use a consistent naming scheme in elixirs, since trixi_include can only perform simple replacements. Some standard variables names are

  • polydeg for the polynomial degree of a solver
  • surface_flux for the numerical flux at surfaces
  • volume_flux for the numerical flux used in flux differencing volume terms

Moreover, convergence_test requires that the spatial resolution is set via the keywords

Variable names

  • Use descriptive names (using snake_case for variables/functions and CamelCase for types)
  • Use a suffix _ as in name_ for local variables that would otherwise hide existing symbols.
  • Use a prefix _ as in _name to indicate internal methods/data that are "fragile" in the sense that there's no guarantee that they might get changed without notice. These are also not documented with a docstring (but maybe with comments using #).

Array types and wrapping

To allow adaptive mesh refinement efficiently when using time integrators from OrdinaryDiffEq, Trixi.jl allows to represent numerical solutions in two different ways. Some discussion can be found online and in form of comments describing Trixi.wrap_array and Trixi.wrap_array_native in the source code of Trixi.jl. The flexibility introduced by this possible wrapping enables additional performance optimizations. However, it comes at the cost of some additional abstractions (and needs to be used with caution, as described in the source code of Trixi.jl). Thus, we use the following conventions to distinguish between arrays visible to the time integrator and wrapped arrays mainly used internally.

  • Arrays visible to the time integrator have a suffix _ode, e.g., du_ode, u_ode.
  • Wrapped arrays do not have a suffix, e.g., du, u.

Methods either accept arrays visible to the time integrator or wrapped arrays based on the following rules.

  • When some solution is passed together with a semidiscretization semi, the solution must be a u_ode that needs to be wrapped via wrap_array(u_ode, semi) (or wrap_array_native(u_ode, semi)) for further processing.
  • When some solution is passed together with the mesh, equations, solver, cache, ..., it is already wrapped via wrap_array (or wrap_array_native).
  • Exceptions of this rule are possible, e.g. for AMR, but must be documented in the code.
  • wrap_array should be used as default option. wrap_array_native should only be used when necessary, e.g., to avoid additional overhead when interfacing with external C libraries such as HDF5, MPI, or visualization.
diff --git a/previews/PR1624/development/index.html b/previews/PR1624/development/index.html index 66ffaa007e4..73a3c7f8836 100644 --- a/previews/PR1624/development/index.html +++ b/previews/PR1624/development/index.html @@ -1,5 +1,5 @@ -Development · Trixi.jl

Development

Interactive use of Julia

When a Julia program is executed, Julia first loads and parses all code. Then, the just-in-time compiler has to compile all functions at their first use, which incurs an overhead each time a program is run. For proper packages and commands executed in the REPL (= "return-eval-print loop", which is what the Julia community calls the interactive command-line prompt that opens when executing julia without any files as arguments), however, the previously compiled functions are cached. Therefore, Trixi.jl should generally always be used interactively from the REPL without closing Julia during development, as it allows much faster turnaround times.

If you naively run Trixi.jl from the REPL, you will not be able to change your Trixi.jl source files and then run the changed code without restarting the REPL, which destroys any potential benefits from caching. However, restarting Julia can be avoided by using the Revise.jl package, which tracks changed files and re-loads them automatically. Therefore, it is highly recommended to first install Revise with the following command in Julia: To enter the package REPL mode, press ] in the standard Julia REPL mode. Then, execute

(@v1.9) pkg> add Revise

Now you are able to run Trixi.jl from the REPL, change Trixi.jl code between runs, and enjoy the advantages of the compilation cache! Before you start using Revise regularly, please be aware of some of the Pitfalls when using Revise.

Another recommended package for working from the REPL is OhMyREPL.jl. It can be installed by running

(@v1.9) pkg> add OhMyREPL

and adds syntax highlighting, bracket highlighting, and other helpful improvements for using Julia interactively. To automatically use OhMyREPL when starting the REPL, follow the instructions given in the official documentation.

Running Trixi.jl interactively in the global environment

If you've installed Trixi.jl and Revise in your default environment, begin by executing:

julia

This will start the Julia REPL. Then, run

julia> using Revise; using Trixi

You can run a simulation by executing

julia> trixi_include(default_example())

Together, all of these commands can take some time, roughly half a minute on a modern workstation. Most of the time is spent on compilation of Julia code etc. If you execute the last command again in the same REPL, it will finish within a few milliseconds (maybe ~45 on a modern workstation). This demonstrates the second reason for using the REPL: the compilation cache. That is, those parts of the code that do not change between two Trixi.jl runs do not need to be recompiled and thus execute much faster after the first run.

Manually starting Trixi.jl in the local environment

If you followed the installation instructions for developers, execute Julia with the project directory set to the run directory of the program/tool you want to use. For example, to run Trixi.jl this way, you need to start the REPL with

julia --project=path/to/Trixi.jl/run

and execute

julia> using Revise; using Trixi

to load Revise and Trixi.jl. You can then proceed with the usual commands and run Trixi.jl as in the example above. The --project flag is required such that Julia can properly load Trixi.jl and all dependencies if Trixi.jl is not installed in the global environment. The same procedure also applies should you opt to install the postprocessing tool Trixi2Vtk manually such that you can modify their implementations.

Pitfalls when using Revise

While Revise is a great help for developing Julia code, there are a few situations to watch out for when using Revise. The following list of potential issues is based on personal experiences of the Trixi.jl developers and probably incomplete. Further information on limitations and possible issues with Revise can be found in the official documentation.

If in doubt, restart the REPL

Oftentimes, it is possible to recover from issues with Revise by fixing the offending code. Sometimes, however, this is not possible or you might have troubles finding out what exactly caused the problems. Therefore, in these cases, or if in doubt, restart the REPL to get a fresh start.

Syntax errors are easy to miss

Revise does not stop on syntax errors, e.g., when you accidentally write a[i) instead of a[i]. In this case, Revise reports an error but continues to use the old version of your files! This is especially dangerous for syntax errors, as they are detected while Revise reloads changed code, which happens in the beginning of a new execution. Thus, the syntax error message quickly disappears from the terminal once Trixi.jl starts writing output to the screen and you might not even have noticed that an error occurred at all.

Therefore, when you are deep in a coding/debugging session and wonder why your code modifications do not seem to have any effect, scroll up in your terminal to check if you missed earlier syntax errors, or - if in doubt - restart your REPL.

Files are not tracked after changing branches

Sometimes, Revise stops tracking files when changing the Git branch. That is, modifications to Trixi.jl's source files will not be reloaded by Revise and thus have no effect of a currently running REPL session. This issue is particularly annoying for a developer, since it does not come with any warning! Therefore, it is good practice to always restart the REPL after changing branches.

Changes to type definitions are not allowed

Revise cannot handle changes to type definitions, e.g., when modifying the fields in a struct. In this case, Revise reports an error and refuses to run your code unless you undo the modifications. Once you undo the changes, Revise will usually continue to work as expected again. However, if you want to keep your type modifications, you need to restart the REPL.

Using the Julia REPL effectively

The Julia manual is an excellent resource to learn Julia. Here, we list some helpful commands than can increase your productivity in the Julia REPL.

  • Use the REPL help mode entered by typing ?.

    julia> using Trixi
    +Development · Trixi.jl

    Development

    Interactive use of Julia

    When a Julia program is executed, Julia first loads and parses all code. Then, the just-in-time compiler has to compile all functions at their first use, which incurs an overhead each time a program is run. For proper packages and commands executed in the REPL (= "return-eval-print loop", which is what the Julia community calls the interactive command-line prompt that opens when executing julia without any files as arguments), however, the previously compiled functions are cached. Therefore, Trixi.jl should generally always be used interactively from the REPL without closing Julia during development, as it allows much faster turnaround times.

    If you naively run Trixi.jl from the REPL, you will not be able to change your Trixi.jl source files and then run the changed code without restarting the REPL, which destroys any potential benefits from caching. However, restarting Julia can be avoided by using the Revise.jl package, which tracks changed files and re-loads them automatically. Therefore, it is highly recommended to first install Revise with the following command in Julia: To enter the package REPL mode, press ] in the standard Julia REPL mode. Then, execute

    (@v1.9) pkg> add Revise

    Now you are able to run Trixi.jl from the REPL, change Trixi.jl code between runs, and enjoy the advantages of the compilation cache! Before you start using Revise regularly, please be aware of some of the Pitfalls when using Revise.

    Another recommended package for working from the REPL is OhMyREPL.jl. It can be installed by running

    (@v1.9) pkg> add OhMyREPL

    and adds syntax highlighting, bracket highlighting, and other helpful improvements for using Julia interactively. To automatically use OhMyREPL when starting the REPL, follow the instructions given in the official documentation.

    Running Trixi.jl interactively in the global environment

    If you've installed Trixi.jl and Revise in your default environment, begin by executing:

    julia

    This will start the Julia REPL. Then, run

    julia> using Revise; using Trixi

    You can run a simulation by executing

    julia> trixi_include(default_example())

    Together, all of these commands can take some time, roughly half a minute on a modern workstation. Most of the time is spent on compilation of Julia code etc. If you execute the last command again in the same REPL, it will finish within a few milliseconds (maybe ~45 on a modern workstation). This demonstrates the second reason for using the REPL: the compilation cache. That is, those parts of the code that do not change between two Trixi.jl runs do not need to be recompiled and thus execute much faster after the first run.

    Manually starting Trixi.jl in the local environment

    If you followed the installation instructions for developers, execute Julia with the project directory set to the run directory of the program/tool you want to use. For example, to run Trixi.jl this way, you need to start the REPL with

    julia --project=path/to/Trixi.jl/run

    and execute

    julia> using Revise; using Trixi

    to load Revise and Trixi.jl. You can then proceed with the usual commands and run Trixi.jl as in the example above. The --project flag is required such that Julia can properly load Trixi.jl and all dependencies if Trixi.jl is not installed in the global environment. The same procedure also applies should you opt to install the postprocessing tool Trixi2Vtk manually such that you can modify their implementations.

    Pitfalls when using Revise

    While Revise is a great help for developing Julia code, there are a few situations to watch out for when using Revise. The following list of potential issues is based on personal experiences of the Trixi.jl developers and probably incomplete. Further information on limitations and possible issues with Revise can be found in the official documentation.

    If in doubt, restart the REPL

    Oftentimes, it is possible to recover from issues with Revise by fixing the offending code. Sometimes, however, this is not possible or you might have troubles finding out what exactly caused the problems. Therefore, in these cases, or if in doubt, restart the REPL to get a fresh start.

    Syntax errors are easy to miss

    Revise does not stop on syntax errors, e.g., when you accidentally write a[i) instead of a[i]. In this case, Revise reports an error but continues to use the old version of your files! This is especially dangerous for syntax errors, as they are detected while Revise reloads changed code, which happens in the beginning of a new execution. Thus, the syntax error message quickly disappears from the terminal once Trixi.jl starts writing output to the screen and you might not even have noticed that an error occurred at all.

    Therefore, when you are deep in a coding/debugging session and wonder why your code modifications do not seem to have any effect, scroll up in your terminal to check if you missed earlier syntax errors, or - if in doubt - restart your REPL.

    Files are not tracked after changing branches

    Sometimes, Revise stops tracking files when changing the Git branch. That is, modifications to Trixi.jl's source files will not be reloaded by Revise and thus have no effect of a currently running REPL session. This issue is particularly annoying for a developer, since it does not come with any warning! Therefore, it is good practice to always restart the REPL after changing branches.

    Changes to type definitions are not allowed

    Revise cannot handle changes to type definitions, e.g., when modifying the fields in a struct. In this case, Revise reports an error and refuses to run your code unless you undo the modifications. Once you undo the changes, Revise will usually continue to work as expected again. However, if you want to keep your type modifications, you need to restart the REPL.

    Using the Julia REPL effectively

    The Julia manual is an excellent resource to learn Julia. Here, we list some helpful commands than can increase your productivity in the Julia REPL.

    • Use the REPL help mode entered by typing ?.

      julia> using Trixi
       
       help?> trixi_include
       search: trixi_include
      @@ -39,4 +39,4 @@
       Trixi.IdealGlmMhdEquations2D
       Trixi.IdealGlmMhdMulticomponentEquations1D
       [...]

    Text editors

    When writing code, the choice of text editor can have a significant impact on productivity and developer satisfaction. While using the default text editor of the operating system has its own benefits (specifically the lack of an explicit installation procure), usually it makes sense to switch to a more programming-friendly tool. In the following, a few of the many options are listed and discussed:

    VS Code

    Visual Studio Code is a modern open source editor with good support for Julia. While Juno had some better support in the past, the developers of Juno and the Julia VS Code plugin are joining forces and concentrating on VS Code since support of Atom has been suspended. Basically, all comments on Juno below also apply to VS Code.

    Juno

    If you are new to programming or do not have a preference for a text editor yet, Juno is a good choice for developing Julia code. It is based on Atom, a sophisticated and widely used editor for software developers, and is enhanced with several Julia-specific features. Furthermore and especially helpful for novice programmers, it has a MATLAB-like appearance with easy and interactive access to the current variables, the help system, and a debugger.

    Vim or Emacs

    Vim and Emacs are both very popular editors that work great with Julia. One of their advantages is that they are text editors without a GUI and as such are available for almost any operating system. They also are preinstalled on virtually all Unix-like systems. However, Vim and Emacs come with their own, steep learning curve if they have never been used before. Therefore, if in doubt, it is probably easier to get started with a classic GUI-based text editor (like Juno). If you decide to use Vim or Emacs, make sure that you install the corresponding Vim plugin julia-vim or Emacs major mode julia-emacs.

    Debugging

    Julia offers several options for debugging. A classical debugger is available with the Debugger.jl package or in the Julia extension for VS Code. However, it can be quite slow and, at the time of writing (January 2023), currently does not work properly with Trixi.jl. The Infiltrator.jl package on the other hand does not offer all features of a full debugger, but is a fast and simple tool that allows users to set breakpoints to open a local REPL session and access the call stack and variables.

    Infiltrator

    The Infiltrator package provides fast, interactive breakpoints using the @infiltrate command, which drops the user into a local REPL session. From there, it is possible to access local variables, see the call stack, and execute statements.

    The package can be installed in the Julia REPL by executing

    (@v1.9) pkg> add Infiltrator

    To load the package in the Julia REPL execute

    julia> using Infiltrator

    Breakpoints can be set by adding a line with the @infiltrate macro at the respective position in the code. Use Revise if you want to set and delete breakpoints in your package without having to restart Julia.

    Use `@autoinfiltrate` when debugging Trixi.jl

    When running Julia inside a package environment, e.g., inside the source code of Trixi.jl itself, the @infiltrate macro only works if Infiltrator has been added to the package dependencies. To avoid this, you can use the (non-exported) @autoinfiltrate macro in Trixi.jl, which only requires Infiltrator.jl to be available in the current environment stack and will auto-load it for you.

    Triggering the breakpoint starts a REPL session where it is possible to interact with the current local scope. Possible commands are:

    • @locals: Print the local variables.
    • @exfiltrate: Save the local variables to a global storage, which can be accessed with the safehouse variable outside the Infiltrator session.
    • @trace: Print the current stack trace.
    • Execute other arbitrary statements
    • ?: Print a help list with all options

    To finish a debugging session, either use @continue to continue and eventually stop at the next breakpoint or @exit to skip further breakpoints. After the code has finished, local variables saved with @exfiltrate can be accessed in the REPL using the safehouse variable.

    Limitations of using Infiltrator.jl are that local variables cannot be changed, and that it is not possible to step into further calls or access other function scopes.

    Releasing a new version of Trixi.jl, Trixi2Vtk

    • Check whether everything is okay, tests pass etc.

    • Set the new version number in Project.toml according to the Julian version of semver. Commit and push.

    • Comment @JuliaRegistrator register on the commit setting the version number.

    • JuliaRegistrator will create a PR with the new version in the General registry. Wait for it to be merged.

    • Increment the version number in Project.toml again with suffix -pre. For example, if you have released version v0.2.0, use v0.2.1-pre as new version number.

    • When a new version of Trixi.jl was released, check whether the [compat] entries in test/Project.toml in Trixi2Vtk should be updated. When a new version of Trixi2Vtk was released, check whether the [compat] entries in docs/Project.toml in Trixi.jl should be updated.

      These entries will also be checked regularly by CompatHelper (once a day). Hence, if everything was released correctly, you should only need to do these checks manually if new minor versions with changes in the docs of Trixi2Vtk were released but no new version of Trixi.jl was released afterwards.

    Preview of the documentation

    You can build the documentation of Trixi.jl locally by running

    julia --project=docs -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'
    -julia --project=docs --color=yes docs/make.jl

    from the Trixi.jl main directory. Then, you can look at the html files generated in docs/build. For PRs triggered from branches inside the Trixi.jl main repository previews of the new documentation are generated at https://trixi-framework.github.io/Trixi.jl/previews/PRXXX, where XXX is the number of the PR. This does not work for PRs from forks for security reasons (since anyone could otherwise push arbitrary stuff to the Trixi.jl website, including malicious code).

    Developing Trixi2Vtk

    Trixi2Vtk has Trixi.jl as dependency and uses Trixi.jl's implementation to, e.g., load mesh files. When developing Trixi2Vtk, one may want to change functions in Trixi.jl to allow them to be reused in Trixi2Vtk. To use a locally modified Trixi.jl clone instead of a Trixi.jl release, one can tell Pkg to use the local source code of Trixi.jl instead of a registered version by running

    (@v1.9) pkg> develop path/to/Trixi.jl
    +julia --project=docs --color=yes docs/make.jl

    from the Trixi.jl main directory. Then, you can look at the html files generated in docs/build. For PRs triggered from branches inside the Trixi.jl main repository previews of the new documentation are generated at https://trixi-framework.github.io/Trixi.jl/previews/PRXXX, where XXX is the number of the PR. This does not work for PRs from forks for security reasons (since anyone could otherwise push arbitrary stuff to the Trixi.jl website, including malicious code).

    Developing Trixi2Vtk

    Trixi2Vtk has Trixi.jl as dependency and uses Trixi.jl's implementation to, e.g., load mesh files. When developing Trixi2Vtk, one may want to change functions in Trixi.jl to allow them to be reused in Trixi2Vtk. To use a locally modified Trixi.jl clone instead of a Trixi.jl release, one can tell Pkg to use the local source code of Trixi.jl instead of a registered version by running

    (@v1.9) pkg> develop path/to/Trixi.jl
diff --git a/previews/PR1624/github-git/index.html b/previews/PR1624/github-git/index.html index 7e0b614c4c7..2a71d7e47c1 100644 --- a/previews/PR1624/github-git/index.html +++ b/previews/PR1624/github-git/index.html @@ -1,5 +1,5 @@ -GitHub & Git · Trixi.jl

GitHub & Git

This page contains information on how to use GitHub and Git when developing Trixi.jl.

Development workflow

For adding modifications to Trixi.jl, we generally follow these steps:

Create an issue (optional)

In many cases it makes sense to start by creating an issue on GitHub. For example, if the implementation approach for a new feature is not yet clear or if there should be a discussion about the desired outcome, it is good practice to first get a consensus on what is the expected result of this modification. A GitHub issue is the place to lead this discussion, as it preserves it in the project and - together with the actual code changes - allows in the future to revisit the reasons for a particular choice of implementation or feature.

Create a branch and immediately create a pull request

All feature development, bug fixes etc. should be developed in a branch and not directly on main. If you do not have write access to the main repository on GitHub, first create a fork of the Trixi.jl repository and clone the fork to your machine. Then, create a branch locally by executing git checkout -b yourbranch, push it to the repository, and create a pull request (PR).

If you have already cloned Trixi.jl from the main repo to your local machine, you can also work in that clone. You just need to add your fork as additional remote repository and push your new branch there.

git remote add myfork git@github.com:YOUR_NAME/Trixi.jl.git
+GitHub & Git · Trixi.jl

GitHub & Git

This page contains information on how to use GitHub and Git when developing Trixi.jl.

Development workflow

For adding modifications to Trixi.jl, we generally follow these steps:

Create an issue (optional)

In many cases it makes sense to start by creating an issue on GitHub. For example, if the implementation approach for a new feature is not yet clear or if there should be a discussion about the desired outcome, it is good practice to first get a consensus on what is the expected result of this modification. A GitHub issue is the place to lead this discussion, as it preserves it in the project and - together with the actual code changes - allows in the future to revisit the reasons for a particular choice of implementation or feature.

Create a branch and immediately create a pull request

All feature development, bug fixes etc. should be developed in a branch and not directly on main. If you do not have write access to the main repository on GitHub, first create a fork of the Trixi.jl repository and clone the fork to your machine. Then, create a branch locally by executing git checkout -b yourbranch, push it to the repository, and create a pull request (PR).

If you have already cloned Trixi.jl from the main repo to your local machine, you can also work in that clone. You just need to add your fork as additional remote repository and push your new branch there.

git remote add myfork git@github.com:YOUR_NAME/Trixi.jl.git
 # get latest main from the main repo
 git checkout main
 git pull
@@ -41,4 +41,4 @@
 git rebase
 
 # Clean reflog and force garbage collection
-git reflog expire --expire=now --all && git gc --prune=now --aggressive

IMPORTANT: You need to do a git rebase instead of a git pull when updating the fixed branch.

+git reflog expire --expire=now --all && git gc --prune=now --aggressive

IMPORTANT: You need to do a git rebase instead of a git pull when updating the fixed branch.

diff --git a/previews/PR1624/index.html b/previews/PR1624/index.html index 61411a042d0..79e342b959a 100644 --- a/previews/PR1624/index.html +++ b/previews/PR1624/index.html @@ -1,5 +1,5 @@ -Home · Trixi.jl

Trixi.jl

Docs-stable Docs-dev Slack Youtube Build Status Codecov Coveralls Aqua QA License: MIT DOI

Trixi.jl is a numerical simulation framework for conservation laws written in Julia. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures. Its features include:

  • 1D, 2D, and 3D simulations on line/quad/hex/simplex meshes
    • Cartesian and curvilinear meshes
    • Conforming and non-conforming meshes
    • Structured and unstructured meshes
    • Hierarchical quadtree/octree grid with adaptive mesh refinement
    • Forests of quadtrees/octrees with p4est via P4est.jl
  • High-order accuracy in space and time
  • Discontinuous Galerkin methods
  • Compatible with the SciML ecosystem for ordinary differential equations
  • Native support for differentiable programming
  • Periodic and weakly-enforced boundary conditions
  • Multiple governing equations:
    • Compressible Euler equations
    • Compressible Navier-Stokes equations
    • Magnetohydrodynamics (MHD) equations
    • Multi-component compressible Euler and MHD equations
    • Linearized Euler and acoustic perturbation equations
    • Hyperbolic diffusion equations for elliptic problems
    • Lattice-Boltzmann equations (D2Q9 and D3Q27 schemes)
    • Shallow water equations
    • Scalar advection
  • Multi-physics simulations
  • Shared-memory parallelization via multithreading
  • Multi-node parallelization via MPI
  • Visualization and postprocessing of the results
    • In-situ and a posteriori visualization with Plots.jl
    • Interactive visualization with Makie.jl
    • Postprocessing with ParaView/VisIt via Trixi2Vtk

Installation

If you have not yet installed Julia, please follow the instructions for your operating system. Trixi.jl works with Julia v1.8 and newer. We recommend using the latest stable release of Julia.

For users

Trixi.jl and its related tools are registered Julia packages. Hence, you can install Trixi.jl, the visualization tool Trixi2Vtk, OrdinaryDiffEq.jl, and Plots.jl by executing the following commands in the Julia REPL:

julia> using Pkg
+Home · Trixi.jl

Trixi.jl

Docs-stable Docs-dev Slack Youtube Build Status Codecov Coveralls Aqua QA License: MIT DOI

Trixi.jl is a numerical simulation framework for conservation laws written in Julia. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures. Its features include:

  • 1D, 2D, and 3D simulations on line/quad/hex/simplex meshes
    • Cartesian and curvilinear meshes
    • Conforming and non-conforming meshes
    • Structured and unstructured meshes
    • Hierarchical quadtree/octree grid with adaptive mesh refinement
    • Forests of quadtrees/octrees with p4est via P4est.jl
  • High-order accuracy in space and time
  • Discontinuous Galerkin methods
  • Compatible with the SciML ecosystem for ordinary differential equations
  • Native support for differentiable programming
  • Periodic and weakly-enforced boundary conditions
  • Multiple governing equations:
    • Compressible Euler equations
    • Compressible Navier-Stokes equations
    • Magnetohydrodynamics (MHD) equations
    • Multi-component compressible Euler and MHD equations
    • Linearized Euler and acoustic perturbation equations
    • Hyperbolic diffusion equations for elliptic problems
    • Lattice-Boltzmann equations (D2Q9 and D3Q27 schemes)
    • Shallow water equations
    • Scalar advection
  • Multi-physics simulations
  • Shared-memory parallelization via multithreading
  • Multi-node parallelization via MPI
  • Visualization and postprocessing of the results
    • In-situ and a posteriori visualization with Plots.jl
    • Interactive visualization with Makie.jl
    • Postprocessing with ParaView/VisIt via Trixi2Vtk

Installation

If you have not yet installed Julia, please follow the instructions for your operating system. Trixi.jl works with Julia v1.8 and newer. We recommend using the latest stable release of Julia.

For users

Trixi.jl and its related tools are registered Julia packages. Hence, you can install Trixi.jl, the visualization tool Trixi2Vtk, OrdinaryDiffEq.jl, and Plots.jl by executing the following commands in the Julia REPL:

julia> using Pkg
 
 julia> Pkg.add(["Trixi", "Trixi2Vtk", "OrdinaryDiffEq", "Plots"])

You can copy and paste all commands to the REPL including the leading julia> prompts - they will automatically be stripped away by Julia. The package OrdinaryDiffEq.jl provides time integration schemes used by Trixi.jl, while Plots.jl can be used to directly visualize Trixi.jl's results from the REPL.

Note on package versions: If some of the examples for how to use Trixi.jl do not work, verify that you are using a recent Trixi.jl release by comparing the installed Trixi.jl version from

julia> using Pkg; Pkg.update("Trixi"); Pkg.status("Trixi")

to the latest release. If the installed version does not match the current release, please check the Troubleshooting section.

The commands above can also be used to update Trixi.jl. A brief list of notable changes to Trixi.jl is available in NEWS.md.

For developers

If you plan on editing Trixi.jl itself, you can download Trixi.jl to a local folder and use the code from the cloned directory:

git clone git@github.com:trixi-framework/Trixi.jl.git
 cd Trixi.jl
@@ -111,4 +111,4 @@
     NumFOCUS -->
   
-

This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) through the following grants:

  • Excellence Strategy EXC 2044-390685587, Mathematics Münster: Dynamics-Geometry-Structure.
  • Research unit FOR 5409 "Structure-Preserving Numerical Methods for Bulk- and Interface Coupling of Heterogeneous Models (SNuBIC)" (project number 463312734).
  • Individual grant no. 528753982.

This project has benefited from funding from the European Research Council through the ERC Starting Grant "An Exascale aware and Un-crashable Space-Time-Adaptive Discontinuous Spectral Element Solver for Non-Linear Conservation Laws" (Extreme), ERC grant agreement no. 714487.

This project has benefited from funding from Vetenskapsrådet (VR, Swedish Research Council), Sweden through the VR Starting Grant "Shallow water flows including sediment transport and morphodynamics", VR grant agreement 2020-03642 VR.

This project has benefited from funding from the United States National Science Foundation (NSF) under awards DMS-1719818 and DMS-1943186.

This project has benefited from funding from the German Federal Ministry of Education and Research (BMBF) through the project grant "Adaptive earth system modeling with significantly reduced computation time for exascale supercomputers (ADAPTEX)" (funding id: 16ME0668K).

This project has benefited from funding by the Daimler und Benz Stiftung (Daimler and Benz Foundation) through grant no. 32-10/22.

Trixi.jl is supported by NumFOCUS as an Affiliated Project.

+

This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) through the following grants:

  • Excellence Strategy EXC 2044-390685587, Mathematics Münster: Dynamics-Geometry-Structure.
  • Research unit FOR 5409 "Structure-Preserving Numerical Methods for Bulk- and Interface Coupling of Heterogeneous Models (SNuBIC)" (project number 463312734).
  • Individual grant no. 528753982.

This project has benefited from funding from the European Research Council through the ERC Starting Grant "An Exascale aware and Un-crashable Space-Time-Adaptive Discontinuous Spectral Element Solver for Non-Linear Conservation Laws" (Extreme), ERC grant agreement no. 714487.

This project has benefited from funding from Vetenskapsrådet (VR, Swedish Research Council), Sweden through the VR Starting Grant "Shallow water flows including sediment transport and morphodynamics", VR grant agreement 2020-03642 VR.

This project has benefited from funding from the United States National Science Foundation (NSF) under awards DMS-1719818 and DMS-1943186.

This project has benefited from funding from the German Federal Ministry of Education and Research (BMBF) through the project grant "Adaptive earth system modeling with significantly reduced computation time for exascale supercomputers (ADAPTEX)" (funding id: 16ME0668K).

This project has benefited from funding by the Daimler und Benz Stiftung (Daimler and Benz Foundation) through grant no. 32-10/22.

Trixi.jl is supported by NumFOCUS as an Affiliated Project.

diff --git a/previews/PR1624/license/index.html b/previews/PR1624/license/index.html index da454aaf2ef..b32b2b951f8 100644 --- a/previews/PR1624/license/index.html +++ b/previews/PR1624/license/index.html @@ -1,2 +1,2 @@ -License · Trixi.jl

License

MIT License

Copyright (c) 2020-present The Trixi.jl Authors (see Authors)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+License · Trixi.jl

License

MIT License

Copyright (c) 2020-present The Trixi.jl Authors (see Authors)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

diff --git a/previews/PR1624/meshes/dgmulti_mesh/index.html b/previews/PR1624/meshes/dgmulti_mesh/index.html index 3ef82ae37ef..3453e2e8873 100644 --- a/previews/PR1624/meshes/dgmulti_mesh/index.html +++ b/previews/PR1624/meshes/dgmulti_mesh/index.html @@ -1,8 +1,8 @@ -DGMulti mesh · Trixi.jl

Unstructured meshes and the DGMulti solver

Trixi.jl includes support for simplicial and tensor product meshes via the DGMulti solver type, which is based on the StartUpDG.jl package. DGMulti solvers also provide support for quadrilateral and hexahedral meshes, though this feature is currently restricted to Cartesian grids. On these line/quad/hex meshes, the DGMulti solver also allows to use all (finite domain) SBP derivative operators provided by SummationByPartsOperators.jl, including several finite difference SBP methods.

We make a few simplifying assumptions about supported meshes:

  • meshes consist of a single type of element
  • meshes are conforming (e.g., each face of an element is shared with at most one other element).
  • the geometric mapping from reference to physical elements is polynomial (currently, only affine mappings are supported).

StartUpDG.jl includes both simple uniform meshes via uniform_mesh, as well as support for triangular meshes constructed using Triangulate.jl, a wrapper around Jonathan Shewchuk's Triangle package.

The DGMulti solver type

Trixi.jl solvers on simplicial meshes use the DGMulti solver type, which allows users to specify element_type and approximation_type in addition to polydeg, surface_flux, surface_integral, and volume_integral.

DGMulti(; polydeg::Integer,
+DGMulti mesh · Trixi.jl

Unstructured meshes and the DGMulti solver

Trixi.jl includes support for simplicial and tensor product meshes via the DGMulti solver type, which is based on the StartUpDG.jl package. DGMulti solvers also provide support for quadrilateral and hexahedral meshes, though this feature is currently restricted to Cartesian grids. On these line/quad/hex meshes, the DGMulti solver also allows to use all (finite domain) SBP derivative operators provided by SummationByPartsOperators.jl, including several finite difference SBP methods.

We make a few simplifying assumptions about supported meshes:

  • meshes consist of a single type of element
  • meshes are conforming (e.g., each face of an element is shared with at most one other element).
  • the geometric mapping from reference to physical elements is polynomial (currently, only affine mappings are supported).

StartUpDG.jl includes both simple uniform meshes via uniform_mesh, as well as support for triangular meshes constructed using Triangulate.jl, a wrapper around Jonathan Shewchuk's Triangle package.

The DGMulti solver type

Trixi.jl solvers on simplicial meshes use the DGMulti solver type, which allows users to specify element_type and approximation_type in addition to polydeg, surface_flux, surface_integral, and volume_integral.

DGMulti(; polydeg::Integer,
           element_type::AbstractElemShape,
           approximation_type=Polynomial(),
           surface_flux=flux_central,
           surface_integral=SurfaceIntegralWeakForm(surface_flux),
           volume_integral=VolumeIntegralWeakForm(),
-          RefElemData_kwargs...)

Here, element_type can be Tri(), Quad(), Tet(), or Hex(), and approximation_type can be

  • Polynomial(), which specifies a DG discretization using a polynomial basis using quadrature rules which are exact for degree 2 * polydeg integrands, or
  • SBP(), which specifies a DG discretization using multi-dimensional SBP operators. Types of SBP discretizations available include: SBP{Kubatko{LobattoFaceNodes}}() (the default choice), SBP{Kubatko{LegendreFaceNodes}}(), and SBP{Hicken}(). For polydeg = 1, ..., 4, the SBP{Kubatko{LegendreFaceNodes}}() SBP nodes are identical to the SBP nodes of Chen and Shu. More detailed descriptions of each SBP node set can be found in the StartUpDG.jl docs. Trixi.jl will also specialize certain parts of the solver based on the SBP approximation type.
  • a (periodic or non-periodic) derivative operator from SummationByPartsOperators.jl, usually constructed as D = derivative_operator(...). In this case, you do not need to pass a polydeg. Periodic derivative operators will only work with single-element meshes constructed using DGMultiMesh.

Additional options can also be specified through RefElemData_kwargs:

  • quad_rule_vol = quad_nodes(Tri(), Nq) will substitute in a volume quadrature rule of degree Nq instead of the default (which is a quadrature rule of degree polydeg). Here, a degree Nq rule will be exact for at least degree 2*Nq integrands (such that the mass matrix is integrated exactly). Quadrature rules of which exactly integrate degree Nq integrands may also be specified (for example, quad_rule_vol = StartUpDG.quad_nodes_tri(Nq) on triangles).
  • quad_rule_face = quad_nodes(Line(), Nq)) will use a face quadrature rule of degree Nq rather than the default. This rule is also exact for at least degree 2*Nq integrands.

The GaussSBP() approximation type on Quad() and Hex() meshes

When using VolumeIntegralFluxDifferencing on Quad() and Hex() meshes, one can also specify approximation_type = GaussSBP() to use an entropy stable Gauss collocation scheme. Here, GaussSBP() refers to "generalized" summation-by-parts operators (see for example Ranocha 2018 or Fernandez and Zingg 2015).

Unlike traditional SBP operators, generalized SBP operators are constructed from nodes which do not include boundary nodes (i.e., Gauss quadrature nodes as opposed to Gauss-Lobatto quadrature nodes). This makes the computation of interface fluxes slightly more expensive, but also usually results in a more accurate solution. Roughly speaking, an entropy stable Gauss collocation scheme will yield results similar to a modal entropy stable scheme using a Polynomial() approximation type, but will be more efficient at high orders of approximation.

Trixi.jl elixirs on simplicial and tensor product element meshes

Example elixirs with triangular, quadrilateral, and tetrahedral meshes can be found in the examples/dgmulti_2d/ and examples/dgmulti_3d/ folders. Some key elixirs to look at:

For developers

DGMultiMesh wrapper type

DGMulti meshes in Trixi.jl are represented using a DGMultiMesh{NDIMS, ...} type. This mesh type is assumed to have fields md::MeshData, which contains geometric terms derived from the mapping between the reference and physical elements, and boundary_faces, which contains a Dict of boundary segment names (symbols) and list of faces which lie on that boundary segment.

A DGMultiMesh can be constructed in several ways. For example, DGMultiMesh(dg::DGMulti) will return a Cartesian mesh on $[-1, 1]^d$ with element types specified by dg. DGMulti meshes can also be constructed by specifying a list of vertex coordinates vertex_coordinates_x, vertex_coordinates_y, vertex_coordinates_z and a connectivity matrix EToV where EToV[e,:] gives the vertices which correspond to element e. These quantities are available from most unstructured mesh generators.

Initial support for curved DGMultiMeshes is available for flux differencing solvers using SBP and GaussSBP approximation types on quadrilateral and hexahedral meshes. These can be called by specifying mesh = DGMultiMesh(dg, cells_per_dimension, mapping), where mapping is a function which specifies the warping of the mesh (e.g., mapping(xi, eta) = SVector{2}(xi, eta) is the identity mapping) similar to the mapping argument used by StructuredMesh.

Variable naming conventions

We use the convention that coordinates on the reference element are $r$ in 1D, $r, s$ in 2D, or $r, s, t$ in 3D. Physical coordinates use the standard conventions $x$ (1D), $x, y$ (2D), and $x, y, z$ (3D).

"Ref-to-physical mapping"

Derivatives of reference coordinates with respect to physical coordinates are abbreviated, e.g., $\frac{\partial r}{\partial x} = r_x$. Additionally, $J$ is used to denote the determinant of the Jacobian of the reference-to-physical mapping.

Variable meanings and conventions in StartUpDG.jl

StartUpDG.jl exports structs RefElemData{NDIMS, ElemShape, ...} (which contains data associated with the reference element, such as interpolation points, quadrature rules, face nodes, normals, and differentiation/interpolation/projection matrices) and MeshData{NDIMS} (which contains geometric data associated with a mesh). These are currently used for evaluating DG formulations in a matrix-free fashion. These structs contain fields similar (but not identical) to those in Globals1D, Globals2D, Globals3D in the Matlab codes from "Nodal Discontinuous Galerkin Methods" by Hesthaven and Warburton (2007).

In general, we use the following code conventions:

  • variables such as r, s,... and x, y,... correspond to values at nodal interpolation points.
  • variables ending in q (e.g., rq, sq,... and xq, yq,...) correspond to values at volume quadrature points.
  • variables ending in f (e.g., rf, sf,... and xf, yf,...) correspond to values at face quadrature points.
  • variables ending in p (e.g., rp, sp,...) correspond to "plotting" points, which are usually a fine grid of equispaced points.
  • V matrices correspond to interpolation matrices from nodal interpolation points, e.g., Vq interpolates to volume quadrature points, Vf interpolates to face quadrature points.
  • geometric quantities in MeshData are stored as matrices of dimension $\text{number of points per element} \times \text{number of elements}$.

Quantities in rd::RefElemData:

  • rd.Np, rd.Nq, rd.Nf: the number of nodal interpolation points, volume quadrature points, and face quadrature points on the reference element, respectively.
  • rd.Vq: interpolation matrices from values at nodal interpolation points to volume quadrature points
  • rd.wq: volume quadrature weights on the reference element
  • rd.Vf: interpolation matrices from values at nodal interpolation points to face quadrature points
  • rd.wf: a vector containing face quadrature weights on the reference element
  • rd.M: the quadrature-based mass matrix, computed via rd.Vq' * diagm(rd.wq) * rd.Vq.
  • rd.Pq: a quadrature-based $L^2$ projection matrix rd.Pq = rd.M \ rd.Vq' * diagm(rd.wq) which maps between values at quadrature points and values at nodal points.
  • Dr, Ds, Dt matrices are nodal differentiation matrices with respect to the $r,s,t$ coordinates, e.g., Dr*f.(r,s) approximates the derivative of $f(r,s)$ at nodal points.

Quantities in md::MeshData:

  • md.xyz is a tuple of matrices md.x, md.y, md.z, where column e contains coordinates of physical interpolation points.
  • md.xyzq is a tuple of matrices md.xq, md.yq, md.zq, where column e contains coordinates of physical quadrature points.
  • md.rxJ, md.sxJ, ... are matrices where column e contains values of $J\frac{\partial r}{\partial x}$, $J\frac{\partial s}{\partial x}$, etc. at nodal interpolation points on the element e.
  • md.J is a matrix where column e contains values of the Jacobian $J$ at nodal interpolation points.
  • md.Jf is a matrix where column e contains values of the face Jacobian (e.g., determinant of the geometric mapping between a physical face and a reference face) at face quadrature points.
  • md.nxJ, md.nyJ, ... are matrices where column e contains values of components of the unit normal scaled by the face Jacobian md.Jf at face quadrature points.

For more details, please see the StartUpDG.jl docs.

+ RefElemData_kwargs...)

Here, element_type can be Tri(), Quad(), Tet(), or Hex(), and approximation_type can be

  • Polynomial(), which specifies a DG discretization using a polynomial basis using quadrature rules which are exact for degree 2 * polydeg integrands, or
  • SBP(), which specifies a DG discretization using multi-dimensional SBP operators. Types of SBP discretizations available include: SBP{Kubatko{LobattoFaceNodes}}() (the default choice), SBP{Kubatko{LegendreFaceNodes}}(), and SBP{Hicken}(). For polydeg = 1, ..., 4, the SBP{Kubatko{LegendreFaceNodes}}() SBP nodes are identical to the SBP nodes of Chen and Shu. More detailed descriptions of each SBP node set can be found in the StartUpDG.jl docs. Trixi.jl will also specialize certain parts of the solver based on the SBP approximation type.
  • a (periodic or non-periodic) derivative operator from SummationByPartsOperators.jl, usually constructed as D = derivative_operator(...). In this case, you do not need to pass a polydeg. Periodic derivative operators will only work with single-element meshes constructed using DGMultiMesh.

Additional options can also be specified through RefElemData_kwargs:

  • quad_rule_vol = quad_nodes(Tri(), Nq) will substitute in a volume quadrature rule of degree Nq instead of the default (which is a quadrature rule of degree polydeg). Here, a degree Nq rule will be exact for at least degree 2*Nq integrands (such that the mass matrix is integrated exactly). Quadrature rules of which exactly integrate degree Nq integrands may also be specified (for example, quad_rule_vol = StartUpDG.quad_nodes_tri(Nq) on triangles).
  • quad_rule_face = quad_nodes(Line(), Nq)) will use a face quadrature rule of degree Nq rather than the default. This rule is also exact for at least degree 2*Nq integrands.

The GaussSBP() approximation type on Quad() and Hex() meshes

When using VolumeIntegralFluxDifferencing on Quad() and Hex() meshes, one can also specify approximation_type = GaussSBP() to use an entropy stable Gauss collocation scheme. Here, GaussSBP() refers to "generalized" summation-by-parts operators (see for example Ranocha 2018 or Fernandez and Zingg 2015).

Unlike traditional SBP operators, generalized SBP operators are constructed from nodes which do not include boundary nodes (i.e., Gauss quadrature nodes as opposed to Gauss-Lobatto quadrature nodes). This makes the computation of interface fluxes slightly more expensive, but also usually results in a more accurate solution. Roughly speaking, an entropy stable Gauss collocation scheme will yield results similar to a modal entropy stable scheme using a Polynomial() approximation type, but will be more efficient at high orders of approximation.

Trixi.jl elixirs on simplicial and tensor product element meshes

Example elixirs with triangular, quadrilateral, and tetrahedral meshes can be found in the examples/dgmulti_2d/ and examples/dgmulti_3d/ folders. Some key elixirs to look at:

For developers

DGMultiMesh wrapper type

DGMulti meshes in Trixi.jl are represented using a DGMultiMesh{NDIMS, ...} type. This mesh type is assumed to have fields md::MeshData, which contains geometric terms derived from the mapping between the reference and physical elements, and boundary_faces, which contains a Dict of boundary segment names (symbols) and list of faces which lie on that boundary segment.

A DGMultiMesh can be constructed in several ways. For example, DGMultiMesh(dg::DGMulti) will return a Cartesian mesh on $[-1, 1]^d$ with element types specified by dg. DGMulti meshes can also be constructed by specifying a list of vertex coordinates vertex_coordinates_x, vertex_coordinates_y, vertex_coordinates_z and a connectivity matrix EToV where EToV[e,:] gives the vertices which correspond to element e. These quantities are available from most unstructured mesh generators.

Initial support for curved DGMultiMeshes is available for flux differencing solvers using SBP and GaussSBP approximation types on quadrilateral and hexahedral meshes. These can be called by specifying mesh = DGMultiMesh(dg, cells_per_dimension, mapping), where mapping is a function which specifies the warping of the mesh (e.g., mapping(xi, eta) = SVector{2}(xi, eta) is the identity mapping) similar to the mapping argument used by StructuredMesh.

Variable naming conventions

We use the convention that coordinates on the reference element are $r$ in 1D, $r, s$ in 2D, or $r, s, t$ in 3D. Physical coordinates use the standard conventions $x$ (1D), $x, y$ (2D), and $x, y, z$ (3D).

"Ref-to-physical mapping"

Derivatives of reference coordinates with respect to physical coordinates are abbreviated, e.g., $\frac{\partial r}{\partial x} = r_x$. Additionally, $J$ is used to denote the determinant of the Jacobian of the reference-to-physical mapping.

Variable meanings and conventions in StartUpDG.jl

StartUpDG.jl exports structs RefElemData{NDIMS, ElemShape, ...} (which contains data associated with the reference element, such as interpolation points, quadrature rules, face nodes, normals, and differentiation/interpolation/projection matrices) and MeshData{NDIMS} (which contains geometric data associated with a mesh). These are currently used for evaluating DG formulations in a matrix-free fashion. These structs contain fields similar (but not identical) to those in Globals1D, Globals2D, Globals3D in the Matlab codes from "Nodal Discontinuous Galerkin Methods" by Hesthaven and Warburton (2007).

In general, we use the following code conventions:

  • variables such as r, s,... and x, y,... correspond to values at nodal interpolation points.
  • variables ending in q (e.g., rq, sq,... and xq, yq,...) correspond to values at volume quadrature points.
  • variables ending in f (e.g., rf, sf,... and xf, yf,...) correspond to values at face quadrature points.
  • variables ending in p (e.g., rp, sp,...) correspond to "plotting" points, which are usually a fine grid of equispaced points.
  • V matrices correspond to interpolation matrices from nodal interpolation points, e.g., Vq interpolates to volume quadrature points, Vf interpolates to face quadrature points.
  • geometric quantities in MeshData are stored as matrices of dimension $\text{number of points per element} \times \text{number of elements}$.

Quantities in rd::RefElemData:

  • rd.Np, rd.Nq, rd.Nf: the number of nodal interpolation points, volume quadrature points, and face quadrature points on the reference element, respectively.
  • rd.Vq: interpolation matrices from values at nodal interpolation points to volume quadrature points
  • rd.wq: volume quadrature weights on the reference element
  • rd.Vf: interpolation matrices from values at nodal interpolation points to face quadrature points
  • rd.wf: a vector containing face quadrature weights on the reference element
  • rd.M: the quadrature-based mass matrix, computed via rd.Vq' * diagm(rd.wq) * rd.Vq.
  • rd.Pq: a quadrature-based $L^2$ projection matrix rd.Pq = rd.M \ rd.Vq' * diagm(rd.wq) which maps between values at quadrature points and values at nodal points.
  • Dr, Ds, Dt matrices are nodal differentiation matrices with respect to the $r,s,t$ coordinates, e.g., Dr*f.(r,s) approximates the derivative of $f(r,s)$ at nodal points.

Quantities in md::MeshData:

  • md.xyz is a tuple of matrices md.x, md.y, md.z, where column e contains coordinates of physical interpolation points.
  • md.xyzq is a tuple of matrices md.xq, md.yq, md.zq, where column e contains coordinates of physical quadrature points.
  • md.rxJ, md.sxJ, ... are matrices where column e contains values of $J\frac{\partial r}{\partial x}$, $J\frac{\partial s}{\partial x}$, etc. at nodal interpolation points on the element e.
  • md.J is a matrix where column e contains values of the Jacobian $J$ at nodal interpolation points.
  • md.Jf is a matrix where column e contains values of the face Jacobian (e.g., determinant of the geometric mapping between a physical face and a reference face) at face quadrature points.
  • md.nxJ, md.nyJ, ... are matrices where column e contains values of components of the unit normal scaled by the face Jacobian md.Jf at face quadrature points.

For more details, please see the StartUpDG.jl docs.

diff --git a/previews/PR1624/meshes/p4est_mesh/index.html b/previews/PR1624/meshes/p4est_mesh/index.html index 87cdc2a3226..4290cce80ee 100644 --- a/previews/PR1624/meshes/p4est_mesh/index.html +++ b/previews/PR1624/meshes/p4est_mesh/index.html @@ -1,16 +1,16 @@ -P4est-based mesh · Trixi.jl

P4est-based mesh

The P4estMesh is an unstructured, curvilinear, nonconforming mesh type for quadrilateral (2D) and hexahedral (3D) cells. It supports quadtree/octree-based adaptive mesh refinement (AMR) via the C library p4est. See AMRCallback for further information.

Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.

Construction of a P4estMesh from an Abaqus file

One available option to construct a P4estMesh is to read in an Abaqus (.inp) mesh file. We briefly describe the structure of this file, the conventions it uses, and how the mesh file is parsed to create an initial unstructured, curvilinear, and conforming mesh.

Mesh in two spatial dimensions

For this discussion we use the following two-dimensional unstructured curved mesh with three elements:

abaqus-2dmesh-docs

We note that the corner and element connectivity information parsed from the Abaqus file creates a straight sided (linear) mesh. From this linear mesh there are two strategies available to make the mesh curvilinear:

  1. Apply a mapping function to describe a transformation of the linear mesh to another physical domain. The mapping is approximated using interpolation polynomial of a user specified polynomial degree. The default value of this polynomial degree is 1 that corresponds to an uncurved geometry.
  2. High-order boundary information is available in the .inp mesh file because it was created with the HOHQMesh mesh generator, which is available via the Julia package HOHQMesh.jl. This information is used to create appropriate transfinite mappings during the mesh construction.

We divide our discussion into two parts. The first part discusses the standard corner and element information contained in the .inp mesh file. The second part specifically deals with the mesh file parsing of an Abaqus file created by HOHQMesh.jl.

Mesh file header

An Abaqus .inp mesh file typically begins with a *Heading. Though optional, the *Heading is helpful to give users some information about the mesh described by the mesh file. In particular, a .inp mesh file created with HOHQMesh will contain the header

*Heading
- File created by HOHQMesh

This heading is used to indicate to the mesh constructor which of the above mapping strategies to apply in order to create a curvilinear mesh. If the Abaqus file header is not present then the P4estMesh is created with the first strategy above.

List of corner nodes

Next, prefaced with *NODE, comes a list of the physical (x,y,z) coordinates of all the corners. The first integer in the list of the corners provides its id number. Thus, for the two-dimensional example mesh this block of corner information is

*NODE
+P4est-based mesh · Trixi.jl

P4est-based mesh

The P4estMesh is an unstructured, curvilinear, nonconforming mesh type for quadrilateral (2D) and hexahedral (3D) cells. It supports quadtree/octree-based adaptive mesh refinement (AMR) via the C library p4est. See AMRCallback for further information.

Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.

Construction of a P4estMesh from an Abaqus file

One available option to construct a P4estMesh is to read in an Abaqus (.inp) mesh file. We briefly describe the structure of this file, the conventions it uses, and how the mesh file is parsed to create an initial unstructured, curvilinear, and conforming mesh.

Mesh in two spatial dimensions

For this discussion we use the following two-dimensional unstructured curved mesh with three elements:

abaqus-2dmesh-docs

We note that the corner and element connectivity information parsed from the Abaqus file creates a straight sided (linear) mesh. From this linear mesh there are two strategies available to make the mesh curvilinear:

  1. Apply a mapping function to describe a transformation of the linear mesh to another physical domain. The mapping is approximated using interpolation polynomial of a user specified polynomial degree. The default value of this polynomial degree is 1 that corresponds to an uncurved geometry.
  2. High-order boundary information is available in the .inp mesh file because it was created with the HOHQMesh mesh generator, which is available via the Julia package HOHQMesh.jl. This information is used to create appropriate transfinite mappings during the mesh construction.

We divide our discussion into two parts. The first part discusses the standard corner and element information contained in the .inp mesh file. The second part specifically deals with the mesh file parsing of an Abaqus file created by HOHQMesh.jl.

Mesh file header

An Abaqus .inp mesh file typically begins with a *Heading. Though optional, the *Heading is helpful to give users some information about the mesh described by the mesh file. In particular, a .inp mesh file created with HOHQMesh will contain the header

*Heading
+ File created by HOHQMesh

This heading is used to indicate to the mesh constructor which of the above mapping strategies to apply in order to create a curvilinear mesh. If the Abaqus file header is not present then the P4estMesh is created with the first strategy above.

List of corner nodes

Next, prefaced with *NODE, comes a list of the physical (x,y,z) coordinates of all the corners. The first integer in the list of the corners provides its id number. Thus, for the two-dimensional example mesh this block of corner information is

*NODE
 1, 1.0, -1.0, 0.0
 2, 3.0,  0.0, 0.0
 3, 1.0,  1.0, 0.0
 4, 2.0,  0.0, 0.0
 5, 0.0,  0.0, 0.0
 6, 3.0,  1.0, 0.0
-7, 3.0, -1.0, 0.0

List of elements

The element connectivity is given after the list of corners. The header for this information block is

*ELEMENT, type=CPS4, ELSET=Surface1

The Abaqus element type CPS4 corresponds to a quadrilateral element. Each quadrilateral element in the unstructured mesh is dictated by four corner points with indexing taken from the numbering given by the corner list above. The elements connect a set of four corner points (starting from the bottom left) in an anti-clockwise fashion; making the element right-handed. This element handedness is indicated using the circular arrow in the figure above. Just as with the corner list, the first integer in the element connectivity list indicates the element id number. Thus, the element connectivity list for the three element example mesh is

*ELEMENT, type=CPS4, ELSET=Surface1
+7, 3.0, -1.0, 0.0

List of elements

The element connectivity is given after the list of corners. The header for this information block is

*ELEMENT, type=CPS4, ELSET=Surface1

The Abaqus element type CPS4 corresponds to a quadrilateral element. Each quadrilateral element in the unstructured mesh is dictated by four corner points with indexing taken from the numbering given by the corner list above. The elements connect a set of four corner points (starting from the bottom left) in an anti-clockwise fashion; making the element right-handed. This element handedness is indicated using the circular arrow in the figure above. Just as with the corner list, the first integer in the element connectivity list indicates the element id number. Thus, the element connectivity list for the three element example mesh is

*ELEMENT, type=CPS4, ELSET=Surface1
 1, 5, 1, 4, 3
 2, 4, 2, 6, 3
-3, 7, 2, 4, 1

Element neighbor connectivity

The construction of the element neighbor ids and identifying physical boundary surfaces is done using functionality directly from the p4est library. For example, the neighbor connectivity is created in the mesh constructor using the wrapper read_inp_p4est function.

HOHQMesh boundary information

If present, any additional information in the mesh file that was created by HOHQMesh is prefaced with ** to make it an Abaqus comment. This ensures that the read in of the file by a standard Abaqus file parser, as done in the read_inp_p4est function, is done correctly.

The high-order, curved boundary information and labels of the physical boundary created by HOHQMesh is found below the comment line

** ***** HOHQMesh boundary information ***** **

Next comes the polynomial degree that the mesh will use to represent any curved sides

** mesh polynomial degree = 8

The mesh file then, again, provides the element connectivity as well as information for curved surfaces either interior to the domain or along the physical boundaries. A set of check digits are included directly below the four corner indexes to indicate whether the local surface index (-y, +x, +y, or -x) within the element is straight sided, 0, or is curved, 1. If the local surface is straight sided no additional information is necessary during the mesh file read in. But for any curved surfaces the mesh file provides (x,y,z) coordinate values in order to construct an interpolant of this surface with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes. This list of (x,y,z) data will be given in the direction of the local coordinate system. Given below is the element curvature information for the example mesh:

**  5 1 4 3
+3, 7, 2, 4, 1

Element neighbor connectivity

The construction of the element neighbor ids and identifying physical boundary surfaces is done using functionality directly from the p4est library. For example, the neighbor connectivity is created in the mesh constructor using the wrapper read_inp_p4est function.

Encoding of boundaries

HOHQMesh boundary information

If present, any additional information in the mesh file that was created by HOHQMesh is prefaced with ** to make it an Abaqus comment. This ensures that the read in of the file by a standard Abaqus file parser, as done in the read_inp_p4est function, is done correctly.

The high-order, curved boundary information and labels of the physical boundary created by HOHQMesh is found below the comment line

** ***** HOHQMesh boundary information ***** **

Next comes the polynomial degree that the mesh will use to represent any curved sides

** mesh polynomial degree = 8

The mesh file then, again, provides the element connectivity as well as information for curved surfaces either interior to the domain or along the physical boundaries. A set of check digits are included directly below the four corner indexes to indicate whether the local surface index (-y, +x, +y, or -x) within the element is straight sided, 0, or is curved, 1. If the local surface is straight sided no additional information is necessary during the mesh file read in. But for any curved surfaces the mesh file provides (x,y,z) coordinate values in order to construct an interpolant of this surface with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes. This list of (x,y,z) data will be given in the direction of the local coordinate system. Given below is the element curvature information for the example mesh:

**  5 1 4 3
 **  0 0 1 1
 **   1.000000000000000   1.000000000000000   0.0
 **   1.024948365654583   0.934461926834452   0.0
@@ -95,7 +95,10 @@
 **  0 0 0 0
 **  Bezier --- Slant ---
 **  --- Right --- Top
-**  Bottom --- Right ---

Mesh in three spatial dimensions

The 3D Abaqus file format with high-order boundary information from HOHQMesh is very similar to the 2D version discussed above. There are only three changes:

  1. The element connectivity would be given in terms of the eight corners that define a hexahedron. The corners are numbered as shown in the figure below. The header of the element list changes to be
    *ELEMENT, type=C3D8, ELSET=Volume1
    where C3D8 corresponds to a Abaqus hexahedral element.
  2. There are six check digits included directly below the eight corner indexes to indicate whether the local face within the element is straight sided, 0, or is curved, 1. For curved faces (x,y,z) coordinate values are available in order to construct an face interpolant with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes.
  3. The boundary labels are given in the following order according to the local surface index -x +x -y +y -z +z as required by the p4est library.

For completeness, we also give a short description and derivation of the three-dimensional transfinite mapping formulas used to compute the physical coordinates $\mathbf{x}=(x,y,z)$ of a (possibly curved) hexahedral element give the reference coordinates $\boldsymbol{\xi} = (\xi, \eta, \zeta)$ which lie in $[-1,1]^3$. That is, we will create an expression $\mathbf{x}= \mathbf{X}(\boldsymbol{\xi})$.

Below we provide a sketch of a single hexahedral element with curved faces. This is done to introduce the numbering conventions for corners, edges, and faces of the element.

abaqus-3dmesh-docs

When the hexahedron is a straight sided (linear) element we compute the transfinite mapping directly from the element corner points according to

\[\begin{aligned} +** Bottom --- Right ---

Standard Abaqus format boundary information

As an alternative to an Abaqus mesh generated by HOHQMesh, .inp files with boundary information encoded as nodesets *NSET,NSET= can be used to construct a p4est mesh. This is especially useful for usage of existing meshes (consisting of bilinear elements) which could stem from the popular gmsh meshing software.

In addition to the list of nodes and elements given above, there are nodesets of the form

*NSET,NSET=PhysicalLine1
+1, 4, 52, 53, 54, 55, 56, 57, 58, 

present which are used to associate the edges defined through their corner nodes with a label. In this case it is called PhysicalLine1. By looping over every element and its associated edges, consisting of two nodes, we query the read in NSETs if the current node pair is present.

To prevent that every nodeset following *NSET,NSET= is treated as a boundary, the user must supply a boundary_symbols keyword to the P4estMesh constructor:

boundary_symbols = [:PhysicalLine1]
+
+mesh = P4estMesh{2}(mesh_file, polydeg = polydeg, boundary_symbols = boundary_symbols)

By doing so, only nodesets with a label present in boundary_symbols are treated as physical boundaries. Other nodesets that could be used for diagnostics are not treated as external boundaries. Note that there is a leading colon : compared to the label in the .inp mesh file. This is required to turn the label into a Symbol.

A 2D example for this mesh, which is read-in for an unstructured mesh file created with gmsh, is presented in examples/p4est_2d_dgsem/elixir_euler_NACA6412airfoil_mach2.jl.

Mesh in three spatial dimensions

HOHQMesh-Extended Abaqus format

The 3D Abaqus file format with high-order boundary information from HOHQMesh is very similar to the 2D version discussed above. There are only three changes:

  1. The element connectivity would be given in terms of the eight corners that define a hexahedron. The corners are numbered as shown in the figure below. The header of the element list changes to be
    *ELEMENT, type=C3D8, ELSET=Volume1
    where C3D8 corresponds to a Abaqus hexahedral element.
  2. There are six check digits included directly below the eight corner indexes to indicate whether the local face within the element is straight sided, 0, or is curved, 1. For curved faces (x,y,z) coordinate values are available in order to construct an face interpolant with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes.
  3. The boundary labels are given in the following order according to the local surface index -x +x -y +y -z +z as required by the p4est library.

For completeness, we also give a short description and derivation of the three-dimensional transfinite mapping formulas used to compute the physical coordinates $\mathbf{x}=(x,y,z)$ of a (possibly curved) hexahedral element give the reference coordinates $\boldsymbol{\xi} = (\xi, \eta, \zeta)$ which lie in $[-1,1]^3$. That is, we will create an expression $\mathbf{x}= \mathbf{X}(\boldsymbol{\xi})$.

Below we provide a sketch of a single hexahedral element with curved faces. This is done to introduce the numbering conventions for corners, edges, and faces of the element.

abaqus-3dmesh-docs

When the hexahedron is a straight sided (linear) element we compute the transfinite mapping directly from the element corner points according to

\[\begin{aligned} \mathbf{X}_{linear}(\boldsymbol{\xi}) &= \frac{1}{8}[\quad\, \mathbf{x}_1(1-\xi)(1-\eta)(1-\zeta) + \mathbf{x}_2(1+\xi)(1-\eta)(1-\zeta)\\[-0.15cm] & \qquad\; + \mathbf{x}_3(1+\xi)(1+\eta)(1-\zeta) @@ -133,4 +136,213 @@ & \qquad\; + (1-\xi)(1+\zeta)\texttt{edge}_{12}\quad]. \end{aligned}\]

However, subtracting the edge correction terms $\mathcal{C}_{\texttt{edge}}(\boldsymbol{\xi})$ from $\boldsymbol\Sigma(\boldsymbol{\xi})$ removes the interior element contributions twice. Thus, to complete the construction of the transfinite mapping $\mathbf{X}(\boldsymbol{\xi})$ we add the transfinite map of the straight sided hexahedral element to find

\[\mathbf{X}(\boldsymbol{\xi}) = \boldsymbol\Sigma(\boldsymbol{\xi}) - \mathcal{C}_{\texttt{edge}}(\boldsymbol{\xi}) - + \mathbf{X}_{linear}(\boldsymbol{\xi}).\]

+ + \mathbf{X}_{linear}(\boldsymbol{\xi}).\]

Construction from standard Abaqus

Also for a mesh in standard Abaqus format there are no qualitative changes when going from 2D to 3D. The most notable difference is that boundaries are formed in 3D by faces defined by four nodes while in 2D boundaries are edges consisting of two elements. A simple mesh file, which is used also in examples/p4est_3d_dgsem/elixir_euler_free_stream_boundaries.jl, is given below:

*Heading
+<SOMETHING DIFFERENT FROM "File created by HOHQMesh">
+*NODE
+1, -2, 0, 0
+2, -1, 0, 0
+3, -1, 1, 0
+4, -2, 1, 0
+5, -2, 0, 1
+6, -1, 0, 1
+7, -1, 1, 1
+8, -2, 1, 1
+9, -1.75, 1, 0
+10, -1.5, 1, 0
+11, -1.25, 1, 0
+12, -1, 0.75000000000035, 0
+13, -1, 0.50000000000206, 0
+14, -1, 0.25000000000104, 0
+15, -1.25, 0, 0
+16, -1.5, 0, 0
+17, -1.75, 0, 0
+18, -2, 0.24999999999941, 0
+19, -2, 0.49999999999869, 0
+20, -2, 0.74999999999934, 0
+21, -1.75, 0, 1
+22, -1.5, 0, 1
+23, -1.25, 0, 1
+24, -1, 0.24999999999941, 1
+25, -1, 0.49999999999869, 1
+26, -1, 0.74999999999934, 1
+27, -1.25, 1, 1
+28, -1.5, 1, 1
+29, -1.75, 1, 1
+30, -2, 0.75000000000035, 1
+31, -2, 0.50000000000206, 1
+32, -2, 0.25000000000104, 1
+33, -2, 0, 0.24999999999941
+34, -2, 0, 0.49999999999869
+35, -2, 0, 0.74999999999934
+36, -2, 1, 0.24999999999941
+37, -2, 1, 0.49999999999869
+38, -2, 1, 0.74999999999934
+39, -1, 0, 0.24999999999941
+40, -1, 0, 0.49999999999869
+41, -1, 0, 0.74999999999934
+42, -1, 1, 0.24999999999941
+43, -1, 1, 0.49999999999869
+44, -1, 1, 0.74999999999934
+45, -1.25, 0.25000000000063, 0
+46, -1.25, 0.50000000000122, 0
+47, -1.25, 0.7500000000001, 0
+48, -1.5, 0.25000000000023, 0
+49, -1.5, 0.50000000000038, 0
+50, -1.5, 0.74999999999984, 0
+51, -1.75, 0.24999999999982, 0
+52, -1.75, 0.49999999999953, 0
+53, -1.75, 0.74999999999959, 0
+54, -1.75, 0.25000000000063, 1
+55, -1.75, 0.50000000000122, 1
+56, -1.75, 0.7500000000001, 1
+57, -1.5, 0.25000000000023, 1
+58, -1.5, 0.50000000000038, 1
+59, -1.5, 0.74999999999984, 1
+60, -1.25, 0.24999999999982, 1
+61, -1.25, 0.49999999999953, 1
+62, -1.25, 0.74999999999959, 1
+63, -2, 0.24999999999982, 0.24999999999941
+64, -2, 0.49999999999953, 0.24999999999941
+65, -2, 0.74999999999959, 0.24999999999941
+66, -2, 0.25000000000023, 0.49999999999869
+67, -2, 0.50000000000038, 0.49999999999869
+68, -2, 0.74999999999984, 0.49999999999869
+69, -2, 0.25000000000063, 0.74999999999934
+70, -2, 0.50000000000122, 0.74999999999934
+71, -2, 0.7500000000001, 0.74999999999934
+72, -1.25, 1, 0.74999999999934
+73, -1.25, 1, 0.49999999999869
+74, -1.25, 1, 0.24999999999941
+75, -1.5, 1, 0.74999999999934
+76, -1.5, 1, 0.49999999999869
+77, -1.5, 1, 0.24999999999941
+78, -1.75, 1, 0.74999999999934
+79, -1.75, 1, 0.49999999999869
+80, -1.75, 1, 0.24999999999941
+81, -1, 0.25000000000063, 0.24999999999941
+82, -1, 0.50000000000122, 0.24999999999941
+83, -1, 0.7500000000001, 0.24999999999941
+84, -1, 0.25000000000023, 0.49999999999869
+85, -1, 0.50000000000038, 0.49999999999869
+86, -1, 0.74999999999984, 0.49999999999869
+87, -1, 0.24999999999982, 0.74999999999934
+88, -1, 0.49999999999953, 0.74999999999934
+89, -1, 0.74999999999959, 0.74999999999934
+90, -1.75, 0, 0.74999999999934
+91, -1.75, 0, 0.49999999999869
+92, -1.75, 0, 0.24999999999941
+93, -1.5, 0, 0.74999999999934
+94, -1.5, 0, 0.49999999999869
+95, -1.5, 0, 0.24999999999941
+96, -1.25, 0, 0.74999999999934
+97, -1.25, 0, 0.49999999999869
+98, -1.25, 0, 0.24999999999941
+99, -1.75, 0.25000000000043, 0.74999999999934
+100, -1.75, 0.25000000000023, 0.49999999999869
+101, -1.75, 0.25000000000002, 0.24999999999941
+102, -1.75, 0.5000000000008, 0.74999999999934
+103, -1.75, 0.50000000000038, 0.49999999999869
+104, -1.75, 0.49999999999995, 0.24999999999941
+105, -1.75, 0.74999999999997, 0.74999999999934
+106, -1.75, 0.74999999999984, 0.49999999999869
+107, -1.75, 0.74999999999972, 0.24999999999941
+108, -1.5, 0.25000000000023, 0.74999999999934
+109, -1.5, 0.25000000000023, 0.49999999999869
+110, -1.5, 0.25000000000023, 0.24999999999941
+111, -1.5, 0.50000000000038, 0.74999999999934
+112, -1.5, 0.50000000000038, 0.49999999999869
+113, -1.5, 0.50000000000038, 0.24999999999941
+114, -1.5, 0.74999999999984, 0.74999999999934
+115, -1.5, 0.74999999999984, 0.49999999999869
+116, -1.5, 0.74999999999984, 0.24999999999941
+117, -1.25, 0.25000000000002, 0.74999999999934
+118, -1.25, 0.25000000000023, 0.49999999999869
+119, -1.25, 0.25000000000043, 0.24999999999941
+120, -1.25, 0.49999999999995, 0.74999999999934
+121, -1.25, 0.50000000000038, 0.49999999999869
+122, -1.25, 0.5000000000008, 0.24999999999941
+123, -1.25, 0.74999999999972, 0.74999999999934
+124, -1.25, 0.74999999999984, 0.49999999999869
+125, -1.25, 0.74999999999997, 0.24999999999941
+******* E L E M E N T S *************
+*ELEMENT, type=C3D8, ELSET=Volume1
+153, 54, 21, 5, 32, 99, 90, 35, 69
+154, 99, 90, 35, 69, 100, 91, 34, 66
+155, 100, 91, 34, 66, 101, 92, 33, 63
+156, 101, 92, 33, 63, 51, 17, 1, 18
+157, 55, 54, 32, 31, 102, 99, 69, 70
+158, 102, 99, 69, 70, 103, 100, 66, 67
+159, 103, 100, 66, 67, 104, 101, 63, 64
+160, 104, 101, 63, 64, 52, 51, 18, 19
+161, 56, 55, 31, 30, 105, 102, 70, 71
+162, 105, 102, 70, 71, 106, 103, 67, 68
+163, 106, 103, 67, 68, 107, 104, 64, 65
+164, 107, 104, 64, 65, 53, 52, 19, 20
+165, 29, 56, 30, 8, 78, 105, 71, 38
+166, 78, 105, 71, 38, 79, 106, 68, 37
+167, 79, 106, 68, 37, 80, 107, 65, 36
+168, 80, 107, 65, 36, 9, 53, 20, 4
+169, 57, 22, 21, 54, 108, 93, 90, 99
+170, 108, 93, 90, 99, 109, 94, 91, 100
+171, 109, 94, 91, 100, 110, 95, 92, 101
+172, 110, 95, 92, 101, 48, 16, 17, 51
+173, 58, 57, 54, 55, 111, 108, 99, 102
+174, 111, 108, 99, 102, 112, 109, 100, 103
+175, 112, 109, 100, 103, 113, 110, 101, 104
+176, 113, 110, 101, 104, 49, 48, 51, 52
+177, 59, 58, 55, 56, 114, 111, 102, 105
+178, 114, 111, 102, 105, 115, 112, 103, 106
+179, 115, 112, 103, 106, 116, 113, 104, 107
+180, 116, 113, 104, 107, 50, 49, 52, 53
+181, 28, 59, 56, 29, 75, 114, 105, 78
+182, 75, 114, 105, 78, 76, 115, 106, 79
+183, 76, 115, 106, 79, 77, 116, 107, 80
+184, 77, 116, 107, 80, 10, 50, 53, 9
+185, 60, 23, 22, 57, 117, 96, 93, 108
+186, 117, 96, 93, 108, 118, 97, 94, 109
+187, 118, 97, 94, 109, 119, 98, 95, 110
+188, 119, 98, 95, 110, 45, 15, 16, 48
+189, 61, 60, 57, 58, 120, 117, 108, 111
+190, 120, 117, 108, 111, 121, 118, 109, 112
+191, 121, 118, 109, 112, 122, 119, 110, 113
+192, 122, 119, 110, 113, 46, 45, 48, 49
+193, 62, 61, 58, 59, 123, 120, 111, 114
+194, 123, 120, 111, 114, 124, 121, 112, 115
+195, 124, 121, 112, 115, 125, 122, 113, 116
+196, 125, 122, 113, 116, 47, 46, 49, 50
+197, 27, 62, 59, 28, 72, 123, 114, 75
+198, 72, 123, 114, 75, 73, 124, 115, 76
+199, 73, 124, 115, 76, 74, 125, 116, 77
+200, 74, 125, 116, 77, 11, 47, 50, 10
+201, 24, 6, 23, 60, 87, 41, 96, 117
+202, 87, 41, 96, 117, 84, 40, 97, 118
+203, 84, 40, 97, 118, 81, 39, 98, 119
+204, 81, 39, 98, 119, 14, 2, 15, 45
+205, 25, 24, 60, 61, 88, 87, 117, 120
+206, 88, 87, 117, 120, 85, 84, 118, 121
+207, 85, 84, 118, 121, 82, 81, 119, 122
+208, 82, 81, 119, 122, 13, 14, 45, 46
+209, 26, 25, 61, 62, 89, 88, 120, 123
+210, 89, 88, 120, 123, 86, 85, 121, 124
+211, 86, 85, 121, 124, 83, 82, 122, 125
+212, 83, 82, 122, 125, 12, 13, 46, 47
+213, 7, 26, 62, 27, 44, 89, 123, 72
+214, 44, 89, 123, 72, 43, 86, 124, 73
+215, 43, 86, 124, 73, 42, 83, 125, 74
+216, 42, 83, 125, 74, 3, 12, 47, 11
+*NSET,NSET=PhysicalSurface1
+1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
+11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
+21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
+31, 32, 33, 34, 35, 36, 37, 38, 45, 46, 
+47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 
+57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 
+67, 68, 69, 70, 71, 
+*NSET,NSET=PhysicalSurface2
+1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
+11, 12, 13, 14, 15, 16, 17, 21, 22, 23, 
+24, 25, 26, 27, 28, 29, 33, 34, 35, 36, 
+37, 38, 39, 40, 41, 42, 43, 44, 72, 73, 
+74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 
+84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 
+94, 95, 96, 97, 98, 
diff --git a/previews/PR1624/meshes/structured_mesh/index.html b/previews/PR1624/meshes/structured_mesh/index.html index 8fca2d48d6e..05c09800044 100644 --- a/previews/PR1624/meshes/structured_mesh/index.html +++ b/previews/PR1624/meshes/structured_mesh/index.html @@ -1,2 +1,2 @@ -Structured mesh · Trixi.jl

Structured mesh

The StructuredMesh is a structured, curvilinear, conforming mesh type available for one-, two-, and three-dimensional simulations.

Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.

+Structured mesh · Trixi.jl

Structured mesh

The StructuredMesh is a structured, curvilinear, conforming mesh type available for one-, two-, and three-dimensional simulations.

Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.

diff --git a/previews/PR1624/meshes/tree_mesh/index.html b/previews/PR1624/meshes/tree_mesh/index.html index 47e701c1a7b..280d85d4a1a 100644 --- a/previews/PR1624/meshes/tree_mesh/index.html +++ b/previews/PR1624/meshes/tree_mesh/index.html @@ -1,2 +1,2 @@ -Tree mesh · Trixi.jl

Tree mesh

The TreeMesh is a Cartesian, $h$-non-conforming mesh type used in many parts of Trixi.jl. Often, the support for this mesh type is developed best since it was the first mesh type in Trixi.jl, and it is available in one, two, and three space dimensions.

It is limited to hypercube domains but supports AMR via the AMRCallback. Due to its Cartesian nature, (numerical) fluxes need to implement methods dispatching on the orientation::Integer as described in the conventions.

+Tree mesh · Trixi.jl

Tree mesh

The TreeMesh is a Cartesian, $h$-non-conforming mesh type used in many parts of Trixi.jl. Often, the support for this mesh type is developed best since it was the first mesh type in Trixi.jl, and it is available in one, two, and three space dimensions.

It is limited to hypercube domains but supports AMR via the AMRCallback. Due to its Cartesian nature, (numerical) fluxes need to implement methods dispatching on the orientation::Integer as described in the conventions.

diff --git a/previews/PR1624/meshes/unstructured_quad_mesh/index.html b/previews/PR1624/meshes/unstructured_quad_mesh/index.html index a769ffb128c..82b589dcfc6 100644 --- a/previews/PR1624/meshes/unstructured_quad_mesh/index.html +++ b/previews/PR1624/meshes/unstructured_quad_mesh/index.html @@ -1,5 +1,5 @@ -Unstructured mesh · Trixi.jl

Unstructured quadrilateral mesh

The UnstructuredMesh2D is an unstructured, curvilinear, conforming mesh type in two space dimensions.

Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.

Next, we describe the conventions taken in the implementation for two-dimensional unstructured quadrilateral meshes. Principally, this relates to how a file with the extension .mesh encodes information about the numbering and orientation of elements in an unstructured quadrilateral mesh with possibly curved boundaries.

We use the following unstructured mesh with three elements for this discussion:

example-mesh

Further, a simulation using Trixi.jl on this example unstructured mesh is provided in examples/unstructured_2d_dgsem/elixir_euler_basic.jl.

Mesh file header

The first two lines of the mesh file lists the mesh file type as well as the total number of corners, surfaces, elements, and the polynomial degree that the mesh will use to represent any curved sides. For the example mesh these quantities are

ISM-V2
+Unstructured mesh · Trixi.jl

Unstructured quadrilateral mesh

The UnstructuredMesh2D is an unstructured, curvilinear, conforming mesh type in two space dimensions.

Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.

Next, we describe the conventions taken in the implementation for two-dimensional unstructured quadrilateral meshes. Principally, this relates to how a file with the extension .mesh encodes information about the numbering and orientation of elements in an unstructured quadrilateral mesh with possibly curved boundaries.

We use the following unstructured mesh with three elements for this discussion:

example-mesh

Further, a simulation using Trixi.jl on this example unstructured mesh is provided in examples/unstructured_2d_dgsem/elixir_euler_basic.jl.

Mesh file header

The first two lines of the mesh file lists the mesh file type as well as the total number of corners, surfaces, elements, and the polynomial degree that the mesh will use to represent any curved sides. For the example mesh these quantities are

ISM-V2
     7    9    3    8

corresponding to seven corners, nine surfaces, and three elements. The mesh polynomial degree of eight is taken only for illustrative purposes. In practice, this mesh polynomial degree depends on the particular application for which the curved, unstructured mesh is required.

List of corner nodes

After these global counts that prescribe information about the mesh skeleton, the mesh file give a list of the physical (x,y) coordinates of all the corners. The corner nodes are listed in the order prescribed by mesh generator. Thus, for the example mesh this node list would be

 1.0    -1.0
  3.0    0.0
  1.0    1.0
@@ -76,4 +76,4 @@
   * Upload to YouTube
   * Obtain responsive code by inserting link on https://embedresponsively.com
   -->
-  
+
diff --git a/previews/PR1624/multi-physics_coupling/index.html b/previews/PR1624/multi-physics_coupling/index.html new file mode 100644 index 00000000000..74b8600a116 --- /dev/null +++ b/previews/PR1624/multi-physics_coupling/index.html @@ -0,0 +1,2 @@ + +Coupling · Trixi.jl

Multi-physics coupling

A complex simulation can consist of different spatial domains in which different equations are being solved, different numerical methods being used or the grid structure is different. One example would be a fluid in a tank and an extended hot plate attached to it. We would then like to solve the Navier-Stokes equations in the fluid domain and the heat conduction equations in the plate. The coupling would happen at the interface through the exchange of thermal energy.

Converter coupling

It may happen that the two systems to be coupled do not share any variables, but share some of the physics. In such a situation, the same physics is just represented in a different form and with a different set of variables. This is the case, for instance assuming two domains, if there is a fluid system in one domain and a Vlasov system in the other domain. In that case we would have variables representing distribution functions of the Vlasov system on one side and variables representing the mechanical quantities, like density, of the fluid system. To translate the fields from one description to the other one needs to use converter functions. These functions need to be hand tailored by the user in the elixir file where each pair of coupled systems requires two coupling functions, one for each direction.

In the general case, we have a system $A$ with $m$ variables $u_{A,i}, \: i = 1, \dots, m$ and another system $B$ with $n$ variables $u_{B,j}, \: j = 1, \dots, n$. We then define two coupling functions, one that transforms $u_A$ into $u_B$ and one that goes the other way.

In their minimal form they take the position vector $x$, state vector $u$ and the equations of the two coupled systems and return the transformed variables. By passing the equations we can make use of their parameters, if they are required. Examples can be seen in examples/structured_2d_dgsem/elixir_advection_coupled.jl.

Warning about binary compatibility

Currently the coordinate values on the nodes can differ by machine precision when simulating the mesh and when splitting the mesh in multiple domains. This is an issue coming from the coordinate interpolation on the nodes. As a result, running a simulation in a single system and in two coupled domains may result in a difference of the order of the machine precision. While this is not an issue for most practical problems, it is best to keep this in mind when comparing test runs.

diff --git a/previews/PR1624/overview/index.html b/previews/PR1624/overview/index.html index ee1d547a0e1..f27c1e5dd0d 100644 --- a/previews/PR1624/overview/index.html +++ b/previews/PR1624/overview/index.html @@ -1,2 +1,2 @@ -Overview · Trixi.jl

Overview of the structure of Trixi.jl

Trixi.jl is designed as a library of components for discretizations of hyperbolic conservation laws. Thus, it is not a monolithic PDE solver that is configured at runtime via parameter files, as it is often found in classical numerical simulation codes. Instead, each simulation is configured by pure Julia code. Many examples of such simulation setups, called elixirs in Trixi.jl, are provided in the examples/ folder.

Trixi.jl uses the method of lines, i.e., the full space-time discretization is separated into two steps; the spatial semidiscretization is performed at first and the resulting ODE system is solved numerically using a suitable time integration method. Thus, the main ingredients of an elixir designed to solve a PDE numerically are the spatial semidiscretization and the time integration scheme.

Semidiscretizations

Semidiscretizations are high-level descriptions of spatial discretizations specialized for certain PDEs. Trixi.jl's main focus is on hyperbolic conservation laws represented in a SemidiscretizationHyperbolic. Such semidiscretizations are usually named semi in Trixi.jl

semidiscretization_overview

The basic building blocks of a semidiscretization are

  • a mesh describing the geometry of the domain
  • a set of equations describing the physical model
  • a solver describing the numerical approach

In addition, a semidiscretization bundles initial and boundary conditions, and possible source terms. These different ingredients of a semidiscretization can be configured individually and combined together. When a semidiscretization is constructed, it will create an internal cache, i.e., a collection of setup-specific data structures, that is usually passed to all lower level functions.

Due to Trixi.jl's modular nature using Julia's multiple dispatch features, new ingredients can be created specifically for a certain combination of other ingredients. For example, a new mesh type can be created and implemented at first only for a specific solver. Thus, there is no need to consider all possible combinations of meshes, equations, and solvers when implementing new features. This allows rapid prototyping of new ideas and is one of the main design goals behind Trixi.jl. Below is a brief overview of the availability of different features on different mesh types.

FeatureTreeMeshStructuredMeshUnstructuredMesh2DP4estMeshDGMultiMeshFurther reading
Spatial dimension1D, 2D, 3D1D, 2D, 3D2D2D, 3D1D, 2D, 3D
CoordinatesCartesiancurvilinearcurvilinearcurvilinearcurvilinear
Connectivityh-nonconformingconformingconformingh-nonconformingconforming
Element typeline, square, cubeline, quadᵃ, hexᵃquadᵃquadᵃ, hexᵃsimplex, quadᵃ, hexᵃ
Adaptive mesh refinementAMRCallback
Solver typeDGSEMDGSEMDGSEMDGSEMDGMulti
Domainhypercubemapped hypercubearbitraryarbitraryarbitrary
Weak formVolumeIntegralWeakForm
Flux differencingVolumeIntegralFluxDifferencing
Shock capturingVolumeIntegralShockCapturingHG
Nonconservative equationse.g., GLM MHD or shallow water equations
Parabolic termse.g., CompressibleNavierStokesDiffusion2D

ᵃ: quad = quadrilateral, hex = hexahedron

Time integration methods

Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, a spatial semidiscretization can be wrapped in an ODE problem using semidiscretize, which returns an ODEProblem. This ODEProblem is a wrapper of Trixi.rhs!(du_ode, u_ode, semi, t), which gets called in ODE solvers. Further information can be found in the section on time integration methods.

Next steps

We explicitly encourage people interested in Trixi.jl to have a look at the examples/ bundled with Trixi.jl to get an impression of what is possible and the general look and feel of Trixi.jl. Before doing that, it is usually good to get an idea of how to visualize numerical results.

If you like learning by doing, looking at the tutorials and trying to mix your own elixirs based thereon is probably a good next step. Otherwise, you can further dig into the documentation by looking at Trixi.jl's basic building blocks.

+Overview · Trixi.jl

Overview of the structure of Trixi.jl

Trixi.jl is designed as a library of components for discretizations of hyperbolic conservation laws. Thus, it is not a monolithic PDE solver that is configured at runtime via parameter files, as it is often found in classical numerical simulation codes. Instead, each simulation is configured by pure Julia code. Many examples of such simulation setups, called elixirs in Trixi.jl, are provided in the examples/ folder.

Trixi.jl uses the method of lines, i.e., the full space-time discretization is separated into two steps; the spatial semidiscretization is performed at first and the resulting ODE system is solved numerically using a suitable time integration method. Thus, the main ingredients of an elixir designed to solve a PDE numerically are the spatial semidiscretization and the time integration scheme.

Semidiscretizations

Semidiscretizations are high-level descriptions of spatial discretizations specialized for certain PDEs. Trixi.jl's main focus is on hyperbolic conservation laws represented in a SemidiscretizationHyperbolic. Such semidiscretizations are usually named semi in Trixi.jl

semidiscretization_overview

The basic building blocks of a semidiscretization are

  • a mesh describing the geometry of the domain
  • a set of equations describing the physical model
  • a solver describing the numerical approach

In addition, a semidiscretization bundles initial and boundary conditions, and possible source terms. These different ingredients of a semidiscretization can be configured individually and combined together. When a semidiscretization is constructed, it will create an internal cache, i.e., a collection of setup-specific data structures, that is usually passed to all lower level functions.

Due to Trixi.jl's modular nature using Julia's multiple dispatch features, new ingredients can be created specifically for a certain combination of other ingredients. For example, a new mesh type can be created and implemented at first only for a specific solver. Thus, there is no need to consider all possible combinations of meshes, equations, and solvers when implementing new features. This allows rapid prototyping of new ideas and is one of the main design goals behind Trixi.jl. Below is a brief overview of the availability of different features on different mesh types.

FeatureTreeMeshStructuredMeshUnstructuredMesh2DP4estMeshDGMultiMeshFurther reading
Spatial dimension1D, 2D, 3D1D, 2D, 3D2D2D, 3D1D, 2D, 3D
CoordinatesCartesiancurvilinearcurvilinearcurvilinearcurvilinear
Connectivityh-nonconformingconformingconformingh-nonconformingconforming
Element typeline, square, cubeline, quadᵃ, hexᵃquadᵃquadᵃ, hexᵃsimplex, quadᵃ, hexᵃ
Adaptive mesh refinementAMRCallback
Solver typeDGSEMDGSEMDGSEMDGSEMDGMulti
Domainhypercubemapped hypercubearbitraryarbitraryarbitrary
Weak formVolumeIntegralWeakForm
Flux differencingVolumeIntegralFluxDifferencing
Shock capturingVolumeIntegralShockCapturingHG
Nonconservative equationse.g., GLM MHD or shallow water equations
Parabolic termse.g., CompressibleNavierStokesDiffusion2D

ᵃ: quad = quadrilateral, hex = hexahedron

Time integration methods

Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, a spatial semidiscretization can be wrapped in an ODE problem using semidiscretize, which returns an ODEProblem. This ODEProblem is a wrapper of Trixi.rhs!(du_ode, u_ode, semi, t), which gets called in ODE solvers. Further information can be found in the section on time integration methods.

Next steps

We explicitly encourage people interested in Trixi.jl to have a look at the examples/ bundled with Trixi.jl to get an impression of what is possible and the general look and feel of Trixi.jl. Before doing that, it is usually good to get an idea of how to visualize numerical results.

If you like learning by doing, looking at the tutorials and trying to mix your own elixirs based thereon is probably a good next step. Otherwise, you can further dig into the documentation by looking at Trixi.jl's basic building blocks.

diff --git a/previews/PR1624/parallelization/index.html b/previews/PR1624/parallelization/index.html index 519118a1dd9..168d250a478 100644 --- a/previews/PR1624/parallelization/index.html +++ b/previews/PR1624/parallelization/index.html @@ -1,5 +1,5 @@ -Parallelization · Trixi.jl

Parallelization

Shared-memory parallelization with threads

Many compute-intensive loops in Trixi.jl are parallelized using the multi-threading support provided by Julia. You can recognize those loops by the @threaded macro prefixed to them, e.g.,

@threaded for element in eachelement(dg, cache)
+Parallelization · Trixi.jl

Parallelization

Shared-memory parallelization with threads

Many compute-intensive loops in Trixi.jl are parallelized using the multi-threading support provided by Julia. You can recognize those loops by the @threaded macro prefixed to them, e.g.,

@threaded for element in eachelement(dg, cache)
   ...
 end

This will statically assign an equal iteration count to each available thread.

To use multi-threading, you need to tell Julia at startup how many threads you want to use by either setting the environment variable JULIA_NUM_THREADS or by providing the -t/--threads command line argument. For example, to start Julia with four threads, start Julia with

julia --threads=4

If both the environment variable and the command line argument are specified at the same time, the latter takes precedence.

If you use time integration methods from OrdinaryDiffEq.jl and want to use multiple threads therein, you need to set the keyword argument thread=OrdinaryDiffEq.True() of the algorithms, as described in the section on time integration methods.

Warning

Not everything is parallelized yet and there are likely opportunities to improve scalability. Multi-threading isn't considered part of the public API of Trixi.jl yet.

Distributed computing with MPI

In addition to the shared memory parallelization with multi-threading, Trixi.jl supports distributed parallelism via MPI.jl, which leverages the Message Passing Interface (MPI). MPI.jl comes with its own MPI library binaries such that there is no need to install MPI yourself. However, it is also possible to instead use an existing MPI installation, which is recommended if you are running MPI programs on a cluster or supercomputer (see the MPI.jl docs to find out how to select the employed MPI library). Additional notes on how to use a system-provided MPI installation with Trixi.jl can be found in the following subsection.

Work in progress

MPI-based parallelization is work in progress and not finished yet. Nothing related to MPI is part of the official API of Trixi.jl yet.

Using a system-provided MPI installation

When using Trixi.jl with a system-provided MPI backend, the underlying p4est, t8code and HDF5 libraries need to be compiled with the same MPI installation. If you want to use p4est (via the P4estMesh) or t8code (via the T8codeMesh) from Trixi.jl, you also need to use system-provided p4est or t8code installations (for notes on how to install p4est and t8code see, e.g., here and here, use the configure option --enable-mpi). Otherwise, there will be warnings that no preference is set for P4est.jl and T8code.jl that can be ignored if you do not use these libraries from Trixi.jl. Note that t8code already comes with a p4est installation, so it suffices to install t8code. In order to use system-provided p4est and t8code installations, P4est.jl and T8code.jl need to be configured to use the custom installations. Follow the steps described here and here for the configuration. The paths that point to libp4est.so (and potentially to libsc.so) need to be the same for P4est.jl and T8code.jl. This could, e.g., be libp4est.so that usually can be found in lib/ or local/lib/ in the installation directory of t8code. Note that the T8codeMesh, however, does not support MPI yet. The preferences for HDF5.jl always need to be set, even if you do not want to use HDF5 from Trixi.jl, see also issue #1079 in HDF5.jl. To set the preferences for HDF5.jl, follow the instructions described here.

In total, in your active Julia project you should have a LocalPreferences.toml file with sections [MPIPreferences], [T8code] (only needed if T8codeMesh is used), [P4est] (only needed if P4estMesh is used), and [HDF5] as well as an entry MPIPreferences in your Project.toml to use a custom MPI installation. A LocalPreferences.toml file created as described above might look something like the following:

[HDF5]
 libhdf5 = "/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so"
@@ -44,4 +44,4 @@
            UUID("f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"), # UUID of HDF5.jl
            "libhdf5" => "/path/to/your/libhdf5.so",
            "libhdf5_hl" => "/path/to/your/libhdf5_hl.so", force = true)

Alternatively, with HDF5.jl v0.17.1 or higher you can use

julia> using HDF5
-julia> HDF5.API.set_libraries!("/path/to/your/libhdf5.so", "/path/to/your/libhdf5_hl.so")

For more information see also the documentation of HDF5.jl. In total, you should have a file called LocalPreferences.toml in the project directory that contains a section [MPIPreferences], a section [HDF5] with entries libhdf5 and libhdf5_hl, a section [P4est] with the entry libp4est as well as a section [T8code] with the entries libt8, libp4est and libsc. If you use HDF5.jl v0.16 or older, instead of setting the preferences for HDF5.jl, you need to set the environment variable JULIA_HDF5_PATH to the path, where the HDF5 binaries are located and then call ]build HDF5 from Julia.

If HDF5 is not MPI-enabled, Trixi.jl will fall back on a less efficient I/O mechanism. In that case, all disk I/O is performed only on rank zero and data is distributed to/gathered from the other ranks using regular MPI communication.

+julia> HDF5.API.set_libraries!("/path/to/your/libhdf5.so", "/path/to/your/libhdf5_hl.so")

For more information see also the documentation of HDF5.jl. In total, you should have a file called LocalPreferences.toml in the project directory that contains a section [MPIPreferences], a section [HDF5] with entries libhdf5 and libhdf5_hl, a section [P4est] with the entry libp4est as well as a section [T8code] with the entries libt8, libp4est and libsc. If you use HDF5.jl v0.16 or older, instead of setting the preferences for HDF5.jl, you need to set the environment variable JULIA_HDF5_PATH to the path, where the HDF5 binaries are located and then call ]build HDF5 from Julia.

If HDF5 is not MPI-enabled, Trixi.jl will fall back on a less efficient I/O mechanism. In that case, all disk I/O is performed only on rank zero and data is distributed to/gathered from the other ranks using regular MPI communication.

diff --git a/previews/PR1624/performance/index.html b/previews/PR1624/performance/index.html index c118ce3cdc6..890b3467579 100644 --- a/previews/PR1624/performance/index.html +++ b/previews/PR1624/performance/index.html @@ -1,5 +1,5 @@ -Performance · Trixi.jl

Performance

Trixi.jl is designed to balance performance and readability. Since Julia provides a lot of zero-cost abstractions, it is often possible to optimize both goals simultaneously.

The usual development workflow in Julia is

  1. Make it work.
  2. Make it nice.
  3. Make it fast.

To achieve the third step, you should be familiar with (at least) the section on performance tips in the Julia manual. Here, we just list some important aspects you should consider when developing Trixi.jl.

  • Consider using @views/view(...) when using array slices, except on the left-side of an assignment (further details).
  • Functions are essentially for free, since they are usually automatically inlined where it makes sense (using @inline can be used as an additional hint to the compiler) (further details).
  • Function barriers can improve performance due to type stability (further details).
  • Look for type instabilities using @code_warntype. Consider using @descend from Cthulhu.jl to investigate deeper call chains.

Manual benchmarking

If you modify some internal parts of Trixi.jl, you should check the impact on performance. Hence, you should at least investigate the performance roughly by comparing the reported timings of several elixirs. Deeper investigations and micro-benchmarks should usually use BenchmarkTools.jl. For example, the following steps were used to benchmark the changes introduced in PR #256.

  1. git checkout e7ebf3846b3fd62ee1d0042e130afb50d7fe8e48 (new version)

  2. Start julia --threads=1 --check-bounds=no.

  3. Execute the following code in the REPL to benchmark the rhs! call at the final state.

    julia> using BenchmarkTools, Revise; using Trixi
    +Performance · Trixi.jl

    Performance

    Trixi.jl is designed to balance performance and readability. Since Julia provides a lot of zero-cost abstractions, it is often possible to optimize both goals simultaneously.

    The usual development workflow in Julia is

    1. Make it work.
    2. Make it nice.
    3. Make it fast.

    To achieve the third step, you should be familiar with (at least) the section on performance tips in the Julia manual. Here, we just list some important aspects you should consider when developing Trixi.jl.

    • Consider using @views/view(...) when using array slices, except on the left-side of an assignment (further details).
    • Functions are essentially for free, since they are usually automatically inlined where it makes sense (using @inline can be used as an additional hint to the compiler) (further details).
    • Function barriers can improve performance due to type stability (further details).
    • Look for type instabilities using @code_warntype. Consider using @descend from Cthulhu.jl to investigate deeper call chains.

    Manual benchmarking

    If you modify some internal parts of Trixi.jl, you should check the impact on performance. Hence, you should at least investigate the performance roughly by comparing the reported timings of several elixirs. Deeper investigations and micro-benchmarks should usually use BenchmarkTools.jl. For example, the following steps were used to benchmark the changes introduced in PR #256.

    1. git checkout e7ebf3846b3fd62ee1d0042e130afb50d7fe8e48 (new version)

    2. Start julia --threads=1 --check-bounds=no.

    3. Execute the following code in the REPL to benchmark the rhs! call at the final state.

      julia> using BenchmarkTools, Revise; using Trixi
       
       julia> trixi_include("examples/2d/elixir_euler_sedov_blast_wave.jl")
       
      @@ -41,7 +41,7 @@
        maximum time:     5.880 ms (0.00% GC)
        --------------
        samples:          1070
      - evals/sample:     1

      Run the @benchmark ... commands multiple times to see whether there are any significant fluctuations.

    Follow these steps for both commits you want to compare. The relevant benchmark results you should typically be looking at are the median and mean values of the runtime and the memory/allocs estimate. In this example, the differences of the runtimes are of the order of the fluctuations one gets when running the benchmarks multiple times. Since the memory/allocs are (roughly) the same, there doesn't seem to be a significant performance regression here.

    You can also make it more detailed by benchmarking only, e.g., the calculation of the volume terms, but whether that's necessary depends on the modifications you made and their (potential) impact.

    Some more detailed description of manual profiling and benchmarking as well as resulting performance improvements of Trixi.jl are given in the following blog posts.

    Automated benchmarking

    We use PkgBenchmark.jl to provide a standard set of benchmarks for Trixi.jl. The relevant benchmark script is benchmark/benchmarks.jl. You can run a standard set of benchmarks via

    julia> using PkgBenchmark, Trixi
    + evals/sample:     1

    Run the @benchmark ... commands multiple times to see whether there are any significant fluctuations.

Follow these steps for both commits you want to compare. The relevant benchmark results you should typically be looking at are the median and mean values of the runtime and the memory/allocs estimate. In this example, the differences of the runtimes are of the order of the fluctuations one gets when running the benchmarks multiple times. Since the memory/allocs are (roughly) the same, there doesn't seem to be a significant performance regression here.

You can also make it more detailed by benchmarking only, e.g., the calculation of the volume terms, but whether that's necessary depends on the modifications you made and their (potential) impact.

Some more detailed description of manual profiling and benchmarking as well as resulting performance improvements of Trixi.jl are given in the following blog posts.

Automated benchmarking

We use PkgBenchmark.jl to provide a standard set of benchmarks for Trixi.jl. The relevant benchmark script is benchmark/benchmarks.jl. To benchmark the changes made in a PR, please proceed as follows:

  1. Check out the latest main branch of your Trixi.jl development repository.
  2. Check out the latest development branch of your PR.
  3. Change your working directory to the benchmark directory of Trixi.jl.
  4. Execute julia run_benchmarks.jl.

This will take some hours to complete and requires at least 8 GiB of RAM. When everything is finished, some output files will be created in the benchmark directory of Trixi.jl.

Warning

Please note that the benchmark scripts use --check-bounds=no at the moment. Thus, they will not work in any useful way for Julia v1.10 (and newer?), see Julia issue #50985.

You can also run a standard set of benchmarks manually via

julia> using PkgBenchmark, Trixi
 
 julia> results = benchmarkpkg(Trixi, BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`))
 
@@ -52,4 +52,4 @@
              BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`, id="main") # baseline
        )
 
-julia> export_markdown(pkgdir(Trixi, "benchmark", "results.md"), results)

By default, the target is the current state of the repository. Remember that you need to be in a clean state (commit or stash your changes) to run this successfully. You can also run this comparison and an additional one using two threads via

julia> include("benchmark/run_benchmarks.jl")

Then, markdown files including the results are saved in benchmark/. This example result was obtained using a GitHub action for the PR #535. Note that GitHub actions run on in the cloud in a virtual machine. Hence, we do not really have control over it and performance results must be taken with a grain of salt. Nevertheless, significant runtime differences and differences of memory allocations should be robust indicators of performance changes.

Runtime performance vs. latency aka using @nospecialize selectively

Usually, Julia will compile specialized versions of each method, using as much information from the types of function arguments as possible (based on some heuristics). The compiler will generate code that is as efficient as comparable code written in a low-level language such as C or Fortran. However, there are cases where the runtime performance does not really matter but the time needed to compile specializations becomes significant. This is related to latency or the time-to-first-plot problem, well-known in the Julia community. In such a case, it can be useful to remove some burden from the compiler by avoiding specialization on every possible argument types using the macro @nospecialize. A prime example of such a case is pretty printing of structs in the Julia REPL, see the associated PR for further discussions.

As a rule of thumb:

  • Do not use @nospecialize in performance-critical parts, in particular not for methods involved in computing Trixi.rhs!.
  • Consider using @nospecialize for methods like custom implementations of Base.show.

Performance metrics of the AnalysisCallback

The AnalysisCallback computes two performance indicators that you can use to evaluate the serial and parallel performance of Trixi.jl. They represent measured run times that are normalized by the number of rhs! evaluations and the number of degrees of freedom of the problem setup. The normalization ensures that we can compare different measurements for each type of indicator independent of the number of time steps or mesh size. All indicators have in common that they are still in units of time, thus lower is better for each of them.

Here, the term "degrees of freedom" (DOFs) refers to the number of independent state vectors that are used to represent the numerical solution. For example, if you use a DGSEM-type scheme in 2D on a mesh with 8 elements and with 5-by-5 Gauss-Lobatto nodes in each element (i.e., a polynomial degree of 4), the total number of DOFs would be

\[n_\text{DOFs,DGSEM} = \{\text{number of elements}\} \cdot \{\text{number of nodes per element}\} = 8 \cdot (5 \cdot 5) = 200.\]

In contrast, for a finite volume-type scheme on a mesh with 8 elements, the total number of DOFs would be (independent of the number of spatial dimensions)

\[n_\text{DOFs,FV} = \{\text{number of elements}\} = 8,\]

since for standard finite volume methods you store a single state vector in each element. Note that we specifically count the number of state vectors and not the number of state variables for the DOFs. That is, in the previous example $n_\text{DOFs,FV}$ is equal to 8 independent of whether this is a compressible Euler setup with 5 state variables or a linear scalar advection setup with one state variable.

For each indicator, the measurements are always since the last invocation of the AnalysisCallback. That is, if the analysis callback is called multiple times, the indicators are repeatedly computed and can thus also be used to track the performance over the course of a longer simulation, e.g., to analyze setups with varying performance characteristics. Note that the time spent in the AnalysisCallback itself is always excluded, i.e., the performance measurements are not distorted by potentially expensive solution analysis computations. All other parts of a Trixi.jl simulation are included, however, thus make sure that you disable everything you do not want to be measured (such as I/O callbacks, visualization etc.).

Performance indicators and adaptive mesh refinement

Currently it is not possible to compute meaningful performance indicators for a simulation with arbitrary adaptive mesh refinement, since this would require to explicitly keep track of the number of DOF updates due to the mesh size changing repeatedly. The only way to do this at the moment is by setting the analysis interval to the same value as the AMR interval.

Local, rhs!-only indicator

The local, rhs!-only indicator is computed as

\[\text{time/DOF/rhs!} = \frac{t_\text{\texttt{rhs!}}}{n_\text{DOFs,local} \cdot n_\text{calls,\texttt{rhs!}}},\]

where $t_\text{\texttt{rhs!}}$ is the accumulated time spent in rhs!, $n_\text{DOFs,local}$ is the local number of DOFs (i.e., on the current MPI rank; if doing a serial run, you can just think of this as the number of DOFs), and $n_\text{calls,\texttt{rhs!}}$ is the number of times the rhs! function has been evaluated. Note that for this indicator, we measure only the time spent in rhs!, i.e., by definition all computations outside of rhs! - specifically all other callbacks and the time integration method - are not taken into account.

The local, rhs!-only indicator is usually most useful if you do serial measurements and are interested in the performance of the implementation of your core numerical methods (e.g., when doing performance tuning).

Performance index (PID)

The performance index (PID) is computed as

\[\text{PID} = \frac{t_\text{wall} \cdot n_\text{ranks,MPI}}{n_\text{DOFs,global} \cdot n_\text{calls,\texttt{rhs!}}},\]

where $t_\text{wall}$ is the walltime since the last call to the AnalysisCallback, $n_\text{ranks,MPI}$ is the number of MPI ranks used, $n_\text{DOFs,global}$ is the global number of DOFs (i.e., the sum of DOFs over all MPI ranks; if doing a serial run, you can just think of this as the number of DOFs), and $n_\text{calls,\texttt{rhs!}}$ is the number of times the rhs! function has been evaluated since the last call to the AnalysisCallback. The PID measures everything except the time spent in the AnalysisCallback itself - specifically, all other callbacks and the time integration method itself are included.

The PID is usually most useful if you would like to compare the parallel performance of your code to its serial performance. Specifically, it allows you to evaluate the parallelization overhead of your code by giving you a measure of the resources that are necessary to solve a given simulation setup. In a sense, it mimics the "core hours" metric that is often used by supercomputer centers to measure how many resources a particular compute job requires. It can thus be seen as a proxy for "energy used" and, as an extension, "monetary cost".

Initialization overhead in measurements

When using one of the integration schemes from OrdinaryDiffEq.jl, their implementation will initialize some OrdinaryDiffEq.jl-specific information during the first time step. Among other things, one additional call to rhs! is performed. Therefore, make sure that for performance measurements using the PID either the number of timesteps or the workload per rhs! call is large enough to make the initialization overhead negligible. Note that the extra call to rhs! is properly accounted for in both the number of calls and the measured time, so you do not need to worry about it being expensive. If you want a perfect timing result, you need to set the analysis interval such that the AnalysisCallback is invoked at least once during the course of the simulation and discard the first PID value.

+julia> export_markdown(pkgdir(Trixi, "benchmark", "results.md"), results)

By default, the target is the current state of the repository. Remember that you need to be in a clean state (commit or stash your changes) to run this successfully. You can also run this comparison and an additional one using two threads via

julia> include("benchmark/run_benchmarks.jl")

Then, markdown files including the results are saved in benchmark/. This example result was obtained using a GitHub action for the PR #535. Note that GitHub actions run on in the cloud in a virtual machine. Hence, we do not really have control over it and performance results must be taken with a grain of salt. Nevertheless, significant runtime differences and differences of memory allocations should be robust indicators of performance changes.

Runtime performance vs. latency aka using @nospecialize selectively

Usually, Julia will compile specialized versions of each method, using as much information from the types of function arguments as possible (based on some heuristics). The compiler will generate code that is as efficient as comparable code written in a low-level language such as C or Fortran. However, there are cases where the runtime performance does not really matter but the time needed to compile specializations becomes significant. This is related to latency or the time-to-first-plot problem, well-known in the Julia community. In such a case, it can be useful to remove some burden from the compiler by avoiding specialization on every possible argument types using the macro @nospecialize. A prime example of such a case is pretty printing of structs in the Julia REPL, see the associated PR for further discussions.

As a rule of thumb:

  • Do not use @nospecialize in performance-critical parts, in particular not for methods involved in computing Trixi.rhs!.
  • Consider using @nospecialize for methods like custom implementations of Base.show.

Performance metrics of the AnalysisCallback

The AnalysisCallback computes two performance indicators that you can use to evaluate the serial and parallel performance of Trixi.jl. They represent measured run times that are normalized by the number of rhs! evaluations and the number of degrees of freedom of the problem setup. The normalization ensures that we can compare different measurements for each type of indicator independent of the number of time steps or mesh size. All indicators have in common that they are still in units of time, thus lower is better for each of them.

Here, the term "degrees of freedom" (DOFs) refers to the number of independent state vectors that are used to represent the numerical solution. For example, if you use a DGSEM-type scheme in 2D on a mesh with 8 elements and with 5-by-5 Gauss-Lobatto nodes in each element (i.e., a polynomial degree of 4), the total number of DOFs would be

\[n_\text{DOFs,DGSEM} = \{\text{number of elements}\} \cdot \{\text{number of nodes per element}\} = 8 \cdot (5 \cdot 5) = 200.\]

In contrast, for a finite volume-type scheme on a mesh with 8 elements, the total number of DOFs would be (independent of the number of spatial dimensions)

\[n_\text{DOFs,FV} = \{\text{number of elements}\} = 8,\]

since for standard finite volume methods you store a single state vector in each element. Note that we specifically count the number of state vectors and not the number of state variables for the DOFs. That is, in the previous example $n_\text{DOFs,FV}$ is equal to 8 independent of whether this is a compressible Euler setup with 5 state variables or a linear scalar advection setup with one state variable.

For each indicator, the measurements are always since the last invocation of the AnalysisCallback. That is, if the analysis callback is called multiple times, the indicators are repeatedly computed and can thus also be used to track the performance over the course of a longer simulation, e.g., to analyze setups with varying performance characteristics. Note that the time spent in the AnalysisCallback itself is always excluded, i.e., the performance measurements are not distorted by potentially expensive solution analysis computations. All other parts of a Trixi.jl simulation are included, however, thus make sure that you disable everything you do not want to be measured (such as I/O callbacks, visualization etc.).

Performance indicators and adaptive mesh refinement

Currently it is not possible to compute meaningful performance indicators for a simulation with arbitrary adaptive mesh refinement, since this would require to explicitly keep track of the number of DOF updates due to the mesh size changing repeatedly. The only way to do this at the moment is by setting the analysis interval to the same value as the AMR interval.

Local, rhs!-only indicator

The local, rhs!-only indicator is computed as

\[\text{time/DOF/rhs!} = \frac{t_\text{\texttt{rhs!}}}{n_\text{DOFs,local} \cdot n_\text{calls,\texttt{rhs!}}},\]

where $t_\text{\texttt{rhs!}}$ is the accumulated time spent in rhs!, $n_\text{DOFs,local}$ is the local number of DOFs (i.e., on the current MPI rank; if doing a serial run, you can just think of this as the number of DOFs), and $n_\text{calls,\texttt{rhs!}}$ is the number of times the rhs! function has been evaluated. Note that for this indicator, we measure only the time spent in rhs!, i.e., by definition all computations outside of rhs! - specifically all other callbacks and the time integration method - are not taken into account.

The local, rhs!-only indicator is usually most useful if you do serial measurements and are interested in the performance of the implementation of your core numerical methods (e.g., when doing performance tuning).

Performance index (PID)

The performance index (PID) is computed as

\[\text{PID} = \frac{t_\text{wall} \cdot n_\text{ranks,MPI}}{n_\text{DOFs,global} \cdot n_\text{calls,\texttt{rhs!}}},\]

where $t_\text{wall}$ is the walltime since the last call to the AnalysisCallback, $n_\text{ranks,MPI}$ is the number of MPI ranks used, $n_\text{DOFs,global}$ is the global number of DOFs (i.e., the sum of DOFs over all MPI ranks; if doing a serial run, you can just think of this as the number of DOFs), and $n_\text{calls,\texttt{rhs!}}$ is the number of times the rhs! function has been evaluated since the last call to the AnalysisCallback. The PID measures everything except the time spent in the AnalysisCallback itself - specifically, all other callbacks and the time integration method itself are included.

The PID is usually most useful if you would like to compare the parallel performance of your code to its serial performance. Specifically, it allows you to evaluate the parallelization overhead of your code by giving you a measure of the resources that are necessary to solve a given simulation setup. In a sense, it mimics the "core hours" metric that is often used by supercomputer centers to measure how many resources a particular compute job requires. It can thus be seen as a proxy for "energy used" and, as an extension, "monetary cost".

Initialization overhead in measurements

When using one of the integration schemes from OrdinaryDiffEq.jl, their implementation will initialize some OrdinaryDiffEq.jl-specific information during the first time step. Among other things, one additional call to rhs! is performed. Therefore, make sure that for performance measurements using the PID either the number of timesteps or the workload per rhs! call is large enough to make the initialization overhead negligible. Note that the extra call to rhs! is properly accounted for in both the number of calls and the measured time, so you do not need to worry about it being expensive. If you want a perfect timing result, you need to set the analysis interval such that the AnalysisCallback is invoked at least once during the course of the simulation and discard the first PID value.

Performance issues with multi-threaded reductions

False sharing is a known performance issue for systems with distributed caches. It also occurred for the implementation of a thread parallel bounds checking routine for the subcell IDP limiting in PR #1736. After some testing and discussion, it turned out that initializing a vector of length n * Threads.nthreads() and only using every n-th entry instead of a vector of length Threads.nthreads() fixes the problem. Since there are no processors with caches over 128B, we use n = 128B / size(uEltype). Now, the bounds checking routine of the IDP limiting scales as hoped.

diff --git a/previews/PR1624/reference-trixi/index.html b/previews/PR1624/reference-trixi/index.html index 74cb6dada30..bf7863515a4 100644 --- a/previews/PR1624/reference-trixi/index.html +++ b/previews/PR1624/reference-trixi/index.html @@ -1,9 +1,9 @@ -Trixi.jl · Trixi.jl

Trixi.jl API

Trixi.TrixiModule
Trixi

Trixi.jl is a numerical simulation framework for hyperbolic conservation laws. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures.

To get started, run your first simulation with Trixi.jl using

trixi_include(default_example())

See also: trixi-framework/Trixi.jl

source
Trixi.flux_hll_chen_noelleConstant
flux_hll_chen_noelle = FluxHLL(min_max_speed_chen_noelle)

An instance of FluxHLL specific to the shallow water equations that uses the wave speed estimates from min_max_speed_chen_noelle. This HLL flux is guaranteed to have zero numerical mass flux out of a "dry" element, maintain positivity of the water height, and satisfy an entropy inequality.

For complete details see Section 2.4 of the following reference

  • Guoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI: 10.1137/15M1053074
source
Trixi.AMRCallbackType
AMRCallback(semi, controller [,adaptor=AdaptorAMR(semi)];
+Trixi.jl · Trixi.jl

Trixi.jl API

Trixi.TrixiModule
Trixi

Trixi.jl is a numerical simulation framework for hyperbolic conservation laws. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures.

To get started, run your first simulation with Trixi.jl using

trixi_include(default_example())

See also: trixi-framework/Trixi.jl

source
Trixi.AMRCallbackType
AMRCallback(semi, controller [,adaptor=AdaptorAMR(semi)];
             interval,
             adapt_initial_condition=true,
             adapt_initial_condition_only_refine=true,
-            dynamic_load_balancing=true)

Performs adaptive mesh refinement (AMR) every interval time steps for a given semidiscretization semi using the chosen controller.

source
Trixi.AbstractEquationsType
AbstractEquations{NDIMS, NVARS}

An abstract supertype of specific equations such as the compressible Euler equations. The type parameters encode the number of spatial dimensions (NDIMS) and the number of primary variables (NVARS) of the physics model.

source
Trixi.AbstractMeshType
AbstractMesh{NDIMS}

An abstract supertype of specific mesh types such as TreeMesh or StructuredMesh. The type parameters encode the number of spatial dimensions (NDIMS).

source
Trixi.AcousticPerturbationEquations2DType
AcousticPerturbationEquations2D(v_mean_global, c_mean_global, rho_mean_global)

Acoustic perturbation equations (APE) in two space dimensions. The equations are given by

\[\begin{aligned} + dynamic_load_balancing=true)

Performs adaptive mesh refinement (AMR) every interval time steps for a given semidiscretization semi using the chosen controller.

source
Trixi.AbstractEquationsType
AbstractEquations{NDIMS, NVARS}

An abstract supertype of specific equations such as the compressible Euler equations. The type parameters encode the number of spatial dimensions (NDIMS) and the number of primary variables (NVARS) of the physics model.

source
Trixi.AbstractMeshType
AbstractMesh{NDIMS}

An abstract supertype of specific mesh types such as TreeMesh or StructuredMesh. The type parameters encode the number of spatial dimensions (NDIMS).

source
Trixi.AcousticPerturbationEquations2DType
AcousticPerturbationEquations2D(v_mean_global, c_mean_global, rho_mean_global)

Acoustic perturbation equations (APE) in two space dimensions. The equations are given by

\[\begin{aligned} \frac{\partial\mathbf{v'}}{\partial t} + \nabla (\bar{\mathbf{v}}\cdot\mathbf{v'}) + \nabla\left( \frac{\bar{c}^2 \tilde{p}'}{\bar{\rho}} \right) &= 0 \\ \frac{\partial \tilde{p}'}{\partial t} + @@ -11,21 +11,21 @@ \end{aligned}\]

The bar $\bar{(\cdot)}$ indicates time-averaged quantities. The unknowns of the APE are the perturbed velocities $\mathbf{v'} = (v_1', v_2')^T$ and the scaled perturbed pressure $\tilde{p}' = \frac{p'}{\bar{c}^2}$, where $p'$ denotes the perturbed pressure and the perturbed variables are defined by $\phi' = \phi - \bar{\phi}$.

In addition to the unknowns, Trixi.jl currently stores the mean values in the state vector, i.e. the state vector used internally is given by

\[\mathbf{u} = \begin{pmatrix} v_1' \\ v_2' \\ \tilde{p}' \\ \bar{v}_1 \\ \bar{v}_2 \\ \bar{c} \\ \bar{\rho} - \end{pmatrix}.\]

This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the mean values must be zero.
  • The mean values have to be considered when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes these variables too.
  • Trixi.jl's visualization tools will visualize the mean values by default.

The constructor accepts a 2-tuple v_mean_global and scalars c_mean_global and rho_mean_global which can be used to make the definition of initial conditions for problems with constant mean flow more flexible. These values are ignored if the mean values are defined internally in an initial condition.

The equations are based on the APE-4 system introduced in the following paper:

source
Trixi.AdiabaticType
struct Adiabatic

Used to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_normal_flux_function should be a function with signature boundary_value_normal_flux_function(x, t, equations) and return a scalar value for the normal heat flux at point x and time t.

source
Trixi.AliveCallbackType
AliveCallback(analysis_interval=0, alive_interval=analysis_interval÷10)

Inexpensive callback showing that a simulation is still running by printing some information such as the current time to the screen every alive_interval time steps. If analysis_interval ≂̸ 0, the output is omitted every analysis_interval time steps.

source
Trixi.AnalysisCallbackType
AnalysisCallback(semi; interval=0,
+  \end{pmatrix}.\]

This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the mean values must be zero.
  • The mean values have to be considered when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes these variables too.
  • Trixi.jl's visualization tools will visualize the mean values by default.

The constructor accepts a 2-tuple v_mean_global and scalars c_mean_global and rho_mean_global which can be used to make the definition of initial conditions for problems with constant mean flow more flexible. These values are ignored if the mean values are defined internally in an initial condition.

The equations are based on the APE-4 system introduced in the following paper:

source
Trixi.AdiabaticType
struct Adiabatic

Used to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_normal_flux_function should be a function with signature boundary_value_normal_flux_function(x, t, equations) and return a scalar value for the normal heat flux at point x and time t.

source
Trixi.AliveCallbackType
AliveCallback(analysis_interval=0, alive_interval=analysis_interval÷10)

Inexpensive callback showing that a simulation is still running by printing some information such as the current time to the screen every alive_interval time steps. If analysis_interval ≂̸ 0, the output is omitted every analysis_interval time steps.

source
Trixi.AnalysisCallbackType
AnalysisCallback(semi; interval=0,
                        save_analysis=false,
                        output_directory="out",
                        analysis_filename="analysis.dat",
                        extra_analysis_errors=Symbol[],
-                       extra_analysis_integrals=())

Analyze a numerical solution every interval time steps and print the results to the screen. If save_analysis, the results are also saved in joinpath(output_directory, analysis_filename).

Additional errors can be computed, e.g. by passing extra_analysis_errors = (:l2_error_primitive, :linf_error_primitive) or extra_analysis_errors = (:conservation_error,).

If you want to omit the computation (to safe compute-time) of the default_analysis_errors, specify analysis_errors = Symbol[]. Note: default_analysis_errors are :l2_error and :linf_error for all equations. If you want to compute extra_analysis_errors such as :conservation_error solely, i.e., without :l2_error, :linf_error you need to specify analysis_errors = [:conservation_error] instead of extra_analysis_errors = [:conservation_error].

Further scalar functions func in extra_analysis_integrals are applied to the numerical solution and integrated over the computational domain. Some examples for this are entropy, energy_kinetic, energy_internal, and energy_total. You can also write your own function with the same signature as the examples listed above and pass it via extra_analysis_integrals. See the developer comments about Trixi.analyze, Trixi.pretty_form_utf, and Trixi.pretty_form_ascii for further information on how to create custom analysis quantities.

In addition, the analysis callback records and outputs a number of quantities that are useful for evaluating the computational performance, such as the total runtime, the performance index (time/DOF/rhs!), the time spent in garbage collection (GC), or the current memory usage (alloc'd memory).

source
Trixi.AnalysisCallbackCoupledType
AnalysisCallbackCoupled(semi, callbacks...)

Combine multiple analysis callbacks for coupled simulations with a SemidiscretizationCoupled. For each coupled system, an indididual AnalysisCallback must be created and passed to the AnalysisCallbackCoupled in order, i.e., in the same sequence as the indidvidual semidiscretizations are stored in the SemidiscretizationCoupled.

Experimental code

This is an experimental feature and can change any time.

source
Trixi.AveragingCallbackType
AveragingCallback(semi::SemidiscretizationHyperbolic, tspan; output_directory="out",
-                  filename="averaging.h5")
Experimental code

This callback is experimental and may change in any future release.

A callback that averages the flow field described by semi which must be a semidiscretization of the compressible Euler equations in two dimensions. The callback records the mean velocity, mean speed of sound, mean density, and mean vorticity for each node over the time interval given by tspan and stores the results in an HDF5 file filename in the directory output_directory. Note that this callback does not support adaptive mesh refinement (AMRCallback).

source
Trixi.BoundaryConditionCoupledType
BoundaryConditionCoupled(other_semi_index, indices, uEltype)

Boundary condition to glue two meshes together. Solution values at the boundary of another mesh will be used as boundary values. This requires the use of SemidiscretizationCoupled. The other mesh is specified by other_semi_index, which is the index of the mesh in the tuple of semidiscretizations.

Note that the elements and nodes of the two meshes at the coupled boundary must coincide. This is currently only implemented for StructuredMesh.

Arguments

  • other_semi_index: the index in SemidiscretizationCoupled of the semidiscretization from which the values are copied
  • indices::Tuple: node/cell indices at the boundary of the mesh in the other semidiscretization. See examples below.
  • uEltype::Type: element type of solution

Examples

# Connect the left boundary of mesh 2 to our boundary such that our positive
+                       extra_analysis_integrals=())

Analyze a numerical solution every interval time steps and print the results to the screen. If save_analysis, the results are also saved in joinpath(output_directory, analysis_filename).

Additional errors can be computed, e.g. by passing extra_analysis_errors = (:l2_error_primitive, :linf_error_primitive) or extra_analysis_errors = (:conservation_error,).

If you want to omit the computation (to safe compute-time) of the default_analysis_errors, specify analysis_errors = Symbol[]. Note: default_analysis_errors are :l2_error and :linf_error for all equations. If you want to compute extra_analysis_errors such as :conservation_error solely, i.e., without :l2_error, :linf_error you need to specify analysis_errors = [:conservation_error] instead of extra_analysis_errors = [:conservation_error].

Further scalar functions func in extra_analysis_integrals are applied to the numerical solution and integrated over the computational domain. Some examples for this are entropy, energy_kinetic, energy_internal, and energy_total. You can also write your own function with the same signature as the examples listed above and pass it via extra_analysis_integrals. See the developer comments about Trixi.analyze, Trixi.pretty_form_utf, and Trixi.pretty_form_ascii for further information on how to create custom analysis quantities.

In addition, the analysis callback records and outputs a number of quantities that are useful for evaluating the computational performance, such as the total runtime, the performance index (time/DOF/rhs!), the time spent in garbage collection (GC), or the current memory usage (alloc'd memory).

source
Trixi.AnalysisCallbackCoupledType
AnalysisCallbackCoupled(semi, callbacks...)

Combine multiple analysis callbacks for coupled simulations with a SemidiscretizationCoupled. For each coupled system, an indididual AnalysisCallback must be created and passed to the AnalysisCallbackCoupled in order, i.e., in the same sequence as the indidvidual semidiscretizations are stored in the SemidiscretizationCoupled.

Experimental code

This is an experimental feature and can change any time.

source
Trixi.AveragingCallbackType
AveragingCallback(semi::SemidiscretizationHyperbolic, tspan; output_directory="out",
+                  filename="averaging.h5")
Experimental code

This callback is experimental and may change in any future release.

A callback that averages the flow field described by semi which must be a semidiscretization of the compressible Euler equations in two dimensions. The callback records the mean velocity, mean speed of sound, mean density, and mean vorticity for each node over the time interval given by tspan and stores the results in an HDF5 file filename in the directory output_directory. Note that this callback does not support adaptive mesh refinement (AMRCallback).

source
Trixi.BoundaryConditionCoupledType
BoundaryConditionCoupled(other_semi_index, indices, uEltype, coupling_converter)

Boundary condition to glue two meshes together. Solution values at the boundary of another mesh will be used as boundary values. This requires the use of SemidiscretizationCoupled. The other mesh is specified by other_semi_index, which is the index of the mesh in the tuple of semidiscretizations.

Note that the elements and nodes of the two meshes at the coupled boundary must coincide. This is currently only implemented for StructuredMesh.

Arguments

  • other_semi_index: the index in SemidiscretizationCoupled of the semidiscretization from which the values are copied
  • indices::Tuple: node/cell indices at the boundary of the mesh in the other semidiscretization. See examples below.
  • uEltype::Type: element type of solution
  • coupling_converter::CouplingConverter: function to call for converting the solution state of one system to the other system

Examples

# Connect the left boundary of mesh 2 to our boundary such that our positive
 # boundary direction will match the positive y direction of the other boundary
-BoundaryConditionCoupled(2, (:begin, :i), Float64)
+BoundaryConditionCoupled(2, (:begin, :i), Float64, fun)
 
 # Connect the same two boundaries oppositely oriented
-BoundaryConditionCoupled(2, (:begin, :i_backwards), Float64)
+BoundaryConditionCoupled(2, (:begin, :i_backwards), Float64, fun)
 
 # Using this as y_neg boundary will connect `our_cells[i, 1, j]` to `other_cells[j, end-i, end]`
-BoundaryConditionCoupled(2, (:j, :i_backwards, :end), Float64)
Experimental code

This is an experimental feature and can change any time.

source
Trixi.BoundaryConditionDirichletType
BoundaryConditionDirichlet(boundary_value_function)

Create a Dirichlet boundary condition that uses the function boundary_value_function to specify the values at the boundary. This can be used to create a boundary condition that specifies exact boundary values by passing the exact solution of the equation. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as

boundary_value_function(x, t, equations)

where x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.

Examples

julia> BoundaryConditionDirichlet(initial_condition_convergence_test)
source
Trixi.BoundaryConditionNavierStokesWallType
struct BoundaryConditionNavierStokesWall

Creates a wall-type boundary conditions for the compressible Navier-Stokes equations. The fields boundary_condition_velocity and boundary_condition_heat_flux are intended to be boundary condition types such as the NoSlip velocity boundary condition and the Adiabatic or Isothermal heat boundary condition.

source
Trixi.BoundaryConditionNeumannType
BoundaryConditionNeumann(boundary_normal_flux_function)

Similar to BoundaryConditionDirichlet, but creates a Neumann boundary condition for parabolic equations that uses the function boundary_normal_flux_function to specify the values of the normal flux at the boundary. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as

boundary_normal_flux_function(x, t, equations)

where x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.

source
Trixi.BoundsCheckCallbackType
BoundsCheckCallback(; output_directory="out", save_errors=false, interval=1)

Subcell limiting techniques with SubcellLimiterIDP are constructed to adhere certain local or global bounds. To make sure that these bounds are actually met, this callback calculates the maximum deviation from the bounds. The maximum deviation per applied bound is printed to the screen at the end of the simulation. For more insights, when setting save_errors=true the occurring errors are exported every interval time steps during the simulation. Then, the maximum deviations since the last export are saved in "output_directory/deviations.txt". The BoundsCheckCallback has to be applied as a stage callback for the SSPRK time integration scheme.

Note

For SubcellLimiterIDP, the solution is corrected in the a posteriori correction stage SubcellLimiterIDPCorrection. So, to check the final solution, this bounds check callback must be called after the correction stage.

source
Trixi.CarpenterKennedy2N54Type
CarpenterKennedy2N54()

The following structures and methods provide a minimal implementation of the low-storage explicit Runge-Kutta method of

Carpenter, Kennedy (1994) Fourth order 2N storage RK schemes, Solution 3

using the same interface as OrdinaryDiffEq.jl.

source
Trixi.CompressibleEulerEquations1DType
CompressibleEulerEquations1D(gamma)

The compressible Euler equations

\[\frac{\partial}{\partial t} +BoundaryConditionCoupled(2, (:j, :i_backwards, :end), Float64, fun)

Experimental code

This is an experimental feature and can change any time.

source
Trixi.BoundaryConditionDirichletType
BoundaryConditionDirichlet(boundary_value_function)

Create a Dirichlet boundary condition that uses the function boundary_value_function to specify the values at the boundary. This can be used to create a boundary condition that specifies exact boundary values by passing the exact solution of the equation. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as

boundary_value_function(x, t, equations)

where x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.

Examples

julia> BoundaryConditionDirichlet(initial_condition_convergence_test)
source
Trixi.BoundaryConditionNavierStokesWallType
struct BoundaryConditionNavierStokesWall

Creates a wall-type boundary conditions for the compressible Navier-Stokes equations. The fields boundary_condition_velocity and boundary_condition_heat_flux are intended to be boundary condition types such as the NoSlip velocity boundary condition and the Adiabatic or Isothermal heat boundary condition.

source
Trixi.BoundaryConditionNeumannType
BoundaryConditionNeumann(boundary_normal_flux_function)

Similar to BoundaryConditionDirichlet, but creates a Neumann boundary condition for parabolic equations that uses the function boundary_normal_flux_function to specify the values of the normal flux at the boundary. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as

boundary_normal_flux_function(x, t, equations)

where x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.

source
Trixi.BoundsCheckCallbackType
BoundsCheckCallback(; output_directory="out", save_errors=false, interval=1)

Subcell limiting techniques with SubcellLimiterIDP are constructed to adhere certain local or global bounds. To make sure that these bounds are actually met, this callback calculates the maximum deviation from the bounds. The maximum deviation per applied bound is printed to the screen at the end of the simulation. For more insights, when setting save_errors=true the occurring errors are exported every interval time steps during the simulation. Then, the maximum deviations since the last export are saved in "output_directory/deviations.txt". The BoundsCheckCallback has to be applied as a stage callback for the SSPRK time integration scheme.

Note

For SubcellLimiterIDP, the solution is corrected in the a posteriori correction stage SubcellLimiterIDPCorrection. So, to check the final solution, this bounds check callback must be called after the correction stage.

source
Trixi.CarpenterKennedy2N54Type
CarpenterKennedy2N54()

The following structures and methods provide a minimal implementation of the low-storage explicit Runge-Kutta method of

Carpenter, Kennedy (1994) Fourth order 2N storage RK schemes, Solution 3

using the same interface as OrdinaryDiffEq.jl.

source
Trixi.CompressibleEulerEquations1DType
CompressibleEulerEquations1D(gamma)

The compressible Euler equations

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho \\ \rho v_1 \\ \rho e \end{pmatrix} @@ -37,7 +37,7 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 -\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in one space dimension. Here, $\rho$ is the density, $v_1$ the velocity, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho v_1^2 \right)\]

the pressure.

source
Trixi.CompressibleEulerEquations2DType
CompressibleEulerEquations2D(gamma)

The compressible Euler equations

\[\frac{\partial}{\partial t} +\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in one space dimension. Here, $\rho$ is the density, $v_1$ the velocity, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho v_1^2 \right)\]

the pressure.

source
Trixi.CompressibleEulerEquations2DType
CompressibleEulerEquations2D(gamma)

The compressible Euler equations

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho \\ \rho v_1 \\ \rho v_2 \\ \rho e \end{pmatrix} @@ -54,7 +54,7 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 -\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in two space dimensions. Here, $\rho$ is the density, $v_1$, $v_2$ the velocities, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2) \right)\]

the pressure.

source
Trixi.CompressibleEulerEquations3DType
CompressibleEulerEquations3D(gamma)

The compressible Euler equations

\[\frac{\partial}{\partial t} +\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in two space dimensions. Here, $\rho$ is the density, $v_1$, $v_2$ the velocities, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2) \right)\]

the pressure.

source
Trixi.CompressibleEulerEquations3DType
CompressibleEulerEquations3D(gamma)

The compressible Euler equations

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho \\ \rho v_1 \\ \rho v_2 \\ \rho v_3 \\ \rho e \end{pmatrix} @@ -76,7 +76,7 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 -\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in three space dimensions. Here, $\rho$ is the density, $v_1$, $v_2$, $v_3$ the velocities, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2+v_3^2) \right)\]

the pressure.

source
Trixi.CompressibleEulerEquationsQuasi1DType
CompressibleEulerEquationsQuasi1D(gamma)

The quasi-1d compressible Euler equations (see Chan et al. DOI: 10.48550/arXiv.2307.12089 for details)

\[\frac{\partial}{\partial t} +\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in three space dimensions. Here, $\rho$ is the density, $v_1$, $v_2$, $v_3$ the velocities, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2+v_3^2) \right)\]

the pressure.

source
Trixi.CompressibleEulerEquationsQuasi1DType
CompressibleEulerEquationsQuasi1D(gamma)

The quasi-1d compressible Euler equations (see Chan et al. DOI: 10.48550/arXiv.2307.12089 for details)

\[\frac{\partial}{\partial t} \begin{pmatrix} a \rho \\ a \rho v_1 \\ a e \end{pmatrix} @@ -93,7 +93,7 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 -\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in one space dimension. Here, $\rho$ is the density, $v_1$ the velocity, $e$ the specific total energy rather than specific internal energy, $a$ the (possibly) variable nozzle width, and

\[p = (\gamma - 1) \left( e - \frac{1}{2} \rho v_1^2 \right)\]

the pressure.

The nozzle width function $a(x)$ is set inside the initial condition routine for a particular problem setup. To test the conservative form of the compressible Euler equations one can set the nozzle width variable $a$ to one.

In addition to the unknowns, Trixi.jl currently stores the nozzle width values at the approximation points despite being fixed in time. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the nozzle width must be zero.
  • The nozzle width values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the nozzle width by default.
source
Trixi.CompressibleEulerMulticomponentEquations1DType
CompressibleEulerMulticomponentEquations1D(; gammas, gas_constants)

Multicomponent version of the compressible Euler equations

\[\frac{\partial}{\partial t} +\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in one space dimension. Here, $\rho$ is the density, $v_1$ the velocity, $e$ the specific total energy rather than specific internal energy, $a$ the (possibly) variable nozzle width, and

\[p = (\gamma - 1) \left( e - \frac{1}{2} \rho v_1^2 \right)\]

the pressure.

The nozzle width function $a(x)$ is set inside the initial condition routine for a particular problem setup. To test the conservative form of the compressible Euler equations one can set the nozzle width variable $a$ to one.

In addition to the unknowns, Trixi.jl currently stores the nozzle width values at the approximation points despite being fixed in time. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the nozzle width must be zero.
  • The nozzle width values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the nozzle width by default.
source
Trixi.CompressibleEulerMulticomponentEquations1DType
CompressibleEulerMulticomponentEquations1D(; gammas, gas_constants)

Multicomponent version of the compressible Euler equations

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho v_1 \\ \rho e \\ \rho_1 \\ \rho_2 \\ \vdots \\ \rho_{n} \end{pmatrix} @@ -106,7 +106,7 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \\ \vdots \\ 0 -\end{pmatrix}\]

for calorically perfect gas in one space dimension. Here, $\rho_i$ is the density of component $i$, $\rho=\sum_{i=1}^n\rho_i$ the sum of the individual $\rho_i$, $v_1$ the velocity, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho v_1^2 \right)\]

the pressure,

\[\gamma=\frac{\sum_{i=1}^n\rho_i C_{v,i}\gamma_i}{\sum_{i=1}^n\rho_i C_{v,i}}\]

total heat capacity ratio, $\gamma_i$ heat capacity ratio of component $i$,

\[C_{v,i}=\frac{R}{\gamma_i-1}\]

specific heat capacity at constant volume of component $i$.

In case of more than one component, the specific heat ratios gammas and the gas constants gas_constants should be passed as tuples, e.g., gammas=(1.4, 1.667).

The remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.

source
Trixi.CompressibleEulerMulticomponentEquations2DType
CompressibleEulerMulticomponentEquations2D(; gammas, gas_constants)

Multicomponent version of the compressible Euler equations

\[\frac{\partial}{\partial t} +\end{pmatrix}\]

for calorically perfect gas in one space dimension. Here, $\rho_i$ is the density of component $i$, $\rho=\sum_{i=1}^n\rho_i$ the sum of the individual $\rho_i$, $v_1$ the velocity, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho v_1^2 \right)\]

the pressure,

\[\gamma=\frac{\sum_{i=1}^n\rho_i C_{v,i}\gamma_i}{\sum_{i=1}^n\rho_i C_{v,i}}\]

total heat capacity ratio, $\gamma_i$ heat capacity ratio of component $i$,

\[C_{v,i}=\frac{R}{\gamma_i-1}\]

specific heat capacity at constant volume of component $i$.

In case of more than one component, the specific heat ratios gammas and the gas constants gas_constants should be passed as tuples, e.g., gammas=(1.4, 1.667).

The remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.

source
Trixi.CompressibleEulerMulticomponentEquations2DType
CompressibleEulerMulticomponentEquations2D(; gammas, gas_constants)

Multicomponent version of the compressible Euler equations

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho v_1 \\ \rho v_2 \\ \rho e \\ \rho_1 \\ \rho_2 \\ \vdots \\ \rho_{n} \end{pmatrix} @@ -123,7 +123,7 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ \vdots \\ 0 -\end{pmatrix}\]

for calorically perfect gas in two space dimensions. Here, $\rho_i$ is the density of component $i$, $\rho=\sum_{i=1}^n\rho_i$ the sum of the individual $\rho_i$, $v_1$, $v_2$ the velocities, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2 + v_2^2) \right)\]

the pressure,

\[\gamma=\frac{\sum_{i=1}^n\rho_i C_{v,i}\gamma_i}{\sum_{i=1}^n\rho_i C_{v,i}}\]

total heat capacity ratio, $\gamma_i$ heat capacity ratio of component $i$,

\[C_{v,i}=\frac{R}{\gamma_i-1}\]

specific heat capacity at constant volume of component $i$.

In case of more than one component, the specific heat ratios gammas and the gas constants gas_constants in [kJ/(kg*K)] should be passed as tuples, e.g., gammas=(1.4, 1.667).

The remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.

source
Trixi.CompressibleNavierStokesDiffusion1DType
CompressibleNavierStokesDiffusion1D(equations; mu, Pr,
+\end{pmatrix}\]

for calorically perfect gas in two space dimensions. Here, $\rho_i$ is the density of component $i$, $\rho=\sum_{i=1}^n\rho_i$ the sum of the individual $\rho_i$, $v_1$, $v_2$ the velocities, $e$ the specific total energy rather than specific internal energy, and

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2 + v_2^2) \right)\]

the pressure,

\[\gamma=\frac{\sum_{i=1}^n\rho_i C_{v,i}\gamma_i}{\sum_{i=1}^n\rho_i C_{v,i}}\]

total heat capacity ratio, $\gamma_i$ heat capacity ratio of component $i$,

\[C_{v,i}=\frac{R}{\gamma_i-1}\]

specific heat capacity at constant volume of component $i$.

In case of more than one component, the specific heat ratios gammas and the gas constants gas_constants in [kJ/(kg*K)] should be passed as tuples, e.g., gammas=(1.4, 1.667).

The remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.

source
Trixi.CompressibleNavierStokesDiffusion1DType
CompressibleNavierStokesDiffusion1D(equations; mu, Pr,
                                     gradient_variables=GradientVariablesPrimitive())

Contains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations1D.

  • equations: instance of the CompressibleEulerEquations1D
  • mu: dynamic viscosity,
  • Pr: Prandtl number,
  • gradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().

Fluid properties such as the dynamic viscosity $\mu$ can be provided in any consistent unit system, e.g., [$\mu$] = kg m⁻¹ s⁻¹.

The particular form of the compressible Navier-Stokes implemented is

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho \\ \rho v \\ \rho e @@ -137,7 +137,7 @@ \frac{\partial}{\partial x} \begin{pmatrix} 0 \\ \tau \\ \tau v - q -\end{pmatrix}\]

where the system is closed with the ideal gas assumption giving

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho v^2 \right)\]

as the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations1D. The terms on the right hand side of the system above are built from the viscous stress

\[\tau = \mu \frac{\partial}{\partial x} v\]

where the heat flux is

\[q = -\kappa \frac{\partial}{\partial x} \left(T\right),\quad T = \frac{p}{R\rho}\]

where $T$ is the temperature and $\kappa$ is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is

\[\kappa = \frac{\gamma \mu R}{(\gamma - 1)\textrm{Pr}}.\]

From this combination of temperature $T$ and thermal conductivity $\kappa$ we see that the gas constant R cancels and the heat flux becomes

\[q = -\kappa \frac{\partial}{\partial x} \left(T\right) = -\frac{\gamma \mu}{(\gamma - 1)\textrm{Pr}} \frac{\partial}{\partial x} \left(\frac{p}{\rho}\right)\]

which is the form implemented below in the flux function.

In one spatial dimensions we require gradients for two quantities, e.g., primitive quantities

\[\frac{\partial}{\partial x} v,\, \frac{\partial}{\partial x} T\]

or the entropy variables

\[\frac{\partial}{\partial x} w_2,\, \frac{\partial}{\partial x} w_3\]

where

\[w_2 = \frac{\rho v1}{p},\, w_3 = -\frac{\rho}{p}\]

source
Trixi.CompressibleNavierStokesDiffusion2DType
CompressibleNavierStokesDiffusion2D(equations; mu, Pr,
+\end{pmatrix}\]

where the system is closed with the ideal gas assumption giving

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho v^2 \right)\]

as the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations1D. The terms on the right hand side of the system above are built from the viscous stress

\[\tau = \mu \frac{\partial}{\partial x} v\]

where the heat flux is

\[q = -\kappa \frac{\partial}{\partial x} \left(T\right),\quad T = \frac{p}{R\rho}\]

where $T$ is the temperature and $\kappa$ is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is

\[\kappa = \frac{\gamma \mu R}{(\gamma - 1)\textrm{Pr}}.\]

From this combination of temperature $T$ and thermal conductivity $\kappa$ we see that the gas constant R cancels and the heat flux becomes

\[q = -\kappa \frac{\partial}{\partial x} \left(T\right) = -\frac{\gamma \mu}{(\gamma - 1)\textrm{Pr}} \frac{\partial}{\partial x} \left(\frac{p}{\rho}\right)\]

which is the form implemented below in the flux function.

In one spatial dimensions we require gradients for two quantities, e.g., primitive quantities

\[\frac{\partial}{\partial x} v,\, \frac{\partial}{\partial x} T\]

or the entropy variables

\[\frac{\partial}{\partial x} w_2,\, \frac{\partial}{\partial x} w_3\]

where

\[w_2 = \frac{\rho v1}{p},\, w_3 = -\frac{\rho}{p}\]

source
Trixi.CompressibleNavierStokesDiffusion2DType
CompressibleNavierStokesDiffusion2D(equations; mu, Pr,
                                     gradient_variables=GradientVariablesPrimitive())

Contains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations2D.

  • equations: instance of the CompressibleEulerEquations2D
  • mu: dynamic viscosity,
  • Pr: Prandtl number,
  • gradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().

Fluid properties such as the dynamic viscosity $\mu$ can be provided in any consistent unit system, e.g., [$\mu$] = kg m⁻¹ s⁻¹.

The particular form of the compressible Navier-Stokes implemented is

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho \\ \rho \mathbf{v} \\ \rho e @@ -151,7 +151,7 @@ \nabla \cdot \begin{pmatrix} 0 \\ \underline{\tau} \\ \underline{\tau}\mathbf{v} - \mathbf{q} -\end{pmatrix}\]

where the system is closed with the ideal gas assumption giving

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2) \right)\]

as the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor

\[\underline{\tau} = \mu \left(\nabla\mathbf{v} + \left(\nabla\mathbf{v}\right)^T\right) - \frac{2}{3} \mu \left(\nabla\cdot\mathbf{v}\right)\underline{I}\]

where $\underline{I}$ is the $2\times 2$ identity matrix and the heat flux is

\[\mathbf{q} = -\kappa\nabla\left(T\right),\quad T = \frac{p}{R\rho}\]

where $T$ is the temperature and $\kappa$ is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is

\[\kappa = \frac{\gamma \mu R}{(\gamma - 1)\textrm{Pr}}.\]

From this combination of temperature $T$ and thermal conductivity $\kappa$ we see that the gas constant R cancels and the heat flux becomes

\[\mathbf{q} = -\kappa\nabla\left(T\right) = -\frac{\gamma \mu}{(\gamma - 1)\textrm{Pr}}\nabla\left(\frac{p}{\rho}\right)\]

which is the form implemented below in the flux function.

In two spatial dimensions we require gradients for three quantities, e.g., primitive quantities

\[\nabla v_1,\, \nabla v_2,\, \nabla T\]

or the entropy variables

\[\nabla w_2,\, \nabla w_3,\, \nabla w_4\]

where

\[w_2 = \frac{\rho v_1}{p},\, w_3 = \frac{\rho v_2}{p},\, w_4 = -\frac{\rho}{p}\]

source
Trixi.CompressibleNavierStokesDiffusion3DType
CompressibleNavierStokesDiffusion3D(equations; mu, Pr,
+\end{pmatrix}\]

where the system is closed with the ideal gas assumption giving

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2) \right)\]

as the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor

\[\underline{\tau} = \mu \left(\nabla\mathbf{v} + \left(\nabla\mathbf{v}\right)^T\right) - \frac{2}{3} \mu \left(\nabla\cdot\mathbf{v}\right)\underline{I}\]

where $\underline{I}$ is the $2\times 2$ identity matrix and the heat flux is

\[\mathbf{q} = -\kappa\nabla\left(T\right),\quad T = \frac{p}{R\rho}\]

where $T$ is the temperature and $\kappa$ is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is

\[\kappa = \frac{\gamma \mu R}{(\gamma - 1)\textrm{Pr}}.\]

From this combination of temperature $T$ and thermal conductivity $\kappa$ we see that the gas constant R cancels and the heat flux becomes

\[\mathbf{q} = -\kappa\nabla\left(T\right) = -\frac{\gamma \mu}{(\gamma - 1)\textrm{Pr}}\nabla\left(\frac{p}{\rho}\right)\]

which is the form implemented below in the flux function.

In two spatial dimensions we require gradients for three quantities, e.g., primitive quantities

\[\nabla v_1,\, \nabla v_2,\, \nabla T\]

or the entropy variables

\[\nabla w_2,\, \nabla w_3,\, \nabla w_4\]

where

\[w_2 = \frac{\rho v_1}{p},\, w_3 = \frac{\rho v_2}{p},\, w_4 = -\frac{\rho}{p}\]

source
Trixi.CompressibleNavierStokesDiffusion3DType
CompressibleNavierStokesDiffusion3D(equations; mu, Pr,
                                     gradient_variables=GradientVariablesPrimitive())

Contains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations3D.

  • equations: instance of the CompressibleEulerEquations3D
  • mu: dynamic viscosity,
  • Pr: Prandtl number,
  • gradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().

Fluid properties such as the dynamic viscosity $\mu$ can be provided in any consistent unit system, e.g., [$\mu$] = kg m⁻¹ s⁻¹.

The particular form of the compressible Navier-Stokes implemented is

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho \\ \rho \mathbf{v} \\ \rho e @@ -165,40 +165,41 @@ \nabla \cdot \begin{pmatrix} 0 \\ \underline{\tau} \\ \underline{\tau}\mathbf{v} - \mathbf{q} -\end{pmatrix}\]

where the system is closed with the ideal gas assumption giving

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2+v_3^2) \right)\]

as the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor

\[\underline{\tau} = \mu \left(\nabla\mathbf{v} + \left(\nabla\mathbf{v}\right)^T\right) - \frac{2}{3} \mu \left(\nabla\cdot\mathbf{v}\right)\underline{I}\]

where $\underline{I}$ is the $3\times 3$ identity matrix and the heat flux is

\[\mathbf{q} = -\kappa\nabla\left(T\right),\quad T = \frac{p}{R\rho}\]

where $T$ is the temperature and $\kappa$ is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is

\[\kappa = \frac{\gamma \mu R}{(\gamma - 1)\textrm{Pr}}.\]

From this combination of temperature $T$ and thermal conductivity $\kappa$ we see that the gas constant R cancels and the heat flux becomes

\[\mathbf{q} = -\kappa\nabla\left(T\right) = -\frac{\gamma \mu}{(\gamma - 1)\textrm{Pr}}\nabla\left(\frac{p}{\rho}\right)\]

which is the form implemented below in the flux function.

In two spatial dimensions we require gradients for three quantities, e.g., primitive quantities

\[\nabla v_1,\, \nabla v_2,\, \nabla v_3,\, \nabla T\]

or the entropy variables

\[\nabla w_2,\, \nabla w_3,\, \nabla w_4\, \nabla w_5\]

where

\[w_2 = \frac{\rho v_1}{p},\, w_3 = \frac{\rho v_2}{p},\, w_4 = \frac{\rho v_3}{p},\, w_5 = -\frac{\rho}{p}\]

source
Trixi.ControllerThreeLevelType
ControllerThreeLevel(semi, indicator; base_level=1,
+\end{pmatrix}\]

where the system is closed with the ideal gas assumption giving

\[p = (\gamma - 1) \left( \rho e - \frac{1}{2} \rho (v_1^2+v_2^2+v_3^2) \right)\]

as the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor

\[\underline{\tau} = \mu \left(\nabla\mathbf{v} + \left(\nabla\mathbf{v}\right)^T\right) - \frac{2}{3} \mu \left(\nabla\cdot\mathbf{v}\right)\underline{I}\]

where $\underline{I}$ is the $3\times 3$ identity matrix and the heat flux is

\[\mathbf{q} = -\kappa\nabla\left(T\right),\quad T = \frac{p}{R\rho}\]

where $T$ is the temperature and $\kappa$ is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is

\[\kappa = \frac{\gamma \mu R}{(\gamma - 1)\textrm{Pr}}.\]

From this combination of temperature $T$ and thermal conductivity $\kappa$ we see that the gas constant R cancels and the heat flux becomes

\[\mathbf{q} = -\kappa\nabla\left(T\right) = -\frac{\gamma \mu}{(\gamma - 1)\textrm{Pr}}\nabla\left(\frac{p}{\rho}\right)\]

which is the form implemented below in the flux function.

In two spatial dimensions we require gradients for three quantities, e.g., primitive quantities

\[\nabla v_1,\, \nabla v_2,\, \nabla v_3,\, \nabla T\]

or the entropy variables

\[\nabla w_2,\, \nabla w_3,\, \nabla w_4\, \nabla w_5\]

where

\[w_2 = \frac{\rho v_1}{p},\, w_3 = \frac{\rho v_2}{p},\, w_4 = \frac{\rho v_3}{p},\, w_5 = -\frac{\rho}{p}\]

source
Trixi.ControllerThreeLevelType
ControllerThreeLevel(semi, indicator; base_level=1,
                                       med_level=base_level, med_threshold=0.0,
-                                      max_level=base_level, max_threshold=1.0)

An AMR controller based on three levels (in descending order of precedence):

  • set the target level to max_level if indicator > max_threshold
  • set the target level to med_level if indicator > med_threshold; if med_level < 0, set the target level to the current level
  • set the target level to base_level otherwise
source
Trixi.ControllerThreeLevelCombinedType
ControllerThreeLevelCombined(semi, indicator_primary, indicator_secondary;
+                                      max_level=base_level, max_threshold=1.0)

An AMR controller based on three levels (in descending order of precedence):

  • set the target level to max_level if indicator > max_threshold
  • set the target level to med_level if indicator > med_threshold; if med_level < 0, set the target level to the current level
  • set the target level to base_level otherwise
source
Trixi.ControllerThreeLevelCombinedType
ControllerThreeLevelCombined(semi, indicator_primary, indicator_secondary;
                              base_level=1,
                              med_level=base_level, med_threshold=0.0,
                              max_level=base_level, max_threshold=1.0,
-                             max_threshold_secondary=1.0)

An AMR controller based on three levels (in descending order of precedence):

  • set the target level to max_level if indicator_primary > max_threshold
  • set the target level to med_level if indicator_primary > med_threshold; if med_level < 0, set the target level to the current level
  • set the target level to base_level otherwise

If indicator_secondary >= max_threshold_secondary, set the target level to max_level.

source
Trixi.DGMultiMethod
DGMulti(approximation_type::AbstractDerivativeOperator;
+                             max_threshold_secondary=1.0)

An AMR controller based on three levels (in descending order of precedence):

  • set the target level to max_level if indicator_primary > max_threshold
  • set the target level to med_level if indicator_primary > med_threshold; if med_level < 0, set the target level to the current level
  • set the target level to base_level otherwise

If indicator_secondary >= max_threshold_secondary, set the target level to max_level.

source
Trixi.DGMultiMethod
DGMulti(approximation_type::AbstractDerivativeOperator;
         element_type::AbstractElemShape,
         surface_flux=flux_central,
         surface_integral=SurfaceIntegralWeakForm(surface_flux),
         volume_integral=VolumeIntegralWeakForm(),
-        kwargs...)

Create a summation by parts (SBP) discretization on the given element_type using a tensor product structure based on the 1D SBP derivative operator passed as approximation_type.

For more info, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.

source
Trixi.DGMultiMethod
DGMulti(; polydeg::Integer,
+        kwargs...)

Create a summation by parts (SBP) discretization on the given element_type using a tensor product structure based on the 1D SBP derivative operator passed as approximation_type.

For more info, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.

source
Trixi.DGMultiMethod
DGMulti(; polydeg::Integer,
           element_type::AbstractElemShape,
           approximation_type=Polynomial(),
           surface_flux=flux_central,
           surface_integral=SurfaceIntegralWeakForm(surface_flux),
           volume_integral=VolumeIntegralWeakForm(),
-          RefElemData_kwargs...)

Create a discontinuous Galerkin method which uses

  • approximations of polynomial degree polydeg
  • element type element_type (Tri(), Quad(), Tet(), and Hex() currently supported)

Optional:

  • approximation_type (default is Polynomial(); SBP() also supported for Tri(), Quad(), and Hex() element types).
  • RefElemData_kwargs are additional keyword arguments for RefElemData, such as quad_rule_vol. For more info, see the StartUpDG.jl docs.
source
Trixi.DGMultiMeshType
DGMultiMesh{NDIMS, ...}

DGMultiMesh describes a mesh type which wraps StartUpDG.MeshData and boundary_faces in a dispatchable type. This is intended to store geometric data and connectivities for any type of mesh (Cartesian, affine, curved, structured/unstructured).

source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti{2, Tri}, triangulateIO, boundary_dict::Dict{Symbol, Int})
  • dg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).
  • triangulateIO is a TriangulateIO mesh representation
  • boundary_dict is a Dict{Symbol, Int} which associates each integer TriangulateIO boundary tag with a Symbol.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti)

Constructs a single-element DGMultiMesh for a single periodic element given a DGMulti with approximation_type set to a periodic (finite difference) SBP operator from SummationByPartsOperators.jl.

source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti{NDIMS}, vertex_coordinates, EToV;
+          RefElemData_kwargs...)

Create a discontinuous Galerkin method which uses

  • approximations of polynomial degree polydeg
  • element type element_type (Tri(), Quad(), Tet(), and Hex() currently supported)

Optional:

  • approximation_type (default is Polynomial(); SBP() also supported for Tri(), Quad(), and Hex() element types).
  • RefElemData_kwargs are additional keyword arguments for RefElemData, such as quad_rule_vol. For more info, see the StartUpDG.jl docs.
source
Trixi.DGMultiMeshType
DGMultiMesh{NDIMS, ...}

DGMultiMesh describes a mesh type which wraps StartUpDG.MeshData and boundary_faces in a dispatchable type. This is intended to store geometric data and connectivities for any type of mesh (Cartesian, affine, curved, structured/unstructured).

source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti{2, Tri}, triangulateIO, boundary_dict::Dict{Symbol, Int})
  • dg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).
  • triangulateIO is a TriangulateIO mesh representation
  • boundary_dict is a Dict{Symbol, Int} which associates each integer TriangulateIO boundary tag with a Symbol.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti)

Constructs a single-element DGMultiMesh for a single periodic element given a DGMulti with approximation_type set to a periodic (finite difference) SBP operator from SummationByPartsOperators.jl.

source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti{NDIMS}, vertex_coordinates, EToV;
             is_on_boundary=nothing,
-            periodicity=ntuple(_->false, NDIMS)) where {NDIMS}
  • dg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).
  • vertex_coordinates is a tuple of vectors containing x,y,... components of the vertex coordinates
  • EToV is a 2D array containing element-to-vertex connectivities for each element
  • is_on_boundary specifies boundary using a Dict{Symbol, <:Function}
  • periodicity is a tuple of booleans specifying if the domain is periodic true/false in the (x,y,z) direction.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti{NDIMS}, cells_per_dimension, mapping;
+            periodicity=ntuple(_->false, NDIMS)) where {NDIMS}
  • dg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).
  • vertex_coordinates is a tuple of vectors containing x,y,... components of the vertex coordinates
  • EToV is a 2D array containing element-to-vertex connectivities for each element
  • is_on_boundary specifies boundary using a Dict{Symbol, <:Function}
  • periodicity is a tuple of booleans specifying if the domain is periodic true/false in the (x,y,z) direction.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti{NDIMS}, cells_per_dimension, mapping;
             is_on_boundary=nothing,
-            periodicity=ntuple(_ -> false, NDIMS), kwargs...) where {NDIMS}

Constructs a Curved() DGMultiMesh with element type dg.basis.element_type.

  • mapping is a function which maps from a reference [-1, 1]^NDIMS domain to a mapped domain, e.g., xy = mapping(x, y) in 2D.
  • is_on_boundary specifies boundary using a Dict{Symbol, <:Function}
  • periodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti, cells_per_dimension;
+            periodicity=ntuple(_ -> false, NDIMS), kwargs...) where {NDIMS}

Constructs a Curved() DGMultiMesh with element type dg.basis.element_type.

  • mapping is a function which maps from a reference [-1, 1]^NDIMS domain to a mapped domain, e.g., xy = mapping(x, y) in 2D.
  • is_on_boundary specifies boundary using a Dict{Symbol, <:Function}
  • periodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti, cells_per_dimension;
             coordinates_min=(-1.0, -1.0), coordinates_max=(1.0, 1.0),
             is_on_boundary=nothing,
-            periodicity=ntuple(_ -> false, NDIMS))

Constructs a Cartesian DGMultiMesh with element type dg.basis.element_type. The domain is the tensor product of the intervals [coordinates_min[i], coordinates_max[i]].

  • is_on_boundary specifies boundary using a Dict{Symbol, <:Function}
  • periodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti, filename::String)
  • dg::DGMulti contains information associated with the reference element (e.g., quadrature, basis evaluation, differentiation, etc).
  • filename is a path specifying a .mesh file generated by HOHQMesh.
source
Trixi.DGSEMType
DGSEM(; RealT=Float64, polydeg::Integer,
+            periodicity=ntuple(_ -> false, NDIMS))

Constructs a Cartesian DGMultiMesh with element type dg.basis.element_type. The domain is the tensor product of the intervals [coordinates_min[i], coordinates_max[i]].

  • is_on_boundary specifies boundary using a Dict{Symbol, <:Function}
  • periodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.
source
Trixi.DGMultiMeshMethod
DGMultiMesh(dg::DGMulti, filename::String)
  • dg::DGMulti contains information associated with the reference element (e.g., quadrature, basis evaluation, differentiation, etc).
  • filename is a path specifying a .mesh file generated by HOHQMesh.
source
Trixi.DGSEMType
DGSEM(; RealT=Float64, polydeg::Integer,
         surface_flux=flux_central,
         surface_integral=SurfaceIntegralWeakForm(surface_flux),
         volume_integral=VolumeIntegralWeakForm(),
-        mortar=MortarL2(basis))

Create a discontinuous Galerkin spectral element method (DGSEM) using a LobattoLegendreBasis with polynomials of degree polydeg.

source
Trixi.DissipationLocalLaxFriedrichsType
DissipationLocalLaxFriedrichs(max_abs_speed=max_abs_speed_naive)

Create a local Lax-Friedrichs dissipation operator where the maximum absolute wave speed is estimated as max_abs_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to max_abs_speed_naive.

source
Trixi.EulerAcousticsCouplingCallbackType
EulerAcousticsCouplingCallback
Experimental code

This callback is experimental and may change in any future release.

A callback that couples the acoustic perturbation equations and compressible Euler equations. Must be used in conjunction with SemidiscretizationEulerAcoustics. This callback manages the flow solver - which is always one time step ahead of the acoustics solver - and calculates the acoustic source term after each time step. The linearized Lamb vector is used as the source term, i.e.

\[\mathbf{s} = -(\mathbf{\omega'} \times \bar{\mathbf{v}} - + \bar{\mathbf{\omega}} \times \mathbf{v'}),\]

where $\mathbf{v}$ denotes the velocity, $\mathbf{\omega}$ denotes the vorticity, the bar $\bar{(\cdot)}$ indicates time-averaged quantities (see AveragingCallback) and prime $(\cdot)'$ denotes perturbed quantities defined by $\phi' = \phi - \bar{\phi}$. Note that the perturbed quantities here are based entirely on the pure flow solution and should not be confused with the state variables of the acoustic perturbation equations.

In addition, this callback manages the time step size for both solvers and initializes the mean values of the acoustic perturbation equations using results obtained with the AveragingCallback.

source
Trixi.EulerAcousticsCouplingCallbackMethod
EulerAcousticsCouplingCallback(ode_euler, averaging_file::AbstractString, alg,
-                               cfl_acoustics::Real, cfl_euler::Real; kwargs...)
Experimental code

This callback is experimental and may change in any future release.

Creates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_file (see AveragingCallback).

source
Trixi.DissipationLocalLaxFriedrichsType
DissipationLocalLaxFriedrichs(max_abs_speed=max_abs_speed_naive)

Create a local Lax-Friedrichs dissipation operator where the maximum absolute wave speed is estimated as max_abs_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to max_abs_speed_naive.

source
Trixi.EulerAcousticsCouplingCallbackType
EulerAcousticsCouplingCallback
Experimental code

This callback is experimental and may change in any future release.

A callback that couples the acoustic perturbation equations and compressible Euler equations. Must be used in conjunction with SemidiscretizationEulerAcoustics. This callback manages the flow solver - which is always one time step ahead of the acoustics solver - and calculates the acoustic source term after each time step. The linearized Lamb vector is used as the source term, i.e.

\[\mathbf{s} = -(\mathbf{\omega'} \times \bar{\mathbf{v}} + + \bar{\mathbf{\omega}} \times \mathbf{v'}),\]

where $\mathbf{v}$ denotes the velocity, $\mathbf{\omega}$ denotes the vorticity, the bar $\bar{(\cdot)}$ indicates time-averaged quantities (see AveragingCallback) and prime $(\cdot)'$ denotes perturbed quantities defined by $\phi' = \phi - \bar{\phi}$. Note that the perturbed quantities here are based entirely on the pure flow solution and should not be confused with the state variables of the acoustic perturbation equations.

In addition, this callback manages the time step size for both solvers and initializes the mean values of the acoustic perturbation equations using results obtained with the AveragingCallback.

source
Trixi.EulerAcousticsCouplingCallbackMethod
EulerAcousticsCouplingCallback(ode_euler, averaging_file::AbstractString, alg,
+                               cfl_acoustics::Real, cfl_euler::Real; kwargs...)
Experimental code

This callback is experimental and may change in any future release.

Creates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_file (see AveragingCallback).

source
Trixi.EulerAcousticsCouplingCallbackMethod
EulerAcousticsCouplingCallback(ode_euler,
                                averaging_callback::DiscreteCallback{<:Any, <:AveragingCallback},
-                               alg, cfl_acoustics::Real, cfl_euler::Real; kwargs...)
Experimental code

This callback is experimental and may change in any future release.

Creates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_callback (see AveragingCallback).

source
Trixi.FDSBPType
FDSBP(D_SBP; surface_integral, volume_integral)

Specialization of DG methods that uses general summation by parts (SBP) operators from SummationByPartsOperators.jl. In particular, this includes classical finite difference (FD) SBP methods. These methods have the same structure as classical DG methods - local operations on elements with connectivity through interfaces without imposing any continuity constraints.

D_SBP is an SBP derivative operator from SummationByPartsOperators.jl. The other arguments have the same meaning as in DG or DGSEM.

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.FluxHLLType
FluxHLL(min_max_speed=min_max_speed_naive)

Create an HLL (Harten, Lax, van Leer) numerical flux where the minimum and maximum wave speeds are estimated as λ_min, λ_max = min_max_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to min_max_speed_naive. Original paper:

  • Amiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002
source
Trixi.FluxHydrostaticReconstructionType
FluxHydrostaticReconstruction(numerical_flux, hydrostatic_reconstruction)
Experimental code

This numerical flux is experimental and may change in any future release.

Allow for some kind of hydrostatic reconstruction of the solution state prior to the surface flux computation. This is a particular strategy to ensure that the method remains well-balanced for the shallow water equations, see ShallowWaterEquations1D or ShallowWaterEquations2D.

For example, the hydrostatic reconstruction from Audusse et al. is implemented in one and two spatial dimensions, see hydrostatic_reconstruction_audusse_etal or the original paper

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090

Other hydrostatic reconstruction techniques are available, particularly to handle wet / dry fronts. A good overview of the development and application of hydrostatic reconstruction can be found in

  • Guoxian Chen and Sebastian Noelle A unified surface-gradient and hydrostatic reconstruction scheme for the shallow water equations (2021) RWTH Aachen preprint
  • Andreas Buttinger-Kreuzhuber, Zsolt Horváth, Sebastian Noelle, Günter Blöschl and Jürgen Waser (2019) A fast second-order shallow water scheme on two-dimensional structured grids over abrupt topography DOI: 10.1016/j.advwatres.2019.03.010
source
Trixi.FluxLMARSType
FluxLMARS(c)(u_ll, u_rr, orientation_or_normal_direction,
-             equations::CompressibleEulerEquations3D)

Low Mach number approximate Riemann solver (LMARS) for atmospheric flows using an estimate c of the speed of sound.

References:

  • Xi Chen et al. (2013) A Control-Volume Model of the Compressible Euler Equations with a Vertical Lagrangian Coordinate DOI: 10.1175/MWR-D-12-00129.1
source
Trixi.FluxPlusDissipationType
FluxPlusDissipation(numerical_flux, dissipation)

Combine a numerical_flux with a dissipation operator to create a new numerical flux.

source
Trixi.FluxRotatedType
FluxRotated(numerical_flux)

Compute a numerical_flux flux in direction of a normal vector by rotating the solution, computing the numerical flux in x-direction, and rotating the calculated flux back.

Requires a rotationally invariant equation with equation-specific functions rotate_to_x and rotate_from_x.

source
Trixi.FluxUpwindType
FluxUpwind(splitting)

A numerical flux f(u_left, u_right) = f⁺(u_left) + f⁻(u_right) based on flux vector splitting.

The SurfaceIntegralUpwind with a given splitting is equivalent to the SurfaceIntegralStrongForm with FluxUpwind(splitting) as numerical flux (up to floating point differences).

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.GlmSpeedCallbackType
GlmSpeedCallback(; glm_scale=0.5, cfl)

Update the divergence cleaning wave speed c_h according to the time step computed in StepsizeCallback for the ideal GLM-MHD equations. The cfl number should be set to the same value as for the time step size calculation. The glm_scale ensures that the GLM wave speed is lower than the fastest physical waves in the MHD solution and should thus be set to a value within the interval [0,1]. Note that glm_scale = 0 deactivates the divergence cleaning.

source
Trixi.GradientVariablesPrimitiveType

GradientVariablesPrimitive and GradientVariablesEntropy are gradient variable type parameters for CompressibleNavierStokesDiffusion1D. By default, the gradient variables are set to be GradientVariablesPrimitive. Specifying GradientVariablesEntropy instead uses the entropy variable formulation from

  • Hughes, Mallet, Franca (1986) A new finite element formulation for computational fluid dynamics: I. Symmetric forms of the compressible Euler and Navier-Stokes equations and the second law of thermodynamics. https://doi.org/10.1016/0045-7825(86)90127-1

Under GradientVariablesEntropy, the Navier-Stokes discretization is provably entropy stable.

source
Trixi.HypDiffN3Erk3Sstar52Type
HypDiffN3Erk3Sstar52()

Five stage, second-order accurate explicit Runge-Kutta scheme with stability region optimized for the hyperbolic diffusion equation with LLF flux and polynomials of degree polydeg=3.

source
Trixi.HyperbolicDiffusionEquations1DType
HyperbolicDiffusionEquations1D

The linear hyperbolic diffusion equations in one space dimension. A description of this system can be found in Sec. 2.5 of the book

Further analysis can be found in the paper

source
Trixi.IdealGlmMhdEquations1DType
IdealGlmMhdEquations1D(gamma)

The ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in one space dimension.

Note

There is no divergence cleaning variable psi because the divergence-free constraint is satisfied trivially in one spatial dimension.

source
Trixi.IdealGlmMhdEquations2DType
IdealGlmMhdEquations2D(gamma)

The ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in two space dimensions.

source
Trixi.IdealGlmMhdEquations3DType
IdealGlmMhdEquations3D(gamma)

The ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in three space dimensions.

source
Trixi.IndicatorHennemannGassnerType
IndicatorHennemannGassner(equations::AbstractEquations, basis;
+                               alg, cfl_acoustics::Real, cfl_euler::Real; kwargs...)
Experimental code

This callback is experimental and may change in any future release.

Creates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_callback (see AveragingCallback).

source
Trixi.FDSBPType
FDSBP(D_SBP; surface_integral, volume_integral)

Specialization of DG methods that uses general summation by parts (SBP) operators from SummationByPartsOperators.jl. In particular, this includes classical finite difference (FD) SBP methods. These methods have the same structure as classical DG methods - local operations on elements with connectivity through interfaces without imposing any continuity constraints.

D_SBP is an SBP derivative operator from SummationByPartsOperators.jl. The other arguments have the same meaning as in DG or DGSEM.

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.FluxHLLType
FluxHLL(min_max_speed=min_max_speed_davis)

Create an HLL (Harten, Lax, van Leer) numerical flux where the minimum and maximum wave speeds are estimated as λ_min, λ_max = min_max_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to min_max_speed_davis. Original paper:

  • Amiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002
source
Trixi.FluxHydrostaticReconstructionType
FluxHydrostaticReconstruction(numerical_flux, hydrostatic_reconstruction)
Experimental code

This numerical flux is experimental and may change in any future release.

Allow for some kind of hydrostatic reconstruction of the solution state prior to the surface flux computation. This is a particular strategy to ensure that the method remains well-balanced for the shallow water equations, see ShallowWaterEquations1D or ShallowWaterEquations2D.

For example, the hydrostatic reconstruction from Audusse et al. is implemented in one and two spatial dimensions, see hydrostatic_reconstruction_audusse_etal or the original paper

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090

Other hydrostatic reconstruction techniques are available, particularly to handle wet / dry fronts. A good overview of the development and application of hydrostatic reconstruction can be found in

  • Guoxian Chen and Sebastian Noelle A unified surface-gradient and hydrostatic reconstruction scheme for the shallow water equations (2021) RWTH Aachen preprint
  • Andreas Buttinger-Kreuzhuber, Zsolt Horváth, Sebastian Noelle, Günter Blöschl and Jürgen Waser (2019) A fast second-order shallow water scheme on two-dimensional structured grids over abrupt topography DOI: 10.1016/j.advwatres.2019.03.010
source
Trixi.FluxLMARSType
FluxLMARS(c)(u_ll, u_rr, orientation_or_normal_direction,
+             equations::CompressibleEulerEquations2D)

Low Mach number approximate Riemann solver (LMARS) for atmospheric flows using an estimate c of the speed of sound.

References:

  • Xi Chen et al. (2013) A Control-Volume Model of the Compressible Euler Equations with a Vertical Lagrangian Coordinate DOI: 10.1175/MWR-D-12-00129.1
source
Trixi.FluxLMARSMethod
FluxLMARS(c)(u_ll, u_rr, orientation_or_normal_direction,
+             equations::CompressibleEulerEquations3D)

Low Mach number approximate Riemann solver (LMARS) for atmospheric flows using an estimate c of the speed of sound.

References:

  • Xi Chen et al. (2013) A Control-Volume Model of the Compressible Euler Equations with a Vertical Lagrangian Coordinate DOI: 10.1175/MWR-D-12-00129.1
source
Trixi.FluxPlusDissipationType
FluxPlusDissipation(numerical_flux, dissipation)

Combine a numerical_flux with a dissipation operator to create a new numerical flux.

source
Trixi.FluxRotatedType
FluxRotated(numerical_flux)

Compute a numerical_flux flux in direction of a normal vector by rotating the solution, computing the numerical flux in x-direction, and rotating the calculated flux back.

Requires a rotationally invariant equation with equation-specific functions rotate_to_x and rotate_from_x.

source
Trixi.FluxUpwindType
FluxUpwind(splitting)

A numerical flux f(u_left, u_right) = f⁺(u_left) + f⁻(u_right) based on flux vector splitting.

The SurfaceIntegralUpwind with a given splitting is equivalent to the SurfaceIntegralStrongForm with FluxUpwind(splitting) as numerical flux (up to floating point differences).

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.GlmSpeedCallbackType
GlmSpeedCallback(; glm_scale=0.5, cfl)

Update the divergence cleaning wave speed c_h according to the time step computed in StepsizeCallback for the ideal GLM-MHD equations. The cfl number should be set to the same value as for the time step size calculation. The glm_scale ensures that the GLM wave speed is lower than the fastest physical waves in the MHD solution and should thus be set to a value within the interval [0,1]. Note that glm_scale = 0 deactivates the divergence cleaning.

source
Trixi.GradientVariablesPrimitiveType

GradientVariablesPrimitive and GradientVariablesEntropy are gradient variable type parameters for CompressibleNavierStokesDiffusion1D. By default, the gradient variables are set to be GradientVariablesPrimitive. Specifying GradientVariablesEntropy instead uses the entropy variable formulation from

  • Hughes, Mallet, Franca (1986) A new finite element formulation for computational fluid dynamics: I. Symmetric forms of the compressible Euler and Navier-Stokes equations and the second law of thermodynamics. https://doi.org/10.1016/0045-7825(86)90127-1

Under GradientVariablesEntropy, the Navier-Stokes discretization is provably entropy stable.

source
Trixi.HypDiffN3Erk3Sstar52Type
HypDiffN3Erk3Sstar52()

Five stage, second-order accurate explicit Runge-Kutta scheme with stability region optimized for the hyperbolic diffusion equation with LLF flux and polynomials of degree polydeg=3.

source
Trixi.HyperbolicDiffusionEquations1DType
HyperbolicDiffusionEquations1D

The linear hyperbolic diffusion equations in one space dimension. A description of this system can be found in Sec. 2.5 of the book

Further analysis can be found in the paper

source
Trixi.IdealGlmMhdEquations1DType
IdealGlmMhdEquations1D(gamma)

The ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in one space dimension.

Note

There is no divergence cleaning variable psi because the divergence-free constraint is satisfied trivially in one spatial dimension.

source
Trixi.IdealGlmMhdEquations2DType
IdealGlmMhdEquations2D(gamma)

The ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in two space dimensions.

source
Trixi.IdealGlmMhdEquations3DType
IdealGlmMhdEquations3D(gamma)

The ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in three space dimensions.

source
Trixi.IndicatorHennemannGassnerType
IndicatorHennemannGassner(equations::AbstractEquations, basis;
                           alpha_max=0.5,
                           alpha_min=0.001,
                           alpha_smooth=true,
@@ -207,24 +208,20 @@
                           alpha_max=0.5,
                           alpha_min=0.001,
                           alpha_smooth=true,
-                          variable)

Indicator used for shock-capturing (when passing the equations and the basis) or adaptive mesh refinement (AMR, when passing the semi).

See also VolumeIntegralShockCapturingHG.

References

  • Hennemann, Gassner (2020) "A provably entropy stable subcell shock capturing approach for high order split form DG" arXiv: 2008.12044
source
Trixi.IndicatorHennemannGassnerShallowWaterType
IndicatorHennemannGassnerShallowWater(equations::AbstractEquations, basis;
-                                      alpha_max=0.5,
-                                      alpha_min=0.001,
-                                      alpha_smooth=true,
-                                      variable)

Modified version of the IndicatorHennemannGassner indicator used for shock-capturing for shallow water equations. After the element-wise values for the blending factors are computed an additional check is made to see if the element is partially wet. In this case, partially wet elements are set to use the pure finite volume scheme that is guaranteed to be well-balanced for this wet/dry transition state of the flow regime.

See also VolumeIntegralShockCapturingHG.

References

  • Hennemann, Gassner (2020) "A provably entropy stable subcell shock capturing approach for high order split form DG" arXiv: 2008.12044
source
Trixi.IndicatorLöhnerType
IndicatorLöhner (equivalent to IndicatorLoehner)
+                          variable)

Indicator used for shock-capturing (when passing the equations and the basis) or adaptive mesh refinement (AMR, when passing the semi).

See also VolumeIntegralShockCapturingHG.

References

  • Hennemann, Gassner (2020) "A provably entropy stable subcell shock capturing approach for high order split form DG" arXiv: 2008.12044
source
Trixi.IndicatorLöhnerType
IndicatorLöhner (equivalent to IndicatorLoehner)
 
 IndicatorLöhner(equations::AbstractEquations, basis;
                 f_wave=0.2, variable)
 IndicatorLöhner(semi::AbstractSemidiscretization;
-                f_wave=0.2, variable)

AMR indicator adapted from a FEM indicator by Löhner (1987), also used in the FLASH code as standard AMR indicator. The indicator estimates a weighted second derivative of a specified variable locally.

When constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.

References

source
Trixi.IndicatorMaxType
IndicatorMax(equations::AbstractEquations, basis; variable)
-IndicatorMax(semi::AbstractSemidiscretization; variable)

A simple indicator returning the maximum of variable in an element. When constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.

source
Trixi.IsothermalType
struct Isothermal

Used to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and return a scalar value for the temperature at point x and time t.

source
Trixi.LaplaceDiffusion1DType
LaplaceDiffusion1D(diffusivity, equations)

LaplaceDiffusion1D represents a scalar diffusion term $\nabla \cdot (\kappa\nabla u))$ with diffusivity $\kappa$ applied to each solution component defined by equations.

source
Trixi.LaplaceDiffusion2DType
LaplaceDiffusion2D(diffusivity, equations)

LaplaceDiffusion2D represents a scalar diffusion term $\nabla \cdot (\kappa\nabla u))$ with diffusivity $\kappa$ applied to each solution component defined by equations.

source
Trixi.LaplaceDiffusion3DType
LaplaceDiffusion3D(diffusivity, equations)

LaplaceDiffusion3D represents a scalar diffusion term $\nabla \cdot (\kappa\nabla u))$ with diffusivity $\kappa$ applied to each solution component defined by equations.

source
Trixi.LatticeBoltzmannEquations2DType
LatticeBoltzmannEquations2D(; Ma, Re, collision_op=collision_bgk,
+                f_wave=0.2, variable)

AMR indicator adapted from a FEM indicator by Löhner (1987), also used in the FLASH code as standard AMR indicator. The indicator estimates a weighted second derivative of a specified variable locally.

When constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.

References

source
Trixi.IndicatorMaxType
IndicatorMax(equations::AbstractEquations, basis; variable)
+IndicatorMax(semi::AbstractSemidiscretization; variable)

A simple indicator returning the maximum of variable in an element. When constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.

source
Trixi.IsothermalType
struct Isothermal

Used to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and return a scalar value for the temperature at point x and time t.

source
Trixi.LaplaceDiffusion1DType
LaplaceDiffusion1D(diffusivity, equations)

LaplaceDiffusion1D represents a scalar diffusion term $\nabla \cdot (\kappa\nabla u))$ with diffusivity $\kappa$ applied to each solution component defined by equations.

source
Trixi.LaplaceDiffusion2DType
LaplaceDiffusion2D(diffusivity, equations)

LaplaceDiffusion2D represents a scalar diffusion term $\nabla \cdot (\kappa\nabla u))$ with diffusivity $\kappa$ applied to each solution component defined by equations.

source
Trixi.LaplaceDiffusion3DType
LaplaceDiffusion3D(diffusivity, equations)

LaplaceDiffusion3D represents a scalar diffusion term $\nabla \cdot (\kappa\nabla u))$ with diffusivity $\kappa$ applied to each solution component defined by equations.

source
Trixi.LatticeBoltzmannEquations2DType
LatticeBoltzmannEquations2D(; Ma, Re, collision_op=collision_bgk,
                            c=1, L=1, rho0=1, u0=nothing, nu=nothing)

The Lattice-Boltzmann equations

\[\partial_t u_\alpha + v_{\alpha,1} \partial_1 u_\alpha + v_{\alpha,2} \partial_2 u_\alpha = 0\]

in two space dimensions for the D2Q9 scheme.

The characteristic Mach number and Reynolds numbers are specified as Ma and Re. By the default, the collision operator collision_op is set to the BGK model. c, L, and rho0 specify the mean thermal molecular velocity, the characteristic length, and the reference density, respectively. They can usually be left to the default values. If desired, instead of the Mach number, one can set the macroscopic reference velocity u0 directly (Ma needs to be set to nothing in this case). Likewise, instead of the Reynolds number one can specify the kinematic viscosity nu directly (in this case, Re needs to be set to nothing).

The nine discrete velocity directions of the D2Q9 scheme are sorted as follows [4]:

  6     2     5       y
     ┌───┼───┐         │
     │       │         │
   3 ┼   9   ┼ 1        ──── x
     │       │        ╱
     └───┼───┘       ╱
-  7     4     8    z

Note that usually the velocities are numbered from 0 to 8, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 9, where 1 through 8 correspond to the velocity directions in [4] and 9 is the zero velocity.

The corresponding opposite directions are:

  • 1 ←→ 3
  • 2 ←→ 4
  • 3 ←→ 1
  • 4 ←→ 2
  • 5 ←→ 7
  • 6 ←→ 8
  • 7 ←→ 5
  • 8 ←→ 6
  • 9 ←→ 9

The main sources for the base implementation were

  1. Misun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024
  2. Karsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.
  3. Dieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0
  4. Dieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3
source
Trixi.LatticeBoltzmannEquations3DType
LatticeBoltzmannEquations3D(; Ma, Re, collision_op=collision_bgk,
+  7     4     8    z

Note that usually the velocities are numbered from 0 to 8, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 9, where 1 through 8 correspond to the velocity directions in [4] and 9 is the zero velocity.

The corresponding opposite directions are:

  • 1 ←→ 3
  • 2 ←→ 4
  • 3 ←→ 1
  • 4 ←→ 2
  • 5 ←→ 7
  • 6 ←→ 8
  • 7 ←→ 5
  • 8 ←→ 6
  • 9 ←→ 9

The main sources for the base implementation were

  1. Misun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024
  2. Karsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.
  3. Dieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0
  4. Dieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3
source
Trixi.LatticeBoltzmannEquations3DType
LatticeBoltzmannEquations3D(; Ma, Re, collision_op=collision_bgk,
                            c=1, L=1, rho0=1, u0=nothing, nu=nothing)

The Lattice-Boltzmann equations

\[\partial_t u_\alpha + v_{\alpha,1} \partial_1 u_\alpha + v_{\alpha,2} \partial_2 u_\alpha + v_{\alpha,3} \partial_3 u_\alpha = 0\]

in three space dimensions for the D3Q27 scheme.

The characteristic Mach number and Reynolds numbers are specified as Ma and Re. By the default, the collision operator collision_op is set to the BGK model. c, L, and rho0 specify the mean thermal molecular velocity, the characteristic length, and the reference density, respectively. They can usually be left to the default values. If desired, instead of the Mach number, one can set the macroscopic reference velocity u0 directly (Ma needs to be set to nothing in this case). Likewise, instead of the Reynolds number one can specify the kinematic viscosity nu directly (in this case, Re needs to be set to nothing).

The twenty-seven discrete velocity directions of the D3Q27 scheme are sorted as follows [4]:

  • plane at z = -1:
      24    17     21       y
          ┌───┼───┐          │
          │       │          │
    @@ -243,7 +240,7 @@
       16 ┼   5   ┼ 9         ──── x
          │       │         ╱
          └───┼───┘        ╱
    -  22    18     23    z

Note that usually the velocities are numbered from 0 to 26, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 27, where 1 through 26 correspond to the velocity directions in [4] and 27 is the zero velocity.

The corresponding opposite directions are:

  • 1 ←→ 2
  • 2 ←→ 1
  • 3 ←→ 4
  • 4 ←→ 3
  • 5 ←→ 6
  • 6 ←→ 5
  • 7 ←→ 8
  • 8 ←→ 7
  • 9 ←→ 10
  • 10 ←→ 9
  • 11 ←→ 12
  • 12 ←→ 11
  • 13 ←→ 14
  • 14 ←→ 13
  • 15 ←→ 16
  • 16 ←→ 15
  • 17 ←→ 18
  • 18 ←→ 17
  • 19 ←→ 20
  • 20 ←→ 19
  • 21 ←→ 22
  • 22 ←→ 21
  • 23 ←→ 24
  • 24 ←→ 23
  • 25 ←→ 26
  • 26 ←→ 25
  • 27 ←→ 27

The main sources for the base implementation were

  1. Misun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024
  2. Karsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.
  3. Dieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0
  4. Dieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3
source
Trixi.LinearScalarAdvectionEquation2DType
LinearScalarAdvectionEquation2D

The linear scalar advection equation

\[\partial_t u + a_1 \partial_1 u + a_2 \partial_2 u = 0\]

in two space dimensions with constant velocity a.

source
Trixi.LinearScalarAdvectionEquation3DType
LinearScalarAdvectionEquation3D

The linear scalar advection equation

\[\partial_t u + a_1 \partial_1 u + a_2 \partial_2 u + a_3 \partial_3 u = 0\]

in three space dimensions with constant velocity a.

source
Trixi.LinearizedEulerEquations2DType
LinearizedEulerEquations2D(v_mean_global, c_mean_global, rho_mean_global)

Linearized euler equations in two space dimensions. The equations are given by

\[\partial_t + 22 18 23 z

Note that usually the velocities are numbered from 0 to 26, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 27, where 1 through 26 correspond to the velocity directions in [4] and 27 is the zero velocity.

The corresponding opposite directions are:

  • 1 ←→ 2
  • 2 ←→ 1
  • 3 ←→ 4
  • 4 ←→ 3
  • 5 ←→ 6
  • 6 ←→ 5
  • 7 ←→ 8
  • 8 ←→ 7
  • 9 ←→ 10
  • 10 ←→ 9
  • 11 ←→ 12
  • 12 ←→ 11
  • 13 ←→ 14
  • 14 ←→ 13
  • 15 ←→ 16
  • 16 ←→ 15
  • 17 ←→ 18
  • 18 ←→ 17
  • 19 ←→ 20
  • 20 ←→ 19
  • 21 ←→ 22
  • 22 ←→ 21
  • 23 ←→ 24
  • 24 ←→ 23
  • 25 ←→ 26
  • 26 ←→ 25
  • 27 ←→ 27

The main sources for the base implementation were

  1. Misun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024
  2. Karsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.
  3. Dieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0
  4. Dieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3
source
Trixi.LinearScalarAdvectionEquation2DType
LinearScalarAdvectionEquation2D

The linear scalar advection equation

\[\partial_t u + a_1 \partial_1 u + a_2 \partial_2 u = 0\]

in two space dimensions with constant velocity a.

source
Trixi.LinearScalarAdvectionEquation3DType
LinearScalarAdvectionEquation3D

The linear scalar advection equation

\[\partial_t u + a_1 \partial_1 u + a_2 \partial_2 u + a_3 \partial_3 u = 0\]

in three space dimensions with constant velocity a.

source
Trixi.LinearizedEulerEquations2DType
LinearizedEulerEquations2D(v_mean_global, c_mean_global, rho_mean_global)

Linearized euler equations in two space dimensions. The equations are given by

\[\partial_t \begin{pmatrix} \rho' \\ v_1' \\ v_2' \\ p' \end{pmatrix} @@ -260,19 +257,20 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 -\end{pmatrix}\]

The bar $\bar{(\cdot)}$ indicates uniform mean flow variables and c is the speed of sound. The unknowns are the acoustic velocities $v' = (v_1', v_2')$, the pressure $p'$ and the density $\rho'$.

source
Trixi.LobattoLegendreBasisType
LobattoLegendreBasis([RealT=Float64,] polydeg::Integer)

Create a nodal Lobatto-Legendre basis for polynomials of degree polydeg.

For the special case polydeg=0 the DG method reduces to a finite volume method. Therefore, this function sets the center point of the cell as single node.

source
Trixi.NoSlipType
struct NoSlip

Use to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and should return a SVector{NDIMS} whose entries are the velocity vector at a point x and time t.

source
Trixi.NonConservativeLocalType
NonConservativeLocal()

Struct used for multiple dispatch on non-conservative flux functions in the format of "local * symmetric". When the argument nonconservative_type is of type NonConservativeLocal, the function returns the local part of the non-conservative term.

source
Trixi.NonConservativeSymmetricType
NonConservativeSymmetric()

Struct used for multiple dispatch on non-conservative flux functions in the format of "local * symmetric". When the argument nonconservative_type is of type NonConservativeSymmetric, the function returns the symmetric part of the non-conservative term.

source
Trixi.P4estMeshType
P4estMesh{NDIMS} <: AbstractMesh{NDIMS}

An unstructured curved mesh based on trees that uses the C library p4est to manage trees and mesh refinement.

source
Trixi.P4estMeshMethod
P4estMesh(trees_per_dimension; polydeg,
+\end{pmatrix}\]

The bar $\bar{(\cdot)}$ indicates uniform mean flow variables and c is the speed of sound. The unknowns are the acoustic velocities $v' = (v_1', v_2')$, the pressure $p'$ and the density $\rho'$.

source
Trixi.LobattoLegendreBasisType
LobattoLegendreBasis([RealT=Float64,] polydeg::Integer)

Create a nodal Lobatto-Legendre basis for polynomials of degree polydeg.

For the special case polydeg=0 the DG method reduces to a finite volume method. Therefore, this function sets the center point of the cell as single node.

source
Trixi.NoSlipType
struct NoSlip

Use to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and should return a SVector{NDIMS} whose entries are the velocity vector at a point x and time t.

source
Trixi.NonConservativeLocalType
NonConservativeLocal()

Struct used for multiple dispatch on non-conservative flux functions in the format of "local * symmetric". When the argument nonconservative_type is of type NonConservativeLocal, the function returns the local part of the non-conservative term.

source
Trixi.NonConservativeSymmetricType
NonConservativeSymmetric()

Struct used for multiple dispatch on non-conservative flux functions in the format of "local * symmetric". When the argument nonconservative_type is of type NonConservativeSymmetric, the function returns the symmetric part of the non-conservative term.

source
Trixi.P4estMeshType
P4estMesh{NDIMS} <: AbstractMesh{NDIMS}

An unstructured curved mesh based on trees that uses the C library p4est to manage trees and mesh refinement.

source
Trixi.P4estMeshMethod
P4estMesh(trees_per_dimension; polydeg,
           mapping=nothing, faces=nothing, coordinates_min=nothing, coordinates_max=nothing,
           RealT=Float64, initial_refinement_level=0, periodicity=true, unsaved_changes=true,
-          p4est_partition_allow_for_coarsening=true)

Create a structured curved P4estMesh of the specified size.

There are three ways to map the mesh to the physical domain.

  1. Define a mapping that maps the hypercube [-1, 1]^n.
  2. Specify a Tuple faces of functions that parametrize each face.
  3. Create a rectangular mesh by specifying coordinates_min and coordinates_max.

Non-periodic boundaries will be called :x_neg, :x_pos, :y_neg, :y_pos, :z_neg, :z_pos.

Arguments

  • trees_per_dimension::NTupleE{NDIMS, Int}: the number of trees in each dimension.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the reference mesh ([-1, 1]^n) to the physical domain. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • faces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D). Use only one of mapping, faces and coordinates_min/coordinates_max.
  • coordinates_min: vector or tuple of the coordinates of the corner in the negative direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • coordinates_max: vector or tuple of the coordinates of the corner in the positive direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • p4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.
source
Trixi.P4estMeshMethod
P4estMesh{NDIMS}(meshfile::String;
+          p4est_partition_allow_for_coarsening=true)

Create a structured curved P4estMesh of the specified size.

There are three ways to map the mesh to the physical domain.

  1. Define a mapping that maps the hypercube [-1, 1]^n.
  2. Specify a Tuple faces of functions that parametrize each face.
  3. Create a rectangular mesh by specifying coordinates_min and coordinates_max.

Non-periodic boundaries will be called :x_neg, :x_pos, :y_neg, :y_pos, :z_neg, :z_pos.

Arguments

  • trees_per_dimension::NTupleE{NDIMS, Int}: the number of trees in each dimension.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the reference mesh ([-1, 1]^n) to the physical domain. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • faces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D). Use only one of mapping, faces and coordinates_min/coordinates_max.
  • coordinates_min: vector or tuple of the coordinates of the corner in the negative direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • coordinates_max: vector or tuple of the coordinates of the corner in the positive direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • p4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.
source
Trixi.P4estMeshMethod
P4estMesh{NDIMS}(meshfile::String;
                  mapping=nothing, polydeg=1, RealT=Float64,
                  initial_refinement_level=0, unsaved_changes=true,
-                 p4est_partition_allow_for_coarsening=true)

Main mesh constructor for the P4estMesh that imports an unstructured, conforming mesh from an Abaqus mesh file (.inp). Each element of the conforming mesh parsed from the meshfile is created as a p4est tree datatype.

To create a curved unstructured mesh P4estMesh two strategies are available:

  • p4est_mesh_from_hohqmesh_abaqus: High-order, curved boundary information created by HOHQMesh.jl is available in the meshfile. The mesh polynomial degree polydeg of the boundaries is provided from the meshfile. The computation of the mapped tree coordinates is done with transfinite interpolation with linear blending similar to UnstructuredMesh2D. Boundary name information is also parsed from the meshfile such that different boundary conditions can be set at each named boundary on a given tree.
  • p4est_mesh_from_standard_abaqus: By default, with mapping=nothing and polydeg=1, this creates a straight-sided from the information parsed from the meshfile. If a mapping function is specified then it computes the mapped tree coordinates via polynomial interpolants with degree polydeg. The mesh created by this function will only have one boundary :all, as distinguishing different physical boundaries is non-trivial.

Note that the mapping and polydeg keyword arguments are only used by the p4est_mesh_from_standard_abaqus function. The p4est_mesh_from_hohqmesh_abaqus function obtains the mesh polydeg directly from the meshfile and constructs the transfinite mapping internally.

The particular strategy is selected according to the header present in the meshfile where the constructor checks whether or not the meshfile was created with HOHQMesh.jl. If the Abaqus file header is not present in the meshfile then the P4estMesh is created with the function p4est_mesh_from_standard_abaqus.

The default keyword argument initial_refinement_level=0 corresponds to a forest where the number of trees is the same as the number of elements in the original meshfile. Increasing the initial_refinement_level allows one to uniformly refine the base mesh given in the meshfile to create a forest with more trees before the simulation begins. For example, if a two-dimensional base mesh contains 25 elements then setting initial_refinement_level=1 creates an initial forest of 2^2 * 25 = 100 trees.

Arguments

  • meshfile::String: an uncurved Abaqus mesh file that can be imported by p4est.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • p4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.
source
Trixi.ParametersEulerGravityType
ParametersEulerGravity(; background_density=0.0,
+                 p4est_partition_allow_for_coarsening=true,
+                 boundary_symbols = nothing)

Main mesh constructor for the P4estMesh that imports an unstructured, conforming mesh from an Abaqus mesh file (.inp). Each element of the conforming mesh parsed from the meshfile is created as a p4est tree datatype.

To create a curved unstructured mesh P4estMesh two strategies are available:

  • p4est_mesh_from_hohqmesh_abaqus: High-order, curved boundary information created by HOHQMesh.jl is available in the meshfile. The mesh polynomial degree polydeg of the boundaries is provided from the meshfile. The computation of the mapped tree coordinates is done with transfinite interpolation with linear blending similar to UnstructuredMesh2D. Boundary name information is also parsed from the meshfile such that different boundary conditions can be set at each named boundary on a given tree.
  • p4est_mesh_from_standard_abaqus: By default, with mapping=nothing and polydeg=1, this creates a straight-sided from the information parsed from the meshfile. If a mapping function is specified then it computes the mapped tree coordinates via polynomial interpolants with degree polydeg. The mesh created by this function will only have one boundary :all if boundary_symbols is not specified. If boundary_symbols is specified the mesh file will be parsed for nodesets defining the boundary nodes from which boundary edges (2D) and faces (3D) will be assigned.

Note that the mapping and polydeg keyword arguments are only used by the p4est_mesh_from_standard_abaqus function. The p4est_mesh_from_hohqmesh_abaqus function obtains the mesh polydeg directly from the meshfile and constructs the transfinite mapping internally.

The particular strategy is selected according to the header present in the meshfile where the constructor checks whether or not the meshfile was created with HOHQMesh.jl. If the Abaqus file header is not present in the meshfile then the P4estMesh is created with the function p4est_mesh_from_standard_abaqus.

The default keyword argument initial_refinement_level=0 corresponds to a forest where the number of trees is the same as the number of elements in the original meshfile. Increasing the initial_refinement_level allows one to uniformly refine the base mesh given in the meshfile to create a forest with more trees before the simulation begins. For example, if a two-dimensional base mesh contains 25 elements then setting initial_refinement_level=1 creates an initial forest of 2^2 * 25 = 100 trees.

Arguments

  • meshfile::String: an uncurved Abaqus mesh file that can be imported by p4est.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • p4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.
  • boundary_symbols::Vector{Symbol}: A vector of symbols that correspond to the boundary names in the meshfile. If nothing is passed then all boundaries are named :all.
source
Trixi.PerformanceCounterType
PerformanceCounter()

A PerformanceCounter can be used to track the runtime performance of some calls. Add a new runtime measurement via put!(counter, runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.

source
Trixi.PerformanceCounterListType
PerformanceCounterList{N}()

A PerformanceCounterList{N} can be used to track the runtime performance of calls to multiple functions, adding them up. Add a new runtime measurement via put!(counter.counters[i], runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.

source
Trixi.PlotData1DType
PlotData1D

Holds all relevant data for creating 1D plots of multiple solution variables and to visualize the mesh.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PlotData1DMethod
PlotData1D(u, semi [or mesh, equations, solver, cache];
-           solution_variables=nothing, nvisnodes=nothing)

Create a new PlotData1D object that can be used for visualizing 1D DGSEM solution data array u with Plots.jl. All relevant geometrical information is extracted from the semidiscretization semi. By default, the primitive variables (if existent) or the conservative variables (otherwise) from the solution are used for plotting. This can be changed by passing an appropriate conversion function to solution_variables.

nvisnodes specifies the number of visualization nodes to be used. If it is nothing, twice the number of solution DG nodes are used for visualization, and if set to 0, exactly the number of nodes in the DG elements are used.

When visualizing data from a two-dimensional simulation, a 1D slice is extracted for plotting. slice specifies the axis along which the slice is extracted and may be :x, or :y. The slice position is specified by a point that lies on it, which defaults to (0.0, 0.0). Both of these values are ignored when visualizing 1D data. This applies analogously to three-dimensional simulations, where slice may be :xy, :xz, or :yz.

Another way to visualize 2D/3D data is by creating a plot along a given curve. This is done with the keyword argument curve. It can be set to a list of 2D/3D points which define the curve. When using curve any other input from slice or point will be ignored.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PlotData1DMethod
PlotData1D(sol; kwargs...)

Create a PlotData1D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PlotData2DCartesianType
PlotData2D

Holds all relevant data for creating 2D plots of multiple solution variables and to visualize the mesh.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PerformanceCounterType
PerformanceCounter()

A PerformanceCounter can be used to track the runtime performance of some calls. Add a new runtime measurement via put!(counter, runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.

source
Trixi.PerformanceCounterListType
PerformanceCounterList{N}()

A PerformanceCounterList{N} can be used to track the runtime performance of calls to multiple functions, adding them up. Add a new runtime measurement via put!(counter.counters[i], runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.

source
Trixi.PlotData1DType
PlotData1D

Holds all relevant data for creating 1D plots of multiple solution variables and to visualize the mesh.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PlotData1DMethod
PlotData1D(u, semi [or mesh, equations, solver, cache];
+           solution_variables=nothing, nvisnodes=nothing)

Create a new PlotData1D object that can be used for visualizing 1D DGSEM solution data array u with Plots.jl. All relevant geometrical information is extracted from the semidiscretization semi. By default, the primitive variables (if existent) or the conservative variables (otherwise) from the solution are used for plotting. This can be changed by passing an appropriate conversion function to solution_variables.

nvisnodes specifies the number of visualization nodes to be used. If it is nothing, twice the number of solution DG nodes are used for visualization, and if set to 0, exactly the number of nodes in the DG elements are used.

When visualizing data from a two-dimensional simulation, a 1D slice is extracted for plotting. slice specifies the axis along which the slice is extracted and may be :x, or :y. The slice position is specified by a point that lies on it, which defaults to (0.0, 0.0). Both of these values are ignored when visualizing 1D data. This applies analogously to three-dimensional simulations, where slice may be :xy, :xz, or :yz.

Another way to visualize 2D/3D data is by creating a plot along a given curve. This is done with the keyword argument curve. It can be set to a list of 2D/3D points which define the curve. When using curve any other input from slice or point will be ignored.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PlotData1DMethod
PlotData1D(sol; kwargs...)

Create a PlotData1D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PlotData2DCartesianType
PlotData2D

Holds all relevant data for creating 2D plots of multiple solution variables and to visualize the mesh.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.PolytropicEulerEquations2DType
PolytropicEulerEquations2D(gamma, kappa)

The polytropic Euler equations

\[\frac{\partial}{\partial t} \begin{pmatrix} \rho \\ \rho v_1 \\ \rho v_2 \end{pmatrix} @@ -289,103 +287,65 @@ = \begin{pmatrix} 0 \\ 0 \\ 0 -\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in two space dimensions. Here, $\rho$ is the density and $v_1$ andv_2 the velocities and

\[p = \kappa\rho^\gamma\]

the pressure, which we replaced using this relation.

source
Trixi.PositivityPreservingLimiterShallowWaterType
PositivityPreservingLimiterShallowWater(; variables)

The limiter is specifically designed for the shallow water equations. It is applied to all scalar variables in their given order using the defined threshold_limiter from the ShallowWaterEquations1D struct or the ShallowWaterEquations2D struct to determine the minimal acceptable values. The order of the variables is important and might have a strong influence on the robustness.

As opposed to the standard version of the PositivityPreservingLimiterZhangShu, nodes with a water height below the threshold_limiter are treated in a special way. To avoid numerical problems caused by velocities close to zero, the velocity is cut off, such that the node can be identified as "dry". The special feature of the ShallowWaterEquations used here is that the bottom topography is stored as an additional quantity in the solution vector u. However, the value of the bottom topography should not be changed. That is why, it is not limited.

After the limiting process is applied to all degrees of freedom, for safety reasons, the threshold_limiter is applied again on all the DG nodes in order to avoid water height below. In the case where the cell mean value is below the threshold before applying the limiter, there could still be dry nodes afterwards due to the logic of the limiter.

This fully-discrete positivity-preserving limiter is based on the work of

  • Zhang, Shu (2011) Maximum-principle-satisfying and positivity-preserving high-order schemes for conservation laws: survey and new developments doi: 10.1098/rspa.2011.0153
source
Trixi.PositivityPreservingLimiterZhangShuType
PositivityPreservingLimiterZhangShu(; threshold, variables)

The fully-discrete positivity-preserving limiter of

  • Zhang, Shu (2011) Maximum-principle-satisfying and positivity-preserving high-order schemes for conservation laws: survey and new developments doi: 10.1098/rspa.2011.0153

The limiter is applied to all scalar variables in their given order using the associated thresholds to determine the minimal acceptable values. The order of the variables is important and might have a strong influence on the robustness.

source
Trixi.SaveRestartCallbackType
SaveRestartCallback(; interval=0,
+\end{pmatrix}\]

for an ideal gas with ratio of specific heats gamma in two space dimensions. Here, $\rho$ is the density and $v_1$ andv_2 the velocities and

\[p = \kappa\rho^\gamma\]

the pressure, which we replaced using this relation.

source
Trixi.PositivityPreservingLimiterZhangShuType
PositivityPreservingLimiterZhangShu(; threshold, variables)

The fully-discrete positivity-preserving limiter of

  • Zhang, Shu (2011) Maximum-principle-satisfying and positivity-preserving high-order schemes for conservation laws: survey and new developments doi: 10.1098/rspa.2011.0153

The limiter is applied to all scalar variables in their given order using the associated thresholds to determine the minimal acceptable values. The order of the variables is important and might have a strong influence on the robustness.

source
Trixi.SaveRestartCallbackType
SaveRestartCallback(; interval=0,
                       save_final_restart=true,
-                      output_directory="out")

Save the current numerical solution in a restart file every interval time steps.

source
Trixi.SaveSolutionCallbackType
SaveSolutionCallback(; interval::Integer=0,
+                      output_directory="out")

Save the current numerical solution in a restart file every interval time steps.

source
Trixi.SaveSolutionCallbackType
SaveSolutionCallback(; interval::Integer=0,
                        dt=nothing,
                        save_initial_solution=true,
                        save_final_solution=true,
                        output_directory="out",
-                       solution_variables=cons2prim)

Save the current numerical solution in regular intervals. Either pass interval to save every interval time steps or pass dt to save in intervals of dt in terms of integration time by adding additional (shortened) time steps where necessary (note that this may change the solution). solution_variables can be any callable that converts the conservative variables at a single point to a set of solution variables. The first parameter passed to solution_variables will be the set of conservative variables and the second parameter is the equation struct.

source
Trixi.SemidiscretizationCoupledType
SemidiscretizationCoupled

A struct used to bundle multiple semidiscretizations. semidiscretize will return an ODEProblem that synchronizes time steps between the semidiscretizations. Each call of rhs! will call rhs! for each semidiscretization individually. The semidiscretizations can be coupled by gluing meshes together using BoundaryConditionCoupled.

Experimental code

This is an experimental feature and can change any time.

source
Trixi.SemidiscretizationEulerAcousticsType
SemidiscretizationEulerAcoustics(semi_acoustics::SemiAcoustics, semi_euler::SemiEuler;
-                                 source_region=x->true, weights=x->1.0)
Experimental code

This semidiscretization is experimental and may change in any future release.

Construct a semidiscretization of the acoustic perturbation equations that is coupled with the compressible Euler equations via source terms for the perturbed velocity. Both semidiscretizations have to use the same mesh and solvers with a shared basis. The coupling region is described by a function source_region that maps the coordinates of a single node to true or false depending on whether the point lies within the coupling region or not. A weighting function weights that maps coordinates to weights is applied to the acoustic source terms. Note that this semidiscretization should be used in conjunction with EulerAcousticsCouplingCallback and only works in two dimensions.

source
Trixi.SemidiscretizationEulerGravityType
SemidiscretizationEulerGravity

A struct containing everything needed to describe a spatial semidiscretization of a the compressible Euler equations with self-gravity, reformulating the Poisson equation for the gravitational potential as steady-state problem of the hyperblic diffusion equations.

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) "A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics" arXiv: 2008.10593
source
Trixi.SemidiscretizationHyperbolicMethod
SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver;
+                       solution_variables=cons2prim)

Save the current numerical solution in regular intervals. Either pass interval to save every interval time steps or pass dt to save in intervals of dt in terms of integration time by adding additional (shortened) time steps where necessary (note that this may change the solution). solution_variables can be any callable that converts the conservative variables at a single point to a set of solution variables. The first parameter passed to solution_variables will be the set of conservative variables and the second parameter is the equation struct.

source
Trixi.SemidiscretizationCoupledType
SemidiscretizationCoupled

A struct used to bundle multiple semidiscretizations. semidiscretize will return an ODEProblem that synchronizes time steps between the semidiscretizations. Each call of rhs! will call rhs! for each semidiscretization individually. The semidiscretizations can be coupled by gluing meshes together using BoundaryConditionCoupled.

Experimental code

This is an experimental feature and can change any time.

source
Trixi.SemidiscretizationEulerAcousticsType
SemidiscretizationEulerAcoustics(semi_acoustics::SemiAcoustics, semi_euler::SemiEuler;
+                                 source_region=x->true, weights=x->1.0)
Experimental code

This semidiscretization is experimental and may change in any future release.

Construct a semidiscretization of the acoustic perturbation equations that is coupled with the compressible Euler equations via source terms for the perturbed velocity. Both semidiscretizations have to use the same mesh and solvers with a shared basis. The coupling region is described by a function source_region that maps the coordinates of a single node to true or false depending on whether the point lies within the coupling region or not. A weighting function weights that maps coordinates to weights is applied to the acoustic source terms. Note that this semidiscretization should be used in conjunction with EulerAcousticsCouplingCallback and only works in two dimensions.

source
Trixi.SemidiscretizationEulerGravityType
SemidiscretizationEulerGravity

A struct containing everything needed to describe a spatial semidiscretization of a the compressible Euler equations with self-gravity, reformulating the Poisson equation for the gravitational potential as steady-state problem of the hyperblic diffusion equations.

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) "A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics" arXiv: 2008.10593
source
Trixi.SemidiscretizationHyperbolicMethod
SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver;
                              source_terms=nothing,
                              boundary_conditions=boundary_condition_periodic,
                              RealT=real(solver),
                              uEltype=RealT,
-                             initial_cache=NamedTuple())

Construct a semidiscretization of a hyperbolic PDE.

source
Trixi.SemidiscretizationHyperbolicParabolicMethod
SemidiscretizationHyperbolicParabolic(mesh, both_equations, initial_condition, solver;
                                       solver_parabolic=default_parabolic_solver(),
                                       source_terms=nothing,
                                       both_boundary_conditions=(boundary_condition_periodic, boundary_condition_periodic),
                                       RealT=real(solver),
                                       uEltype=RealT,
-                                      both_initial_caches=(NamedTuple(), NamedTuple()))

Construct a semidiscretization of a hyperbolic-parabolic PDE.

source
Trixi.ShallowWaterEquations1DType
ShallowWaterEquations1D(; gravity, H0 = 0, threshold_limiter = nothing threshold_wet = nothing)

Shallow water equations (SWE) in one space dimension. The equations are given by

\[\begin{aligned} + both_initial_caches=(NamedTuple(), NamedTuple()))

Construct a semidiscretization of a hyperbolic-parabolic PDE.

source
Trixi.ShallowWaterEquations1DType
ShallowWaterEquations1D(; gravity, H0 = 0)

Shallow water equations (SWE) in one space dimension. The equations are given by

\[\begin{aligned} \frac{\partial h}{\partial t} + \frac{\partial}{\partial x}(h v) &= 0 \\ \frac{\partial}{\partial t}(h v) + \frac{\partial}{\partial x}\left(h v^2 + \frac{g}{2}h^2\right) + g h \frac{\partial b}{\partial x} &= 0 -\end{aligned}\]

The unknown quantities of the SWE are the water height $h$ and the velocity $v$. The gravitational constant is denoted by g and the (possibly) variable bottom topography function $b(x)$. Conservative variable water height $h$ is measured from the bottom topography $b$, therefore one also defines the total water height as $H = h + b$.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

Also, there are two thresholds which prevent numerical problems as well as instabilities. Both of them do not have to be passed, as default values are defined within the struct. The first one, threshold_limiter, is used in PositivityPreservingLimiterShallowWater on the water height, as a (small) shift on the initial condition and cutoff before the next time step. The second one, threshold_wet, is applied on the water height to define when the flow is "wet" before calculating the numerical flux.

The bottom topography function $b(x)$ is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.

In addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography must be zero.
  • The bottom topography values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the bottom topography by default.

References for the SWE are many but a good introduction is available in Chapter 13 of the book:

source
Trixi.ShallowWaterEquations2DType
ShallowWaterEquations2D(; gravity, H0 = 0, threshold_limiter = nothing, threshold_wet = nothing)

Shallow water equations (SWE) in two space dimensions. The equations are given by

\[\begin{aligned} +\end{aligned}\]

The unknown quantities of the SWE are the water height $h$ and the velocity $v$. The gravitational constant is denoted by g and the (possibly) variable bottom topography function $b(x)$. Conservative variable water height $h$ is measured from the bottom topography $b$, therefore one also defines the total water height as $H = h + b$.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

The bottom topography function $b(x)$ is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.

In addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography must be zero.
  • The bottom topography values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the bottom topography by default.

References for the SWE are many but a good introduction is available in Chapter 13 of the book:

source
Trixi.ShallowWaterEquations2DType
ShallowWaterEquations2D(; gravity, H0 = 0)

Shallow water equations (SWE) in two space dimensions. The equations are given by

\[\begin{aligned} \frac{\partial h}{\partial t} + \frac{\partial}{\partial x}(h v_1) + \frac{\partial}{\partial y}(h v_2) &= 0 \\ \frac{\partial}{\partial t}(h v_1) + \frac{\partial}{\partial x}\left(h v_1^2 + \frac{g}{2}h^2\right) + \frac{\partial}{\partial y}(h v_1 v_2) + g h \frac{\partial b}{\partial x} &= 0 \\ \frac{\partial}{\partial t}(h v_2) + \frac{\partial}{\partial x}(h v_1 v_2) + \frac{\partial}{\partial y}\left(h v_2^2 + \frac{g}{2}h^2\right) + g h \frac{\partial b}{\partial y} &= 0. -\end{aligned}\]

The unknown quantities of the SWE are the water height $h$ and the velocities $\mathbf{v} = (v_1, v_2)^T$. The gravitational constant is denoted by g and the (possibly) variable bottom topography function $b(x,y)$. Conservative variable water height $h$ is measured from the bottom topography $b$, therefore one also defines the total water height as $H = h + b$.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

Also, there are two thresholds which prevent numerical problems as well as instabilities. Both of them do not have to be passed, as default values are defined within the struct. The first one, threshold_limiter, is used in PositivityPreservingLimiterShallowWater on the water height, as a (small) shift on the initial condition and cutoff before the next time step. The second one, threshold_wet, is applied on the water height to define when the flow is "wet" before calculating the numerical flux.

The bottom topography function $b(x,y)$ is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.

In addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography must be zero.
  • The bottom topography values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the bottom topography by default.

References for the SWE are many but a good introduction is available in Chapter 13 of the book:

source
Trixi.ShallowWaterEquationsQuasi1DType
ShallowWaterEquationsQuasi1D(; gravity, H0 = 0, threshold_limiter = nothing threshold_wet = nothing)

The quasi-1D shallow water equations (SWE). The equations are given by

\[\begin{aligned} +\end{aligned}\]

The unknown quantities of the SWE are the water height $h$ and the velocities $\mathbf{v} = (v_1, v_2)^T$. The gravitational constant is denoted by g and the (possibly) variable bottom topography function $b(x,y)$. Conservative variable water height $h$ is measured from the bottom topography $b$, therefore one also defines the total water height as $H = h + b$.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

The bottom topography function $b(x,y)$ is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.

In addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography must be zero.
  • The bottom topography values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the bottom topography by default.

References for the SWE are many but a good introduction is available in Chapter 13 of the book:

source
Trixi.ShallowWaterEquationsQuasi1DType
ShallowWaterEquationsQuasi1D(; gravity, H0 = 0, threshold_limiter = nothing threshold_wet = nothing)

The quasi-1D shallow water equations (SWE). The equations are given by

\[\begin{aligned} \frac{\partial}{\partial t}(a h) + \frac{\partial}{\partial x}(a h v) &= 0 \\ \frac{\partial}{\partial t}(a h v) + \frac{\partial}{\partial x}(a h v^2) + g a h \frac{\partial}{\partial x}(h + b) &= 0 -\end{aligned}\]

The unknown quantities of the Quasi-1D SWE are the water height $h$ and the scaled velocity $v$. The gravitational constant is denoted by g, the (possibly) variable bottom topography function $b(x)$, and (possibly) variable channel width $a(x)$. The water height $h$ is measured from the bottom topography $b$, therefore one also defines the total water height as $H = h + b$.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

Also, there are two thresholds which prevent numerical problems as well as instabilities. Both of them do not have to be passed, as default values are defined within the struct. The first one, threshold_limiter, is used in PositivityPreservingLimiterShallowWater on the water height, as a (small) shift on the initial condition and cutoff before the next time step. The second one, threshold_wet, is applied on the water height to define when the flow is "wet" before calculating the numerical flux.

The bottom topography function $b(x)$ and channel width $a(x)$ are set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero and $a$ to one.

In addition to the unknowns, Trixi.jl currently stores the bottom topography and channel width values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography and channel width must be zero.
  • The bottom topography and channel width values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the bottom topography and channel width by default.
source
Trixi.ShallowWaterTwoLayerEquations1DType
ShallowWaterTwoLayerEquations1D(gravity, H0, rho_upper, rho_lower)

Two-Layer Shallow Water equations (2LSWE) in one space dimension. The equations are given by

\[\begin{alignat*}{4} -&\frac{\partial}{\partial t}h_{upper} -&&+ \frac{\partial}{\partial x}\left(h_{upper} v_{1,upper}\right) -&&= 0 \\ -&\frac{\partial}{\partial t}\left(h_{upper}v_{1,upper}\right) -&&+ \frac{\partial}{\partial x}\left(h_{upper}v_{1,upper}^2 + \dfrac{gh_{upper}^2}{2}\right) -&&= -gh_{upper}\frac{\partial}{\partial x}\left(b+h_{lower}\right)\\ -&\frac{\partial}{\partial t}h_{lower} -&&+ \frac{\partial}{\partial x}\left(h_{lower}v_{1,lower}\right) -&&= 0 \\ -&\frac{\partial}{\partial t}\left(h_{lower}v_{1,lower}\right) -&&+ \frac{\partial}{\partial x}\left(h_{lower}v_{1,lower}^2 + \dfrac{gh_{lower}^2}{2}\right) -&&= -gh_{lower}\frac{\partial}{\partial x}\left(b+\dfrac{\rho_{upper}}{\rho_{lower}}h_{upper}\right). -\end{alignat*}\]

The unknown quantities of the 2LSWE are the water heights of the {lower} layer $h_{lower}$ and the {upper} layer $h_{upper}$ with respective velocities $v_{1,upper}$ and $v_{1,lower}$. The gravitational constant is denoted by g, the layer densitites by $\rho_{upper}$and $\rho_{lower}$ and the (possibly) variable bottom topography function $b(x)$. The conservative variable water height $h_{lower}$ is measured from the bottom topography $b$ and $h_{upper}$ relative to $h_{lower}$, therefore one also defines the total water heights as $H_{upper} = h_{upper} + h_{upper} + b$ and $H_{lower} = h_{lower} + b$.

The densities must be chosen such that $\rho_{upper} < \rho_{lower}$, to make sure that the heavier fluid $\rho_{lower}$ is in the bottom layer and the lighter fluid $\rho_{upper}$ in the {upper} layer.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

The bottom topography function $b(x)$ is set inside the initial condition routine for a particular problem setup.

In addition to the unknowns, Trixi currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography must be zero.
  • The bottom topography values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi's visualization tools will visualize the bottom topography by default.

A good introduction for the 2LSWE is available in Chapter 12 of the book:

source
Trixi.ShallowWaterTwoLayerEquations2DType
ShallowWaterTwoLayerEquations2D(gravity, H0, rho_upper, rho_lower)

Two-Layer Shallow water equations (2LSWE) in two space dimension. The equations are given by

\[\begin{alignat*}{8} -&\frac{\partial}{\partial t}h_{upper} -&&+ \frac{\partial}{\partial x}\left(h_{upper} v_{1,upper}\right) -&&+ \frac{\partial}{\partial y}\left(h_{upper} v_{2,upper}\right) \quad -&&= \quad 0 \\ -&\frac{\partial}{\partial t}\left(h_{upper} v_{1,upper}\right) -&&+ \frac{\partial}{\partial x}\left(h_{upper} v_{1,upper}^2 + \frac{gh_{upper}^2}{2}\right) -&&+ \frac{\partial}{\partial y}\left(h_{upper} v_{1,upper} v_{2,upper}\right) \quad -&&= -gh_{upper}\frac{\partial}{\partial x}\left(b+h_{lower}\right) \\ -&\frac{\partial}{\partial t}\left(h_{upper} v_{2,upper}\right) -&&+ \frac{\partial}{\partial x}\left(h_{upper} v_{1,upper} v_{2,upper}\right) -&&+ \frac{\partial}{\partial y}\left(h_{upper} v_{2,upper}^2 + \frac{gh_{upper}^2}{2}\right) -&&= -gh_{upper}\frac{\partial}{\partial y}\left(b+h_{lower}\right)\\ -&\frac{\partial}{\partial t}h_{lower} -&&+ \frac{\partial}{\partial x}\left(h_{lower} v_{1,lower}\right) -&&+ \frac{\partial}{\partial y}\left(h_{lower} v_{2,lower}\right) -&&= \quad 0 \\ -&\frac{\partial}{\partial t}\left(h_{lower} v_{1,lower}\right) -&&+ \frac{\partial}{\partial x}\left(h_{lower} v_{1,lower}^2 + \frac{gh_{lower}^2}{2}\right) -&&+ \frac{\partial}{\partial y}\left(h_{lower} v_{1,lower} v_{2,lower}\right) -&&= -gh_{lower}\frac{\partial}{\partial x}\left(b+\frac{\rho_{upper}}{\rho_{lower}} h_{upper}\right)\\ -&\frac{\partial}{\partial t}\left(h_{lower} v_{2,lower}\right) -&&+ \frac{\partial}{\partial x}\left(h_{lower} v_{1,lower} v_{2,lower}\right) -&&+ \frac{\partial}{\partial y}\left(h_{lower} v_{2,lower}^2 + \frac{gh_{lower}^2}{2}\right) -&&= -gh_{lower}\frac{\partial}{\partial y}\left(b+\frac{\rho_{upper}}{\rho_{lower}} h_{upper}\right) -\end{alignat*}\]

The unknown quantities of the 2LSWE are the water heights of the lower layer $h_{lower}$ and the upper layer $h_{upper}$ and the respective velocities in x-direction $v_{1,lower}$ and $v_{1,upper}$ and in y-direction $v_{2,lower}$ and $v_{2,upper}$. The gravitational constant is denoted by g, the layer densitites by $\rho_{upper}$and $\rho_{lower}$ and the (possibly) variable bottom topography function by $b(x)$. Conservative variable water height $h_{lower}$ is measured from the bottom topography $b$ and $h_{upper}$ relative to $h_{lower}$, therefore one also defines the total water heights as $H_{lower} = h_{lower} + b$ and $H_{upper} = h_{upper} + h_{lower} + b$.

The densities must be chosen such that $\rho_{upper} < \rho_{lower}$, to make sure that the heavier fluid $\rho_{lower}$ is in the bottom layer and the lighter fluid $\rho_{upper}$ in the upper layer.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

The bottom topography function $b(x)$ is set inside the initial condition routine for a particular problem setup.

In addition to the unknowns, Trixi currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography must be zero.
  • The bottom topography values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi's visualization tools will visualize the bottom topography by default.

A good introduction for the 2LSWE is available in Chapter 12 of the book:

source
Trixi.SimpleSSPRK33Type
SimpleSSPRK33(; stage_callbacks=())

The third-order SSP Runge-Kutta method of Shu and Osher.

References

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.StepsizeCallbackType
StepsizeCallback(; cfl=1.0)

Set the time step size according to a CFL condition with CFL number cfl if the time integration method isn't adaptive itself.

source
Trixi.StructuredMeshType
StructuredMesh{NDIMS} <: AbstractMesh{NDIMS}

A structured curved mesh.

Different numbers of cells per dimension are possible and arbitrary functions can be used as domain faces.

source
Trixi.StructuredMeshMethod
StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max; periodicity=true)

Create a StructuredMesh that represents a uncurved structured mesh with a rectangular domain.

Arguments

  • cells_per_dimension::NTuple{NDIMS, Int}: the number of cells in each dimension.
  • coordinates_min::NTuple{NDIMS, RealT}: coordinate of the corner in the negative direction of each dimension.
  • coordinates_max::NTuple{NDIMS, RealT}: coordinate of the corner in the positive direction of each dimension.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
source
Trixi.StructuredMeshMethod
StructuredMesh(cells_per_dimension, mapping; RealT=Float64, unsaved_changes=true, mapping_as_string=mapping2string(mapping, length(cells_per_dimension)))

Create a StructuredMesh of the given size and shape that uses RealT as coordinate type.

Arguments

  • cells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.
  • mapping: a function of NDIMS variables to describe the mapping, which transforms the reference mesh to the physical domain. If no mapping_as_string is defined, this function must be defined with the name mapping to allow for restarts. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.
  • RealT::Type: the type that should be used for coordinates.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • mapping_as_string::String: the code that defines the mapping. If CodeTracking can't find the function definition, it can be passed directly here. The code string must define the mapping function with the name mapping. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.
source
Trixi.StructuredMeshMethod
StructuredMesh(cells_per_dimension, faces; RealT=Float64, unsaved_changes=true, faces_as_string=faces2string(faces))

Create a StructuredMesh of the given size and shape that uses RealT as coordinate type.

Arguments

  • cells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.
  • faces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D).
  • RealT::Type: the type that should be used for coordinates.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
source
Trixi.SubcellLimiterIDPType
SubcellLimiterIDP(equations::AbstractEquations, basis;
+\end{aligned}\]

The unknown quantities of the Quasi-1D SWE are the water height $h$ and the scaled velocity $v$. The gravitational constant is denoted by g, the (possibly) variable bottom topography function $b(x)$, and (possibly) variable channel width $a(x)$. The water height $h$ is measured from the bottom topography $b$, therefore one also defines the total water height as $H = h + b$.

The additional quantity $H_0$ is also available to store a reference value for the total water height that is useful to set initial conditions or test the "lake-at-rest" well-balancedness.

The bottom topography function $b(x)$ and channel width $a(x)$ are set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero and $a$ to one.

In addition to the unknowns, Trixi.jl currently stores the bottom topography and channel width values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height $H$ or the entropy variables. This affects the implementation and use of these equations in various ways:

  • The flux values corresponding to the bottom topography and channel width must be zero.
  • The bottom topography and channel width values must be included when defining initial conditions, boundary conditions or source terms.
  • AnalysisCallback analyzes this variable.
  • Trixi.jl's visualization tools will visualize the bottom topography and channel width by default.
source
Trixi.SimpleSSPRK33Type
SimpleSSPRK33(; stage_callbacks=())

The third-order SSP Runge-Kutta method of Shu and Osher.

References

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.StepsizeCallbackType
StepsizeCallback(; cfl=1.0)

Set the time step size according to a CFL condition with CFL number cfl if the time integration method isn't adaptive itself.

source
Trixi.StructuredMeshType
StructuredMesh{NDIMS} <: AbstractMesh{NDIMS}

A structured curved mesh.

Different numbers of cells per dimension are possible and arbitrary functions can be used as domain faces.

source
Trixi.StructuredMeshMethod
StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max; periodicity=true)

Create a StructuredMesh that represents a uncurved structured mesh with a rectangular domain.

Arguments

  • cells_per_dimension::NTuple{NDIMS, Int}: the number of cells in each dimension.
  • coordinates_min::NTuple{NDIMS, RealT}: coordinate of the corner in the negative direction of each dimension.
  • coordinates_max::NTuple{NDIMS, RealT}: coordinate of the corner in the positive direction of each dimension.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
source
Trixi.StructuredMeshMethod
StructuredMesh(cells_per_dimension, mapping; RealT=Float64, unsaved_changes=true, mapping_as_string=mapping2string(mapping, length(cells_per_dimension)))

Create a StructuredMesh of the given size and shape that uses RealT as coordinate type.

Arguments

  • cells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.
  • mapping: a function of NDIMS variables to describe the mapping, which transforms the reference mesh to the physical domain. If no mapping_as_string is defined, this function must be defined with the name mapping to allow for restarts. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.
  • RealT::Type: the type that should be used for coordinates.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • mapping_as_string::String: the code that defines the mapping. If CodeTracking can't find the function definition, it can be passed directly here. The code string must define the mapping function with the name mapping. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.
source
Trixi.StructuredMeshMethod
StructuredMesh(cells_per_dimension, faces; RealT=Float64, unsaved_changes=true, faces_as_string=faces2string(faces))

Create a StructuredMesh of the given size and shape that uses RealT as coordinate type.

Arguments

  • cells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.
  • faces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D).
  • RealT::Type: the type that should be used for coordinates.
  • periodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.
source
Trixi.SubcellLimiterIDPType
SubcellLimiterIDP(equations::AbstractEquations, basis;
                   local_minmax_variables_cons = String[],
                   positivity_variables_cons = String[],
-                  positivity_correction_factor = 0.1)

Subcell invariant domain preserving (IDP) limiting used with VolumeIntegralSubcellLimiting including:

  • Local maximum/minimum Zalesak-type limiting for conservative variables (local_minmax_variables_cons)
  • Positivity limiting for conservative variables (positivity_variables_cons)

Conservative variables to be limited are passed as a vector of strings, e.g. local_minmax_variables_cons = ["rho"] and positivity_variables_cons = ["rho"].

The bounds are calculated using the low-order FV solution. The positivity limiter uses positivity_correction_factor such that u^new >= positivity_correction_factor * u^FV.

Note

This limiter and the correction callback SubcellLimiterIDPCorrection only work together. Without the callback, no correction takes place, leading to a standard low-order FV scheme.

References

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.SubcellLimiterIDPCorrectionType
SubcellLimiterIDPCorrection()

Perform antidiffusive correction stage for the a posteriori IDP limiter SubcellLimiterIDP called with VolumeIntegralSubcellLimiting.

Note

This callback and the actual limiter SubcellLimiterIDP only work together. This is not a replacement but a necessary addition.

References

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.SurfaceIntegralWeakFormType
SurfaceIntegralWeakForm(surface_flux=flux_central)

The classical weak form surface integral type for DG methods as explained in standard textbooks.

See also VolumeIntegralWeakForm.

References

source
Trixi.T8codeMeshType
T8codeMesh{NDIMS} <: AbstractMesh{NDIMS}

An unstructured curved mesh based on trees that uses the C library 't8code' to manage trees and mesh refinement.

source
Trixi.T8codeMeshMethod
T8codeMesh(trees_per_dimension; polydeg, mapping=identity,
-           RealT=Float64, initial_refinement_level=0, periodicity=true)

Create a structured potentially curved 'T8codeMesh' of the specified size.

Non-periodic boundaries will be called ':xneg', ':xpos', ':yneg', ':ypos', ':zneg', ':zpos'.

Arguments

  • 'treesperdimension::NTupleE{NDIMS, Int}': the number of trees in each dimension.
  • 'polydeg::Integer': polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.
  • 'mapping': a function of 'NDIMS' variables to describe the mapping that transforms the reference mesh ('[-1, 1]^n') to the physical domain.
  • 'RealT::Type': the type that should be used for coordinates.
  • 'initialrefinementlevel::Integer': refine the mesh uniformly to this level before the simulation starts.
  • 'periodicity': either a 'Bool' deciding if all of the boundaries are periodic or an 'NTuple{NDIMS, Bool}' deciding for each dimension if the boundaries in this dimension are periodic.
source
Trixi.T8codeMeshMethod
T8codeMesh{NDIMS}(conn::Ptr{p4est_connectivity},
-                  mapping=nothing, polydeg=1, RealT=Float64,
-                  initial_refinement_level=0)

Main mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a p4est_connectivity data structure.

Arguments

  • conn::Ptr{p4est_connectivity}: Pointer to a P4est connectivity object.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
source
Trixi.T8codeMeshMethod
T8codeMesh{NDIMS}(cmesh::Ptr{t8_cmesh},
-                 mapping=nothing, polydeg=1, RealT=Float64,
-                 initial_refinement_level=0)

Main mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a t8_cmesh data structure.

Arguments

  • cmesh::Ptr{t8_cmesh}: Pointer to a cmesh object.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
source
Trixi.T8codeMeshMethod
T8codeMesh{NDIMS}(meshfile::String;
-                 mapping=nothing, polydeg=1, RealT=Float64,
-                 initial_refinement_level=0)

Main mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a Gmsh mesh file (.msh).

Arguments

  • meshfile::String: path to a Gmsh mesh file.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
source
Trixi.TimeSeriesCallbackType
TimeSeriesCallback(semi, point_coordinates;
+                  positivity_variables_nonlinear = [],
+                  positivity_correction_factor = 0.1,
+                  max_iterations_newton = 10,
+                  newton_tolerances = (1.0e-12, 1.0e-14),
+                  gamma_constant_newton = 2 * ndims(equations))

Subcell invariant domain preserving (IDP) limiting used with VolumeIntegralSubcellLimiting including:

  • Local maximum/minimum Zalesak-type limiting for conservative variables (local_minmax_variables_cons)
  • Positivity limiting for conservative variables (positivity_variables_cons) and nonlinear variables

(positivity_variables_nonlinear)

Conservative variables to be limited are passed as a vector of strings, e.g. local_minmax_variables_cons = ["rho"] and positivity_variables_cons = ["rho"]. For nonlinear variables the specific functions are passed in a vector, e.g. positivity_variables_nonlinear = [pressure].

The bounds are calculated using the low-order FV solution. The positivity limiter uses positivity_correction_factor such that u^new >= positivity_correction_factor * u^FV. The limiting of nonlinear variables uses a Newton-bisection method with a maximum of max_iterations_newton iterations, relative and absolute tolerances of newton_tolerances and a provisional update constant gamma_constant_newton (gamma_constant_newton>=2*d, where d = #dimensions). See equation (20) of Pazner (2020) and equation (30) of Rueda-Ramírez et al. (2022).

Note

This limiter and the correction callback SubcellLimiterIDPCorrection only work together. Without the callback, no correction takes place, leading to a standard low-order FV scheme.

References

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.SubcellLimiterIDPCorrectionType
SubcellLimiterIDPCorrection()

Perform antidiffusive correction stage for the a posteriori IDP limiter SubcellLimiterIDP called with VolumeIntegralSubcellLimiting.

Note

This callback and the actual limiter SubcellLimiterIDP only work together. This is not a replacement but a necessary addition.

References

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.SurfaceIntegralWeakFormType
SurfaceIntegralWeakForm(surface_flux=flux_central)

The classical weak form surface integral type for DG methods as explained in standard textbooks.

See also VolumeIntegralWeakForm.

References

source
Trixi.T8codeMeshType
T8codeMesh{NDIMS} <: AbstractMesh{NDIMS}

An unstructured curved mesh based on trees that uses the C library 't8code' to manage trees and mesh refinement.

source
Trixi.T8codeMeshMethod
T8codeMesh(trees_per_dimension; polydeg, mapping=identity,
+           RealT=Float64, initial_refinement_level=0, periodicity=true)

Create a structured potentially curved 'T8codeMesh' of the specified size.

Non-periodic boundaries will be called ':xneg', ':xpos', ':yneg', ':ypos', ':zneg', ':zpos'.

Arguments

  • 'treesperdimension::NTupleE{NDIMS, Int}': the number of trees in each dimension.
  • 'polydeg::Integer': polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the reference mesh ([-1, 1]^n) to the physical domain. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • faces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D). Use only one of mapping, faces and coordinates_min/coordinates_max.
  • coordinates_min: vector or tuple of the coordinates of the corner in the negative direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • coordinates_max: vector or tuple of the coordinates of the corner in the positive direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.
  • 'RealT::Type': the type that should be used for coordinates.
  • 'initialrefinementlevel::Integer': refine the mesh uniformly to this level before the simulation starts.
  • 'periodicity': either a 'Bool' deciding if all of the boundaries are periodic or an 'NTuple{NDIMS, Bool}' deciding for each dimension if the boundaries in this dimension are periodic.
source
Trixi.T8codeMeshMethod
T8codeMesh(conn::Ptr{p4est_connectivity}; kwargs...)

Main mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a p4est_connectivity data structure.

Arguments

  • conn::Ptr{p4est_connectivity}: Pointer to a P4est connectivity object.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
source
Trixi.T8codeMeshMethod
T8codeMesh(conn::Ptr{p8est_connectivity}; kwargs...)

Main mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a p4est_connectivity data structure.

Arguments

  • conn::Ptr{p4est_connectivity}: Pointer to a P4est connectivity object.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
source
Trixi.T8codeMeshMethod
T8codeMesh(cmesh::Ptr{t8_cmesh},
+           mapping=nothing, polydeg=1, RealT=Float64,
+           initial_refinement_level=0)

Main mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a t8_cmesh data structure.

Arguments

  • cmesh::Ptr{t8_cmesh}: Pointer to a cmesh object.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
source
Trixi.T8codeMeshMethod
T8codeMesh(meshfile::String, ndims; kwargs...)

Main mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a Gmsh mesh file (.msh).

Arguments

  • meshfile::String: path to a Gmsh mesh file.
  • ndims: Mesh file dimension: 2 or 3.
  • mapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
source
Trixi.TimeSeriesCallbackType
TimeSeriesCallback(semi, point_coordinates;
                    interval=1, solution_variables=cons2cons,
                    output_directory="out", filename="time_series.h5",
-                   RealT=real(solver), uEltype=eltype(cache.elements))

Create a callback that records point-wise data at points given in point_coordinates every interval time steps. The point coordinates are to be specified either as a vector of coordinate tuples or as a two-dimensional array where the first dimension is the point number and the second dimension is the coordinate dimension. By default, the conservative variables are recorded, but this can be controlled by passing a different conversion function to solution_variables.

After the last time step, the results are stored in an HDF5 file filename in directory output_directory.

The real data type RealT and data type for solution variables uEltype default to the respective types used in the solver and the cache.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.TreeMeshType
TreeMesh{NDIMS} <: AbstractMesh{NDIMS}

A Cartesian mesh based on trees of hypercubes to support adaptive mesh refinement.

source
Trixi.UnstructuredMesh2DType
UnstructuredMesh2D <: AbstractMesh{2}

An unstructured (possibly curved) quadrilateral mesh.

UnstructuredMesh2D(filename; RealT=Float64, periodicity=false)

All mesh information, neighbour coupling, and boundary curve information is read in from a mesh file filename.

source
Trixi.UnstructuredSortedBoundaryTypesType
UnstructuredSortedBoundaryTypes

General container to sort the boundary conditions by type for some unstructured meshes/solvers. It stores a set of global indices for each boundary condition type to expedite computation during the call to calc_boundary_flux!. The original dictionary form of the boundary conditions set by the user in the elixir file is also stored for printing.

source
Trixi.ViscousFormulationLocalDGType
ViscousFormulationLocalDG(penalty_parameter)

The local DG (LDG) flux from "The Local Discontinuous Galerkin Method for Time-Dependent Convection-Diffusion Systems" by Cockburn and Shu (1998).

Note that, since this implementation does not involve the parabolic "upwinding" vector, the LDG solver is equivalent to ViscousFormulationBassiRebay1 with an LDG-type penalization.

source
Trixi.VisualizationCallbackMethod
VisualizationCallback(; interval=0,
+                   RealT=real(solver), uEltype=eltype(cache.elements))

Create a callback that records point-wise data at points given in point_coordinates every interval time steps. The point coordinates are to be specified either as a vector of coordinate tuples or as a two-dimensional array where the first dimension is the point number and the second dimension is the coordinate dimension. By default, the conservative variables are recorded, but this can be controlled by passing a different conversion function to solution_variables.

After the last time step, the results are stored in an HDF5 file filename in directory output_directory.

The real data type RealT and data type for solution variables uEltype default to the respective types used in the solver and the cache.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.TrafficFlowLWREquations1DType
TrafficFlowLWREquations1D

The classic Lighthill-Witham Richards (LWR) model for 1D traffic flow. The car density is denoted by $u \in [0, 1]$ and the maximum possible speed (e.g. due to speed limits) is $v_{\text{max}}$.

\[\partial_t u + v_{\text{max}} \partial_1 [u (1 - u)] = 0\]

For more details see e.g. Section 11.1 of

  • Randall LeVeque (2002)

Finite Volume Methods for Hyperbolic Problems [DOI: 10.1017/CBO9780511791253]https://doi.org/10.1017/CBO9780511791253

source
Trixi.TreeMeshType
TreeMesh{NDIMS} <: AbstractMesh{NDIMS}

A Cartesian mesh based on trees of hypercubes to support adaptive mesh refinement.

source
Trixi.UnstructuredMesh2DType
UnstructuredMesh2D <: AbstractMesh{2}

An unstructured (possibly curved) quadrilateral mesh.

UnstructuredMesh2D(filename; RealT=Float64, periodicity=false)

All mesh information, neighbour coupling, and boundary curve information is read in from a mesh file filename.

source
Trixi.UnstructuredSortedBoundaryTypesType
UnstructuredSortedBoundaryTypes

General container to sort the boundary conditions by type for some unstructured meshes/solvers. It stores a set of global indices for each boundary condition type to expedite computation during the call to calc_boundary_flux!. The original dictionary form of the boundary conditions set by the user in the elixir file is also stored for printing.

source
Trixi.ViscousFormulationLocalDGType
ViscousFormulationLocalDG(penalty_parameter)

The local DG (LDG) flux from "The Local Discontinuous Galerkin Method for Time-Dependent Convection-Diffusion Systems" by Cockburn and Shu (1998).

Note that, since this implementation does not involve the parabolic "upwinding" vector, the LDG solver is equivalent to ViscousFormulationBassiRebay1 with an LDG-type penalization.

source
Trixi.VisualizationCallbackMethod
VisualizationCallback(; interval=0,
                         solution_variables=cons2prim,
                         variable_names=[],
                         show_mesh=false,
                         plot_data_creator=PlotData2D,
                         plot_creator=show_plot,
-                        plot_arguments...)

Create a callback that visualizes results during a simulation, also known as in-situ visualization.

Experimental implementation

This is an experimental feature and may change in any future releases.

The interval specifies the number of time step iterations after which a new plot is generated. The available variables to plot are configured with the solution_variables parameter, which acts the same way as for the SaveSolutionCallback. The variables to be actually plotted can be selected by providing a single string or a list of strings to variable_names, and if show_mesh is true, an additional plot with the mesh will be generated.

To customize the generated figure, plot_data_creator allows to use different plot data types. With plot_creator you can further specify an own function to visualize results, which must support the same interface as the default implementation show_plot. All remaining keyword arguments are collected and passed as additional arguments to the plotting command.

source
Trixi.VolumeIntegralFluxDifferencingType
VolumeIntegralFluxDifferencing(volume_flux)

Volume integral type for DG methods based on SBP operators and flux differencing using a symmetric two-point volume_flux. This volume_flux needs to satisfy the interface of numerical fluxes in Trixi.jl.

References

source
Trixi.VolumeIntegralPureLGLFiniteVolumeType
VolumeIntegralPureLGLFiniteVolume(volume_flux_fv)

A volume integral that only uses the subcell finite volume schemes of the VolumeIntegralShockCapturingHG.

This gives a formally O(1)-accurate finite volume scheme on an LGL-type subcell mesh (LGL = Legendre-Gauss-Lobatto).

Experimental implementation

This is an experimental feature and may change in future releases.

References

  • Hennemann, Gassner (2020) "A provably entropy stable subcell shock capturing approach for high order split form DG" arXiv: 2008.12044
source
Trixi.VolumeIntegralShockCapturingHGType
VolumeIntegralShockCapturingHG(indicator; volume_flux_dg=flux_central,
-                                          volume_flux_fv=flux_lax_friedrichs)

Shock-capturing volume integral type for DG methods using a convex blending of the finite volume method with numerical flux volume_flux_fv and the VolumeIntegralFluxDifferencing with volume flux volume_flux_dg. The amount of blending is determined by the indicator, e.g., IndicatorHennemannGassner.

References

  • Hennemann, Gassner (2020) "A provably entropy stable subcell shock capturing approach for high order split form DG" arXiv: 2008.12044
source
Trixi.VolumeIntegralSubcellLimitingType
VolumeIntegralSubcellLimiting(limiter;
-                              volume_flux_dg, volume_flux_fv)

A subcell limiting volume integral type for DG methods based on subcell blending approaches with a low-order FV method. Used with limiter SubcellLimiterIDP.

Note

Subcell limiting methods are not fully functional on non-conforming meshes. This is mainly because the implementation assumes that low- and high-order schemes have the same surface terms, which is not guaranteed for non-conforming meshes. The low-order scheme with a high-order mortar is not invariant domain preserving.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.VolumeIntegralUpwindType
VolumeIntegralUpwind(splitting)

Specialized volume integral for finite difference summation-by-parts (FDSBP) solvers. Can be used together with the upwind SBP operators of Mattsson (2017) implemented in SummationByPartsOperators.jl. The splitting controls the discretization.

See also splitting_steger_warming, splitting_lax_friedrichs, splitting_vanleer_haenel.

References

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.VolumeIntegralWeakFormType
VolumeIntegralWeakForm()

The classical weak form volume integral type for DG methods as explained in standard textbooks.

References

VolumeIntegralWeakForm() is only implemented for conserved terms as non-conservative terms should always be discretized in conjunction with a flux-splitting scheme, see VolumeIntegralFluxDifferencing. This treatment is required to achieve, e.g., entropy-stability or well-balancedness.

source
Base.getindexMethod
Base.getindex(pd::AbstractPlotData, variable_name)

Extract a single variable variable_name from pd for plotting with Plots.plot.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Base.resize!Method
resize!(c::AbstractContainer, new_length) -> AbstractContainer

Resize c to contain new_length elements. If new_length is smaller than the current container length, the first new_length elements will be retained. If new_length is larger, the new elements are invalidated.

source
PolynomialBases.compute_coefficientsMethod
compute_coefficients(func, t, semi::AbstractSemidiscretization)

Compute the discrete coefficients of the continuous function func at time t associated with the semidiscretization semi. For example, the discrete coefficients of func for a discontinuous Galerkin spectral element method (DGSEM) are the values of func at the Lobatto-Legendre nodes. Similarly, a classical finite difference method will use the values of func at the nodes of the grid assoociated with the semidiscretization semi.

For semidiscretizations semi associated with an initial condition, func can be omitted to use the given initial condition at time t.

source
PolynomialBases.integrateMethod
integrate(f, u, basis::LobattoLegendreBasis)

Map the function f to the coefficients u and integrate with respect to the quadrature rule given by basis.

source
PolynomialBases.integrateMethod
integrate([func=(u_node,equations)->u_node,] u_ode, semi::AbstractSemidiscretization; normalize=true)

Call func(u_node, equations) for each vector of nodal variables u_node in u_ode and integrate the result using a quadrature associated with the semidiscretization semi.

If normalize is true, the result is divided by the total volume of the computational domain.

source
SciMLBase.add_tstop!Method
add_tstop!(integrator::SimpleIntegratorSSP, t)

Add a time stop during the time integration process. This function is called after the periodic SaveSolutionCallback to specify the next stop to save the solution.

source
SummationByPartsOperators.semidiscretizeMethod
semidiscretize(semi::SemidiscretizationHyperbolicParabolic, tspan)

Wrap the semidiscretization semi as a split ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The parabolic right-hand side is the first function of the split ODE problem and will be used by default by the implicit part of IMEX methods from the SciML ecosystem.

source
SummationByPartsOperators.semidiscretizeMethod
semidiscretize(semi::AbstractSemidiscretization, tspan, restart_file::AbstractString)

Wrap the semidiscretization semi as an ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The initial condition etc. is taken from the restart_file.

source
Trixi.DGMultiBasisMethod
DGMultiBasis(element_type, polydeg; approximation_type = Polynomial(), kwargs...)

Constructs a basis for DGMulti solvers. Returns a "StartUpDG.RefElemData" object. The kwargs arguments are additional keyword arguments for RefElemData, such as quad_rule_vol. These are the same as the RefElemData_kwargs used in DGMulti. For more info, see the StartUpDG.jl docs.

source
Trixi.P4estMeshCubedSphereMethod
P4estMeshCubedSphere(trees_per_face_dimension, layers, inner_radius, thickness;
+                        plot_arguments...)

Create a callback that visualizes results during a simulation, also known as in-situ visualization.

Experimental implementation

This is an experimental feature and may change in any future releases.

The interval specifies the number of time step iterations after which a new plot is generated. The available variables to plot are configured with the solution_variables parameter, which acts the same way as for the SaveSolutionCallback. The variables to be actually plotted can be selected by providing a single string or a list of strings to variable_names, and if show_mesh is true, an additional plot with the mesh will be generated.

To customize the generated figure, plot_data_creator allows to use different plot data types. With plot_creator you can further specify an own function to visualize results, which must support the same interface as the default implementation show_plot. All remaining keyword arguments are collected and passed as additional arguments to the plotting command.

source
Trixi.VolumeIntegralFluxDifferencingType
VolumeIntegralFluxDifferencing(volume_flux)

Volume integral type for DG methods based on SBP operators and flux differencing using a symmetric two-point volume_flux. This volume_flux needs to satisfy the interface of numerical fluxes in Trixi.jl.

References

source
Trixi.VolumeIntegralPureLGLFiniteVolumeType
VolumeIntegralPureLGLFiniteVolume(volume_flux_fv)

A volume integral that only uses the subcell finite volume schemes of the VolumeIntegralShockCapturingHG.

This gives a formally O(1)-accurate finite volume scheme on an LGL-type subcell mesh (LGL = Legendre-Gauss-Lobatto).

Experimental implementation

This is an experimental feature and may change in future releases.

References

  • Hennemann, Gassner (2020) "A provably entropy stable subcell shock capturing approach for high order split form DG" arXiv: 2008.12044
source
Trixi.VolumeIntegralShockCapturingHGType
VolumeIntegralShockCapturingHG(indicator; volume_flux_dg=flux_central,
+                                          volume_flux_fv=flux_lax_friedrichs)

Shock-capturing volume integral type for DG methods using a convex blending of the finite volume method with numerical flux volume_flux_fv and the VolumeIntegralFluxDifferencing with volume flux volume_flux_dg. The amount of blending is determined by the indicator, e.g., IndicatorHennemannGassner.

References

  • Hennemann, Gassner (2020) "A provably entropy stable subcell shock capturing approach for high order split form DG" arXiv: 2008.12044
source
Trixi.VolumeIntegralSubcellLimitingType
VolumeIntegralSubcellLimiting(limiter;
+                              volume_flux_dg, volume_flux_fv)

A subcell limiting volume integral type for DG methods based on subcell blending approaches with a low-order FV method. Used with limiter SubcellLimiterIDP.

Note

Subcell limiting methods are not fully functional on non-conforming meshes. This is mainly because the implementation assumes that low- and high-order schemes have the same surface terms, which is not guaranteed for non-conforming meshes. The low-order scheme with a high-order mortar is not invariant domain preserving.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.VolumeIntegralUpwindType
VolumeIntegralUpwind(splitting)

Specialized volume integral for finite difference summation-by-parts (FDSBP) solvers. Can be used together with the upwind SBP operators of Mattsson (2017) implemented in SummationByPartsOperators.jl. The splitting controls the discretization.

See also splitting_steger_warming, splitting_lax_friedrichs, splitting_vanleer_haenel.

References

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.VolumeIntegralWeakFormType
VolumeIntegralWeakForm()

The classical weak form volume integral type for DG methods as explained in standard textbooks.

References

VolumeIntegralWeakForm() is only implemented for conserved terms as non-conservative terms should always be discretized in conjunction with a flux-splitting scheme, see VolumeIntegralFluxDifferencing. This treatment is required to achieve, e.g., entropy-stability or well-balancedness.

source
Base.getindexMethod
Base.getindex(pd::AbstractPlotData, variable_name)

Extract a single variable variable_name from pd for plotting with Plots.plot.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Base.resize!Method
resize!(c::AbstractContainer, new_length) -> AbstractContainer

Resize c to contain new_length elements. If new_length is smaller than the current container length, the first new_length elements will be retained. If new_length is larger, the new elements are invalidated.

source
PolynomialBases.compute_coefficientsMethod
compute_coefficients(func, t, semi::AbstractSemidiscretization)

Compute the discrete coefficients of the continuous function func at time t associated with the semidiscretization semi. For example, the discrete coefficients of func for a discontinuous Galerkin spectral element method (DGSEM) are the values of func at the Lobatto-Legendre nodes. Similarly, a classical finite difference method will use the values of func at the nodes of the grid assoociated with the semidiscretization semi.

For semidiscretizations semi associated with an initial condition, func can be omitted to use the given initial condition at time t.

source
PolynomialBases.integrateMethod
integrate(f, u, basis::LobattoLegendreBasis)

Map the function f to the coefficients u and integrate with respect to the quadrature rule given by basis.

source
PolynomialBases.integrateMethod
integrate([func=(u_node,equations)->u_node,] u_ode, semi::AbstractSemidiscretization; normalize=true)

Call func(u_node, equations) for each vector of nodal variables u_node in u_ode and integrate the result using a quadrature associated with the semidiscretization semi.

If normalize is true, the result is divided by the total volume of the computational domain.

source
SciMLBase.add_tstop!Method
add_tstop!(integrator::SimpleIntegratorSSP, t)

Add a time stop during the time integration process. This function is called after the periodic SaveSolutionCallback to specify the next stop to save the solution.

source
SummationByPartsOperators.semidiscretizeMethod
semidiscretize(semi::SemidiscretizationHyperbolicParabolic, tspan)

Wrap the semidiscretization semi as a split ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The parabolic right-hand side is the first function of the split ODE problem and will be used by default by the implicit part of IMEX methods from the SciML ecosystem.

source
SummationByPartsOperators.semidiscretizeMethod
semidiscretize(semi::AbstractSemidiscretization, tspan, restart_file::AbstractString)

Wrap the semidiscretization semi as an ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The initial condition etc. is taken from the restart_file.

source
Trixi.DGMultiBasisMethod
DGMultiBasis(element_type, polydeg; approximation_type = Polynomial(), kwargs...)

Constructs a basis for DGMulti solvers. Returns a "StartUpDG.RefElemData" object. The kwargs arguments are additional keyword arguments for RefElemData, such as quad_rule_vol. These are the same as the RefElemData_kwargs used in DGMulti. For more info, see the StartUpDG.jl docs.

source
Trixi.P4estMeshCubedSphereMethod
P4estMeshCubedSphere(trees_per_face_dimension, layers, inner_radius, thickness;
                      polydeg, RealT=Float64,
                      initial_refinement_level=0, unsaved_changes=true,
-                     p4est_partition_allow_for_coarsening=true)

Build a "Cubed Sphere" mesh as P4estMesh with 6 * trees_per_face_dimension^2 * layers trees.

The mesh will have two boundaries, :inside and :outside.

Arguments

  • trees_per_face_dimension::Integer: the number of trees in the first two local dimensions of each face.
  • layers::Integer: the number of trees in the third local dimension of each face, i.e., the number of layers of the sphere.
  • inner_radius::Integer: the inner radius of the sphere.
  • thickness::Integer: the thickness of the sphere. The outer radius will be inner_radius + thickness.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • p4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.
source
Trixi.PlotData2DMethod
PlotData2D(u, semi [or mesh, equations, solver, cache];
+                     p4est_partition_allow_for_coarsening=true)

Build a "Cubed Sphere" mesh as P4estMesh with 6 * trees_per_face_dimension^2 * layers trees.

The mesh will have two boundaries, :inside and :outside.

Arguments

  • trees_per_face_dimension::Integer: the number of trees in the first two local dimensions of each face.
  • layers::Integer: the number of trees in the third local dimension of each face, i.e., the number of layers of the sphere.
  • inner_radius::Integer: the inner radius of the sphere.
  • thickness::Integer: the thickness of the sphere. The outer radius will be inner_radius + thickness.
  • polydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.
  • RealT::Type: the type that should be used for coordinates.
  • initial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.
  • unsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.
  • p4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.
source
Trixi.PlotData2DMethod
PlotData2D(u, semi [or mesh, equations, solver, cache];
            solution_variables=nothing,
            grid_lines=true, max_supported_level=11, nvisnodes=nothing,
            slice=:xy, point=(0.0, 0.0, 0.0))

Create a new PlotData2D object that can be used for visualizing 2D/3D DGSEM solution data array u with Plots.jl. All relevant geometrical information is extracted from the semidiscretization semi. By default, the primitive variables (if existent) or the conservative variables (otherwise) from the solution are used for plotting. This can be changed by passing an appropriate conversion function to solution_variables.

If grid_lines is true, also extract grid vertices for visualizing the mesh. The output resolution is indirectly set via max_supported_level: all data is interpolated to 2^max_supported_level uniformly distributed points in each spatial direction, also setting the maximum allowed refinement level in the solution. nvisnodes specifies the number of visualization nodes to be used. If it is nothing, twice the number of solution DG nodes are used for visualization, and if set to 0, exactly the number of nodes in the DG elements are used.

When visualizing data from a three-dimensional simulation, a 2D slice is extracted for plotting. slice specifies the plane that is being sliced and may be :xy, :xz, or :yz. The slice position is specified by a point that lies on it, which defaults to (0.0, 0.0, 0.0). Both of these values are ignored when visualizing 2D data.

Experimental implementation

This is an experimental feature and may change in future releases.

Examples

julia> using Trixi, Plots
@@ -400,220 +360,198 @@
 
 julia> plot(pd["scalar"]) # To plot only a single variable
 
-julia> plot!(getmesh(pd)) # To add grid lines to the plot
source
Trixi.PlotData2DMethod
PlotData2D(sol; kwargs...)

Create a PlotData2D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.ScalarPlotData2DMethod
ScalarPlotData2D(u, semi::AbstractSemidiscretization; kwargs...)

Returns an PlotData2DTriangulated object which is used to visualize a single scalar field. u should be an array whose entries correspond to values of the scalar field at nodal points.

source
Trixi.SummaryCallbackFunction
SummaryCallback()

Create and return a callback that prints a human-readable summary of the simulation setup at the beginning of a simulation and then resets the timer. When the returned callback is executed directly, the current timer values are shown.

source
Trixi.adapt_to_mesh_level!Method
adapt_to_mesh_level!(u_ode, semi, level)
-adapt_to_mesh_level!(sol::Trixi.TrixiODESolution, level)

Like adapt_to_mesh_level, but modifies the solution and parts of the semidiscretization (mesh and caches) in place.

source
Trixi.adapt_to_mesh_levelMethod
adapt_to_mesh_level(u_ode, semi, level)
-adapt_to_mesh_level(sol::Trixi.TrixiODESolution, level)

Use the regular adaptive mesh refinement routines to adaptively refine/coarsen the solution u_ode with semidiscretization semi towards a uniformly refined grid with refinement level level. The solution and semidiscretization are copied such that the original objects remain unaltered.

A convenience method accepts an ODE solution object, from which solution and semidiscretization are extracted as needed.

See also: adapt_to_mesh_level!

source
Trixi.PlotData2DMethod
PlotData2D(sol; kwargs...)

Create a PlotData2D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.ScalarPlotData2DMethod
ScalarPlotData2D(u, semi::AbstractSemidiscretization; kwargs...)

Returns an PlotData2DTriangulated object which is used to visualize a single scalar field. u should be an array whose entries correspond to values of the scalar field at nodal points.

source
Trixi.SummaryCallbackFunction
SummaryCallback()

Create and return a callback that prints a human-readable summary of the simulation setup at the beginning of a simulation and then resets the timer. When the returned callback is executed directly, the current timer values are shown.

source
Trixi.adapt!Method
Trixi.adapt!(mesh::T8codeMesh, adapt_callback; kwargs...)

Adapt a T8codeMesh according to a user-defined adapt_callback.

Arguments

  • mesh::T8codeMesh: Initialized mesh object.

  • adapt_callback: A user-defined callback which tells the adaption routines if an element should be refined, coarsened or stay unchanged.

    The expected callback signature is as follows:

    `adapt_callback(forest, ltreeid, eclass_scheme, lelemntid, elements, is_family, user_data)`
    +  # Arguments
    +  - `forest`: Pointer to the analyzed forest.
    +  - `ltreeid`: Local index of the current tree where the analyzed elements are part of.
    +  - `eclass_scheme`: Element class of `elements`.
    +  - `lelemntid`: Local index of the first element in `elements`.
    +  - `elements`: Array of elements. If consecutive elements form a family
    +                they are passed together, otherwise `elements` consists of just one element.
    +  - `is_family`: Boolean signifying if `elements` represents a family or not.
    +  - `user_data`: Void pointer to some arbitrary user data. Default value is `C_NULL`.
    +  # Returns
    +    -1 : Coarsen family of elements.
    +     0 : Stay unchanged.
    +     1 : Refine element.
  • kwargs:

    • recursive = true: Adapt the forest recursively. If true the caller must ensure that the callback returns 0 for every analyzed element at some point to stop the recursion.
    • balance = true: Make sure the adapted forest is 2^(NDIMS-1):1 balanced.
    • partition = true: Partition the forest to redistribute elements evenly among MPI ranks.
    • ghost = true: Create a ghost layer for MPI data exchange.
    • user_data = C_NULL: Pointer to some arbitrary user-defined data.
source
Trixi.adapt_to_mesh_level!Method
adapt_to_mesh_level!(u_ode, semi, level)
+adapt_to_mesh_level!(sol::Trixi.TrixiODESolution, level)

Like adapt_to_mesh_level, but modifies the solution and parts of the semidiscretization (mesh and caches) in place.

source
Trixi.adapt_to_mesh_levelMethod
adapt_to_mesh_level(u_ode, semi, level)
+adapt_to_mesh_level(sol::Trixi.TrixiODESolution, level)

Use the regular adaptive mesh refinement routines to adaptively refine/coarsen the solution u_ode with semidiscretization semi towards a uniformly refined grid with refinement level level. The solution and semidiscretization are copied such that the original objects remain unaltered.

A convenience method accepts an ODE solution object, from which solution and semidiscretization are extracted as needed.

See also: adapt_to_mesh_level!

source
Trixi.balance!Method
Trixi.balance!(mesh::T8codeMesh)

Balance a T8codeMesh to ensure 2^(NDIMS-1):1 face neighbors.

source
Trixi.boundary_condition_noslip_wallMethod
boundary_condition_noslip_wall(u_inner, orientation, direction, x, t,
                                surface_flux_function,
-                               equations::LatticeBoltzmannEquations2D)

No-slip wall boundary condition using the bounce-back approach.

source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
-                             equations::AcousticPerturbationEquations2D)

Use an orthogonal projection of the perturbed velocities to zero out the normal velocity while retaining the possibility of a tangential velocity in the boundary state. Further details are available in the paper:

  • Marcus Bauer, Jürgen Dierke and Roland Ewert (2011) Application of a discontinuous Galerkin method to discretize acoustic perturbation equations DOI: 10.2514/1.J050333
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
-                             equations::CompressibleEulerEquations2D)

Determine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:

  • J. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF

Details about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book

  • Eleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761

Should be used together with UnstructuredMesh2D.

source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
-                             equations::CompressibleEulerEquations3D)

Determine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:

  • J. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF

Details about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book

  • Eleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
-                             equations::ShallowWaterEquations2D)

Create a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value. For details see Section 9.2.5 of the book:

  • Eleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
-                             equations::ShallowWaterTwoLayerEquations2D)

Create a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.

For details see Section 9.2.5 of the book:

  • Eleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, orientation, direction, x, t,
-                             surface_flux_function, equations::CompressibleEulerEquations1D)

Determine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:

  • J. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF

    Should be used together with TreeMesh.

source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, orientation_or_normal, x, t, surface_flux_function,
-                              equations::ShallowWaterEquations1D)

Create a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.

For details see Section 9.2.5 of the book:

  • Eleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, orientation_or_normal, x, t, surface_flux_function,
-                             equations::ShallowWaterTwoLayerEquations1D)

Create a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.

For details see Section 9.2.5 of the book:

  • Eleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662
source
Trixi.boundary_condition_wallMethod
boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,
-                        equations::AcousticPerturbationEquations2D)

Boundary conditions for a solid wall.

source
Trixi.boundary_condition_wallMethod
boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,
-                            equations::LinearizedEulerEquations2D)

Boundary conditions for a solid wall.

source
Trixi.calc_error_normsMethod
calc_error_norms([func=(u_node,equations)->u_node,] u_ode, t, analyzer, semi::AbstractSemidiscretization, cache_analysis)

Calculate discrete L2 and L∞ error norms of func applied to each nodal variable u_node in u_ode. If no exact solution is available, "errors" are calculated using some reference state and can be useful for regression tests.

source
Trixi.calc_fast_wavespeed_roeMethod
calc_fast_wavespeed_roe(u_ll, u_rr, direction, equations::IdealGlmMhdEquations1D)

Compute the fast magnetoacoustic wave speed using Roe averages as given by

  • Cargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773
source
Trixi.calc_fast_wavespeed_roeMethod
calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations2D)

Compute the fast magnetoacoustic wave speed using Roe averages as given by

  • Cargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773
source
Trixi.calc_fast_wavespeed_roeMethod
calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations3D)

Compute the fast magnetoacoustic wave speed using Roe averages as given by

  • Cargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773
source
Trixi.calc_wavespeed_roeMethod
calc_wavespeed_roe(u_ll, u_rr, direction::Integer,
-                   equations::ShallowWaterEquations1D)

Calculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} See for instance equation (62) in

  • Paul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044

Or equation (9.17) in this lecture notes.

source
Trixi.calc_wavespeed_roeMethod
calc_wavespeed_roe(u_ll, u_rr, direction::Integer,
-                   equations::ShallowWaterEquations2D)

Calculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} depending on direction. See for instance equation (62) in

  • Paul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044

Or this slides, slides 8 and 9.

source
Trixi.collision_bgkMethod
collision_bgk(u, dt, equations::LatticeBoltzmannEquations2D)

Collision operator for the Bhatnagar, Gross, and Krook (BGK) model.

source
Trixi.collision_bgkMethod
collision_bgk(u, dt, equations::LatticeBoltzmannEquations3D)

Collision operator for the Bhatnagar, Gross, and Krook (BGK) model.

source
Trixi.cons2consMethod
cons2cons(u, equations)

Return the conserved variables u. While this function is as trivial as identity, it is also as useful.

source
Trixi.cons2entropyFunction
cons2entropy(u, equations)

Convert the conserved variables u to the entropy variables for a given set of equations with chosen standard entropy.

u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by entropy2cons.

source
Trixi.cons2primFunction
cons2prim(u, equations)

Convert the conserved variables u to the primitive variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by prim2cons.

source
Trixi.convergence_testMethod
convergence_test([mod::Module=Main,] elixir::AbstractString, iterations; kwargs...)

Run iterations Trixi.jl simulations using the setup given in elixir and compute the experimental order of convergence (EOC) in the $L^2$ and $L^\infty$ norm. In each iteration, the resolution of the respective mesh will be doubled. Additional keyword arguments kwargs... and the optional module mod are passed directly to trixi_include.

This function assumes that the spatial resolution is set via the keywords initial_refinement_level (an integer) or cells_per_dimension (a tuple of integers, one per spatial dimension).

source
Trixi.default_example_unstructuredMethod
default_example_unstructured()

Return the path to an example elixir that can be used to quickly see Trixi.jl in action on an UnstructuredMesh2D. This simulation is run on the example curved, unstructured mesh given in the Trixi.jl documentation regarding unstructured meshes.

source
Trixi.densityMethod
density(p::Real, equations::LatticeBoltzmannEquations2D)
-density(u, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic density from the pressure p or the particle distribution functions u.

source
Trixi.densityMethod
density(p::Real, equations::LatticeBoltzmannEquations3D)
-density(u, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic density from the pressure p or the particle distribution functions u.

source
Trixi.each_dof_globalMethod
each_dof_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the degrees of freedom (DOF) in dg. In particular, not the DOFs themselves are returned.

source
Trixi.each_face_nodeMethod
each_face_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the face nodes in dg. In particular, not the face_nodes themselves are returned.

source
Trixi.each_face_node_globalMethod
each_face_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the face nodes in mesh. In particular, not the face nodes themselves are returned.

source
Trixi.each_quad_nodeMethod
each_quad_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the quadrature nodes in dg. In particular, not the quadrature nodes themselves are returned.

source
Trixi.each_quad_node_globalMethod
each_quad_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the global quadrature nodes in mesh. In particular, not the quadrature nodes themselves are returned.

source
Trixi.eachboundaryMethod
eachboundary(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the boundaries in cache. In particular, not the boundaries themselves are returned.

source
Trixi.eachcomponentMethod
eachcomponent(equations::AbstractCompressibleEulerMulticomponentEquations)

Return an iterator over the indices that specify the location in relevant data structures for the components in AbstractCompressibleEulerMulticomponentEquations. In particular, not the components themselves are returned.

source
Trixi.eachcomponentMethod
eachcomponent(equations::AbstractIdealGlmMhdMulticomponentEquations)

Return an iterator over the indices that specify the location in relevant data structures for the components in AbstractIdealGlmMhdMulticomponentEquations. In particular, not the components themselves are returned.

source
Trixi.eachdimMethod
eachdim(mesh)

Return an iterator over the indices that specify the location in relevant data structures for the dimensions in AbstractTree. In particular, not the dimensions themselves are returned.

source
Trixi.eachdirectionMethod
eachdirection(tree::AbstractTree)

Return an iterator over the indices that specify the location in relevant data structures for the directions in AbstractTree. In particular, not the directions themselves are returned.

source
Trixi.eachelementMethod
eachelement(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the elements in cache. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the elements in mesh. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::ElementContainer1D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::ElementContainer2D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::ElementContainer3D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::UnstructuredElementContainer2D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachinterfaceMethod
eachinterface(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the interfaces in cache. In particular, not the interfaces themselves are returned.

source
Trixi.eachmortarMethod
eachmortar(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the mortars in cache. In particular, not the mortars themselves are returned.

source
Trixi.eachmpiinterfaceMethod
eachmpiinterface(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the MPI interfaces in cache. In particular, not the interfaces themselves are returned.

source
Trixi.eachmpimortarMethod
eachmpimortar(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the MPI mortars in cache. In particular, not the mortars themselves are returned.

source
Trixi.eachnodeMethod
eachnode(dg::DG)

Return an iterator over the indices that specify the location in relevant data structures for the nodes in dg. In particular, not the nodes themselves are returned.

source
Trixi.eachnodeMethod
eachnode(basis::LobattoLegendreBasis)

Return an iterator over the indices that specify the location in relevant data structures for the nodes in basis. In particular, not the nodes themselves are returned.

source
Trixi.eachnodeMethod
eachnode(analyzer::LobattoLegendreAnalyzer)

Return an iterator over the indices that specify the location in relevant data structures for the nodes in analyzer. In particular, not the nodes themselves are returned.

source
Trixi.eachvariableMethod
eachvariable(equations::AbstractEquations)

Return an iterator over the indices that specify the location in relevant data structures for the variables in equations. In particular, not the variables themselves are returned.

source
Trixi.energy_internalFunction
energy_internal(u, equations)

Return the internal energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.energy_kineticFunction
energy_kinetic(u, equations)

Return the kinetic energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.energy_totalFunction
energy_total(u, equations)

Return the total energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.entropyFunction
entropy(u, equations)

Return the chosen entropy of the conserved variables u for a given set of equations.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.entropy2consFunction
entropy2cons(w, equations)

Convert the entropy variables w based on a standard entropy to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2entropy.

source
Trixi.equilibrium_distributionMethod
equilibrium_distribution(alpha, rho, v1, v2, v3, equations::LatticeBoltzmannEquations3D)

Calculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2, v3.

source
Trixi.equilibrium_distributionMethod
equilibrium_distribution(alpha, rho, v1, v2, equations::LatticeBoltzmannEquations2D)

Calculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2.

source
Trixi.examples_dirMethod
examples_dir()

Return the directory where the example files provided with Trixi.jl are located. If Trixi.jl is installed as a regular package (with ]add Trixi), these files are read-only and should not be modified. To find out which files are available, use, e.g., readdir:

Examples

readdir(examples_dir())
source
Trixi.fluxFunction
flux(u, orientation_or_normal, equations)

Given the conservative variables u, calculate the (physical) flux in Cartesian direction orientation::Integer or in arbitrary direction normal::AbstractVector for the corresponding set of governing equations. orientation is 1, 2, and 3 for the x-, y-, and z-directions, respectively.

source
Trixi.fluxMethod
flux(u, normal_direction::AbstractVector, equations::AbstractEquations{1})

Enables calling flux with a non-integer argument normal_direction for one-dimensional equations. Returns the value of flux(u, 1, equations) scaled by normal_direction[1].

source
Trixi.flux_centralMethod
flux_central(u_ll, u_rr, orientation_or_normal_direction, equations::AbstractEquations)

The classical central numerical flux f((u_ll) + f(u_rr)) / 2. When this flux is used as volume flux, the discretization is equivalent to the classical weak form DG method (except floating point errors).

source
Trixi.flux_chan_etalMethod

@inline function fluxchanetal(ull, urr, orientation::Integer, equations::CompressibleEulerEquationsQuasi1D)

Conservative (symmetric) part of the entropy conservative flux for quasi 1D compressible Euler equations split form. This flux is a generalization of flux_ranocha for CompressibleEulerEquations1D. Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_chan_etalMethod
flux_chan_etal(u_ll, u_rr, orientation,
-               equations::ShallowWaterEquationsQuasi1D)

Total energy conservative (mathematical entropy for quasi 1D shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., FluxPlusDissipation(flux_chan_etal, DissipationLocalLaxFriedrichs()).

Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

Entropy conserving two-point flux by

  • Chandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)

Entropy conserving two-point flux by

  • Chandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)

Entropy conserving two-point flux by

  • Chandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations1D)

Entropy conserving two-point flux by

  • Ayoub Gouasmi, Karthik Duraisamy (2020) "Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations" arXiv:1904.00972v3 [math.NA] 4 Feb 2020
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations2D)

Adaption of the entropy conserving two-point flux by

  • Ayoub Gouasmi, Karthik Duraisamy (2020) "Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations" arXiv:1904.00972v3 [math.NA] 4 Feb 2020
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)

Entropy conserving two-point flux by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations2D)

Entropy conserving two-point flux by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations3D)

Entropy conserving two-point flux by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)

Entropy conserving two-point flux adapted by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdMulticomponentEquations2D)

Entropy conserving two-point flux adapted by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_es_ersing_etalMethod
flux_es_ersing_etal(u_ll, u_rr, orientation_or_normal_direction,
-                    equations::ShallowWaterTwoLayerEquations2D)

Entropy stable surface flux for the two-layer shallow water equations. Uses the entropy conservative flux_wintermeyer_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_es_ersing_etalMethod
flux_es_ersing_etal(u_ll, u_rr, orientation_or_normal_direction,
-                    equations::ShallowWaterTwoLayerEquations1D)

Entropy stable surface flux for the two-layer shallow water equations. Uses the entropy conservative flux_wintermeyer_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_fjordholm_etalMethod
flux_fjordholm_etal(u_ll, u_rr, orientation,
-                    equations::ShallowWaterEquations1D)

Total energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.

Details are available in Eq. (4.1) in the paper:

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042
source
Trixi.flux_fjordholm_etalMethod
flux_fjordholm_etal(u_ll, u_rr, orientation_or_normal_direction,
-                    equations::ShallowWaterEquations2D)

Total energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.

Details are available in Eq. (4.1) in the paper:

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042
source
Trixi.flux_godunovMethod
flux_godunov(u_ll, u_rr, orientation_or_normal_direction,
-             equations::LinearizedEulerEquations2D)

An upwind flux for the linearized Euler equations based on diagonalization of the physical flux matrix. Given the physical flux $Au$, $A=T \Lambda T^{-1}$ with $\Lambda$ being a diagonal matrix that holds the eigenvalues of $A$, decompose $\Lambda = \Lambda^+ + \Lambda^-$ where $\Lambda^+$ and $\Lambda^-$ are diagonal matrices holding the positive and negative eigenvalues of $A$, respectively. Then for left and right states $u_L, u_R$, the numerical flux calculated by this function is given by $A^+ u_L + A^- u_R$ where $A^{\pm} = T \Lambda^{\pm} T^{-1}$.

The diagonalization of the flux matrix can be found in

source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
-                        equations::IdealGlmMhdEquations1D)

Entropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
-                        equations::IdealGlmMhdEquations2D)

Entropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
-                        equations::IdealGlmMhdEquations3D)

Entropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
-                        equations::IdealGlmMhdMulticomponentEquations1D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
-                        equations::IdealGlmMhdMulticomponentEquations2D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_kennedy_gruberMethod
flux_kennedy_gruber(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

Kinetic energy preserving two-point flux by

  • Kennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020
source
Trixi.flux_kennedy_gruberMethod
flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,
-                    equations::CompressibleEulerEquations2D)

Kinetic energy preserving two-point flux by

  • Kennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020
source
Trixi.flux_kennedy_gruberMethod
flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,
-                    equations::CompressibleEulerEquations3D)

Kinetic energy preserving two-point flux by

  • Kennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020
source
Trixi.flux_nonconservative_audusse_etalMethod
flux_nonconservative_audusse_etal(u_ll, u_rr, orientation::Integer,
-                                  equations::ShallowWaterEquations1D)

Non-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.

This hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations1D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.

Further details on the hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
+                             equations::AcousticPerturbationEquations2D)

Use an orthogonal projection of the perturbed velocities to zero out the normal velocity while retaining the possibility of a tangential velocity in the boundary state. Further details are available in the paper:

  • Marcus Bauer, Jürgen Dierke and Roland Ewert (2011) Application of a discontinuous Galerkin method to discretize acoustic perturbation equations DOI: 10.2514/1.J050333
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
+                             equations::CompressibleEulerEquations2D)

Determine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:

  • J. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF

Details about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book

  • Eleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761

Should be used together with UnstructuredMesh2D.

source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
+                             equations::CompressibleEulerEquations3D)

Determine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:

  • J. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF

Details about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book

  • Eleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,
+                             equations::ShallowWaterEquations2D)

Create a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value. For details see Section 9.2.5 of the book:

  • Eleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662
source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, orientation, direction, x, t,
+                             surface_flux_function, equations::CompressibleEulerEquations1D)

Determine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:

  • J. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF

    Should be used together with TreeMesh.

source
Trixi.boundary_condition_slip_wallMethod
boundary_condition_slip_wall(u_inner, orientation_or_normal, x, t, surface_flux_function,
+                              equations::ShallowWaterEquations1D)

Create a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.

For details see Section 9.2.5 of the book:

  • Eleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662
source
Trixi.boundary_condition_wallMethod
boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,
+                        equations::AcousticPerturbationEquations2D)

Boundary conditions for a solid wall.

source
Trixi.boundary_condition_wallMethod
boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,
+                            equations::LinearizedEulerEquations2D)

Boundary conditions for a solid wall.

source
Trixi.calc_error_normsMethod
calc_error_norms([func=(u_node,equations)->u_node,] u_ode, t, analyzer, semi::AbstractSemidiscretization, cache_analysis)

Calculate discrete L2 and L∞ error norms of func applied to each nodal variable u_node in u_ode. If no exact solution is available, "errors" are calculated using some reference state and can be useful for regression tests.

source
Trixi.calc_fast_wavespeed_roeMethod
calc_fast_wavespeed_roe(u_ll, u_rr, direction, equations::IdealGlmMhdEquations1D)

Compute the fast magnetoacoustic wave speed using Roe averages as given by

  • Cargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773
source
Trixi.calc_fast_wavespeed_roeMethod
calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations2D)

Compute the fast magnetoacoustic wave speed using Roe averages as given by

  • Cargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773
source
Trixi.calc_fast_wavespeed_roeMethod
calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations3D)

Compute the fast magnetoacoustic wave speed using Roe averages as given by

  • Cargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773
source
Trixi.calc_wavespeed_roeMethod
calc_wavespeed_roe(u_ll, u_rr, direction::Integer,
+                   equations::ShallowWaterEquations1D)

Calculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} See for instance equation (62) in

  • Paul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044

Or equation (9.17) in this lecture notes.

source
Trixi.calc_wavespeed_roeMethod
calc_wavespeed_roe(u_ll, u_rr, direction::Integer,
+                   equations::ShallowWaterEquations2D)

Calculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} depending on direction. See for instance equation (62) in

  • Paul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044

Or this slides, slides 8 and 9.

source
Trixi.collision_bgkMethod
collision_bgk(u, dt, equations::LatticeBoltzmannEquations2D)

Collision operator for the Bhatnagar, Gross, and Krook (BGK) model.

source
Trixi.collision_bgkMethod
collision_bgk(u, dt, equations::LatticeBoltzmannEquations3D)

Collision operator for the Bhatnagar, Gross, and Krook (BGK) model.

source
Trixi.cons2consMethod
cons2cons(u, equations)

Return the conserved variables u. While this function is as trivial as identity, it is also as useful.

source
Trixi.cons2entropyFunction
cons2entropy(u, equations)

Convert the conserved variables u to the entropy variables for a given set of equations with chosen standard entropy.

u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by entropy2cons.

source
Trixi.cons2primFunction
cons2prim(u, equations)

Convert the conserved variables u to the primitive variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by prim2cons.

source
Trixi.convergence_testMethod
convergence_test([mod::Module=Main,] elixir::AbstractString, iterations; kwargs...)

Run iterations Trixi.jl simulations using the setup given in elixir and compute the experimental order of convergence (EOC) in the $L^2$ and $L^\infty$ norm. In each iteration, the resolution of the respective mesh will be doubled. Additional keyword arguments kwargs... and the optional module mod are passed directly to trixi_include.

This function assumes that the spatial resolution is set via the keywords initial_refinement_level (an integer) or cells_per_dimension (a tuple of integers, one per spatial dimension).

source
Trixi.default_example_unstructuredMethod
default_example_unstructured()

Return the path to an example elixir that can be used to quickly see Trixi.jl in action on an UnstructuredMesh2D. This simulation is run on the example curved, unstructured mesh given in the Trixi.jl documentation regarding unstructured meshes.

source
Trixi.densityMethod
density(p::Real, equations::LatticeBoltzmannEquations2D)
+density(u, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic density from the pressure p or the particle distribution functions u.

source
Trixi.densityMethod
density(p::Real, equations::LatticeBoltzmannEquations3D)
+density(u, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic density from the pressure p or the particle distribution functions u.

source
Trixi.downloadMethod
Trixi.download(src_url, file_path)

Download a file from given src_url to given file_path if file_path is not already a file. This function just returns file_path. This is a small wrapper of Downloads.download(src_url, file_path) that avoids race conditions when multiple MPI ranks are used.

source
Trixi.each_dof_globalMethod
each_dof_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the degrees of freedom (DOF) in dg. In particular, not the DOFs themselves are returned.

source
Trixi.each_face_nodeMethod
each_face_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the face nodes in dg. In particular, not the face_nodes themselves are returned.

source
Trixi.each_face_node_globalMethod
each_face_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the face nodes in mesh. In particular, not the face nodes themselves are returned.

source
Trixi.each_quad_nodeMethod
each_quad_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the quadrature nodes in dg. In particular, not the quadrature nodes themselves are returned.

source
Trixi.each_quad_node_globalMethod
each_quad_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the global quadrature nodes in mesh. In particular, not the quadrature nodes themselves are returned.

source
Trixi.eachboundaryMethod
eachboundary(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the boundaries in cache. In particular, not the boundaries themselves are returned.

source
Trixi.eachcomponentMethod
eachcomponent(equations::AbstractCompressibleEulerMulticomponentEquations)

Return an iterator over the indices that specify the location in relevant data structures for the components in AbstractCompressibleEulerMulticomponentEquations. In particular, not the components themselves are returned.

source
Trixi.eachcomponentMethod
eachcomponent(equations::AbstractIdealGlmMhdMulticomponentEquations)

Return an iterator over the indices that specify the location in relevant data structures for the components in AbstractIdealGlmMhdMulticomponentEquations. In particular, not the components themselves are returned.

source
Trixi.eachdimMethod
eachdim(mesh)

Return an iterator over the indices that specify the location in relevant data structures for the dimensions in AbstractTree. In particular, not the dimensions themselves are returned.

source
Trixi.eachdirectionMethod
eachdirection(tree::AbstractTree)

Return an iterator over the indices that specify the location in relevant data structures for the directions in AbstractTree. In particular, not the directions themselves are returned.

source
Trixi.eachelementMethod
eachelement(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the elements in cache. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(mesh::DGMultiMesh, dg::DGMulti, other_args...)

Return an iterator over the indices that specify the location in relevant data structures for the elements in mesh. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::ElementContainer1D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::ElementContainer2D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::ElementContainer3D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachelementMethod
eachelement(elements::UnstructuredElementContainer2D)

Return an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.

source
Trixi.eachinterfaceMethod
eachinterface(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the interfaces in cache. In particular, not the interfaces themselves are returned.

source
Trixi.eachmortarMethod
eachmortar(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the mortars in cache. In particular, not the mortars themselves are returned.

source
Trixi.eachmpiinterfaceMethod
eachmpiinterface(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the MPI interfaces in cache. In particular, not the interfaces themselves are returned.

source
Trixi.eachmpimortarMethod
eachmpimortar(dg::DG, cache)

Return an iterator over the indices that specify the location in relevant data structures for the MPI mortars in cache. In particular, not the mortars themselves are returned.

source
Trixi.eachnodeMethod
eachnode(dg::DG)

Return an iterator over the indices that specify the location in relevant data structures for the nodes in dg. In particular, not the nodes themselves are returned.

source
Trixi.eachnodeMethod
eachnode(basis::LobattoLegendreBasis)

Return an iterator over the indices that specify the location in relevant data structures for the nodes in basis. In particular, not the nodes themselves are returned.

source
Trixi.eachnodeMethod
eachnode(analyzer::LobattoLegendreAnalyzer)

Return an iterator over the indices that specify the location in relevant data structures for the nodes in analyzer. In particular, not the nodes themselves are returned.

source
Trixi.eachvariableMethod
eachvariable(equations::AbstractEquations)

Return an iterator over the indices that specify the location in relevant data structures for the variables in equations. In particular, not the variables themselves are returned.

source
Trixi.energy_internalFunction
energy_internal(u, equations)

Return the internal energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.energy_kineticFunction
energy_kinetic(u, equations)

Return the kinetic energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.energy_totalFunction
energy_total(u, equations)

Return the total energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.entropyFunction
entropy(u, equations)

Return the chosen entropy of the conserved variables u for a given set of equations.

u is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).

source
Trixi.entropy2consFunction
entropy2cons(w, equations)

Convert the entropy variables w based on a standard entropy to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2entropy.

source
Trixi.equilibrium_distributionMethod
equilibrium_distribution(alpha, rho, v1, v2, v3, equations::LatticeBoltzmannEquations3D)

Calculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2, v3.

source
Trixi.equilibrium_distributionMethod
equilibrium_distribution(alpha, rho, v1, v2, equations::LatticeBoltzmannEquations2D)

Calculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2.

source
Trixi.examples_dirMethod
examples_dir()

Return the directory where the example files provided with Trixi.jl are located. If Trixi.jl is installed as a regular package (with ]add Trixi), these files are read-only and should not be modified. To find out which files are available, use, e.g., readdir:

Examples

readdir(examples_dir())
source
Trixi.fluxFunction
flux(u, orientation_or_normal, equations)

Given the conservative variables u, calculate the (physical) flux in Cartesian direction orientation::Integer or in arbitrary direction normal::AbstractVector for the corresponding set of governing equations. orientation is 1, 2, and 3 for the x-, y-, and z-directions, respectively.

source
Trixi.fluxMethod
flux(u, normal_direction::AbstractVector, equations::AbstractEquations{1})

Enables calling flux with a non-integer argument normal_direction for one-dimensional equations. Returns the value of flux(u, 1, equations) scaled by normal_direction[1].

source
Trixi.flux_centralMethod
flux_central(u_ll, u_rr, orientation_or_normal_direction, equations::AbstractEquations)

The classical central numerical flux f((u_ll) + f(u_rr)) / 2. When this flux is used as volume flux, the discretization is equivalent to the classical weak form DG method (except floating point errors).

source
Trixi.flux_chan_etalMethod

@inline function fluxchanetal(ull, urr, orientation::Integer, equations::CompressibleEulerEquationsQuasi1D)

Conservative (symmetric) part of the entropy conservative flux for quasi 1D compressible Euler equations split form. This flux is a generalization of flux_ranocha for CompressibleEulerEquations1D. Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_chan_etalMethod
flux_chan_etal(u_ll, u_rr, orientation,
+               equations::ShallowWaterEquationsQuasi1D)

Total energy conservative (mathematical entropy for quasi 1D shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., FluxPlusDissipation(flux_chan_etal, DissipationLocalLaxFriedrichs()).

Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

Entropy conserving two-point flux by

  • Chandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)

Entropy conserving two-point flux by

  • Chandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)

Entropy conserving two-point flux by

  • Chandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations1D)

Entropy conserving two-point flux by

  • Ayoub Gouasmi, Karthik Duraisamy (2020) "Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations" arXiv:1904.00972v3 [math.NA] 4 Feb 2020
source
Trixi.flux_chandrashekarMethod
flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations2D)

Adaption of the entropy conserving two-point flux by

  • Ayoub Gouasmi, Karthik Duraisamy (2020) "Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations" arXiv:1904.00972v3 [math.NA] 4 Feb 2020
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)

Entropy conserving two-point flux by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations2D)

Entropy conserving two-point flux by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations3D)

Entropy conserving two-point flux by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)

Entropy conserving two-point flux adapted by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_derigs_etalMethod
flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdMulticomponentEquations2D)

Entropy conserving two-point flux adapted by

  • Derigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002
source
Trixi.flux_fjordholm_etalMethod
flux_fjordholm_etal(u_ll, u_rr, orientation,
+                    equations::ShallowWaterEquations1D)

Total energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.

Details are available in Eq. (4.1) in the paper:

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042
source
Trixi.flux_fjordholm_etalMethod
flux_fjordholm_etal(u_ll, u_rr, orientation_or_normal_direction,
+                    equations::ShallowWaterEquations2D)

Total energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.

Details are available in Eq. (4.1) in the paper:

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042
source
Trixi.flux_godunovMethod
flux_godunov(u_ll, u_rr, orientation_or_normal_direction,
+             equations::LinearizedEulerEquations2D)

An upwind flux for the linearized Euler equations based on diagonalization of the physical flux matrix. Given the physical flux $Au$, $A=T \Lambda T^{-1}$ with $\Lambda$ being a diagonal matrix that holds the eigenvalues of $A$, decompose $\Lambda = \Lambda^+ + \Lambda^-$ where $\Lambda^+$ and $\Lambda^-$ are diagonal matrices holding the positive and negative eigenvalues of $A$, respectively. Then for left and right states $u_L, u_R$, the numerical flux calculated by this function is given by $A^+ u_L + A^- u_R$ where $A^{\pm} = T \Lambda^{\pm} T^{-1}$.

The diagonalization of the flux matrix can be found in

source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
+                        equations::IdealGlmMhdEquations1D)

Entropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
+                        equations::IdealGlmMhdEquations2D)

Entropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
+                        equations::IdealGlmMhdEquations3D)

Entropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
+                        equations::IdealGlmMhdMulticomponentEquations1D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_hindenlang_gassnerMethod
flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,
+                        equations::IdealGlmMhdMulticomponentEquations2D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.

References

  • Florian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications
  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig
  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_kennedy_gruberMethod
flux_kennedy_gruber(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

Kinetic energy preserving two-point flux by

  • Kennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020
source
Trixi.flux_kennedy_gruberMethod
flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,
+                    equations::CompressibleEulerEquations2D)

Kinetic energy preserving two-point flux by

  • Kennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020
source
Trixi.flux_kennedy_gruberMethod
flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,
+                    equations::CompressibleEulerEquations3D)

Kinetic energy preserving two-point flux by

  • Kennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020
source
Trixi.flux_nonconservative_audusse_etalMethod
flux_nonconservative_audusse_etal(u_ll, u_rr, orientation::Integer,
+                                  equations::ShallowWaterEquations1D)

Non-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.

This hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations1D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.

Further details on the hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.flux_nonconservative_audusse_etalMethod
flux_nonconservative_audusse_etal(u_ll, u_rr, orientation::Integer,
                                   equations::ShallowWaterEquations2D)
 flux_nonconservative_audusse_etal(u_ll, u_rr,
                                   normal_direction_ll     ::AbstractVector,
                                   normal_direction_average::AbstractVector,
-                                  equations::ShallowWaterEquations2D)

Non-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.

This hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations2D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.

Further details for the hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.flux_nonconservative_chan_etalMethod
flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,
+                                  equations::ShallowWaterEquations2D)

Non-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.

This hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations2D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.

Further details for the hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.flux_nonconservative_chan_etalMethod
flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,
                                equations::CompressibleEulerEquationsQuasi1D)
 flux_nonconservative_chan_etal(u_ll, u_rr, normal_direction, 
                                equations::CompressibleEulerEquationsQuasi1D)
 flux_nonconservative_chan_etal(u_ll, u_rr, normal_ll, normal_rr,
-                               equations::CompressibleEulerEquationsQuasi1D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the pressure CompressibleEulerEquationsQuasi1D and the nozzle width.

Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_nonconservative_chan_etalMethod
flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,
+                               equations::CompressibleEulerEquationsQuasi1D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the pressure CompressibleEulerEquationsQuasi1D and the nozzle width.

Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_nonconservative_chan_etalMethod
flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,
                                equations::ShallowWaterEquationsQuasi1D)
 flux_nonconservative_chan_etal(u_ll, u_rr, normal_direction::AbstractVector,
                                equations::ShallowWaterEquationsQuasi1D)    
 flux_nonconservative_chan_etal(u_ll, u_rr, 
                                normal_ll::AbstractVector, normal_rr::AbstractVector,
-                               equations::ShallowWaterEquationsQuasi1D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquationsQuasi1D and the channel width.

Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_nonconservative_chen_noelleMethod
flux_nonconservative_chen_noelle(u_ll, u_rr,
-                                 orientation::Integer,
-                                 equations::ShallowWaterEquations1D)

Non-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_chen_noelle on the conservative variables.

Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_chen_noelle in the surface flux to ensure consistency.

Further details on the hydrostatic reconstruction and its motivation can be found in

  • Guoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074
source
Trixi.flux_nonconservative_chen_noelleMethod
flux_nonconservative_chen_noelle(u_ll, u_rr,
-                                 orientation::Integer,
-                                 equations::ShallowWaterEquations2D)
-flux_nonconservative_chen_noelle(u_ll, u_rr,
-                                 normal_direction_ll      ::AbstractVector,
-                                 normal_direction_average ::AbstractVector,
-                                 equations::ShallowWaterEquations2D)

Non-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_chen_noelle on the conservative variables.

Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_chen_noelle in the surface flux to ensure consistency.

Further details on the hydrostatic reconstruction and its motivation can be found in

  • Guoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074
source
Trixi.flux_nonconservative_ersing_etalMethod
flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,
-                                 equations::ShallowWaterEquations1D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.

This is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_nonconservative_ersing_etalMethod
flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,
+                               equations::ShallowWaterEquationsQuasi1D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquationsQuasi1D and the channel width.

Further details are available in the paper:

  • Jesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089
source
Trixi.flux_nonconservative_ersing_etalMethod
flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,
+                                 equations::ShallowWaterEquations1D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.

This is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_nonconservative_ersing_etalMethod
flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,
                                  equations::ShallowWaterEquations2D)
 flux_nonconservative_ersing_etal(u_ll, u_rr,
                                  normal_direction_ll::AbstractVector,
                                  normal_direction_average::AbstractVector,
-                                 equations::ShallowWaterEquations2D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

This is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_nonconservative_ersing_etalMethod
flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,
-                                 equations::ShallowWaterTwoLayerEquations1D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterTwoLayerEquations1D and an additional term that couples the momentum of both layers.

This is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_nonconservative_ersing_etalMethod
flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,
-                                 equations::ShallowWaterTwoLayerEquations2D)
-flux_nonconservative_ersing_etal(u_ll, u_rr,
-                                 normal_direction_ll::AbstractVector,
-                                 normal_direction_average::AbstractVector,
-                                 equations::ShallowWaterTwoLayerEquations2D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterTwoLayerEquations2D and an additional term that couples the momentum of both layers.

This is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_nonconservative_fjordholm_etalMethod
flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,
-                                    equations::ShallowWaterEquations1D)

Non-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations1D.

This contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.

Further details for the original finite volume formulation are available in

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042

and for curvilinear 2D case in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_nonconservative_fjordholm_etalMethod
flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,
+                                 equations::ShallowWaterEquations2D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

This is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.

For further details see:

  • Patrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699
source
Trixi.flux_nonconservative_fjordholm_etalMethod
flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,
+                                    equations::ShallowWaterEquations1D)

Non-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations1D.

This contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.

Further details for the original finite volume formulation are available in

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042

and for curvilinear 2D case in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_nonconservative_fjordholm_etalMethod
flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,
                                     equations::ShallowWaterEquations2D)
 flux_nonconservative_fjordholm_etal(u_ll, u_rr,
                                     normal_direction_ll     ::AbstractVector,
                                     normal_direction_average::AbstractVector,
-                                    equations::ShallowWaterEquations2D)

Non-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

This contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.

Further details for the original finite volume formulation are available in

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042

and for curvilinear 2D case in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_nonconservative_powellMethod
flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,
+                                    equations::ShallowWaterEquations2D)

Non-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

This contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.

Further details for the original finite volume formulation are available in

  • Ulrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042

and for curvilinear 2D case in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_nonconservative_powellMethod
flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,
                             equations::IdealGlmMhdEquations2D)
 flux_nonconservative_powell(u_ll, u_rr,
                             normal_direction_ll     ::AbstractVector,
                             normal_direction_average::AbstractVector,
-                            equations::IdealGlmMhdEquations2D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

References

  • Marvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027
source
Trixi.flux_nonconservative_powellMethod
flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,
+                            equations::IdealGlmMhdEquations2D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

References

  • Marvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027
source
Trixi.flux_nonconservative_powellMethod
flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,
                             equations::IdealGlmMhdEquations3D)
 flux_nonconservative_powell(u_ll, u_rr,
                             normal_direction_ll     ::AbstractVector,
                             normal_direction_average::AbstractVector,
-                            equations::IdealGlmMhdEquations3D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations3D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

References

  • Marvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027
source
Trixi.flux_nonconservative_powellMethod
flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,
-                            equations::IdealGlmMhdMulticomponentEquations2D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdMulticomponentEquations2D.

References

  • Marvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027
source
Trixi.flux_nonconservative_powell_local_symmetricMethod
flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,
+                            equations::IdealGlmMhdEquations3D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations3D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

References

  • Marvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027
source
Trixi.flux_nonconservative_powellMethod
flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,
+                            equations::IdealGlmMhdMulticomponentEquations2D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdMulticomponentEquations2D.

References

  • Marvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027
source
Trixi.flux_nonconservative_powell_local_symmetricMethod
flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,
                                             equations::IdealGlmMhdEquations2D,
                                             nonconservative_type::NonConservativeSymmetric,
-                                            nonconservative_term::Integer)

Symmetric part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered "fluxes" for subcell limiting. See, e.g.,

  • Rueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.

This function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.

source
Trixi.flux_nonconservative_powell_local_symmetricMethod
flux_nonconservative_powell_local_symmetric(u_ll, u_rr,
+                                            nonconservative_term::Integer)

Symmetric part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered "fluxes" for subcell limiting. See, e.g.,

  • Rueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.

This function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.

source
Trixi.flux_nonconservative_powell_local_symmetricMethod
flux_nonconservative_powell_local_symmetric(u_ll, u_rr,
                                             orientation::Integer,
-                                            equations::IdealGlmMhdEquations2D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.

This implementation uses a non-conservative term that can be written as the product of local and symmetric parts. It is equivalent to the non-conservative flux of Bohm et al. (flux_nonconservative_powell) for conforming meshes but it yields different results on non-conforming meshes(!).

The two other flux functions with the same name return either the local or symmetric portion of the non-conservative flux based on the type of the nonconservativetype argument, employing multiple dispatch. They are used to compute the subcell fluxes in dg2dsubcelllimiters.jl.

References

  • Rueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.
source
Trixi.flux_nonconservative_powell_local_symmetricMethod
flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,
+                                            equations::IdealGlmMhdEquations2D)

Non-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.

This implementation uses a non-conservative term that can be written as the product of local and symmetric parts. It is equivalent to the non-conservative flux of Bohm et al. (flux_nonconservative_powell) for conforming meshes but it yields different results on non-conforming meshes(!).

The two other flux functions with the same name return either the local or symmetric portion of the non-conservative flux based on the type of the nonconservativetype argument, employing multiple dispatch. They are used to compute the subcell fluxes in dg2dsubcelllimiters.jl.

References

  • Rueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.
source
Trixi.flux_nonconservative_powell_local_symmetricMethod
flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,
                                             equations::IdealGlmMhdEquations2D,
                                             nonconservative_type::NonConservativeLocal,
-                                            nonconservative_term::Integer)

Local part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered "fluxes" for subcell limiting. See, e.g.,

  • Rueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.

This function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.

source
Trixi.flux_nonconservative_wintermeyer_etalMethod
flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,
-                                      equations::ShallowWaterEquations1D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.

Further details are available in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_nonconservative_wintermeyer_etalMethod
flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,
+                                            nonconservative_term::Integer)

Local part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered "fluxes" for subcell limiting. See, e.g.,

  • Rueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.

This function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.

source
Trixi.flux_nonconservative_wintermeyer_etalMethod
flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,
+                                      equations::ShallowWaterEquations1D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.

Further details are available in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_nonconservative_wintermeyer_etalMethod
flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,
                                       equations::ShallowWaterEquations2D)
 flux_nonconservative_wintermeyer_etal(u_ll, u_rr,
                                       normal_direction_ll     ::AbstractVector,
                                       normal_direction_average::AbstractVector,
-                                      equations::ShallowWaterEquations2D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

Further details are available in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations1D)

Entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
-             equations::CompressibleEulerEquations2D)

Entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
-             equations::CompressibleEulerEquations3D)

Entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
-             equations::CompressibleEulerMulticomponentEquations1D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
-             equations::CompressibleEulerMulticomponentEquations2D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_shima_etalMethod
flux_shima_etal(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

This flux is is a modification of the original kinetic energy preserving two-point flux by

  • Yuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058

The modification is in the energy flux to guarantee pressure equilibrium and was developed by

  • Nao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060
source
Trixi.flux_shima_etalMethod
flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,
-                equations::CompressibleEulerEquations2D)

This flux is is a modification of the original kinetic energy preserving two-point flux by

  • Yuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058

The modification is in the energy flux to guarantee pressure equilibrium and was developed by

  • Nao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060
source
Trixi.flux_shima_etalMethod
flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,
-                equations::CompressibleEulerEquations3D)

This flux is is a modification of the original kinetic energy preserving two-point flux by

  • Yuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058

The modification is in the energy flux to guarantee pressure equilibrium and was developed by

  • Nao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060
source
Trixi.flux_wintermeyer_etalMethod
flux_wintermeyer_etal(u_ll, u_rr, orientation,
-                      equations::ShallowWaterEquations1D)

Total energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.

Further details are available in Theorem 1 of the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_wintermeyer_etalMethod
flux_wintermeyer_etal(u_ll, u_rr, orientation_or_normal_direction,
-                      equations::ShallowWaterEquations2D)

Total energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.

Further details are available in Theorem 1 of the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_wintermeyer_etalMethod
flux_wintermeyer_etal(u_ll, u_rr, orientation,
-                      equations::ShallowWaterTwoLayerEquations1D)

Total energy conservative (mathematical entropy for two-layer shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used with the nonconservative flux_nonconservative_ersing_etal. To obtain the flux for the two-layer shallow water equations the flux that is described in the paper for the normal shallow water equations is used within each layer.

Further details are available in Theorem 1 of the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_wintermeyer_etalMethod
flux_wintermeyer_etal(u_ll, u_rr, orientation,
-                      equations::ShallowWaterTwoLayerEquations2D)
-flux_wintermeyer_etal(u_ll, u_rr,
-                      normal_direction::AbstractVector,
-                      equations::ShallowWaterTwoLayerEquations2D)

Total energy conservative (mathematical entropy for two-layer shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used with the nonconservative flux_nonconservative_ersing_etal. To obtain the flux for the two-layer shallow water equations the flux that is described in the paper for the normal shallow water equations is used within each layer.

Further details are available in Theorem 1 of the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_winters_etalMethod
flux_winters_etal(u_ll, u_rr, orientation_or_normal_direction,
-                  equations::PolytropicEulerEquations2D)

Entropy conserving two-point flux for isothermal or polytropic gases. Requires a special weighted Stolarsky mean for the evaluation of the density denoted here as stolarsky_mean. Note, for isothermal gases where gamma = 1 this stolarsky_mean becomes the ln_mean.

For details see Section 3.2 of the following reference

  • Andrew R. Winters, Christof Czernik, Moritz B. Schily & Gregor J. Gassner (2020) Entropy stable numerical approximations for the isothermal and polytropic Euler equations DOI: 10.1007/s10543-019-00789-w
source
Trixi.get_boundary_outer_stateMethod
get_boundary_outer_state(boundary_condition::BoundaryConditionDirichlet,
-                         cache, t, equations, dg, indices...)

For subcell limiting, the calculation of local bounds for non-periodic domains require the boundary outer state. This function returns the boundary value at time t and for node with spatial indices indices.

source
Trixi.get_nameMethod
get_name(x)

Returns a name of x ready for pretty printing. By default, return string(y) if x isa Val{y} and return string(x) otherwise.

Examples

julia> Trixi.get_name("test")
+                                      equations::ShallowWaterEquations2D)

Non-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.

On curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.

Further details are available in the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations1D)

Entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
+             equations::CompressibleEulerEquations2D)

Entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
+             equations::CompressibleEulerEquations3D)

Entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
+             equations::CompressibleEulerMulticomponentEquations1D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_ranochaMethod
flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,
+             equations::CompressibleEulerMulticomponentEquations2D)

Adaption of the entropy conserving and kinetic energy preserving two-point flux by

  • Hendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig

See also

  • Hendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018
source
Trixi.flux_shima_etalMethod
flux_shima_etal(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

This flux is is a modification of the original kinetic energy preserving two-point flux by

  • Yuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058

The modification is in the energy flux to guarantee pressure equilibrium and was developed by

  • Nao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060
source
Trixi.flux_shima_etalMethod
flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,
+                equations::CompressibleEulerEquations2D)

This flux is is a modification of the original kinetic energy preserving two-point flux by

  • Yuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058

The modification is in the energy flux to guarantee pressure equilibrium and was developed by

  • Nao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060
source
Trixi.flux_shima_etalMethod
flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,
+                equations::CompressibleEulerEquations3D)

This flux is is a modification of the original kinetic energy preserving two-point flux by

  • Yuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058

The modification is in the energy flux to guarantee pressure equilibrium and was developed by

  • Nao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060
source
Trixi.flux_wintermeyer_etalMethod
flux_wintermeyer_etal(u_ll, u_rr, orientation,
+                      equations::ShallowWaterEquations1D)

Total energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.

Further details are available in Theorem 1 of the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_wintermeyer_etalMethod
flux_wintermeyer_etal(u_ll, u_rr, orientation_or_normal_direction,
+                      equations::ShallowWaterEquations2D)

Total energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.

Further details are available in Theorem 1 of the paper:

  • Niklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036
source
Trixi.flux_winters_etalMethod
flux_winters_etal(u_ll, u_rr, orientation_or_normal_direction,
+                  equations::PolytropicEulerEquations2D)

Entropy conserving two-point flux for isothermal or polytropic gases. Requires a special weighted Stolarsky mean for the evaluation of the density denoted here as stolarsky_mean. Note, for isothermal gases where gamma = 1 this stolarsky_mean becomes the ln_mean.

For details see Section 3.2 of the following reference

  • Andrew R. Winters, Christof Czernik, Moritz B. Schily & Gregor J. Gassner (2020) Entropy stable numerical approximations for the isothermal and polytropic Euler equations DOI: 10.1007/s10543-019-00789-w
source
Trixi.get_boundary_outer_stateMethod
get_boundary_outer_state(boundary_condition::BoundaryConditionDirichlet,
+                         cache, t, equations, dg, indices...)

For subcell limiting, the calculation of local bounds for non-periodic domains require the boundary outer state. This function returns the boundary value at time t and for node with spatial indices indices.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.get_nameMethod
get_name(x)

Returns a name of x ready for pretty printing. By default, return string(y) if x isa Val{y} and return string(x) otherwise.

Examples

julia> Trixi.get_name("test")
 "test"
 
 julia> Trixi.get_name(Val(:test))
-"test"
source
Trixi.get_nameMethod
get_name(equations::AbstractEquations)

Returns the canonical, human-readable name for the given system of equations.

Examples

julia> Trixi.get_name(CompressibleEulerEquations1D(1.4))
-"CompressibleEulerEquations1D"
source
Trixi.getmeshMethod
getmesh(pd::AbstractPlotData)

Extract grid lines from pd for plotting with Plots.plot.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.global_mean_varsMethod
global_mean_vars(equations::AcousticPerturbationEquations2D)

Returns the global mean variables stored in equations. This makes it easier to define flexible initial conditions for problems with constant mean flow.

source
Trixi.have_nonconservative_termsMethod
have_nonconservative_terms(equations)

Trait function determining whether equations represent a conservation law with or without nonconservative terms. Classical conservation laws such as the CompressibleEulerEquations2D do not have nonconservative terms. The ShallowWaterEquations2D with non-constant bottom topography are an example of equations with nonconservative terms. The return value will be True() or False() to allow dispatching on the return type.

source
Trixi.hydrostatic_reconstruction_audusse_etalMethod
hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation::Integer,
-                                        equations::ShallowWaterEquations1D)

A particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations1D. The reconstructed solution states u_ll_star and u_rr_star variables are then used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.

Further details on this hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.hydrostatic_reconstruction_audusse_etalMethod
hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation_or_normal_direction,
-                                        equations::ShallowWaterEquations2D)

A particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations2D. The reconstructed solution states u_ll_star and u_rr_star variables are used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.

Further details for the hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.hydrostatic_reconstruction_chen_noelleMethod
hydrostatic_reconstruction_chen_noelle(u_ll, u_rr, orientation::Integer,
-                                       equations::ShallowWaterEquations1D)

A particular type of hydrostatic reconstruction of the water height to guarantee well-balancedness for a general bottom topography of the ShallowWaterEquations1D. The reconstructed solution states u_ll_star and u_rr_star variables are used to evaluate the surface numerical flux at the interface. The key idea is a linear reconstruction of the bottom and water height at the interfaces using subcells. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.

Further details on this hydrostatic reconstruction and its motivation can be found in

  • Guoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074
source
Trixi.hydrostatic_reconstruction_chen_noelleMethod
hydrostatic_reconstruction_chen_noelle(u_ll, u_rr, orientation::Integer,
-                                       equations::ShallowWaterEquations2D)

A particular type of hydrostatic reconstruction of the water height to guarantee well-balancedness for a general bottom topography of the ShallowWaterEquations2D. The reconstructed solution states u_ll_star and u_rr_star variables are then used to evaluate the surface numerical flux at the interface. The key idea is a linear reconstruction of the bottom and water height at the interfaces using subcells. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.

Further details on this hydrostatic reconstruction and its motivation can be found in

  • Guoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074
source
Trixi.init_mpiMethod
init_mpi()

Initialize MPI by calling MPI.Initialized(). The function will check if MPI is already initialized and if yes, do nothing, thus it is safe to call it multiple times.

source
Trixi.init_p4estMethod
init_p4est()

Initialize p4est by calling p4est_init and setting the log level to SC_LP_ERROR. This function will check if p4est is already initialized and if yes, do nothing, thus it is safe to call it multiple times.

source
Trixi.init_t8codeMethod
init_t8code()

Initialize t8code by calling sc_init, p4est_init, and t8_init while setting the log level to SC_LP_ERROR. This function will check if t8code is already initialized and if yes, do nothing, thus it is safe to call it multiple times.

source
Trixi.initial_condition_constantMethod
initial_condition_constant(x, t, equations::AcousticPerturbationEquations2D)

A constant initial condition where the state variables are zero and the mean flow is constant. Uses the global mean values from equations.

source
Trixi.initial_condition_density_waveMethod
initial_condition_density_wave(x, t, equations::CompressibleEulerEquations1D)

A sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper

  • Gregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026

with the following parameters

  • domain [-1, 1]
  • mesh = 4x4
  • polydeg = 5
source
Trixi.initial_condition_density_waveMethod
initial_condition_density_wave(x, t, equations::CompressibleEulerEquations2D)

A sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper

  • Gregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026

with the following parameters

  • domain [-1, 1]
  • mesh = 4x4
  • polydeg = 5
source
Trixi.initial_condition_eoc_test_coupled_euler_gravityMethod
initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations1D)

One dimensional variant of the setup used for convergence tests of the Euler equations with self-gravity from

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593
Note

There is no additional source term necessary for the manufactured solution in one spatial dimension. Thus, source_terms_eoc_test_coupled_euler_gravity is not present there.

source
Trixi.initial_condition_eoc_test_coupled_euler_gravityMethod
initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations2D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.

source
Trixi.initial_condition_eoc_test_coupled_euler_gravityMethod
initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations3D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.

source
Trixi.initial_condition_gaussMethod
initial_condition_gauss(x, t, equations::AcousticPerturbationEquations2D)

A Gaussian pulse in a constant mean flow. Uses the global mean values from equations.

source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations1D)

A weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations2D)

A weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations3D)

A weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations1D)

A for multicomponent adapted weak blast wave adapted to multicomponent and taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations2D)

A for multicomponent adapted weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations1D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations2D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations3D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations1D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations2D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::PolytropicEulerEquations2D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations1D)

A weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.

source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations2D)

A weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.

source
Trixi.integrate_via_indicesMethod
integrate_via_indices(func, u_ode, semi::AbstractSemidiscretization, args...; normalize=true)

Call func(u, i..., element, equations, solver, args...) for all nodal indices i..., element and integrate the result using a quadrature associated with the semidiscretization semi.

If normalize is true, the result is divided by the total volume of the computational domain.

source
Trixi.inv_ln_meanMethod
inv_ln_mean(x, y)

Compute the inverse 1 / ln_mean(x, y) of the logarithmic mean ln_mean.

This function may be used to increase performance where the inverse of the logarithmic mean is needed, by replacing a (slow) division by a (fast) multiplication.

source
Trixi.get_nameMethod
get_name(equations::AbstractEquations)

Returns the canonical, human-readable name for the given system of equations.

Examples

julia> Trixi.get_name(CompressibleEulerEquations1D(1.4))
+"CompressibleEulerEquations1D"
source
Trixi.getmeshMethod
getmesh(pd::AbstractPlotData)

Extract grid lines from pd for plotting with Plots.plot.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.global_mean_varsMethod
global_mean_vars(equations::AcousticPerturbationEquations2D)

Returns the global mean variables stored in equations. This makes it easier to define flexible initial conditions for problems with constant mean flow.

source
Trixi.have_nonconservative_termsMethod
have_nonconservative_terms(equations)

Trait function determining whether equations represent a conservation law with or without nonconservative terms. Classical conservation laws such as the CompressibleEulerEquations2D do not have nonconservative terms. The ShallowWaterEquations2D with non-constant bottom topography are an example of equations with nonconservative terms. The return value will be True() or False() to allow dispatching on the return type.

source
Trixi.hydrostatic_reconstruction_audusse_etalMethod
hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation::Integer,
+                                        equations::ShallowWaterEquations1D)

A particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations1D. The reconstructed solution states u_ll_star and u_rr_star variables are then used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.

Further details on this hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.hydrostatic_reconstruction_audusse_etalMethod
hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation_or_normal_direction,
+                                        equations::ShallowWaterEquations2D)

A particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations2D. The reconstructed solution states u_ll_star and u_rr_star variables are used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.

Further details for the hydrostatic reconstruction and its motivation can be found in

  • Emmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090
source
Trixi.init_mpiMethod
init_mpi()

Initialize MPI by calling MPI.Initialized(). The function will check if MPI is already initialized and if yes, do nothing, thus it is safe to call it multiple times.

source
Trixi.init_p4estMethod
init_p4est()

Initialize p4est by calling p4est_init and setting the log level to SC_LP_ERROR. This function will check if p4est is already initialized and if yes, do nothing, thus it is safe to call it multiple times.

source
Trixi.init_t8codeMethod
init_t8code()

Initialize t8code by calling sc_init, p4est_init, and t8_init while setting the log level to SC_LP_ERROR. This function will check if t8code is already initialized and if yes, do nothing, thus it is safe to call it multiple times.

source
Trixi.initial_condition_constantMethod
initial_condition_constant(x, t, equations::AcousticPerturbationEquations2D)

A constant initial condition where the state variables are zero and the mean flow is constant. Uses the global mean values from equations.

source
Trixi.initial_condition_density_waveMethod
initial_condition_density_wave(x, t, equations::CompressibleEulerEquations1D)

A sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper

  • Gregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026

with the following parameters

  • domain [-1, 1]
  • mesh = 4x4
  • polydeg = 5
source
Trixi.initial_condition_density_waveMethod
initial_condition_density_wave(x, t, equations::CompressibleEulerEquations2D)

A sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper

  • Gregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026

with the following parameters

  • domain [-1, 1]
  • mesh = 4x4
  • polydeg = 5
source
Trixi.initial_condition_eoc_test_coupled_euler_gravityMethod
initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations1D)

One dimensional variant of the setup used for convergence tests of the Euler equations with self-gravity from

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593
Note

There is no additional source term necessary for the manufactured solution in one spatial dimension. Thus, source_terms_eoc_test_coupled_euler_gravity is not present there.

source
Trixi.initial_condition_eoc_test_coupled_euler_gravityMethod
initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations2D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.

source
Trixi.initial_condition_eoc_test_coupled_euler_gravityMethod
initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations3D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.

source
Trixi.initial_condition_gaussMethod
initial_condition_gauss(x, t, equations::AcousticPerturbationEquations2D)

A Gaussian pulse in a constant mean flow. Uses the global mean values from equations.

source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations1D)

A weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations2D)

A weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations3D)

A weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations1D)

A for multicomponent adapted weak blast wave adapted to multicomponent and taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations2D)

A for multicomponent adapted weak blast wave taken from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations1D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations2D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations3D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations1D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations2D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::PolytropicEulerEquations2D)

A weak blast wave adapted from

  • Sebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044
source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations1D)

A weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.

source
Trixi.initial_condition_weak_blast_waveMethod
initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations2D)

A weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.

source
Trixi.integrate_via_indicesMethod
integrate_via_indices(func, u_ode, semi::AbstractSemidiscretization, args...; normalize=true)

Call func(u, i..., element, equations, solver, args...) for all nodal indices i..., element and integrate the result using a quadrature associated with the semidiscretization semi.

If normalize is true, the result is divided by the total volume of the computational domain.

source
Trixi.inv_ln_meanMethod
inv_ln_mean(x, y)

Compute the inverse 1 / ln_mean(x, y) of the logarithmic mean ln_mean.

This function may be used to increase performance where the inverse of the logarithmic mean is needed, by replacing a (slow) division by a (fast) multiplication.

source
Trixi.jacobian_ad_forwardMethod
jacobian_ad_forward(semi::AbstractSemidiscretization;
                     t0=zero(real(semi)),
-                    u0_ode=compute_coefficients(t0, semi))

Uses the right-hand side operator of the semidiscretization semi and forward mode automatic differentiation to compute the Jacobian J of the semidiscretization semi at state u0_ode.

source
Trixi.jacobian_fdMethod
jacobian_fd(semi::AbstractSemidiscretization;
+                    u0_ode=compute_coefficients(t0, semi))

Uses the right-hand side operator of the semidiscretization semi and forward mode automatic differentiation to compute the Jacobian J of the semidiscretization semi at state u0_ode.

source
Trixi.jacobian_fdMethod
jacobian_fd(semi::AbstractSemidiscretization;
             t0=zero(real(semi)),
-            u0_ode=compute_coefficients(t0, semi))

Uses the right-hand side operator of the semidiscretization semi and simple second order finite difference to compute the Jacobian J of the semidiscretization semi at state u0_ode.

source
Trixi.linear_structureMethod
linear_structure(semi::AbstractSemidiscretization;
-                 t0=zero(real(semi)))

Wraps the right-hand side operator of the semidiscretization semi at time t0 as an affine-linear operator given by a linear operator A and a vector b.

source
Trixi.ln_meanMethod
ln_mean(x, y)

Compute the logarithmic mean

ln_mean(x, y) = (y - x) / (log(y) - log(x)) = (y - x) / log(y / x)

Problem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Ismail and Roe (2009). Set ξ = y / x. Then, we have

(y - x) / log(y / x) = (x + y) / log(ξ) * (ξ - 1) / (ξ + 1)

Set f = (ξ - 1) / (ξ + 1) = (y - x) / (x + y). Then, we use the expansion

log(ξ) = 2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7) + O(ξ^9)

Inserting the first few terms of this expansion yields

(y - x) / log(ξ) ≈ (x + y) * f / (2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7))
+            u0_ode=compute_coefficients(t0, semi))

Uses the right-hand side operator of the semidiscretization semi and simple second order finite difference to compute the Jacobian J of the semidiscretization semi at state u0_ode.

source
Trixi.linear_structureMethod
linear_structure(semi::AbstractSemidiscretization;
+                 t0=zero(real(semi)))

Wraps the right-hand side operator of the semidiscretization semi at time t0 as an affine-linear operator given by a linear operator A and a vector b.

source
Trixi.ln_meanMethod
ln_mean(x, y)

Compute the logarithmic mean

ln_mean(x, y) = (y - x) / (log(y) - log(x)) = (y - x) / log(y / x)

Problem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Ismail and Roe (2009). Set ξ = y / x. Then, we have

(y - x) / log(y / x) = (x + y) / log(ξ) * (ξ - 1) / (ξ + 1)

Set f = (ξ - 1) / (ξ + 1) = (y - x) / (x + y). Then, we use the expansion

log(ξ) = 2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7) + O(ξ^9)

Inserting the first few terms of this expansion yields

(y - x) / log(ξ) ≈ (x + y) * f / (2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7))
                  = (x + y) / (2 + 2/3 * f^2 + 2/5 * f^4 + 2/7 * f^6)

Since divisions are usually more expensive on modern hardware than multiplications (Agner Fog), we try to avoid computing two divisions. Thus, we use

f^2 = (y - x)^2 / (x + y)^2
     = (x * (x - 2 * y) + y * y) / (x * (x + 2 * y) + y * y)

Given ε = 1.0e-4, we use the following algorithm.

if f^2 < ε
   # use the expansion above
 else
   # use the direct formula (y - x) / log(y / x)
-end

References

source
Trixi.load_adaptive_time_integrator!Method
load_adaptive_time_integrator!(integrator, restart_file::AbstractString)

Load the context information for time integrators with error-based step size control saved in a restart_file.

source
Trixi.load_dtMethod
load_dt(restart_file::AbstractString)

Load the time step size (dt in OrdinaryDiffEq.jl) saved in a restart_file.

source
Trixi.load_meshMethod
load_mesh(restart_file::AbstractString; n_cells_max)

Load the mesh from the restart_file.

source
Trixi.load_timeMethod
load_time(restart_file::AbstractString)

Load the time saved in a restart_file.

source
Trixi.load_timestep!Method
load_timestep!(integrator, restart_file::AbstractString)

Load the time step number saved in a restart_file and assign it to both the time step number and and the number of accepted steps (iter and stats.naccept in OrdinaryDiffEq.jl, respectively) in integrator.

source
Trixi.load_timestepMethod
load_timestep(restart_file::AbstractString)

Load the time step number (iter in OrdinaryDiffEq.jl) saved in a restart_file.

source
Trixi.maxMethod
max(x, y, ...)

Return the maximum of the arguments. See also the maximum function to take the maximum element from a collection.

This version in Trixi.jl is semantically equivalent to Base.max but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).

Examples

julia> max(2, 5, 1)
-5
source
Trixi.max_abs_speed_naiveFunction
max_abs_speed_naive(u_ll, u_rr, orientation::Integer,   equations)
-max_abs_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)

Simple and fast estimate of the maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, based only on the local wave speeds associated to u_ll and u_rr.

For non-integer arguments normal_direction in one dimension, max_abs_speed_naive returns abs(normal_direction[1]) * max_abs_speed_naive(u_ll, u_rr, 1, equations).

source
Trixi.minMethod
min(x, y, ...)

Return the minimum of the arguments. See also the minimum function to take the minimum element from a collection.

This version in Trixi.jl is semantically equivalent to Base.min but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).

Examples

julia> min(2, 5, 1)
-1
source
Trixi.min_max_speed_chen_noelleMethod
min_max_speed_chen_noelle(u_ll, u_rr, orientation::Integer,
-                          equations::ShallowWaterEquations1D)

The approximated speeds for the HLL type numerical flux used by Chen and Noelle for their hydrostatic reconstruction. As they state in the paper, these speeds are chosen for the numerical flux to ensure positivity and to satisfy an entropy inequality.

Further details on this hydrostatic reconstruction and its motivation can be found in

  • Guoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074
source
Trixi.min_max_speed_chen_noelleMethod
min_max_speed_chen_noelle(u_ll, u_rr, orientation::Integer,
-                          equations::ShallowWaterEquations2D)
-min_max_speed_chen_noelle(u_ll, u_rr, normal_direction::AbstractVector,
-                          equations::ShallowWaterEquations2D)

Special estimate of the minimal and maximal wave speed of the shallow water equations for the left and right states u_ll, u_rr. These approximate speeds are used for the HLL-type numerical flux flux_hll_chen_noelle. These wave speed estimates together with a particular hydrostatic reconstruction technique guarantee that the numerical flux is positive and satisfies an entropy inequality.

Further details on this hydrostatic reconstruction and its motivation can be found in the reference below. The definition of the wave speeds are given in Equation (2.20).

  • Guoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074
source
Trixi.min_max_speed_davisFunction
min_max_speed_davis(u_ll, u_rr, orientation::Integer, equations)
-min_max_speed_davis(u_ll, u_rr, normal_direction::AbstractVector, equations)

Simple and fast estimates of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr.

See also FluxHLL, min_max_speed_naive, min_max_speed_einfeldt.

source
Trixi.min_max_speed_einfeldtFunction
min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations)
-min_max_speed_einfeldt(u_ll, u_rr, normal_direction::AbstractVector, equations)

More advanced mininmal and maximal wave speed computation based on

originally developed for the compressible Euler equations. A compact representation can be found in this lecture notes, eq. (9.28).

See also FluxHLL, min_max_speed_naive, min_max_speed_davis.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations2D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations3D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

Original publication:

Compactly summarized:

  • Siddhartha Mishra, Ulrik Skre Fjordholm and Rémi Abgrall Numerical methods for conservation laws and related equations. Link
source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_naiveFunction
min_max_speed_naive(u_ll, u_rr, orientation::Integer, equations)
-min_max_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)

Simple and fast estimate(!) of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr.

  • Amiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002

See also FluxHLL, min_max_speed_davis, min_max_speed_einfeldt.

source
Trixi.modify_dt_for_tstops!Method
modify_dt_for_tstops!(integrator::SimpleIntegratorSSP)

Modify the time-step size to match the time stops specified in integrator.opts.tstops. To avoid adding OrdinaryDiffEq to Trixi's dependencies, this routine is a copy of https://github.com/SciML/OrdinaryDiffEq.jl/blob/d76335281c540ee5a6d1bd8bb634713e004f62ee/src/integrators/integrator_utils.jl#L38-L54

source
Trixi.multiply_dimensionwiseMethod
multiply_dimensionwise(matrix::AbstractMatrix, data_in::AbstractArray{<:Any, NDIMS+1})

Multiply the array data_in by matrix in each coordinate direction, where data_in is assumed to have the first coordinate for the number of variables and the remaining coordinates are multiplied by matrix.

source
Trixi.n_nonconservative_termsFunction
n_nonconservative_terms(equations)

Number of nonconservative terms in the form local * symmetric for a particular equation. This function needs to be specialized only if equations with nonconservative terms are combined with certain solvers (e.g., subcell limiting).

source
Trixi.ndofsMethod
ndofs(semi::AbstractSemidiscretization)

Return the number of degrees of freedom associated with each scalar variable.

source
Trixi.negative_partMethod
negative_part(x)

Return x if x is negative, else zero. In other words, return (x - abs(x)) / 2 for real numbers x.

source
Trixi.ode_default_optionsMethod
ode_default_options()

Return the default options for OrdinaryDiffEq's solve. Pass ode_default_options()... to solve to only return the solution at the final time and enable MPI aware error-based step size control, whenever MPI is used. For example, use solve(ode, alg; ode_default_options()...).

source
Trixi.ode_normMethod
ode_norm(u, t)

Implementation of the weighted L2 norm of Hairer and Wanner used for error-based step size control in OrdinaryDiffEq.jl. This function is aware of MPI and uses global MPI communication when running in parallel.

You must pass this function as a keyword argument internalnorm=ode_norm to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.

See the "Advanced Adaptive Stepsize Control" section of the documentation.

source
Trixi.ode_unstable_checkMethod
ode_unstable_check(dt, u, semi, t)

Implementation of the basic check for instability used in OrdinaryDiffEq.jl. Instead of checking something like any(isnan, u), this function just checks isnan(dt). This helps when using MPI parallelization, since no additional global communication is required and all ranks will return the same result.

You should pass this function as a keyword argument unstable_check=ode_unstable_check to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.

See the "Miscellaneous" section of the documentation.

source
Trixi.partition!Method
partition!(mesh::ParallelTreeMesh, allow_coarsening=true)

Partition mesh using a static domain decomposition algorithm based on leaf cell count and tree structure. If allow_coarsening is true, the algorithm will keep leaf cells together on one rank when needed for local coarsening (i.e. when all children of a cell are leaves).

source
Trixi.positive_partMethod
positive_part(x)

Return x if x is positive, else zero. In other words, return (x + abs(x)) / 2 for real numbers x.

source
Trixi.pressureMethod
pressure(rho::Real, equations::LatticeBoltzmannEquations2D)
-pressure(u, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic pressure from the density rho or the particle distribution functions u.

source
Trixi.pressureMethod
pressure(rho::Real, equations::LatticeBoltzmannEquations3D)
-pressure(u, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic pressure from the density rho or the particle distribution functions u.

source
Trixi.prim2consFunction
prim2cons(u, equations)

Convert the primitive variables u to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2prim.

source
Trixi.rotate_from_xFunction
rotate_from_x(u, normal, equations)

Apply the rotation that maps the x-axis onto normal to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.

See also: rotate_to_x

source
Trixi.rotate_to_xFunction
rotate_to_x(u, normal, equations)

Apply the rotation that maps normal onto the x-axis to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.

See also: rotate_from_x

source
Trixi.load_adaptive_time_integrator!Method
load_adaptive_time_integrator!(integrator, restart_file::AbstractString)

Load the context information for time integrators with error-based step size control saved in a restart_file.

source
Trixi.load_dtMethod
load_dt(restart_file::AbstractString)

Load the time step size (dt in OrdinaryDiffEq.jl) saved in a restart_file.

source
Trixi.load_meshMethod
load_mesh(restart_file::AbstractString; n_cells_max)

Load the mesh from the restart_file.

source
Trixi.load_timeMethod
load_time(restart_file::AbstractString)

Load the time saved in a restart_file.

source
Trixi.load_timestep!Method
load_timestep!(integrator, restart_file::AbstractString)

Load the time step number saved in a restart_file and assign it to both the time step number and and the number of accepted steps (iter and stats.naccept in OrdinaryDiffEq.jl, respectively) in integrator.

source
Trixi.load_timestepMethod
load_timestep(restart_file::AbstractString)

Load the time step number (iter in OrdinaryDiffEq.jl) saved in a restart_file.

source
Trixi.maxMethod
max(x, y, ...)

Return the maximum of the arguments. See also the maximum function to take the maximum element from a collection.

This version in Trixi.jl is semantically equivalent to Base.max but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).

Examples

julia> max(2, 5, 1)
+5
source
Trixi.max_abs_speed_naiveFunction
max_abs_speed_naive(u_ll, u_rr, orientation::Integer,   equations)
+max_abs_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)

Simple and fast estimate of the maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, based only on the local wave speeds associated to u_ll and u_rr.

For non-integer arguments normal_direction in one dimension, max_abs_speed_naive returns abs(normal_direction[1]) * max_abs_speed_naive(u_ll, u_rr, 1, equations).

source
Trixi.minMethod
min(x, y, ...)

Return the minimum of the arguments. See also the minimum function to take the minimum element from a collection.

This version in Trixi.jl is semantically equivalent to Base.min but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).

Examples

julia> min(2, 5, 1)
+1
source
Trixi.min_max_speed_davisFunction
min_max_speed_davis(u_ll, u_rr, orientation::Integer, equations)
+min_max_speed_davis(u_ll, u_rr, normal_direction::AbstractVector, equations)

Simple and fast estimates of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr.

See eq. (10.38) from

  • Eleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction DOI: 10.1007/b79761

See also FluxHLL, min_max_speed_naive, min_max_speed_einfeldt.

source
Trixi.min_max_speed_einfeldtFunction
min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations)
+min_max_speed_einfeldt(u_ll, u_rr, normal_direction::AbstractVector, equations)

More advanced mininmal and maximal wave speed computation based on

originally developed for the compressible Euler equations. A compact representation can be found in this lecture notes, eq. (9.28).

See also FluxHLL, min_max_speed_naive, min_max_speed_davis.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations2D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations3D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

Original publication:

Compactly summarized:

  • Siddhartha Mishra, Ulrik Skre Fjordholm and Rémi Abgrall Numerical methods for conservation laws and related equations. Link
source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_einfeldtMethod
min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)

Computes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.

source
Trixi.min_max_speed_naiveFunction
min_max_speed_naive(u_ll, u_rr, orientation::Integer, equations)
+min_max_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)

Simple and fast estimate(!) of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr. Slightly more diffusive than min_max_speed_davis.

  • Amiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002

See eq. (10.37) from

  • Eleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction DOI: 10.1007/b79761

See also FluxHLL, min_max_speed_davis, min_max_speed_einfeldt.

source
Trixi.modify_dt_for_tstops!Method
modify_dt_for_tstops!(integrator::SimpleIntegratorSSP)

Modify the time-step size to match the time stops specified in integrator.opts.tstops. To avoid adding OrdinaryDiffEq to Trixi's dependencies, this routine is a copy of https://github.com/SciML/OrdinaryDiffEq.jl/blob/d76335281c540ee5a6d1bd8bb634713e004f62ee/src/integrators/integrator_utils.jl#L38-L54

source
Trixi.multiply_dimensionwiseMethod
multiply_dimensionwise(matrix::AbstractMatrix, data_in::AbstractArray{<:Any, NDIMS+1})

Multiply the array data_in by matrix in each coordinate direction, where data_in is assumed to have the first coordinate for the number of variables and the remaining coordinates are multiplied by matrix.

source
Trixi.n_nonconservative_termsFunction
n_nonconservative_terms(equations)

Number of nonconservative terms in the form local * symmetric for a particular equation. This function needs to be specialized only if equations with nonconservative terms are combined with certain solvers (e.g., subcell limiting).

source
Trixi.ndofsMethod
ndofs(semi::AbstractSemidiscretization)

Return the number of degrees of freedom associated with each scalar variable.

source
Trixi.negative_partMethod
negative_part(x)

Return x if x is negative, else zero. In other words, return (x - abs(x)) / 2 for real numbers x.

source
Trixi.ode_default_optionsMethod
ode_default_options()

Return the default options for OrdinaryDiffEq's solve. Pass ode_default_options()... to solve to only return the solution at the final time and enable MPI aware error-based step size control, whenever MPI is used. For example, use solve(ode, alg; ode_default_options()...).

source
Trixi.ode_normMethod
ode_norm(u, t)

Implementation of the weighted L2 norm of Hairer and Wanner used for error-based step size control in OrdinaryDiffEq.jl. This function is aware of MPI and uses global MPI communication when running in parallel.

You must pass this function as a keyword argument internalnorm=ode_norm to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.

See the "Advanced Adaptive Stepsize Control" section of the documentation.

source
Trixi.ode_unstable_checkMethod
ode_unstable_check(dt, u, semi, t)

Implementation of the basic check for instability used in OrdinaryDiffEq.jl. Instead of checking something like any(isnan, u), this function just checks isnan(dt). This helps when using MPI parallelization, since no additional global communication is required and all ranks will return the same result.

You should pass this function as a keyword argument unstable_check=ode_unstable_check to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.

See the "Miscellaneous" section of the documentation.

source
Trixi.partition!Method
Trixi.partition!(mesh::T8codeMesh)

Partition a T8codeMesh in order to redistribute elements evenly among MPI ranks.

Arguments

  • mesh::T8codeMesh: Initialized mesh object.
source
Trixi.partition!Method
partition!(mesh::ParallelTreeMesh, allow_coarsening=true)

Partition mesh using a static domain decomposition algorithm based on leaf cell count and tree structure. If allow_coarsening is true, the algorithm will keep leaf cells together on one rank when needed for local coarsening (i.e. when all children of a cell are leaves).

source
Trixi.positive_partMethod
positive_part(x)

Return x if x is positive, else zero. In other words, return (x + abs(x)) / 2 for real numbers x.

source
Trixi.pressureMethod
pressure(rho::Real, equations::LatticeBoltzmannEquations2D)
+pressure(u, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic pressure from the density rho or the particle distribution functions u.

source
Trixi.pressureMethod
pressure(rho::Real, equations::LatticeBoltzmannEquations3D)
+pressure(u, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic pressure from the density rho or the particle distribution functions u.

source
Trixi.prim2consFunction
prim2cons(u, equations)

Convert the primitive variables u to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2prim.

source
Trixi.rotate_from_xFunction
rotate_from_x(u, normal, equations)

Apply the rotation that maps the x-axis onto normal to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.

See also: rotate_to_x

source
Trixi.rotate_to_xFunction
rotate_to_x(u, normal, equations)

Apply the rotation that maps normal onto the x-axis to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.

See also: rotate_from_x

source
Trixi.save_plotMethod
save_plot(plot_data, variable_names;
           show_mesh=true, plot_arguments=Dict{Symbol,Any}(),
-          time=nothing, timestep=nothing)

Visualize the plot data object provided in plot_data and save result as a PNG file in the out directory, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.

The timestep is used in the filename. time is currently unused by this function.

Experimental implementation

This is an experimental feature and may change in future releases.

See also: VisualizationCallback, show_plot

source
Trixi.show_plotMethod
show_plot(plot_data, variable_names;
+          time=nothing, timestep=nothing)

Visualize the plot data object provided in plot_data and save result as a PNG file in the out directory, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.

The timestep is used in the filename. time is currently unused by this function.

Experimental implementation

This is an experimental feature and may change in future releases.

See also: VisualizationCallback, show_plot

source
Trixi.set_log_typeMethod
Trixi.set_log_type(type; force = true)

Set the type of the (natural) log function to be used in Trixi.jl. The default is "sqrt_Trixi_NaN" which returns NaN for negative arguments instead of throwing an error. Alternatively, you can set type to "sqrt_Base" to use the Julia built-in sqrt function which provides a stack-trace of the error which might come in handy when debugging code.

source
Trixi.set_sqrt_typeMethod
Trixi.set_sqrt_type(type; force = true)

Set the type of the square root function to be used in Trixi.jl. The default is "sqrt_Trixi_NaN" which returns NaN for negative arguments instead of throwing an error. Alternatively, you can set type to "sqrt_Base" to use the Julia built-in sqrt function which provides a stack-trace of the error which might come in handy when debugging code.

source
Trixi.show_plotMethod
show_plot(plot_data, variable_names;
           show_mesh=true, plot_arguments=Dict{Symbol,Any}(),
-          time=nothing, timestep=nothing)

Visualize the plot data object provided in plot_data and display result, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.

This function is the default plot_creator argument for the VisualizationCallback. time and timestep are currently unused by this function.

Experimental implementation

This is an experimental feature and may change in future releases.

See also: VisualizationCallback, save_plot

source
Trixi.solveFunction
solve(ode, alg; dt, callbacks, kwargs...)

The following structures and methods provide the infrastructure for SSP Runge-Kutta methods of type SimpleAlgorithmSSP.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.source_terms_convergence_testMethod
source_terms_convergence_test(u, x, t, equations::ShallowWaterEquations2D)

Source terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).

This manufactured solution source term is specifically designed for the bottom topography function b(x,y) = 2 + 0.5 * sin(sqrt(2)*pi*x) + 0.5 * sin(sqrt(2)*pi*y) as defined in initial_condition_convergence_test.

source
Trixi.source_terms_convergence_testMethod
source_terms_convergence_test(u, x, t, equations::ShallowWaterEquationsQuasi1D)

Source terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).

This manufactured solution source term is specifically designed for the bottom topography function b(x) = 0.2 - 0.05 * sin(sqrt(2) * pi *x[1]) and channel width 'a(x)= 1 + 0.1 * cos(sqrt(2) * pi * x[1])' as defined in initial_condition_convergence_test.

source
Trixi.source_terms_eoc_test_coupled_euler_gravityMethod
source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations2D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with initial_condition_eoc_test_coupled_euler_gravity.

source
Trixi.source_terms_eoc_test_coupled_euler_gravityMethod
source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations3D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with initial_condition_eoc_test_coupled_euler_gravity.

source
Trixi.source_terms_eoc_test_eulerMethod
source_terms_eoc_test_euler(u, x, t, equations::CompressibleEulerEquations3D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with initial_condition_eoc_test_coupled_euler_gravity.

Note

This method is to be used for testing pure Euler simulations with analytic self-gravity. If you intend to do coupled Euler-gravity simulations, you need to use source_terms_eoc_test_coupled_euler_gravity instead.

source
Trixi.source_terms_harmonicMethod
source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations1D)

Source term that only includes the forcing from the hyperbolic diffusion system.

source
Trixi.source_terms_harmonicMethod
source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations2D)

Source term that only includes the forcing from the hyperbolic diffusion system.

source
Trixi.source_terms_harmonicMethod
source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations3D)

Source term that only includes the forcing from the hyperbolic diffusion system.

source
Trixi.splitting_coirier_vanleerMethod
splitting_coirier_vanleer(u, orientation::Integer,
+          time=nothing, timestep=nothing)

Visualize the plot data object provided in plot_data and display result, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.

This function is the default plot_creator argument for the VisualizationCallback. time and timestep are currently unused by this function.

Experimental implementation

This is an experimental feature and may change in future releases.

See also: VisualizationCallback, save_plot

source
Trixi.solveFunction
solve(ode, alg; dt, callbacks, kwargs...)

The following structures and methods provide the infrastructure for SSP Runge-Kutta methods of type SimpleAlgorithmSSP.

Experimental implementation

This is an experimental feature and may change in future releases.

source
Trixi.source_terms_convergence_testMethod
source_terms_convergence_test(u, x, t, equations::ShallowWaterEquations2D)

Source terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).

This manufactured solution source term is specifically designed for the bottom topography function b(x,y) = 2 + 0.5 * sin(sqrt(2)*pi*x) + 0.5 * sin(sqrt(2)*pi*y) as defined in initial_condition_convergence_test.

source
Trixi.source_terms_convergence_testMethod
source_terms_convergence_test(u, x, t, equations::ShallowWaterEquationsQuasi1D)

Source terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).

This manufactured solution source term is specifically designed for the bottom topography function b(x) = 0.2 - 0.05 * sin(sqrt(2) * pi *x[1]) and channel width 'a(x)= 1 + 0.1 * cos(sqrt(2) * pi * x[1])' as defined in initial_condition_convergence_test.

source
Trixi.source_terms_eoc_test_coupled_euler_gravityMethod
source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations2D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with initial_condition_eoc_test_coupled_euler_gravity.

source
Trixi.source_terms_eoc_test_coupled_euler_gravityMethod
source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations3D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with initial_condition_eoc_test_coupled_euler_gravity.

source
Trixi.source_terms_eoc_test_eulerMethod
source_terms_eoc_test_euler(u, x, t, equations::CompressibleEulerEquations3D)

Setup used for convergence tests of the Euler equations with self-gravity used in

  • Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593

in combination with initial_condition_eoc_test_coupled_euler_gravity.

Note

This method is to be used for testing pure Euler simulations with analytic self-gravity. If you intend to do coupled Euler-gravity simulations, you need to use source_terms_eoc_test_coupled_euler_gravity instead.

source
Trixi.source_terms_harmonicMethod
source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations1D)

Source term that only includes the forcing from the hyperbolic diffusion system.

source
Trixi.source_terms_harmonicMethod
source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations2D)

Source term that only includes the forcing from the hyperbolic diffusion system.

source
Trixi.source_terms_harmonicMethod
source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations3D)

Source term that only includes the forcing from the hyperbolic diffusion system.

source
Trixi.splitting_coirier_vanleerMethod
splitting_coirier_vanleer(u, orientation::Integer,
                           equations::CompressibleEulerEquations1D)
 splitting_coirier_vanleer(u, which::Union{Val{:minus}, Val{:plus}}
                           orientation::Integer,
-                          equations::CompressibleEulerEquations1D)

Splitting of the compressible Euler flux from Coirier and van Leer. The splitting has correction terms in the pressure splitting as well as the mass and energy flux components. The motivation for these corrections are to handle flows at the low Mach number limit.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • William Coirier and Bram van Leer (1991) Numerical flux formulas for the Euler and Navier-Stokes equations. II - Progress in flux-vector splitting DOI: 10.2514/6.1991-1566
source
Trixi.splitting_lax_friedrichsMethod
splitting_lax_friedrichs(u, orientation::Integer,
+                          equations::CompressibleEulerEquations1D)

Splitting of the compressible Euler flux from Coirier and van Leer. The splitting has correction terms in the pressure splitting as well as the mass and energy flux components. The motivation for these corrections are to handle flows at the low Mach number limit.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • William Coirier and Bram van Leer (1991) Numerical flux formulas for the Euler and Navier-Stokes equations. II - Progress in flux-vector splitting DOI: 10.2514/6.1991-1566
source
Trixi.splitting_lax_friedrichsMethod
splitting_lax_friedrichs(u, orientation::Integer,
                          equations::CompressibleEulerEquations2D)
 splitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::CompressibleEulerEquations2D)

Naive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) similar to a flux splitting one would apply, e.g., to Burgers' equation.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.splitting_lax_friedrichsMethod
splitting_lax_friedrichs(u, orientation::Integer,
+                         equations::CompressibleEulerEquations2D)

Naive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) similar to a flux splitting one would apply, e.g., to Burgers' equation.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.splitting_lax_friedrichsMethod
splitting_lax_friedrichs(u, orientation::Integer,
                          equations::InviscidBurgersEquation1D)
 splitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::InviscidBurgersEquation1D)

Naive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ = abs(u).

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.splitting_lax_friedrichsMethod
splitting_lax_friedrichs(u, orientation::Integer,
+                         equations::InviscidBurgersEquation1D)

Naive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ = abs(u).

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.splitting_lax_friedrichsMethod
splitting_lax_friedrichs(u, orientation::Integer,
                          equations::LinearScalarAdvectionEquation1D)
 splitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::LinearScalarAdvectionEquation1D)

Naive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ is the absolute value of the advection velocity.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.splitting_steger_warmingMethod
splitting_steger_warming(u, orientation::Integer,
+                         equations::LinearScalarAdvectionEquation1D)

Naive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ is the absolute value of the advection velocity.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

source
Trixi.splitting_steger_warmingMethod
splitting_steger_warming(u, orientation::Integer,
                          equations::CompressibleEulerEquations1D)
 splitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::CompressibleEulerEquations1D)

Splitting of the compressible Euler flux of Steger and Warming.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • Joseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum
source
Trixi.splitting_steger_warmingMethod
splitting_steger_warming(u, orientation::Integer,
+                         equations::CompressibleEulerEquations1D)

Splitting of the compressible Euler flux of Steger and Warming.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • Joseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum
source
Trixi.splitting_steger_warmingMethod
splitting_steger_warming(u, orientation::Integer,
                          equations::CompressibleEulerEquations2D)
 splitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::CompressibleEulerEquations2D)

Splitting of the compressible Euler flux of Steger and Warming.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • Joseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum
source
Trixi.splitting_steger_warmingMethod
splitting_steger_warming(u, orientation::Integer,
+                         equations::CompressibleEulerEquations2D)

Splitting of the compressible Euler flux of Steger and Warming.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • Joseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum
source
Trixi.splitting_steger_warmingMethod
splitting_steger_warming(u, orientation::Integer,
                          equations::CompressibleEulerEquations3D)
 splitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::CompressibleEulerEquations3D)

Splitting of the compressible Euler flux of Steger and Warming.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • Joseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum
source
Trixi.splitting_vanleer_haenelMethod
splitting_vanleer_haenel(u, orientation::Integer,
+                         equations::CompressibleEulerEquations3D)

Splitting of the compressible Euler flux of Steger and Warming.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

  • Joseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum
source
Trixi.splitting_vanleer_haenelMethod
splitting_vanleer_haenel(u, orientation::Integer,
                          equations::CompressibleEulerEquations1D)
 splitting_vanleer_haenel(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::CompressibleEulerEquations1D)

Splitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

source
Trixi.splitting_vanleer_haenelMethod
splitting_vanleer_haenel(u, orientation::Integer,
+                         equations::CompressibleEulerEquations1D)

Splitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

source
Trixi.splitting_vanleer_haenelMethod
splitting_vanleer_haenel(u, orientation::Integer,
                          equations::CompressibleEulerEquations2D)
 splitting_vanleer_haenel(u, which::Union{Val{:minus}, Val{:plus}}
                          orientation::Integer,
-                         equations::CompressibleEulerEquations2D)

Splitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

source
Trixi.stolarsky_meanMethod
stolarsky_mean(x, y, gamma)

Compute an instance of a weighted Stolarsky mean of the form

stolarsky_mean(x, y, gamma) = (gamma - 1)/gamma * (y^gamma - x^gamma) / (y^(gamma-1) - x^(gamma-1))

where gamma > 1.

Problem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Winters et al. (2020). Set f = (y - x) / (y + x) and g = gamma (for compact notation). Then, we use the expansions

((1+f)^g - (1-f)^g) / g = 2*f + (g-1)(g-2)/3 * f^3 + (g-1)(g-2)(g-3)(g-4)/60 * f^5 + O(f^7)

and

((1+f)^(g-1) - (1-f)^(g-1)) / (g-1) = 2*f + (g-2)(g-3)/3 * f^3 + (g-2)(g-3)(g-4)(g-5)/60 * f^5 + O(f^7)

Inserting the first few terms of these expansions and performing polynomial long division we find that

stolarsky_mean(x, y, gamma) ≈ (y + x) / 2 * (1 + (g-2)/3 * f^2 - (g+1)(g-2)(g-3)/45 * f^4 + (g+1)(g-2)(g-3)(2g(g-2)-9)/945 * f^6)

Since divisions are usually more expensive on modern hardware than multiplications (Agner Fog), we try to avoid computing two divisions. Thus, we use

f^2 = (y - x)^2 / (x + y)^2
+                         equations::CompressibleEulerEquations2D)

Splitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.

Returns a tuple of the fluxes "minus" (associated with waves going into the negative axis direction) and "plus" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().

Experimental implementation (upwind SBP)

This is an experimental feature and may change in future releases.

References

source
Trixi.stolarsky_meanMethod
stolarsky_mean(x, y, gamma)

Compute an instance of a weighted Stolarsky mean of the form

stolarsky_mean(x, y, gamma) = (gamma - 1)/gamma * (y^gamma - x^gamma) / (y^(gamma-1) - x^(gamma-1))

where gamma > 1.

Problem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Winters et al. (2020). Set f = (y - x) / (y + x) and g = gamma (for compact notation). Then, we use the expansions

((1+f)^g - (1-f)^g) / g = 2*f + (g-1)(g-2)/3 * f^3 + (g-1)(g-2)(g-3)(g-4)/60 * f^5 + O(f^7)

and

((1+f)^(g-1) - (1-f)^(g-1)) / (g-1) = 2*f + (g-2)(g-3)/3 * f^3 + (g-2)(g-3)(g-4)(g-5)/60 * f^5 + O(f^7)

Inserting the first few terms of these expansions and performing polynomial long division we find that

stolarsky_mean(x, y, gamma) ≈ (y + x) / 2 * (1 + (g-2)/3 * f^2 - (g+1)(g-2)(g-3)/45 * f^4 + (g+1)(g-2)(g-3)(2g(g-2)-9)/945 * f^6)

Since divisions are usually more expensive on modern hardware than multiplications (Agner Fog), we try to avoid computing two divisions. Thus, we use

f^2 = (y - x)^2 / (x + y)^2
     = (x * (x - 2 * y) + y * y) / (x * (x + 2 * y) + y * y)

Given ε = 1.0e-4, we use the following algorithm.

if f^2 < ε
   # use the expansion above
 else
   # use the direct formula (gamma - 1)/gamma * (y^gamma - x^gamma) / (y^(gamma-1) - x^(gamma-1))
-end

References

source
Trixi.totalgammaMethod
totalgamma(u, equations::CompressibleEulerMulticomponentEquations1D)

Function that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.

source
Trixi.totalgammaMethod
totalgamma(u, equations::CompressibleEulerMulticomponentEquations2D)

Function that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.

source
Trixi.trixi_includeMethod
trixi_include([mod::Module=Main,] elixir::AbstractString; kwargs...)

include the file elixir and evaluate its content in the global scope of module mod. You can override specific assignments in elixir by supplying keyword arguments. It's basic purpose is to make it easier to modify some parameters while running Trixi.jl from the REPL. Additionally, this is used in tests to reduce the computational burden for CI while still providing examples with sensible default values for users.

Before replacing assignments in elixir, the keyword argument maxiters is inserted into calls to solve and Trixi.solve with it's default value used in the SciML ecosystem for ODEs, see the "Miscellaneous" section of the documentation.

Examples

julia> redirect_stdout(devnull) do
-         trixi_include(@__MODULE__, joinpath(examples_dir(), "tree_1d_dgsem", "elixir_advection_extended.jl"),
-                       tspan=(0.0, 0.1))
-         sol.t[end]
-       end
-[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.
-0.1
source
Trixi.varnamesFunction
varnames(conversion_function, equations)

Return the list of variable names when applying conversion_function to the conserved variables associated to equations. This function is mainly used internally to determine output to screen and for IO, e.g., for the AnalysisCallback and the SaveSolutionCallback. Common choices of the conversion_function are cons2cons and cons2prim.

source
Trixi.velocityMethod
velocity(u, orientation, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y) from the particle distribution functions u.

source
Trixi.velocityMethod
velocity(u, orientation, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y, 3 -> z) from the particle distribution functions u.

source
Trixi.velocityMethod
velocity(u, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic velocity vector from the particle distribution functions u.

source
Trixi.velocityMethod
velocity(u, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic velocity vector from the particle distribution functions u.

source
Trixi.@autoinfiltrateMacro
@autoinfiltrate
-@autoinfiltrate condition::Bool

Invoke the @infiltrate macro of the package Infiltrator.jl to create a breakpoint for ad-hoc interactive debugging in the REPL. If the optional argument condition is given, the breakpoint is only enabled if condition evaluates to true.

As opposed to using Infiltrator.@infiltrate directly, this macro does not require Infiltrator.jl to be added as a dependency to Trixi.jl. As a bonus, the macro will also attempt to load the Infiltrator module if it has not yet been loaded manually.

Note: For this macro to work, the Infiltrator.jl package needs to be installed in your current Julia environment stack.

See also: Infiltrator.jl

Internal use only

Please note that this macro is intended for internal use only. It is not part of the public API of Trixi.jl, and it thus can altered (or be removed) at any time without it being considered a breaking change.

source
Trixi.@threadedMacro
@threaded for ... end

Semantically the same as Threads.@threads when iterating over a AbstractUnitRange but without guarantee that the underlying implementation uses Threads.@threads or works for more general for loops. In particular, there may be an additional check whether only one thread is used to reduce the overhead of serial execution or the underlying threading capabilities might be provided by other packages such as Polyester.jl.

Warn

This macro does not necessarily work for general for loops. For example, it does not necessarily support general iterables such as eachline(filename).

Some discussion can be found at https://discourse.julialang.org/t/overhead-of-threads-threads/53964 and https://discourse.julialang.org/t/threads-threads-with-one-thread-how-to-remove-the-overhead/58435.

source
+end

References

source
Trixi.totalgammaMethod
totalgamma(u, equations::CompressibleEulerMulticomponentEquations1D)

Function that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.

source
Trixi.totalgammaMethod
totalgamma(u, equations::CompressibleEulerMulticomponentEquations2D)

Function that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.

source
Trixi.varnamesFunction
varnames(conversion_function, equations)

Return the list of variable names when applying conversion_function to the conserved variables associated to equations. This function is mainly used internally to determine output to screen and for IO, e.g., for the AnalysisCallback and the SaveSolutionCallback. Common choices of the conversion_function are cons2cons and cons2prim.

source
Trixi.velocityMethod
velocity(u, orientation, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y) from the particle distribution functions u.

source
Trixi.velocityMethod
velocity(u, orientation, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y, 3 -> z) from the particle distribution functions u.

source
Trixi.velocityMethod
velocity(u, equations::LatticeBoltzmannEquations2D)

Calculate the macroscopic velocity vector from the particle distribution functions u.

source
Trixi.velocityMethod
velocity(u, equations::LatticeBoltzmannEquations3D)

Calculate the macroscopic velocity vector from the particle distribution functions u.

source
Trixi.@autoinfiltrateMacro
@autoinfiltrate
+@autoinfiltrate condition::Bool

Invoke the @infiltrate macro of the package Infiltrator.jl to create a breakpoint for ad-hoc interactive debugging in the REPL. If the optional argument condition is given, the breakpoint is only enabled if condition evaluates to true.

As opposed to using Infiltrator.@infiltrate directly, this macro does not require Infiltrator.jl to be added as a dependency to Trixi.jl. As a bonus, the macro will also attempt to load the Infiltrator module if it has not yet been loaded manually.

Note: For this macro to work, the Infiltrator.jl package needs to be installed in your current Julia environment stack.

See also: Infiltrator.jl

Internal use only

Please note that this macro is intended for internal use only. It is not part of the public API of Trixi.jl, and it thus can altered (or be removed) at any time without it being considered a breaking change.

source
Trixi.@threadedMacro
@threaded for ... end

Semantically the same as Threads.@threads when iterating over a AbstractUnitRange but without guarantee that the underlying implementation uses Threads.@threads or works for more general for loops. In particular, there may be an additional check whether only one thread is used to reduce the overhead of serial execution or the underlying threading capabilities might be provided by other packages such as Polyester.jl.

Warn

This macro does not necessarily work for general for loops. For example, it does not necessarily support general iterables such as eachline(filename).

Some discussion can be found at https://discourse.julialang.org/t/overhead-of-threads-threads/53964 and https://discourse.julialang.org/t/threads-threads-with-one-thread-how-to-remove-the-overhead/58435.

source
diff --git a/previews/PR1624/reference-trixi2vtk/index.html b/previews/PR1624/reference-trixi2vtk/index.html index c3f2226aa30..d26ac0dbb66 100644 --- a/previews/PR1624/reference-trixi2vtk/index.html +++ b/previews/PR1624/reference-trixi2vtk/index.html @@ -1,6 +1,6 @@ -Trixi2Vtk.jl · Trixi.jl

Trixi2Vtk.jl API

Trixi2Vtk.trixi2vtkMethod
trixi2vtk(filename::AbstractString...;
+Trixi2Vtk.jl · Trixi.jl

Trixi2Vtk.jl API

Trixi2Vtk.trixi2vtkMethod
trixi2vtk(filename::AbstractString...;
           format=:vtu, verbose=false, hide_progress=false, pvd=nothing,
           output_directory=".", nvisnodes=nothing, save_celldata=true,
           reinterpolate=true, data_is_uniform=false)

Convert Trixi-generated output files to VTK files (VTU or VTI).

Arguments

  • filename: One or more Trixi solution/restart/mesh files to convert to a VTK file. Filenames support file globbing, e.g., "solution*" to match all files starting with solution.
  • format: Output format for solution/restart files. Can be 'vtu' or 'vti'.
  • verbose: Set to true to enable verbose output.
  • hide_progress: Hide progress bar (will be hidden automatically if verbose is true).
  • pvd: Use this filename to store PVD file (instead of auto-detecting name). Note that only the name will be used (directory and file extension are ignored).
  • output_directory: Output directory where generated files are stored.
  • nvisnodes: Number of visualization nodes per element. (default: number of DG nodes for StructuredMesh or UnstructuredMesh2D, twice the number of DG nodes for TreeMesh). A value of 0 (zero) uses the number of nodes in the DG elements.
  • save_celldata: Boolean value to determine if cell-based data should be saved. (default: true)
  • reinterpolate: Boolean value to determine if data should be reinterpolated onto uniform points. When false the raw data at the compute nodes is copied into the appropriate format. (default: true)
  • data_is_uniform: Boolean to indicate if the data to be converted is from a finite difference method on a uniform grid of points. (default: false)

Examples

julia> trixi2vtk("out/solution_000*.h5")
-[...]
source
+[...]
source
diff --git a/previews/PR1624/reference-trixibase/index.html b/previews/PR1624/reference-trixibase/index.html new file mode 100644 index 00000000000..e1f841b1ed0 --- /dev/null +++ b/previews/PR1624/reference-trixibase/index.html @@ -0,0 +1,10 @@ + +TrixiBase.jl · Trixi.jl

TrixiBase.jl API

TrixiBase.trixi_includeMethod
trixi_include([mod::Module=Main,] elixir::AbstractString; kwargs...)

include the file elixir and evaluate its content in the global scope of module mod. You can override specific assignments in elixir by supplying keyword arguments. Its basic purpose is to make it easier to modify some parameters while running simulations from the REPL. Additionally, this is used in tests to reduce the computational burden for CI while still providing examples with sensible default values for users.

Before replacing assignments in elixir, the keyword argument maxiters is inserted into calls to solve with it's default value used in the SciML ecosystem for ODEs, see the "Miscellaneous" section of the documentation.

Examples

julia> using TrixiBase, Trixi
+
+julia> redirect_stdout(devnull) do
+         trixi_include(@__MODULE__, joinpath(examples_dir(), "tree_1d_dgsem", "elixir_advection_extended.jl"),
+                       tspan=(0.0, 0.1))
+         sol.t[end]
+       end
+[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.
+0.1
source
diff --git a/previews/PR1624/restart/index.html b/previews/PR1624/restart/index.html index 36760431dbf..e415bc183c4 100644 --- a/previews/PR1624/restart/index.html +++ b/previews/PR1624/restart/index.html @@ -1,6 +1,6 @@ -Restart simulation · Trixi.jl

Restart simulation

You can continue running an already finished simulation by first preparing the simulation for the restart and then performing the restart. Here we suppose that in the first run your simulation stops at time 1.0 and then you want it to run further to time 2.0.

Prepare the simulation for a restart

In you original elixir you need to specify to write out restart files. Those will later be read for the restart of your simulation. This is done almost the same way as writing the snapshots using the SaveSolutionCallback callback. For the restart files it is called SaveRestartCallback:

save_restart = SaveRestartCallback(interval=100,
+Restart simulation · Trixi.jl

Restart simulation

You can continue running an already finished simulation by first preparing the simulation for the restart and then performing the restart. Here we suppose that in the first run your simulation stops at time 1.0 and then you want it to run further to time 2.0.

Prepare the simulation for a restart

In you original elixir you need to specify to write out restart files. Those will later be read for the restart of your simulation. This is done almost the same way as writing the snapshots using the SaveSolutionCallback callback. For the restart files it is called SaveRestartCallback:

save_restart = SaveRestartCallback(interval=100,
                                    save_final_restart=true)

Make this part of your CallbackSet.

An example is examples/examples/structured_2d_dgsem/elixir_advection_extended.jl.

Perform the simulation restart

Since all of the information about the simulation can be obtained from the last snapshot, the restart can be done with relatively few lines in an extra elixir file. However, some might prefer to keep everything in one elixir and conditionals like if restart with a boolean variable restart that is user defined.

First we need to define from which file we want to restart, e.g.

restart_file = "restart_000021.h5"
 restart_filename = joinpath("out", restart_file)

Then we load the mesh file:

mesh = load_mesh(restart_filename)

This is then needed for the semidiscretization:

semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)

We then define a new time span for the simulation that takes as starting time the one form the snapshot:

tspan = (load_time(restart_filename), 2.0)

We now also take the last dt, so that our solver does not need to first find one to fulfill the CFL condition:

dt = load_dt(restart_filename)

The ODE that we will pass to the solver is now:

ode = semidiscretize(semi, tspan, restart_filename)

You should now define a SaveSolutionCallback similar to the original simulation, but with save_initial_solution=false, otherwise our initial snapshot will be overwritten. If you are using one file for the original simulation and the restart you can reuse your SaveSolutionCallback, but need to set

save_solution.condition.save_initial_solution = false

Before we compute the solution using OrdinaryDiffEq.jl we need to set the integrator and its time step number, e.g.:

integrator = init(ode, CarpenterKennedy2N54(williamson_condition=false),
                   dt=dt, save_everystep=false, callback=callbacks);
-load_timestep!(integrator, restart_filename)

Now we can compute the solution:

sol = solve!(integrator)

An example is in examples/structured_2d_dgsem/elixir_advection_restart.jl.

+load_timestep!(integrator, restart_filename)

Now we can compute the solution:

sol = solve!(integrator)

An example is in examples/structured_2d_dgsem/elixir_advection_restart.jl.

diff --git a/previews/PR1624/search_index.js b/previews/PR1624/search_index.js index dacfab49cb2..51ac875b472 100644 --- a/previews/PR1624/search_index.js +++ b/previews/PR1624/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"EditURL = \"../../literate/src/files/adaptive_mesh_refinement.jl\"","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#adaptive_mesh_refinement","page":"12 Adaptive mesh refinement","title":"12: Adaptive mesh refinement","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Adaptive mesh refinement (AMR) is a method of adapting the resolution of the numerical method to the solution features such as turbulent regions or shocks. In those critical regions of the domain, we want the simulation to use elements with smaller mesh sizes compared to other regions. This should be automatically and dynamically adapted during the run of the simulation.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Implementation-in-Trixi.jl","page":"12 Adaptive mesh refinement","title":"Implementation in Trixi.jl","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"In Trixi.jl, AMR is possible for the mesh types TreeMesh and P4estMesh. Both meshes are organized in a tree structure and therefore, each element can be refined independently. In Trixi.jl, AMR is restricted to a 2:1 refinement ratio between neighbor elements. This means that the maximum resolution difference of neighboring elements is a factor of two.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"The implementation of AMR is divided into different steps. The basic refinement setting contains an indicator and a controller. These are added to the simulation by using an AMR callback.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Indicators","page":"12 Adaptive mesh refinement","title":"Indicators","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"An indicator estimates the current accuracy of the numerical approximation. It indicates which regions of the domain need finer or coarser resolutions. In Trixi.jl, you can use for instance IndicatorLöhner and IndicatorHennemannGassner.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"IndicatorLöhner (also callable with IndicatorLoehner) is an interpretation and adaptation of a FEM indicator by Löhner (1987) and estimates a weighted second derivative of a specified variable locally.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_indicator = IndicatorLöhner(semi, variable=variable)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"All indicators have the parameter variable which is used to specify the variable for the indicator calculation. You can use for instance density, pressure or density_pressure for the compressible Euler equations. Moreover, you have the option to use simply the first conservation variable with first for any equations. This might be a good choice for a starting example.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"IndicatorHennemannGassner, also used as a shock-capturing indicator, was developed by Hennemann et al. (2021) and is explained in detail in the tutorial about shock-capturing. It can be constructed as follows.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_indicator = IndicatorHennemannGassner(semi,\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable=variable)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Another indicator is the very basic IndicatorMax. It indicates the maximal value of a variable and is therefore mostly used for verification and testing. But it might be useful for the basic understanding of the implementation of indicators and AMR in Trixi.jl.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_indicator = IndicatorMax(semi, variable=variable)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Controllers","page":"12 Adaptive mesh refinement","title":"Controllers","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"The spatial discretization into elements is tree-based for both AMR supporting mesh types TreeMesh and P4estMesh. Thus, the higher the level in the tree the higher the level of refinement. For instance, a mesh element of level 3 has double resolution in each direction compared to another element with level 2.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"To map specific indicator values to a desired level of refinement, Trixi.jl uses controllers. They are build in three levels: There is a base level of refinement base_level, which is the minimum allowed refinement level. Then, there is a medium level med_level, which corresponds to the initial level of refinement, for indicator values above the threshold med_threshold and equally, a maximal level max_level for values above max_threshold. This variant of controller is called ControllerThreeLevel in Trixi.jl.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_controller = ControllerThreeLevel(semi, amr_indicator;\n base_level=4,\n med_level=5, med_threshold=0.1,\n max_level=6, max_threshold=0.6)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"You can also set med_level=0 to use the current level as target, see the docstring of ControllerThreeLevel.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"An extension is ControllerThreeLevelCombined, which uses two different indicators. The primary indicator works the same as the single indicator for ControllerThreeLevel. The second indicator with its own maximum threshold adds the property, that the target level is set to max_level additionally if this indicator's value is greater than max_threshold_secondary. This is for instance used to assure that a shock has always the maximum refinement level.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_controller = ControllerThreeLevelCombined(semi, indicator_primary, indicator_secondary;\n base_level=2,\n med_level=6, med_threshold=0.0003,\n max_level=8, max_threshold=0.003,\n max_threshold_secondary=0.3)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"This controller is for instance used in elixir_euler_astro_jet_amr.jl.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Callback","page":"12 Adaptive mesh refinement","title":"Callback","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"The AMR indicator and controller are added to the simulation through the callback AMRCallback. It contains a semidiscretization semi, the controller amr_controller and the parameters interval, adapt_initial_condition, and adapt_initial_condition_only_refine.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Adaptive mesh refinement will be performed every interval time steps. adapt_initial_condition indicates whether the initial condition already should be adapted before the first time step. And with adapt_initial_condition_only_refine=true the mesh is only refined at the beginning but not coarsened.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_callback = AMRCallback(semi, amr_controller,\n interval=5,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Exemplary-simulation","page":"12 Adaptive mesh refinement","title":"Exemplary simulation","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Here, we want to implement a simple AMR simulation of the 2D linear advection equation for a Gaussian pulse.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"using OrdinaryDiffEq\nusing Trixi\n\nadvection_velocity = (0.2, -0.7)\nequations = LinearScalarAdvectionEquation2D(advection_velocity)\n\ninitial_condition = initial_condition_gauss\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n\ncoordinates_min = (-5.0, -5.0)\ncoordinates_max = ( 5.0, 5.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n n_cells_max=30_000)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n\n\ntspan = (0.0, 10.0)\node = semidiscretize(semi, tspan);\nnothing #hide","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"For the best understanding about indicators and controllers, we use the simple AMR indicator IndicatorMax. As described before, it returns the maximal value of the specified variable (here the only conserved variable). Therefore, regions with a high maximum are refined. This is not really useful numerical application, but a nice demonstration example.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_indicator = IndicatorMax(semi, variable=first)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"These values are transferred to a refinement level with the ControllerThreeLevel, such that every element with maximal value greater than 0.1 is refined once and elements with maximum above 0.6 are refined twice.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"amr_controller = ControllerThreeLevel(semi, amr_indicator,\n base_level=4,\n med_level=5, med_threshold=0.1,\n max_level=6, max_threshold=0.6)\n\namr_callback = AMRCallback(semi, amr_controller,\n interval=5,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true)\n\nstepsize_callback = StepsizeCallback(cfl=0.9)\n\ncallbacks = CallbackSet(amr_callback, stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Running the simulation.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"We plot the solution and add the refined mesh at the end of the simulation.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#More-examples","page":"12 Adaptive mesh refinement","title":"More examples","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Trixi.jl provides many elixirs using AMR. We want to give some examples for different mesh types:","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"elixir_euler_blast_wave_amr.jl for TreeMesh and P4estMesh\nelixir_euler_kelvin_helmholtz_instability_amr.jl for TreeMesh\nelixir_euler_double_mach_amr.jl for P4estMesh","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Animations of more interesting and complicated AMR simulations can be found below and on Trixi.jl's youtube channel \"Trixi Framework\".","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"First, we give a purely hyperbolic simulation of a Sedov blast wave with self-gravity. This simulation uses the mesh type TreeMesh as we did and the AMR indicator IndicatorHennemannGassner.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":" \n
","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Source: Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"The next example is a numerical simulation of an ideal MHD rotor on an unstructured AMR mesh. The used mesh type is a P4estMesh.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":" \n
","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"Source: Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"For more information, please have a look at the respective links.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Package-versions","page":"12 Adaptive mesh refinement","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"12 Adaptive mesh refinement","title":"12 Adaptive mesh refinement","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"EditURL = \"../../literate/src/files/structured_mesh_mapping.jl\"","category":"page"},{"location":"tutorials/structured_mesh_mapping/#structured_mesh_mapping","page":"13 Structured mesh with curvilinear mapping","title":"13: Structured mesh with curvilinear mapping","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Here, we want to introduce another mesh type of Trixi.jl. More precisely, this tutorial is about the curved mesh type StructuredMesh supporting curved meshes.","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Creating-a-curved-mesh","page":"13 Structured mesh with curvilinear mapping","title":"Creating a curved mesh","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"There are two basic options to define a curved StructuredMesh in Trixi.jl. You can implement curves for the domain boundaries, or alternatively, set up directly the complete transformation mapping. We now present one short example each.","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Mesh-defined-by-domain-boundary-curves","page":"13 Structured mesh with curvilinear mapping","title":"Mesh defined by domain boundary curves","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Both examples are based on a semdiscretization of the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"using OrdinaryDiffEq\nusing Trixi\n\nequations = CompressibleEulerEquations2D(1.4)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"We start with a pressure perturbation at (xs, 0.0) as initial condition.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"function initial_condition_pressure_perturbation(x, t, equations::CompressibleEulerEquations2D)\n xs = 1.5 # location of the initial disturbance on the x axis\n w = 1/8 # half width\n p = exp(-log(2) * ((x[1]-xs)^2 + x[2]^2)/w^2) + 1.0\n v1 = 0.0\n v2 = 0.0\n rho = 1.0\n\n return prim2cons(SVector(rho, v1, v2, p), equations)\nend\ninitial_condition = initial_condition_pressure_perturbation","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Initialize every boundary as a boundary_condition_slip_wall.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"boundary_conditions = boundary_condition_slip_wall","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"The approximation setup is an entropy-stable split-form DG method with polydeg=4. We are using the two fluxes flux_ranocha and flux_lax_friedrichs.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"solver = DGSEM(polydeg=4, surface_flux=flux_lax_friedrichs,\n volume_integral=VolumeIntegralFluxDifferencing(flux_ranocha))","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"We want to define a circular cylinder as physical domain. It contains an inner semicircle with radius r0 and an outer semicircle of radius r1.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"(Image: )","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"The domain boundary curves with curve parameter in -11 are sorted as shown in the sketch. They always are orientated from negative to positive coordinate, such that the corners have to fit like this f_1(+1) = f_4(-1), f_3(+1) = f_2(-1), etc.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"In our case we can define the domain boundary curves as follows:","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"r0 = 0.5 # inner radius\nr1 = 5.0 # outer radius\nf1(xi) = SVector( r0 + 0.5 * (r1 - r0) * (xi + 1), 0.0) # right line\nf2(xi) = SVector(-r0 - 0.5 * (r1 - r0) * (xi + 1), 0.0) # left line\nf3(eta) = SVector(r0 * cos(0.5 * pi * (eta + 1)), r0 * sin(0.5 * pi * (eta + 1))) # inner circle\nf4(eta) = SVector(r1 * cos(0.5 * pi * (eta + 1)), r1 * sin(0.5 * pi * (eta + 1))) # outer circle","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"We create a curved mesh with 16 x 16 elements. The defined domain boundary curves are passed as a tuple.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"cells_per_dimension = (16, 16)\nmesh = StructuredMesh(cells_per_dimension, (f1, f2, f3, f4), periodicity=false)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Then, we define the simulation with endtime T=3 with semi, ode and callbacks.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_conditions)\n\ntspan = (0.0, 3.0)\node = semidiscretize(semi, tspan)\n\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi, interval=analysis_interval)\n\nalive_callback = AliveCallback(analysis_interval=analysis_interval)\n\nstepsize_callback = StepsizeCallback(cfl=0.9)\n\ncallbacks = CallbackSet(analysis_callback,\n alive_callback,\n stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Running the simulation","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\n\nusing Plots\nplot(sol)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"pd = PlotData2D(sol)\nplot(pd[\"p\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Mesh-directly-defined-by-the-transformation-mapping","page":"13 Structured mesh with curvilinear mapping","title":"Mesh directly defined by the transformation mapping","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"As mentioned before, you can also define the domain for a StructuredMesh by directly setting up a transformation mapping. Here, we want to present a nice mapping, which is often used to test free-stream preservation. Exact free-stream preservation is a crucial property of any numerical method on curvilinear grids. The mapping is a reduced 2D version of the mapping described in Rueda-Ramírez et al. (2021), p.18.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"using OrdinaryDiffEq\nusing Trixi\n\nequations = CompressibleEulerEquations2D(1.4)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"As mentioned, this mapping is used for testing free-stream preservation. So, we use a constant initial condition.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"initial_condition = initial_condition_constant\n\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"We define the transformation mapping with variables in -1 1 as described in Rueda-Ramírez et al. (2021), p.18 (reduced to 2D):","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"function mapping(xi_, eta_)\n # Transform input variables between -1 and 1 onto [0,3]\n xi = 1.5 * xi_ + 1.5\n eta = 1.5 * eta_ + 1.5\n\n y = eta + 3/8 * (cos(1.5 * pi * (2 * xi - 3)/3) *\n cos(0.5 * pi * (2 * eta - 3)/3))\n\n x = xi + 3/8 * (cos(0.5 * pi * (2 * xi - 3)/3) *\n cos(2 * pi * (2 * y - 3)/3))\n\n return SVector(x, y)\nend","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Instead of a tuple of boundary functions, the mesh now has the mapping as its parameter.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"cells_per_dimension = (16, 16)\nmesh = StructuredMesh(cells_per_dimension, mapping)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan)\n\nanalysis_callback = AnalysisCallback(semi, interval=250)\n\nstepsize_callback = StepsizeCallback(cfl=0.8)\n\ncallbacks = CallbackSet(analysis_callback,\n stepsize_callback)\n\nsol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Now, we want to verify the free-stream preservation property and plot the mesh. For the verification, we calculate the absolute difference of the first conservation variable density u[1] and 1.0. To plot this error and the mesh, we are using the visualization feature ScalarPlotData2D, explained in visualization.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"error_density = let u = Trixi.wrap_array(sol.u[end], semi)\n abs.(u[1, :, :, :] .- 1.0) # density, x, y, elements\nend\npd = ScalarPlotData2D(error_density, semi)\n\nusing Plots\nplot(pd, title=\"Error in density\")\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"We observe that the errors in the variable density are at the level of machine accuracy. Moreover, the plot shows the mesh structure resulting from our transformation mapping.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"Of course, you can also use other mappings as for instance shifts by (x y)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"mapping(xi, eta) = SVector(xi + x, eta + y)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"or rotations with a rotation matrix T","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"mapping(xi, eta) = T * SVector(xi, eta).","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"For more curved mesh mappings, please have a look at some elixirs for StructuredMesh. For another curved mesh type, there is a tutorial about Trixi.jl's unstructured mesh type [UnstructuredMesh2D] and its use of the High-Order Hex-Quad Mesh (HOHQMesh) generator, created and developed by David Kopriva.","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Package-versions","page":"13 Structured mesh with curvilinear mapping","title":"Package versions","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"13 Structured mesh with curvilinear mapping","title":"13 Structured mesh with curvilinear mapping","text":"This page was generated using Literate.jl.","category":"page"},{"location":"github-git/#GitHub-and-Git","page":"GitHub & Git","title":"GitHub & Git","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"This page contains information on how to use GitHub and Git when developing Trixi.jl.","category":"page"},{"location":"github-git/#Development-workflow","page":"GitHub & Git","title":"Development workflow","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"For adding modifications to Trixi.jl, we generally follow these steps:","category":"page"},{"location":"github-git/#Create-an-issue-(optional)","page":"GitHub & Git","title":"Create an issue (optional)","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"In many cases it makes sense to start by creating an issue on GitHub. For example, if the implementation approach for a new feature is not yet clear or if there should be a discussion about the desired outcome, it is good practice to first get a consensus on what is the expected result of this modification. A GitHub issue is the place to lead this discussion, as it preserves it in the project and - together with the actual code changes - allows in the future to revisit the reasons for a particular choice of implementation or feature.","category":"page"},{"location":"github-git/#Create-a-branch-and-*immediately*-create-a-pull-request","page":"GitHub & Git","title":"Create a branch and immediately create a pull request","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"All feature development, bug fixes etc. should be developed in a branch and not directly on main. If you do not have write access to the main repository on GitHub, first create a fork of the Trixi.jl repository and clone the fork to your machine. Then, create a branch locally by executing git checkout -b yourbranch, push it to the repository, and create a pull request (PR).","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If you have already cloned Trixi.jl from the main repo to your local machine, you can also work in that clone. You just need to add your fork as additional remote repository and push your new branch there.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"git remote add myfork git@github.com:YOUR_NAME/Trixi.jl.git\n# get latest main from the main repo\ngit checkout main\ngit pull\n# create a new branch for a cool new feature, bug fix, ...\ngit checkout -b YOUR_BRANCH_NAME\n# do some work and push it to your fork\ngit push -u myfork\n# go to https://github.com/trixi-framework/Trixi.jl/pull\n# and create a PR from your new branch","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"info: Why using pull requests?\nImmediately creating a PR for your branch has the benefit that all code discussions can now be held directly next to the corresponding code. Also, the PR allows to easily compare your branch to the upstream branch (usually main) to see what you have changed. Moreover, tests will run automatically.","category":"page"},{"location":"github-git/#Make-changes","page":"GitHub & Git","title":"Make changes","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"With a branch and PR in place, you can now write your code and commit it to your branch. If you request feedback from someone else, make sure to push your branch to the repository such that the others can easily review your changes or dive in and change something themselves.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"warning: Avoid committing unwanted files\nWhen you use git add . or similar catch-all versions, make sure you do not accidentally commit unwanted files (e.g., Trixi.jl output files, images or videos etc.). If it happens anyways, you can undo the last commit (also multiple times) by running git reset HEAD~ (see also Undo last commit). However, this strategy only works if you have not yet pushed your changes. If you did push your changes, please talk to one of the core developers on how to proceed.","category":"page"},{"location":"github-git/#Keep-your-branch-in-sync-with-main","page":"GitHub & Git","title":"Keep your branch in sync with main","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"For larger features with longer-living branches, it may make sense to synchronize your branch with the current main, e.g., if there was a bug fix in main that is relevant for you. In this case, perform the following steps to merge the current main to your branch:","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Commit all your local changes to your branch and push it. This allows you to delete your clone in case you make a mistake and need to abort the merge.\nExecute git fetch to get the latest changes from the repository.\nMake sure you are in the correct branch by checking the output of git status or by running git checkout yourbranch.\nMerge main using git merge main. If there were no conflicts, hooray!, you are done. Otherwise you need to resolve your merge conflicts and commit the changes afterwards. A good guide for resolving merge conflicts can be found here.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"In general, always use git merge and not git rebase to get the latest changes from main. It is less error-prone and does not create problems on branches that are worked on collaboratively.","category":"page"},{"location":"github-git/#Prepare-for-review","page":"GitHub & Git","title":"Prepare for review","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If you feel like your branch is ready to be merged to main, prepare it for review. That is, you should","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"merge the current main to your branch\nrun tests if available, but at least ensure that you did not accidentally change the results for one of the existing example elixirs\nproperly comment your code\ndelete old/unused code, especially commented lines (unless they contain helpful code, in which case you should add a comment on why you keep this around)\nremove debug statements\nadd a elixir_xxx.jl that uses your feature (only relevant for new features)\nmake sure your code formatting adheres to the Style guide\ndescribe changes in NEWS.md if appropriate","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"After you are confident that your branch is cleaned up properly, commit all changes and push them to the repository.","category":"page"},{"location":"github-git/#Get-reviewed","page":"GitHub & Git","title":"Get reviewed","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Ask one of the core developers to review your code. Sometimes this will be done directly, either face-to-face or via a video call. Other times a review will be conducted asynchronously, with the reviewer leaving comments and annotations. In some cases it will be necessary to do multiple rounds of reviews, especially if there are larger changes to be added. Just commit and push your changes to your branch, and the corresponding pull request will be updated automatically.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Please note that a review has nothing to do with the lack of experience of the person developing changes: We try to review all code before it gets added to main, even from the most experienced developers. This is good practice and helps to keep the error rate low while ensuring that the code is developed in a consistent fashion. Furthermore, do not take criticism of your code personally - we just try to keep Trixi.jl as accessible and easy to use for everyone.","category":"page"},{"location":"github-git/#Merge-branch","page":"GitHub & Git","title":"Merge branch","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Once your branch is reviewed and declared ready for merging by the reviewer, make sure that all the latest changes have been pushed. Then, one of the developers will merge your PR. If you are one of the developers, you can also go to the pull request page on GitHub and and click on Merge pull request. Voilà, you are done! Your branch will have been merged to main and the source branch will have been deleted in the GitHub repository (if you are not working in your own fork).","category":"page"},{"location":"github-git/#Update-your-working-copy","page":"GitHub & Git","title":"Update your working copy","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Once you have merged your branch by accepting the PR on GitHub, you should clean up your local working copy of the repository by performing the following steps:","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Update your clone by running git fetch.\nCheck out main using git checkout main.\nDelete merged branch locally with git branch -d yourbranch.\nRemove local references to deleted remote branch by executing git remote prune origin.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"You can now proceed with your next changes by starting again at the top.","category":"page"},{"location":"github-git/#Using-Git","page":"GitHub & Git","title":"Using Git","text":"","category":"section"},{"location":"github-git/#Resources-for-learning-Git","page":"GitHub & Git","title":"Resources for learning Git","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Here are a few resources for learning do use Git that at least one of us found helpful in the past (roughly ordered from novice to advanced to expert):","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Git Handbook by GitHub\nLearn Git Branching","category":"page"},{"location":"github-git/#Tips-and-tricks","page":"GitHub & Git","title":"Tips and tricks","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"This is an unordered collection of different tips and tricks that can be helpful while working with Git. As usual, your mileage might vary.","category":"page"},{"location":"github-git/#Undo-last-commit","page":"GitHub & Git","title":"Undo last commit","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If you made a mistake in your last commit, e.g., by committing an unwanted file, you can undo the latest commit by running","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"git reset HEAD~","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"This only works if you have not yet pushed your branch to the GitHub repository. In this case, please talk to one of the core developers on how to proceed. Especially when you accidentally committed a large file (image, or video), please let us know as fast as possible, since the effort to fix the repository grows considerably over time.","category":"page"},{"location":"github-git/#Remove-large-file-from-repository","page":"GitHub & Git","title":"Remove large file from repository","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If a large file was accidentally committed and pushed to the Trixi.jl repository, please talk to one of the core developers as soon as possible so that they can fix it.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"danger: Large files\nYou should never try to fix this yourself, as it potentially disrupts/destroys the work of others!","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Based on the instructions found here and here, the following steps need to be taken (as documented for GitLab in issue #33):","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Tell everyone to commit and push their changes to the repository.\nFix the branch in which the file was committed by removing it and committing the removal. This is especially important on main.\nPerform the following steps to clean up the Git repository:\ncd /tmp\n\n# Download bfg-1.13.0.jar from https://rtyley.github.io/bfg-repo-cleaner/\n\n# Get fresh clone of repo (so you can throw it away in case there is a problem)\ngit clone --mirror git@github.com:trixi-framework/Trixi.jl.git\n\n# Clean up repo of all files larger than 10M\njava -jar bfg-1.13.0.jar --strip-blobs-bigger-than 10M Trixi.jl.git\n\n# Enter repo\ncd Trixi.jl.git\n\n# Clean up reflog and force aggressive garbage collection\ngit reflog expire --expire=now --all && git gc --prune=now --aggressive\n\n# Push changes\ngit push\n\n# Delete clone\nrm -rf Trixi.jl.git\nTell everyone to clean up their local working copies by performing the following steps (also do this yourself):\n# Enter repo\ncd Trixi.jl\n\n# Get current changes\ngit fetch\n\n# Check out the fixed branch\ngit checkout branchname\n\n# IMPORTANT: Do a rebase instead of a pull!\ngit rebase\n\n# Clean reflog and force garbage collection\ngit reflog expire --expire=now --all && git gc --prune=now --aggressive\nIMPORTANT: You need to do a git rebase instead of a git pull when updating the fixed branch.","category":"page"},{"location":"testing/#Testing","page":"Testing","title":"Testing","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"During the development of Trixi.jl, we rely on continuous testing to ensure that modifications or new features do not break existing functionality or add other errors. In the main Trixi.jl repository (and the repositories for the visualization tool Trixi2Vtk), this is facilitated by GitHub Actions, which allows to run tests automatically upon certain events. When, how, and what is tested by GitHub Actions is controlled by the workflow file .github/workflows/ci.yml. In Trixi.jl and its related repositories, tests are triggered by","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"each git push to main and\neach git push to any pull request.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"Besides checking functionality, we also analyse the Test coverage to ensure that we do not miss important parts during testing.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"note: Test and coverage requirements\nBefore merging a pull request (PR) to main, we require thatthe code passes all functional tests\ncode coverage does not decrease.","category":"page"},{"location":"testing/#Testing-setup","page":"Testing","title":"Testing setup","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"The entry point for all testing is the file test/runtests.jl, which is run by the automated tests and which can be triggered manually by executing","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"julia> using Pkg; Pkg.test(\"Trixi\")","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"in the REPL. Since there already exist many tests, we have split them up into multiple files in the test directory to allow for faster testing of individual parts of the code. Thus in addition to performing all tests, you can also just include one of the files named test_xxx.jl to run only a specific subset, e.g.,","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"julia> # Run all 2D tests on the P4estMesh\n include(joinpath(\"test\", \"test_p4est_2d.jl\"))\n\njulia> # Run all 1D tests for the Euler equations on the TreeMesh\n include(joinpath(\"test\", \"test_tree_1d_euler.jl\"))","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"For the automated tests with GitHub Actions, we run multiple jobs in parallel to reduce the waiting time until all tests are finished. You can see the different components that are run as jobs by looking at the TRIXI_TEST variable in test/runtests.jl.","category":"page"},{"location":"testing/#Adding-new-tests","page":"Testing","title":"Adding new tests","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"We use Julia's built-in unit testing capabilities to configure tests. In general, newly added code must be covered by at least one test, and all new elixirs added to the examples/ directory must be used at least once during testing. New tests should be added to the corresponding test/test_xxx.jl file, e.g., a test involving the 3D linear advection equation on the TreeMesh would go into test/test_tree_3d_advection.jl. Please study one of the existing tests and stay consistent to the current style when creating new tests.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"Since we want to test as much as possible, we have a lot of tests and frequently create new ones. Naturally, this increases the time to wait for all tests to pass with each novel feature added to Trixi.jl. Therefore, new tests should be as short as reasonably possible, i.e., without being too insensitive to pick up changes or errors in the code.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"When you add new tests, please check whether all CI jobs still take approximately the same time. If the job where you added new tests takes much longer than everything else, please consider moving some tests from one job to another (or report this incident and ask the main developers for help).","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"note: Test duration\nAs a general rule, tests should last no more than 10 seconds when run with a single thread and after compilation (i.e., excluding the first run).","category":"page"},{"location":"testing/#Test-coverage","page":"Testing","title":"Test coverage","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"In addition to ensuring that the code produces the expected results, the automated tests also record the code coverage. The resulting coverage reports, i.e., which lines of code were executed by at least one test and are thus considered \"covered\" by testing, are automatically uploaded to Coveralls for easy analysis. Typically, you see a number of Coveralls results at the bottom of each pull request: One for each parallel job (see Testing setup), which can usually be ignored since they only cover parts of the code by definition, and a cumulative coverage result named coverage/coveralls. The \"Details\" link takes you to a detailed report on which lines of code are covered by tests, which ones are missed, and especially which new lines the pull requests adds to Trixi.jl's code base that are not yet covered by testing.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"note: Coverage requirements\nIn general, we require pull requests to not decrease the overall test coverage percentage in main, with a hard lower bound of 97%.","category":"page"},{"location":"authors/#Authors","page":"Authors","title":"Authors","text":"","category":"section"},{"location":"authors/","page":"Authors","title":"Authors","text":"Trixi.jl's development is coordinated by a group of principal developers, who are also its main contributors and who can be contacted in case of questions about Trixi.jl. In addition, there are contributors who have provided substantial additions or modifications. Together, these two groups form \"The Trixi.jl Authors\" as mentioned under License.","category":"page"},{"location":"authors/#Principal-Developers","page":"Authors","title":"Principal Developers","text":"","category":"section"},{"location":"authors/","page":"Authors","title":"Authors","text":"Michael Schlottke-Lakemper, RWTH Aachen University/High-Performance Computing Center Stuttgart (HLRS), Germany\nGregor Gassner, University of Cologne, Germany\nHendrik Ranocha, Johannes Gutenberg University Mainz, Germany\nAndrew Winters, Linköping University, Sweden\nJesse Chan, Rice University, US","category":"page"},{"location":"authors/#Contributors","page":"Authors","title":"Contributors","text":"","category":"section"},{"location":"authors/","page":"Authors","title":"Authors","text":"The following people contributed major additions or modifications to Trixi.jl and are listed in alphabetical order:","category":"page"},{"location":"authors/","page":"Authors","title":"Authors","text":"Maximilian D. Bertrand\nBenjamin Bolm\nSimon Candelaresi\nJesse Chan\nLars Christmann\nChristof Czernik\nDaniel Doehring\nPatrick Ersing\nErik Faulhaber\nGregor Gassner\nLucas Gemein\nSven Goldberg\nJoshua Lampert\nJulia Odenthal\nSigrun Ortleb\nHendrik Ranocha\nAndrés M. Rueda-Ramírez\nFelipe Santillan\nMichael Schlottke-Lakemper\nToskan Theine\nAndrew Winters","category":"page"},{"location":"license/#License","page":"License","title":"License","text":"","category":"section"},{"location":"license/","page":"License","title":"License","text":"MIT LicenseCopyright (c) 2020-present The Trixi.jl Authors (see Authors)Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","category":"page"},{"location":"restart/#restart","page":"Restart simulation","title":"Restart simulation","text":"","category":"section"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"You can continue running an already finished simulation by first preparing the simulation for the restart and then performing the restart. Here we suppose that in the first run your simulation stops at time 1.0 and then you want it to run further to time 2.0.","category":"page"},{"location":"restart/#restart_preparation","page":"Restart simulation","title":"Prepare the simulation for a restart","text":"","category":"section"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"In you original elixir you need to specify to write out restart files. Those will later be read for the restart of your simulation. This is done almost the same way as writing the snapshots using the SaveSolutionCallback callback. For the restart files it is called SaveRestartCallback:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"save_restart = SaveRestartCallback(interval=100,\n save_final_restart=true)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Make this part of your CallbackSet.","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"An example is examples/examples/structured_2d_dgsem/elixir_advection_extended.jl.","category":"page"},{"location":"restart/#restart_perform","page":"Restart simulation","title":"Perform the simulation restart","text":"","category":"section"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Since all of the information about the simulation can be obtained from the last snapshot, the restart can be done with relatively few lines in an extra elixir file. However, some might prefer to keep everything in one elixir and conditionals like if restart with a boolean variable restart that is user defined.","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"First we need to define from which file we want to restart, e.g.","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"restart_file = \"restart_000021.h5\"\nrestart_filename = joinpath(\"out\", restart_file)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Then we load the mesh file:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"mesh = load_mesh(restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"This is then needed for the semidiscretization:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"We then define a new time span for the simulation that takes as starting time the one form the snapshot:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"tspan = (load_time(restart_filename), 2.0)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"We now also take the last dt, so that our solver does not need to first find one to fulfill the CFL condition:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"dt = load_dt(restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"The ODE that we will pass to the solver is now:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"ode = semidiscretize(semi, tspan, restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"You should now define a SaveSolutionCallback similar to the original simulation, but with save_initial_solution=false, otherwise our initial snapshot will be overwritten. If you are using one file for the original simulation and the restart you can reuse your SaveSolutionCallback, but need to set","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"save_solution.condition.save_initial_solution = false","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Before we compute the solution using OrdinaryDiffEq.jl we need to set the integrator and its time step number, e.g.:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"integrator = init(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=dt, save_everystep=false, callback=callbacks);\nload_timestep!(integrator, restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Now we can compute the solution:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"sol = solve!(integrator)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"An example is in examples/structured_2d_dgsem/elixir_advection_restart.jl.","category":"page"},{"location":"meshes/structured_mesh/#Structured-mesh","page":"Structured mesh","title":"Structured mesh","text":"","category":"section"},{"location":"meshes/structured_mesh/","page":"Structured mesh","title":"Structured mesh","text":"The StructuredMesh is a structured, curvilinear, conforming mesh type available for one-, two-, and three-dimensional simulations.","category":"page"},{"location":"meshes/structured_mesh/","page":"Structured mesh","title":"Structured mesh","text":"Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.","category":"page"},{"location":"development/#Development","page":"Development","title":"Development","text":"","category":"section"},{"location":"development/#interactive-use-of-julia","page":"Development","title":"Interactive use of Julia","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"When a Julia program is executed, Julia first loads and parses all code. Then, the just-in-time compiler has to compile all functions at their first use, which incurs an overhead each time a program is run. For proper packages and commands executed in the REPL (= \"return-eval-print loop\", which is what the Julia community calls the interactive command-line prompt that opens when executing julia without any files as arguments), however, the previously compiled functions are cached. Therefore, Trixi.jl should generally always be used interactively from the REPL without closing Julia during development, as it allows much faster turnaround times.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"If you naively run Trixi.jl from the REPL, you will not be able to change your Trixi.jl source files and then run the changed code without restarting the REPL, which destroys any potential benefits from caching. However, restarting Julia can be avoided by using the Revise.jl package, which tracks changed files and re-loads them automatically. Therefore, it is highly recommended to first install Revise with the following command in Julia: To enter the package REPL mode, press ] in the standard Julia REPL mode. Then, execute","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> add Revise","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Now you are able to run Trixi.jl from the REPL, change Trixi.jl code between runs, and enjoy the advantages of the compilation cache! Before you start using Revise regularly, please be aware of some of the Pitfalls when using Revise.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Another recommended package for working from the REPL is OhMyREPL.jl. It can be installed by running","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> add OhMyREPL","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"and adds syntax highlighting, bracket highlighting, and other helpful improvements for using Julia interactively. To automatically use OhMyREPL when starting the REPL, follow the instructions given in the official documentation.","category":"page"},{"location":"development/#Running-Trixi.jl-interactively-in-the-global-environment","page":"Development","title":"Running Trixi.jl interactively in the global environment","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"If you've installed Trixi.jl and Revise in your default environment, begin by executing:","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"This will start the Julia REPL. Then, run","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> using Revise; using Trixi","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"You can run a simulation by executing","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> trixi_include(default_example())","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Together, all of these commands can take some time, roughly half a minute on a modern workstation. Most of the time is spent on compilation of Julia code etc. If you execute the last command again in the same REPL, it will finish within a few milliseconds (maybe ~45 on a modern workstation). This demonstrates the second reason for using the REPL: the compilation cache. That is, those parts of the code that do not change between two Trixi.jl runs do not need to be recompiled and thus execute much faster after the first run.","category":"page"},{"location":"development/#Manually-starting-Trixi.jl-in-the-local-environment","page":"Development","title":"Manually starting Trixi.jl in the local environment","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"If you followed the installation instructions for developers, execute Julia with the project directory set to the run directory of the program/tool you want to use. For example, to run Trixi.jl this way, you need to start the REPL with","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia --project=path/to/Trixi.jl/run","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"and execute","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> using Revise; using Trixi","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"to load Revise and Trixi.jl. You can then proceed with the usual commands and run Trixi.jl as in the example above. The --project flag is required such that Julia can properly load Trixi.jl and all dependencies if Trixi.jl is not installed in the global environment. The same procedure also applies should you opt to install the postprocessing tool Trixi2Vtk manually such that you can modify their implementations.","category":"page"},{"location":"development/#Pitfalls-when-using-Revise","page":"Development","title":"Pitfalls when using Revise","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"While Revise is a great help for developing Julia code, there are a few situations to watch out for when using Revise. The following list of potential issues is based on personal experiences of the Trixi.jl developers and probably incomplete. Further information on limitations and possible issues with Revise can be found in the official documentation.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"tip: If in doubt, restart the REPL\nOftentimes, it is possible to recover from issues with Revise by fixing the offending code. Sometimes, however, this is not possible or you might have troubles finding out what exactly caused the problems. Therefore, in these cases, or if in doubt, restart the REPL to get a fresh start.","category":"page"},{"location":"development/#Syntax-errors-are-easy-to-miss","page":"Development","title":"Syntax errors are easy to miss","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Revise does not stop on syntax errors, e.g., when you accidentally write a[i) instead of a[i]. In this case, Revise reports an error but continues to use the old version of your files! This is especially dangerous for syntax errors, as they are detected while Revise reloads changed code, which happens in the beginning of a new execution. Thus, the syntax error message quickly disappears from the terminal once Trixi.jl starts writing output to the screen and you might not even have noticed that an error occurred at all.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Therefore, when you are deep in a coding/debugging session and wonder why your code modifications do not seem to have any effect, scroll up in your terminal to check if you missed earlier syntax errors, or - if in doubt - restart your REPL.","category":"page"},{"location":"development/#Files-are-not-tracked-after-changing-branches","page":"Development","title":"Files are not tracked after changing branches","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Sometimes, Revise stops tracking files when changing the Git branch. That is, modifications to Trixi.jl's source files will not be reloaded by Revise and thus have no effect of a currently running REPL session. This issue is particularly annoying for a developer, since it does not come with any warning! Therefore, it is good practice to always restart the REPL after changing branches.","category":"page"},{"location":"development/#Changes-to-type-definitions-are-not-allowed","page":"Development","title":"Changes to type definitions are not allowed","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Revise cannot handle changes to type definitions, e.g., when modifying the fields in a struct. In this case, Revise reports an error and refuses to run your code unless you undo the modifications. Once you undo the changes, Revise will usually continue to work as expected again. However, if you want to keep your type modifications, you need to restart the REPL.","category":"page"},{"location":"development/#Using-the-Julia-REPL-effectively","page":"Development","title":"Using the Julia REPL effectively","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"The Julia manual is an excellent resource to learn Julia. Here, we list some helpful commands than can increase your productivity in the Julia REPL.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Use the REPL help mode entered by typing ?.\njulia> using Trixi\n\nhelp?> trixi_include\nsearch: trixi_include\n\n trixi_include([mod::Module=Main,] elixir::AbstractString; kwargs...)\n\n include the file elixir and evaluate its content in the global scope of module mod. You can override specific\n assignments in elixir by supplying keyword arguments. It's basic purpose is to make it easier to modify some\n parameters while running Trixi.jl from the REPL. Additionally, this is used in tests to reduce the computational\n burden for CI while still providing examples with sensible default values for users.\n\n Examples\n ≡≡≡≡≡≡≡≡≡≡\n\n julia> trixi_include(@__MODULE__, default_example(), tspan=(0.0, 0.1))\n [...]\n\n julia> sol.t[end]\n 0.1\nYou can copy and paste REPL history including julia> prompts into the REPL.\nUse tab completion in the REPL, both for names of functions/types/variables and for function arguments.\njulia> flux_ranocha( # and TAB\nflux_ranocha(u_ll, u_rr, orientation::Integer, equations::CompressibleEulerEquations1D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_1d.jl:390\nflux_ranocha(u_ll, u_rr, orientation::Integer, equations::CompressibleEulerEquations2D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_2d.jl:839\n[...]\nUse methodswith to discover methods associated to a given type etc.\njulia> methodswith(CompressibleEulerEquations2D)\n[1] initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations2D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_2d.jl:51\n[...]\nUse @which (or @edit) for method calls.\njulia> @which trixi_include(default_example())\ntrixi_include(elixir::AbstractString; kwargs...) in Trixi at ~/.julia/dev/Trixi/src/auxiliary/special_elixirs.jl:36\nUse apropos to search through the documentation and docstrings.\njulia> apropos(\"MHD\")\nTrixi.IdealGlmMhdEquations3D\nTrixi.IdealGlmMhdMulticomponentEquations2D\nTrixi.calc_fast_wavespeed_roe\nTrixi.IdealGlmMhdEquations1D\nTrixi.initial_condition_constant\nTrixi.flux_nonconservative_powell\nTrixi.GlmSpeedCallback\nTrixi.flux_derigs_etal\nTrixi.flux_hindenlang_gassner\nTrixi.initial_condition_convergence_test\nTrixi.min_max_speed_naive\nTrixi.IdealGlmMhdEquations2D\nTrixi.IdealGlmMhdMulticomponentEquations1D\n[...]","category":"page"},{"location":"development/#Text-editors","page":"Development","title":"Text editors","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"When writing code, the choice of text editor can have a significant impact on productivity and developer satisfaction. While using the default text editor of the operating system has its own benefits (specifically the lack of an explicit installation procure), usually it makes sense to switch to a more programming-friendly tool. In the following, a few of the many options are listed and discussed:","category":"page"},{"location":"development/#VS-Code","page":"Development","title":"VS Code","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Visual Studio Code is a modern open source editor with good support for Julia. While Juno had some better support in the past, the developers of Juno and the Julia VS Code plugin are joining forces and concentrating on VS Code since support of Atom has been suspended. Basically, all comments on Juno below also apply to VS Code.","category":"page"},{"location":"development/#Juno","page":"Development","title":"Juno","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"If you are new to programming or do not have a preference for a text editor yet, Juno is a good choice for developing Julia code. It is based on Atom, a sophisticated and widely used editor for software developers, and is enhanced with several Julia-specific features. Furthermore and especially helpful for novice programmers, it has a MATLAB-like appearance with easy and interactive access to the current variables, the help system, and a debugger.","category":"page"},{"location":"development/#Vim-or-Emacs","page":"Development","title":"Vim or Emacs","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Vim and Emacs are both very popular editors that work great with Julia. One of their advantages is that they are text editors without a GUI and as such are available for almost any operating system. They also are preinstalled on virtually all Unix-like systems. However, Vim and Emacs come with their own, steep learning curve if they have never been used before. Therefore, if in doubt, it is probably easier to get started with a classic GUI-based text editor (like Juno). If you decide to use Vim or Emacs, make sure that you install the corresponding Vim plugin julia-vim or Emacs major mode julia-emacs.","category":"page"},{"location":"development/#Debugging","page":"Development","title":"Debugging","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Julia offers several options for debugging. A classical debugger is available with the Debugger.jl package or in the Julia extension for VS Code. However, it can be quite slow and, at the time of writing (January 2023), currently does not work properly with Trixi.jl. The Infiltrator.jl package on the other hand does not offer all features of a full debugger, but is a fast and simple tool that allows users to set breakpoints to open a local REPL session and access the call stack and variables.","category":"page"},{"location":"development/#Infiltrator","page":"Development","title":"Infiltrator","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"The Infiltrator package provides fast, interactive breakpoints using the @infiltrate command, which drops the user into a local REPL session. From there, it is possible to access local variables, see the call stack, and execute statements.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"The package can be installed in the Julia REPL by executing","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> add Infiltrator","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"To load the package in the Julia REPL execute","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> using Infiltrator","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Breakpoints can be set by adding a line with the @infiltrate macro at the respective position in the code. Use Revise if you want to set and delete breakpoints in your package without having to restart Julia.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"note: Use `@autoinfiltrate` when debugging Trixi.jl\nWhen running Julia inside a package environment, e.g., inside the source code of Trixi.jl itself, the @infiltrate macro only works if Infiltrator has been added to the package dependencies. To avoid this, you can use the (non-exported) @autoinfiltrate macro in Trixi.jl, which only requires Infiltrator.jl to be available in the current environment stack and will auto-load it for you.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Triggering the breakpoint starts a REPL session where it is possible to interact with the current local scope. Possible commands are:","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"@locals: Print the local variables.\n@exfiltrate: Save the local variables to a global storage, which can be accessed with the safehouse variable outside the Infiltrator session.\n@trace: Print the current stack trace.\nExecute other arbitrary statements\n?: Print a help list with all options","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"To finish a debugging session, either use @continue to continue and eventually stop at the next breakpoint or @exit to skip further breakpoints. After the code has finished, local variables saved with @exfiltrate can be accessed in the REPL using the safehouse variable.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Limitations of using Infiltrator.jl are that local variables cannot be changed, and that it is not possible to step into further calls or access other function scopes.","category":"page"},{"location":"development/#Releasing-a-new-version-of-Trixi.jl,-Trixi2Vtk","page":"Development","title":"Releasing a new version of Trixi.jl, Trixi2Vtk","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Check whether everything is okay, tests pass etc.\nSet the new version number in Project.toml according to the Julian version of semver. Commit and push.\nComment @JuliaRegistrator register on the commit setting the version number.\nJuliaRegistrator will create a PR with the new version in the General registry. Wait for it to be merged.\nIncrement the version number in Project.toml again with suffix -pre. For example, if you have released version v0.2.0, use v0.2.1-pre as new version number.\nWhen a new version of Trixi.jl was released, check whether the [compat] entries in test/Project.toml in Trixi2Vtk should be updated. When a new version of Trixi2Vtk was released, check whether the [compat] entries in docs/Project.toml in Trixi.jl should be updated.\nThese entries will also be checked regularly by CompatHelper (once a day). Hence, if everything was released correctly, you should only need to do these checks manually if new minor versions with changes in the docs of Trixi2Vtk were released but no new version of Trixi.jl was released afterwards.","category":"page"},{"location":"development/#Preview-of-the-documentation","page":"Development","title":"Preview of the documentation","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"You can build the documentation of Trixi.jl locally by running","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia --project=docs -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs --color=yes docs/make.jl","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"from the Trixi.jl main directory. Then, you can look at the html files generated in docs/build. For PRs triggered from branches inside the Trixi.jl main repository previews of the new documentation are generated at https://trixi-framework.github.io/Trixi.jl/previews/PRXXX, where XXX is the number of the PR. This does not work for PRs from forks for security reasons (since anyone could otherwise push arbitrary stuff to the Trixi.jl website, including malicious code).","category":"page"},{"location":"development/#trixi2vtk-dev","page":"Development","title":"Developing Trixi2Vtk","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Trixi2Vtk has Trixi.jl as dependency and uses Trixi.jl's implementation to, e.g., load mesh files. When developing Trixi2Vtk, one may want to change functions in Trixi.jl to allow them to be reused in Trixi2Vtk. To use a locally modified Trixi.jl clone instead of a Trixi.jl release, one can tell Pkg to use the local source code of Trixi.jl instead of a registered version by running","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> develop path/to/Trixi.jl","category":"page"},{"location":"visualization/#visualization","page":"Visualization","title":"Visualization","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"There are two possible approaches to visualize results from Trixi.jl: either directly from the REPL using Plots.jl or with ParaView/VisIt by postprocessing Trixi.jl's output files with Trixi2Vtk.","category":"page"},{"location":"visualization/#Plots.jl","page":"Visualization","title":"Plots.jl [experimental]","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By far the easiest and most convenient plotting approach is to use the powerful Plots.jl package to directly visualize Trixi.jl's results from the REPL. In the following, you will find more information on a number of topics for how to use Plots.jl together with Trixi.jl:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Getting started\nCustomizing plot results via a PlotData2D object\nPlotting a 3D solution as a 2D plot\nCreating a 1D plot\nPlotting a 2D or 3D solutions as a 1D plot\nVisualizing results during a simulation","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nPlotting via Plots.jl is still considered an experimental feature and might change in any future releases.","category":"page"},{"location":"visualization/#getting-started-plots-jl","page":"Visualization","title":"Getting started","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"After running a simulation with Trixi.jl in the REPL, load the Plots package with","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Plots","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To visualize the solution, execute","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Here we assume that sol holds the return value of the solve(...) method (with type SciMLBase.ODESolution), which is the default variable name when you use one of the example elixirs. This will generate a grid layout with one subplot for each solution variable, convenient for getting an overview of the current solution:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"You can save the resulting file as a PNG image file by calling savefig(...) with an output file name that ends in .png, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> savefig(\"solution-overview.png\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In Trixi.jl, two plot types are available: 2D heatmap plots and 1D line plots. If you use plot(sol), Trixi.jl will automatically choose the plot type that fits the dimensions of the sol input: 2D/3D data will be visualized as a heatmap, 1D data as a line plot. For more fine-grained control over what to plot, you can create such an object yourself, which can either be a PlotData2D or a PlotData1D object. For further details on both of these see below:","category":"page"},{"location":"visualization/#Customizing-plot-results-via-a-PlotData2D-object","page":"Visualization","title":"Customizing plot results via a PlotData2D object","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"For more fine-grained control over what to plot, first create a PlotData2D object by executing","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(sol)\njulia> pd = PlotData2D(u, semi)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"where u is an array containing the solution and semi is the semidiscretization. For example, if PlotData2D(sol.u[2], semi) is specified, this will create a PlotData2D instance from the 2nd saved time-step. If PlotData2D(sol(0.5), semi) is specified, it will construct a PlotData2D instance using OrdinaryDiffEq.jl's interpolation to evaluate the solution at time t=0.5.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This takes the results generated by Trixi.jl and stores them in a data format that can be understood by the Plots package, and pd holds all data relevant for plotting sol. You can pass variable names as strings to pd using a dictionary-like syntax, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(pd[\"rho\"])","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This will create a single 2D heatmap plot of the variable rho:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The default plot type and style can be overridden by passing any additional arguments that are understood by the Plots package. For example, to change the color scheme and add names to the axes, modify the previous command to","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(pd[\"rho\"], seriescolor = :heat, xguide=\"x\", yguide=\"y\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"to yield","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho-modified)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"For more details on the various format options for plot, please consult the Plots documentation.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In addition, you can plot the mesh lines on top of the solution variables by calling the getmesh(...) function on the PlotData2D object","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot!(getmesh(pd)) # here we use `plot!` with an `!` to add to the previous plot","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"which modifies the previous plot to","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho-modified-mesh)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By default, PlotData2D will convert the conserved variables to primitive variables, but this can be changed by passing an appropriate conversion function in the solution_variables keyword argument, similar to the behavior of the SaveSolutionCallback:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(sol; solution_variables=cons2cons) # Plot conservative variables","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"There are several other keyword arguments that influence how the solution data is processed for visualization with the Plots package. A detailed explanation can be found in the docstring of the PlotData2D constructor.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Another way to change the appearance of a plot is to convert the solution to a uniformly refined mesh before plotting. This can be helpful, e.g., when trying different settings for a simulation with adaptive mesh refinement, where one would like to ignore the mesh changes when comparing solutions. This is achieved with adapt_to_mesh_level, which uses the mesh adaptation routines to adapt the solution to a uniform grid. For example, the AMR solution from above could be preprocessed with","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(adapt_to_mesh_level(sol, 4)...)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"When plotted together with the mesh, this will yield the following visualization:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho-uniform-mesh)","category":"page"},{"location":"visualization/#Plotting-a-user-defined-scalar-field","page":"Visualization","title":"Plotting a user-defined scalar field","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To plot a scalar quantity, one can call plot(ScalarPlotData2D(u, semi)), where u is an array of nodal values of the scalar field to plot. The layout of u should match the layout of the x and y nodal coordinates of the respective solver. For example, after running trixi_include(joinpath(\"examples\", \"unstructured_2d_dgsem\", \"elixir_euler_wall_bc.jl\")), the following can be used to plot the function f(x, y) = x * y:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"x = view(semi.cache.elements.node_coordinates, 1, :, :, :)\ny = view(semi.cache.elements.node_coordinates, 2, :, :, :)\nplot(ScalarPlotData2D(x .* y, semi))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This produces the following plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: scalar-plotting-example)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This routine can be used to visualize scalar quantities which depend on the solution, such as the norm of a velocity vector or two-dimensional vorticity. For example, we can visualize vorticity for a compressible version of the Brown-Minion vortex problem:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Trixi, Plots\n\njulia> redirect_stdout(devnull) do\n # runs the elixir without any output from callbacks etc.\n trixi_include(@__MODULE__,\n joinpath(examples_dir(), \"dgmulti_2d\", \"elixir_euler_brown_minion_vortex.jl\"))\n end\n[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.\n\njulia> function compute_vorticity(velocity, mesh, equations::CompressibleEulerEquations2D,\n dg::DGMulti, cache)\n rd = dg.basis\n md = mesh.md\n @unpack Dr, Ds = rd\n @unpack rxJ, sxJ, ryJ, syJ, J = md\n v1, v2 = velocity\n dv1dy = ryJ .* (Dr * v1) + syJ .* (Ds * v1)\n dv2dx = rxJ .* (Dr * v2) + sxJ .* (Ds * v2)\n return dv2dx - dv1dy\n end;\n\njulia> compute_vorticity(velocity, semi) =\n compute_vorticity(velocity, Trixi.mesh_equations_solver_cache(semi)...);\n\njulia> function get_velocity(sol)\n rho, rhou, rhov, E = StructArrays.components(sol.u[end])\n v1 = rhou ./ rho\n v2 = rhov ./ rho\n return v1, v2\n end;\n\njulia> vorticity = compute_vorticity(get_velocity(sol), semi);\n\njulia> plot(ScalarPlotData2D(vorticity, semi;\n variable_name = \"Vorticity at t = $(sol.prob.tspan[end])\"))\nPlot{Plots.GRBackend() n=1}","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This produces the following plot of vorticity.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: vorticity-example)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Since the mesh is fairly coarse, we observe numerical artifacts due to the low resolution. These errors vanish under mesh refinement; for example, doubling the mesh resolution by running","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi_include(joinpath(examples_dir(), \"dgmulti_2d\", \"elixir_euler_BM_vortex.jl\"), cells_per_dimension = 32)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"yields the following plot of vorticity:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: vorticity-example-refined)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nWhen visualizing a scalar field, the plotted solution is reinterpolated using a high order polynomial approximation. Thus, small discrepancies may be observed when the underlying data is highly non-smooth or under-resolved.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"ScalarPlotData2D objects can also be used with Makie through iplot. For example, the following code plots two surfaces:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Trixi, CairoMakie\n\njulia> redirect_stdout(devnull) do\n # runs the elixir without any output from callbacks etc.\n trixi_include(@__MODULE__,\n joinpath(examples_dir(), \"unstructured_2d_dgsem\", \"elixir_euler_wall_bc.jl\"))\n end\n[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.\n\njulia> x = view(semi.cache.elements.node_coordinates, 1, :, :, :); # extracts the node x coordinates\n\njulia> y = view(semi.cache.elements.node_coordinates, 2, :, :, :); # extracts the node y coordinates\n\njulia> fig_ax_plt = iplot(ScalarPlotData2D((@. 1 - .25*(x^2 + y^2)), semi), plot_mesh=true, colormap=:viridis);\n\njulia> fig_ax_plt2 = iplot!(fig_ax_plt, ScalarPlotData2D((@. .125*(x+y)), semi), plot_mesh=true, colormap=:blues)\nFigureAxisPlot()","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This creates the following plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: ScalarPlotData2D_example)","category":"page"},{"location":"visualization/#Plotting-a-3D-solution-as-a-2D-plot","page":"Visualization","title":"Plotting a 3D solution as a 2D plot","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"It is possible to plot 2D slices from 3D simulation data using the TreeMesh with the same commands as above:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol) # `sol` is from a 3D simulation","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By default, plotting sol or creating a PlotData2D object from a 3D simulation will create a 2D slice of the solution in the xy-plane. You can customize this behavior by explicitly creating a PlotData2D object and passing appropriate keyword arguments:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"slice specifies the plane which is being sliced and can be :xy, :xz, or :yz (default: :xy)\npoint specifies a three-dimensional point. The sliced plane is then created such that it lies on the point (default: (0.0, 0.0, 0.0)).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"All other attributes for PlotData2D objects apply here as well.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"For example, to plot the velocity field orthogonal to the yz-plane at different x-axis locations, you can execute","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi_include(joinpath(examples_dir(), \"tree_3d_dgsem\", \"elixir_euler_taylor_green_vortex.jl\"), tspan=(0.0, 1.0))\n[...]\n\njulia> plots = []\nAny[]\n\njulia> for x in range(0, stop=pi/2, length=6)\n pd = PlotData2D(sol, slice=:yz, point=(x, 0.0, 0.0))\n push!(plots, plot(pd[\"v1\"], clims=(-1,1), title=\"x = \"*string(round(x, digits=2))))\n end\n\njulia> plot(plots..., layout=(2, 3), size=(750,350))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"which results in a 2x3 grid of slices of the yz-plane:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-v1-0.0-to-0.5pi)","category":"page"},{"location":"visualization/#Creating-a-1D-plot","page":"Visualization","title":"Creating a 1D plot","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"When plotting a 1D solution with","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol) # `sol` is from a 1D simulation","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Trixi.jl automatically creates a PlotData1D object and visualizes it as a line plot: (Image: 1d-plot)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To customize your 1D plot, you can create a PlotData1D object manually as follows:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData1D(sol)\njulia> pd = PlotData1D(u, semi)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The behavior is analogous to the PlotData2D behavior.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In a very similar fashion to PlotData2D, you can customize your plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"plot(pd) creates the same plot as in plot(sol).\nplot(pd[\"rho\", \"p\"]) only plots specific variables. In this case rho and p.\nplot!(getmesh(pd)) adds mesh lines after creating a plot.\nAny attributes from Plots can be used, e.g., plot(pd, yguide=:temperature).\npd = PlotData1D(adapt_to_mesh_level(sol, 4)...) adapts the mesh before plotting (in this example to a mesh with refinement level 4).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"You can also customize the PlotData1D object itself by passing attributes to the PlotData1D constructor:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"solution_variables specifies the variables to be plotted.\nnvisnodes sets the amount of nodes per element which the solution then is interpolated on.","category":"page"},{"location":"visualization/#Plotting-a-2D-or-3D-solutions-as-a-1D-plot","page":"Visualization","title":"Plotting a 2D or 3D solutions as a 1D plot","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"It is possible to extract a straight, axis-parallel line from a 2D or 3D solution and visualize it as a 1D plot. This is done by creating a PlotData1D object with a 2D/3D solution sol as input:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData1D(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The plot is then created with:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(pd)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By default the x-axis is extracted, which can be changed with following attributes:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"slice specifies the axis which is being extracted and can be :x, :y or :z (:z is only for 3D input and default is :x)\npoint specifies a two or three dimensional point. The sliced axis is then created in such a way, that it lies on the point. (default: (0.0, 0.0) or (0.0, 0.0, 0.0))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"All other attributes for PlotData1D objects apply here as well.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In the following, is an example for a 2D simulation of the linear scalar advection equation. First, we have the regular 2D heatmap plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: 2d-plot-for-slice)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"From this, we can extract a line plot parallel to the y-axis going through the point (1.0, 0.0) with the following commands:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData1D(sol, slice=:y, point=(1.0, 0.0))\njulia> plot(pd)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: 1d-plot-for-slice)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This convenient method of slicing is limited to axis-parallel slices, but for 2D/3D solutions it is also possible to create a plot along any curve you want. To do so, you first need to create a list of 2D/3D points that define your curve. Then you can create a PlotData1D with the keyword argument curve set to your list.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Let's give an example of this with the basic advection equation from above by creating a plot along the circle marked in green:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: 2d-plot-along-circle)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"We can write a function like this, that outputs a list of points on a circle:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"function circle(radius, center, n_points)\n coordinates = zeros(2, n_points)\n for i in 1:n_points\n coordinates[:,i] = radius*[cospi(2*i/n_points), sinpi(2*i/n_points)] .+ center\n end\n return coordinates\nend","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Then create and plot a PlotData1D object along a circle with radius one, center at (1,1), and 100 points:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"pd = PlotData1D(sol, curve=circle(1.0, (1.0, 1.0), 100))\nplot(pd)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This gives you the following plot: (Image: 1d-plot-along-circle)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Creating a plot like this has its downsides. For one, it is unclear what to put on the abscissa of the plot. By default, the arc length of the given curve is used. Also, with this way of plotting you lose the ability to use a mesh plot from getmesh.","category":"page"},{"location":"visualization/#Visualizing-results-during-a-simulation","page":"Visualization","title":"Visualizing results during a simulation","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To visualize solutions while a simulation is still running (also known as in-situ visualization), you can use the VisualizationCallback. It is created as a regular callback and accepts upon creation a number of keyword arguments that allow, e.g., to control the visualization interval, to specify the variables to plot, or to customize the plotting style.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"During the simulation, the visualization callback creates and displays visualizations of the current solution in regular intervals. This can be useful to, e.g., monitor the validity of a long-running simulation or for illustrative purposes. An example for how to create a VisualizationCallback can be found in examples/tree_2d_dgsem/elixir_advection_amr_visualization.jl:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"[...]\n\n# Enable in-situ visualization with a new plot generated every 20 time steps\n# and additional plotting options passed as keyword arguments\nvisualization = VisualizationCallback(interval=20; clims=(0,1))\n\n[...]","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The resulting output of the referenced elixir can be seen in the embedded video below:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":" \n
","category":"page"},{"location":"visualization/#Trixi2Vtk","page":"Visualization","title":"Trixi2Vtk","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Trixi2Vtk converts Trixi.jl's .h5 output files to VTK files, which can be read by ParaView, VisIt, and other visualization tools. It automatically interpolates solution data from the original quadrature node locations to equidistant visualization nodes at a higher resolution, to make up for the loss of accuracy from going from a high-order polynomial representation to a piecewise constant representation in VTK.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In the Julia REPL, first load the package Trixi2Vtk","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Trixi2Vtk","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To process an HDF5 file generated by Trixi.jl, execute","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(joinpath(\"out\", \"solution_000000.h5\"), output_directory=\"out\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This will create two unstructured VTK files in the out subdirectory that can be opened with ParaView or VisIt: solution_000000.vtu contains the discontinuous Galerkin solution data while solution_000000_celldata.vtu holds any cell-based values such as the current AMR indicator or the cell refinement level.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: \"solution_000000_scalar_mesh\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This allows you to generate VTK files for solution, restart and mesh files. By default, Trixi2Vtk generates .vtu (unstructured VTK) files for both cell/element data (e.g., cell ids, element ids) and node data (e.g., solution variables). This format visualizes each cell with the same number of nodes, independent of its size. Alternatively, you can provide format=:vti as a keyword argument to trixi2vtk, which causes Trixi2Vtk to generate .vti (image data VTK) files for the solution files, while still using .vtu files for cell-/element-based data. In .vti files, a uniform resolution is used throughout the entire domain, resulting in different number of visualization nodes for each element. This can be advantageous to create publication-quality images, but increases the file size.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"If you want to convert multiple solution/restart files at once, you can just supply multiple input files as the positional arguments to trixi2vtk, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(\"out/solution_000000.h5\", \"out/solution_000040.h5\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"You may also use file globbing to select a range of files based on filename patterns, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(\"out/solution_*.h5\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"to convert all solution files in the out/ directory or","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(\"out/restart_00[0-9]000.h5\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"to convert every one-thousandth restart file (out/restart_000000.h5, out/restart_001000.h5 etc.).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"When multiple solution/restart files are provided, Trixi2Vtk will also generate a .pvd file, which allows ParaView to read all .vtu/.vti files at once and which uses the time attribute in solution/restart files to inform ParaView about the solution time. A comprehensive list of all possible arguments for trixi2vtk can be found in the Trixi2Vtk.jl API.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Further information regarding the development of Trixi2Vtk can be found in the development section.","category":"page"},{"location":"visualization/#Makie.jl","page":"Visualization","title":"Makie.jl [experimental]","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In addition to Plots.jl support, Trixi.jl includes visualization utilities through Makie.jl. Trixi.jl provides Makie-based visualization options both for heatmap-type plots (similar to the Plots.jl recipes) as well as for interactive surface plots. Support is currently limited to the UnstructuredMesh2D type.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nPlotting via Makie.jl is still considered an experimental feature and might change in any future releases.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"A Makie plot can be created as follows: after running a simulation with Trixi.jl in the REPL, load a Makie backend (for example, GLMakie or CairoMakie).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using GLMakie","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To visualize the solution and mesh with a heatmap-type plot, simply run","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nBoth Makie.jl and Plots.jl export plot, so if you load both libraries, you will have to specify which plot function to call via Plots.plot or Makie.plot.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"As with Plots.jl recipes, one can view individual solution components by creating a PlotData2D object and indexing into it with the desired variable name","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(sol)\njulia> plot(pd[\"rho\"])","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Unlike the Plots.jl recipe, mesh plotting is controlled using the keyword argument plot_mesh = false, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol; plot_mesh=false)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The plot command also returns figure and axis handles, which can be used to edit plot titles or labels:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> fig, axes = plot(sol)\njulia> axes[1,1].title = \"New title for subplot (1,1)\"","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Trixi.jl also supports interactive surface plots using iplot. After executing","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi_include(joinpath(\"examples\", \"unstructured_2d_dgsem\", \"elixir_euler_wall_bc.jl\"))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"we can run","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> iplot(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This will open up an interactive visualization window:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: makie-example)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The plot can be rotated (click and hold), zoomed in and out (scroll up and down), and panned (hold right click and drag). Two toggle buttons control whether mesh lines are visible on top of and below the solution.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Both plot and iplot use colormap = :inferno by default. A different colormap can be selected by providing an appropriate keyword argument. For example, plot(sol, colormap=:blues) and iplot(sol, colormap=:blues) produce the following figures:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: makie-plot-example) (Image: makie-iplot-example)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"EditURL = \"../../literate/src/files/adding_new_parabolic_terms.jl\"","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#adding_new_parabolic_terms","page":"11 Adding new parabolic terms","title":"11: Adding new parabolic terms","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"This demo illustrates the steps involved in adding new parabolic terms for the scalar advection equation. In particular, we will add an anisotropic diffusion. We begin by defining the hyperbolic (advection) part of the advection-diffusion equation.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"using OrdinaryDiffEq\nusing Trixi\n\n\nadvection_velocity = (1.0, 1.0)\nequations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);\nnothing #hide","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Define-a-new-parabolic-equation-type","page":"11 Adding new parabolic terms","title":"Define a new parabolic equation type","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Next, we define a 2D parabolic diffusion term type. This is similar to LaplaceDiffusion2D except that the diffusivity field refers to a spatially constant diffusivity matrix now. Note that ConstantAnisotropicDiffusion2D has a field for equations_hyperbolic. It is useful to have information about the hyperbolic system available to the parabolic part so that we can reuse functions defined for hyperbolic equations (such as varnames).","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"The abstract type Trixi.AbstractEquationsParabolic has three parameters: NDIMS (the spatial dimension, e.g., 1D, 2D, or 3D), NVARS (the number of variables), and GradientVariable, which we set as GradientVariablesConservative. This indicates that the gradient should be taken with respect to the conservative variables (e.g., the same variables used in equations_hyperbolic). Users can also take the gradient with respect to a different set of variables; see, for example, the implementation of CompressibleNavierStokesDiffusion2D, which can utilize either \"primitive\" or \"entropy\" variables.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"struct ConstantAnisotropicDiffusion2D{E, T} <: Trixi.AbstractEquationsParabolic{2, 1, GradientVariablesConservative}\n diffusivity::T\n equations_hyperbolic::E\nend\n\nvarnames(variable_mapping, equations_parabolic::ConstantAnisotropicDiffusion2D) =\n varnames(variable_mapping, equations_parabolic.equations_hyperbolic)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Next, we define the viscous flux function. We assume that the mixed hyperbolic-parabolic system is of the form","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"partial_t u(tx) + partial_x (f_1(u) - g_1(u nabla u))\n + partial_y (f_2(u) - g_2(u nabla u)) = 0","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"where f_1(u), f_2(u) are the hyperbolic fluxes and g_1(u nabla u), g_2(u nabla u) denote the viscous fluxes. For anisotropic diffusion, the viscous fluxes are the first and second components of the matrix-vector product involving diffusivity and the gradient vector.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Here, we specialize the flux to our new parabolic equation type ConstantAnisotropicDiffusion2D.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"function Trixi.flux(u, gradients, orientation::Integer, equations_parabolic::ConstantAnisotropicDiffusion2D)\n @unpack diffusivity = equations_parabolic\n dudx, dudy = gradients\n if orientation == 1\n return SVector(diffusivity[1, 1] * dudx + diffusivity[1, 2] * dudy)\n else # if orientation == 2\n return SVector(diffusivity[2, 1] * dudx + diffusivity[2, 2] * dudy)\n end\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Defining-boundary-conditions","page":"11 Adding new parabolic terms","title":"Defining boundary conditions","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Trixi.jl's implementation of parabolic terms discretizes both the gradient and divergence using weak formulation. In other words, we discretize the system","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"beginaligned\nbmq = nabla u \nbmsigma = beginpmatrix g_1(u bmq) g_2(u bmq) endpmatrix \ntextviscous contribution = nabla cdot bmsigma\nendaligned","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Boundary data must be specified for all spatial derivatives, e.g., for both the gradient equation bmq = nabla u and the divergence of the viscous flux nabla cdot bmsigma. We account for this by introducing internal Gradient and Divergence types which are used to dispatch on each type of boundary condition.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"As an example, let us introduce a Dirichlet boundary condition with constant boundary data.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"struct BoundaryConditionConstantDirichlet{T <: Real}\n boundary_value::T\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"This boundary condition contains only the field boundary_value, which we assume to be some real-valued constant which we will impose as the Dirichlet data on the boundary.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Boundary conditions have generally been defined as \"callable structs\" (also known as \"functors\"). For each boundary condition, we need to specify the appropriate boundary data to return for both the Gradient and Divergence. Since the gradient is operating on the solution u, the boundary data should be the value of u, and we can directly impose Dirichlet data.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"@inline function (boundary_condition::BoundaryConditionConstantDirichlet)(flux_inner, u_inner, normal::AbstractVector,\n x, t, operator_type::Trixi.Gradient,\n equations_parabolic::ConstantAnisotropicDiffusion2D)\n return boundary_condition.boundary_value\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"While the gradient acts on the solution u, the divergence acts on the viscous flux bmsigma. Thus, we have to supply boundary data for the Divergence operator that corresponds to bmsigma. However, we've already imposed boundary data on u for a Dirichlet boundary condition, and imposing boundary data for bmsigma might overconstrain our problem.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Thus, for the Divergence boundary data under a Dirichlet boundary condition, we simply return flux_inner, which is boundary data for bmsigma computed using the \"inner\" or interior solution. This way, we supply boundary data for the divergence operation without imposing any additional conditions.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"@inline function (boundary_condition::BoundaryConditionConstantDirichlet)(flux_inner, u_inner, normal::AbstractVector,\n x, t, operator_type::Trixi.Divergence,\n equations_parabolic::ConstantAnisotropicDiffusion2D)\n return flux_inner\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#A-note-on-the-choice-of-gradient-variables","page":"11 Adding new parabolic terms","title":"A note on the choice of gradient variables","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"It is often simpler to transform the solution variables (and solution gradients) to another set of variables prior to computing the viscous fluxes (see CompressibleNavierStokesDiffusion2D for an example of this). If this is done, then the boundary condition for the Gradient operator should be modified accordingly as well.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Putting-things-together","page":"11 Adding new parabolic terms","title":"Putting things together","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"Finally, we can instantiate our new parabolic equation type, define boundary conditions, and run a simulation. The specific anisotropic diffusion matrix we use produces more dissipation in the direction (1 -1) as an isotropic diffusion.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"For boundary conditions, we impose that u=1 on the left wall, u=2 on the bottom wall, and u = 0 on the outflow walls. The initial condition is taken to be u = 0. Note that we use BoundaryConditionConstantDirichlet only for the parabolic boundary conditions, since we have not defined its behavior for the hyperbolic part.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"using Trixi: SMatrix\ndiffusivity = 5.0e-2 * SMatrix{2, 2}([2 -1; -1 2])\nequations_parabolic = ConstantAnisotropicDiffusion2D(diffusivity, equations_hyperbolic);\n\nboundary_conditions_hyperbolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1.0)),\n y_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(2.0)),\n y_pos = boundary_condition_do_nothing,\n x_pos = boundary_condition_do_nothing)\n\nboundary_conditions_parabolic = (; x_neg = BoundaryConditionConstantDirichlet(1.0),\n y_neg = BoundaryConditionConstantDirichlet(2.0),\n y_pos = BoundaryConditionConstantDirichlet(0.0),\n x_pos = BoundaryConditionConstantDirichlet(0.0));\n\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\ncoordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))\ncoordinates_max = ( 1.0, 1.0) # maximum coordinates (max(x), max(y))\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n periodicity=false, n_cells_max=30_000) # set maximum capacity of tree data structure\n\ninitial_condition = (x, t, equations) -> SVector(0.0)\n\nsemi = SemidiscretizationHyperbolicParabolic(mesh,\n (equations_hyperbolic, equations_parabolic),\n initial_condition, solver;\n boundary_conditions=(boundary_conditions_hyperbolic,\n boundary_conditions_parabolic))\n\ntspan = (0.0, 2.0)\node = semidiscretize(semi, tspan)\ncallbacks = CallbackSet(SummaryCallback())\ntime_int_tol = 1.0e-6\nsol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,\n ode_default_options()..., callback=callbacks);\n\nusing Plots\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Package-versions","page":"11 Adding new parabolic terms","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"11 Adding new parabolic terms","title":"11 Adding new parabolic terms","text":"This page was generated using Literate.jl.","category":"page"},{"location":"code_of_conduct/","page":"Code of Conduct","title":"Code of Conduct","text":"EditURL = \"https://github.com/trixi-framework/Trixi.jl/blob/main/CODE_OF_CONDUCT.md\"","category":"page"},{"location":"code_of_conduct/#code-of-conduct","page":"Code of Conduct","title":"Code of Conduct","text":"","category":"section"},{"location":"code_of_conduct/","page":"Code of Conduct","title":"Code of Conduct","text":"Contributor Covenant Code of ConductOur PledgeWe as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.Our StandardsExamples of behavior that contributes to a positive environment for our community include:Demonstrating empathy and kindness toward other people\nBeing respectful of differing opinions, viewpoints, and experiences\nGiving and gracefully accepting constructive feedback\nAccepting responsibility and apologizing to those affected by our mistakes, and learning from the experience\nFocusing on what is best not just for us as individuals, but for the overall communityExamples of unacceptable behavior include:The use of sexualized language or imagery, and sexual attention or advances of any kind\nTrolling, insulting or derogatory comments, and personal or political attacks\nPublic or private harassment\nPublishing others' private information, such as a physical or email address, without their explicit permission\nOther conduct which could reasonably be considered inappropriate in a professional settingEnforcement ResponsibilitiesCommunity leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.ScopeThis Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.EnforcementInstances of abusive, harassing, or otherwise unacceptable behavior may be reported to Michael Schlottke-Lakemper, Hendrik Ranocha, or any other of the principal developers responsible for enforcement listed in Authors. All complaints will be reviewed and investigated promptly and fairly.All community leaders are obligated to respect the privacy and security of the reporter of any incident.Enforcement GuidelinesCommunity leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:1. CorrectionCommunity Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.2. WarningCommunity Impact: A violation through a single incident or series of actions.Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.3. Temporary BanCommunity Impact: A serious violation of community standards, including sustained inappropriate behavior.Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.4. Permanent BanCommunity Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.Consequence: A permanent ban from any sort of public interaction within the community.AttributionThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/codeofconduct.html.Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.[homepage]: https://www.contributor-covenant.orgFor answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.","category":"page"},{"location":"conventions/#conventions","page":"Conventions","title":"Conventions","text":"","category":"section"},{"location":"conventions/#Spatial-dimensions-and-directions","page":"Conventions","title":"Spatial dimensions and directions","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"We use the following numbering schemes on Cartesian or curved structured meshes.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"The orientations are numbered as 1 => x, 2 => y, 3 => z. For example, numerical fluxes such as flux_central(u_ll, u_rr, orientation, equations::AbstractEquations) use the orientation in this way.\nThe directions are numbered as 1 => -x, 2 => +x, 3 => -y, 4 => +y, 5 => -z, 6 => +z. For example, the boundary_conditions are ordered in this way when a Tuple of boundary conditions per direction is passed to the constructor of a SemidiscretizationHyperbolic.\nFor structured and unstructured curved meshes the concept of direction is generalized via the variable normal_direction. This variable points in the normal direction at a given, curved surface. For the computation of boundary fluxes the normal_direction is normalized to be a normal_vector used, for example, in FluxRotated.","category":"page"},{"location":"conventions/#Cells-vs.-elements-vs.-nodes","page":"Conventions","title":"Cells vs. elements vs. nodes","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"To uniquely distinguish between different components of the discretization, we use the following naming conventions:","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"The computational domain is discretized by a mesh, which is made up of individual cells. In general, neither the mesh nor the cells should be aware of any solver-specific knowledge, i.e., they should not store anything that goes beyond the geometrical information and the connectivity.\nThe numerical solvers do not directly store their information inside the mesh, but use own data structures. Specifically, for each cell on which a solver wants to operate, the solver creates an element to store solver-specific data.\nFor discretization schemes such as the discontinuous Galerkin or the finite element method, inside each element multiple nodes may be defined, which hold nodal information. The nodes are again a solver-specific component, just like the elements.\nWe often identify elements, nodes, etc. with their (local or global) integer index. Convenience iterators such as eachelement, eachnode use these indices.","category":"page"},{"location":"conventions/#Keywords-in-elixirs","page":"Conventions","title":"Keywords in elixirs","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Trixi.jl is distributed with several examples in the form of elixirs, small Julia scripts containing everything to set up and run a simulation. Working interactively from the Julia REPL with these scripts can be quite convenient while for exploratory research and development of Trixi.jl. For example, you can use the convenience function trixi_include to include an elixir with some modified arguments. To enable this, it is helpful to use a consistent naming scheme in elixirs, since trixi_include can only perform simple replacements. Some standard variables names are","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"polydeg for the polynomial degree of a solver\nsurface_flux for the numerical flux at surfaces\nvolume_flux for the numerical flux used in flux differencing volume terms","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Moreover, convergence_test requires that the spatial resolution is set via the keywords","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"initial_refinement_level (an integer, e.g. for the TreeMesh and the P4estMesh) or\ncells_per_dimension (a tuple of integers, one per spatial dimension, e.g. for the StructuredMesh and the DGMultiMesh).","category":"page"},{"location":"conventions/#Variable-names","page":"Conventions","title":"Variable names","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Use descriptive names (using snake_case for variables/functions and CamelCase for types)\nUse a suffix _ as in name_ for local variables that would otherwise hide existing symbols.\nUse a prefix _ as in _name to indicate internal methods/data that are \"fragile\" in the sense that there's no guarantee that they might get changed without notice. These are also not documented with a docstring (but maybe with comments using #).","category":"page"},{"location":"conventions/#Array-types-and-wrapping","page":"Conventions","title":"Array types and wrapping","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"To allow adaptive mesh refinement efficiently when using time integrators from OrdinaryDiffEq, Trixi.jl allows to represent numerical solutions in two different ways. Some discussion can be found online and in form of comments describing Trixi.wrap_array and Trixi.wrap_array_native in the source code of Trixi.jl. The flexibility introduced by this possible wrapping enables additional performance optimizations. However, it comes at the cost of some additional abstractions (and needs to be used with caution, as described in the source code of Trixi.jl). Thus, we use the following conventions to distinguish between arrays visible to the time integrator and wrapped arrays mainly used internally.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Arrays visible to the time integrator have a suffix _ode, e.g., du_ode, u_ode.\nWrapped arrays do not have a suffix, e.g., du, u.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Methods either accept arrays visible to the time integrator or wrapped arrays based on the following rules.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"When some solution is passed together with a semidiscretization semi, the solution must be a u_ode that needs to be wrapped via wrap_array(u_ode, semi) (or wrap_array_native(u_ode, semi)) for further processing.\nWhen some solution is passed together with the mesh, equations, solver, cache, ..., it is already wrapped via wrap_array (or wrap_array_native).\nExceptions of this rule are possible, e.g. for AMR, but must be documented in the code.\nwrap_array should be used as default option. wrap_array_native should only be used when necessary, e.g., to avoid additional overhead when interfacing with external C libraries such as HDF5, MPI, or visualization.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"EditURL = \"../../literate/src/files/non_periodic_boundaries.jl\"","category":"page"},{"location":"tutorials/non_periodic_boundaries/#non_periodic_boundaries","page":"4 Non-periodic boundaries","title":"4: Non-periodic boundaries","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/non_periodic_boundaries/#Dirichlet-boundary-condition","page":"4 Non-periodic boundaries","title":"Dirichlet boundary condition","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"First, let's look at the Dirichlet boundary condition BoundaryConditionDirichlet.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"BoundaryConditionDirichlet(boundary_value_function)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"In Trixi.jl, this creates a Dirichlet boundary condition where the function boundary_value_function is used to set the values at the boundary. It can be used to create a boundary condition that sets exact boundary values by passing the exact solution of the equation.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"It is important to note that standard Dirichlet boundary conditions for hyperbolic PDEs do not make sense in most cases. However, we are using a special weak form of the Dirichlet boundary condition, based on the application of the numerical surface flux. The numerical surface flux takes the solution value from inside the domain and the prescribed value of the outer boundary state as arguments, and solves an approximate Riemann problem to introduce dissipation (and hence stabilization) at the boundary. Hence, the performance of the Dirichlet BC depends on the fidelity of the numerical surface flux.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"The passed boundary value function is called with the same arguments as an initial condition function, i.e.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"boundary_value_function(x, t, equations)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"where x specifies the spatial coordinates, t is the current time, and equations is the corresponding system of equations.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"We want to give a short example for a simulation with such a Dirichlet BC.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"Consider the one-dimensional linear advection equation with domain Omega=0 2 and a constant zero initial condition.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"using OrdinaryDiffEq, Trixi\n\nadvection_velocity = 1.0\nequations = LinearScalarAdvectionEquation1D(advection_velocity)\n\ninitial_condition_zero(x, t, equation::LinearScalarAdvectionEquation1D) = SVector(0.0)\ninitial_condition = initial_condition_zero\n\nusing Plots\nplot(x -> sum(initial_condition(x, 0.0, equations)), label=\"initial condition\", ylim=(-1.5, 1.5))","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"Using an advection velocity of 1.0 and the (local) Lax-Friedrichs/Rusanov flux FluxLaxFriedrichs as a numerical surface flux, we are able to create an inflow boundary on the left and an outflow boundary on the right, as the Lax-Friedrichs flux is in this case an exact characteristics Riemann solver. We note that for more complex PDEs different strategies for inflow/outflow boundaries are necessary. To define the inflow values, we initialize a boundary_value_function.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"function boundary_condition_sine_sector(x, t, equation::LinearScalarAdvectionEquation1D)\n if 1 <= t <= 3\n scalar = sin(2 * pi * sum(t - 1))\n else\n scalar = zero(t)\n end\n return SVector(scalar)\nend\nboundary_condition = boundary_condition_sine_sector","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"We set the BC in negative and positive x-direction.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"boundary_conditions = (x_neg=BoundaryConditionDirichlet(boundary_condition),\n x_pos=BoundaryConditionDirichlet(boundary_condition))","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n\ncoordinates_min = (0.0,)\ncoordinates_max = (2.0,)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"For the mesh type TreeMesh the parameter periodicity must be set to false in the corresponding direction.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"mesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n n_cells_max=10_000,\n periodicity=false)\n\n\nsemi = SemidiscretizationHyperbolic(mesh, equations,\n initial_condition,\n solver,\n boundary_conditions=boundary_conditions)\n\ntspan = (0.0, 6.0)\node = semidiscretize(semi, tspan)\n\nanalysis_callback = AnalysisCallback(semi, interval=100,)\n\nstepsize_callback = StepsizeCallback(cfl=0.9)\n\ncallbacks = CallbackSet(analysis_callback,\n stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"We define some equidistant nodes for the visualization","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"visnodes = range(tspan[1], tspan[2], length=300)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"and run the simulation.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, saveat=visnodes, callback=callbacks);\n\nusing Plots\n@gif for step in 1:length(sol.u)\n plot(sol.u[step], semi, ylim=(-1.5, 1.5), legend=true, label=\"approximation\", title=\"time t=$(round(sol.t[step], digits=5))\")\n scatter!([0.0], [sum(boundary_condition(SVector(0.0), sol.t[step], equations))], label=\"boundary condition\")\nend","category":"page"},{"location":"tutorials/non_periodic_boundaries/#Other-available-example-elixirs-with-non-trivial-BC","page":"4 Non-periodic boundaries","title":"Other available example elixirs with non-trivial BC","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"Moreover, there are other boundary conditions in Trixi.jl. For instance, you can use the slip wall boundary condition boundary_condition_slip_wall.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"Trixi.jl provides some interesting examples with different combinations of boundary conditions, e.g. using boundary_condition_slip_wall and other self-defined boundary conditions using BoundaryConditionDirichlet.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"For instance, there is a 2D compressible Euler setup for a Mach 3 wind tunnel flow with a forward facing step in the elixir elixir_euler_forward_step_amr.jl discretized with a P4estMesh using adaptive mesh refinement (AMR).","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":" \n
","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"Source: Video on Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"A double Mach reflection problem for the 2D compressible Euler equations elixir_euler_double_mach_amr.jl exercises a special boundary conditions along the bottom of the domain that is a mixture of Dirichlet and slip wall.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":" \n
","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"Source: Video on Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"A channel flow around a cylinder at Mach 3 elixir_euler_supersonic_cylinder.jl contains supersonic Mach 3 inflow at the left portion of the domain and supersonic outflow at the right portion of the domain. The top and bottom of the channel as well as the cylinder are treated as Euler slip wall boundaries.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":" \n
","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"Source: Video on Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/non_periodic_boundaries/#Package-versions","page":"4 Non-periodic boundaries","title":"Package versions","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"4 Non-periodic boundaries","title":"4 Non-periodic boundaries","text":"This page was generated using Literate.jl.","category":"page"},{"location":"parallelization/#Parallelization","page":"Parallelization","title":"Parallelization","text":"","category":"section"},{"location":"parallelization/#Shared-memory-parallelization-with-threads","page":"Parallelization","title":"Shared-memory parallelization with threads","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Many compute-intensive loops in Trixi.jl are parallelized using the multi-threading support provided by Julia. You can recognize those loops by the @threaded macro prefixed to them, e.g.,","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"@threaded for element in eachelement(dg, cache)\n ...\nend","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"This will statically assign an equal iteration count to each available thread.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"To use multi-threading, you need to tell Julia at startup how many threads you want to use by either setting the environment variable JULIA_NUM_THREADS or by providing the -t/--threads command line argument. For example, to start Julia with four threads, start Julia with","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia --threads=4","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If both the environment variable and the command line argument are specified at the same time, the latter takes precedence.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If you use time integration methods from OrdinaryDiffEq.jl and want to use multiple threads therein, you need to set the keyword argument thread=OrdinaryDiffEq.True() of the algorithms, as described in the section on time integration methods.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"warning: Warning\nNot everything is parallelized yet and there are likely opportunities to improve scalability. Multi-threading isn't considered part of the public API of Trixi.jl yet.","category":"page"},{"location":"parallelization/#Distributed-computing-with-MPI","page":"Parallelization","title":"Distributed computing with MPI","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"In addition to the shared memory parallelization with multi-threading, Trixi.jl supports distributed parallelism via MPI.jl, which leverages the Message Passing Interface (MPI). MPI.jl comes with its own MPI library binaries such that there is no need to install MPI yourself. However, it is also possible to instead use an existing MPI installation, which is recommended if you are running MPI programs on a cluster or supercomputer (see the MPI.jl docs to find out how to select the employed MPI library). Additional notes on how to use a system-provided MPI installation with Trixi.jl can be found in the following subsection.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"warning: Work in progress\nMPI-based parallelization is work in progress and not finished yet. Nothing related to MPI is part of the official API of Trixi.jl yet.","category":"page"},{"location":"parallelization/#parallel_system_MPI","page":"Parallelization","title":"Using a system-provided MPI installation","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"When using Trixi.jl with a system-provided MPI backend, the underlying p4est, t8code and HDF5 libraries need to be compiled with the same MPI installation. If you want to use p4est (via the P4estMesh) or t8code (via the T8codeMesh) from Trixi.jl, you also need to use system-provided p4est or t8code installations (for notes on how to install p4est and t8code see, e.g., here and here, use the configure option --enable-mpi). Otherwise, there will be warnings that no preference is set for P4est.jl and T8code.jl that can be ignored if you do not use these libraries from Trixi.jl. Note that t8code already comes with a p4est installation, so it suffices to install t8code. In order to use system-provided p4est and t8code installations, P4est.jl and T8code.jl need to be configured to use the custom installations. Follow the steps described here and here for the configuration. The paths that point to libp4est.so (and potentially to libsc.so) need to be the same for P4est.jl and T8code.jl. This could, e.g., be libp4est.so that usually can be found in lib/ or local/lib/ in the installation directory of t8code. Note that the T8codeMesh, however, does not support MPI yet. The preferences for HDF5.jl always need to be set, even if you do not want to use HDF5 from Trixi.jl, see also issue #1079 in HDF5.jl. To set the preferences for HDF5.jl, follow the instructions described here.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"In total, in your active Julia project you should have a LocalPreferences.toml file with sections [MPIPreferences], [T8code] (only needed if T8codeMesh is used), [P4est] (only needed if P4estMesh is used), and [HDF5] as well as an entry MPIPreferences in your Project.toml to use a custom MPI installation. A LocalPreferences.toml file created as described above might look something like the following:","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"[HDF5]\nlibhdf5 = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so\"\nlibhdf5_hl = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5_hl.so\"\n\n[HDF5_jll]\nlibhdf5_hl_path = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5_hl.so\"\nlibhdf5_path = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so\"\n\n[MPIPreferences]\n__clear__ = [\"preloads_env_switch\"]\n_format = \"1.0\"\nabi = \"OpenMPI\"\nbinary = \"system\"\ncclibs = []\nlibmpi = \"/lib/x86_64-linux-gnu/libmpi.so\"\nmpiexec = \"mpiexec\"\npreloads = []\n\n[P4est]\nlibp4est = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so\"\nlibsc = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so\"\n\n[T8code]\nlibp4est = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so\"\nlibsc = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so\"\nlibt8 = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libt8.so\"","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"This file is created with the following sequence of commands:","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using MPIPreferences\njulia> MPIPreferences.use_system_binary()","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Restart the Julia REPL","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using P4est\njulia> P4est.set_library_p4est!(\"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so\")\njulia> P4est.set_library_sc!(\"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so\")\njulia> using T8code\njulia> T8code.set_libraries_path!(\"/home/mschlott/hackathon/libtrixi/t8code/install/lib/\")\njulia> using HDF5\njulia> HDF5.API.set_libraries!(\"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so\", \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5_hl.so\")","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"After the preferences are set, restart the Julia REPL again.","category":"page"},{"location":"parallelization/#parallel_usage","page":"Parallelization","title":"Usage","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"To start Trixi.jl in parallel with MPI, there are three options:","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Run from the REPL with mpiexec(): You can start a parallel execution directly from the REPL by executing\njulia> using MPI\n\njulia> mpiexec() do cmd\n run(`$cmd -n 3 $(Base.julia_cmd()) --threads=1 --project=@. -e 'using Trixi; trixi_include(default_example())'`)\n end\nThe parameter -n 3 specifies that Trixi.jl should run with three processes (or ranks in MPI parlance) and should be adapted to your available computing resources and problem size. The $(Base.julia_cmd()) argument ensures that Julia is executed in parallel with the same optimization level etc. as you used for the REPL; if this is unnecessary or undesired, you can also just use julia. Further, if you are not running Trixi.jl from a local clone but have installed it as a package, you need to omit the --project=@..\nRun from the command line with mpiexecjl: Alternatively, you can use the mpiexecjl script provided by MPI.jl, which allows you to start Trixi.jl in parallel directly from the command line. As a preparation, you need to install the script once by running\njulia> using MPI\n\njulia> MPI.install_mpiexecjl(destdir=\"/somewhere/in/your/PATH\")\nThen, to execute Trixi.jl in parallel, execute the following command from your command line:\nmpiexecjl -n 3 julia --threads=1 --project=@. -e 'using Trixi; trixi_include(default_example())'\nRun interactively with tmpi (Linux/MacOS only): If you are on a Linux/macOS system, you have a third option which lets you run Julia in parallel interactively from the REPL. This comes in handy especially during development, as in contrast to the first two options, it allows to reuse the compilation cache and thus facilitates much faster startup times after the first execution. It requires tmux and the OpenMPI library to be installed before, both of which are usually available through a package manager. Once you have installed both tools, you need to configure MPI.jl to use the OpenMPI for your system, which is explained here. Then, you can download and install the tmpi script by executing\ncurl https://raw.githubusercontent.com/Azrael3000/tmpi/master/tmpi -o /somewhere/in/your/PATH/tmpi\nFinally, you can start and control multiple Julia REPLs simultaneously by running\ntmpi 3 julia --threads=1 --project=@.\nThis will start Julia inside tmux three times and multiplexes all commands you enter in one REPL to all other REPLs (try for yourself to understand what it means). If you have no prior experience with tmux, handling the REPL this way feels slightly weird in the beginning. However, there is a lot of documentation for tmux available and once you get the hang of it, developing Trixi.jl in parallel becomes much smoother this way. Some helpful commands are the following. To close a single pane you can press Ctrl+b and then x followed by y to confirm. To quit the whole session you press Ctrl+b followed by :kill-session. Often you would like to scroll up. You can do that by pressing Ctrl+b and then [, which allows you to use the arrow keys to scroll up and down. To leave the scroll mode you press q. Switching between panes can be done by Ctrl+b followed by o. As of March 2022, newer versions of tmpi also support mpich, which is the default backend of MPI.jl (via MPICH_Jll.jl). To use this setup, you need to install mpiexecjl as described in the documentation of MPI.jl and make it available as mpirun, e.g., via a symlink of the form\nln -s ~/.julia/bin/mpiexecjl /somewhere/in/your/path/mpirun\n(assuming default installations).","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"note: Hybrid parallelism\nIt is possible to combine MPI with shared memory parallelism via threads by starting Julia with more than one thread, e.g. by passing the command line argument julia --threads=2 instead of julia --threads=1 used in the examples above. In that case, you should make sure that your system supports the number of processes/threads that you try to start.","category":"page"},{"location":"parallelization/#parallel_performance","page":"Parallelization","title":"Performance","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"For information on how to evaluate the parallel performance of Trixi.jl, please have a look at the Performance metrics of the AnalysisCallback section, specifically at the descriptions of the performance index (PID).","category":"page"},{"location":"parallelization/#Using-error-based-step-size-control-with-MPI","page":"Parallelization","title":"Using error-based step size control with MPI","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If you use error-based step size control (see also the section on error-based adaptive step sizes) together with MPI you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to OrdinaryDiffEq's solve, which are both included in ode_default_options.","category":"page"},{"location":"parallelization/#Using-parallel-input-and-output","page":"Parallelization","title":"Using parallel input and output","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Trixi.jl allows parallel I/O using MPI by leveraging parallel HDF5.jl. On most systems, this is enabled by default. Additionally, you can also use a local installation of the HDF5 library (with MPI support). For this, you first need to use a system-provided MPI library, see also here and you need to tell HDF5.jl to use this library. To do so with HDF5.jl v0.17 and newer, set the preferences libhdf5 and libhdf5_hl to the local paths of the libraries libhdf5 and libhdf5_hl, which can be done by","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using Preferences, UUIDs\njulia> set_preferences!(\n UUID(\"f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f\"), # UUID of HDF5.jl\n \"libhdf5\" => \"/path/to/your/libhdf5.so\",\n \"libhdf5_hl\" => \"/path/to/your/libhdf5_hl.so\", force = true)","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Alternatively, with HDF5.jl v0.17.1 or higher you can use","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using HDF5\njulia> HDF5.API.set_libraries!(\"/path/to/your/libhdf5.so\", \"/path/to/your/libhdf5_hl.so\")","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"For more information see also the documentation of HDF5.jl. In total, you should have a file called LocalPreferences.toml in the project directory that contains a section [MPIPreferences], a section [HDF5] with entries libhdf5 and libhdf5_hl, a section [P4est] with the entry libp4est as well as a section [T8code] with the entries libt8, libp4est and libsc. If you use HDF5.jl v0.16 or older, instead of setting the preferences for HDF5.jl, you need to set the environment variable JULIA_HDF5_PATH to the path, where the HDF5 binaries are located and then call ]build HDF5 from Julia.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If HDF5 is not MPI-enabled, Trixi.jl will fall back on a less efficient I/O mechanism. In that case, all disk I/O is performed only on rank zero and data is distributed to/gathered from the other ranks using regular MPI communication.","category":"page"},{"location":"overview/#Overview-of-the-structure-of-Trixi.jl","page":"Overview","title":"Overview of the structure of Trixi.jl","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"Trixi.jl is designed as a library of components for discretizations of hyperbolic conservation laws. Thus, it is not a monolithic PDE solver that is configured at runtime via parameter files, as it is often found in classical numerical simulation codes. Instead, each simulation is configured by pure Julia code. Many examples of such simulation setups, called elixirs in Trixi.jl, are provided in the examples/ folder.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"Trixi.jl uses the method of lines, i.e., the full space-time discretization is separated into two steps; the spatial semidiscretization is performed at first and the resulting ODE system is solved numerically using a suitable time integration method. Thus, the main ingredients of an elixir designed to solve a PDE numerically are the spatial semidiscretization and the time integration scheme.","category":"page"},{"location":"overview/#overview-semidiscretizations","page":"Overview","title":"Semidiscretizations","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"Semidiscretizations are high-level descriptions of spatial discretizations specialized for certain PDEs. Trixi.jl's main focus is on hyperbolic conservation laws represented in a SemidiscretizationHyperbolic. Such semidiscretizations are usually named semi in Trixi.jl","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"(Image: semidiscretization_overview)","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"The basic building blocks of a semidiscretization are","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"a mesh describing the geometry of the domain\na set of equations describing the physical model\na solver describing the numerical approach","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"In addition, a semidiscretization bundles initial and boundary conditions, and possible source terms. These different ingredients of a semidiscretization can be configured individually and combined together. When a semidiscretization is constructed, it will create an internal cache, i.e., a collection of setup-specific data structures, that is usually passed to all lower level functions.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"Due to Trixi.jl's modular nature using Julia's multiple dispatch features, new ingredients can be created specifically for a certain combination of other ingredients. For example, a new mesh type can be created and implemented at first only for a specific solver. Thus, there is no need to consider all possible combinations of meshes, equations, and solvers when implementing new features. This allows rapid prototyping of new ideas and is one of the main design goals behind Trixi.jl. Below is a brief overview of the availability of different features on different mesh types.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"Feature TreeMesh StructuredMesh UnstructuredMesh2D P4estMesh DGMultiMesh Further reading\nSpatial dimension 1D, 2D, 3D 1D, 2D, 3D 2D 2D, 3D 1D, 2D, 3D \nCoordinates Cartesian curvilinear curvilinear curvilinear curvilinear \nConnectivity h-nonconforming conforming conforming h-nonconforming conforming \nElement type line, square, cube line, quadᵃ, hexᵃ quadᵃ quadᵃ, hexᵃ simplex, quadᵃ, hexᵃ \nAdaptive mesh refinement ✅ ❌ ❌ ✅ ❌ AMRCallback\nSolver type DGSEM DGSEM DGSEM DGSEM DGMulti \nDomain hypercube mapped hypercube arbitrary arbitrary arbitrary \nWeak form ✅ ✅ ✅ ✅ ✅ VolumeIntegralWeakForm\nFlux differencing ✅ ✅ ✅ ✅ ✅ VolumeIntegralFluxDifferencing\nShock capturing ✅ ✅ ✅ ✅ ❌ VolumeIntegralShockCapturingHG\nNonconservative equations ✅ ✅ ✅ ✅ ✅ e.g., GLM MHD or shallow water equations\nParabolic terms ✅ ✅ ❌ ✅ ✅ e.g., CompressibleNavierStokesDiffusion2D","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"ᵃ: quad = quadrilateral, hex = hexahedron","category":"page"},{"location":"overview/#Time-integration-methods","page":"Overview","title":"Time integration methods","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, a spatial semidiscretization can be wrapped in an ODE problem using semidiscretize, which returns an ODEProblem. This ODEProblem is a wrapper of Trixi.rhs!(du_ode, u_ode, semi, t), which gets called in ODE solvers. Further information can be found in the section on time integration methods.","category":"page"},{"location":"overview/#Next-steps","page":"Overview","title":"Next steps","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"We explicitly encourage people interested in Trixi.jl to have a look at the examples/ bundled with Trixi.jl to get an impression of what is possible and the general look and feel of Trixi.jl. Before doing that, it is usually good to get an idea of how to visualize numerical results.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"If you like learning by doing, looking at the tutorials and trying to mix your own elixirs based thereon is probably a good next step. Otherwise, you can further dig into the documentation by looking at Trixi.jl's basic building blocks.","category":"page"},{"location":"callbacks/#callbacks-id","page":"Callbacks","title":"Callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Many of the advanced features of Trixi.jl, such as adaptive mesh refinement, are implemented as callbacks. A callback is an algorithmic entity that gets passed to the ODE solver and is called at specific points during execution to perform certain tasks. Callbacks in Trixi.jl are either called after each time step (step callbacks) or after each stage of the ODE solver (stage callbacks).","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"(Image: callbacks_illustration)","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The advantage of callbacks over hard-coding all features is that it allows to extend Trixi.jl without modifying the internal source code. Trixi.jl provides callbacks for time step control, adaptive mesh refinement, I/O, and more.","category":"page"},{"location":"callbacks/#Step-callbacks","page":"Callbacks","title":"Step callbacks","text":"","category":"section"},{"location":"callbacks/#CFL-based-time-step-control","page":"Callbacks","title":"CFL-based time step control","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Time step control can be performed with a StepsizeCallback. An example making use of this can be found at examples/tree_2d_dgsem/elixir_advection_basic.jl","category":"page"},{"location":"callbacks/#Adaptive-mesh-refinement","page":"Callbacks","title":"Adaptive mesh refinement","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Trixi.jl uses a hierarchical Cartesian mesh which can be locally refined in a solution-adaptive way. This can be used to speed up simulations with minimal loss in overall accuracy. Adaptive mesh refinement (AMR) can be used by passing an AMRCallback to the ODE solver. The AMRCallback requires a controller such as ControllerThreeLevel or ControllerThreeLevelCombined to tell the AMR algorithm which cells to refine/coarsen.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"An example elixir using AMR can be found at examples/tree_2d_dgsem/elixir_advection_amr.jl.","category":"page"},{"location":"callbacks/#Analyzing-the-numerical-solution","page":"Callbacks","title":"Analyzing the numerical solution","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The AnalysisCallback can be used to analyze the numerical solution, e.g. calculate errors or user-specified integrals, and print the results to the screen. The results can also be saved in a file. An example can be found at examples/tree_2d_dgsem/elixir_euler_vortex.jl. Note that the errors (e.g. L2 error or Linf error) are computed with respect to the initial condition. The percentage of the simulation time refers to the ratio of the current time and the final time, i.e. it does not consider the maximal number of iterations. So the simulation could finish before 100% are reached. Note that, e.g., due to AMR or smaller time step sizes, the simulation can actually take longer than the percentage indicates. In Performance metrics of the AnalysisCallback you can find a detailed description of the different performance metrics the AnalysisCallback computes.","category":"page"},{"location":"callbacks/#I/O","page":"Callbacks","title":"I/O","text":"","category":"section"},{"location":"callbacks/#Solution-and-restart-files","page":"Callbacks","title":"Solution and restart files","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"To save the solution in regular intervals you can use a SaveSolutionCallback. It is also possible to create restart files using the SaveRestartCallback. An example making use of these can be found at examples/tree_2d_dgsem/elixir_advection_extended.jl. An example showing how to restart a simulation from a restart file can be found at examples/tree_2d_dgsem/elixir_advection_restart.jl.","category":"page"},{"location":"callbacks/#Time-series","page":"Callbacks","title":"Time series","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Sometimes it is useful to record the evaluations of state variables over time at a given set of points. This can be achieved by the TimeSeriesCallback, which is used, e.g., in examples/tree_2d_dgsem/elixir_acoustics_gaussian_source.jl. The TimeSeriesCallback constructor expects a semidiscretization and a list of points at which the solution should be recorded in regular time step intervals. After the last time step, the entire record is stored in an HDF5 file.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"For the points, two different input formats are supported: You can either provide them as a list of tuples, which is handy if you specify them by hand on the REPL. Alternatively, you can provide them as a two-dimensional array, where the first dimension is the point number and the second dimension is the coordinate dimension. This is especially useful when reading them from a file.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"For example, to record the primitive variables at the points (0.0, 0.0) and (-1.0, 0.5) every five timesteps and storing the collected data in the file tseries.h5, you can create the TimeSeriesCallback as","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"time_series = TimeSeriesCallback(semi, [(0.0, 0.0), (-1.0, 0.5)];\n interval=5,\n solution_variables=cons2prim,\n filename=\"tseries.h5\")","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"For a full list of possible arguments, please check the documentation for the TimeSeriesCallback. As an alternative to specifying the point coordinates directly in the elixir or on the REPL, you can read them from a file. For instance, with a text file points.dat with content","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":" 0.0 0.0\n-1.0 0.5","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"you can create a time series callback with","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"using DelimitedFiles: readdlm\ntime_series = TimeSeriesCallback(semi, readdlm(\"points.dat\"))","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"To plot the individual point data series over time, you can create a PlotData1D from the TimeSeriesCallback and a given point ID. For example, executing","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"julia> using Trixi, Plots\n\njulia> trixi_include(joinpath(examples_dir(), \"tree_2d_dgsem\", \"elixir_acoustics_gaussian_source.jl\"))\n\njulia> pd1 = PlotData1D(time_series, 1)\n\njulia> pd2 = PlotData1D(time_series, 2)\n\njulia> plot(pd1[\"p_prime\"]); plot!(pd2[\"p_prime\"], xguide=\"t\")","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"will yield the following plot:","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"(Image: image)","category":"page"},{"location":"callbacks/#Miscellaneous","page":"Callbacks","title":"Miscellaneous","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The AliveCallback prints some information to the screen to show that a simulation is still running.\nThe SummaryCallback prints a human-readable summary of the simulation setup and controls the automated performance measurements, including an output of the recorded timers after a simulation.\nThe VisualizationCallback can be used for in-situ visualization. See Visualizing results during a simulation.\nThe TrivialCallback does nothing and can be used to easily disable some callbacks via trixi_include.","category":"page"},{"location":"callbacks/#Equation-specific-callbacks","page":"Callbacks","title":"Equation-specific callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Some callbacks provided by Trixi.jl implement specific features for certain equations:","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The LBMCollisionCallback implements the Lattice-Boltzmann method (LBM) collision operator and should only be used when solving the Lattice-Boltzmann equations. See e.g. examples/tree_2d_dgsem/elixir_lbm_constant.jl\nThe SteadyStateCallback terminates the time integration when the residual steady state falls below a certain threshold. This checks the convergence of the potential phi for hyperbolic diffusion. See e.g. examples/tree_2d_dgsem/elixir_hypdiff_nonperiodic.jl.\nThe GlmSpeedCallback updates the divergence cleaning wave speed c_h for the ideal GLM-MHD equations. See e.g. examples/tree_2d_dgsem/elixir_mhd_alfven_wave.jl.","category":"page"},{"location":"callbacks/#Usage-of-step-callbacks","page":"Callbacks","title":"Usage of step callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Step callbacks are passed to the solve method from the ODE solver via the keyword argument callback. If you want to use a single callback cb, pass it as callback=cb. When using two or more callbacks, you need to turn them into a CallbackSet first by calling callbacks = CallbackSet(cb1, cb2) and passing it as callback=callbacks.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"note: Note\nThere are some restrictions regarding the order of callbacks in a CallbackSet.The callbacks are called after each time step but some callbacks actually belong to the next time step. Therefore, the callbacks should be ordered in the following way:Callbacks that belong to the current time step:\nSummaryCallback controls, among other things, timers and should thus be first\nSteadyStateCallback may mark a time step as the last one\nAnalysisCallback may do some checks that mark a time step as the last one\nAliveCallback should be nearby AnalysisCallback\nSaveSolutionCallback/SaveRestartCallback should save the current solution before it is degraded by AMR\nVisualizationCallback should be called before the mesh is adapted\nCallbacks that belong to the next time step:\nAMRCallback\nStepsizeCallback must be called after AMRCallback to accommodate potential changes to the mesh\nGlmSpeedCallback must be called after StepsizeCallback because the step size affects the value of c_h\nLBMCollisionCallback is already part of the calculations of the next time step and should therefore be called after StepsizeCallback","category":"page"},{"location":"callbacks/#Stage-callbacks","page":"Callbacks","title":"Stage callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"PositivityPreservingLimiterZhangShu is a positivity-preserving limiter, used to enforce physical constraints. An example elixir using this feature can be found at examples/tree_2d_dgsem/elixir_euler_positivity.jl.","category":"page"},{"location":"callbacks/#Implementing-new-callbacks","page":"Callbacks","title":"Implementing new callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Since Trixi.jl is compatible with OrdinaryDiffEq.jl, both packages share the same callback interface. A detailed description of it can be found in the OrdinaryDiffEq.jl documentation. Step callbacks are just called callbacks. Stage callbacks are called stage_limiter!.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"An example elixir showing how to implement a new simple stage callback and a new simple step callback can be found at examples/tree_2d_dgsem/elixir_advection_callbacks.jl.","category":"page"},{"location":"#Trixi.jl","page":"Home","title":"Trixi.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"(Image: Docs-stable) (Image: Docs-dev) (Image: Slack) (Image: Youtube) (Image: Build Status) (Image: Codecov) (Image: Coveralls) (Image: Aqua QA) (Image: License: MIT) (Image: DOI)","category":"page"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl is a numerical simulation framework for conservation laws written in Julia. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures. Its features include:","category":"page"},{"location":"","page":"Home","title":"Home","text":"1D, 2D, and 3D simulations on line/quad/hex/simplex meshes\nCartesian and curvilinear meshes\nConforming and non-conforming meshes\nStructured and unstructured meshes\nHierarchical quadtree/octree grid with adaptive mesh refinement\nForests of quadtrees/octrees with p4est via P4est.jl\nHigh-order accuracy in space and time\nDiscontinuous Galerkin methods\nKinetic energy-preserving and entropy-stable methods based on flux differencing\nEntropy-stable shock capturing\nPositivity-preserving limiting\nFinite difference summation by parts (SBP) methods\nCompatible with the SciML ecosystem for ordinary differential equations\nExplicit low-storage Runge-Kutta time integration\nStrong stability preserving methods\nCFL-based and error-based time step control\nNative support for differentiable programming\nForward mode automatic differentiation via ForwardDiff.jl\nPeriodic and weakly-enforced boundary conditions\nMultiple governing equations:\nCompressible Euler equations\nCompressible Navier-Stokes equations\nMagnetohydrodynamics (MHD) equations\nMulti-component compressible Euler and MHD equations\nLinearized Euler and acoustic perturbation equations\nHyperbolic diffusion equations for elliptic problems\nLattice-Boltzmann equations (D2Q9 and D3Q27 schemes)\nShallow water equations\nScalar advection\nMulti-physics simulations\nSelf-gravitating gas dynamics\nShared-memory parallelization via multithreading\nMulti-node parallelization via MPI\nVisualization and postprocessing of the results\nIn-situ and a posteriori visualization with Plots.jl\nInteractive visualization with Makie.jl\nPostprocessing with ParaView/VisIt via Trixi2Vtk","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you have not yet installed Julia, please follow the instructions for your operating system. Trixi.jl works with Julia v1.8 and newer. We recommend using the latest stable release of Julia.","category":"page"},{"location":"#For-users","page":"Home","title":"For users","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl and its related tools are registered Julia packages. Hence, you can install Trixi.jl, the visualization tool Trixi2Vtk, OrdinaryDiffEq.jl, and Plots.jl by executing the following commands in the Julia REPL:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Pkg\n\njulia> Pkg.add([\"Trixi\", \"Trixi2Vtk\", \"OrdinaryDiffEq\", \"Plots\"])","category":"page"},{"location":"","page":"Home","title":"Home","text":"You can copy and paste all commands to the REPL including the leading julia> prompts - they will automatically be stripped away by Julia. The package OrdinaryDiffEq.jl provides time integration schemes used by Trixi.jl, while Plots.jl can be used to directly visualize Trixi.jl's results from the REPL.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note on package versions: If some of the examples for how to use Trixi.jl do not work, verify that you are using a recent Trixi.jl release by comparing the installed Trixi.jl version from","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Pkg; Pkg.update(\"Trixi\"); Pkg.status(\"Trixi\")","category":"page"},{"location":"","page":"Home","title":"Home","text":"to the latest release. If the installed version does not match the current release, please check the Troubleshooting section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The commands above can also be used to update Trixi.jl. A brief list of notable changes to Trixi.jl is available in NEWS.md.","category":"page"},{"location":"#for-developers","page":"Home","title":"For developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you plan on editing Trixi.jl itself, you can download Trixi.jl to a local folder and use the code from the cloned directory:","category":"page"},{"location":"","page":"Home","title":"Home","text":"git clone git@github.com:trixi-framework/Trixi.jl.git\ncd Trixi.jl\nmkdir run\ncd run\njulia --project=. -e 'using Pkg; Pkg.develop(PackageSpec(path=\"..\"))'","category":"page"},{"location":"","page":"Home","title":"Home","text":"If you installed Trixi.jl this way, you always have to start Julia with the --project flag set to your run directory, e.g.,","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia --project=.","category":"page"},{"location":"","page":"Home","title":"Home","text":"if already inside the run directory.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The advantage of using a separate run directory is that you can also add other related packages (see below, e.g., for time integration or visualization) to the project in the run folder and always have a reproducible environment at hand to share with others.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Since the postprocessing tool Trixi2Vtk.jl typically does not need to be modified, it is recommended to install it as a normal package. Likewise, you can install OrdinaryDiffEq.jl and Plots.jl as ordinary packages. To achieve this, use the following REPL commands:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Pkg\n\njulia> Pkg.add([\"OrdinaryDiffEq\", \"Trixi2Vtk\", \"Plots\"])","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note that the postprocessing tools Trixi2Vtk.jl and Plots.jl are optional and can be omitted.","category":"page"},{"location":"#Example:-Installing-Trixi.jl-as-a-package","page":"Home","title":"Example: Installing Trixi.jl as a package","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":" ","category":"page"},{"location":"","page":"Home","title":"Home","text":"Please note that the playback speed is set to 3x, thus the entire installation procedure lasts around 45 seconds in real time (depending on the performance of your computer and on how many dependencies had already been installed before).","category":"page"},{"location":"#Usage","page":"Home","title":"Usage","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"In the Julia REPL, first load the package Trixi.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Trixi","category":"page"},{"location":"","page":"Home","title":"Home","text":"Then start a simulation by executing","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> trixi_include(default_example())","category":"page"},{"location":"","page":"Home","title":"Home","text":"Please be patient since Julia will compile the code just before running it. To visualize the results, load the package Plots","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Plots","category":"page"},{"location":"","page":"Home","title":"Home","text":"and generate a heatmap plot of the results with","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> plot(sol) # No trailing semicolon, otherwise no plot is shown","category":"page"},{"location":"","page":"Home","title":"Home","text":"This will open a new window with a 2D visualization of the final solution:","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: image)","category":"page"},{"location":"","page":"Home","title":"Home","text":"The method trixi_include(...) expects a single string argument with the path to a Trixi.jl elixir, i.e., a text file containing Julia code necessary to set up and run a simulation. To quickly see Trixi.jl in action, default_example() returns the path to an example elixir with a short, two-dimensional problem setup. A list of all example elixirs packaged with Trixi.jl can be obtained by running get_examples(). Alternatively, you can also browse the examples/ subdirectory. If you want to modify one of the elixirs to set up your own simulation, download it to your machine, edit the configuration, and pass the file path to trixi_include(...).","category":"page"},{"location":"#Example:-Running-a-simulation-with-Trixi.jl","page":"Home","title":"Example: Running a simulation with Trixi.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":" ","category":"page"},{"location":"","page":"Home","title":"Home","text":"If this produces weird symbols or question marks in the terminal on your system, you are probably using Mac OS with problematic fonts. In that case, please check the Troubleshooting section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note on performance: Julia uses just-in-time compilation to transform its source code to native, optimized machine code at the time of execution and caches the compiled methods for further use. That means that the first execution of a Julia method is typically slow, with subsequent runs being much faster. For instance, in the example above the first execution of trixi_include takes about 20 seconds, while subsequent runs require less than 60 milliseconds.","category":"page"},{"location":"#Performing-a-convergence-analysis","page":"Home","title":"Performing a convergence analysis","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"To automatically determine the experimental order of convergence (EOC) for a given setup, execute","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> convergence_test(default_example(), 4)","category":"page"},{"location":"","page":"Home","title":"Home","text":"This will run a convergence test with the elixir default_example(), using four iterations with different initial refinement levels. The initial iteration will use the elixir unchanged, while for each subsequent iteration the initial_refinement_level parameter is incremented by one. Finally, the measured l^2 and l^infty errors and the determined EOCs will be displayed like this:","category":"page"},{"location":"","page":"Home","title":"Home","text":"[...]\nl2\nscalar\nerror EOC\n9.14e-06 -\n5.69e-07 4.01\n3.55e-08 4.00\n2.22e-09 4.00\n\nmean 4.00\n--------------------------------------------------------------------------------\nlinf\nscalar\nerror EOC\n6.44e-05 -\n4.11e-06 3.97\n2.58e-07 3.99\n1.62e-08 4.00\n\nmean 3.99\n--------------------------------------------------------------------------------","category":"page"},{"location":"","page":"Home","title":"Home","text":"An example with multiple variables looks like this:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> convergence_test(joinpath(examples_dir(), \"tree_2d_dgsem\", \"elixir_euler_source_terms.jl\"), 3)","category":"page"},{"location":"","page":"Home","title":"Home","text":"[...]\nl2\nrho rho_v1 rho_v2 rho_e\nerror EOC error EOC error EOC error EOC\n9.32e-07 - 1.42e-06 - 1.42e-06 - 4.82e-06 -\n7.03e-08 3.73 9.53e-08 3.90 9.53e-08 3.90 3.30e-07 3.87\n4.65e-09 3.92 6.09e-09 3.97 6.09e-09 3.97 2.12e-08 3.96\n\nmean 3.82 mean 3.93 mean 3.93 mean 3.91\n--------------------------------------------------------------------------------\nlinf\nrho rho_v1 rho_v2 rho_e\nerror EOC error EOC error EOC error EOC\n9.58e-06 - 1.17e-05 - 1.17e-05 - 4.89e-05 -\n6.23e-07 3.94 7.48e-07 3.97 7.48e-07 3.97 3.22e-06 3.92\n4.05e-08 3.94 4.97e-08 3.91 4.97e-08 3.91 2.10e-07 3.94\n\nmean 3.94 mean 3.94 mean 3.94 mean 3.93\n--------------------------------------------------------------------------------","category":"page"},{"location":"#Showcase-of-advanced-features","page":"Home","title":"Showcase of advanced features","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The presentation From Mesh Generation to Adaptive Simulation: A Journey in Julia, originally given as part of JuliaCon 2022, outlines how to use Trixi.jl for an adaptive simulation of the compressible Euler equations in two spatial dimensions on a complex domain. More details as well as code to run the simulation presented can be found at the reproducibility repository for the presentation.","category":"page"},{"location":"#Referencing","page":"Home","title":"Referencing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use Trixi.jl in your own research or write a paper using results obtained with the help of Trixi.jl, please cite the following articles:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{ranocha2022adaptive,\n title={Adaptive numerical simulations with {T}rixi.jl:\n {A} case study of {J}ulia for scientific computing},\n author={Ranocha, Hendrik and Schlottke-Lakemper, Michael and Winters, Andrew Ross\n and Faulhaber, Erik and Chan, Jesse and Gassner, Gregor},\n journal={Proceedings of the JuliaCon Conferences},\n volume={1},\n number={1},\n pages={77},\n year={2022},\n doi={10.21105/jcon.00077},\n eprint={2108.06476},\n eprinttype={arXiv},\n eprintclass={cs.MS}\n}\n\n@article{schlottkelakemper2021purely,\n title={A purely hyperbolic discontinuous {G}alerkin approach for\n self-gravitating gas dynamics},\n author={Schlottke-Lakemper, Michael and Winters, Andrew R and\n Ranocha, Hendrik and Gassner, Gregor J},\n journal={Journal of Computational Physics},\n pages={110467},\n year={2021},\n month={06},\n volume={442},\n publisher={Elsevier},\n doi={10.1016/j.jcp.2021.110467},\n eprint={2008.10593},\n eprinttype={arXiv},\n eprintclass={math.NA}\n}","category":"page"},{"location":"","page":"Home","title":"Home","text":"In addition, you can also refer to Trixi.jl directly as","category":"page"},{"location":"","page":"Home","title":"Home","text":"@misc{schlottkelakemper2020trixi,\n title={{T}rixi.jl: {A}daptive high-order numerical simulations\n of hyperbolic {PDE}s in {J}ulia},\n author={Schlottke-Lakemper, Michael and Gassner, Gregor J and\n Ranocha, Hendrik and Winters, Andrew R and Chan, Jesse},\n year={2021},\n month={09},\n howpublished={\\url{https://github.com/trixi-framework/Trixi.jl}},\n doi={10.5281/zenodo.3996439}\n}","category":"page"},{"location":"#authors-index-md","page":"Home","title":"Authors","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl was initiated by Michael Schlottke-Lakemper (RWTH Aachen University/High-Performance Computing Center Stuttgart (HLRS), Germany) and Gregor Gassner (University of Cologne, Germany). Together with Hendrik Ranocha (Johannes Gutenberg University Mainz, Germany) and Andrew Winters (Linköping University, Sweden), and Jesse Chan (Rice University, US), they are the principal developers of Trixi.jl. The full list of contributors can be found under Authors.","category":"page"},{"location":"#License-and-contributing","page":"Home","title":"License and contributing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl is licensed under the MIT license (see License). Since Trixi.jl is an open-source project, we are very happy to accept contributions from the community. Please refer to Contributing for more details. Note that we strive to be a friendly, inclusive open-source community and ask all members of our community to adhere to our Code of Conduct. To get in touch with the developers, join us on Slack or create an issue.","category":"page"},{"location":"#Acknowledgments","page":"Home","title":"Acknowledgments","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"
\n
\n
\n
\n
\n
\n
\n
","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) through the following grants:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Excellence Strategy EXC 2044-390685587, Mathematics Münster: Dynamics-Geometry-Structure.\nResearch unit FOR 5409 \"Structure-Preserving Numerical Methods for Bulk- and Interface Coupling of Heterogeneous Models (SNuBIC)\" (project number 463312734).\nIndividual grant no. 528753982.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from the European Research Council through the ERC Starting Grant \"An Exascale aware and Un-crashable Space-Time-Adaptive Discontinuous Spectral Element Solver for Non-Linear Conservation Laws\" (Extreme), ERC grant agreement no. 714487.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from Vetenskapsrådet (VR, Swedish Research Council), Sweden through the VR Starting Grant \"Shallow water flows including sediment transport and morphodynamics\", VR grant agreement 2020-03642 VR.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from the United States National Science Foundation (NSF) under awards DMS-1719818 and DMS-1943186.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from the German Federal Ministry of Education and Research (BMBF) through the project grant \"Adaptive earth system modeling with significantly reduced computation time for exascale supercomputers (ADAPTEX)\" (funding id: 16ME0668K).","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding by the Daimler und Benz Stiftung (Daimler and Benz Foundation) through grant no. 32-10/22.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl is supported by NumFOCUS as an Affiliated Project.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"EditURL = \"../../literate/src/files/adding_nonconservative_equation.jl\"","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#adding_nonconservative_equation","page":"9 Adding a non-conservative equation","title":"9: Adding a non-conservative equation","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"If you want to use Trixi.jl for your own research, you might be interested in a new physics model that is not present in Trixi.jl. In this tutorial, we will implement the nonconservative linear advection equation in a periodic domain","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"left\nbeginalignedpartial_t u(tx) + a(x) partial_x u(tx) = 0 \nu(0x)=sin(x) \nu(t-pi)=u(tpi)\nendaligned\nright","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"where a(x) = 2 + cos(x). The analytic solution is","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"u(tx)=-sin left(2 tan ^-1left(sqrt3 tan left(fracsqrt3 t2-tan ^-1left(frac1sqrt3tan left(fracx2right)right)right)right)right)","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"In Trixi.jl, such a mathematical model is encoded as a subtype of Trixi.AbstractEquations.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#Basic-setup","page":"9 Adding a non-conservative equation","title":"Basic setup","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"Since there is no native support for variable coefficients, we need to transform the PDE to the following system:","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"left\nbeginalignedpartial_t beginpmatrixu(tx)a(tx) endpmatrix +beginpmatrix a(tx) partial_x u(tx) 0 endpmatrix = 0 \nu(0x)=sin(x) \na(0x)=2+cos(x) \nu(t-pi)=u(tpi)\nendaligned\nright","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"# Define new physics\nusing Trixi\nusing Trixi: AbstractEquations, get_node_vars\nimport Trixi: varnames, default_analysis_integrals, flux, max_abs_speed_naive,\n have_nonconservative_terms\n\n# Since there is no native support for variable coefficients, we use two\n# variables: one for the basic unknown `u` and another one for the coefficient `a`\nstruct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,\n 2 #= two variables (u,a) =#}\nend\n\nvarnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = (\"scalar\", \"advection_velocity\")\n\ndefault_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()\n\n\n# The conservative part of the flux is zero\nflux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)\n\n# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation\nfunction max_abs_speed_naive(u_ll, u_rr, orientation::Integer, ::NonconservativeLinearAdvectionEquation)\n _, advection_velocity_ll = u_ll\n _, advection_velocity_rr = u_rr\n\n return max(abs(advection_velocity_ll), abs(advection_velocity_rr))\nend\n\n\n# We use nonconservative terms\nhave_nonconservative_terms(::NonconservativeLinearAdvectionEquation) = Trixi.True()\n\n# This \"nonconservative numerical flux\" implements the nonconservative terms.\n# In general, nonconservative terms can be written in the form\n# g(u) ∂ₓ h(u)\n# Thus, a discrete difference approximation of this nonconservative term needs\n# - `u mine`: the value of `u` at the current position (for g(u))\n# - `u_other`: the values of `u` in a neighborhood of the current position (for ∂ₓ h(u))\nfunction flux_nonconservative(u_mine, u_other, orientation,\n equations::NonconservativeLinearAdvectionEquation)\n _, advection_velocity = u_mine\n scalar, _ = u_other\n\n return SVector(advection_velocity * scalar, zero(scalar))\nend","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"The implementation of nonconservative terms uses a single \"nonconservative flux\" function flux_nonconservative. It will basically be applied in a loop of the form","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"du_m(D, u) = sum(D[m, l] * flux_nonconservative(u[m], u[l], 1, equations)) # orientation 1: x","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"where D is the derivative matrix and u contains the nodal solution values.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"Now, we can run a simple simulation using a DGSEM discretization.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"# Create a simulation setup\nusing Trixi\nusing OrdinaryDiffEq\n\nequation = NonconservativeLinearAdvectionEquation()\n\n# You can derive the exact solution for this setup using the method of\n# characteristics\nfunction initial_condition_sine(x, t, equation::NonconservativeLinearAdvectionEquation)\n x0 = -2 * atan(sqrt(3) * tan(sqrt(3) / 2 * t - atan(tan(x[1] / 2) / sqrt(3))))\n scalar = sin(x0)\n advection_velocity = 2 + cos(x[1])\n SVector(scalar, advection_velocity)\nend\n\n# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries\nmesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates\n initial_refinement_level=4, n_cells_max=10^4)\n\n# Create a DGSEM solver with polynomials of degree `polydeg`\n# Remember to pass a tuple of the form `(conservative_flux, nonconservative_flux)`\n# as `surface_flux` and `volume_flux` when working with nonconservative terms\nvolume_flux = (flux_central, flux_nonconservative)\nsurface_flux = (flux_lax_friedrichs, flux_nonconservative)\nsolver = DGSEM(polydeg=3, surface_flux=surface_flux,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\n# Setup the spatial semidiscretization containing all ingredients\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\n# Create an ODE problem with given time span\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan)\n\n# Set up some standard callbacks summarizing the simulation setup and computing\n# errors of the numerical solution\nsummary_callback = SummaryCallback()\nanalysis_callback = AnalysisCallback(semi, interval=50)\ncallbacks = CallbackSet(summary_callback, analysis_callback)\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes\n# the passed callbacks\nsol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n save_everystep=false, callback=callbacks)\n\n# Print the timer summary\nsummary_callback()\n\n# Plot the numerical solution at the final time\nusing Plots: plot\nplot(sol)","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"You see a plot of the final solution.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"We can check whether everything fits together by refining the grid and comparing the numerical errors. First, we look at the error using the grid resolution above.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"error_1 = analysis_callback(sol).l2 |> first","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"Next, we increase the grid resolution by one refinement level and run the simulation again.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"mesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates\n initial_refinement_level=5, n_cells_max=10^4)\n\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan);\n\nsummary_callback = SummaryCallback()\nanalysis_callback = AnalysisCallback(semi, interval=50)\ncallbacks = CallbackSet(summary_callback, analysis_callback);\n\nsol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n save_everystep=false, callback=callbacks);\nsummary_callback()\n\nerror_2 = analysis_callback(sol).l2 |> first","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"error_1 / error_2","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"As expected, the new error is roughly reduced by a factor of 16, corresponding to an experimental order of convergence of 4 (for polynomials of degree 3).","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#Summary-of-the-code","page":"9 Adding a non-conservative equation","title":"Summary of the code","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"Here is the complete code that we used (without the callbacks since these create a lot of unnecessary output in the doctests of this tutorial). In addition, we create the struct inside the new module NonconservativeLinearAdvection. That ensures that we can re-create structs defined therein without having to restart Julia.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"Define new physics","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"module NonconservativeLinearAdvection\n\nusing Trixi\nusing Trixi: AbstractEquations, get_node_vars\nimport Trixi: varnames, default_analysis_integrals, flux, max_abs_speed_naive,\n have_nonconservative_terms\n\n# Since there is not yet native support for variable coefficients, we use two\n# variables: one for the basic unknown `u` and another one for the coefficient `a`\nstruct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,\n 2 #= two variables (u,a) =#}\nend\n\nvarnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = (\"scalar\", \"advection_velocity\")\n\ndefault_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()\n\n\n# The conservative part of the flux is zero\nflux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)\n\n# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation\nfunction max_abs_speed_naive(u_ll, u_rr, orientation::Integer, ::NonconservativeLinearAdvectionEquation)\n _, advection_velocity_ll = u_ll\n _, advection_velocity_rr = u_rr\n\n return max(abs(advection_velocity_ll), abs(advection_velocity_rr))\nend\n\n\n# We use nonconservative terms\nhave_nonconservative_terms(::NonconservativeLinearAdvectionEquation) = Trixi.True()\n\n# This \"nonconservative numerical flux\" implements the nonconservative terms.\n# In general, nonconservative terms can be written in the form\n# g(u) ∂ₓ h(u)\n# Thus, a discrete difference approximation of this nonconservative term needs\n# - `u mine`: the value of `u` at the current position (for g(u))\n# - `u_other`: the values of `u` in a neighborhood of the current position (for ∂ₓ h(u))\nfunction flux_nonconservative(u_mine, u_other, orientation,\n equations::NonconservativeLinearAdvectionEquation)\n _, advection_velocity = u_mine\n scalar, _ = u_other\n\n return SVector(advection_velocity * scalar, zero(scalar))\nend\n\nend # module\n\n\n\n# Create a simulation setup\nimport .NonconservativeLinearAdvection\nusing Trixi\nusing OrdinaryDiffEq\n\nequation = NonconservativeLinearAdvection.NonconservativeLinearAdvectionEquation()\n\n# You can derive the exact solution for this setup using the method of\n# characteristics\nfunction initial_condition_sine(x, t, equation::NonconservativeLinearAdvection.NonconservativeLinearAdvectionEquation)\n x0 = -2 * atan(sqrt(3) * tan(sqrt(3) / 2 * t - atan(tan(x[1] / 2) / sqrt(3))))\n scalar = sin(x0)\n advection_velocity = 2 + cos(x[1])\n SVector(scalar, advection_velocity)\nend\n\n# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries\nmesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates\n initial_refinement_level=4, n_cells_max=10^4)\n\n# Create a DGSEM solver with polynomials of degree `polydeg`\n# Remember to pass a tuple of the form `(conservative_flux, nonconservative_flux)`\n# as `surface_flux` and `volume_flux` when working with nonconservative terms\nvolume_flux = (flux_central, NonconservativeLinearAdvection.flux_nonconservative)\nsurface_flux = (flux_lax_friedrichs, NonconservativeLinearAdvection.flux_nonconservative)\nsolver = DGSEM(polydeg=3, surface_flux=surface_flux,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\n# Setup the spatial semidiscretization containing all ingredients\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\n# Create an ODE problem with given time span\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan);\n\n# Set up some standard callbacks summarizing the simulation setup and computing\n# errors of the numerical solution\nsummary_callback = SummaryCallback()\nanalysis_callback = AnalysisCallback(semi, interval=50)\ncallbacks = CallbackSet(summary_callback, analysis_callback);\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes\n# the passed callbacks\nsol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n save_everystep=false);\n\n# Plot the numerical solution at the final time\nusing Plots: plot\nplot(sol);\nnothing #hide","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#Package-versions","page":"9 Adding a non-conservative equation","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"9 Adding a non-conservative equation","title":"9 Adding a non-conservative equation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"EditURL = \"../../literate/src/files/differentiable_programming.jl\"","category":"page"},{"location":"tutorials/differentiable_programming/#differentiable_programming","page":"16 Differentiable programming","title":"16: Differentiable programming","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Julia and its ecosystem provide some tools for differentiable programming. Trixi.jl is designed to be flexible, extendable, and composable with Julia's growing ecosystem for scientific computing and machine learning. Thus, the ultimate goal is to have fast implementations that allow automatic differentiation (AD) without too much hassle for users. If some parts do not meet these requirements, please feel free to open an issue or propose a fix in a PR.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"In the following, we will walk through some examples demonstrating how to differentiate through Trixi.jl.","category":"page"},{"location":"tutorials/differentiable_programming/#Forward-mode-automatic-differentiation","page":"16 Differentiable programming","title":"Forward mode automatic differentiation","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Trixi.jl integrates well with ForwardDiff.jl for forward mode AD.","category":"page"},{"location":"tutorials/differentiable_programming/#Computing-the-Jacobian","page":"16 Differentiable programming","title":"Computing the Jacobian","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"The high-level interface to compute the Jacobian this way is jacobian_ad_forward. First, we load the required packages and compute the Jacobian of a semidiscretization of the compressible Euler equations, a system of nonlinear conservation laws.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"using Trixi, LinearAlgebra, Plots\n\nequations = CompressibleEulerEquations2D(1.4)\n\nsolver = DGSEM(3, flux_central)\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi);\nsize(J)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Next, we compute the eigenvalues of the Jacobian.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"λ = eigvals(J)\nscatter(real.(λ), imag.(λ), label=\"central flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"As you can see here, the maximal real part is close to zero.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Interestingly, if we add dissipation by switching to the flux_lax_friedrichs at the interfaces, the maximal real part of the eigenvalues increases.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"solver = DGSEM(3, flux_lax_friedrichs)\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi)\nλ = eigvals(J)\n\nscatter!(real.(λ), imag.(λ), label=\"Lax-Friedrichs flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Although the maximal real part is still somewhat small, it's larger than for the purely central discretization.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"However, we should be careful when using this analysis, since the eigenvectors are not necessarily well-conditioned.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"λ, V = eigen(J)\ncondition_number = cond(V)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"In one space dimension, the situation is a bit different.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"equations = CompressibleEulerEquations1D(1.4)\n\nsolver = DGSEM(3, flux_central)\nmesh = TreeMesh((-1.0,), (1.0,), initial_refinement_level=6, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi)\n\nλ = eigvals(J)\n\nscatter(real.(λ), imag.(λ), label=\"central flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Here, the maximal real part is basically zero to machine accuracy.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Moreover, the eigenvectors are not as ill-conditioned as in 2D.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"λ, V = eigen(J)\ncondition_number = cond(V)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"If we add dissipation, the maximal real part is still approximately zero.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"solver = DGSEM(3, flux_lax_friedrichs)\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi)\nλ = eigvals(J)\n\nscatter!(real.(λ), imag.(λ), label=\"Lax-Friedrichs flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"As you can see from the plot generated above, the maximal real part is still basically zero to machine precision.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Let's check the condition number of the eigenvectors.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"λ, V = eigen(J)\n\ncondition_number = cond(V)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Note that the condition number of the eigenvector matrix increases but is still smaller than for the example in 2D.","category":"page"},{"location":"tutorials/differentiable_programming/#Computing-other-derivatives","page":"16 Differentiable programming","title":"Computing other derivatives","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"It is also possible to compute derivatives of other dependencies using AD in Trixi.jl. For example, you can compute the gradient of an entropy-dissipative semidiscretization with respect to the ideal gas constant of the compressible Euler equations as described in the following. This example is also available as the elixir examples/special_elixirs/elixir_euler_ad.jl","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"First, we create a semidiscretization of the compressible Euler equations.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"using Trixi, LinearAlgebra, ForwardDiff\n\nequations = CompressibleEulerEquations2D(1.4)\n\n\"\"\"\n initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)\n\nThe classical isentropic vortex test case of\n- Chi-Wang Shu (1997)\n Essentially Non-Oscillatory and Weighted Essentially Non-Oscillatory\n Schemes for Hyperbolic Conservation Laws\n [NASA/CR-97-206253](https://ntrs.nasa.gov/citations/19980007543)\n\"\"\"\nfunction initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)\n inicenter = SVector(0.0, 0.0) # initial center of the vortex\n iniamplitude = 5.0 # size and strength of the vortex\n\n rho = 1.0 # base flow\n v1 = 1.0\n v2 = 1.0\n vel = SVector(v1, v2)\n p = 25.0\n\n rt = p / rho # ideal gas equation\n t_loc = 0.0\n\n cent = inicenter + vel*t_loc # shift advection of center to handle periodic BC, but only for v1 = v2 = 1.0\n cent = x - cent # distance to center point\n cent = SVector(-cent[2], cent[1])\n\n r2 = cent[1]^2 + cent[2]^2\n du = iniamplitude / (2*π) * exp(0.5 * (1 - r2)) # vel. perturbation\n dtemp = -(equations.gamma - 1) / (2 * equations.gamma * rt) * du^2 # isentropic\n\n rho = rho * (1 + dtemp)^(1 / (equations.gamma - 1))\n vel = vel + du * cent\n v1, v2 = vel\n p = p * (1 + dtemp)^(equations.gamma / (equations.gamma - 1))\n\n prim = SVector(rho, v1, v2, p)\n return prim2cons(prim, equations)\nend\n\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsolver = DGSEM(3, flux_lax_friedrichs, VolumeIntegralFluxDifferencing(flux_ranocha))\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_isentropic_vortex, solver)\n\nu0_ode = Trixi.compute_coefficients(0.0, semi)\nsize(u0_ode)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Next, we compute the Jacobian using ForwardDiff.jacobian.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"J = ForwardDiff.jacobian((du_ode, γ) -> begin\n equations_inner = CompressibleEulerEquations2D(first(γ))\n semi_inner = Trixi.remake(semi, equations=equations_inner, uEltype=eltype(γ))\n Trixi.rhs!(du_ode, u0_ode, semi_inner, 0.0)\nend, similar(u0_ode), [1.4]); # γ needs to be an `AbstractArray`\n\nround.(extrema(J), sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Note that we create a semidiscretization semi at first to determine the state u0_ode around which we want to perform the linearization. Next, we wrap the RHS evaluation inside a closure and pass that to ForwardDiff.jacobian. There, we need to make sure that the internal caches are able to store dual numbers from ForwardDiff.jl by setting uEltype appropriately. A similar approach is used by jacobian_ad_forward.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Note that the ideal gas constant does not influence the semidiscrete rate of change of the density, as demonstrated by","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"norm(J[1:4:end])","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Here, we used some knowledge about the internal memory layout of Trixi.jl, an array of structs with the conserved variables as fastest-varying index in memory.","category":"page"},{"location":"tutorials/differentiable_programming/#Differentiating-through-a-complete-simulation","page":"16 Differentiable programming","title":"Differentiating through a complete simulation","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"It is also possible to differentiate through a complete simulation. As an example, let's differentiate the total energy of a simulation using the linear scalar advection equation with respect to the wave number (frequency) of the initial data.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"using Trixi, OrdinaryDiffEq, ForwardDiff, Plots\n\nfunction energy_at_final_time(k) # k is the wave number of the initial condition\n equations = LinearScalarAdvectionEquation2D(1.0, -0.3)\n mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)\n solver = DGSEM(3, flux_lax_friedrichs)\n initial_condition = (x, t, equation) -> begin\n x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)\n return SVector(sinpi(k * sum(x_trans)))\n end\n semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n uEltype=typeof(k))\n ode = semidiscretize(semi, (0.0, 1.0))\n sol = solve(ode, BS3(), save_everystep=false)\n Trixi.integrate(energy_total, sol.u[end], semi)\nend\n\nk_values = range(0.9, 1.1, length=101)\n\nplot(k_values, energy_at_final_time.(k_values), label=\"Energy\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"You see a plot of a curve that resembles a parabola with local maximum around k = 1.0. Why's that? Well, the domain is fixed but the wave number changes. Thus, if the wave number is not chosen as an integer, the initial condition will not be a smooth periodic function in the given domain. Hence, the dissipative surface flux (flux_lax_friedrichs in this example) will introduce more dissipation. In particular, it will introduce more dissipation for \"less smooth\" initial data, corresponding to wave numbers k further away from integers.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"We can compute the discrete derivative of the energy at the final time with respect to the wave number k as follows.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"round(ForwardDiff.derivative(energy_at_final_time, 1.0), sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"This is rather small and we can treat it as zero in comparison to the value of this derivative at other wave numbers k.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"dk_values = ForwardDiff.derivative.((energy_at_final_time,), k_values);\n\nplot(k_values, dk_values, label=\"Derivative\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"If you remember basic calculus, a sufficient condition for a local maximum is that the first derivative vanishes and the second derivative is negative. We can also check this discretely.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"second_derivative = round(ForwardDiff.derivative(\n k -> Trixi.ForwardDiff.derivative(energy_at_final_time, k), 1.0),\n sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Having seen this application, let's break down what happens step by step.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"function energy_at_final_time(k) # k is the wave number of the initial condition\n equations = LinearScalarAdvectionEquation2D(1.0, -0.3)\n mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)\n solver = DGSEM(3, flux_lax_friedrichs)\n initial_condition = (x, t, equation) -> begin\n x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)\n return SVector(sinpi(k * sum(x_trans)))\n end\n semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n uEltype=typeof(k))\n ode = semidiscretize(semi, (0.0, 1.0))\n sol = solve(ode, BS3(), save_everystep=false)\n Trixi.integrate(energy_total, sol.u[end], semi)\nend\n\nk = 1.0\nround(ForwardDiff.derivative(energy_at_final_time, k), sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"When calling ForwardDiff.derivative(energy_at_final_time, k) with k=1.0, ForwardDiff.jl will basically use the chain rule and known derivatives of existing basic functions to calculate the derivative of the energy at the final time with respect to the wave number k at k0 = 1.0. To do this, ForwardDiff.jl uses dual numbers, which basically store the result and its derivative w.r.t. a specified parameter at the same time. Thus, we need to make sure that we can treat these ForwardDiff.Dual numbers everywhere during the computation. Fortunately, generic Julia code usually supports these operations. The most basic problem for a developer is to ensure that all types are generic enough, in particular the ones of internal caches.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"The first step in this example creates some basic ingredients of our simulation.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"equations = LinearScalarAdvectionEquation2D(1.0, -0.3)\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)\nsolver = DGSEM(3, flux_lax_friedrichs);\nnothing #hide","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"These do not have internal caches storing intermediate values of the numerical solution, so we do not need to adapt them. In fact, we could also define them outside of energy_at_final_time (but would need to take care of globals or wrap everything in another function).","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Next, we define the initial condition","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"initial_condition = (x, t, equation) -> begin\n x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)\n return SVector(sinpi(k * sum(x_trans)))\nend;\nnothing #hide","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"as a closure capturing the wave number k passed to energy_at_final_time. If you call energy_at_final_time(1.0), k will be a Float64. Thus, the return values of initial_condition will be SVectors of Float64s. When calculating the ForwardDiff.derivative, k will be a ForwardDiff.Dual number. Hence, the initial_condition will return SVectors of ForwardDiff.Dual numbers.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"The semidiscretization semi uses some internal caches to avoid repeated allocations and speed up the computations, e.g. for numerical fluxes at interfaces. Thus, we need to tell Trixi.jl to allow ForwardDiff.Dual numbers in these caches. That's what the keyword argument uEltype=typeof(k) in","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n uEltype=typeof(k));\nnothing #hide","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"does. This is basically the only part where you need to modify your standard Trixi.jl code to enable automatic differentiation. From there on, the remaining steps","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"ode = semidiscretize(semi, (0.0, 1.0))\nsol = solve(ode, BS3(), save_everystep=false)\nround(Trixi.integrate(energy_total, sol.u[end], semi), sigdigits=5)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"do not need any modifications since they are sufficiently generic (and enough effort has been spend to allow general types inside these calls).","category":"page"},{"location":"tutorials/differentiable_programming/#Propagating-errors-using-Measurements.jl","page":"16 Differentiable programming","title":"Propagating errors using Measurements.jl","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"(Image: Error bars by Randall Munroe) \"Error bars\" by Randall Munroe, linked from https://xkcd.com/2110","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Similar to AD, Trixi.jl also allows propagating uncertainties using linear error propagation theory via Measurements.jl. As an example, let's create a system representing the linear advection equation in 1D with an uncertain velocity. Then, we create a semidiscretization using a sine wave as initial condition, solve the ODE, and plot the resulting uncertainties in the primitive variables.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"using Trixi, OrdinaryDiffEq, Measurements, Plots, LaTeXStrings\n\nequations = LinearScalarAdvectionEquation1D(1.0 ± 0.1)\n\nmesh = TreeMesh((-1.0,), (1.0,), n_cells_max=10^5, initial_refinement_level=5)\n\nsolver = DGSEM(3)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test,\n solver, uEltype=Measurement{Float64})\n\node = semidiscretize(semi, (0.0, 1.5))\n\nsol = solve(ode, BS3(), save_everystep=false);\n\nplot(sol)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"You should see a plot where small error bars are shown around the extrema and larger error bars are shown in the remaining parts. This result is in accordance with expectations. Indeed, the uncertain propagation speed will affect the extrema less since the local variation of the solution is relatively small there. In contrast, the local variation of the solution is large around the turning points of the sine wave, so the uncertainties will be relatively large there.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"All this is possible due to allowing generic types and having good abstractions in Julia that allow packages to work together seamlessly.","category":"page"},{"location":"tutorials/differentiable_programming/#Finite-difference-approximations","page":"16 Differentiable programming","title":"Finite difference approximations","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Trixi.jl provides the convenience function jacobian_fd to approximate the Jacobian via central finite differences.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"using Trixi, LinearAlgebra\n\nequations = CompressibleEulerEquations2D(1.4)\n\nsolver = DGSEM(3, flux_central)\n\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ_fd = jacobian_fd(semi)\n\nJ_ad = jacobian_ad_forward(semi)\n\nrelative_difference = norm(J_fd - J_ad) / size(J_fd, 1)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"This discrepancy is of the expected order of magnitude for central finite difference approximations.","category":"page"},{"location":"tutorials/differentiable_programming/#Linear-systems","page":"16 Differentiable programming","title":"Linear systems","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"When a linear PDE is discretized using a linear scheme such as a standard DG method, the resulting semidiscretization yields an affine ODE of the form","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"partial_t u(t) = A u(t) + b","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"where A is a linear operator (\"matrix\") and b is a vector. Trixi.jl allows you to obtain this linear structure in a matrix-free way by using linear_structure. The resulting operator A can be used in multiplication, e.g. mul! from LinearAlgebra, converted to a sparse matrix using sparse from SparseArrays, or converted to a dense matrix using Matrix for detailed eigenvalue analyses. For example,","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"using Trixi, LinearAlgebra, Plots\n\nequations = LinearScalarAdvectionEquation2D(1.0, -0.3)\n\nsolver = DGSEM(3, flux_lax_friedrichs)\n\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, solver)\n\nA, b = linear_structure(semi)\n\nsize(A), size(b)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"Next, we compute the eigenvalues of the linear operator.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"λ = eigvals(Matrix(A))\n\nscatter(real.(λ), imag.(λ))","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"As you can see here, the maximal real part is close to machine precision.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"λ = eigvals(Matrix(A))\nrelative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/#Package-versions","page":"16 Differentiable programming","title":"Package versions","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\", \"ForwardDiff\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"","category":"page"},{"location":"tutorials/differentiable_programming/","page":"16 Differentiable programming","title":"16 Differentiable programming","text":"This page was generated using Literate.jl.","category":"page"},{"location":"meshes/tree_mesh/#Tree-mesh","page":"Tree mesh","title":"Tree mesh","text":"","category":"section"},{"location":"meshes/tree_mesh/","page":"Tree mesh","title":"Tree mesh","text":"The TreeMesh is a Cartesian, h-non-conforming mesh type used in many parts of Trixi.jl. Often, the support for this mesh type is developed best since it was the first mesh type in Trixi.jl, and it is available in one, two, and three space dimensions.","category":"page"},{"location":"meshes/tree_mesh/","page":"Tree mesh","title":"Tree mesh","text":"It is limited to hypercube domains but supports AMR via the AMRCallback. Due to its Cartesian nature, (numerical) fluxes need to implement methods dispatching on the orientation::Integer as described in the conventions.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Unstructured-quadrilateral-mesh","page":"Unstructured mesh","title":"Unstructured quadrilateral mesh","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The UnstructuredMesh2D is an unstructured, curvilinear, conforming mesh type in two space dimensions.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Next, we describe the conventions taken in the implementation for two-dimensional unstructured quadrilateral meshes. Principally, this relates to how a file with the extension .mesh encodes information about the numbering and orientation of elements in an unstructured quadrilateral mesh with possibly curved boundaries.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We use the following unstructured mesh with three elements for this discussion:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"(Image: example-mesh)","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Further, a simulation using Trixi.jl on this example unstructured mesh is provided in examples/unstructured_2d_dgsem/elixir_euler_basic.jl.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Mesh-file-header","page":"Unstructured mesh","title":"Mesh file header","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The first two lines of the mesh file lists the mesh file type as well as the total number of corners, surfaces, elements, and the polynomial degree that the mesh will use to represent any curved sides. For the example mesh these quantities are","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"ISM-V2\n 7 9 3 8","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"corresponding to seven corners, nine surfaces, and three elements. The mesh polynomial degree of eight is taken only for illustrative purposes. In practice, this mesh polynomial degree depends on the particular application for which the curved, unstructured mesh is required.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#List-of-corner-nodes","page":"Unstructured mesh","title":"List of corner nodes","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"After these global counts that prescribe information about the mesh skeleton, the mesh file give a list of the physical (x,y) coordinates of all the corners. The corner nodes are listed in the order prescribed by mesh generator. Thus, for the example mesh this node list would be","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 1.0 -1.0\n 3.0 0.0\n 1.0 1.0\n 2.0 0.0\n 0.0 0.0\n 3.0 1.0\n 3.0 -1.0","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The corner nodes are internally referenced by their position in the list above. For example, here the node at (1.0, -1.0) would have node id 1, node id 2 would be at (3.0, 0.0) etc.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#List-of-neighbor-connectivity","page":"Unstructured mesh","title":"List of neighbor connectivity","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"After the corner list comes the neighbor connectivity along each surface in the mesh. This includes local indexing and orientation information necessary to compute the coupling between elements in the mesh. In 2D each surface is defined by connecting two nodes indexed as with the numbering above. We adopt the convention that node id 1 < node id 2.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Each surface will have two neighbors where the element on the left locally as one \"walks\" from node id 1 to node id 2 is taken to be the primary element and the element locally on the right is taken to be the secondary element. If, however, there is no secondary element index, then the surface lies along a physical boundary. In this case the only available element index is considered to be primary and the secondary index is set to zero.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The final two index numbers within the neighbor information list are used to identify the local surface within each element. The first local surface index (on the primary element) will always be positive whereas the second local surface index (on the primary element) can be positive or negative. If the second local surface index is positive, then the local coordinate systems in the primary element and secondary element match, i.e., the indexing on either side runs from 1:polydeg+1. However, if the local surface index of the secondary element is negative in the mesh file, then the coordinate system in the secondary element is flipped with respect to the primary element. Therefore, care must be taken in the implementation to ensure that the primary element indexing runs from 1:polydeg+1 whereas the secondary element indexing must run in reverse from polydeg+1:-1:1. Finally, if the secondary element index is zero, then so will be the local surface index because the surface is on a physical boundary. Also, there is no flipping of coordinate indexing required at the physical boundary because only the primary element's coordinate system exists.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Three-examples:-One-along-a-physical-boundary-and-two-along-interior-surfaces.","page":"Unstructured mesh","title":"Three examples: One along a physical boundary and two along interior surfaces.","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Along edge {8} we connect node (2) to node (7) and are along a physical boundary in element 3 with the local surface index 1 and the neighbor information:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 2 7 3 0 1 0","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Along edge {1} we connect node (2) to node (4) such that the primary element is 3 with local surface index 2 and the secondary element is 2 with local surface index 1. Furthermore, we see that coordinate system in the secondary element 2 is flipped with respect to the primary element's coordinate system such that the sign of the local surface index in the secondary element flips. This gives the following neighbor information:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 2 4 3 2 2 -1","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Along edge {4} we connect node (1) to node (4) such that the primary element is 1 with local surface index 2 and the secondary element is 3 with local surface index 3. The coordinate systems in both elements match and no sign change is required on the local surface index in the secondary element:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 1 4 1 3 2 3","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We collect the complete neighbor information for the example mesh above:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 2 4 3 2 2 -1\n 3 5 1 0 4 0\n 1 5 1 0 1 0\n 1 4 1 3 2 3\n 2 6 2 0 2 0\n 1 7 3 0 4 0\n 3 6 2 0 3 0\n 2 7 3 0 1 0\n 3 4 2 1 4 -3","category":"page"},{"location":"meshes/unstructured_quad_mesh/#List-of-elements","page":"Unstructured mesh","title":"List of elements","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Each quadrilateral element in the unstructured mesh is dictated by four corner points with indexing taken from the numbering given by the corner list above. We connect a set of four corner points (starting from the bottom left) in an anti-clockwise fashion thus making the element right-handed indicated using the circular arrow in the figure above. In turn, this right-handedness defines the local surface indexing (i.e. the four local sides) and the local (xi eta) coordinate system. For example, the four corners for element 1 would be listed as","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 5 1 4 3","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The mesh file also encodes information for curved surfaces either interior to the domain (as surface {9} above) or along the physical boundaries. A set of check digits are included directly below the four corner indexes to indicate whether the local surface index (1, 2, 3, or 4) within the element is straight sided, 0, or is curved, 1. If the local surface is straight sided no additional information is necessary during the mesh file read in. But for any curved surfaces the mesh file provides (x,y) coordinate values in order to construct an interpolant of this surface with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes. This list of (x,y) data will be given in the direction of the local coordinate system.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The last piece of information provided by the mesh file are labels for the different surfaces of an element. These labels are useful to set boundary conditions along physical surfaces. The labels can be short descriptive words. The label --- indicates an internal surface where no boundary condition is required.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"As an example, the complete information for element 1 in the example mesh would be","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 5 1 4 3\n 0 0 1 1\n 1.000000000000000 1.000000000000000\n 1.024948365654583 0.934461926834452\n 1.116583018200151 0.777350964621867\n 1.295753434047077 0.606254343587194\n 1.537500000000000 0.462500000000000\n 1.768263070247418 0.329729152118310\n 1.920916981799849 0.185149035378133\n 1.986035130050921 0.054554577460044\n 2.000000000000000 0.0\n 0.0 0.0\n 0.035513826946206 0.105291711848750\n 0.148591270347399 0.317731556850611\n 0.340010713990041 0.452219430075470\n 0.575000000000000 0.462500000000000\n 0.788022294598950 0.483764065630034\n 0.926408729652601 0.644768443149389\n 0.986453164464803 0.883724792445746\n 1.000000000000000 1.000000000000000\n Slant --- --- Bezier","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"where the curved boundary information is encoded \"back to back\". That is, the first nine (x,y) nodes in the list above correspond to the interior boundary curve along local side 3 in element 1 and the next nine (x,y) nodes denote the curved physical boundary named Bezier along local side 4.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We collect the complete set of element information for the example mesh","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 5 1 4 3\n 0 0 1 1\n 1.000000000000000 1.000000000000000\n 1.024948365654583 0.934461926834452\n 1.116583018200151 0.777350964621867\n 1.295753434047077 0.606254343587194\n 1.537500000000000 0.462500000000000\n 1.768263070247418 0.329729152118310\n 1.920916981799849 0.185149035378133\n 1.986035130050921 0.054554577460044\n 2.000000000000000 0.0\n 0.0 0.0\n 0.035513826946206 0.105291711848750\n 0.148591270347399 0.317731556850611\n 0.340010713990041 0.452219430075470\n 0.575000000000000 0.462500000000000\n 0.788022294598950 0.483764065630034\n 0.926408729652601 0.644768443149389\n 0.986453164464803 0.883724792445746\n 1.000000000000000 1.000000000000000\n Slant --- --- Bezier\n 4 2 6 3\n 0 0 0 1\n 2.000000000000000 0.0\n 1.986035130050921 0.054554577460044\n 1.920916981799849 0.185149035378133\n 1.768263070247418 0.329729152118310\n 1.537500000000000 0.462500000000000\n 1.295753434047077 0.606254343587194\n 1.116583018200151 0.777350964621867\n 1.024948365654583 0.934461926834452\n 1.000000000000000 1.000000000000000\n --- Right Top ---\n 7 2 4 1\n 0 0 0 0\n Right --- --- Bottom","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Trixi.jl-on-an-unstructured-quadrilateral-mesh","page":"Unstructured mesh","title":"Trixi.jl on an unstructured quadrilateral mesh","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We provide an example simulation on an unstructured quadrilateral mesh by executing","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"julia> trixi_include(default_example_unstructured())","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Note this may download a copy of the mesh file described above for the three element unstructured mesh. This elixir provides the solution for the compressible Euler equations in two spatial dimensions for a smooth propagating wave solution. Below we provide the time evolution of the pressure wave for this example created with the Trixi2Vtk tool and visualized using ParaView.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" \n
","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"EditURL = \"../../literate/src/files/time_stepping.jl\"","category":"page"},{"location":"tutorials/time_stepping/#time_stepping","page":"15 Explicit time stepping","title":"15: Explicit time stepping","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"For the time integration, Trixi.jl uses the package OrdinaryDiffEq.jl from the SciML ecosystem. The interface to this package is the solve(...) function. It always requires an ODE problem and a time integration algorithm as input parameters.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"solve(ode, alg; kwargs...)","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"In Trixi.jl, the ODE problem is created by semidiscretize(semi, tspan) for a semidiscretization semi and the time span tspan. In particular, semidiscretize returns an ODEProblem used by OrdinaryDiffEq.jl.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"OrdinaryDiffEq.jl provides many integration algorithms, which are summarized in the documentation. Particularly interesting for Trixi.jl are their strong stability preserving (SSP) methods and low-storage methods. There are some differences regarding the choice of the used time step.","category":"page"},{"location":"tutorials/time_stepping/#adaptive_step_sizes","page":"15 Explicit time stepping","title":"Error-based adaptive step sizes","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"First, we treat time integration algorithms with adaptive step sizes, such as SSPRK43. It is used in some elixirs, like elixir_euler_colliding_flow.jl or elixir_euler_astro_jet_amr.jl.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"Other error-based adaptive integration algorithms are for instance RDPK3SpFSAL35, RDPK3Sp35, RDPK3SpFSAL49, RDPK3Sp49, RDPK3SpFSAL510, RDPK3Sp510.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"They already contain an error-based adaptive step size control and heuristics to guess a starting step size. If this heuristic fails in your case, you can specify an appropriately small initial step size as keyword argument dt=... of solve.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"If you run Trixi in parallel with MPI you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to enable MPI aware error-based adaptive step size control. These keyword arguments are also included in ode_default_options.","category":"page"},{"location":"tutorials/time_stepping/#CFL-based-step-size-control","page":"15 Explicit time stepping","title":"CFL-based step size control","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"The SciML ecosystem also provides time integration algorithms without adaptive time stepping on their own, such as CarpenterKennedy2N54. Moreover, you also can deactivate the automatic adaptivity of adaptive integration algorithms by passing adaptive=false in the solve function.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"These algorithms require another way of setting the step size. You have to pass dt=... in the solve function. Without other settings, the simulation uses this fixed time step.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"For hyperbolic PDEs, it is natural to use an adaptive CFL-based step size control. Here, the time step is proportional to a ratio of the local measure of mesh spacing Delta x_i for an element i and the maximum (local) wave speed lambda_max related to the largest-magnitude eigenvalue of the flux Jacobian of the hyperbolic system.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"Delta t_n = textCFL * min_i fracDelta x_ilambda_max(u_i^n)","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"We compute Delta x_i by scaling the element size by a factor of 1(N+1), cf. Gassner and Kopriva (2011), Section 5.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"Trixi.jl provides such a CFL-based step size control. It is implemented as the callback StepsizeCallback.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"stepsize_callback = StepsizeCallback(; cfl=1.0)","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"A suitable CFL number depends on many parameters such as the chosen grid, the integration algorithm and the polynomial degree of the spatial DG discretization. So, the optimal number for an example is mostly determined experimentally.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"You can add this CFL-based step size control to your simulation like any other callback.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"callbacks = CallbackSet(stepsize_callback)\nalg = CarpenterKennedy2N54(williamson_condition=false)\nsolve(ode, alg;\n dt=1.0 # solve needs some value here but it will be overwritten by the stepsize_callback\n callback=callbacks)","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"You can find simple examples with a CFL-based step size control for instance in the elixirs elixir_advection_basic.jl or elixir_euler_source_terms.jl.","category":"page"},{"location":"tutorials/time_stepping/#Package-versions","page":"15 Explicit time stepping","title":"Package versions","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"","category":"page"},{"location":"tutorials/time_stepping/","page":"15 Explicit time stepping","title":"15 Explicit time stepping","text":"This page was generated using Literate.jl.","category":"page"},{"location":"contributing/#Contributing","page":"Contributing","title":"Contributing","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Trixi.jl is an open-source project and we are very happy to accept contributions from the community. Please feel free to open issues or submit patches (preferably as merge requests) any time. For planned larger contributions, it is often beneficial to get in contact with one of the principal developers first (see Authors).","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Trixi.jl and its contributions are licensed under the MIT license (see License). As a contributor, you certify that all your contributions are in conformance with the Developer Certificate of Origin (Version 1.1), which is reproduced below.","category":"page"},{"location":"contributing/#Developer-Certificate-of-Origin-(Version-1.1)","page":"Contributing","title":"Developer Certificate of Origin (Version 1.1)","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The following text was taken from https://developercertificate.org:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n1 Letterman Drive\nSuite D4700\nSan Francisco, CA, 94129\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\n\nDeveloper's Certificate of Origin 1.1\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n have the right to submit it under the open source license\n indicated in the file; or\n\n(b) The contribution is based upon previous work that, to the best\n of my knowledge, is covered under an appropriate open source\n license and I have the right under that license to submit that\n work with modifications, whether created in whole or in part\n by me, under the same open source license (unless I am\n permitted to submit under a different license), as indicated\n in the file; or\n\n(c) The contribution was provided directly to me by some other\n person who certified (a), (b) or (c) and I have not modified\n it.\n\n(d) I understand and agree that this project and the contribution\n are public and that a record of the contribution (including all\n personal information I submit with it, including my sign-off) is\n maintained indefinitely and may be redistributed consistent with\n this project or the open source license(s) involved.","category":"page"},{"location":"performance/#Performance","page":"Performance","title":"Performance","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"Trixi.jl is designed to balance performance and readability. Since Julia provides a lot of zero-cost abstractions, it is often possible to optimize both goals simultaneously.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"The usual development workflow in Julia is","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Make it work.\nMake it nice.\nMake it fast.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"To achieve the third step, you should be familiar with (at least) the section on performance tips in the Julia manual. Here, we just list some important aspects you should consider when developing Trixi.jl.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Consider using @views/view(...) when using array slices, except on the left-side of an assignment (further details).\nFunctions are essentially for free, since they are usually automatically inlined where it makes sense (using @inline can be used as an additional hint to the compiler) (further details).\nFunction barriers can improve performance due to type stability (further details).\nLook for type instabilities using @code_warntype. Consider using @descend from Cthulhu.jl to investigate deeper call chains.","category":"page"},{"location":"performance/#Manual-benchmarking","page":"Performance","title":"Manual benchmarking","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"If you modify some internal parts of Trixi.jl, you should check the impact on performance. Hence, you should at least investigate the performance roughly by comparing the reported timings of several elixirs. Deeper investigations and micro-benchmarks should usually use BenchmarkTools.jl. For example, the following steps were used to benchmark the changes introduced in PR #256.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"git checkout e7ebf3846b3fd62ee1d0042e130afb50d7fe8e48 (new version)\nStart julia --threads=1 --check-bounds=no.\nExecute the following code in the REPL to benchmark the rhs! call at the final state.\njulia> using BenchmarkTools, Revise; using Trixi\n\njulia> trixi_include(\"examples/2d/elixir_euler_sedov_blast_wave.jl\")\n\njulia> du_test = copy(sol.u[end]); u_test = copy(sol.u[end]);\n\njulia> @benchmark Trixi.rhs!(\n $(du_test),\n $(u_test),\n $(semi),\n $(sol.t[end]))\nBenchmarkTools.Trial:\n memory estimate: 10.48 KiB\n allocs estimate: 67\n --------------\n minimum time: 4.510 ms (0.00% GC)\n median time: 4.646 ms (0.00% GC)\n mean time: 4.699 ms (0.00% GC)\n maximum time: 7.183 ms (0.00% GC)\n --------------\n samples: 1065\n evals/sample: 1\n\nshell> git checkout 222241ff54f8a4ca9876cc1fc25ae262416a4ea0\n\njulia> trixi_include(\"examples/2d/elixir_euler_sedov_blast_wave.jl\")\n\njulia> @benchmark Trixi.rhs!(\n $(du_test),\n $(u_test),\n $(semi),\n $(sol.t[end]))\nBenchmarkTools.Trial:\n memory estimate: 10.36 KiB\n allocs estimate: 67\n --------------\n minimum time: 4.500 ms (0.00% GC)\n median time: 4.635 ms (0.00% GC)\n mean time: 4.676 ms (0.00% GC)\n maximum time: 5.880 ms (0.00% GC)\n --------------\n samples: 1070\n evals/sample: 1\nRun the @benchmark ... commands multiple times to see whether there are any significant fluctuations.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Follow these steps for both commits you want to compare. The relevant benchmark results you should typically be looking at are the median and mean values of the runtime and the memory/allocs estimate. In this example, the differences of the runtimes are of the order of the fluctuations one gets when running the benchmarks multiple times. Since the memory/allocs are (roughly) the same, there doesn't seem to be a significant performance regression here.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"You can also make it more detailed by benchmarking only, e.g., the calculation of the volume terms, but whether that's necessary depends on the modifications you made and their (potential) impact.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Some more detailed description of manual profiling and benchmarking as well as resulting performance improvements of Trixi.jl are given in the following blog posts.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Improving performance of AMR with p4est, cf. #638\nImproving performance of EC methods, cf. #643","category":"page"},{"location":"performance/#Automated-benchmarking","page":"Performance","title":"Automated benchmarking","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"We use PkgBenchmark.jl to provide a standard set of benchmarks for Trixi.jl. The relevant benchmark script is benchmark/benchmarks.jl. You can run a standard set of benchmarks via","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"julia> using PkgBenchmark, Trixi\n\njulia> results = benchmarkpkg(Trixi, BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`))\n\njulia> export_markdown(pkgdir(Trixi, \"benchmark\", \"single_benchmark.md\"), results)","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"This will save a markdown file with a summary of the benchmark results similar to this example. Note that this will take quite some time. Additional options are described in the docs of PkgBenchmark.jl. A particularly useful option is to specify a BenchmarkConfig including Julia command line options affecting the performance such as disabling bounds-checking and setting the number of threads.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"A useful feature when developing Trixi.jl is to compare the performance of Trixi.jl's current state vs. the main branch. This can be achieved by executing","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"julia> using PkgBenchmark, Trixi\n\njulia> results = judge(Trixi,\n BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`), # target\n BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`, id=\"main\") # baseline\n )\n\njulia> export_markdown(pkgdir(Trixi, \"benchmark\", \"results.md\"), results)","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"By default, the target is the current state of the repository. Remember that you need to be in a clean state (commit or stash your changes) to run this successfully. You can also run this comparison and an additional one using two threads via","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"julia> include(\"benchmark/run_benchmarks.jl\")","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Then, markdown files including the results are saved in benchmark/. This example result was obtained using a GitHub action for the PR #535. Note that GitHub actions run on in the cloud in a virtual machine. Hence, we do not really have control over it and performance results must be taken with a grain of salt. Nevertheless, significant runtime differences and differences of memory allocations should be robust indicators of performance changes.","category":"page"},{"location":"performance/#Runtime-performance-vs.-latency-aka-using-@nospecialize-selectively","page":"Performance","title":"Runtime performance vs. latency aka using @nospecialize selectively","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"Usually, Julia will compile specialized versions of each method, using as much information from the types of function arguments as possible (based on some heuristics). The compiler will generate code that is as efficient as comparable code written in a low-level language such as C or Fortran. However, there are cases where the runtime performance does not really matter but the time needed to compile specializations becomes significant. This is related to latency or the time-to-first-plot problem, well-known in the Julia community. In such a case, it can be useful to remove some burden from the compiler by avoiding specialization on every possible argument types using the macro @nospecialize. A prime example of such a case is pretty printing of structs in the Julia REPL, see the associated PR for further discussions.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"As a rule of thumb:","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Do not use @nospecialize in performance-critical parts, in particular not for methods involved in computing Trixi.rhs!.\nConsider using @nospecialize for methods like custom implementations of Base.show.","category":"page"},{"location":"performance/#performance-metrics","page":"Performance","title":"Performance metrics of the AnalysisCallback","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"The AnalysisCallback computes two performance indicators that you can use to evaluate the serial and parallel performance of Trixi.jl. They represent measured run times that are normalized by the number of rhs! evaluations and the number of degrees of freedom of the problem setup. The normalization ensures that we can compare different measurements for each type of indicator independent of the number of time steps or mesh size. All indicators have in common that they are still in units of time, thus lower is better for each of them.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Here, the term \"degrees of freedom\" (DOFs) refers to the number of independent state vectors that are used to represent the numerical solution. For example, if you use a DGSEM-type scheme in 2D on a mesh with 8 elements and with 5-by-5 Gauss-Lobatto nodes in each element (i.e., a polynomial degree of 4), the total number of DOFs would be","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"n_textDOFsDGSEM = textnumber of elements cdot textnumber of nodes per element = 8 cdot (5 cdot 5) = 200","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"In contrast, for a finite volume-type scheme on a mesh with 8 elements, the total number of DOFs would be (independent of the number of spatial dimensions)","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"n_textDOFsFV = textnumber of elements = 8","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"since for standard finite volume methods you store a single state vector in each element. Note that we specifically count the number of state vectors and not the number of state variables for the DOFs. That is, in the previous example n_textDOFsFV is equal to 8 independent of whether this is a compressible Euler setup with 5 state variables or a linear scalar advection setup with one state variable.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"For each indicator, the measurements are always since the last invocation of the AnalysisCallback. That is, if the analysis callback is called multiple times, the indicators are repeatedly computed and can thus also be used to track the performance over the course of a longer simulation, e.g., to analyze setups with varying performance characteristics. Note that the time spent in the AnalysisCallback itself is always excluded, i.e., the performance measurements are not distorted by potentially expensive solution analysis computations. All other parts of a Trixi.jl simulation are included, however, thus make sure that you disable everything you do not want to be measured (such as I/O callbacks, visualization etc.).","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"note: Performance indicators and adaptive mesh refinement\nCurrently it is not possible to compute meaningful performance indicators for a simulation with arbitrary adaptive mesh refinement, since this would require to explicitly keep track of the number of DOF updates due to the mesh size changing repeatedly. The only way to do this at the moment is by setting the analysis interval to the same value as the AMR interval.","category":"page"},{"location":"performance/#Local,-rhs!-only-indicator","page":"Performance","title":"Local, rhs!-only indicator","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"The local, rhs!-only indicator is computed as","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"texttimeDOFrhs = fract_texttextttrhsn_textDOFslocal cdot n_textcallstextttrhs","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"where t_texttextttrhs is the accumulated time spent in rhs!, n_textDOFslocal is the local number of DOFs (i.e., on the current MPI rank; if doing a serial run, you can just think of this as the number of DOFs), and n_textcallstextttrhs is the number of times the rhs! function has been evaluated. Note that for this indicator, we measure only the time spent in rhs!, i.e., by definition all computations outside of rhs! - specifically all other callbacks and the time integration method - are not taken into account.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"The local, rhs!-only indicator is usually most useful if you do serial measurements and are interested in the performance of the implementation of your core numerical methods (e.g., when doing performance tuning).","category":"page"},{"location":"performance/#Performance-index-(PID)","page":"Performance","title":"Performance index (PID)","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"The performance index (PID) is computed as","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"textPID = fract_textwall cdot n_textranksMPIn_textDOFsglobal cdot n_textcallstextttrhs","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"where t_textwall is the walltime since the last call to the AnalysisCallback, n_textranksMPI is the number of MPI ranks used, n_textDOFsglobal is the global number of DOFs (i.e., the sum of DOFs over all MPI ranks; if doing a serial run, you can just think of this as the number of DOFs), and n_textcallstextttrhs is the number of times the rhs! function has been evaluated since the last call to the AnalysisCallback. The PID measures everything except the time spent in the AnalysisCallback itself - specifically, all other callbacks and the time integration method itself are included.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"The PID is usually most useful if you would like to compare the parallel performance of your code to its serial performance. Specifically, it allows you to evaluate the parallelization overhead of your code by giving you a measure of the resources that are necessary to solve a given simulation setup. In a sense, it mimics the \"core hours\" metric that is often used by supercomputer centers to measure how many resources a particular compute job requires. It can thus be seen as a proxy for \"energy used\" and, as an extension, \"monetary cost\".","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"note: Initialization overhead in measurements\nWhen using one of the integration schemes from OrdinaryDiffEq.jl, their implementation will initialize some OrdinaryDiffEq.jl-specific information during the first time step. Among other things, one additional call to rhs! is performed. Therefore, make sure that for performance measurements using the PID either the number of timesteps or the workload per rhs! call is large enough to make the initialization overhead negligible. Note that the extra call to rhs! is properly accounted for in both the number of calls and the measured time, so you do not need to worry about it being expensive. If you want a perfect timing result, you need to set the analysis interval such that the AnalysisCallback is invoked at least once during the course of the simulation and discard the first PID value.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"EditURL = \"../../literate/src/files/custom_semidiscretization.jl\"","category":"page"},{"location":"tutorials/custom_semidiscretization/#custom_semidiscretization","page":"17 Custom semidiscretizations","title":"17: Custom semidiscretizations","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"As described in the overview section, semidiscretizations are high-level descriptions of spatial discretizations in Trixi.jl. Trixi.jl's main focus is on hyperbolic conservation laws represented in a SemidiscretizationHyperbolic. Hyperbolic-parabolic problems based on the advection-diffusion equation or the compressible Navier-Stokes equations can be represented in a SemidiscretizationHyperbolicParabolic. This is described in the basic tutorial on parabolic terms and its extension to custom parabolic terms. In this tutorial, we will describe how these semidiscretizations work and how they can be used to create custom semidiscretizations involving also other tasks.","category":"page"},{"location":"tutorials/custom_semidiscretization/#Overview-of-the-right-hand-side-evaluation","page":"17 Custom semidiscretizations","title":"Overview of the right-hand side evaluation","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"The semidiscretizations provided by Trixi.jl are set up to create ODEProblems from the SciML ecosystem for ordinary differential equations. In particular, a spatial semidiscretization can be wrapped in an ODE problem using semidiscretize, which returns an ODEProblem. This ODEProblem bundles an initial condition, a right-hand side (RHS) function, the time span, and possible parameters. The ODEProblems created by Trixi.jl use the semidiscretization passed to semidiscretize as a parameter. For a SemidiscretizationHyperbolic, the ODEProblem wraps Trixi.rhs! as ODE RHS. For a SemidiscretizationHyperbolicParabolic, Trixi.jl uses a SplitODEProblem combining Trixi.rhs_parabolic! for the (potentially) stiff part and Trixi.rhs! for the other part.","category":"page"},{"location":"tutorials/custom_semidiscretization/#Standard-Trixi.jl-setup","page":"17 Custom semidiscretizations","title":"Standard Trixi.jl setup","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"In this tutorial, we will consider the linear advection equation with source term","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"partial_t u(tx) + partial_x u(tx) = -exp(-t) sinbigl(pi (x - t) bigr)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"with periodic boundary conditions in the domain [-1, 1] as a model problem. The initial condition is","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"u(0x) = sin(pi x)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"The source term results in some damping and the analytical solution","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"u(tx) = exp(-t) sinbigl(pi (x - t) bigr)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"First, we discretize this equation using the standard functionality of Trixi.jl.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"using Trixi, OrdinaryDiffEq, Plots","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"The linear scalar advection equation is already implemented in Trixi.jl as LinearScalarAdvectionEquation1D. We construct it with an advection velocity 1.0.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"equations = LinearScalarAdvectionEquation1D(1.0)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Next, we use a standard DGSEM solver.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"solver = DGSEM(polydeg = 3)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"We create a simple TreeMesh in 1D.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"coordinates_min = (-1.0,)\ncoordinates_max = (+1.0,)\nmesh = TreeMesh(coordinates_min, coordinates_max;\n initial_refinement_level = 4,\n n_cells_max = 10^4,\n periodicity = true)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"We wrap everything in in a semidiscretization and pass the source terms as a standard Julia function. Please note that Trixi.jl uses SVectors from StaticArrays.jl to store the conserved variables u. Thus, the return value of the source terms must be wrapped in an SVector - even if we consider just a scalar problem.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"function initial_condition(x, t, equations)\n return SVector(exp(-t) * sinpi(x[1] - t))\nend\n\nfunction source_terms_standard(u, x, t, equations)\n return -initial_condition(x, t, equations)\nend\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition,\n solver;\n source_terms = source_terms_standard)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Now, we can create the ODEProblem, solve the resulting ODE using a time integration method from OrdinaryDiffEq.jl, and visualize the numerical solution at the final time using Plots.jl.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"tspan = (0.0, 3.0)\node = semidiscretize(semi, tspan)\n\nsol = solve(ode, RDPK3SpFSAL49(); ode_default_options()...)\n\nplot(sol; label = \"numerical sol.\", legend = :topright)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"We can also plot the analytical solution for comparison. Since Trixi.jl uses SVectors for the variables, we take their first (and only) component to get the scalar value for manual plotting.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"let\n x = range(-1.0, 1.0; length = 200)\n plot!(x, first.(initial_condition.(x, sol.t[end], equations)),\n label = \"analytical sol.\", linestyle = :dash, legend = :topright)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"We can also add the initial condition to the plot.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"plot!(sol.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"You can of course also use some callbacks provided by Trixi.jl as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"summary_callback = SummaryCallback()\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi; interval = analysis_interval)\nalive_callback = AliveCallback(; analysis_interval)\ncallbacks = CallbackSet(summary_callback,\n analysis_callback,\n alive_callback)\n\nsol = solve(ode, RDPK3SpFSAL49();\n ode_default_options()..., callback = callbacks)\nsummary_callback()","category":"page"},{"location":"tutorials/custom_semidiscretization/#Using-a-custom-ODE-right-hand-side-function","page":"17 Custom semidiscretizations","title":"Using a custom ODE right-hand side function","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Next, we will solve the same problem but use our own ODE RHS function. To demonstrate this, we will artificially create a global variable containing the current time of the simulation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"const GLOBAL_TIME = Ref(0.0)\n\nfunction source_terms_custom(u, x, t, equations)\n t = GLOBAL_TIME[]\n return -initial_condition(x, t, equations)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Next, we create our own RHS function to update the global time of the simulation before calling the RHS function from Trixi.jl.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"function rhs_source_custom!(du_ode, u_ode, semi, t)\n GLOBAL_TIME[] = t\n Trixi.rhs!(du_ode, u_ode, semi, t)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Next, we create an ODEProblem manually copying over the data from the one we got from semidiscretize earlier.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"ode_source_custom = ODEProblem(rhs_source_custom!,\n ode.u0,\n ode.tspan,\n ode.p #= semi =#)\nsol_source_custom = solve(ode_source_custom, RDPK3SpFSAL49();\n ode_default_options()...)\n\nplot(sol_source_custom; label = \"numerical sol.\")\nlet\n x = range(-1.0, 1.0; length = 200)\n plot!(x, first.(initial_condition.(x, sol_source_custom.t[end], equations)),\n label = \"analytical sol.\", linestyle = :dash, legend = :topleft)\nend\nplot!(sol_source_custom.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"This also works with callbacks as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"summary_callback = SummaryCallback()\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi; interval = analysis_interval)\nalive_callback = AliveCallback(; analysis_interval)\ncallbacks = CallbackSet(summary_callback,\n analysis_callback,\n alive_callback)\n\nsol = solve(ode_source_custom, RDPK3SpFSAL49();\n ode_default_options()..., callback = callbacks)\nsummary_callback()","category":"page"},{"location":"tutorials/custom_semidiscretization/#Setting-up-a-custom-semidiscretization","page":"17 Custom semidiscretizations","title":"Setting up a custom semidiscretization","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Using a global constant is of course not really nice from a software engineering point of view. Thus, it can often be useful to collect additional data in the parameters of the ODEProblem. Thus, it is time to create our own semidiscretization. Here, we create a small wrapper of a standard semidiscretization of Trixi.jl and the current global time of the simulation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"struct CustomSemidiscretization{Semi, T} <: Trixi.AbstractSemidiscretization\n semi::Semi\n t::T\nend\n\nsemi_custom = CustomSemidiscretization(semi, Ref(0.0))","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"To get pretty printing in the REPL, you can consider specializing","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Base.show(io::IO, parameters::CustomSemidiscretization)\nBase.show(io::IO, ::MIME\"text/plain\", parameters::CustomSemidiscretization)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"for your custom semidiscretiation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Next, we create our own source terms that use the global time stored in the custom semidiscretiation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"source_terms_custom_semi = let semi_custom = semi_custom\n function source_terms_custom_semi(u, x, t, equations)\n t = semi_custom.t[]\n return -initial_condition(x, t, equations)\n end\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"We also create a custom ODE RHS to update the current global time stored in the custom semidiscretization. We unpack the standard semidiscretization created by Trixi.jl and pass it to Trixi.rhs!.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"function rhs_semi_custom!(du_ode, u_ode, semi_custom, t)\n semi_custom.t[] = t\n Trixi.rhs!(du_ode, u_ode, semi_custom.semi, t)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Finally, we set up an ODEProblem and solve it numerically.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"ode_semi_custom = ODEProblem(rhs_semi_custom!,\n ode.u0,\n ode.tspan,\n semi_custom)\nsol_semi_custom = solve(ode_semi_custom, RDPK3SpFSAL49();\n ode_default_options()...)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"If we want to make use of additional functionality provided by Trixi.jl, e.g., for plotting, we need to implement a few additional specializations. In this case, we forward everything to the standard semidiscretization provided by Trixi.jl wrapped in our custom semidiscretization.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Base.ndims(semi::CustomSemidiscretization) = ndims(semi.semi)\nfunction Trixi.mesh_equations_solver_cache(semi::CustomSemidiscretization)\n Trixi.mesh_equations_solver_cache(semi.semi)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Now, we can plot the numerical solution as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"plot(sol_semi_custom; label = \"numerical sol.\")\nlet\n x = range(-1.0, 1.0; length = 200)\n plot!(x, first.(initial_condition.(x, sol_semi_custom.t[end], equations)),\n label = \"analytical sol.\", linestyle = :dash, legend = :topleft)\nend\nplot!(sol_semi_custom.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"This also works with many callbacks as usual. However, the AnalysisCallback requires some special handling since it makes use of a performance counter contained in the standard semidiscretizations of Trixi.jl to report some performance metrics. Here, we forward all accesses to the performance counter to the wrapped semidiscretization.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"function Base.getproperty(semi::CustomSemidiscretization, s::Symbol)\n if s === :performance_counter\n wrapped_semi = getfield(semi, :semi)\n wrapped_semi.performance_counter\n else\n getfield(semi, s)\n end\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Moreover, the AnalysisCallback also performs some error calculations. We also need to forward them to the wrapped semidiscretization.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"function Trixi.calc_error_norms(func, u, t, analyzer,\n semi::CustomSemidiscretization,\n cache_analysis)\n Trixi.calc_error_norms(func, u, t, analyzer,\n semi.semi,\n cache_analysis)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"Now, we can work with the callbacks used before as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"summary_callback = SummaryCallback()\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi_custom;\n interval = analysis_interval)\nalive_callback = AliveCallback(; analysis_interval)\ncallbacks = CallbackSet(summary_callback,\n analysis_callback,\n alive_callback)\n\nsol = solve(ode_semi_custom, RDPK3SpFSAL49();\n ode_default_options()..., callback = callbacks)\nsummary_callback()","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"For even more advanced usage of custom semidiscretizations, you may look at the source code of the ones contained in Trixi.jl, e.g.,","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"SemidiscretizationHyperbolicParabolic\nSemidiscretizationEulerGravity\nSemidiscretizationEulerAcoustics\nSemidiscretizationCoupled","category":"page"},{"location":"tutorials/custom_semidiscretization/#Package-versions","page":"17 Custom semidiscretizations","title":"Package versions","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"17 Custom semidiscretizations","title":"17 Custom semidiscretizations","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"EditURL = \"../../literate/src/files/DGSEM_FluxDiff.jl\"","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#DGSEM_FluxDiff","page":"2 DGSEM with flux differencing","title":"2: DGSEM with flux differencing","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"This tutorial starts with a presentation of the weak formulation of the discontinuous Galerkin spectral element method (DGSEM) in order to fix the notation of the used operators. Then, the DGSEM formulation with flux differencing (split form DGSEM) and its implementation in Trixi.jl is shown.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We start with the one-dimensional conservation law","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"u_t + f(u)_x = 0 qquad tin mathbbR^+ xinOmega","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"with the physical flux f.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We split the domain Omega into elements K with center x_K and size Delta x. With the transformation mapping x(xi)=x_K + fracDelta x2 xi we can transform the reference element -11 to every physical element. So, the equation can be restricted to the reference element using the determinant of the Jacobian matrix of the transformation mapping J=fracpartial xpartial xi=fracDelta x2.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"J u_t + f(u)_xi = 0 qquad tin mathbbR^+ xiin -11","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#The-weak-form-of-the-DGSEM","page":"2 DGSEM with flux differencing","title":"The weak form of the DGSEM","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We consider the so-called discontinuous Galerkin spectral element method (DGSEM) with collocation. It results from choosing a nodal DG ansatz using N+1 Gauss-Lobatto nodes xi_i in -11 with matching interpolation weights w_i, which are used for numerical integration and interpolation with the Lagrange polynomial basis l_i of degree N. The Lagrange functions are created with those nodes and hence fulfil a Kronecker property at the GL nodes. The weak formulation of the DGSEM for one element is","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"J underlinedotu(t) = - M^-1 B underlinef^* + M^-1 D^T M underlinef","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"where underlineu=(u_0 u_1 dots u_N)^TinmathbbR^N+1 is the collected pointwise evaluation of u at the discretization nodes and dotu = partial u partial t = u_t is the temporal derivative. The nodal values of the flux function f results with collocation in underlinef, since underlinef_j=f(underlineu_j). Moreover, we got the numerical flux f^*=f^*(u^- u^+).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We will now have a short overview over the operators we used.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"The derivative matrix DinmathbbR^(N+1)times (N+1) mimics a spatial derivation on a discrete level with underlinef_x approx D underlinef. It is defined by D_ij = l_j(xi_i).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"The diagonal mass matrix M is defined by M_ij=langle l_j l_irangle_N with the numerical scalar product langle cdot cdotrangle_N defined for functions f and g by","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"langle f grangle_N = int_-1 N^1 f(xi) g(xi) dxi = sum_k=0^N f(xi_k) g(xi_k) w_k","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"The multiplication by M matches a discrete integration","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":" int_-1^1 f(xi) underlinel(xi) dxi approx M underlinef","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"The boundary matrix B=textdiag(-1 0 0 1) represents an evaluation of a function at the boundaries xi_0=-1 and xi_N=1.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"For these operators the following property holds:","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":" M D + (M D)^T = B","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"This is called the summation-by-parts (SBP) property since it mimics integration by parts on a discrete level (Gassner (2013)).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"The explicit definitions of the operators and the construction of the 1D algorithm can be found for instance in the tutorial introduction to DG methods or in more detail in Kopriva (2009).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"This property shows the equivalence between the weak form and the following strong formulation of the DGSEM.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"beginalign*\nJ underlinedotu(t)\n= - M^-1 B underlinef^* + M^-1 D^T M underlinef5pt\n= - M^-1 B underlinef^* + M^-1 (B - MD) underlinef5pt\n= - M^-1 B (underlinef^* - underlinef) - D underlinef\nendalign*","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"More information about the equivalence you can find in Kopriva, Gassner (2010).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#DGSEM-with-flux-differencing","page":"2 DGSEM with flux differencing","title":"DGSEM with flux differencing","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"When using the diagonal SBP property it is possible to rewrite the application of the derivative operator D in the calculation of the volume integral into a subcell based finite volume type differencing formulation (Fisher, Carpenter (2013)). Generalizing","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"(D underlinef)_i = sum_j D_ij underlinef_j\n= 2sum_j frac12 D_ij (underlinef_j + underlinef_i)\neqqcolon 2sum_j D_ij f_textcentral(u_i u_j)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"we replace D underlinef in the strong form by 2D underlinef_vol(u^- u^+) with the consistent two-point volume flux f_vol and receive the DGSEM formulation with flux differencing (split form DGSEM) (Gassner, Winters, Kopriva (2016)).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"beginalign*\nJ underlinedotu(t) = - M^-1 B (underlinef^* - underlinef) - 2D underlinef_vol(u^- u^+)5pt\n= - M^-1 B (underlinef^* - underlinef_vol(underlineu underlineu)) - 2D underlinef_vol(u^- u^+)5pt\n= - M^-1 B underlinef_surface^* - (2D - M^-1 B) underlinef_vol5pt\n= - M^-1 B underlinef_surface^* - D_split underlinef_vol\nendalign*","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"This formulation is in a weak form type formulation and can be implemented by using the derivative split matrix D_split=(2D-M^-1B) and two different fluxes. We divide between the surface flux f=f_surface used for the numerical flux f_surface^* and the already mentioned volume flux f_vol especially for this formulation.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"This formulation creates a more stable version of DGSEM, because it fulfils entropy stability. Moreover it allows the construction of entropy conserving discretizations without relying on exact integration. This is achieved when using a two-point entropy conserving flux function as volume flux in the volume flux differencing formulation. Then, the numerical surface flux can be used to control the dissipation of the discretization and to guarantee decreasing entropy, i.e. entropy stability.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#fluxDiffExample","page":"2 DGSEM with flux differencing","title":"Implementation in Trixi.jl","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"Now, we have a look at the implementation of DGSEM with flux differencing with Trixi.jl.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"using OrdinaryDiffEq, Trixi","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We implement a simulation for the compressible Euler equations in 2D","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"partial_t beginpmatrix rho rho v_1 rho v_2 rho e endpmatrix\n+ partial_x beginpmatrix rho v_1 rho v_1^2 + p rho v_1 v_2 (rho e +p) v_1 endpmatrix\n+ partial_y beginpmatrix rho v_2 rho v_1 v_2 rho v_2^2 + p (rho e +p) v_2 endpmatrix\n= beginpmatrix 0 0 0 0 endpmatrix","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"for an ideal gas with ratio of specific heats gamma=14. Here, rho is the density, v_1, v_2 the velocities, e the specific total energy and","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"p = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2) right)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"the pressure.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"gamma = 1.4\nequations = CompressibleEulerEquations2D(gamma)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"As our initial condition we will use a weak blast wave from Hennemann, Gassner (2020). The primitive variables are defined by","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"beginpmatrix rho v_1 v_2 p endpmatrix\n= beginpmatrix 10 00 00 10 endpmatrix textif x_2 05\ntextand beginpmatrix rho v_1 v_2 p endpmatrix\n= beginpmatrix 11691 01882 * cos(phi) 01882 * sin(phi) 1245 endpmatrix textelse","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"with phi = tan^-1(fracx_2x_1).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"This initial condition is implemented in Trixi.jl under the name initial_condition_weak_blast_wave.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"initial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"In Trixi.jl, flux differencing for the volume integral can be implemented with VolumeIntegralFluxDifferencing using symmetric two-point volume fluxes. First, we set up a simulation with the entropy conserving and kinetic energy preserving flux flux_ranocha by Hendrik Ranocha (2018) as surface and volume flux.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We will confirm the entropy conservation property numerically.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"volume_flux = flux_ranocha # = f_vol\nsolver = DGSEM(polydeg=3, surface_flux=volume_flux,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"Now, we implement Trixi.jl's mesh, semi and ode in a simple framework. For more information please have a look at the documentation, the basic tutorial introduction to DG methods or some basic elixirs.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"coordinates_min = (-2.0, -2.0)\ncoordinates_max = ( 2.0, 2.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=5,\n n_cells_max=10_000,\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_condition_periodic)\n\n# ODE solvers\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"To analyse the entropy conservation of the approximation, we will use the analysis calllback implemented in Trixi. It provides some information about the approximation including the entropy change.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"analysis_callback = AnalysisCallback(semi, interval=100);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We now run the simulation using flux_ranocha for both surface and volume flux.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=analysis_callback);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"A look at the change in entropy sum partial Spartial U cdot U_t in the analysis callback confirms that the flux is entropy conserving since the change is about machine precision.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We can plot the approximated solution at the time t=0.4.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"Now, we can use for instance the dissipative flux flux_lax_friedrichs as surface flux to get an entropy stable method.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"using OrdinaryDiffEq, Trixi\n\ngamma = 1.4\nequations = CompressibleEulerEquations2D(gamma)\n\ninitial_condition = initial_condition_weak_blast_wave\n\nvolume_flux = flux_ranocha # = f_vol\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\ncoordinates_min = (-2.0, -2.0)\ncoordinates_max = ( 2.0, 2.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=5,\n n_cells_max=10_000,\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_condition_periodic)\n\n# ODE solvers\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan);\n\nanalysis_callback = AnalysisCallback(semi, interval=100);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"We now run the simulation using the volume flux flux_ranocha and surface flux flux_lax_friedrichs.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=analysis_callback);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"The change in entropy confirms the expected entropy stability.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"Of course, you can use more than these two fluxes in Trixi. Here, we will give a short list of possible fluxes for the compressible Euler equations. For the volume flux Trixi.jl provides for example flux_ranocha, flux_shima_etal, flux_chandrashekar, flux_kennedy_gruber. As surface flux you can use all volume fluxes and additionally for instance flux_lax_friedrichs, flux_hll, flux_hllc.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#Package-versions","page":"2 DGSEM with flux differencing","title":"Package versions","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"2 DGSEM with flux differencing","title":"2 DGSEM with flux differencing","text":"This page was generated using Literate.jl.","category":"page"},{"location":"meshes/dgmulti_mesh/#DGMulti","page":"DGMulti mesh","title":"Unstructured meshes and the DGMulti solver","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Trixi.jl includes support for simplicial and tensor product meshes via the DGMulti solver type, which is based on the StartUpDG.jl package. DGMulti solvers also provide support for quadrilateral and hexahedral meshes, though this feature is currently restricted to Cartesian grids. On these line/quad/hex meshes, the DGMulti solver also allows to use all (finite domain) SBP derivative operators provided by SummationByPartsOperators.jl, including several finite difference SBP methods.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"We make a few simplifying assumptions about supported meshes:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"meshes consist of a single type of element\nmeshes are conforming (e.g., each face of an element is shared with at most one other element).\nthe geometric mapping from reference to physical elements is polynomial (currently, only affine mappings are supported).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"StartUpDG.jl includes both simple uniform meshes via uniform_mesh, as well as support for triangular meshes constructed using Triangulate.jl, a wrapper around Jonathan Shewchuk's Triangle package.","category":"page"},{"location":"meshes/dgmulti_mesh/#The-DGMulti-solver-type","page":"DGMulti mesh","title":"The DGMulti solver type","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Trixi.jl solvers on simplicial meshes use the DGMulti solver type, which allows users to specify element_type and approximation_type in addition to polydeg, surface_flux, surface_integral, and volume_integral.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"DGMulti(; polydeg::Integer,\n element_type::AbstractElemShape,\n approximation_type=Polynomial(),\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n RefElemData_kwargs...)","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Here, element_type can be Tri(), Quad(), Tet(), or Hex(), and approximation_type can be","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Polynomial(), which specifies a DG discretization using a polynomial basis using quadrature rules which are exact for degree 2 * polydeg integrands, or\nSBP(), which specifies a DG discretization using multi-dimensional SBP operators. Types of SBP discretizations available include: SBP{Kubatko{LobattoFaceNodes}}() (the default choice), SBP{Kubatko{LegendreFaceNodes}}(), and SBP{Hicken}(). For polydeg = 1, ..., 4, the SBP{Kubatko{LegendreFaceNodes}}() SBP nodes are identical to the SBP nodes of Chen and Shu. More detailed descriptions of each SBP node set can be found in the StartUpDG.jl docs. Trixi.jl will also specialize certain parts of the solver based on the SBP approximation type.\na (periodic or non-periodic) derivative operator from SummationByPartsOperators.jl, usually constructed as D = derivative_operator(...). In this case, you do not need to pass a polydeg. Periodic derivative operators will only work with single-element meshes constructed using DGMultiMesh.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Additional options can also be specified through RefElemData_kwargs:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"quad_rule_vol = quad_nodes(Tri(), Nq) will substitute in a volume quadrature rule of degree Nq instead of the default (which is a quadrature rule of degree polydeg). Here, a degree Nq rule will be exact for at least degree 2*Nq integrands (such that the mass matrix is integrated exactly). Quadrature rules of which exactly integrate degree Nq integrands may also be specified (for example, quad_rule_vol = StartUpDG.quad_nodes_tri(Nq) on triangles).\nquad_rule_face = quad_nodes(Line(), Nq)) will use a face quadrature rule of degree Nq rather than the default. This rule is also exact for at least degree 2*Nq integrands.","category":"page"},{"location":"meshes/dgmulti_mesh/#The-GaussSBP()-approximation-type-on-Quad()-and-Hex()-meshes","page":"DGMulti mesh","title":"The GaussSBP() approximation type on Quad() and Hex() meshes","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"When using VolumeIntegralFluxDifferencing on Quad() and Hex() meshes, one can also specify approximation_type = GaussSBP() to use an entropy stable Gauss collocation scheme. Here, GaussSBP() refers to \"generalized\" summation-by-parts operators (see for example Ranocha 2018 or Fernandez and Zingg 2015).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Unlike traditional SBP operators, generalized SBP operators are constructed from nodes which do not include boundary nodes (i.e., Gauss quadrature nodes as opposed to Gauss-Lobatto quadrature nodes). This makes the computation of interface fluxes slightly more expensive, but also usually results in a more accurate solution. Roughly speaking, an entropy stable Gauss collocation scheme will yield results similar to a modal entropy stable scheme using a Polynomial() approximation type, but will be more efficient at high orders of approximation.","category":"page"},{"location":"meshes/dgmulti_mesh/#Trixi.jl-elixirs-on-simplicial-and-tensor-product-element-meshes","page":"DGMulti mesh","title":"Trixi.jl elixirs on simplicial and tensor product element meshes","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Example elixirs with triangular, quadrilateral, and tetrahedral meshes can be found in the examples/dgmulti_2d/ and examples/dgmulti_3d/ folders. Some key elixirs to look at:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"examples/dgmulti_2d/elixir_euler_weakform.jl: basic weak form DG discretization on a uniform triangular mesh. Changing element_type = Quad() or approximation_type = SBP() will switch to a quadrilateral mesh or an SBP-type discretization. Changing surface_integral = SurfaceIntegralWeakForm(flux_ec) and volume_integral = VolumeIntegralFluxDifferencing(flux_ec) for some entropy conservative flux (e.g., flux_chandrashekar or flux_ranocha) will switch to an entropy conservative formulation.\nexamples/dgmulti_2d/elixir_euler_triangulate_pkg_mesh.jl: uses an unstructured mesh generated by Triangulate.jl.\nexamples/dgmulti_3d/elixir_euler_weakform.jl: ´basic weak form DG discretization on a uniform tetrahedral mesh. Changing element_type = Hex() will switch to a hexahedral mesh. Changing surface_integral = SurfaceIntegralWeakForm(flux_ec) and volume_integral = VolumeIntegralFluxDifferencing(flux_ec) for some entropy conservative flux (e.g., flux_chandrashekar or flux_ranocha) will switch to an entropy conservative formulation.","category":"page"},{"location":"meshes/dgmulti_mesh/#For-developers","page":"DGMulti mesh","title":"For developers","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/#DGMultiMesh-wrapper-type","page":"DGMulti mesh","title":"DGMultiMesh wrapper type","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"DGMulti meshes in Trixi.jl are represented using a DGMultiMesh{NDIMS, ...} type. This mesh type is assumed to have fields md::MeshData, which contains geometric terms derived from the mapping between the reference and physical elements, and boundary_faces, which contains a Dict of boundary segment names (symbols) and list of faces which lie on that boundary segment.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"A DGMultiMesh can be constructed in several ways. For example, DGMultiMesh(dg::DGMulti) will return a Cartesian mesh on -1 1^d with element types specified by dg. DGMulti meshes can also be constructed by specifying a list of vertex coordinates vertex_coordinates_x, vertex_coordinates_y, vertex_coordinates_z and a connectivity matrix EToV where EToV[e,:] gives the vertices which correspond to element e. These quantities are available from most unstructured mesh generators.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Initial support for curved DGMultiMeshes is available for flux differencing solvers using SBP and GaussSBP approximation types on quadrilateral and hexahedral meshes. These can be called by specifying mesh = DGMultiMesh(dg, cells_per_dimension, mapping), where mapping is a function which specifies the warping of the mesh (e.g., mapping(xi, eta) = SVector{2}(xi, eta) is the identity mapping) similar to the mapping argument used by StructuredMesh.","category":"page"},{"location":"meshes/dgmulti_mesh/#Variable-naming-conventions","page":"DGMulti mesh","title":"Variable naming conventions","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"We use the convention that coordinates on the reference element are r in 1D, r s in 2D, or r s t in 3D. Physical coordinates use the standard conventions x (1D), x y (2D), and x y z (3D).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"(Image: \"Ref-to-physical mapping\")","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Derivatives of reference coordinates with respect to physical coordinates are abbreviated, e.g., fracpartial rpartial x = r_x. Additionally, J is used to denote the determinant of the Jacobian of the reference-to-physical mapping.","category":"page"},{"location":"meshes/dgmulti_mesh/#Variable-meanings-and-conventions-in-StartUpDG.jl","page":"DGMulti mesh","title":"Variable meanings and conventions in StartUpDG.jl","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"StartUpDG.jl exports structs RefElemData{NDIMS, ElemShape, ...} (which contains data associated with the reference element, such as interpolation points, quadrature rules, face nodes, normals, and differentiation/interpolation/projection matrices) and MeshData{NDIMS} (which contains geometric data associated with a mesh). These are currently used for evaluating DG formulations in a matrix-free fashion. These structs contain fields similar (but not identical) to those in Globals1D, Globals2D, Globals3D in the Matlab codes from \"Nodal Discontinuous Galerkin Methods\" by Hesthaven and Warburton (2007).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"In general, we use the following code conventions:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"variables such as r, s,... and x, y,... correspond to values at nodal interpolation points.\nvariables ending in q (e.g., rq, sq,... and xq, yq,...) correspond to values at volume quadrature points.\nvariables ending in f (e.g., rf, sf,... and xf, yf,...) correspond to values at face quadrature points.\nvariables ending in p (e.g., rp, sp,...) correspond to \"plotting\" points, which are usually a fine grid of equispaced points.\nV matrices correspond to interpolation matrices from nodal interpolation points, e.g., Vq interpolates to volume quadrature points, Vf interpolates to face quadrature points.\ngeometric quantities in MeshData are stored as matrices of dimension textnumber of points per element times textnumber of elements.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Quantities in rd::RefElemData:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"rd.Np, rd.Nq, rd.Nf: the number of nodal interpolation points, volume quadrature points, and face quadrature points on the reference element, respectively.\nrd.Vq: interpolation matrices from values at nodal interpolation points to volume quadrature points\nrd.wq: volume quadrature weights on the reference element\nrd.Vf: interpolation matrices from values at nodal interpolation points to face quadrature points\nrd.wf: a vector containing face quadrature weights on the reference element\nrd.M: the quadrature-based mass matrix, computed via rd.Vq' * diagm(rd.wq) * rd.Vq.\nrd.Pq: a quadrature-based L^2 projection matrix rd.Pq = rd.M \\ rd.Vq' * diagm(rd.wq) which maps between values at quadrature points and values at nodal points.\nDr, Ds, Dt matrices are nodal differentiation matrices with respect to the rst coordinates, e.g., Dr*f.(r,s) approximates the derivative of f(rs) at nodal points.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Quantities in md::MeshData:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"md.xyz is a tuple of matrices md.x, md.y, md.z, where column e contains coordinates of physical interpolation points.\nmd.xyzq is a tuple of matrices md.xq, md.yq, md.zq, where column e contains coordinates of physical quadrature points.\nmd.rxJ, md.sxJ, ... are matrices where column e contains values of Jfracpartial rpartial x, Jfracpartial spartial x, etc. at nodal interpolation points on the element e.\nmd.J is a matrix where column e contains values of the Jacobian J at nodal interpolation points.\nmd.Jf is a matrix where column e contains values of the face Jacobian (e.g., determinant of the geometric mapping between a physical face and a reference face) at face quadrature points.\nmd.nxJ, md.nyJ, ... are matrices where column e contains values of components of the unit normal scaled by the face Jacobian md.Jf at face quadrature points.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"For more details, please see the StartUpDG.jl docs.","category":"page"},{"location":"meshes/p4est_mesh/#P4est-based-mesh","page":"P4est-based mesh","title":"P4est-based mesh","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The P4estMesh is an unstructured, curvilinear, nonconforming mesh type for quadrilateral (2D) and hexahedral (3D) cells. It supports quadtree/octree-based adaptive mesh refinement (AMR) via the C library p4est. See AMRCallback for further information.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.","category":"page"},{"location":"meshes/p4est_mesh/#Construction-of-a-P4estMesh-from-an-Abaqus-file","page":"P4est-based mesh","title":"Construction of a P4estMesh from an Abaqus file","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"One available option to construct a P4estMesh is to read in an Abaqus (.inp) mesh file. We briefly describe the structure of this file, the conventions it uses, and how the mesh file is parsed to create an initial unstructured, curvilinear, and conforming mesh.","category":"page"},{"location":"meshes/p4est_mesh/#Mesh-in-two-spatial-dimensions","page":"P4est-based mesh","title":"Mesh in two spatial dimensions","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For this discussion we use the following two-dimensional unstructured curved mesh with three elements:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"(Image: abaqus-2dmesh-docs)","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"We note that the corner and element connectivity information parsed from the Abaqus file creates a straight sided (linear) mesh. From this linear mesh there are two strategies available to make the mesh curvilinear:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Apply a mapping function to describe a transformation of the linear mesh to another physical domain. The mapping is approximated using interpolation polynomial of a user specified polynomial degree. The default value of this polynomial degree is 1 that corresponds to an uncurved geometry.\nHigh-order boundary information is available in the .inp mesh file because it was created with the HOHQMesh mesh generator, which is available via the Julia package HOHQMesh.jl. This information is used to create appropriate transfinite mappings during the mesh construction.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"We divide our discussion into two parts. The first part discusses the standard corner and element information contained in the .inp mesh file. The second part specifically deals with the mesh file parsing of an Abaqus file created by HOHQMesh.jl.","category":"page"},{"location":"meshes/p4est_mesh/#Mesh-file-header","page":"P4est-based mesh","title":"Mesh file header","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"An Abaqus .inp mesh file typically begins with a *Heading. Though optional, the *Heading is helpful to give users some information about the mesh described by the mesh file. In particular, a .inp mesh file created with HOHQMesh will contain the header","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*Heading\n File created by HOHQMesh","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"This heading is used to indicate to the mesh constructor which of the above mapping strategies to apply in order to create a curvilinear mesh. If the Abaqus file header is not present then the P4estMesh is created with the first strategy above.","category":"page"},{"location":"meshes/p4est_mesh/#List-of-corner-nodes","page":"P4est-based mesh","title":"List of corner nodes","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Next, prefaced with *NODE, comes a list of the physical (x,y,z) coordinates of all the corners. The first integer in the list of the corners provides its id number. Thus, for the two-dimensional example mesh this block of corner information is","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*NODE\n1, 1.0, -1.0, 0.0\n2, 3.0, 0.0, 0.0\n3, 1.0, 1.0, 0.0\n4, 2.0, 0.0, 0.0\n5, 0.0, 0.0, 0.0\n6, 3.0, 1.0, 0.0\n7, 3.0, -1.0, 0.0","category":"page"},{"location":"meshes/p4est_mesh/#List-of-elements","page":"P4est-based mesh","title":"List of elements","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The element connectivity is given after the list of corners. The header for this information block is","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*ELEMENT, type=CPS4, ELSET=Surface1","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The Abaqus element type CPS4 corresponds to a quadrilateral element. Each quadrilateral element in the unstructured mesh is dictated by four corner points with indexing taken from the numbering given by the corner list above. The elements connect a set of four corner points (starting from the bottom left) in an anti-clockwise fashion; making the element right-handed. This element handedness is indicated using the circular arrow in the figure above. Just as with the corner list, the first integer in the element connectivity list indicates the element id number. Thus, the element connectivity list for the three element example mesh is","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*ELEMENT, type=CPS4, ELSET=Surface1\n1, 5, 1, 4, 3\n2, 4, 2, 6, 3\n3, 7, 2, 4, 1","category":"page"},{"location":"meshes/p4est_mesh/#Element-neighbor-connectivity","page":"P4est-based mesh","title":"Element neighbor connectivity","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The construction of the element neighbor ids and identifying physical boundary surfaces is done using functionality directly from the p4est library. For example, the neighbor connectivity is created in the mesh constructor using the wrapper read_inp_p4est function.","category":"page"},{"location":"meshes/p4est_mesh/#HOHQMesh-boundary-information","page":"P4est-based mesh","title":"HOHQMesh boundary information","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"If present, any additional information in the mesh file that was created by HOHQMesh is prefaced with ** to make it an Abaqus comment. This ensures that the read in of the file by a standard Abaqus file parser, as done in the read_inp_p4est function, is done correctly.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The high-order, curved boundary information and labels of the physical boundary created by HOHQMesh is found below the comment line","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** ***** HOHQMesh boundary information ***** **","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Next comes the polynomial degree that the mesh will use to represent any curved sides","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** mesh polynomial degree = 8","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The mesh file then, again, provides the element connectivity as well as information for curved surfaces either interior to the domain or along the physical boundaries. A set of check digits are included directly below the four corner indexes to indicate whether the local surface index (-y, +x, +y, or -x) within the element is straight sided, 0, or is curved, 1. If the local surface is straight sided no additional information is necessary during the mesh file read in. But for any curved surfaces the mesh file provides (x,y,z) coordinate values in order to construct an interpolant of this surface with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes. This list of (x,y,z) data will be given in the direction of the local coordinate system. Given below is the element curvature information for the example mesh:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** 5 1 4 3\n** 0 0 1 1\n** 1.000000000000000 1.000000000000000 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 2.000000000000000 0.0 0.0\n** 0.0 0.0 0.0\n** 0.035513826946206 0.105291711848750 0.0\n** 0.148591270347399 0.317731556850611 0.0\n** 0.340010713990041 0.452219430075470 0.0\n** 0.575000000000000 0.462500000000000 0.0\n** 0.788022294598950 0.483764065630034 0.0\n** 0.926408729652601 0.644768443149389 0.0\n** 0.986453164464803 0.883724792445746 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 4 2 6 3\n** 0 0 0 1\n** 2.000000000000000 0.0 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 7 2 4 1\n** 0 0 0 0","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The last piece of information provided by HOHQMesh are labels for the different surfaces of an element. These labels are useful to set boundary conditions along physical surfaces. The labels can be short descriptive words up to 32 characters in length. The label --- indicates an internal surface where no boundary condition is required.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"It is important to note that these labels are given in the following order according to the local surface index -x +x -y +y as required by the p4est library.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** Bezier --- Slant ---\n** --- Right --- Top\n** Bottom --- Right ---","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For completeness, we provide the entire Abaqus mesh file for the example mesh in the figure above:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*Heading\n File created by HOHQMesh\n*NODE\n1, 1.0, -1.0, 0.0\n2, 3.0, 0.0, 0.0\n3, 1.0, 1.0, 0.0\n4, 2.0, 0.0, 0.0\n5, 0.0, 0.0, 0.0\n6, 3.0, 1.0, 0.0\n7, 3.0, -1.0, 0.0\n*ELEMENT, type=CPS4, ELSET=Surface1\n1, 5, 1, 4, 3\n2, 4, 2, 6, 3\n3, 7, 2, 4, 1\n** ***** HOHQMesh boundary information ***** **\n** mesh polynomial degree = 8\n** 5 1 4 3\n** 0 0 1 1\n** 1.000000000000000 1.000000000000000 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 2.000000000000000 0.0 0.0\n** 0.0 0.0 0.0\n** 0.035513826946206 0.105291711848750 0.0\n** 0.148591270347399 0.317731556850611 0.0\n** 0.340010713990041 0.452219430075470 0.0\n** 0.575000000000000 0.462500000000000 0.0\n** 0.788022294598950 0.483764065630034 0.0\n** 0.926408729652601 0.644768443149389 0.0\n** 0.986453164464803 0.883724792445746 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 4 2 6 3\n** 0 0 0 1\n** 2.000000000000000 0.0 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 7 2 4 1\n** 0 0 0 0\n** Bezier --- Slant ---\n** --- Right --- Top\n** Bottom --- Right ---","category":"page"},{"location":"meshes/p4est_mesh/#Mesh-in-three-spatial-dimensions","page":"P4est-based mesh","title":"Mesh in three spatial dimensions","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The 3D Abaqus file format with high-order boundary information from HOHQMesh is very similar to the 2D version discussed above. There are only three changes:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The element connectivity would be given in terms of the eight corners that define a hexahedron. The corners are numbered as shown in the figure below. The header of the element list changes to be\n*ELEMENT, type=C3D8, ELSET=Volume1\nwhere C3D8 corresponds to a Abaqus hexahedral element.\nThere are six check digits included directly below the eight corner indexes to indicate whether the local face within the element is straight sided, 0, or is curved, 1. For curved faces (x,y,z) coordinate values are available in order to construct an face interpolant with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes.\nThe boundary labels are given in the following order according to the local surface index -x +x -y +y -z +z as required by the p4est library.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For completeness, we also give a short description and derivation of the three-dimensional transfinite mapping formulas used to compute the physical coordinates mathbfx=(xyz) of a (possibly curved) hexahedral element give the reference coordinates boldsymbolxi = (xi eta zeta) which lie in -11^3. That is, we will create an expression mathbfx= mathbfX(boldsymbolxi).","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Below we provide a sketch of a single hexahedral element with curved faces. This is done to introduce the numbering conventions for corners, edges, and faces of the element.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"(Image: abaqus-3dmesh-docs)","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"When the hexahedron is a straight sided (linear) element we compute the transfinite mapping directly from the element corner points according to","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"beginaligned\nmathbfX_linear(boldsymbolxi) = frac18quad mathbfx_1(1-xi)(1-eta)(1-zeta)\n + mathbfx_2(1+xi)(1-eta)(1-zeta)-015cm\n qquad + mathbfx_3(1+xi)(1+eta)(1-zeta)\n + mathbfx_4(1-xi)(1+eta)(1-zeta) \n qquad + mathbfx_5(1-xi)(1-eta)(1+zeta)\n + mathbfx_6(1+xi)(1-eta)(1+zeta) \n qquad + mathbfx_7(1+xi)(1+eta)(1+zeta)\n + mathbfx_8(1-xi)(1+eta)(1+zeta)quad\nendaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Next, we create a transfinite mapping function, mathbfX(boldsymbolxi), for a hexahedron that has one or more curved faces. For this we assume that have a set of six interpolating polynomials Gamma_i_i=1^6 that approximate the faces. The interpolating polynomial for any curved faces is provided by the information in a HOHQMesh Abaqus mesh file or is constructed on the fly via a bi-linear interpolation routine for any linear faces. Explicitly, these six face interpolation polynomials depend on the computational coordinates boldsymbolxi as follows","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":" beginaligned\n Gamma_1(xi zeta) quad quad Gamma_3(xi eta) quad quad Gamma_4(eta zeta)01cm\n Gamma_2(xi zeta) quad quad Gamma_5(xi eta) quad quad Gamma_6(eta zeta)\n endaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"To determine the form of the mapping we first create linear interpolations between two opposing faces, e.g., Gamma_3 and Gamma_5 and sum them together to have","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"beginaligned\n boldsymbolSigma(boldsymbolxi) = frac12quad(1-xi)Gamma_6(etazeta) + (1+xi)Gamma_4(etazeta) -015cm\n qquad+ (1-eta)Gamma_1(xizeta) + (1+eta)Gamma_2(xizeta) -015cm\n qquad +(1-zeta)Gamma_3(xieta) + (1+zeta)Gamma_5(xieta)quad\nendaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Unfortunately, the linear interpolations boldsymbolSigma(boldsymbolxi) no longer match at the faces, e.g., evaluating at eta = -1 we have","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"boldsymbolSigma(xi-1zeta) = Gamma_1(xizeta) + frac12(1-xi)Gamma_6(-1zeta) + (1+xi)Gamma_4(-1zeta)\n +(1-zeta)Gamma_3(xi-1) + (1+zeta)Gamma_5(xi-1)","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"which is the desired face Gamma_1(xizeta) plus four edge error terms. Analogous edge error terms occur at the other faces evaluating boldsymbolSigma(boldsymbolxi) at eta=1, xi=pm 1, and zeta=pm 1. In order to match the faces, we subtract a linear interpolant in the xi, eta, and zeta directions of the edge error terms, e.g., the terms in braces in the above equation. So, continuing the example above, the correction term to be subtracted for face Gamma_1 to match would be","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"left(frac1-eta2right) bigg frac12 (1-xi)Gamma_6(-1zeta) + (1+xi)Gamma_4(-1zeta)+(1-zeta)Gamma_3(xi-1)\n + (1+zeta)Gamma_5(xi-1) bigg","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For clarity, and to allow an easier comparison to the implementation, we introduce auxiliary notation for the 12 edge values present in the complete correction term. That is, for given values of xi, eta, and zeta we have","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":" beginaligned\n textttedge_1 = Gamma_1(xi -1) quad quad textttedge_5 = Gamma_2(xi -1) quad quad textttedge_9 = Gamma_6(eta -1)01cm\n textttedge_2 = Gamma_1(1 zeta) quad quadtextttedge_6 = Gamma_2(1 zeta) quad quad textttedge_10 = Gamma_4(eta -1)01cm\n textttedge_3 = Gamma_1(xi 1) quad quad textttedge_7 = Gamma_2(xi 1) quad quad textttedge_11 = Gamma_4(eta 1)01cm\n textttedge_4 = Gamma_1(-1 zeta) quad quad textttedge_8 = Gamma_2(-1 zeta) quad quad textttedge_12 = Gamma_6(eta 1)\n endaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"With this notation for the edge terms (and after some algebraic manipulation) we write the complete edge correction term, mathcalC_textttedge(boldsymbolxi), as","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"beginaligned\nmathcalC_textttedge(boldsymbolxi) = frac14quad (1-eta)(1-zeta)textttedge_1-015cm\n qquad + (1+xi)(1-eta)textttedge_2 \n qquad + (1-eta)(1+zeta)textttedge_3 \n qquad + (1-xi)(1-eta)textttedge_4 \n qquad + (1+eta)(1-zeta)textttedge_5 \n qquad + (1+xi)(1+eta)textttedge_6 \n qquad + (1+eta)(1+zeta)textttedge_7 \n qquad + (1-xi)(1+eta)textttedge_8 \n qquad + (1-xi)(1-zeta)textttedge_9 \n qquad + (1+xi)(1-zeta)textttedge_10 \n qquad + (1+xi)(1+zeta)textttedge_11 \n qquad + (1-xi)(1+zeta)textttedge_12quad\nendaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"However, subtracting the edge correction terms mathcalC_textttedge(boldsymbolxi) from boldsymbolSigma(boldsymbolxi) removes the interior element contributions twice. Thus, to complete the construction of the transfinite mapping mathbfX(boldsymbolxi) we add the transfinite map of the straight sided hexahedral element to find","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"mathbfX(boldsymbolxi) = boldsymbolSigma(boldsymbolxi)\n - mathcalC_textttedge(boldsymbolxi)\n + mathbfX_linear(boldsymbolxi)","category":"page"},{"location":"troubleshooting/#Troubleshooting-and-FAQ","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"In general, Trixi.jl works best with the newest Julia release and up-to-date dependencies. If something does not work as expected, try updating your installed Julia packages via the package manager, e.g., by running","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"julia> import Pkg; Pkg.update()","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"If you do not use the latest stable release of Julia from the official website, consider updating your Julia installation.","category":"page"},{"location":"troubleshooting/#old-release","page":"Troubleshooting and FAQ","title":"Installing Trixi.jl as a package only provides an older release","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Trixi.jl requires fairly recent versions of several of its dependencies, which sometimes causes issues when other installed packages have conflicting version requirements. In this case, Julia's package manager Pkg will try to handle this gracefully by going back in history until it finds a Trixi.jl release whose version requirements can be met, resulting in an older - and usually outdated - version of Trixi.jl being installed.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"The following example illustrates this issue:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"The current Trixi.jl release v0.3.6 requires package Foo with a minimum version of v0.2.\nAn older Trixi.jl release v0.2.1 requires package Foo only with a minimum version of v0.1.\nA user has already installed package Bar, which itself requires Foo with a maximum version of v0.1.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"In this case, installing Trixi.jl via Pkg will result in version v0.2.1 to be installed instead of the current release v0.3.6. That is, a specific release of Trixi.jl may not be installable if it has a dependency with a higher minimum version that at the same time is restricted to a lower maximum version by another installed package.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"You can check whether an outdated version of Trixi.jl is installed by executing","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"julia> import Pkg; Pkg.update(\"Trixi\"); Pkg.status(\"Trixi\")","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"in the REPL and comparing the reported Trixi.jl version with the version of the latest release. If the versions differ, you can confirm that it is due to a version conflict by forcing Pkg to install the latest Trixi.jl release, where version is the current release:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"julia> Pkg.add(name=\"Trixi\", version=\"0.3.6\")","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"In case of a conflict, the command above will produce an error that informs you about the offending packages, similar to the following:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":" Updating registry at `~/.julia/registries/General`\n Resolving package versions...\nERROR: Unsatisfiable requirements detected for package DataStructures [864edb3b]:\n DataStructures [864edb3b] log:\n ├─possible versions are: [0.9.0, 0.10.0, 0.11.0-0.11.1, 0.12.0, 0.13.0, 0.14.0-0.14.1, 0.15.0, 0.16.1, 0.17.0-0.17.20, 0.18.0-0.18.8] or uninstalled\n ├─restricted by compatibility requirements with DiffEqCallbacks [459566f4] to versions: 0.18.0-0.18.8\n │ └─DiffEqCallbacks [459566f4] log:\n │ ├─possible versions are: [2.0.0, 2.1.0, 2.2.0, 2.3.0, 2.4.0, 2.5.0-2.5.2, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 2.10.0, 2.11.0, 2.12.0-2.12.1, 2.13.0-2.13.5, 2.14.0-2.14.1, 2.15.0] or uninstalled\n │ ├─restricted by compatibility requirements with Trixi [a7f1ee26] to versions: [2.14.0-2.14.1, 2.15.0]\n │ │ └─Trixi [a7f1ee26] log:\n │ │ ├─possible versions are: [0.1.0-0.1.2, 0.2.0-0.2.6, 0.3.0-0.3.6] or uninstalled\n │ │ └─restricted to versions 0.3.6 by an explicit requirement, leaving only versions 0.3.6\n │ └─restricted by compatibility requirements with StaticArrays [90137ffa] to versions: 2.15.0 or uninstalled, leaving only versions: 2.15.0\n │ └─StaticArrays [90137ffa] log:\n │ ├─possible versions are: [0.8.0-0.8.3, 0.9.0-0.9.2, 0.10.0, 0.10.2-0.10.3, 0.11.0-0.11.1, 0.12.0-0.12.5, 1.0.0-1.0.1] or uninstalled\n │ └─restricted by compatibility requirements with Trixi [a7f1ee26] to versions: 1.0.0-1.0.1\n │ └─Trixi [a7f1ee26] log: see above\n └─restricted by compatibility requirements with JLD2 [033835bb] to versions: [0.9.0, 0.10.0, 0.11.0-0.11.1, 0.12.0, 0.13.0, 0.14.0-0.14.1, 0.15.0, 0.16.1, 0.17.0-0.17.20] — no versions left\n └─JLD2 [033835bb] log:\n ├─possible versions are: [0.1.0-0.1.14, 0.2.0-0.2.4, 0.3.0-0.3.1] or uninstalled\n └─restricted by compatibility requirements with BinaryBuilder [12aac903] to versions: 0.1.0-0.1.14\n └─BinaryBuilder [12aac903] log:\n ├─possible versions are: [0.1.0-0.1.2, 0.1.4, 0.2.0-0.2.6] or uninstalled\n └─restricted to versions * by an explicit requirement, leaving only versions [0.1.0-0.1.2, 0.1.4, 0.2.0-0.2.6]","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"From the error message, we can see that ultimately BinaryBuilder is the problem here: It restricts the package DataStructures to version v0.17 (via its dependency JLD2), while Trixi.jl requires at least v0.18 (via its dependency DiffEqCallbacks). Following the official Pkg documentation, there are a number of things you can try to fix such errors:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Try updating all packages with julia -e 'using Pkg; Pkg.update()'. A newer version of the problematic package may exist that has updated version requirements.\nRemove the offending package. Running\njulia> import Pkg; Pkg.rm(\"BinaryBuilder\"); Pkg.update(); Pkg.status()\nin the REPL will remove BinaryBuilder and (hopefully) update Trixi.jl to the latest version.\nReport the versioning issue to us and/or the development repository of the conflicting package. Maybe it is possible to lift the version restrictions such that both packages can live side by side.\nInstead of installing Trixi.jl and conflicting packages in the same (default) environment, consider creating new environments/projects and install only packages required for the specific tasks, as explained in the official Pkg documentation. For example, if you use Trixi.jl for a research project (Bachelor/Master thesis or a paper), you should create a new Julia project/environment for that research and add Trixi.jl as a dependency. If you track all your code and the Project.toml, Manifest.toml files (generated by Pkg) in a version control system such as git, you can make your research easily reproducible (if you also record the version of Julia you are using and leave some comments for others who do not know what you are trying to do, including your future self 😉).","category":"page"},{"location":"troubleshooting/#font-issues","page":"Troubleshooting and FAQ","title":"There are many questions marks and weird symbols in the output of Trixi.jl","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"This probably means that the default font used by your operating system does not support enough Unicode symbols. Try installing a modern font with decent unicode support, e.g. JuliaMono. Detailed installation instructions are available there.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"This problems affects users of Mac OS particularly often. At the time of writing, installing JuliaMono is as simple as","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"$ brew tap homebrew/cask-fonts\n$ brew install --cask font-juliamono","category":"page"},{"location":"troubleshooting/#There-are-no-timing-results-of-the-initial-mesh-creation","page":"Troubleshooting and FAQ","title":"There are no timing results of the initial mesh creation","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"By default, the SummaryCallback resets the timer used internally by Trixi.jl when it is initialized (when solve is called). If this step needs to be timed, e.g. to debug performance problems, explicit timings can be used as follows.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"using Trixi\n\nbegin\n Trixi.reset_timer!(Trixi.timer())\n\n equations = LinearScalarAdvectionEquation2D(0.2, -0.7)\n mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), n_cells_max=10^5, initial_refinement_level=5)\n solver = DGSEM(3)\n semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, solver)\n\n Trixi.print_timer(Trixi.timer())\nend","category":"page"},{"location":"troubleshooting/#MPI-ranks-are-assigned-zero-cells-in-[P4estMesh](@ref)-even-though-there-are-enough-cells","page":"Troubleshooting and FAQ","title":"MPI ranks are assigned zero cells in P4estMesh even though there are enough cells","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"The P4estMesh allows one to coarsen the mesh by default. When Trixi.jl is parallelized with multiple MPI ranks, this has the consequence that sibling cells (i.e., child cells with the same parent cell) are kept on the same MPI rank to be able to coarsen them easily. This might cause an unbalanced distribution of cells on different ranks. For 2D meshes, this also means that initially each rank will at least own 4 cells, and for 3D meshes, initially each rank will at least own 8 cells. See issue #1329.","category":"page"},{"location":"troubleshooting/#Installing-and-updating-everything-takes-a-lot-of-time","page":"Troubleshooting and FAQ","title":"Installing and updating everything takes a lot of time","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Julia compiles code to get good (C/Fortran-like) performance. At the same time, Julia provides a dynamic environment and usually compiles code just before using it. Over time, Julia has improved its caching infrastructure, allowing to store and reuse more results from (pre-)compilation. This often results in an increased time to install/update packages, in particular when updating to Julia v1.8 or v1.9 from older versions.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Some packages used together with Trixi.jl provide options to configure the amount of precompilation. For example, OrdinaryDiffEq.jl precompiles many ODE solvers for a good runtime experience of average users. Currently, Trixi.jl does not use all of the available solvers. Thus, you can save some time at every update by setting their precompilation options.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"At the time of writing, this could look as follows. First, you need to activate the environment where you have installed OrdinaryDiffEq.jl. Then, you need to execute the following Julia code.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"using Preferences, UUIDs\nlet uuid = UUID(\"1dea7af3-3e70-54e6-95c3-0bf5283fa5ed\")\n set_preferences!(uuid, \"PrecompileAutoSpecialize\" => false)\n set_preferences!(uuid, \"PrecompileAutoSwitch\" => false)\n set_preferences!(uuid, \"PrecompileDefaultSpecialize\" => true)\n set_preferences!(uuid, \"PrecompileFunctionWrapperSpecialize\" => false)\n set_preferences!(uuid, \"PrecompileLowStorage\" => true)\n set_preferences!(uuid, \"PrecompileNoSpecialize\" => false)\n set_preferences!(uuid, \"PrecompileNonStiff\" => true)\n set_preferences!(uuid, \"PrecompileStiff\" => false)\nend","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"This disables precompilation of all implicit methods. This should usually not affect the runtime latency with Trixi.jl since most setups use explicit time integration methods.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"EditURL = \"../../literate/src/files/shock_capturing.jl\"","category":"page"},{"location":"tutorials/shock_capturing/#shock_capturing","page":"3 Shock capturing with flux differencing and stage limiter","title":"3: Shock capturing with flux differencing and stage limiter","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"This tutorial contains a short summary of the idea of shock capturing for DGSEM with flux differencing and its implementation in Trixi.jl. In the second part, an implementation of a positivity preserving limiter is added to the simulation.","category":"page"},{"location":"tutorials/shock_capturing/#Shock-capturing-with-flux-differencing","page":"3 Shock capturing with flux differencing and stage limiter","title":"Shock capturing with flux differencing","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"The following rough explanation is on a very basic level. More information about an entropy stable shock-capturing strategy for DGSEM discretizations of advection dominated problems, such as the compressible Euler equations or the compressible Navier-Stokes equations, can be found in Hennemann et al. (2021). In Rueda-Ramírez et al. (2021) you find the extension to the systems with non-conservative terms, such as the compressible magnetohydrodynamics (MHD) equations.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"The strategy for a shock-capturing method presented by Hennemann et al. is based on a hybrid blending of a high-order DG method with a low-order variant. The low-order subcell finite volume (FV) method is created directly with the Legendre-Gauss-Lobatto (LGL) nodes already used for the high-order DGSEM. Then, the final method is a convex combination with regulating indicator alpha of these two methods.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Since the surface integral is equal for both the DG and the subcell FV method, only the volume integral divides between the two methods.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"This strategy for the volume integral is implemented in Trixi.jl under the name of VolumeIntegralShockCapturingHG with the three parameters of the indicator and the volume fluxes for the DG and the subcell FV method.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Note, that the DG method is based on the flux differencing formulation. Hence, you have to use a two-point flux, such as flux_ranocha, flux_shima_etal, flux_chandrashekar or flux_kennedy_gruber, for the DG volume flux. We would recommend to use the entropy conserving flux flux_ranocha by Ranocha (2018) for the compressible Euler equations.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;\n volume_flux_dg=volume_flux_dg,\n volume_flux_fv=volume_flux_fv)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"We now focus on a choice of the shock capturing indicator indicator_sc. A possible indicator is alpha_HG presented by Hennemann et al. (p.10), which depends on the current approximation with modal coefficients m_j_j=0^N of a given variable.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"The indicator is calculated for every DG element by itself. First, we calculate a smooth alpha by","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"alpha = frac11+exp(-frac-smathbbT(mathbbE-mathbbT))","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"with the total energy mathbbE=maxbig(fracm_N^2sum_j=0^N m_j^2 fracm_N-1^2sum_j=0^N-1 m_j^2big), threshold mathbbT= 05 * 10^-18*(N+1)^14 and parameter s=lnbig(frac1-0000100001big)approx 921024.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"For computational efficiency, alpha_min is introduced and used for","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"tildealpha = begincases\n0 textif alphaalpha_min\nalpha textif alpha_minleq alpha leq 1- alpha_min\n1 textif 1-alpha_minalpha\nendcases","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Moreover, the parameter alpha_max sets a maximal value for alpha by","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"alpha = mintildealpha alpha_max","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"This allows to control the maximal dissipation.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"To remove numerical artifact the final indicator is smoothed with all the neighboring elements' indicators. This is activated with alpha_smooth=true.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"alpha_HG = max_E alpha 05 * alpha_E","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"where E are all elements sharing a face with the current element.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Furthermore, you can specify the variable used for the calculation. For instance you can choose density, pressure or both with density_pressure for the compressible Euler equations. For every equation there is also the option to use the first conservation variable with first.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"This indicator is implemented in Trixi.jl and called IndicatorHennemannGassner with the parameters equations, basis, alpha_max, alpha_min, alpha_smooth and variable.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"indicator_sc = IndicatorHennemannGassner(equations, basis,\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable=variable)","category":"page"},{"location":"tutorials/shock_capturing/#Positivity-preserving-limiter","page":"3 Shock capturing with flux differencing and stage limiter","title":"Positivity preserving limiter","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Some numerical solutions are physically meaningless, for instance negative values of pressure or density for the compressible Euler equations. This often results in crashed simulations since the calculation of numerical fluxes or stable time steps uses mathematical operations like roots or logarithms. One option to avoid these cases are a-posteriori positivity preserving limiters. Trixi.jl provides the fully-discrete positivity-preserving limiter of Zhang, Shu (2011).","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"It works the following way. For every passed (scalar) variable and for every DG element we calculate the minimal value value_min. If this value falls below the given threshold varepsilon, the approximation is slightly adapted such that the minimal value of the relevant variable lies now above the threshold.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"underlineu^new = theta * underlineu + (1-theta) * u_mean","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"where underlineu are the collected pointwise evaluation coefficients in element e and u_mean the integral mean of the quantity in e. The new coefficients are a convex combination of these two values with factor","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"theta = fracvalue_mean - varepsilonvalue_mean - value_min","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"where value_mean is the relevant variable evaluated for the mean value u_mean.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"The adapted approximation keeps the exact same mean value, but the relevant variable is now greater or equal the threshold varepsilon at every node in every element.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"We specify the variables the way we did before for the shock capturing variables. For the compressible Euler equations density, pressure or the combined variable density_pressure are a reasonable choice.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"You can implement the limiter in Trixi.jl using PositivityPreservingLimiterZhangShu with parameters threshold and variables.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=thresholds,\n variables=variables)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Then, the limiter is added to the time integration method in the solve function. For instance, like","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"CarpenterKennedy2N54(stage_limiter!, williamson_condition=false)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"or","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"SSPRK43(stage_limiter!).","category":"page"},{"location":"tutorials/shock_capturing/#Simulation-with-shock-capturing-and-positivity-preserving","page":"3 Shock capturing with flux differencing and stage limiter","title":"Simulation with shock capturing and positivity preserving","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Now, we can run a simulation using the described methods of shock capturing and positivity preserving limiters. We want to give an example for the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"using OrdinaryDiffEq, Trixi\n\nequations = CompressibleEulerEquations2D(1.4)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"As our initial condition we use the Sedov blast wave setup.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"function initial_condition_sedov_blast_wave(x, t, equations::CompressibleEulerEquations2D)\n # Set up polar coordinates\n inicenter = SVector(0.0, 0.0)\n x_norm = x[1] - inicenter[1]\n y_norm = x[2] - inicenter[2]\n r = sqrt(x_norm^2 + y_norm^2)\n\n r0 = 0.21875 # = 3.5 * smallest dx (for domain length=4 and max-ref=6)\n # r0 = 0.5 # = more reasonable setup\n E = 1.0\n p0_inner = 3 * (equations.gamma - 1) * E / (3 * pi * r0^2)\n p0_outer = 1.0e-5 # = true Sedov setup\n # p0_outer = 1.0e-3 # = more reasonable setup\n\n # Calculate primitive variables\n rho = 1.0\n v1 = 0.0\n v2 = 0.0\n p = r > r0 ? p0_outer : p0_inner\n\n return prim2cons(SVector(rho, v1, v2, p), equations)\nend\ninitial_condition = initial_condition_sedov_blast_wave","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"basis = LobattoLegendreBasis(3)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"We set the numerical fluxes and divide between the surface flux and the two volume fluxes for the DG and FV method. Here, we are using flux_lax_friedrichs and flux_ranocha.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"surface_flux = flux_lax_friedrichs\nvolume_flux = flux_ranocha","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Now, we specify the shock capturing indicator alpha.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"We implement the described indicator of Hennemann, Gassner as explained above with parameters equations, basis, alpha_max, alpha_min, alpha_smooth and variable. Since density and pressure are the critical variables in this example, we use density_pressure = density * pressure = rho * p as indicator variable.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"indicator_sc = IndicatorHennemannGassner(equations, basis,\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable=density_pressure)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"Now, we can use the defined fluxes and the indicator to implement the volume integral using shock capturing.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;\n volume_flux_dg=volume_flux,\n volume_flux_fv=surface_flux)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"We finalize the discretization by implementing Trixi.jl's solver, mesh, semi and ode, while solver now has the extra parameter volume_integral.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"solver = DGSEM(basis, surface_flux, volume_integral)\n\ncoordinates_min = (-2.0, -2.0)\ncoordinates_max = ( 2.0, 2.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=6,\n n_cells_max=10_000)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan);\nnothing #hide","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"We add some callbacks to get an solution analysis and use a CFL-based time step size calculation.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"analysis_callback = AnalysisCallback(semi, interval=100)\n\nstepsize_callback = StepsizeCallback(cfl=0.8)\n\ncallbacks = CallbackSet(analysis_callback, stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"We now run the simulation using the positivity preserving limiter of Zhang and Shu for the variables density and pressure.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=(5.0e-6, 5.0e-6),\n variables=(Trixi.density, pressure))\n\nsol = solve(ode, CarpenterKennedy2N54(stage_limiter!, williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\n\nusing Plots\nplot(sol)","category":"page"},{"location":"tutorials/shock_capturing/#Package-versions","page":"3 Shock capturing with flux differencing and stage limiter","title":"Package versions","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"","category":"page"},{"location":"tutorials/shock_capturing/","page":"3 Shock capturing with flux differencing and stage limiter","title":"3 Shock capturing with flux differencing and stage limiter","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"EditURL = \"../../literate/src/files/DGMulti_1.jl\"","category":"page"},{"location":"tutorials/DGMulti_1/#DGMulti_1","page":"5 DG schemes via DGMulti solver","title":"5: DG schemes via DGMulti solver","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"DGMulti is a DG solver that allows meshes with simplex elements. The basic idea and implementation of this solver is explained in section \"Meshes\". Here, we want to give some examples and a quick overview about the options with DGMulti.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"We start with a simple example we already used in the tutorial about flux differencing. There, we implemented a simulation with initial_condition_weak_blast_wave for the 2D compressible Euler equations CompressibleEulerEquations2D and used the DG formulation with flux differencing using volume flux flux_ranocha and surface flux flux_lax_friedrichs.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"Here, we want to implement the equivalent example, only now using the DGMulti solver instead of DGSEM.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq\n\nequations = CompressibleEulerEquations2D(1.4)\n\ninitial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"To use the Gauss-Lobatto nodes again, we choose approximation_type=SBP() in the solver. Since we want to start with a Cartesian domain discretized with squares, we use the element type Quad().","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3,\n element_type = Quad(),\n approximation_type = SBP(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))\n\ncells_per_dimension = (32, 32)\nmesh = DGMultiMesh(dg,\n cells_per_dimension, # initial_refinement_level = 5\n coordinates_min=(-2.0, -2.0),\n coordinates_max=( 2.0, 2.0),\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n boundary_conditions=boundary_condition_periodic)\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=10)\nanalysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\ncallbacks = CallbackSet(analysis_callback, alive_callback);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"Run the simulation with the same time integration algorithm as before.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"sol = solve(ode, RDPK3SpFSAL49(), abstol=1.0e-6, reltol=1.0e-6,\n callback=callbacks, save_everystep=false);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"plot(pd[\"rho\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"This simulation is not as fast as the equivalent with TreeMesh since no special optimizations for quads (for instance tensor product structure) have been implemented. Figure 4 in \"Efficient implementation of modern entropy stable and kinetic energy preserving discontinuous Galerkin methods for conservation laws\" (2021) provides a nice runtime comparison between the different mesh types. On the other hand, the functions are more general and thus we have more option we can choose from.","category":"page"},{"location":"tutorials/DGMulti_1/#Simulation-with-Gauss-nodes","page":"5 DG schemes via DGMulti solver","title":"Simulation with Gauss nodes","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"For instance, we can change the approximation type of our simulation.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq\nequations = CompressibleEulerEquations2D(1.4)\ninitial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"We now use Gauss nodes instead of Gauss-Lobatto nodes which can be done for the element types Quad() and Hex(). Therefore, we set approximation_type=GaussSBP(). Alternatively, we can use a modal approach using the approximation type Polynomial().","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3,\n element_type = Quad(),\n approximation_type = GaussSBP(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))\n\ncells_per_dimension = (32, 32)\nmesh = DGMultiMesh(dg,\n cells_per_dimension, # initial_refinement_level = 5\n coordinates_min=(-2.0, -2.0),\n coordinates_max=( 2.0, 2.0),\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n boundary_conditions=boundary_condition_periodic)\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=10)\nanalysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\ncallbacks = CallbackSet(analysis_callback, alive_callback);\n\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)","category":"page"},{"location":"tutorials/DGMulti_1/#Simulation-with-triangular-elements","page":"5 DG schemes via DGMulti solver","title":"Simulation with triangular elements","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"Also, we can set another element type. We want to use triangles now.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq\nequations = CompressibleEulerEquations2D(1.4)\ninitial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"Since there is no direct equivalent to Gauss-Lobatto nodes on triangles, the approximation type SBP() now uses Gauss-Lobatto nodes on faces and special nodes in the interior of the triangular. More details can be found in the documentation of StartUpDG.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3,\n element_type = Tri(),\n approximation_type = SBP(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))\n\ncells_per_dimension = (32, 32)\nmesh = DGMultiMesh(dg,\n cells_per_dimension, # initial_refinement_level = 5\n coordinates_min=(-2.0, -2.0),\n coordinates_max=( 2.0, 2.0),\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n boundary_conditions=boundary_condition_periodic)\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=10)\nanalysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\ncallbacks = CallbackSet(analysis_callback, alive_callback);\n\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"plot(pd[\"rho\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/DGMulti_1/#Triangular-meshes-on-non-Cartesian-domains","page":"5 DG schemes via DGMulti solver","title":"Triangular meshes on non-Cartesian domains","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"To use triangular meshes on a non-Cartesian domain, Trixi.jl uses the package StartUpDG.jl. The following example is based on elixir_euler_triangulate_pkg_mesh.jl and uses a pre-defined mesh from StartUpDG.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"We want to simulate the smooth initial condition initial_condition_convergence_test with source terms source_terms_convergence_test for the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"equations = CompressibleEulerEquations2D(1.4)\ninitial_condition = initial_condition_convergence_test\nsource_terms = source_terms_convergence_test","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"We create the solver DGMulti with triangular elements (Tri()) as before.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3, element_type = Tri(),\n approximation_type=Polynomial(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"StartUpDG.jl provides for instance a pre-defined Triangulate geometry for a rectangular domain with hole RectangularDomainWithHole. Other pre-defined Triangulate geometries are e.g., SquareDomain, Scramjet, and CircularDomain.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"meshIO = StartUpDG.triangulate_domain(StartUpDG.RectangularDomainWithHole());\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"The pre-defined Triangulate geometry in StartUpDG has integer boundary tags. With DGMultiMesh we assign boundary faces based on these integer boundary tags and create a mesh compatible with Trixi.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"mesh = DGMultiMesh(dg, meshIO, Dict(:outer_boundary=>1, :inner_boundary=>2))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"boundary_condition_convergence_test = BoundaryConditionDirichlet(initial_condition)\nboundary_conditions = (; :outer_boundary => boundary_condition_convergence_test,\n :inner_boundary => boundary_condition_convergence_test)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n source_terms = source_terms,\n boundary_conditions = boundary_conditions)\n\ntspan = (0.0, 0.2)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=20)\nanalysis_callback = AnalysisCallback(semi, interval=200, uEltype=real(dg))\ncallbacks = CallbackSet(alive_callback, analysis_callback);\n\nsol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt = 0.5 * estimate_dt(mesh, dg), save_everystep=false, callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd[\"rho\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"For more information, please have a look in the StartUpDG.jl documentation.","category":"page"},{"location":"tutorials/DGMulti_1/#Package-versions","page":"5 DG schemes via DGMulti solver","title":"Package versions","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"StartUpDG\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"","category":"page"},{"location":"tutorials/DGMulti_1/","page":"5 DG schemes via DGMulti solver","title":"5 DG schemes via DGMulti solver","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"EditURL = \"../../literate/src/files/adding_new_scalar_equations.jl\"","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#adding_new_scalar_equations","page":"8 Adding a new scalar conservation law","title":"8: Adding a new scalar conservation law","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"If you want to use Trixi.jl for your own research, you might be interested in a new physics model that's not already included in Trixi.jl. In this tutorial, we will implement the cubic conservation law","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"partial_t u(tx) + partial_x u(tx)^3 = 0","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"in a periodic domain in one space dimension. In Trixi.jl, such a mathematical model is encoded as a subtype of Trixi.AbstractEquations.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Basic-setup","page":"8 Adding a new scalar conservation law","title":"Basic setup","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"using Trixi\n\nstruct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,\n 1 #= number of primary variables, i.e. scalar =#};\nend","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"We create CubicEquation as an empty struct since we do not use any parameters for this equation. Other models could bundle arbitrary parameters, e.g., the ideal gas constant for the compressible Euler equations.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"Next, we define the physical flux f(u) = u^3 using the calling structure used in Trixi.jl.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"Trixi.flux(u, orientation, equation::CubicEquation) = u.^3\nTrixi.varnames(_, ::CubicEquation) = (\"scalar\",)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"In Trixi.jl, the conserved variables u are usually passed as SVectors of variables at a single physical location. Hence, we must use u.^3 instead of the scalar operation u^3.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"That's already enough to run a simple simulation with a standard DGSEM discretization using the non-dissipative central flux at interfaces.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"using OrdinaryDiffEq\n\n# Create a simulation setup\nequation = CubicEquation()\n\ninitial_condition_sine(x, t, equation::CubicEquation) = SVector(sinpi(x[1]))\n\nmesh = TreeMesh(-1.0, 1.0, # min/max coordinates\n initial_refinement_level=4,\n n_cells_max=10^4)\n\nsolver = DGSEM(3 #= polynomial degree =#, flux_central)\n\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"We wrap the return value of the initial_condition_sine inside an SVector since that's the approach used in Trixi.jl also for systems of equations. We need to index the spatial coordinate x[1], since it is an SVector with one component. In multiple space dimensions, all spatial coordinates are passed together.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"Next, we create an ODEProblem from the SciML/DifferentialEquations ecosystem. We can solve this ODE numerically using any time integration method, e.g., SSPRK43 from OrdinaryDiffEq.jl. Before, we set up a callback to summarize the simulation setup.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"# Create ODE problem with given time span\ntspan = (0.0, 0.09)\node = semidiscretize(semi, tspan)\n\nsummary_callback = SummaryCallback()\ncallbacks = CallbackSet(summary_callback)\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks\nsol = solve(ode, SSPRK43();\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"That's it, you ran your first simulation using your new equation with Trixi.jl! Now, we can plot the solution at the final time using Plots.jl.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"You can already see that discontinuities will develop and oscillations start to occur around steep parts of the wave. That's expected from our central discretization. To avoid these issues, we need to use dissipative numerical fluxes (approximate Riemann solvers) at interfaces.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Advanced-setup","page":"8 Adding a new scalar conservation law","title":"Advanced setup","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"Thus, we add a Godunov's flux for our cubic equation. That is easy for this equation since the wave speed f'(u) = 3u^2 is always non-negative.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"@inline Trixi.flux_godunov(u_ll, u_rr, orientation, equation::CubicEquation) = flux(u_ll, orientation, equation)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"Let's run the example again but with a dissipative numerical flux at interfaces. remake will recreate the semidiscretization we used before and only change selected parameters, in this case the solver.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"# A new setup with dissipation\nsemi = remake(semi, solver=DGSEM(3, flux_godunov))\node = semidiscretize(semi, tspan)\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot!(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"You can see that there are fewer oscillations, in particular around steep edges. Now let's increase the final time (and also the spatial resolution).","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)\nsemi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))\node = semidiscretize(semi, (0.0, 0.5) #= tspan =#)\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"You can observe that nonclassical shocks develop and are stable under grid refinement, e.g. for initial_refinement_level=12. In this case, these nonclassical shocks can be avoided by using an entropy-dissipative semidiscretization. Thus, we need to define an entropy-conservative numerical flux","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"@inline function Trixi.flux_ec(u_ll, u_rr, orientation, equation::CubicEquation)\n return SVector(0.25 * (u_ll[1]^3 + u_ll[1]^2 * u_rr[1] + u_ll[1] * u_rr[1]^2 + u_rr[1]^3))\nend","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"and use a VolumeIntegralFluxDifferencing instead of the standard VolumeIntegralWeakForm in the DGSEM.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"# Let's use a provably entropy-dissipative semidiscretization\nsemi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))\node = semidiscretize(semi, (0.0, 0.5))\nsol = solve(ode, SSPRK43(); ode_default_options()...);\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"Possible next steps could be","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"to define Trixi.max_abs_speeds(u, equations::CubicEquation) = 3 * u[1]^2 to use CFL-based time step control via a StepsizeCallback\nto define quantities of interest like Trixi.entropy(u, equations::CubicEquation) = u[1]^2 and integrate them in a simulation using the AnalysisCallback\nto experiment with shock-capturing volume integrals VolumeIntegralShockCapturingHG and adaptive mesh refinement AMRCallback","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"For further reading, Trixi.jl provides another example on adding a scalar equation. In the elixir about the KPP problem, the 2D scalar \"KPP equation\" from Kurganov, Petrova, Popov (2007) is implemented.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Summary-of-the-code","page":"8 Adding a new scalar conservation law","title":"Summary of the code","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"To sum up, here is the complete code that we used (without the callbacks since these create a lot of unnecessary output in the doctests of this tutorial). In addition, we create the struct inside the new module CubicConservationLaw. That ensures that we can re-create structs defined therein without having to restart Julia.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"# Define new physics\nmodule CubicConservationLaw\n\nusing Trixi\n\nstruct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,\n 1 #= number of primary variables, i.e. scalar =#}\nend\n\n@inline Trixi.flux(u, orientation, equation::CubicEquation) = u.^3\nTrixi.varnames(_, ::CubicEquation) = (\"scalar\",)\n\n@inline Trixi.flux_godunov(u_ll, u_rr, orientation, equation::CubicEquation) = flux(u_ll, orientation, equation)\n@inline function Trixi.flux_ec(u_ll, u_rr, orientation, equation::CubicEquation)\n return SVector(0.25 * (u_ll[1]^3 + u_ll[1]^2 * u_rr[1] + u_ll[1] * u_rr[1]^2 + u_rr[1]^3))\nend\n\nend # module\n\n\n# Create a simulation setup\nimport .CubicConservationLaw\nusing Trixi\nusing OrdinaryDiffEq\nusing Plots\n\nequation = CubicConservationLaw.CubicEquation()\n\ninitial_condition_sine(x, t, equation::CubicConservationLaw.CubicEquation) = SVector(sinpi(x[1]))\n\nmesh = TreeMesh(-1.0, 1.0, # min/max coordinates\n initial_refinement_level=4,\n n_cells_max=10^4)\n\nsolver = DGSEM(3 #= polynomial degree =#, flux_central)\n\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\n# Create ODE problem with given time span\ntspan = (0.0, 0.1)\node = semidiscretize(semi, tspan)\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)\n\n\n# A new setup with dissipation\nsemi = remake(semi, solver=DGSEM(3, flux_godunov))\node = semidiscretize(semi, tspan)\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot!(sol)\n\n\n# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)\nsemi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))\node = semidiscretize(semi, (0.0, 0.5))\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)\n\n\n# Let's use a provably entropy-dissipative semidiscretization\nsemi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))\node = semidiscretize(semi, (0.0, 0.5))\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Package-versions","page":"8 Adding a new scalar conservation law","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"8 Adding a new scalar conservation law","title":"8 Adding a new scalar conservation law","text":"This page was generated using Literate.jl.","category":"page"},{"location":"time_integration/#time-integration","page":"Time integration","title":"Time integration methods","text":"","category":"section"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, explicit Runge-Kutta methods from OrdinaryDiffEq.jl are tested extensively. Interesting classes of time integration schemes are","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"Explicit low-storage Runge-Kutta methods\nStrong stability preserving methods","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"Some common options for solve from OrdinaryDiffEq.jl are the following. Further documentation can be found in the SciML docs.","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"If you use a fixed time step method like CarpenterKennedy2N54, you need to pass a time step as dt=.... If you use a StepsizeCallback, the value passed as dt=... is irrelevant since it will be overwritten by the StepsizeCallback. If you want to use an adaptive time step method such as SSPRK43 or RDPK3SpFSAL49 and still want to use CFL-based step size control via the StepsizeCallback, you need to pass the keyword argument adaptive=false to solve.\nYou should usually set save_everystep=false. Otherwise, OrdinaryDiffEq.jl will (try to) save the numerical solution after every time step in RAM (until you run out of memory or start to swap).\nYou can set the maximal number of time steps via maxiters=....\nSSP methods and many low-storage methods from OrdinaryDiffEq.jl support stage_limiter!s and step_limiter!s, e.g., PositivityPreservingLimiterZhangShu from Trixi.jl.\nIf you start Julia with multiple threads and want to use them also in the time integration method from OrdinaryDiffEq.jl, you need to pass the keyword argument thread=OrdinaryDiffEq.True() to the algorithm, e.g., RDPK3SpFSAL49(thread=OrdinaryDiffEq.True()) or CarpenterKennedy2N54(thread=OrdinaryDiffEq.True(), williamson_condition=false). For more information on using thread-based parallelism in Trixi.jl, please refer to Shared-memory parallelization with threads.\nIf you use error-based step size control (see also the section on error-based adaptive step sizes together with MPI, you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to OrdinaryDiffEq's solve, which are both included in ode_default_options.","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"note: Number of `rhs!` calls\nIf you use explicit Runge-Kutta methods from OrdinaryDiffEq.jl, the total number of rhs! calls can be (slightly) bigger than the number of steps times the number of stages, e.g. to allow for interpolation (dense output), root-finding for continuous callbacks, and error-based time step control. In general, you often should not need to worry about this if you use Trixi.jl.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"EditURL = \"../../literate/src/files/upwind_fdsbp.jl\"","category":"page"},{"location":"tutorials/upwind_fdsbp/#upwind_fdsbp","page":"7 Upwind FD SBP schemes","title":"7: Upwind FD SBP schemes","text":"","category":"section"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"General tensor product SBP methods are supported via the DGMulti solver in a reasonably complete way, see the previous tutorial. Nevertheless, there is also experimental support for SBP methods with other solver and mesh types.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"The first step is to set up an SBP operator. A classical (central) SBP operator can be created as follows.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"using Trixi\nD_SBP = derivative_operator(SummationByPartsOperators.MattssonNordström2004(),\n derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Instead of prefixing the source of coefficients MattssonNordström2004(), you can also load the package SummationByPartsOperators.jl. Either way, this yields an object representing the operator efficiently. If you want to compare it to coefficients presented in the literature, you can convert it to a matrix.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Matrix(D_SBP)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Upwind SBP operators are a concept introduced in 2017 by Ken Mattsson. You can create them as follows.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"D_upw = upwind_operators(SummationByPartsOperators.Mattsson2017,\n derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Upwind operators are derivative operators biased towards one direction. The \"minus\" variants has a bias towards the left side, i.e., it uses values from more nodes to the left than from the right to compute the discrete derivative approximation at a given node (in the interior of the domain). In matrix form, this means more non-zero entries are left from the diagonal.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Matrix(D_upw.minus)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Analogously, the \"plus\" variant has a bias towards the right side.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Matrix(D_upw.plus)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"For more information on upwind SBP operators, please refer to the documentation of SummationByPartsOperators.jl and references cited there.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"The basic idea of upwind SBP schemes is to apply a flux vector splitting and use appropriate upwind operators for both parts of the flux. In 1D, this means to split the flux","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"f(u) = f^-(u) + f^+(u)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"such that f^-(u) is associated with left-going waves and f^+(u) with right-going waves. Then, we apply upwind SBP operators D^- D^+ with an appropriate upwind bias, resulting in","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"partial_x f(u) approx D^+ f^-(u) + D^- f^+(u)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Note that the established notations of upwind operators D^pm and flux splittings f^pm clash. The right-going waves from f^+ need an operator biased towards their upwind side, i.e., the left side. This upwind bias is provided by the operator D^-.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Many classical flux vector splittings have been developed for finite volume methods and are described in the book \"Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction\" of Eleuterio F. Toro (2009), DOI: 10.1007/b79761. One such a well-known splitting provided by Trixi.jl is splitting_steger_warming.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"Trixi.jl comes with several example setups using upwind SBP methods with flux vector splitting, e.g.,","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"elixir_euler_vortex.jl\nelixir_euler_taylor_green_vortex.jl","category":"page"},{"location":"tutorials/upwind_fdsbp/#Package-versions","page":"7 Upwind FD SBP schemes","title":"Package versions","text":"","category":"section"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"SummationByPartsOperators\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"7 Upwind FD SBP schemes","title":"7 Upwind FD SBP schemes","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"EditURL = \"../../literate/src/files/hohqmesh_tutorial.jl\"","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#hohqmesh_tutorial","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14: Unstructured meshes with HOHQMesh.jl","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Trixi.jl supports numerical approximations on unstructured quadrilateral meshes with the UnstructuredMesh2D mesh type.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The purpose of this tutorial is to demonstrate how to use the UnstructuredMesh2D functionality of Trixi.jl. This begins by running and visualizing an available unstructured quadrilateral mesh example. Then, the tutorial will demonstrate how to conceptualize a problem with curved boundaries, generate a curvilinear mesh using the available software in the Trixi.jl ecosystem, and then run a simulation using Trixi.jl on said mesh.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Unstructured quadrilateral meshes can be made with the High-Order Hex-Quad Mesh (HOHQMesh) generator created and developed by David Kopriva. HOHQMesh is a mesh generator specifically designed for spectral element methods. It provides high-order boundary curve information (needed to accurately set boundary conditions) and elements can be larger (due to the high accuracy of the spatial approximation) compared to traditional finite element mesh generators. For more information about the design and features of HOHQMesh one can refer to its official documentation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"HOHQMesh is incorporated into the Trixi.jl framework via the registered Julia package HOHQMesh.jl. This package provides a Julia wrapper for the HOHQMesh generator that allows users to easily create mesh files without the need to build HOHQMesh from source. To install the HOHQMesh package execute","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"import Pkg; Pkg.add(\"HOHQMesh\")","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Now we are ready to generate an unstructured quadrilateral mesh that can be used by Trixi.jl.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Running-and-visualizing-an-unstructured-simulation","page":"14 Unstructured meshes with HOHQMesh.jl","title":"Running and visualizing an unstructured simulation","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Trixi.jl supports solving hyperbolic problems on several mesh types. There is a default example for this mesh type that can be executed by","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"using Trixi\nredirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi_include(default_example_unstructured())\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"This will compute a smooth, manufactured solution test case for the 2D compressible Euler equations on the curved quadrilateral mesh described in the Trixi.jl documentation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Apart from the usual error and timing output provided by the Trixi.jl run, it is useful to visualize and inspect the solution. One option available in the Trixi.jl framework to visualize the solution on unstructured quadrilateral meshes is post-processing the Trixi.jl output file(s) with the Trixi2Vtk tool and plotting them with ParaView.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"To convert the HDF5-formatted .h5 output file(s) from Trixi.jl into VTK format execute the following","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"using Trixi2Vtk\nredirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi2vtk(\"out/solution_000180.h5\", output_directory=\"out\")\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Note this step takes about 15-30 seconds as the package Trixi2Vtk must be precompiled and executed for the first time in your REPL session. The trixi2vtk command above will convert the solution file at the final time into a .vtu file which can be read in and visualized with ParaView. Optional arguments for trixi2vtk are: (1) Pointing to the output_directory where the new files will be saved; it defaults to the current directory. (2) Specifying a higher number of visualization nodes. For instance, if we want to use 12 uniformly spaced nodes for visualization we can execute","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"redirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi2vtk(\"out/solution_000180.h5\", output_directory=\"out\", nvisnodes=12)\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"By default trixi2vtk sets nvisnodes to be the same as the number of nodes specified in the elixir file used to run the simulation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Finally, if you want to convert all the solution files to VTK execute","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"redirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi2vtk(\"out/solution_000*.h5\", output_directory=\"out\", nvisnodes=12)\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"then it is possible to open the .pvd file with ParaView and create a video of the simulation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Creating-a-mesh-using-HOHQMesh","page":"14 Unstructured meshes with HOHQMesh.jl","title":"Creating a mesh using HOHQMesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The creation of an unstructured quadrilateral mesh using HOHQMesh.jl is driven by a control file. In this file the user dictates the domain to be meshed, prescribes any desired boundary curvature, the polynomial order of said boundaries, etc. In this tutorial we cover several basic features of the possible control inputs. For a complete discussion on this topic see the HOHQMesh control file documentation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"To begin, we provide a complete control file in this tutorial. After this we give a breakdown of the control file components to explain the chosen parameters.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Suppose we want to create a mesh of a domain with straight sided outer boundaries and a curvilinear \"ice cream cone\" shaped object at its center.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"(Image: mesh_boundary_cartoon)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The associated ice_cream_straight_sides.control file is created below.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"open(\"out/ice_cream_straight_sides.control\", \"w\") do io\n println(io, raw\"\"\"\n\\begin{CONTROL_INPUT}\n \\begin{RUN_PARAMETERS}\n mesh file name = ice_cream_straight_sides.mesh\n plot file name = ice_cream_straight_sides.tec\n stats file name = none\n mesh file format = ISM-v2\n polynomial order = 4\n plot file format = skeleton\n \\end{RUN_PARAMETERS}\n\n \\begin{BACKGROUND_GRID}\n x0 = [-8.0, -8.0, 0.0]\n dx = [1.0, 1.0, 0.0]\n N = [16,16,1]\n \\end{BACKGROUND_GRID}\n\n \\begin{SPRING_SMOOTHER}\n smoothing = ON\n smoothing type = LinearAndCrossBarSpring\n number of iterations = 25\n \\end{SPRING_SMOOTHER}\n\n\\end{CONTROL_INPUT}\n\n\\begin{MODEL}\n\n \\begin{INNER_BOUNDARIES}\n\n \\begin{CHAIN}\n name = IceCreamCone\n \\begin{END_POINTS_LINE}\n name = LeftSlant\n xStart = [-2.0, 1.0, 0.0]\n xEnd = [ 0.0, -3.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{END_POINTS_LINE}\n name = RightSlant\n xStart = [ 0.0, -3.0, 0.0]\n xEnd = [ 2.0, 1.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{CIRCULAR_ARC}\n name = IceCream\n units = degrees\n center = [ 0.0, 1.0, 0.0]\n radius = 2.0\n start angle = 0.0\n end angle = 180.0\n \\end{CIRCULAR_ARC}\n \\end{CHAIN}\n\n \\end{INNER_BOUNDARIES}\n\n\\end{MODEL}\n\\end{FILE}\n\"\"\")\nend","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The first three blocks of information are wrapped within a CONTROL_INPUT environment block as they define the core components of the quadrilateral mesh that will be generated.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The first block of information in RUN_PARAMETERS is","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"\\begin{RUN_PARAMETERS}\n mesh file name = ice_cream_straight_sides.mesh\n plot file name = ice_cream_straight_sides.tec\n stats file name = none\n mesh file format = ISM-v2\n polynomial order = 4\n plot file format = skeleton\n\\end{RUN_PARAMETERS}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The mesh and plot file names will be the files created by HOHQMesh once successfully executed. The stats file name is available if you wish to also save a collection of mesh statistics. For this example it is deactivated. These file names given within RUN_PARAMETERS should match that of the control file, and although this is not required by HOHQMesh, it is a useful style convention. The mesh file format ISM-v2 in the format currently required by Trixi.jl. The polynomial order prescribes the order of an interpolant constructed on the Chebyshev-Gauss-Lobatto nodes that is used to represent any curved boundaries on a particular element. The plot file format of skeleton means that visualizing the plot file will only draw the element boundaries (and no internal nodes). Alternatively, the format can be set to sem to visualize the interior nodes of the approximation as well.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The second block of information in BACKGROUND_GRID is","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"\\begin{BACKGROUND_GRID}\n x0 = [-8.0, -8.0, 0.0]\n dx = [1.0, 1.0, 0.0]\n N = [16,16,1]\n\\end{BACKGROUND_GRID}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"This lays a grid of Cartesian elements for the domain beginning at the point x0 as its bottom-left corner. The value of dx, which could differ in each direction if desired, controls the step size taken in each Cartesian direction. The values in N set how many Cartesian box elements are set in each coordinate direction. The above parameters define a 16times 16 element square mesh on -88^2. Further, this sets up four outer boundaries of the domain that are given the default names: Top, Left, Bottom, Right.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The third block of information in SPRING_SMOOTHER is","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"\\begin{SPRING_SMOOTHER}\n smoothing = ON\n smoothing type = LinearAndCrossBarSpring\n number of iterations = 25\n\\end{SPRING_SMOOTHER}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Once HOHQMesh generates the mesh, a spring-mass-dashpot model is created to smooth the mesh and create \"nicer\" quadrilateral elements. The default parameters of Hooke's law for the spring-mass-dashpot model have been selected after a fair amount of experimentation across many meshes. If you wish to deactivate this feature you can set smoothing = OFF (or remove this block from the control file).","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"After the CONTROL_INPUT environment block comes the MODEL environment block. It is here where the user prescribes curved boundary information with either:","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"An OUTER_BOUNDARY (covered in the next section of this tutorial).\nOne or more INNER_BOUNDARIES.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"There are several options to describe the boundary curve data to HOHQMesh like splines or parametric curves.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"For the example ice_cream_straight_sides.control we define three internal boundaries; two straight-sided and one as a circular arc. Within the HOHQMesh control input each curve must be assigned to a CHAIN as shown below in the complete INNER_BOUNDARIES block.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"\\begin{INNER_BOUNDARIES}\n\n \\begin{CHAIN}\n name = IceCreamCone\n \\begin{END_POINTS_LINE}\n name = LeftSlant\n xStart = [-2.0, 1.0, 0.0]\n xEnd = [ 0.0, -3.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{END_POINTS_LINE}\n name = RightSlant\n xStart = [ 0.0, -3.0, 0.0]\n xEnd = [ 2.0, 1.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{CIRCULAR_ARC}\n name = IceCream\n units = degrees\n center = [ 0.0, 1.0, 0.0]\n radius = 2.0\n start angle = 0.0\n end angle = 180.0\n \\end{CIRCULAR_ARC}\n \\end{CHAIN}\n\n\\end{INNER_BOUNDARIES}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"It is important to note there are two name quantities one for the CHAIN and one for the PARAMETRIC_EQUATION_CURVE. The name for the CHAIN is used internally by HOHQMesh, so if you have multiple CHAINs they must be given a unique name. The name for the PARAMETRIC_EQUATION_CURVE will be printed to the appropriate boundaries within the .mesh file produced by HOHQMesh.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"We create the mesh file ice_cream_straight_sides.mesh and its associated file for plotting ice_cream_straight_sides.tec by using HOHQMesh.jl's function generate_mesh.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"using HOHQMesh\ncontrol_file = joinpath(\"out\", \"ice_cream_straight_sides.control\")\noutput = generate_mesh(control_file);\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The mesh file ice_cream_straight_sides.mesh and its associated file for plotting ice_cream_straight_sides.tec are placed in the out folder. The resulting mesh generated by HOHQMesh.jl is given in the following figure.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"(Image: mesh_straight_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"We note that Trixi.jl uses the boundary name information from the control file to assign boundary conditions in an elixir file. Therefore, the name should start with a letter and consist only of alphanumeric characters and underscores. Please note that the name will be treated as case sensitive.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Example-simulation-on-ice_cream_straight_sides.mesh","page":"14 Unstructured meshes with HOHQMesh.jl","title":"Example simulation on ice_cream_straight_sides.mesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"With this newly generated mesh we are ready to run a Trixi.jl simulation on an unstructured quadrilateral mesh. For this we must create a new elixir file.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The elixir file given below creates an initial condition for a uniform background flow state with a free stream Mach number of 0.3. A focus for this part of the tutorial is to specify the boundary conditions and to construct the new mesh from the file that was generated in the previous exercise.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"It is straightforward to set the different boundary condition types in an elixir by assigning a particular function to a boundary name inside a Julia dictionary, Dict, variable. Observe that the names of these boundaries match those provided by HOHQMesh either by default, e.g. Bottom, or user assigned, e.g. IceCream. For this problem setup use","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Freestream boundary conditions on the four box edges.\nFree slip wall boundary condition on the interior curved boundaries.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"To construct the unstructured quadrilateral mesh from the HOHQMesh file we point to the appropriate location with the variable mesh_file and then feed this into the constructor for the UnstructuredMesh2D type in Trixi.jl","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"# create the unstructured mesh from your mesh file\nusing Trixi\nmesh_file = joinpath(\"out\", \"ice_cream_straight_sides.mesh\")\nmesh = UnstructuredMesh2D(mesh_file);","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The complete elixir file for this simulation example is given below.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"using OrdinaryDiffEq, Trixi\n\nequations = CompressibleEulerEquations2D(1.4) # set gas gamma = 1.4\n\n# freestream flow state with Ma_inf = 0.3\n@inline function uniform_flow_state(x, t, equations::CompressibleEulerEquations2D)\n\n # set the freestream flow parameters\n rho_freestream = 1.0\n u_freestream = 0.3\n p_freestream = inv(equations.gamma)\n\n theta = 0.0 # zero angle of attack\n si, co = sincos(theta)\n v1 = u_freestream * co\n v2 = u_freestream * si\n\n prim = SVector(rho_freestream, v1, v2, p_freestream)\n return prim2cons(prim, equations)\nend\n\n# initial condition\ninitial_condition = uniform_flow_state\n\n# boundary condition types\nboundary_condition_uniform_flow = BoundaryConditionDirichlet(uniform_flow_state)\n\n# boundary condition dictionary\nboundary_conditions = Dict( :Bottom => boundary_condition_uniform_flow,\n :Top => boundary_condition_uniform_flow,\n :Right => boundary_condition_uniform_flow,\n :Left => boundary_condition_uniform_flow,\n :LeftSlant => boundary_condition_slip_wall,\n :RightSlant => boundary_condition_slip_wall,\n :IceCream => boundary_condition_slip_wall );\n\n# DGSEM solver.\n# 1) polydeg must be >= the polynomial order set in the HOHQMesh control file to guarantee\n# freestream preservation. As a extra task try setting polydeg=3\n# 2) VolumeIntegralFluxDifferencing with central volume flux is activated\n# for dealiasing\nvolume_flux = flux_ranocha\nsolver = DGSEM(polydeg=4, surface_flux=flux_hll,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\n# create the unstructured mesh from your mesh file\nmesh_file = joinpath(\"out\", \"ice_cream_straight_sides.mesh\")\nmesh = UnstructuredMesh2D(mesh_file)\n\n# Create semidiscretization with all spatial discretization-related components\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_conditions)\n\n# Create ODE problem from semidiscretization with time span from 0.0 to 2.0\ntspan = (0.0, 2.0)\node = semidiscretize(semi, tspan)\n\n\n# Create the callbacks to output solution files and adapt the time step\nsummary_callback = SummaryCallback()\nsave_solution = SaveSolutionCallback(interval=10,\n save_initial_solution=true,\n save_final_solution=true)\nstepsize_callback = StepsizeCallback(cfl=1.0)\n\ncallbacks = CallbackSet(summary_callback, save_solution, stepsize_callback)\n\nredirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\n# Evolve ODE problem in time using `solve` from OrdinaryDiffEq\nsol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\n# print the timer summary\nsummary_callback()\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Visualization of the solution is carried out in a similar way as above. That is, one converts the .h5 output files with trixi2vtk and then plot the solution in ParaView. An example plot of the pressure at the final time is shown below.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"(Image: simulation_straight_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Making-a-mesh-with-a-curved-outer-boundary","page":"14 Unstructured meshes with HOHQMesh.jl","title":"Making a mesh with a curved outer boundary","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Let us modify the mesh from the previous task and place a circular outer boundary instead of straight-sided outer boundaries. Note, the \"ice cream cone\" shape is still placed at the center of the domain.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"We create the new control file ice_cream_curved_sides.control file below and will then highlight the major differences compared to ice_cream_straight_sides.control.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"open(\"out/ice_cream_curved_sides.control\", \"w\") do io\n println(io, raw\"\"\"\n\\begin{CONTROL_INPUT}\n \\begin{RUN_PARAMETERS}\n mesh file name = ice_cream_curved_sides.mesh\n plot file name = ice_cream_curved_sides.tec\n stats file name = none\n mesh file format = ISM-v2\n polynomial order = 4\n plot file format = skeleton\n \\end{RUN_PARAMETERS}\n\n \\begin{BACKGROUND_GRID}\n background grid size = [1.0, 1.0, 0.0]\n \\end{BACKGROUND_GRID}\n\n \\begin{SPRING_SMOOTHER}\n smoothing = ON\n smoothing type = LinearAndCrossBarSpring\n number of iterations = 25\n \\end{SPRING_SMOOTHER}\n\n\\end{CONTROL_INPUT}\n\n\\begin{MODEL}\n\n \\begin{OUTER_BOUNDARY}\n \\begin{PARAMETRIC_EQUATION_CURVE}\n name = OuterCircle\n xEqn = x(t) = 8.0*sin(2.0*pi*t)\n yEqn = y(t) = 8.0*cos(2.0*pi*t)\n zEqn = z(t) = 0.0\n \\end{PARAMETRIC_EQUATION_CURVE}\n\n \\end{OUTER_BOUNDARY}\n\n \\begin{INNER_BOUNDARIES}\n\n \\begin{CHAIN}\n name = IceCreamCone\n \\begin{END_POINTS_LINE}\n name = LeftSlant\n xStart = [-2.0, 1.0, 0.0]\n xEnd = [ 0.0, -3.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{END_POINTS_LINE}\n name = RightSlant\n xStart = [ 0.0, -3.0, 0.0]\n xEnd = [ 2.0, 1.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{CIRCULAR_ARC}\n name = IceCream\n units = degrees\n center = [ 0.0, 1.0, 0.0]\n radius = 2.0\n start angle = 0.0\n end angle = 180.0\n \\end{CIRCULAR_ARC}\n \\end{CHAIN}\n\n \\end{INNER_BOUNDARIES}\n\n\\end{MODEL}\n\\end{FILE}\n\"\"\")\nend","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The first alteration is that we have altered the second block of information BACKGROUND_GRID within the CONTROL_INPUT to be","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"\\begin{BACKGROUND_GRID}\n background grid size = [1.0, 1.0, 0.0]\n\\end{BACKGROUND_GRID}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"This mesh control file has an outer boundary that determines the extent of the domain to be meshed. Therefore, we only need to supply the background grid size to the BACKGROUND_GRID control input.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The second alteration is that the MODEL now contains information for an OUTER_BOUNDARY. In this case it is a circle of radius 8 centered at [0.0, 0.0, 0.0] written as a set of PARAMETRIC_EQUATION_CURVEs.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":" \\begin{OUTER_BOUNDARY}\n\n \\begin{PARAMETRIC_EQUATION_CURVE}\n name = OuterCircle\n xEqn = x(t) = 8.0*sin(2.0*pi*t)\n yEqn = y(t) = 8.0*cos(2.0*pi*t)\n zEqn = z(t) = 0.0\n \\end{PARAMETRIC_EQUATION_CURVE}\n\n \\end{OUTER_BOUNDARY}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Just as with the inner boundary curves, we must assign a name to the OUTER_BOUNDARY. It will be included in the generated .mesh file and is used within the Trixi.jl elixir file to set boundary conditions.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Again, we create the .mesh and .tec files with HOHQMesh.jl's function generate_mesh","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"control_file = joinpath(\"out\", \"ice_cream_curved_sides.control\")\noutput = generate_mesh(control_file);\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The files are placed in the out folder.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The resulting mesh generated by HOHQMesh.jl is given in the following figure.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"(Image: mesh_curved_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Running-Trixi.jl-on-ice_cream_curved_sides.mesh","page":"14 Unstructured meshes with HOHQMesh.jl","title":"Running Trixi.jl on ice_cream_curved_sides.mesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"We can reuse much of the elixir file to setup the uniform flow over an ice cream cone from the previous part of this tutorial. The only component of the elixir file that must be changed is the boundary condition dictionary because we now have a boundary named OuterCircle instead of four edges of a bounding box.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"# boundary condition dictionary\nboundary_conditions = Dict( :OuterCircle => boundary_condition_uniform_flow,\n :LeftSlant => boundary_condition_slip_wall,\n :RightSlant => boundary_condition_slip_wall,\n :IceCream => boundary_condition_slip_wall );\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Also, we must update the construction of the mesh from our new mesh file ice_cream_curved_sides.mesh that is located in the out folder.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"# create the unstructured mesh from your mesh file\nmesh_file = joinpath(\"out\", \"ice_cream_curved_sides.mesh\")\nmesh = UnstructuredMesh2D(mesh_file);\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"We can then post-process the solution file at the final time on the new mesh with Trixi2Vtk and visualize with ParaView.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"(Image: simulation_curved_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Setting-up-a-simulation-with-AMR-via-P4estMesh","page":"14 Unstructured meshes with HOHQMesh.jl","title":"Setting up a simulation with AMR via P4estMesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"The above explained mesh file format of ISM-V2 only works with UnstructuredMesh2D and so does not support AMR. On the other hand, the mesh type P4estMesh allows AMR. The mesh constructor for the P4estMesh imports an unstructured, conforming mesh from an Abaqus mesh file (.inp).","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"As described above, the first block of the HOHQMesh control file contains the parameter mesh file format. If you set mesh file format = ABAQUS instead of ISM-V2, HOHQMesh.jl's function generate_mesh creates an Abaqus mesh file .inp.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"using HOHQMesh\ncontrol_file = joinpath(\"out\", \"ice_cream_straight_sides.control\")\noutput = generate_mesh(control_file);","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Now, you can create a P4estMesh from your mesh file. It is described in detail in the P4est-based mesh part of the Trixi.jl docs.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"using Trixi\nmesh_file = joinpath(\"out\", \"ice_cream_straight_sides.inp\")\nmesh = P4estMesh{2}(mesh_file)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"Since P4estMesh supports AMR, we just have to extend the setup from the first example by the standard AMR procedure. For more information about AMR in Trixi.jl, see the matching tutorial.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"amr_indicator = IndicatorLöhner(semi, variable=density)\n\namr_controller = ControllerThreeLevel(semi, amr_indicator,\n base_level=0,\n med_level =1, med_threshold=0.05,\n max_level =3, max_threshold=0.1)\n\namr_callback = AMRCallback(semi, amr_controller,\n interval=5,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true)\n\ncallbacks = CallbackSet(..., amr_callback)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"We can then post-process the solution file at the final time on the new mesh with Trixi2Vtk and visualize with ParaView, see the appropriate visualization section for details.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"(Image: simulation_straight_sides_p4est_amr)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Package-versions","page":"14 Unstructured meshes with HOHQMesh.jl","title":"Package versions","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\", \"Trixi2Vtk\", \"HOHQMesh\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"14 Unstructured meshes with HOHQMesh.jl","title":"14 Unstructured meshes with HOHQMesh.jl","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"EditURL = \"../../literate/src/files/DGMulti_2.jl\"","category":"page"},{"location":"tutorials/DGMulti_2/#DGMulti_2","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6: Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"","category":"section"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly\nD = derivative_operator(MattssonNordström2004(), derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"D = periodic_derivative_operator(derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly\nD = couple_continuously(legendre_derivative_operator(xmin=0.0, xmax=1.0, N=4),\n UniformPeriodicMesh1D(xmin=-1.0, xmax=1.0, Nx=10))","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"To choose a discontinuous coupling (DGSEM), use couple_discontinuously() instead of couple_continuously().","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"For more information and other SBP operators, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.","category":"page"},{"location":"tutorials/DGMulti_2/#Package-versions","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"Package versions","text":"","category":"section"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"StartUpDG\", \"SummationByPartsOperators\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"","category":"page"},{"location":"tutorials/DGMulti_2/","page":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"EditURL = \"../../literate/src/files/parabolic_terms.jl\"","category":"page"},{"location":"tutorials/parabolic_terms/#parabolic_terms","page":"10 Parabolic terms","title":"10: Parabolic terms","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"Experimental support for parabolic diffusion terms is available in Trixi.jl. This demo illustrates parabolic terms for the advection-diffusion equation.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"using OrdinaryDiffEq\nusing Trixi","category":"page"},{"location":"tutorials/parabolic_terms/#Splitting-a-system-into-hyperbolic-and-parabolic-parts.","page":"10 Parabolic terms","title":"Splitting a system into hyperbolic and parabolic parts.","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"For a mixed hyperbolic-parabolic system, we represent the hyperbolic and parabolic parts of the system separately. We first define the hyperbolic (advection) part of the advection-diffusion equation.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"advection_velocity = (1.5, 1.0)\nequations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"Next, we define the parabolic diffusion term. The constructor requires knowledge of equations_hyperbolic to be passed in because the LaplaceDiffusion2D applies diffusion to every variable of the hyperbolic system.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"diffusivity = 5.0e-2\nequations_parabolic = LaplaceDiffusion2D(diffusivity, equations_hyperbolic);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/#Boundary-conditions","page":"10 Parabolic terms","title":"Boundary conditions","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"As with the equations, we define boundary conditions separately for the hyperbolic and parabolic part of the system. For this example, we impose inflow BCs for the hyperbolic system (no condition is imposed on the outflow), and we impose Dirichlet boundary conditions for the parabolic equations. Both BoundaryConditionDirichlet and BoundaryConditionNeumann are defined for LaplaceDiffusion2D.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"The hyperbolic and parabolic boundary conditions are assumed to be consistent with each other.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"boundary_condition_zero_dirichlet = BoundaryConditionDirichlet((x, t, equations) -> SVector(0.0))\n\nboundary_conditions_hyperbolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1 + 0.5 * x[2])),\n y_neg = boundary_condition_zero_dirichlet,\n y_pos = boundary_condition_do_nothing,\n x_pos = boundary_condition_do_nothing)\n\nboundary_conditions_parabolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1 + 0.5 * x[2])),\n y_neg = boundary_condition_zero_dirichlet,\n y_pos = boundary_condition_zero_dirichlet,\n x_pos = boundary_condition_zero_dirichlet);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/#Defining-the-solver-and-mesh","page":"10 Parabolic terms","title":"Defining the solver and mesh","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"The process of creating the DG solver and mesh is the same as for a purely hyperbolic system of equations.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\ncoordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))\ncoordinates_max = ( 1.0, 1.0) # maximum coordinates (max(x), max(y))\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n periodicity=false, n_cells_max=30_000) # set maximum capacity of tree data structure\n\ninitial_condition = (x, t, equations) -> SVector(0.0);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/#Semidiscretizing-and-solving","page":"10 Parabolic terms","title":"Semidiscretizing and solving","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"To semidiscretize a hyperbolic-parabolic system, we create a SemidiscretizationHyperbolicParabolic. This differs from a SemidiscretizationHyperbolic in that we pass in a Tuple containing both the hyperbolic and parabolic equation, as well as a Tuple containing the hyperbolic and parabolic boundary conditions.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"semi = SemidiscretizationHyperbolicParabolic(mesh,\n (equations_hyperbolic, equations_parabolic),\n initial_condition, solver;\n boundary_conditions=(boundary_conditions_hyperbolic,\n boundary_conditions_parabolic))","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"The rest of the code is identical to the hyperbolic case. We create a system of ODEs through semidiscretize, defining callbacks, and then passing the system to OrdinaryDiffEq.jl.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"tspan = (0.0, 1.5)\node = semidiscretize(semi, tspan)\ncallbacks = CallbackSet(SummaryCallback())\ntime_int_tol = 1.0e-6\nsol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"We can now visualize the solution, which develops a boundary layer at the outflow boundaries.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/parabolic_terms/#Package-versions","page":"10 Parabolic terms","title":"Package versions","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"","category":"page"},{"location":"tutorials/parabolic_terms/","page":"10 Parabolic terms","title":"10 Parabolic terms","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"EditURL = \"../../literate/src/files/index.jl\"","category":"page"},{"location":"tutorials/introduction/#Tutorials-for-Trixi.jl","page":"Introduction","title":"Tutorials for Trixi.jl","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"The tutorial section for Trixi.jl also contains interactive step-by-step explanations via Binder.","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Right now, you are using the classic documentation. The corresponding interactive notebooks can be opened in Binder and viewed in nbviewer via the icons (Image: ) and (Image: ) in the respective tutorial. You can also open the raw notebook files via (Image: ).","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"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.","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"There are tutorials for the following topics:","category":"page"},{"location":"tutorials/introduction/#[1-Introduction-to-DG-methods](@ref-scalar_linear_advection_1d)","page":"Introduction","title":"1 Introduction to DG methods","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial gives an introduction to discontinuous Galerkin (DG) methods with the example of the scalar linear advection equation in 1D. Starting with some theoretical explanations, we first implement a raw version of a discontinuous Galerkin spectral element method (DGSEM). Then, we will show how to use features of Trixi.jl to achieve the same result.","category":"page"},{"location":"tutorials/introduction/#[2-DGSEM-with-flux-differencing](@ref-DGSEM_FluxDiff)","page":"Introduction","title":"2 DGSEM with flux differencing","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"To improve stability often the flux differencing formulation of the DGSEM (split form) is used. We want to present the idea and formulation on a basic 1D level. Then, we show how this formulation can be implemented in Trixi.jl and analyse entropy conservation for two different flux combinations.","category":"page"},{"location":"tutorials/introduction/#[3-Shock-capturing-with-flux-differencing-and-stage-limiter](@ref-shock_capturing)","page":"Introduction","title":"3 Shock capturing with flux differencing and stage limiter","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Using the flux differencing formulation, a simple procedure to capture shocks is a hybrid blending of a high-order DG method and a low-order subcell finite volume (FV) method. We present the idea on a very basic level and show the implementation in Trixi.jl. Then, a positivity preserving limiter is explained and added to an exemplary simulation of the Sedov blast wave with the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/introduction/#[4-Non-periodic-boundary-conditions](@ref-non_periodic_boundaries)","page":"Introduction","title":"4 Non-periodic boundary conditions","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Thus far, all examples used periodic boundaries. In Trixi.jl, you can also set up a simulation with non-periodic boundaries. This tutorial presents the implementation of the classical Dirichlet boundary condition with a following example. Then, other non-periodic boundaries are mentioned.","category":"page"},{"location":"tutorials/introduction/#[5-DG-schemes-via-DGMulti-solver](@ref-DGMulti_1)","page":"Introduction","title":"5 DG schemes via DGMulti solver","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial is about the more general DG solver DGMulti, introduced here. We are showing some examples for this solver, for instance with discretization nodes by Gauss or triangular elements. Moreover, we present a simple way to include pre-defined triangulate meshes for non-Cartesian domains using the package StartUpDG.jl.","category":"page"},{"location":"tutorials/introduction/#[6-Other-SBP-schemes-(FD,-CGSEM)-via-DGMulti-solver](@ref-DGMulti_2)","page":"Introduction","title":"6 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Supplementary to the previous tutorial about DG schemes via the DGMulti solver we now present the possibility for DGMulti to use other SBP schemes via the package SummationByPartsOperators.jl. For instance, we show how to set up a finite differences (FD) scheme and a continuous Galerkin (CGSEM) method.","category":"page"},{"location":"tutorials/introduction/#[7-Upwind-FD-SBP-schemes](@ref-upwind_fdsbp)","page":"Introduction","title":"7 Upwind FD SBP schemes","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"General SBP schemes can not only be used via the DGMulti solver but also with a general DG solver. In particular, upwind finite difference SBP methods can be used together with the TreeMesh. Similar to general SBP schemes in the DGMulti framework, the interface is based on the package SummationByPartsOperators.jl.","category":"page"},{"location":"tutorials/introduction/#[8-Adding-a-new-scalar-conservation-law](@ref-adding_new_scalar_equations)","page":"Introduction","title":"8 Adding a new scalar conservation law","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial explains how to add a new physics model using the example of the cubic conservation law. First, we define the equation using a struct CubicEquation and the physical flux. Then, the corresponding standard setup in Trixi.jl (mesh, solver, semi and ode) is implemented and the ODE problem is solved by OrdinaryDiffEq's solve method.","category":"page"},{"location":"tutorials/introduction/#[9-Adding-a-non-conservative-equation](@ref-adding_nonconservative_equation)","page":"Introduction","title":"9 Adding a non-conservative equation","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"In this part, another physics model is implemented, the nonconservative linear advection equation. We run two different simulations with different levels of refinement and compare the resulting errors.","category":"page"},{"location":"tutorials/introduction/#[10-Parabolic-terms](@ref-parabolic_terms)","page":"Introduction","title":"10 Parabolic terms","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial describes how parabolic terms are implemented in Trixi.jl, e.g., to solve the advection-diffusion equation.","category":"page"},{"location":"tutorials/introduction/#[11-Adding-new-parabolic-terms](@ref-adding_new_parabolic_terms)","page":"Introduction","title":"11 Adding new parabolic terms","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial describes how new parabolic terms can be implemented using Trixi.jl.","category":"page"},{"location":"tutorials/introduction/#[12-Adaptive-mesh-refinement](@ref-adaptive_mesh_refinement)","page":"Introduction","title":"12 Adaptive mesh refinement","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Adaptive mesh refinement (AMR) helps to increase the accuracy in sensitive or turbolent regions while not wasting resources for less interesting parts of the domain. This leads to much more efficient simulations. This tutorial presents the implementation strategy of AMR in Trixi.jl, including the use of different indicators and controllers.","category":"page"},{"location":"tutorials/introduction/#[13-Structured-mesh-with-curvilinear-mapping](@ref-structured_mesh_mapping)","page":"Introduction","title":"13 Structured mesh with curvilinear mapping","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"In this tutorial, the use of Trixi.jl's structured curved mesh type StructuredMesh is explained. We present the two basic option to initialize such a mesh. First, the curved domain boundaries of a circular cylinder are set by explicit boundary functions. Then, a fully curved mesh is defined by passing the transformation mapping.","category":"page"},{"location":"tutorials/introduction/#[14-Unstructured-meshes-with-HOHQMesh.jl](@ref-hohqmesh_tutorial)","page":"Introduction","title":"14 Unstructured meshes with HOHQMesh.jl","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"The purpose of this tutorial is to demonstrate how to use the UnstructuredMesh2D functionality of Trixi.jl. This begins by running and visualizing an available unstructured quadrilateral mesh example. Then, the tutorial will demonstrate how to conceptualize a problem with curved boundaries, generate a curvilinear mesh using the available HOHQMesh software in the Trixi.jl ecosystem, and then run a simulation using Trixi.jl on said mesh. In the end, the tutorial briefly explains how to simulate an example using AMR via P4estMesh.","category":"page"},{"location":"tutorials/introduction/#[15-Explicit-time-stepping](@ref-time_stepping)","page":"Introduction","title":"15 Explicit time stepping","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial is about time integration using OrdinaryDiffEq.jl. It explains how to use their algorithms and presents two types of time step choices - with error-based and CFL-based adaptive step size control.","category":"page"},{"location":"tutorials/introduction/#[16-Differentiable-programming](@ref-differentiable_programming)","page":"Introduction","title":"16 Differentiable programming","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This part deals with some basic differentiable programming topics. For example, a Jacobian, its eigenvalues and a curve of total energy (through the simulation) are calculated and plotted for a few semidiscretizations. Moreover, we calculate an example for propagating errors with Measurement.jl at the end.","category":"page"},{"location":"tutorials/introduction/#[17-Custom-semidiscretization](@ref-custom_semidiscretization)","page":"Introduction","title":"17 Custom semidiscretization","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial describes the semidiscretiations of Trixi.jl and explains how to extend them for custom tasks.","category":"page"},{"location":"tutorials/introduction/#Examples-in-Trixi.jl","page":"Introduction","title":"Examples in Trixi.jl","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Trixi.jl already contains several more coding examples, the so-called elixirs. You can find them in the folder examples/. They are structured by the underlying mesh type and the respective number of spatial dimensions. The name of an elixir is composed of the underlying system of conservation equations (for instance advection or euler) and other special characteristics like the initial condition (e.g. gauss, astro_jet, blast_wave) or the included simulation features (e.g. amr, shockcapturing).","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference-trixi/#Trixi.jl-API","page":"Trixi.jl","title":"Trixi.jl API","text":"","category":"section"},{"location":"reference-trixi/","page":"Trixi.jl","title":"Trixi.jl","text":"CurrentModule = Trixi","category":"page"},{"location":"reference-trixi/","page":"Trixi.jl","title":"Trixi.jl","text":"Modules = [Trixi]","category":"page"},{"location":"reference-trixi/#Trixi.Trixi","page":"Trixi.jl","title":"Trixi.Trixi","text":"Trixi\n\nTrixi.jl is a numerical simulation framework for hyperbolic conservation laws. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures.\n\nTo get started, run your first simulation with Trixi.jl using\n\ntrixi_include(default_example())\n\nSee also: trixi-framework/Trixi.jl\n\n\n\n\n\n","category":"module"},{"location":"reference-trixi/#Trixi.boundary_condition_do_nothing","page":"Trixi.jl","title":"Trixi.boundary_condition_do_nothing","text":"boundary_condition_do_nothing = Trixi.BoundaryConditionDoNothing()\n\nImposing no boundary condition just evaluates the flux at the inner state.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.boundary_condition_periodic","page":"Trixi.jl","title":"Trixi.boundary_condition_periodic","text":"boundary_condition_periodic = Trixi.BoundaryConditionPeriodic()\n\nA singleton struct indicating periodic boundary conditions.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.flux_hll","page":"Trixi.jl","title":"Trixi.flux_hll","text":"flux_hll\n\nSee FluxHLL.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.flux_hll_chen_noelle","page":"Trixi.jl","title":"Trixi.flux_hll_chen_noelle","text":"flux_hll_chen_noelle = FluxHLL(min_max_speed_chen_noelle)\n\nAn instance of FluxHLL specific to the shallow water equations that uses the wave speed estimates from min_max_speed_chen_noelle. This HLL flux is guaranteed to have zero numerical mass flux out of a \"dry\" element, maintain positivity of the water height, and satisfy an entropy inequality.\n\nFor complete details see Section 2.4 of the following reference\n\nGuoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI: 10.1137/15M1053074\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.flux_hlle","page":"Trixi.jl","title":"Trixi.flux_hlle","text":"flux_hlle\n\nSee min_max_speed_einfeldt. This is a FluxHLL-type two-wave solver with special estimates of the wave speeds.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.flux_lax_friedrichs","page":"Trixi.jl","title":"Trixi.flux_lax_friedrichs","text":"flux_lax_friedrichs\n\nSee FluxLaxFriedrichs.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.AMRCallback","page":"Trixi.jl","title":"Trixi.AMRCallback","text":"AMRCallback(semi, controller [,adaptor=AdaptorAMR(semi)];\n interval,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true,\n dynamic_load_balancing=true)\n\nPerforms adaptive mesh refinement (AMR) every interval time steps for a given semidiscretization semi using the chosen controller.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AbstractEquations","page":"Trixi.jl","title":"Trixi.AbstractEquations","text":"AbstractEquations{NDIMS, NVARS}\n\nAn abstract supertype of specific equations such as the compressible Euler equations. The type parameters encode the number of spatial dimensions (NDIMS) and the number of primary variables (NVARS) of the physics model.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AbstractMesh","page":"Trixi.jl","title":"Trixi.AbstractMesh","text":"AbstractMesh{NDIMS}\n\nAn abstract supertype of specific mesh types such as TreeMesh or StructuredMesh. The type parameters encode the number of spatial dimensions (NDIMS).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AcousticPerturbationEquations2D","page":"Trixi.jl","title":"Trixi.AcousticPerturbationEquations2D","text":"AcousticPerturbationEquations2D(v_mean_global, c_mean_global, rho_mean_global)\n\nAcoustic perturbation equations (APE) in two space dimensions. The equations are given by\n\nbeginaligned\n fracpartialmathbfvpartial t + nabla (barmathbfvcdotmathbfv)\n + nablaleft( fracbarc^2 tildepbarrho right) = 0 \n fracpartial tildeppartial t +\n nablacdot (barrho mathbfv + barmathbfv tildep) = 0\nendaligned\n\nThe bar bar(cdot) indicates time-averaged quantities. The unknowns of the APE are the perturbed velocities mathbfv = (v_1 v_2)^T and the scaled perturbed pressure tildep = fracpbarc^2, where p denotes the perturbed pressure and the perturbed variables are defined by phi = phi - barphi.\n\nIn addition to the unknowns, Trixi.jl currently stores the mean values in the state vector, i.e. the state vector used internally is given by\n\nmathbfu =\n beginpmatrix\n v_1 v_2 tildep barv_1 barv_2 barc barrho\n endpmatrix\n\nThis affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the mean values must be zero.\nThe mean values have to be considered when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes these variables too.\nTrixi.jl's visualization tools will visualize the mean values by default.\n\nThe constructor accepts a 2-tuple v_mean_global and scalars c_mean_global and rho_mean_global which can be used to make the definition of initial conditions for problems with constant mean flow more flexible. These values are ignored if the mean values are defined internally in an initial condition.\n\nThe equations are based on the APE-4 system introduced in the following paper:\n\nRoland Ewert and Wolfgang Schröder (2003) Acoustic perturbation equations based on flow decomposition via source filtering DOI: 10.1016/S0021-9991(03)00168-2\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.Adiabatic","page":"Trixi.jl","title":"Trixi.Adiabatic","text":"struct Adiabatic\n\nUsed to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_normal_flux_function should be a function with signature boundary_value_normal_flux_function(x, t, equations) and return a scalar value for the normal heat flux at point x and time t.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AliveCallback","page":"Trixi.jl","title":"Trixi.AliveCallback","text":"AliveCallback(analysis_interval=0, alive_interval=analysis_interval÷10)\n\nInexpensive callback showing that a simulation is still running by printing some information such as the current time to the screen every alive_interval time steps. If analysis_interval ≂̸ 0, the output is omitted every analysis_interval time steps.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AnalysisCallback","page":"Trixi.jl","title":"Trixi.AnalysisCallback","text":"AnalysisCallback(semi; interval=0,\n save_analysis=false,\n output_directory=\"out\",\n analysis_filename=\"analysis.dat\",\n extra_analysis_errors=Symbol[],\n extra_analysis_integrals=())\n\nAnalyze a numerical solution every interval time steps and print the results to the screen. If save_analysis, the results are also saved in joinpath(output_directory, analysis_filename).\n\nAdditional errors can be computed, e.g. by passing extra_analysis_errors = (:l2_error_primitive, :linf_error_primitive) or extra_analysis_errors = (:conservation_error,).\n\nIf you want to omit the computation (to safe compute-time) of the default_analysis_errors, specify analysis_errors = Symbol[]. Note: default_analysis_errors are :l2_error and :linf_error for all equations. If you want to compute extra_analysis_errors such as :conservation_error solely, i.e., without :l2_error, :linf_error you need to specify analysis_errors = [:conservation_error] instead of extra_analysis_errors = [:conservation_error].\n\nFurther scalar functions func in extra_analysis_integrals are applied to the numerical solution and integrated over the computational domain. Some examples for this are entropy, energy_kinetic, energy_internal, and energy_total. You can also write your own function with the same signature as the examples listed above and pass it via extra_analysis_integrals. See the developer comments about Trixi.analyze, Trixi.pretty_form_utf, and Trixi.pretty_form_ascii for further information on how to create custom analysis quantities.\n\nIn addition, the analysis callback records and outputs a number of quantities that are useful for evaluating the computational performance, such as the total runtime, the performance index (time/DOF/rhs!), the time spent in garbage collection (GC), or the current memory usage (alloc'd memory).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AnalysisCallbackCoupled","page":"Trixi.jl","title":"Trixi.AnalysisCallbackCoupled","text":"AnalysisCallbackCoupled(semi, callbacks...)\n\nCombine multiple analysis callbacks for coupled simulations with a SemidiscretizationCoupled. For each coupled system, an indididual AnalysisCallback must be created and passed to the AnalysisCallbackCoupled in order, i.e., in the same sequence as the indidvidual semidiscretizations are stored in the SemidiscretizationCoupled.\n\nwarning: Experimental code\nThis is an experimental feature and can change any time.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AveragingCallback","page":"Trixi.jl","title":"Trixi.AveragingCallback","text":"AveragingCallback(semi::SemidiscretizationHyperbolic, tspan; output_directory=\"out\",\n filename=\"averaging.h5\")\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nA callback that averages the flow field described by semi which must be a semidiscretization of the compressible Euler equations in two dimensions. The callback records the mean velocity, mean speed of sound, mean density, and mean vorticity for each node over the time interval given by tspan and stores the results in an HDF5 file filename in the directory output_directory. Note that this callback does not support adaptive mesh refinement (AMRCallback).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionCoupled","page":"Trixi.jl","title":"Trixi.BoundaryConditionCoupled","text":"BoundaryConditionCoupled(other_semi_index, indices, uEltype)\n\nBoundary condition to glue two meshes together. Solution values at the boundary of another mesh will be used as boundary values. This requires the use of SemidiscretizationCoupled. The other mesh is specified by other_semi_index, which is the index of the mesh in the tuple of semidiscretizations.\n\nNote that the elements and nodes of the two meshes at the coupled boundary must coincide. This is currently only implemented for StructuredMesh.\n\nArguments\n\nother_semi_index: the index in SemidiscretizationCoupled of the semidiscretization from which the values are copied\nindices::Tuple: node/cell indices at the boundary of the mesh in the other semidiscretization. See examples below.\nuEltype::Type: element type of solution\n\nExamples\n\n# Connect the left boundary of mesh 2 to our boundary such that our positive\n# boundary direction will match the positive y direction of the other boundary\nBoundaryConditionCoupled(2, (:begin, :i), Float64)\n\n# Connect the same two boundaries oppositely oriented\nBoundaryConditionCoupled(2, (:begin, :i_backwards), Float64)\n\n# Using this as y_neg boundary will connect `our_cells[i, 1, j]` to `other_cells[j, end-i, end]`\nBoundaryConditionCoupled(2, (:j, :i_backwards, :end), Float64)\n\nwarning: Experimental code\nThis is an experimental feature and can change any time.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionDirichlet","page":"Trixi.jl","title":"Trixi.BoundaryConditionDirichlet","text":"BoundaryConditionDirichlet(boundary_value_function)\n\nCreate a Dirichlet boundary condition that uses the function boundary_value_function to specify the values at the boundary. This can be used to create a boundary condition that specifies exact boundary values by passing the exact solution of the equation. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as\n\nboundary_value_function(x, t, equations)\n\nwhere x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.\n\nExamples\n\njulia> BoundaryConditionDirichlet(initial_condition_convergence_test)\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionNavierStokesWall","page":"Trixi.jl","title":"Trixi.BoundaryConditionNavierStokesWall","text":"struct BoundaryConditionNavierStokesWall\n\nCreates a wall-type boundary conditions for the compressible Navier-Stokes equations. The fields boundary_condition_velocity and boundary_condition_heat_flux are intended to be boundary condition types such as the NoSlip velocity boundary condition and the Adiabatic or Isothermal heat boundary condition.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionNeumann","page":"Trixi.jl","title":"Trixi.BoundaryConditionNeumann","text":"BoundaryConditionNeumann(boundary_normal_flux_function)\n\nSimilar to BoundaryConditionDirichlet, but creates a Neumann boundary condition for parabolic equations that uses the function boundary_normal_flux_function to specify the values of the normal flux at the boundary. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as\n\nboundary_normal_flux_function(x, t, equations)\n\nwhere x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundsCheckCallback","page":"Trixi.jl","title":"Trixi.BoundsCheckCallback","text":"BoundsCheckCallback(; output_directory=\"out\", save_errors=false, interval=1)\n\nSubcell limiting techniques with SubcellLimiterIDP are constructed to adhere certain local or global bounds. To make sure that these bounds are actually met, this callback calculates the maximum deviation from the bounds. The maximum deviation per applied bound is printed to the screen at the end of the simulation. For more insights, when setting save_errors=true the occurring errors are exported every interval time steps during the simulation. Then, the maximum deviations since the last export are saved in \"output_directory/deviations.txt\". The BoundsCheckCallback has to be applied as a stage callback for the SSPRK time integration scheme.\n\nnote: Note\nFor SubcellLimiterIDP, the solution is corrected in the a posteriori correction stage SubcellLimiterIDPCorrection. So, to check the final solution, this bounds check callback must be called after the correction stage.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CarpenterKennedy2N43","page":"Trixi.jl","title":"Trixi.CarpenterKennedy2N43","text":" CarpenterKennedy2N43()\n\nCarpenter, Kennedy (1994) Third order 2N storage RK schemes with error control\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CarpenterKennedy2N54","page":"Trixi.jl","title":"Trixi.CarpenterKennedy2N54","text":"CarpenterKennedy2N54()\n\nThe following structures and methods provide a minimal implementation of the low-storage explicit Runge-Kutta method of\n\nCarpenter, Kennedy (1994) Fourth order 2N storage RK schemes, Solution 3\n\nusing the same interface as OrdinaryDiffEq.jl.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquations1D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquations1D","text":"CompressibleEulerEquations1D(gamma)\n\nThe compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\nrho v_1 rho v_1^2 + p (rho e +p) v_1\nendpmatrix\n=\nbeginpmatrix\n0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in one space dimension. Here, rho is the density, v_1 the velocity, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho v_1^2 right)\n\nthe pressure.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquations2D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquations2D","text":"CompressibleEulerEquations2D(gamma)\n\nThe compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho v_2 rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v_1 rho v_1^2 + p rho v_1 v_2 (rho e +p) v_1\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_2 rho v_1 v_2 rho v_2^2 + p (rho e +p) v_2\nendpmatrix\n=\nbeginpmatrix\n0 0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in two space dimensions. Here, rho is the density, v_1, v_2 the velocities, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2) right)\n\nthe pressure.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquations3D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquations3D","text":"CompressibleEulerEquations3D(gamma)\n\nThe compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho v_2 rho v_3 rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v_1 rho v_1^2 + p rho v_1 v_2 rho v_1 v_3 ( rho e +p) v_1\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_2 rho v_1 v_2 rho v_2^2 + p rho v_1 v_3 ( rho e +p) v_2\nendpmatrix\n+\nfracpartialpartial z\nbeginpmatrix\nrho v_3 rho v_1 v_3 rho v_2 v_3 rho v_3^2 + p ( rho e +p) v_3\nendpmatrix\n=\nbeginpmatrix\n0 0 0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in three space dimensions. Here, rho is the density, v_1, v_2, v_3 the velocities, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2+v_3^2) right)\n\nthe pressure.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquationsQuasi1D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquationsQuasi1D","text":"CompressibleEulerEquationsQuasi1D(gamma)\n\nThe quasi-1d compressible Euler equations (see Chan et al. DOI: 10.48550/arXiv.2307.12089 for details)\n\nfracpartialpartial t\nbeginpmatrix\na rho a rho v_1 a e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\na rho v_1 a rho v_1^2 a v_1 (e +p)\nendpmatrix\n+ \na fracpartialpartial x\nbeginpmatrix\n0 p 0 \nendpmatrix\n=\nbeginpmatrix\n0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in one space dimension. Here, rho is the density, v_1 the velocity, e the specific total energy rather than specific internal energy, a the (possibly) variable nozzle width, and\n\np = (gamma - 1) left( e - frac12 rho v_1^2 right)\n\nthe pressure.\n\nThe nozzle width function a(x) is set inside the initial condition routine for a particular problem setup. To test the conservative form of the compressible Euler equations one can set the nozzle width variable a to one. \n\nIn addition to the unknowns, Trixi.jl currently stores the nozzle width values at the approximation points despite being fixed in time. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the nozzle width must be zero.\nThe nozzle width values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the nozzle width by default.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerMulticomponentEquations1D","page":"Trixi.jl","title":"Trixi.CompressibleEulerMulticomponentEquations1D","text":"CompressibleEulerMulticomponentEquations1D(; gammas, gas_constants)\n\nMulticomponent version of the compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho v_1 rho e rho_1 rho_2 vdots rho_n\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\nrho v_1^2 + p (rho e +p) v_1 rho_1 v_1 rho_2 v_1 vdots rho_n v_1\nendpmatrix\n\n=\nbeginpmatrix\n0 0 0 0 vdots 0\nendpmatrix\n\nfor calorically perfect gas in one space dimension. Here, rho_i is the density of component i, rho=sum_i=1^nrho_i the sum of the individual rho_i, v_1 the velocity, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho v_1^2 right)\n\nthe pressure,\n\ngamma=fracsum_i=1^nrho_i C_vigamma_isum_i=1^nrho_i C_vi\n\ntotal heat capacity ratio, gamma_i heat capacity ratio of component i,\n\nC_vi=fracRgamma_i-1\n\nspecific heat capacity at constant volume of component i.\n\nIn case of more than one component, the specific heat ratios gammas and the gas constants gas_constants should be passed as tuples, e.g., gammas=(1.4, 1.667).\n\nThe remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerMulticomponentEquations2D","page":"Trixi.jl","title":"Trixi.CompressibleEulerMulticomponentEquations2D","text":"CompressibleEulerMulticomponentEquations2D(; gammas, gas_constants)\n\nMulticomponent version of the compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho v_1 rho v_2 rho e rho_1 rho_2 vdots rho_n\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\nrho v_1^2 + p rho v_1 v_2 ( rho e +p) v_1 rho_1 v_1 rho_2 v_1 vdots rho_n v_1\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_1 v_2 rho v_2^2 + p ( rho e +p) v_2 rho_1 v_2 rho_2 v_2 vdots rho_n v_2\nendpmatrix\n=\nbeginpmatrix\n0 0 0 0 0 vdots 0\nendpmatrix\n\nfor calorically perfect gas in two space dimensions. Here, rho_i is the density of component i, rho=sum_i=1^nrho_i the sum of the individual rho_i, v_1, v_2 the velocities, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2 + v_2^2) right)\n\nthe pressure,\n\ngamma=fracsum_i=1^nrho_i C_vigamma_isum_i=1^nrho_i C_vi\n\ntotal heat capacity ratio, gamma_i heat capacity ratio of component i,\n\nC_vi=fracRgamma_i-1\n\nspecific heat capacity at constant volume of component i.\n\nIn case of more than one component, the specific heat ratios gammas and the gas constants gas_constants in [kJ/(kg*K)] should be passed as tuples, e.g., gammas=(1.4, 1.667).\n\nThe remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleNavierStokesDiffusion1D","page":"Trixi.jl","title":"Trixi.CompressibleNavierStokesDiffusion1D","text":"CompressibleNavierStokesDiffusion1D(equations; mu, Pr,\n gradient_variables=GradientVariablesPrimitive())\n\nContains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations1D.\n\nequations: instance of the CompressibleEulerEquations1D\nmu: dynamic viscosity,\nPr: Prandtl number,\ngradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().\n\nFluid properties such as the dynamic viscosity mu can be provided in any consistent unit system, e.g., [mu] = kg m⁻¹ s⁻¹.\n\nThe particular form of the compressible Navier-Stokes implemented is\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v rho v^2 + p (rho e + p) v\nendpmatrix\n=\nfracpartialpartial x\nbeginpmatrix\n0 tau tau v - q\nendpmatrix\n\nwhere the system is closed with the ideal gas assumption giving\n\np = (gamma - 1) left( rho e - frac12 rho v^2 right)\n\nas the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations1D. The terms on the right hand side of the system above are built from the viscous stress\n\ntau = mu fracpartialpartial x v\n\nwhere the heat flux is\n\nq = -kappa fracpartialpartial x left(Tright)quad T = fracpRrho\n\nwhere T is the temperature and kappa is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is\n\nkappa = fracgamma mu R(gamma - 1)textrmPr\n\nFrom this combination of temperature T and thermal conductivity kappa we see that the gas constant R cancels and the heat flux becomes\n\nq = -kappa fracpartialpartial x left(Tright) = -fracgamma mu(gamma - 1)textrmPr fracpartialpartial x left(fracprhoright)\n\nwhich is the form implemented below in the flux function.\n\nIn one spatial dimensions we require gradients for two quantities, e.g., primitive quantities\n\nfracpartialpartial x v fracpartialpartial x T\n\nor the entropy variables\n\nfracpartialpartial x w_2 fracpartialpartial x w_3\n\nwhere\n\nw_2 = fracrho v1p w_3 = -fracrhop\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleNavierStokesDiffusion2D","page":"Trixi.jl","title":"Trixi.CompressibleNavierStokesDiffusion2D","text":"CompressibleNavierStokesDiffusion2D(equations; mu, Pr,\n gradient_variables=GradientVariablesPrimitive())\n\nContains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations2D.\n\nequations: instance of the CompressibleEulerEquations2D\nmu: dynamic viscosity,\nPr: Prandtl number,\ngradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().\n\nFluid properties such as the dynamic viscosity mu can be provided in any consistent unit system, e.g., [mu] = kg m⁻¹ s⁻¹.\n\nThe particular form of the compressible Navier-Stokes implemented is\n\nfracpartialpartial t\nbeginpmatrix\nrho rho mathbfv rho e\nendpmatrix\n+\nnabla cdot\nbeginpmatrix\n rho mathbfv rho mathbfvmathbfv^T + p underlineI (rho e + p) mathbfv\nendpmatrix\n=\nnabla cdot\nbeginpmatrix\n0 underlinetau underlinetaumathbfv - mathbfq\nendpmatrix\n\nwhere the system is closed with the ideal gas assumption giving\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2) right)\n\nas the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor\n\nunderlinetau = mu left(nablamathbfv + left(nablamathbfvright)^Tright) - frac23 mu left(nablacdotmathbfvright)underlineI\n\nwhere underlineI is the 2times 2 identity matrix and the heat flux is\n\nmathbfq = -kappanablaleft(Tright)quad T = fracpRrho\n\nwhere T is the temperature and kappa is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is\n\nkappa = fracgamma mu R(gamma - 1)textrmPr\n\nFrom this combination of temperature T and thermal conductivity kappa we see that the gas constant R cancels and the heat flux becomes\n\nmathbfq = -kappanablaleft(Tright) = -fracgamma mu(gamma - 1)textrmPrnablaleft(fracprhoright)\n\nwhich is the form implemented below in the flux function.\n\nIn two spatial dimensions we require gradients for three quantities, e.g., primitive quantities\n\nnabla v_1 nabla v_2 nabla T\n\nor the entropy variables\n\nnabla w_2 nabla w_3 nabla w_4\n\nwhere\n\nw_2 = fracrho v_1p w_3 = fracrho v_2p w_4 = -fracrhop\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleNavierStokesDiffusion3D","page":"Trixi.jl","title":"Trixi.CompressibleNavierStokesDiffusion3D","text":"CompressibleNavierStokesDiffusion3D(equations; mu, Pr,\n gradient_variables=GradientVariablesPrimitive())\n\nContains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations3D.\n\nequations: instance of the CompressibleEulerEquations3D\nmu: dynamic viscosity,\nPr: Prandtl number,\ngradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().\n\nFluid properties such as the dynamic viscosity mu can be provided in any consistent unit system, e.g., [mu] = kg m⁻¹ s⁻¹.\n\nThe particular form of the compressible Navier-Stokes implemented is\n\nfracpartialpartial t\nbeginpmatrix\nrho rho mathbfv rho e\nendpmatrix\n+\nnabla cdot\nbeginpmatrix\n rho mathbfv rho mathbfvmathbfv^T + p underlineI (rho e + p) mathbfv\nendpmatrix\n=\nnabla cdot\nbeginpmatrix\n0 underlinetau underlinetaumathbfv - mathbfq\nendpmatrix\n\nwhere the system is closed with the ideal gas assumption giving\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2+v_3^2) right)\n\nas the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor\n\nunderlinetau = mu left(nablamathbfv + left(nablamathbfvright)^Tright) - frac23 mu left(nablacdotmathbfvright)underlineI\n\nwhere underlineI is the 3times 3 identity matrix and the heat flux is\n\nmathbfq = -kappanablaleft(Tright)quad T = fracpRrho\n\nwhere T is the temperature and kappa is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is\n\nkappa = fracgamma mu R(gamma - 1)textrmPr\n\nFrom this combination of temperature T and thermal conductivity kappa we see that the gas constant R cancels and the heat flux becomes\n\nmathbfq = -kappanablaleft(Tright) = -fracgamma mu(gamma - 1)textrmPrnablaleft(fracprhoright)\n\nwhich is the form implemented below in the flux function.\n\nIn two spatial dimensions we require gradients for three quantities, e.g., primitive quantities\n\nnabla v_1 nabla v_2 nabla v_3 nabla T\n\nor the entropy variables\n\nnabla w_2 nabla w_3 nabla w_4 nabla w_5\n\nwhere\n\nw_2 = fracrho v_1p w_3 = fracrho v_2p w_4 = fracrho v_3p w_5 = -fracrhop\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ControllerThreeLevel","page":"Trixi.jl","title":"Trixi.ControllerThreeLevel","text":"ControllerThreeLevel(semi, indicator; base_level=1,\n med_level=base_level, med_threshold=0.0,\n max_level=base_level, max_threshold=1.0)\n\nAn AMR controller based on three levels (in descending order of precedence):\n\nset the target level to max_level if indicator > max_threshold\nset the target level to med_level if indicator > med_threshold; if med_level < 0, set the target level to the current level\nset the target level to base_level otherwise\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ControllerThreeLevelCombined","page":"Trixi.jl","title":"Trixi.ControllerThreeLevelCombined","text":"ControllerThreeLevelCombined(semi, indicator_primary, indicator_secondary;\n base_level=1,\n med_level=base_level, med_threshold=0.0,\n max_level=base_level, max_threshold=1.0,\n max_threshold_secondary=1.0)\n\nAn AMR controller based on three levels (in descending order of precedence):\n\nset the target level to max_level if indicator_primary > max_threshold\nset the target level to med_level if indicator_primary > med_threshold; if med_level < 0, set the target level to the current level\nset the target level to base_level otherwise\n\nIf indicator_secondary >= max_threshold_secondary, set the target level to max_level.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DG","page":"Trixi.jl","title":"Trixi.DG","text":"DG(; basis, mortar, surface_integral, volume_integral)\n\nCreate a discontinuous Galerkin method. If basis isa LobattoLegendreBasis, this creates a DGSEM.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DGMulti-Tuple{SummationByPartsOperators.AbstractDerivativeOperator}","page":"Trixi.jl","title":"Trixi.DGMulti","text":"DGMulti(approximation_type::AbstractDerivativeOperator;\n element_type::AbstractElemShape,\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n kwargs...)\n\nCreate a summation by parts (SBP) discretization on the given element_type using a tensor product structure based on the 1D SBP derivative operator passed as approximation_type.\n\nFor more info, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMulti-Tuple{}","page":"Trixi.jl","title":"Trixi.DGMulti","text":"DGMulti(; polydeg::Integer,\n element_type::AbstractElemShape,\n approximation_type=Polynomial(),\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n RefElemData_kwargs...)\n\nCreate a discontinuous Galerkin method which uses\n\napproximations of polynomial degree polydeg\nelement type element_type (Tri(), Quad(), Tet(), and Hex() currently supported)\n\nOptional:\n\napproximation_type (default is Polynomial(); SBP() also supported for Tri(), Quad(), and Hex() element types).\nRefElemData_kwargs are additional keyword arguments for RefElemData, such as quad_rule_vol. For more info, see the StartUpDG.jl docs.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh{NDIMS, ...}\n\nDGMultiMesh describes a mesh type which wraps StartUpDG.MeshData and boundary_faces in a dispatchable type. This is intended to store geometric data and connectivities for any type of mesh (Cartesian, affine, curved, structured/unstructured).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Tuple{DGMulti{2, Tri, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{2, Tri, ApproxType}} where {ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any, Dict{Symbol, Int64}}","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti{2, Tri}, triangulateIO, boundary_dict::Dict{Symbol, Int})\n\ndg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).\ntriangulateIO is a TriangulateIO mesh representation\nboundary_dict is a Dict{Symbol, Int} which associates each integer TriangulateIO boundary tag with a Symbol.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType<:SummationByPartsOperators.AbstractPeriodicDerivativeOperator, SurfaceIntegral, VolumeIntegral, Mortar}}, Tuple{NDIMS}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti)\n\nConstructs a single-element DGMultiMesh for a single periodic element given a DGMulti with approximation_type set to a periodic (finite difference) SBP operator from SummationByPartsOperators.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any, AbstractArray}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti{NDIMS}, vertex_coordinates, EToV;\n is_on_boundary=nothing,\n periodicity=ntuple(_->false, NDIMS)) where {NDIMS}\n\ndg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).\nvertex_coordinates is a tuple of vectors containing x,y,... components of the vertex coordinates\nEToV is a 2D array containing element-to-vertex connectivities for each element\nis_on_boundary specifies boundary using a Dict{Symbol, <:Function}\nperiodicity is a tuple of booleans specifying if the domain is periodic true/false in the (x,y,z) direction.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any, Any}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti{NDIMS}, cells_per_dimension, mapping;\n is_on_boundary=nothing,\n periodicity=ntuple(_ -> false, NDIMS), kwargs...) where {NDIMS}\n\nConstructs a Curved() DGMultiMesh with element type dg.basis.element_type.\n\nmapping is a function which maps from a reference [-1, 1]^NDIMS domain to a mapped domain, e.g., xy = mapping(x, y) in 2D.\nis_on_boundary specifies boundary using a Dict{Symbol, <:Function}\nperiodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti, cells_per_dimension;\n coordinates_min=(-1.0, -1.0), coordinates_max=(1.0, 1.0),\n is_on_boundary=nothing,\n periodicity=ntuple(_ -> false, NDIMS))\n\nConstructs a Cartesian DGMultiMesh with element type dg.basis.element_type. The domain is the tensor product of the intervals [coordinates_min[i], coordinates_max[i]].\n\nis_on_boundary specifies boundary using a Dict{Symbol, <:Function}\nperiodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, String}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti, filename::String)\n\ndg::DGMulti contains information associated with the reference element (e.g., quadrature, basis evaluation, differentiation, etc).\nfilename is a path specifying a .mesh file generated by HOHQMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGSEM","page":"Trixi.jl","title":"Trixi.DGSEM","text":"DGSEM(; RealT=Float64, polydeg::Integer,\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n mortar=MortarL2(basis))\n\nCreate a discontinuous Galerkin spectral element method (DGSEM) using a LobattoLegendreBasis with polynomials of degree polydeg.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DissipationGlobalLaxFriedrichs","page":"Trixi.jl","title":"Trixi.DissipationGlobalLaxFriedrichs","text":"DissipationGlobalLaxFriedrichs(λ)\n\nCreate a global Lax-Friedrichs dissipation operator with dissipation coefficient λ.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DissipationLocalLaxFriedrichs","page":"Trixi.jl","title":"Trixi.DissipationLocalLaxFriedrichs","text":"DissipationLocalLaxFriedrichs(max_abs_speed=max_abs_speed_naive)\n\nCreate a local Lax-Friedrichs dissipation operator where the maximum absolute wave speed is estimated as max_abs_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to max_abs_speed_naive.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.EulerAcousticsCouplingCallback","page":"Trixi.jl","title":"Trixi.EulerAcousticsCouplingCallback","text":"EulerAcousticsCouplingCallback\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nA callback that couples the acoustic perturbation equations and compressible Euler equations. Must be used in conjunction with SemidiscretizationEulerAcoustics. This callback manages the flow solver - which is always one time step ahead of the acoustics solver - and calculates the acoustic source term after each time step. The linearized Lamb vector is used as the source term, i.e.\n\nmathbfs = -(mathbfomega times barmathbfv\n + barmathbfomega times mathbfv)\n\nwhere mathbfv denotes the velocity, mathbfomega denotes the vorticity, the bar bar(cdot) indicates time-averaged quantities (see AveragingCallback) and prime (cdot) denotes perturbed quantities defined by phi = phi - barphi. Note that the perturbed quantities here are based entirely on the pure flow solution and should not be confused with the state variables of the acoustic perturbation equations.\n\nIn addition, this callback manages the time step size for both solvers and initializes the mean values of the acoustic perturbation equations using results obtained with the AveragingCallback.\n\nMichael Schlottke-Lakemper (2017) A direct-hybrid method for aeroacoustic analysis DOI: 10.18154/RWTH-2017-04082\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.EulerAcousticsCouplingCallback-Tuple{Any, AbstractString, Any, Real, Real}","page":"Trixi.jl","title":"Trixi.EulerAcousticsCouplingCallback","text":"EulerAcousticsCouplingCallback(ode_euler, averaging_file::AbstractString, alg,\n cfl_acoustics::Real, cfl_euler::Real; kwargs...)\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nCreates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_file (see AveragingCallback).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.EulerAcousticsCouplingCallback-Tuple{Any, DiscreteCallback{<:Any, <:AveragingCallback}, Any, Real, Real}","page":"Trixi.jl","title":"Trixi.EulerAcousticsCouplingCallback","text":"EulerAcousticsCouplingCallback(ode_euler,\n averaging_callback::DiscreteCallback{<:Any, <:AveragingCallback},\n alg, cfl_acoustics::Real, cfl_euler::Real; kwargs...)\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nCreates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_callback (see AveragingCallback).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.FDSBP","page":"Trixi.jl","title":"Trixi.FDSBP","text":"FDSBP(D_SBP; surface_integral, volume_integral)\n\nSpecialization of DG methods that uses general summation by parts (SBP) operators from SummationByPartsOperators.jl. In particular, this includes classical finite difference (FD) SBP methods. These methods have the same structure as classical DG methods - local operations on elements with connectivity through interfaces without imposing any continuity constraints.\n\nD_SBP is an SBP derivative operator from SummationByPartsOperators.jl. The other arguments have the same meaning as in DG or DGSEM.\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxHLL","page":"Trixi.jl","title":"Trixi.FluxHLL","text":"FluxHLL(min_max_speed=min_max_speed_naive)\n\nCreate an HLL (Harten, Lax, van Leer) numerical flux where the minimum and maximum wave speeds are estimated as λ_min, λ_max = min_max_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to min_max_speed_naive. Original paper:\n\nAmiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxHydrostaticReconstruction","page":"Trixi.jl","title":"Trixi.FluxHydrostaticReconstruction","text":"FluxHydrostaticReconstruction(numerical_flux, hydrostatic_reconstruction)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nAllow for some kind of hydrostatic reconstruction of the solution state prior to the surface flux computation. This is a particular strategy to ensure that the method remains well-balanced for the shallow water equations, see ShallowWaterEquations1D or ShallowWaterEquations2D.\n\nFor example, the hydrostatic reconstruction from Audusse et al. is implemented in one and two spatial dimensions, see hydrostatic_reconstruction_audusse_etal or the original paper\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\nOther hydrostatic reconstruction techniques are available, particularly to handle wet / dry fronts. A good overview of the development and application of hydrostatic reconstruction can be found in\n\nGuoxian Chen and Sebastian Noelle A unified surface-gradient and hydrostatic reconstruction scheme for the shallow water equations (2021) RWTH Aachen preprint\nAndreas Buttinger-Kreuzhuber, Zsolt Horváth, Sebastian Noelle, Günter Blöschl and Jürgen Waser (2019) A fast second-order shallow water scheme on two-dimensional structured grids over abrupt topography DOI: 10.1016/j.advwatres.2019.03.010\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxLMARS","page":"Trixi.jl","title":"Trixi.FluxLMARS","text":"FluxLMARS(c)(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nLow Mach number approximate Riemann solver (LMARS) for atmospheric flows using an estimate c of the speed of sound.\n\nReferences:\n\nXi Chen et al. (2013) A Control-Volume Model of the Compressible Euler Equations with a Vertical Lagrangian Coordinate DOI: 10.1175/MWR-D-12-00129.1\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxLaxFriedrichs","page":"Trixi.jl","title":"Trixi.FluxLaxFriedrichs","text":"FluxLaxFriedrichs(max_abs_speed=max_abs_speed_naive)\n\nLocal Lax-Friedrichs (Rusanov) flux with maximum wave speed estimate provided by max_abs_speed, cf. DissipationLocalLaxFriedrichs and max_abs_speed_naive.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxPlusDissipation","page":"Trixi.jl","title":"Trixi.FluxPlusDissipation","text":"FluxPlusDissipation(numerical_flux, dissipation)\n\nCombine a numerical_flux with a dissipation operator to create a new numerical flux.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxRotated","page":"Trixi.jl","title":"Trixi.FluxRotated","text":"FluxRotated(numerical_flux)\n\nCompute a numerical_flux flux in direction of a normal vector by rotating the solution, computing the numerical flux in x-direction, and rotating the calculated flux back.\n\nRequires a rotationally invariant equation with equation-specific functions rotate_to_x and rotate_from_x.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxUpwind","page":"Trixi.jl","title":"Trixi.FluxUpwind","text":"FluxUpwind(splitting)\n\nA numerical flux f(u_left, u_right) = f⁺(u_left) + f⁻(u_right) based on flux vector splitting.\n\nThe SurfaceIntegralUpwind with a given splitting is equivalent to the SurfaceIntegralStrongForm with FluxUpwind(splitting) as numerical flux (up to floating point differences).\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.GlmSpeedCallback","page":"Trixi.jl","title":"Trixi.GlmSpeedCallback","text":"GlmSpeedCallback(; glm_scale=0.5, cfl)\n\nUpdate the divergence cleaning wave speed c_h according to the time step computed in StepsizeCallback for the ideal GLM-MHD equations. The cfl number should be set to the same value as for the time step size calculation. The glm_scale ensures that the GLM wave speed is lower than the fastest physical waves in the MHD solution and should thus be set to a value within the interval [0,1]. Note that glm_scale = 0 deactivates the divergence cleaning.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.GradientVariablesPrimitive","page":"Trixi.jl","title":"Trixi.GradientVariablesPrimitive","text":"GradientVariablesPrimitive and GradientVariablesEntropy are gradient variable type parameters for CompressibleNavierStokesDiffusion1D. By default, the gradient variables are set to be GradientVariablesPrimitive. Specifying GradientVariablesEntropy instead uses the entropy variable formulation from\n\nHughes, Mallet, Franca (1986) A new finite element formulation for computational fluid dynamics: I. Symmetric forms of the compressible Euler and Navier-Stokes equations and the second law of thermodynamics. https://doi.org/10.1016/0045-7825(86)90127-1\n\nUnder GradientVariablesEntropy, the Navier-Stokes discretization is provably entropy stable.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HypDiffN3Erk3Sstar52","page":"Trixi.jl","title":"Trixi.HypDiffN3Erk3Sstar52","text":"HypDiffN3Erk3Sstar52()\n\nFive stage, second-order accurate explicit Runge-Kutta scheme with stability region optimized for the hyperbolic diffusion equation with LLF flux and polynomials of degree polydeg=3.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HyperbolicDiffusionEquations1D","page":"Trixi.jl","title":"Trixi.HyperbolicDiffusionEquations1D","text":"HyperbolicDiffusionEquations1D\n\nThe linear hyperbolic diffusion equations in one space dimension. A description of this system can be found in Sec. 2.5 of the book\n\nMasatsuka (2013) I Do Like CFD, Too: Vol 1. Freely available at http://www.cfdbooks.com/\n\nFurther analysis can be found in the paper\n\nNishikawa (2007) A first-order system approach for diffusion equation. I: Second-order residual-distribution schemes DOI: 10.1016/j.jcp.2007.07.029\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HyperbolicDiffusionEquations2D","page":"Trixi.jl","title":"Trixi.HyperbolicDiffusionEquations2D","text":"HyperbolicDiffusionEquations2D\n\nThe linear hyperbolic diffusion equations in two space dimensions. A description of this system can be found in Sec. 2.5 of the book \"I Do Like CFD, Too: Vol 1\". The book is freely available at http://www.cfdbooks.com/ and further analysis can be found in the paper by Nishikawa DOI: 10.1016/j.jcp.2007.07.029\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HyperbolicDiffusionEquations3D","page":"Trixi.jl","title":"Trixi.HyperbolicDiffusionEquations3D","text":"HyperbolicDiffusionEquations3D\n\nThe linear hyperbolic diffusion equations in three space dimensions. A description of this system can be found in Sec. 2.5 of the book \"I Do Like CFD, Too: Vol 1\". The book is freely available at http://www.cfdbooks.com/ and further analysis can be found in the paper by Nishikawa DOI: 10.1016/j.jcp.2007.07.029\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdEquations1D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdEquations1D","text":"IdealGlmMhdEquations1D(gamma)\n\nThe ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in one space dimension.\n\nnote: Note\nThere is no divergence cleaning variable psi because the divergence-free constraint is satisfied trivially in one spatial dimension.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdEquations2D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdEquations2D","text":"IdealGlmMhdEquations2D(gamma)\n\nThe ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in two space dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdEquations3D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdEquations3D","text":"IdealGlmMhdEquations3D(gamma)\n\nThe ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in three space dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdMulticomponentEquations1D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdMulticomponentEquations1D","text":"IdealGlmMhdMulticomponentEquations1D\n\nThe ideal compressible multicomponent GLM-MHD equations in one space dimension.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdMulticomponentEquations2D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdMulticomponentEquations2D","text":"IdealGlmMhdMulticomponentEquations2D\n\nThe ideal compressible multicomponent GLM-MHD equations in two space dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IndicatorHennemannGassner","page":"Trixi.jl","title":"Trixi.IndicatorHennemannGassner","text":"IndicatorHennemannGassner(equations::AbstractEquations, basis;\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable)\nIndicatorHennemannGassner(semi::AbstractSemidiscretization;\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable)\n\nIndicator used for shock-capturing (when passing the equations and the basis) or adaptive mesh refinement (AMR, when passing the semi).\n\nSee also VolumeIntegralShockCapturingHG.\n\nReferences\n\nHennemann, Gassner (2020) \"A provably entropy stable subcell shock capturing approach for high order split form DG\" arXiv: 2008.12044\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IndicatorHennemannGassnerShallowWater","page":"Trixi.jl","title":"Trixi.IndicatorHennemannGassnerShallowWater","text":"IndicatorHennemannGassnerShallowWater(equations::AbstractEquations, basis;\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable)\n\nModified version of the IndicatorHennemannGassner indicator used for shock-capturing for shallow water equations. After the element-wise values for the blending factors are computed an additional check is made to see if the element is partially wet. In this case, partially wet elements are set to use the pure finite volume scheme that is guaranteed to be well-balanced for this wet/dry transition state of the flow regime.\n\nSee also VolumeIntegralShockCapturingHG.\n\nReferences\n\nHennemann, Gassner (2020) \"A provably entropy stable subcell shock capturing approach for high order split form DG\" arXiv: 2008.12044\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IndicatorLöhner","page":"Trixi.jl","title":"Trixi.IndicatorLöhner","text":"IndicatorLöhner (equivalent to IndicatorLoehner)\n\nIndicatorLöhner(equations::AbstractEquations, basis;\n f_wave=0.2, variable)\nIndicatorLöhner(semi::AbstractSemidiscretization;\n f_wave=0.2, variable)\n\nAMR indicator adapted from a FEM indicator by Löhner (1987), also used in the FLASH code as standard AMR indicator. The indicator estimates a weighted second derivative of a specified variable locally.\n\nWhen constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.\n\nReferences\n\nLöhner (1987) \"An adaptive finite element scheme for transient problems in CFD\" doi: 10.1016/0045-7825(87)90098-3\nhttps://flash.rochester.edu/site/flashcode/usersupport/flash4ug_4p62/node59.html#SECTION05163100000000000000\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IndicatorMax","page":"Trixi.jl","title":"Trixi.IndicatorMax","text":"IndicatorMax(equations::AbstractEquations, basis; variable)\nIndicatorMax(semi::AbstractSemidiscretization; variable)\n\nA simple indicator returning the maximum of variable in an element. When constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.InviscidBurgersEquation1D","page":"Trixi.jl","title":"Trixi.InviscidBurgersEquation1D","text":"InviscidBurgersEquation1D\n\nThe inviscid Burgers' equation\n\npartial_t u + frac12 partial_1 u^2 = 0\n\nin one space dimension.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.Isothermal","page":"Trixi.jl","title":"Trixi.Isothermal","text":"struct Isothermal\n\nUsed to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and return a scalar value for the temperature at point x and time t.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LaplaceDiffusion1D","page":"Trixi.jl","title":"Trixi.LaplaceDiffusion1D","text":"LaplaceDiffusion1D(diffusivity, equations)\n\nLaplaceDiffusion1D represents a scalar diffusion term nabla cdot (kappanabla u)) with diffusivity kappa applied to each solution component defined by equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LaplaceDiffusion2D","page":"Trixi.jl","title":"Trixi.LaplaceDiffusion2D","text":"LaplaceDiffusion2D(diffusivity, equations)\n\nLaplaceDiffusion2D represents a scalar diffusion term nabla cdot (kappanabla u)) with diffusivity kappa applied to each solution component defined by equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LaplaceDiffusion3D","page":"Trixi.jl","title":"Trixi.LaplaceDiffusion3D","text":"LaplaceDiffusion3D(diffusivity, equations)\n\nLaplaceDiffusion3D represents a scalar diffusion term nabla cdot (kappanabla u)) with diffusivity kappa applied to each solution component defined by equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LatticeBoltzmannEquations2D","page":"Trixi.jl","title":"Trixi.LatticeBoltzmannEquations2D","text":"LatticeBoltzmannEquations2D(; Ma, Re, collision_op=collision_bgk,\n c=1, L=1, rho0=1, u0=nothing, nu=nothing)\n\nThe Lattice-Boltzmann equations\n\npartial_t u_alpha + v_alpha1 partial_1 u_alpha + v_alpha2 partial_2 u_alpha = 0\n\nin two space dimensions for the D2Q9 scheme.\n\nThe characteristic Mach number and Reynolds numbers are specified as Ma and Re. By the default, the collision operator collision_op is set to the BGK model. c, L, and rho0 specify the mean thermal molecular velocity, the characteristic length, and the reference density, respectively. They can usually be left to the default values. If desired, instead of the Mach number, one can set the macroscopic reference velocity u0 directly (Ma needs to be set to nothing in this case). Likewise, instead of the Reynolds number one can specify the kinematic viscosity nu directly (in this case, Re needs to be set to nothing).\n\nThe nine discrete velocity directions of the D2Q9 scheme are sorted as follows [4]:\n\n 6 2 5 y\n ┌───┼───┐ │\n │ │ │\n 3 ┼ 9 ┼ 1 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 7 4 8 z\n\nNote that usually the velocities are numbered from 0 to 8, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 9, where 1 through 8 correspond to the velocity directions in [4] and 9 is the zero velocity.\n\nThe corresponding opposite directions are:\n\n1 ←→ 3\n2 ←→ 4\n3 ←→ 1\n4 ←→ 2\n5 ←→ 7\n6 ←→ 8\n7 ←→ 5\n8 ←→ 6\n9 ←→ 9\n\nThe main sources for the base implementation were\n\nMisun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024\nKarsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.\nDieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0\nDieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LatticeBoltzmannEquations3D","page":"Trixi.jl","title":"Trixi.LatticeBoltzmannEquations3D","text":"LatticeBoltzmannEquations3D(; Ma, Re, collision_op=collision_bgk,\n c=1, L=1, rho0=1, u0=nothing, nu=nothing)\n\nThe Lattice-Boltzmann equations\n\npartial_t u_alpha + v_alpha1 partial_1 u_alpha + v_alpha2 partial_2 u_alpha + v_alpha3 partial_3 u_alpha = 0\n\nin three space dimensions for the D3Q27 scheme.\n\nThe characteristic Mach number and Reynolds numbers are specified as Ma and Re. By the default, the collision operator collision_op is set to the BGK model. c, L, and rho0 specify the mean thermal molecular velocity, the characteristic length, and the reference density, respectively. They can usually be left to the default values. If desired, instead of the Mach number, one can set the macroscopic reference velocity u0 directly (Ma needs to be set to nothing in this case). Likewise, instead of the Reynolds number one can specify the kinematic viscosity nu directly (in this case, Re needs to be set to nothing).\n\nThe twenty-seven discrete velocity directions of the D3Q27 scheme are sorted as follows [4]:\n\nplane at z = -1:\n 24 17 21 y\n ┌───┼───┐ │\n │ │ │\n 10 ┼ 6 ┼ 15 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 20 12 26 z\nplane at z = 0:\n 14 3 7 y\n ┌───┼───┐ │\n │ │ │\n 2 ┼ 27 ┼ 1 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 8 4 13 z\nplane at z = +1:\n 25 11 19 y\n ┌───┼───┐ │\n │ │ │\n 16 ┼ 5 ┼ 9 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 22 18 23 z\n\nNote that usually the velocities are numbered from 0 to 26, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 27, where 1 through 26 correspond to the velocity directions in [4] and 27 is the zero velocity.\n\nThe corresponding opposite directions are:\n\n1 ←→ 2\n2 ←→ 1\n3 ←→ 4\n4 ←→ 3\n5 ←→ 6\n6 ←→ 5\n7 ←→ 8\n8 ←→ 7\n9 ←→ 10\n10 ←→ 9\n11 ←→ 12\n12 ←→ 11\n13 ←→ 14\n14 ←→ 13\n15 ←→ 16\n16 ←→ 15\n17 ←→ 18\n18 ←→ 17\n19 ←→ 20\n20 ←→ 19\n21 ←→ 22\n22 ←→ 21\n23 ←→ 24\n24 ←→ 23\n25 ←→ 26\n26 ←→ 25\n27 ←→ 27\n\nThe main sources for the base implementation were\n\nMisun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024\nKarsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.\nDieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0\nDieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearScalarAdvectionEquation1D","page":"Trixi.jl","title":"Trixi.LinearScalarAdvectionEquation1D","text":"LinearScalarAdvectionEquation1D\n\nThe linear scalar advection equation\n\npartial_t u + a partial_1 u = 0\n\nin one space dimension with constant velocity a.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearScalarAdvectionEquation2D","page":"Trixi.jl","title":"Trixi.LinearScalarAdvectionEquation2D","text":"LinearScalarAdvectionEquation2D\n\nThe linear scalar advection equation\n\npartial_t u + a_1 partial_1 u + a_2 partial_2 u = 0\n\nin two space dimensions with constant velocity a.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearScalarAdvectionEquation3D","page":"Trixi.jl","title":"Trixi.LinearScalarAdvectionEquation3D","text":"LinearScalarAdvectionEquation3D\n\nThe linear scalar advection equation\n\npartial_t u + a_1 partial_1 u + a_2 partial_2 u + a_3 partial_3 u = 0\n\nin three space dimensions with constant velocity a.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearizedEulerEquations2D","page":"Trixi.jl","title":"Trixi.LinearizedEulerEquations2D","text":"LinearizedEulerEquations2D(v_mean_global, c_mean_global, rho_mean_global)\n\nLinearized euler equations in two space dimensions. The equations are given by\n\npartial_t\nbeginpmatrix\n rho v_1 v_2 p\nendpmatrix\n+\npartial_x\nbeginpmatrix\n barrho v_1 + barv_1 rho barv_1 v_1 + fracpbarrho barv_1 v_2 barv_1 p + c^2 barrho v_1\nendpmatrix\n+\npartial_y\nbeginpmatrix\n barrho v_2 + barv_2 rho barv_2 v_1 barv_2 v_2 + fracpbarrho barv_2 p + c^2 barrho v_2\nendpmatrix\n=\nbeginpmatrix\n 0 0 0 0\nendpmatrix\n\nThe bar bar(cdot) indicates uniform mean flow variables and c is the speed of sound. The unknowns are the acoustic velocities v = (v_1 v_2), the pressure p and the density rho.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LobattoLegendreBasis","page":"Trixi.jl","title":"Trixi.LobattoLegendreBasis","text":"LobattoLegendreBasis([RealT=Float64,] polydeg::Integer)\n\nCreate a nodal Lobatto-Legendre basis for polynomials of degree polydeg.\n\nFor the special case polydeg=0 the DG method reduces to a finite volume method. Therefore, this function sets the center point of the cell as single node.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NoSlip","page":"Trixi.jl","title":"Trixi.NoSlip","text":"struct NoSlip\n\nUse to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and should return a SVector{NDIMS} whose entries are the velocity vector at a point x and time t.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NonConservativeLocal","page":"Trixi.jl","title":"Trixi.NonConservativeLocal","text":"NonConservativeLocal()\n\nStruct used for multiple dispatch on non-conservative flux functions in the format of \"local * symmetric\". When the argument nonconservative_type is of type NonConservativeLocal, the function returns the local part of the non-conservative term.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NonConservativeSymmetric","page":"Trixi.jl","title":"Trixi.NonConservativeSymmetric","text":"NonConservativeSymmetric()\n\nStruct used for multiple dispatch on non-conservative flux functions in the format of \"local * symmetric\". When the argument nonconservative_type is of type NonConservativeSymmetric, the function returns the symmetric part of the non-conservative term.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.P4estMesh","page":"Trixi.jl","title":"Trixi.P4estMesh","text":"P4estMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nAn unstructured curved mesh based on trees that uses the C library p4est to manage trees and mesh refinement.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.P4estMesh-Tuple{Any}","page":"Trixi.jl","title":"Trixi.P4estMesh","text":"P4estMesh(trees_per_dimension; polydeg,\n mapping=nothing, faces=nothing, coordinates_min=nothing, coordinates_max=nothing,\n RealT=Float64, initial_refinement_level=0, periodicity=true, unsaved_changes=true,\n p4est_partition_allow_for_coarsening=true)\n\nCreate a structured curved P4estMesh of the specified size.\n\nThere are three ways to map the mesh to the physical domain.\n\nDefine a mapping that maps the hypercube [-1, 1]^n.\nSpecify a Tuple faces of functions that parametrize each face.\nCreate a rectangular mesh by specifying coordinates_min and coordinates_max.\n\nNon-periodic boundaries will be called :x_neg, :x_pos, :y_neg, :y_pos, :z_neg, :z_pos.\n\nArguments\n\ntrees_per_dimension::NTupleE{NDIMS, Int}: the number of trees in each dimension.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.\nmapping: a function of NDIMS variables to describe the mapping that transforms the reference mesh ([-1, 1]^n) to the physical domain. Use only one of mapping, faces and coordinates_min/coordinates_max.\nfaces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D). Use only one of mapping, faces and coordinates_min/coordinates_max.\ncoordinates_min: vector or tuple of the coordinates of the corner in the negative direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.\ncoordinates_max: vector or tuple of the coordinates of the corner in the positive direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\np4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.P4estMesh-Union{Tuple{String}, Tuple{NDIMS}} where NDIMS","page":"Trixi.jl","title":"Trixi.P4estMesh","text":"P4estMesh{NDIMS}(meshfile::String;\n mapping=nothing, polydeg=1, RealT=Float64,\n initial_refinement_level=0, unsaved_changes=true,\n p4est_partition_allow_for_coarsening=true)\n\nMain mesh constructor for the P4estMesh that imports an unstructured, conforming mesh from an Abaqus mesh file (.inp). Each element of the conforming mesh parsed from the meshfile is created as a p4est tree datatype.\n\nTo create a curved unstructured mesh P4estMesh two strategies are available:\n\np4est_mesh_from_hohqmesh_abaqus: High-order, curved boundary information created by HOHQMesh.jl is available in the meshfile. The mesh polynomial degree polydeg of the boundaries is provided from the meshfile. The computation of the mapped tree coordinates is done with transfinite interpolation with linear blending similar to UnstructuredMesh2D. Boundary name information is also parsed from the meshfile such that different boundary conditions can be set at each named boundary on a given tree.\np4est_mesh_from_standard_abaqus: By default, with mapping=nothing and polydeg=1, this creates a straight-sided from the information parsed from the meshfile. If a mapping function is specified then it computes the mapped tree coordinates via polynomial interpolants with degree polydeg. The mesh created by this function will only have one boundary :all, as distinguishing different physical boundaries is non-trivial.\n\nNote that the mapping and polydeg keyword arguments are only used by the p4est_mesh_from_standard_abaqus function. The p4est_mesh_from_hohqmesh_abaqus function obtains the mesh polydeg directly from the meshfile and constructs the transfinite mapping internally.\n\nThe particular strategy is selected according to the header present in the meshfile where the constructor checks whether or not the meshfile was created with HOHQMesh.jl. If the Abaqus file header is not present in the meshfile then the P4estMesh is created with the function p4est_mesh_from_standard_abaqus.\n\nThe default keyword argument initial_refinement_level=0 corresponds to a forest where the number of trees is the same as the number of elements in the original meshfile. Increasing the initial_refinement_level allows one to uniformly refine the base mesh given in the meshfile to create a forest with more trees before the simulation begins. For example, if a two-dimensional base mesh contains 25 elements then setting initial_refinement_level=1 creates an initial forest of 2^2 * 25 = 100 trees.\n\nArguments\n\nmeshfile::String: an uncurved Abaqus mesh file that can be imported by p4est.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\np4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ParametersEulerGravity","page":"Trixi.jl","title":"Trixi.ParametersEulerGravity","text":"ParametersEulerGravity(; background_density=0.0,\n gravitational_constant=1.0,\n cfl=1.0,\n resid_tol=1.0e-4,\n n_iterations_max=10^4,\n timestep_gravity=timestep_gravity_erk52_3Sstar!)\n\nSet up parameters for the gravitational part of a SemidiscretizationEulerGravity.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ParsaniKetchesonDeconinck3Sstar32","page":"Trixi.jl","title":"Trixi.ParsaniKetchesonDeconinck3Sstar32","text":"ParsaniKetchesonDeconinck3Sstar32()\n\nParsani, Ketcheson, Deconinck (2013) Optimized explicit RK schemes for the spectral difference method applied to wave propagation problems DOI: 10.1137/120885899\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ParsaniKetchesonDeconinck3Sstar94","page":"Trixi.jl","title":"Trixi.ParsaniKetchesonDeconinck3Sstar94","text":"ParsaniKetchesonDeconinck3Sstar94()\n\nParsani, Ketcheson, Deconinck (2013) Optimized explicit RK schemes for the spectral difference method applied to wave propagation problems DOI: 10.1137/120885899\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PerformanceCounter","page":"Trixi.jl","title":"Trixi.PerformanceCounter","text":"PerformanceCounter()\n\nA PerformanceCounter can be used to track the runtime performance of some calls. Add a new runtime measurement via put!(counter, runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PerformanceCounterList","page":"Trixi.jl","title":"Trixi.PerformanceCounterList","text":"PerformanceCounterList{N}()\n\nA PerformanceCounterList{N} can be used to track the runtime performance of calls to multiple functions, adding them up. Add a new runtime measurement via put!(counter.counters[i], runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PlotData1D","page":"Trixi.jl","title":"Trixi.PlotData1D","text":"PlotData1D\n\nHolds all relevant data for creating 1D plots of multiple solution variables and to visualize the mesh.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PlotData1D-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.PlotData1D","text":"PlotData1D(u, semi [or mesh, equations, solver, cache];\n solution_variables=nothing, nvisnodes=nothing)\n\nCreate a new PlotData1D object that can be used for visualizing 1D DGSEM solution data array u with Plots.jl. All relevant geometrical information is extracted from the semidiscretization semi. By default, the primitive variables (if existent) or the conservative variables (otherwise) from the solution are used for plotting. This can be changed by passing an appropriate conversion function to solution_variables.\n\nnvisnodes specifies the number of visualization nodes to be used. If it is nothing, twice the number of solution DG nodes are used for visualization, and if set to 0, exactly the number of nodes in the DG elements are used.\n\nWhen visualizing data from a two-dimensional simulation, a 1D slice is extracted for plotting. slice specifies the axis along which the slice is extracted and may be :x, or :y. The slice position is specified by a point that lies on it, which defaults to (0.0, 0.0). Both of these values are ignored when visualizing 1D data. This applies analogously to three-dimensional simulations, where slice may be :xy, :xz, or :yz.\n\nAnother way to visualize 2D/3D data is by creating a plot along a given curve. This is done with the keyword argument curve. It can be set to a list of 2D/3D points which define the curve. When using curve any other input from slice or point will be ignored.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData1D-Tuple{Union{ODESolution{T, N, uType, uType2, DType, tType, rateType, P} where {T, N, uType, uType2, DType, tType, rateType, P<:(ODEProblem{uType_, tType_, isinplace, P_} where {uType_, tType_, isinplace, P_<:Trixi.AbstractSemidiscretization})}, Trixi.TimeIntegratorSolution}}","page":"Trixi.jl","title":"Trixi.PlotData1D","text":"PlotData1D(sol; kwargs...)\n\nCreate a PlotData1D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData2DCartesian","page":"Trixi.jl","title":"Trixi.PlotData2DCartesian","text":"PlotData2D\n\nHolds all relevant data for creating 2D plots of multiple solution variables and to visualize the mesh.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PolytropicEulerEquations2D","page":"Trixi.jl","title":"Trixi.PolytropicEulerEquations2D","text":"PolytropicEulerEquations2D(gamma, kappa)\n\nThe polytropic Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho v_2\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v_1 rho v_1^2 + kapparho^gamma rho v_1 v_2\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_2 rho v_1 v_2 rho v_2^2 + kapparho^gamma\nendpmatrix\n=\nbeginpmatrix\n0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in two space dimensions. Here, rho is the density and v_1 andv_2 the velocities and\n\np = kapparho^gamma\n\nthe pressure, which we replaced using this relation.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PositivityPreservingLimiterShallowWater","page":"Trixi.jl","title":"Trixi.PositivityPreservingLimiterShallowWater","text":"PositivityPreservingLimiterShallowWater(; variables)\n\nThe limiter is specifically designed for the shallow water equations. It is applied to all scalar variables in their given order using the defined threshold_limiter from the ShallowWaterEquations1D struct or the ShallowWaterEquations2D struct to determine the minimal acceptable values. The order of the variables is important and might have a strong influence on the robustness.\n\nAs opposed to the standard version of the PositivityPreservingLimiterZhangShu, nodes with a water height below the threshold_limiter are treated in a special way. To avoid numerical problems caused by velocities close to zero, the velocity is cut off, such that the node can be identified as \"dry\". The special feature of the ShallowWaterEquations used here is that the bottom topography is stored as an additional quantity in the solution vector u. However, the value of the bottom topography should not be changed. That is why, it is not limited.\n\nAfter the limiting process is applied to all degrees of freedom, for safety reasons, the threshold_limiter is applied again on all the DG nodes in order to avoid water height below. In the case where the cell mean value is below the threshold before applying the limiter, there could still be dry nodes afterwards due to the logic of the limiter.\n\nThis fully-discrete positivity-preserving limiter is based on the work of\n\nZhang, Shu (2011) Maximum-principle-satisfying and positivity-preserving high-order schemes for conservation laws: survey and new developments doi: 10.1098/rspa.2011.0153\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PositivityPreservingLimiterZhangShu","page":"Trixi.jl","title":"Trixi.PositivityPreservingLimiterZhangShu","text":"PositivityPreservingLimiterZhangShu(; threshold, variables)\n\nThe fully-discrete positivity-preserving limiter of\n\nZhang, Shu (2011) Maximum-principle-satisfying and positivity-preserving high-order schemes for conservation laws: survey and new developments doi: 10.1098/rspa.2011.0153\n\nThe limiter is applied to all scalar variables in their given order using the associated thresholds to determine the minimal acceptable values. The order of the variables is important and might have a strong influence on the robustness.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SaveRestartCallback","page":"Trixi.jl","title":"Trixi.SaveRestartCallback","text":"SaveRestartCallback(; interval=0,\n save_final_restart=true,\n output_directory=\"out\")\n\nSave the current numerical solution in a restart file every interval time steps.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SaveSolutionCallback","page":"Trixi.jl","title":"Trixi.SaveSolutionCallback","text":"SaveSolutionCallback(; interval::Integer=0,\n dt=nothing,\n save_initial_solution=true,\n save_final_solution=true,\n output_directory=\"out\",\n solution_variables=cons2prim)\n\nSave the current numerical solution in regular intervals. Either pass interval to save every interval time steps or pass dt to save in intervals of dt in terms of integration time by adding additional (shortened) time steps where necessary (note that this may change the solution). solution_variables can be any callable that converts the conservative variables at a single point to a set of solution variables. The first parameter passed to solution_variables will be the set of conservative variables and the second parameter is the equation struct.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationCoupled","page":"Trixi.jl","title":"Trixi.SemidiscretizationCoupled","text":"SemidiscretizationCoupled\n\nA struct used to bundle multiple semidiscretizations. semidiscretize will return an ODEProblem that synchronizes time steps between the semidiscretizations. Each call of rhs! will call rhs! for each semidiscretization individually. The semidiscretizations can be coupled by gluing meshes together using BoundaryConditionCoupled.\n\nwarning: Experimental code\nThis is an experimental feature and can change any time.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationCoupled-Tuple","page":"Trixi.jl","title":"Trixi.SemidiscretizationCoupled","text":"SemidiscretizationCoupled(semis...)\n\nCreate a coupled semidiscretization that consists of the semidiscretizations passed as arguments.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SemidiscretizationEulerAcoustics","page":"Trixi.jl","title":"Trixi.SemidiscretizationEulerAcoustics","text":"SemidiscretizationEulerAcoustics(semi_acoustics::SemiAcoustics, semi_euler::SemiEuler;\n source_region=x->true, weights=x->1.0)\n\nwarning: Experimental code\nThis semidiscretization is experimental and may change in any future release.\n\nConstruct a semidiscretization of the acoustic perturbation equations that is coupled with the compressible Euler equations via source terms for the perturbed velocity. Both semidiscretizations have to use the same mesh and solvers with a shared basis. The coupling region is described by a function source_region that maps the coordinates of a single node to true or false depending on whether the point lies within the coupling region or not. A weighting function weights that maps coordinates to weights is applied to the acoustic source terms. Note that this semidiscretization should be used in conjunction with EulerAcousticsCouplingCallback and only works in two dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationEulerGravity","page":"Trixi.jl","title":"Trixi.SemidiscretizationEulerGravity","text":"SemidiscretizationEulerGravity\n\nA struct containing everything needed to describe a spatial semidiscretization of a the compressible Euler equations with self-gravity, reformulating the Poisson equation for the gravitational potential as steady-state problem of the hyperblic diffusion equations.\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) \"A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics\" arXiv: 2008.10593\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationEulerGravity-Union{Tuple{SemiGravity}, Tuple{SemiEuler}, Tuple{Mesh}, Tuple{SemiEuler, SemiGravity, Any}} where {Mesh, SemiEuler<:(SemidiscretizationHyperbolic{Mesh, <:Trixi.AbstractCompressibleEulerEquations}), SemiGravity<:(SemidiscretizationHyperbolic{Mesh, <:Trixi.AbstractHyperbolicDiffusionEquations})}","page":"Trixi.jl","title":"Trixi.SemidiscretizationEulerGravity","text":"SemidiscretizationEulerGravity(semi_euler::SemiEuler, semi_gravity::SemiGravity, parameters)\n\nConstruct a semidiscretization of the compressible Euler equations with self-gravity. parameters should be given as ParametersEulerGravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolic","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolic","text":"SemidiscretizationHyperbolic\n\nA struct containing everything needed to describe a spatial semidiscretization of a hyperbolic conservation law.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolic-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolic","text":"SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver;\n source_terms=nothing,\n boundary_conditions=boundary_condition_periodic,\n RealT=real(solver),\n uEltype=RealT,\n initial_cache=NamedTuple())\n\nConstruct a semidiscretization of a hyperbolic PDE.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolicParabolic","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolicParabolic","text":"SemidiscretizationHyperbolicParabolic\n\nA struct containing everything needed to describe a spatial semidiscretization of a mixed hyperbolic-parabolic conservation law.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolicParabolic-Tuple{Any, Tuple, Any, Any}","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolicParabolic","text":"SemidiscretizationHyperbolicParabolic(mesh, both_equations, initial_condition, solver;\n solver_parabolic=default_parabolic_solver(),\n source_terms=nothing,\n both_boundary_conditions=(boundary_condition_periodic, boundary_condition_periodic),\n RealT=real(solver),\n uEltype=RealT,\n both_initial_caches=(NamedTuple(), NamedTuple()))\n\nConstruct a semidiscretization of a hyperbolic-parabolic PDE.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ShallowWaterEquations1D","page":"Trixi.jl","title":"Trixi.ShallowWaterEquations1D","text":"ShallowWaterEquations1D(; gravity, H0 = 0, threshold_limiter = nothing threshold_wet = nothing)\n\nShallow water equations (SWE) in one space dimension. The equations are given by\n\nbeginaligned\n fracpartial hpartial t + fracpartialpartial x(h v) = 0 \n fracpartialpartial t(h v) + fracpartialpartial xleft(h v^2 + fracg2h^2right)\n + g h fracpartial bpartial x = 0\nendaligned\n\nThe unknown quantities of the SWE are the water height h and the velocity v. The gravitational constant is denoted by g and the (possibly) variable bottom topography function b(x). Conservative variable water height h is measured from the bottom topography b, therefore one also defines the total water height as H = h + b.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nAlso, there are two thresholds which prevent numerical problems as well as instabilities. Both of them do not have to be passed, as default values are defined within the struct. The first one, threshold_limiter, is used in PositivityPreservingLimiterShallowWater on the water height, as a (small) shift on the initial condition and cutoff before the next time step. The second one, threshold_wet, is applied on the water height to define when the flow is \"wet\" before calculating the numerical flux.\n\nThe bottom topography function b(x) is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.\n\nIn addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography must be zero.\nThe bottom topography values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the bottom topography by default.\n\nReferences for the SWE are many but a good introduction is available in Chapter 13 of the book:\n\nRandall J. LeVeque (2002) Finite Volume Methods for Hyperbolic Problems DOI: 10.1017/CBO9780511791253\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ShallowWaterEquations2D","page":"Trixi.jl","title":"Trixi.ShallowWaterEquations2D","text":"ShallowWaterEquations2D(; gravity, H0 = 0, threshold_limiter = nothing, threshold_wet = nothing)\n\nShallow water equations (SWE) in two space dimensions. The equations are given by\n\nbeginaligned\n fracpartial hpartial t + fracpartialpartial x(h v_1)\n + fracpartialpartial y(h v_2) = 0 \n fracpartialpartial t(h v_1) + fracpartialpartial xleft(h v_1^2 + fracg2h^2right)\n + fracpartialpartial y(h v_1 v_2) + g h fracpartial bpartial x = 0 \n fracpartialpartial t(h v_2) + fracpartialpartial x(h v_1 v_2)\n + fracpartialpartial yleft(h v_2^2 + fracg2h^2right) + g h fracpartial bpartial y = 0\nendaligned\n\nThe unknown quantities of the SWE are the water height h and the velocities mathbfv = (v_1 v_2)^T. The gravitational constant is denoted by g and the (possibly) variable bottom topography function b(xy). Conservative variable water height h is measured from the bottom topography b, therefore one also defines the total water height as H = h + b.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nAlso, there are two thresholds which prevent numerical problems as well as instabilities. Both of them do not have to be passed, as default values are defined within the struct. The first one, threshold_limiter, is used in PositivityPreservingLimiterShallowWater on the water height, as a (small) shift on the initial condition and cutoff before the next time step. The second one, threshold_wet, is applied on the water height to define when the flow is \"wet\" before calculating the numerical flux.\n\nThe bottom topography function b(xy) is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.\n\nIn addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography must be zero.\nThe bottom topography values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the bottom topography by default.\n\nReferences for the SWE are many but a good introduction is available in Chapter 13 of the book:\n\nRandall J. LeVeque (2002) Finite Volume Methods for Hyperbolic Problems DOI: 10.1017/CBO9780511791253\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ShallowWaterEquationsQuasi1D","page":"Trixi.jl","title":"Trixi.ShallowWaterEquationsQuasi1D","text":"ShallowWaterEquationsQuasi1D(; gravity, H0 = 0, threshold_limiter = nothing threshold_wet = nothing)\n\nThe quasi-1D shallow water equations (SWE). The equations are given by\n\nbeginaligned\n fracpartialpartial t(a h) + fracpartialpartial x(a h v) = 0 \n fracpartialpartial t(a h v) + fracpartialpartial x(a h v^2)\n + g a h fracpartialpartial x(h + b) = 0\nendaligned\n\nThe unknown quantities of the Quasi-1D SWE are the water height h and the scaled velocity v. The gravitational constant is denoted by g, the (possibly) variable bottom topography function b(x), and (possibly) variable channel width a(x). The water height h is measured from the bottom topography b, therefore one also defines the total water height as H = h + b.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nAlso, there are two thresholds which prevent numerical problems as well as instabilities. Both of them do not have to be passed, as default values are defined within the struct. The first one, threshold_limiter, is used in PositivityPreservingLimiterShallowWater on the water height, as a (small) shift on the initial condition and cutoff before the next time step. The second one, threshold_wet, is applied on the water height to define when the flow is \"wet\" before calculating the numerical flux.\n\nThe bottom topography function b(x) and channel width a(x) are set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero and a to one. \n\nIn addition to the unknowns, Trixi.jl currently stores the bottom topography and channel width values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography and channel width must be zero.\nThe bottom topography and channel width values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the bottom topography and channel width by default.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ShallowWaterTwoLayerEquations1D","page":"Trixi.jl","title":"Trixi.ShallowWaterTwoLayerEquations1D","text":"ShallowWaterTwoLayerEquations1D(gravity, H0, rho_upper, rho_lower)\n\nTwo-Layer Shallow Water equations (2LSWE) in one space dimension. The equations are given by\n\nbeginalignat*4\nfracpartialpartial th_upper\n+ fracpartialpartial xleft(h_upper v_1upperright)\n= 0 \nfracpartialpartial tleft(h_upperv_1upperright)\n+ fracpartialpartial xleft(h_upperv_1upper^2 + dfracgh_upper^22right)\n= -gh_upperfracpartialpartial xleft(b+h_lowerright)\nfracpartialpartial th_lower\n+ fracpartialpartial xleft(h_lowerv_1lowerright)\n= 0 \nfracpartialpartial tleft(h_lowerv_1lowerright)\n+ fracpartialpartial xleft(h_lowerv_1lower^2 + dfracgh_lower^22right)\n= -gh_lowerfracpartialpartial xleft(b+dfracrho_upperrho_lowerh_upperright)\nendalignat*\n\nThe unknown quantities of the 2LSWE are the water heights of the {lower} layer h_lower and the {upper} layer h_upper with respective velocities v_1upper and v_1lower. The gravitational constant is denoted by g, the layer densitites by rho_upperand rho_lower and the (possibly) variable bottom topography function b(x). The conservative variable water height h_lower is measured from the bottom topography b and h_upper relative to h_lower, therefore one also defines the total water heights as H_upper = h_upper + h_upper + b and H_lower = h_lower + b.\n\nThe densities must be chosen such that rho_upper rho_lower, to make sure that the heavier fluid rho_lower is in the bottom layer and the lighter fluid rho_upper in the {upper} layer.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nThe bottom topography function b(x) is set inside the initial condition routine for a particular problem setup.\n\nIn addition to the unknowns, Trixi currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography must be zero.\nThe bottom topography values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi's visualization tools will visualize the bottom topography by default.\n\nA good introduction for the 2LSWE is available in Chapter 12 of the book:\n\nBenoit Cushman-Roisin (2011)\nIntroduction to geophyiscal fluid dynamics: physical and numerical aspects\nhttps://www.sciencedirect.com/bookseries/international-geophysics/vol/101/suppl/C\nISBN: 978-0-12-088759-0\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ShallowWaterTwoLayerEquations2D","page":"Trixi.jl","title":"Trixi.ShallowWaterTwoLayerEquations2D","text":"ShallowWaterTwoLayerEquations2D(gravity, H0, rho_upper, rho_lower)\n\nTwo-Layer Shallow water equations (2LSWE) in two space dimension. The equations are given by\n\nbeginalignat*8\nfracpartialpartial th_upper\n+ fracpartialpartial xleft(h_upper v_1upperright)\n+ fracpartialpartial yleft(h_upper v_2upperright) quad\n= quad 0 \nfracpartialpartial tleft(h_upper v_1upperright)\n+ fracpartialpartial xleft(h_upper v_1upper^2 + fracgh_upper^22right)\n+ fracpartialpartial yleft(h_upper v_1upper v_2upperright) quad\n= -gh_upperfracpartialpartial xleft(b+h_lowerright) \nfracpartialpartial tleft(h_upper v_2upperright)\n+ fracpartialpartial xleft(h_upper v_1upper v_2upperright)\n+ fracpartialpartial yleft(h_upper v_2upper^2 + fracgh_upper^22right)\n= -gh_upperfracpartialpartial yleft(b+h_lowerright)\nfracpartialpartial th_lower\n+ fracpartialpartial xleft(h_lower v_1lowerright)\n+ fracpartialpartial yleft(h_lower v_2lowerright)\n= quad 0 \nfracpartialpartial tleft(h_lower v_1lowerright)\n+ fracpartialpartial xleft(h_lower v_1lower^2 + fracgh_lower^22right)\n+ fracpartialpartial yleft(h_lower v_1lower v_2lowerright)\n= -gh_lowerfracpartialpartial xleft(b+fracrho_upperrho_lower h_upperright)\nfracpartialpartial tleft(h_lower v_2lowerright)\n+ fracpartialpartial xleft(h_lower v_1lower v_2lowerright)\n+ fracpartialpartial yleft(h_lower v_2lower^2 + fracgh_lower^22right)\n= -gh_lowerfracpartialpartial yleft(b+fracrho_upperrho_lower h_upperright)\nendalignat*\n\nThe unknown quantities of the 2LSWE are the water heights of the lower layer h_lower and the upper layer h_upper and the respective velocities in x-direction v_1lower and v_1upper and in y-direction v_2lower and v_2upper. The gravitational constant is denoted by g, the layer densitites by rho_upperand rho_lower and the (possibly) variable bottom topography function by b(x). Conservative variable water height h_lower is measured from the bottom topography b and h_upper relative to h_lower, therefore one also defines the total water heights as H_lower = h_lower + b and H_upper = h_upper + h_lower + b.\n\nThe densities must be chosen such that rho_upper rho_lower, to make sure that the heavier fluid rho_lower is in the bottom layer and the lighter fluid rho_upper in the upper layer.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nThe bottom topography function b(x) is set inside the initial condition routine for a particular problem setup.\n\nIn addition to the unknowns, Trixi currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography must be zero.\nThe bottom topography values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi's visualization tools will visualize the bottom topography by default.\n\nA good introduction for the 2LSWE is available in Chapter 12 of the book:\n\nBenoit Cushman-Roisin (2011)\nIntroduction to geophyiscal fluid dynamics: physical and numerical aspects\nhttps://www.sciencedirect.com/bookseries/international-geophysics/vol/101/suppl/C\nISBN: 978-0-12-088759-0\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SimpleSSPRK33","page":"Trixi.jl","title":"Trixi.SimpleSSPRK33","text":"SimpleSSPRK33(; stage_callbacks=())\n\nThe third-order SSP Runge-Kutta method of Shu and Osher.\n\nReferences\n\nShu, Osher (1988) \"Efficient Implementation of Essentially Non-oscillatory Shock-Capturing Schemes\" (Eq. 2.18) DOI: 10.1016/0021-9991(88)90177-5\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SteadyStateCallback","page":"Trixi.jl","title":"Trixi.SteadyStateCallback","text":"SteadyStateCallback(; abstol=1.0e-8, reltol=1.0e-6)\n\nTerminates the integration when the residual_steady_state(du, equations) falls below the threshold specified by abstol, reltol.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.StepsizeCallback","page":"Trixi.jl","title":"Trixi.StepsizeCallback","text":"StepsizeCallback(; cfl=1.0)\n\nSet the time step size according to a CFL condition with CFL number cfl if the time integration method isn't adaptive itself.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.StructuredMesh","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nA structured curved mesh.\n\nDifferent numbers of cells per dimension are possible and arbitrary functions can be used as domain faces.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.StructuredMesh-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max; periodicity=true)\n\nCreate a StructuredMesh that represents a uncurved structured mesh with a rectangular domain.\n\nArguments\n\ncells_per_dimension::NTuple{NDIMS, Int}: the number of cells in each dimension.\ncoordinates_min::NTuple{NDIMS, RealT}: coordinate of the corner in the negative direction of each dimension.\ncoordinates_max::NTuple{NDIMS, RealT}: coordinate of the corner in the positive direction of each dimension.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.StructuredMesh-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh(cells_per_dimension, mapping; RealT=Float64, unsaved_changes=true, mapping_as_string=mapping2string(mapping, length(cells_per_dimension)))\n\nCreate a StructuredMesh of the given size and shape that uses RealT as coordinate type.\n\nArguments\n\ncells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.\nmapping: a function of NDIMS variables to describe the mapping, which transforms the reference mesh to the physical domain. If no mapping_as_string is defined, this function must be defined with the name mapping to allow for restarts. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.\nRealT::Type: the type that should be used for coordinates.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\nmapping_as_string::String: the code that defines the mapping. If CodeTracking can't find the function definition, it can be passed directly here. The code string must define the mapping function with the name mapping. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.StructuredMesh-Tuple{Any, Tuple}","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh(cells_per_dimension, faces; RealT=Float64, unsaved_changes=true, faces_as_string=faces2string(faces))\n\nCreate a StructuredMesh of the given size and shape that uses RealT as coordinate type.\n\nArguments\n\ncells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.\nfaces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D).\nRealT::Type: the type that should be used for coordinates.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SubcellLimiterIDP","page":"Trixi.jl","title":"Trixi.SubcellLimiterIDP","text":"SubcellLimiterIDP(equations::AbstractEquations, basis;\n local_minmax_variables_cons = String[],\n positivity_variables_cons = String[],\n positivity_correction_factor = 0.1)\n\nSubcell invariant domain preserving (IDP) limiting used with VolumeIntegralSubcellLimiting including:\n\nLocal maximum/minimum Zalesak-type limiting for conservative variables (local_minmax_variables_cons)\nPositivity limiting for conservative variables (positivity_variables_cons)\n\nConservative variables to be limited are passed as a vector of strings, e.g. local_minmax_variables_cons = [\"rho\"] and positivity_variables_cons = [\"rho\"].\n\nThe bounds are calculated using the low-order FV solution. The positivity limiter uses positivity_correction_factor such that u^new >= positivity_correction_factor * u^FV.\n\nnote: Note\nThis limiter and the correction callback SubcellLimiterIDPCorrection only work together. Without the callback, no correction takes place, leading to a standard low-order FV scheme.\n\nReferences\n\nRueda-Ramírez, Pazner, Gassner (2022) Subcell Limiting Strategies for Discontinuous Galerkin Spectral Element Methods DOI: 10.1016/j.compfluid.2022.105627\nPazner (2020) Sparse invariant domain preserving discontinuous Galerkin methods with subcell convex limiting DOI: 10.1016/j.cma.2021.113876\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SubcellLimiterIDPCorrection","page":"Trixi.jl","title":"Trixi.SubcellLimiterIDPCorrection","text":"SubcellLimiterIDPCorrection()\n\nPerform antidiffusive correction stage for the a posteriori IDP limiter SubcellLimiterIDP called with VolumeIntegralSubcellLimiting.\n\nnote: Note\nThis callback and the actual limiter SubcellLimiterIDP only work together. This is not a replacement but a necessary addition.\n\nReferences\n\nRueda-Ramírez, Pazner, Gassner (2022) Subcell Limiting Strategies for Discontinuous Galerkin Spectral Element Methods DOI: 10.1016/j.compfluid.2022.105627\nPazner (2020) Sparse invariant domain preserving discontinuous Galerkin methods with subcell convex limiting DOI: 10.1016/j.cma.2021.113876\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SurfaceIntegralStrongForm","page":"Trixi.jl","title":"Trixi.SurfaceIntegralStrongForm","text":"SurfaceIntegralStrongForm(surface_flux=flux_central)\n\nThe classical strong form surface integral type for FD/DG methods.\n\nSee also VolumeIntegralStrongForm.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SurfaceIntegralUpwind","page":"Trixi.jl","title":"Trixi.SurfaceIntegralUpwind","text":"SurfaceIntegralUpwind(splitting)\n\nCouple elements with upwind simultaneous approximation terms (SATs) that use a particular flux splitting, e.g., splitting_steger_warming.\n\nSee also VolumeIntegralUpwind.\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SurfaceIntegralWeakForm","page":"Trixi.jl","title":"Trixi.SurfaceIntegralWeakForm","text":"SurfaceIntegralWeakForm(surface_flux=flux_central)\n\nThe classical weak form surface integral type for DG methods as explained in standard textbooks.\n\nSee also VolumeIntegralWeakForm.\n\nReferences\n\nKopriva (2009) Implementing Spectral Methods for Partial Differential Equations: Algorithms for Scientists and Engineers doi: 10.1007/978-90-481-2261-5\nHesthaven, Warburton (2007) Nodal Discontinuous Galerkin Methods: Algorithms, Analysis, and Applications doi: 10.1007/978-0-387-72067-8\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.T8codeMesh","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nAn unstructured curved mesh based on trees that uses the C library 't8code' to manage trees and mesh refinement.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.T8codeMesh-Tuple{Any}","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh(trees_per_dimension; polydeg, mapping=identity,\n RealT=Float64, initial_refinement_level=0, periodicity=true)\n\nCreate a structured potentially curved 'T8codeMesh' of the specified size.\n\nNon-periodic boundaries will be called ':xneg', ':xpos', ':yneg', ':ypos', ':zneg', ':zpos'.\n\nArguments\n\n'treesperdimension::NTupleE{NDIMS, Int}': the number of trees in each dimension.\n'polydeg::Integer': polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.\n'mapping': a function of 'NDIMS' variables to describe the mapping that transforms the reference mesh ('[-1, 1]^n') to the physical domain.\n'RealT::Type': the type that should be used for coordinates.\n'initialrefinementlevel::Integer': refine the mesh uniformly to this level before the simulation starts.\n'periodicity': either a 'Bool' deciding if all of the boundaries are periodic or an 'NTuple{NDIMS, Bool}' deciding for each dimension if the boundaries in this dimension are periodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.T8codeMesh-Union{Tuple{Ptr{P4est.LibP4est.p4est_connectivity}}, Tuple{NDIMS}} where NDIMS","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh{NDIMS}(conn::Ptr{p4est_connectivity},\n mapping=nothing, polydeg=1, RealT=Float64,\n initial_refinement_level=0)\n\nMain mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a p4est_connectivity data structure.\n\nArguments\n\nconn::Ptr{p4est_connectivity}: Pointer to a P4est connectivity object.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.T8codeMesh-Union{Tuple{Ptr{T8code.Libt8.t8_cmesh}}, Tuple{NDIMS}} where NDIMS","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh{NDIMS}(cmesh::Ptr{t8_cmesh},\n mapping=nothing, polydeg=1, RealT=Float64,\n initial_refinement_level=0)\n\nMain mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a t8_cmesh data structure.\n\nArguments\n\ncmesh::Ptr{t8_cmesh}: Pointer to a cmesh object.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.T8codeMesh-Union{Tuple{String}, Tuple{NDIMS}} where NDIMS","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh{NDIMS}(meshfile::String;\n mapping=nothing, polydeg=1, RealT=Float64,\n initial_refinement_level=0)\n\nMain mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a Gmsh mesh file (.msh).\n\nArguments\n\nmeshfile::String: path to a Gmsh mesh file.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.TimeSeriesCallback","page":"Trixi.jl","title":"Trixi.TimeSeriesCallback","text":"TimeSeriesCallback(semi, point_coordinates;\n interval=1, solution_variables=cons2cons,\n output_directory=\"out\", filename=\"time_series.h5\",\n RealT=real(solver), uEltype=eltype(cache.elements))\n\nCreate a callback that records point-wise data at points given in point_coordinates every interval time steps. The point coordinates are to be specified either as a vector of coordinate tuples or as a two-dimensional array where the first dimension is the point number and the second dimension is the coordinate dimension. By default, the conservative variables are recorded, but this can be controlled by passing a different conversion function to solution_variables.\n\nAfter the last time step, the results are stored in an HDF5 file filename in directory output_directory.\n\nThe real data type RealT and data type for solution variables uEltype default to the respective types used in the solver and the cache.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.TreeMesh","page":"Trixi.jl","title":"Trixi.TreeMesh","text":"TreeMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nA Cartesian mesh based on trees of hypercubes to support adaptive mesh refinement.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.UnstructuredMesh2D","page":"Trixi.jl","title":"Trixi.UnstructuredMesh2D","text":"UnstructuredMesh2D <: AbstractMesh{2}\n\nAn unstructured (possibly curved) quadrilateral mesh.\n\nUnstructuredMesh2D(filename; RealT=Float64, periodicity=false)\n\nAll mesh information, neighbour coupling, and boundary curve information is read in from a mesh file filename.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.UnstructuredSortedBoundaryTypes","page":"Trixi.jl","title":"Trixi.UnstructuredSortedBoundaryTypes","text":"UnstructuredSortedBoundaryTypes\n\nGeneral container to sort the boundary conditions by type for some unstructured meshes/solvers. It stores a set of global indices for each boundary condition type to expedite computation during the call to calc_boundary_flux!. The original dictionary form of the boundary conditions set by the user in the elixir file is also stored for printing.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ViscousFormulationBassiRebay1","page":"Trixi.jl","title":"Trixi.ViscousFormulationBassiRebay1","text":"ViscousFormulationBassiRebay1()\n\nThe classical BR1 flux from\n\nF. Bassi, S. Rebay (1997) A High-Order Accurate Discontinuous Finite Element Method for the Numerical Solution of the Compressible Navier-Stokes Equations DOI: 10.1006/jcph.1996.5572\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ViscousFormulationLocalDG","page":"Trixi.jl","title":"Trixi.ViscousFormulationLocalDG","text":"ViscousFormulationLocalDG(penalty_parameter)\n\nThe local DG (LDG) flux from \"The Local Discontinuous Galerkin Method for Time-Dependent Convection-Diffusion Systems\" by Cockburn and Shu (1998).\n\nNote that, since this implementation does not involve the parabolic \"upwinding\" vector, the LDG solver is equivalent to ViscousFormulationBassiRebay1 with an LDG-type penalization.\n\nCockburn and Shu (1998). The Local Discontinuous Galerkin Method for Time-Dependent Convection-Diffusion Systems DOI: 10.1137/S0036142997316712\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VisualizationCallback-Tuple{}","page":"Trixi.jl","title":"Trixi.VisualizationCallback","text":"VisualizationCallback(; interval=0,\n solution_variables=cons2prim,\n variable_names=[],\n show_mesh=false,\n plot_data_creator=PlotData2D,\n plot_creator=show_plot,\n plot_arguments...)\n\nCreate a callback that visualizes results during a simulation, also known as in-situ visualization.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in any future releases.\n\nThe interval specifies the number of time step iterations after which a new plot is generated. The available variables to plot are configured with the solution_variables parameter, which acts the same way as for the SaveSolutionCallback. The variables to be actually plotted can be selected by providing a single string or a list of strings to variable_names, and if show_mesh is true, an additional plot with the mesh will be generated.\n\nTo customize the generated figure, plot_data_creator allows to use different plot data types. With plot_creator you can further specify an own function to visualize results, which must support the same interface as the default implementation show_plot. All remaining keyword arguments are collected and passed as additional arguments to the plotting command.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.VolumeIntegralFluxDifferencing","page":"Trixi.jl","title":"Trixi.VolumeIntegralFluxDifferencing","text":"VolumeIntegralFluxDifferencing(volume_flux)\n\nVolume integral type for DG methods based on SBP operators and flux differencing using a symmetric two-point volume_flux. This volume_flux needs to satisfy the interface of numerical fluxes in Trixi.jl.\n\nReferences\n\nLeFloch, Mercier, Rohde (2002) Fully Discrete, Entropy Conservative Schemes of Arbitrary Order doi: 10.1137/S003614290240069X\nFisher, Carpenter (2013) High-order entropy stable finite difference schemes for nonlinear conservation laws: Finite domains doi: 10.1016/j.jcp.2013.06.014\nHendrik Ranocha (2017) Comparison of Some Entropy Conservative Numerical Fluxes for the Euler Equations arXiv: 1701.02264 doi: 10.1007/s10915-017-0618-1\nChen, Shu (2017) Entropy stable high order discontinuous Galerkin methods with suitable quadrature rules for hyperbolic conservation laws doi: 10.1016/j.jcp.2017.05.025\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralPureLGLFiniteVolume","page":"Trixi.jl","title":"Trixi.VolumeIntegralPureLGLFiniteVolume","text":"VolumeIntegralPureLGLFiniteVolume(volume_flux_fv)\n\nA volume integral that only uses the subcell finite volume schemes of the VolumeIntegralShockCapturingHG.\n\nThis gives a formally O(1)-accurate finite volume scheme on an LGL-type subcell mesh (LGL = Legendre-Gauss-Lobatto).\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nHennemann, Gassner (2020) \"A provably entropy stable subcell shock capturing approach for high order split form DG\" arXiv: 2008.12044\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralShockCapturingHG","page":"Trixi.jl","title":"Trixi.VolumeIntegralShockCapturingHG","text":"VolumeIntegralShockCapturingHG(indicator; volume_flux_dg=flux_central,\n volume_flux_fv=flux_lax_friedrichs)\n\nShock-capturing volume integral type for DG methods using a convex blending of the finite volume method with numerical flux volume_flux_fv and the VolumeIntegralFluxDifferencing with volume flux volume_flux_dg. The amount of blending is determined by the indicator, e.g., IndicatorHennemannGassner.\n\nReferences\n\nHennemann, Gassner (2020) \"A provably entropy stable subcell shock capturing approach for high order split form DG\" arXiv: 2008.12044\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralStrongForm","page":"Trixi.jl","title":"Trixi.VolumeIntegralStrongForm","text":"VolumeIntegralStrongForm()\n\nThe classical strong form volume integral type for FD/DG methods.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralSubcellLimiting","page":"Trixi.jl","title":"Trixi.VolumeIntegralSubcellLimiting","text":"VolumeIntegralSubcellLimiting(limiter;\n volume_flux_dg, volume_flux_fv)\n\nA subcell limiting volume integral type for DG methods based on subcell blending approaches with a low-order FV method. Used with limiter SubcellLimiterIDP.\n\nnote: Note\nSubcell limiting methods are not fully functional on non-conforming meshes. This is mainly because the implementation assumes that low- and high-order schemes have the same surface terms, which is not guaranteed for non-conforming meshes. The low-order scheme with a high-order mortar is not invariant domain preserving.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralUpwind","page":"Trixi.jl","title":"Trixi.VolumeIntegralUpwind","text":"VolumeIntegralUpwind(splitting)\n\nSpecialized volume integral for finite difference summation-by-parts (FDSBP) solvers. Can be used together with the upwind SBP operators of Mattsson (2017) implemented in SummationByPartsOperators.jl. The splitting controls the discretization.\n\nSee also splitting_steger_warming, splitting_lax_friedrichs, splitting_vanleer_haenel.\n\nReferences\n\nMattsson (2017) Diagonal-norm upwind SBP operators doi: 10.1016/j.jcp.2017.01.042\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralWeakForm","page":"Trixi.jl","title":"Trixi.VolumeIntegralWeakForm","text":"VolumeIntegralWeakForm()\n\nThe classical weak form volume integral type for DG methods as explained in standard textbooks.\n\nReferences\n\nKopriva (2009) Implementing Spectral Methods for Partial Differential Equations: Algorithms for Scientists and Engineers doi: 10.1007/978-90-481-2261-5\nHesthaven, Warburton (2007) Nodal Discontinuous Galerkin Methods: Algorithms, Analysis, and Applications doi: 10.1007/978-0-387-72067-8\n\nVolumeIntegralWeakForm() is only implemented for conserved terms as non-conservative terms should always be discretized in conjunction with a flux-splitting scheme, see VolumeIntegralFluxDifferencing. This treatment is required to achieve, e.g., entropy-stability or well-balancedness.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Base.getindex-Tuple{Trixi.AbstractPlotData, Any}","page":"Trixi.jl","title":"Base.getindex","text":"Base.getindex(pd::AbstractPlotData, variable_name)\n\nExtract a single variable variable_name from pd for plotting with Plots.plot.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Base.resize!-Tuple{Trixi.AbstractContainer, Any}","page":"Trixi.jl","title":"Base.resize!","text":"resize!(c::AbstractContainer, new_length) -> AbstractContainer\n\nResize c to contain new_length elements. If new_length is smaller than the current container length, the first new_length elements will be retained. If new_length is larger, the new elements are invalidated.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.compute_coefficients!-Tuple{Any, Any, Any, Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"PolynomialBases.compute_coefficients!","text":"compute_coefficients!(u_ode, func, t, semi::AbstractSemidiscretization)\n\nSame as compute_coefficients but stores the result in u_ode.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.compute_coefficients-Tuple{Any, Any, Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"PolynomialBases.compute_coefficients","text":"compute_coefficients(func, t, semi::AbstractSemidiscretization)\n\nCompute the discrete coefficients of the continuous function func at time t associated with the semidiscretization semi. For example, the discrete coefficients of func for a discontinuous Galerkin spectral element method (DGSEM) are the values of func at the Lobatto-Legendre nodes. Similarly, a classical finite difference method will use the values of func at the nodes of the grid assoociated with the semidiscretization semi.\n\nFor semidiscretizations semi associated with an initial condition, func can be omitted to use the given initial condition at time t.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.integrate-Tuple{Any, Any, LobattoLegendreBasis}","page":"Trixi.jl","title":"PolynomialBases.integrate","text":"integrate(f, u, basis::LobattoLegendreBasis)\n\nMap the function f to the coefficients u and integrate with respect to the quadrature rule given by basis.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.integrate-Union{Tuple{Func}, Tuple{Func, Any, Trixi.AbstractSemidiscretization}} where Func","page":"Trixi.jl","title":"PolynomialBases.integrate","text":"integrate([func=(u_node,equations)->u_node,] u_ode, semi::AbstractSemidiscretization; normalize=true)\n\nCall func(u_node, equations) for each vector of nodal variables u_node in u_ode and integrate the result using a quadrature associated with the semidiscretization semi.\n\nIf normalize is true, the result is divided by the total volume of the computational domain.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SciMLBase.add_tstop!-Tuple{Trixi.SimpleIntegratorSSP, Any}","page":"Trixi.jl","title":"SciMLBase.add_tstop!","text":"add_tstop!(integrator::SimpleIntegratorSSP, t)\n\nAdd a time stop during the time integration process. This function is called after the periodic SaveSolutionCallback to specify the next stop to save the solution.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SummationByPartsOperators.semidiscretize-Tuple{SemidiscretizationHyperbolicParabolic, Any}","page":"Trixi.jl","title":"SummationByPartsOperators.semidiscretize","text":"semidiscretize(semi::SemidiscretizationHyperbolicParabolic, tspan)\n\nWrap the semidiscretization semi as a split ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The parabolic right-hand side is the first function of the split ODE problem and will be used by default by the implicit part of IMEX methods from the SciML ecosystem.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SummationByPartsOperators.semidiscretize-Tuple{Trixi.AbstractSemidiscretization, Any, AbstractString}","page":"Trixi.jl","title":"SummationByPartsOperators.semidiscretize","text":"semidiscretize(semi::AbstractSemidiscretization, tspan, restart_file::AbstractString)\n\nWrap the semidiscretization semi as an ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The initial condition etc. is taken from the restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SummationByPartsOperators.semidiscretize-Tuple{Trixi.AbstractSemidiscretization, Any}","page":"Trixi.jl","title":"SummationByPartsOperators.semidiscretize","text":"semidiscretize(semi::AbstractSemidiscretization, tspan)\n\nWrap the semidiscretization semi as an ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiBasis-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.DGMultiBasis","text":"DGMultiBasis(element_type, polydeg; approximation_type = Polynomial(), kwargs...)\n\nConstructs a basis for DGMulti solvers. Returns a \"StartUpDG.RefElemData\" object. The kwargs arguments are additional keyword arguments for RefElemData, such as quad_rule_vol. These are the same as the RefElemData_kwargs used in DGMulti. For more info, see the StartUpDG.jl docs.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.LBMCollisionCallback-Tuple{}","page":"Trixi.jl","title":"Trixi.LBMCollisionCallback","text":"LBMCollisionCallback()\n\nApply the Lattice-Boltzmann method (LBM) collision operator before each time step. See LatticeBoltzmannEquations2D for further details.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.P4estMeshCubedSphere-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.P4estMeshCubedSphere","text":"P4estMeshCubedSphere(trees_per_face_dimension, layers, inner_radius, thickness;\n polydeg, RealT=Float64,\n initial_refinement_level=0, unsaved_changes=true,\n p4est_partition_allow_for_coarsening=true)\n\nBuild a \"Cubed Sphere\" mesh as P4estMesh with 6 * trees_per_face_dimension^2 * layers trees.\n\nThe mesh will have two boundaries, :inside and :outside.\n\nArguments\n\ntrees_per_face_dimension::Integer: the number of trees in the first two local dimensions of each face.\nlayers::Integer: the number of trees in the third local dimension of each face, i.e., the number of layers of the sphere.\ninner_radius::Integer: the inner radius of the sphere.\nthickness::Integer: the thickness of the sphere. The outer radius will be inner_radius + thickness.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\np4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData2D-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.PlotData2D","text":"PlotData2D(u, semi [or mesh, equations, solver, cache];\n solution_variables=nothing,\n grid_lines=true, max_supported_level=11, nvisnodes=nothing,\n slice=:xy, point=(0.0, 0.0, 0.0))\n\nCreate a new PlotData2D object that can be used for visualizing 2D/3D DGSEM solution data array u with Plots.jl. All relevant geometrical information is extracted from the semidiscretization semi. By default, the primitive variables (if existent) or the conservative variables (otherwise) from the solution are used for plotting. This can be changed by passing an appropriate conversion function to solution_variables.\n\nIf grid_lines is true, also extract grid vertices for visualizing the mesh. The output resolution is indirectly set via max_supported_level: all data is interpolated to 2^max_supported_level uniformly distributed points in each spatial direction, also setting the maximum allowed refinement level in the solution. nvisnodes specifies the number of visualization nodes to be used. If it is nothing, twice the number of solution DG nodes are used for visualization, and if set to 0, exactly the number of nodes in the DG elements are used.\n\nWhen visualizing data from a three-dimensional simulation, a 2D slice is extracted for plotting. slice specifies the plane that is being sliced and may be :xy, :xz, or :yz. The slice position is specified by a point that lies on it, which defaults to (0.0, 0.0, 0.0). Both of these values are ignored when visualizing 2D data.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nExamples\n\njulia> using Trixi, Plots\n\njulia> trixi_include(default_example())\n[...]\n\njulia> pd = PlotData2D(sol)\nPlotData2D(...)\n\njulia> plot(pd) # To plot all available variables\n\njulia> plot(pd[\"scalar\"]) # To plot only a single variable\n\njulia> plot!(getmesh(pd)) # To add grid lines to the plot\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData2D-Tuple{Union{ODESolution{T, N, uType, uType2, DType, tType, rateType, P} where {T, N, uType, uType2, DType, tType, rateType, P<:(ODEProblem{uType_, tType_, isinplace, P_} where {uType_, tType_, isinplace, P_<:Trixi.AbstractSemidiscretization})}, Trixi.TimeIntegratorSolution}}","page":"Trixi.jl","title":"Trixi.PlotData2D","text":"PlotData2D(sol; kwargs...)\n\nCreate a PlotData2D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ScalarPlotData2D-Tuple{Any, Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.ScalarPlotData2D","text":"ScalarPlotData2D(u, semi::AbstractSemidiscretization; kwargs...)\n\nReturns an PlotData2DTriangulated object which is used to visualize a single scalar field. u should be an array whose entries correspond to values of the scalar field at nodal points.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SummaryCallback","page":"Trixi.jl","title":"Trixi.SummaryCallback","text":"SummaryCallback()\n\nCreate and return a callback that prints a human-readable summary of the simulation setup at the beginning of a simulation and then resets the timer. When the returned callback is executed directly, the current timer values are shown.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.TrivialCallback-Tuple{}","page":"Trixi.jl","title":"Trixi.TrivialCallback","text":"TrivialCallback()\n\nA callback that does nothing. This can be useful to disable some callbacks easily via trixi_include.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.adapt_to_mesh_level!-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.adapt_to_mesh_level!","text":"adapt_to_mesh_level!(u_ode, semi, level)\nadapt_to_mesh_level!(sol::Trixi.TrixiODESolution, level)\n\nLike adapt_to_mesh_level, but modifies the solution and parts of the semidiscretization (mesh and caches) in place.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.adapt_to_mesh_level-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.adapt_to_mesh_level","text":"adapt_to_mesh_level(u_ode, semi, level)\nadapt_to_mesh_level(sol::Trixi.TrixiODESolution, level)\n\nUse the regular adaptive mesh refinement routines to adaptively refine/coarsen the solution u_ode with semidiscretization semi towards a uniformly refined grid with refinement level level. The solution and semidiscretization are copied such that the original objects remain unaltered.\n\nA convenience method accepts an ODE solution object, from which solution and semidiscretization are extracted as needed.\n\nSee also: adapt_to_mesh_level!\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_x-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_x","text":"boundary_condition_linear_x(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation1D)\n\nBoundary conditions for initial_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_x-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_x","text":"boundary_condition_linear_x(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation2D)\n\nBoundary conditions for initial_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_x_y-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_x_y","text":"boundary_condition_linear_x_y(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation2D)\n\nBoundary conditions for initial_condition_linear_x_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_y-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_y","text":"boundary_condition_linear_y(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation2D)\n\nBoundary conditions for initial_condition_linear_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_z-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_z","text":"boundary_condition_linear_z(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation1D)\n\nBoundary conditions for boundary_condition_linear_z.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_noslip_wall-Tuple{Any, Any, Any, Any, Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_noslip_wall","text":"boundary_condition_noslip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equations::LatticeBoltzmannEquations2D)\n\nNo-slip wall boundary condition using the bounce-back approach.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_poisson_nonperiodic-Tuple{Any, Any, Any, Any, Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_poisson_nonperiodic","text":"boundary_condition_poisson_nonperiodic(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equations::HyperbolicDiffusionEquations1D)\n\nBoundary conditions used for convergence tests in combination with initial_condition_poisson_nonperiodic and source_terms_poisson_nonperiodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::AcousticPerturbationEquations2D)\n\nUse an orthogonal projection of the perturbed velocities to zero out the normal velocity while retaining the possibility of a tangential velocity in the boundary state. Further details are available in the paper:\n\nMarcus Bauer, Jürgen Dierke and Roland Ewert (2011) Application of a discontinuous Galerkin method to discretize acoustic perturbation equations DOI: 10.2514/1.J050333\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations2D)\n\nShould be used together with StructuredMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations3D)\n\nShould be used together with StructuredMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::CompressibleEulerEquations2D)\n\nDetermine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:\n\nJ. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF\n\nDetails about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book\n\nEleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761\n\nShould be used together with UnstructuredMesh2D.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::CompressibleEulerEquations3D)\n\nDetermine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:\n\nJ. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF\n\nDetails about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book\n\nEleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::ShallowWaterEquations2D)\n\nCreate a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value. For details see Section 9.2.5 of the book:\n\nEleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::ShallowWaterTwoLayerEquations2D)\n\nCreate a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.\n\nFor details see Section 9.2.5 of the book:\n\nEleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations1D)\n\nDetermine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:\n\nJ. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations2D)\n\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations3D)\n\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation_or_normal, x, t, surface_flux_function,\n equations::ShallowWaterEquations1D)\n\nCreate a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.\n\nFor details see Section 9.2.5 of the book:\n\nEleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::ShallowWaterEquations2D)\n\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation_or_normal, x, t, surface_flux_function,\n equations::ShallowWaterTwoLayerEquations1D)\n\nCreate a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.\n\nFor details see Section 9.2.5 of the book:\n\nEleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_wall-Tuple{Any, Any, Any, Any, Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_wall","text":"boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,\n equations::AcousticPerturbationEquations2D)\n\nBoundary conditions for a solid wall.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_wall-Tuple{Any, Any, Any, Any, Any, Any, LinearizedEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_wall","text":"boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,\n equations::LinearizedEulerEquations2D)\n\nBoundary conditions for a solid wall.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_error_norms-Tuple{Any, Any, Any, Trixi.AbstractSemidiscretization, Any}","page":"Trixi.jl","title":"Trixi.calc_error_norms","text":"calc_error_norms([func=(u_node,equations)->u_node,] u_ode, t, analyzer, semi::AbstractSemidiscretization, cache_analysis)\n\nCalculate discrete L2 and L∞ error norms of func applied to each nodal variable u_node in u_ode. If no exact solution is available, \"errors\" are calculated using some reference state and can be useful for regression tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_fast_wavespeed_roe-Tuple{Any, Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.calc_fast_wavespeed_roe","text":"calc_fast_wavespeed_roe(u_ll, u_rr, direction, equations::IdealGlmMhdEquations1D)\n\nCompute the fast magnetoacoustic wave speed using Roe averages as given by\n\nCargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_fast_wavespeed_roe-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.calc_fast_wavespeed_roe","text":"calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations2D)\n\nCompute the fast magnetoacoustic wave speed using Roe averages as given by\n\nCargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_fast_wavespeed_roe-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.calc_fast_wavespeed_roe","text":"calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations3D)\n\nCompute the fast magnetoacoustic wave speed using Roe averages as given by\n\nCargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_wavespeed_roe-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.calc_wavespeed_roe","text":"calc_wavespeed_roe(u_ll, u_rr, direction::Integer,\n equations::ShallowWaterEquations1D)\n\nCalculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} See for instance equation (62) in \n\nPaul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044\n\nOr equation (9.17) in this lecture notes.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_wavespeed_roe-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.calc_wavespeed_roe","text":"calc_wavespeed_roe(u_ll, u_rr, direction::Integer,\n equations::ShallowWaterEquations2D)\n\nCalculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} depending on direction. See for instance equation (62) in \n\nPaul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044\n\nOr this slides, slides 8 and 9.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.collision_bgk-Tuple{Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.collision_bgk","text":"collision_bgk(u, dt, equations::LatticeBoltzmannEquations2D)\n\nCollision operator for the Bhatnagar, Gross, and Krook (BGK) model.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.collision_bgk-Tuple{Any, Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.collision_bgk","text":"collision_bgk(u, dt, equations::LatticeBoltzmannEquations3D)\n\nCollision operator for the Bhatnagar, Gross, and Krook (BGK) model.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.cons2cons-Tuple{Any, Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.cons2cons","text":"cons2cons(u, equations)\n\nReturn the conserved variables u. While this function is as trivial as identity, it is also as useful.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.cons2entropy","page":"Trixi.jl","title":"Trixi.cons2entropy","text":"cons2entropy(u, equations)\n\nConvert the conserved variables u to the entropy variables for a given set of equations with chosen standard entropy.\n\nu is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by entropy2cons.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.cons2prim","page":"Trixi.jl","title":"Trixi.cons2prim","text":"cons2prim(u, equations)\n\nConvert the conserved variables u to the primitive variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by prim2cons.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.convergence_test-Tuple{Module, AbstractString, Any}","page":"Trixi.jl","title":"Trixi.convergence_test","text":"convergence_test([mod::Module=Main,] elixir::AbstractString, iterations; kwargs...)\n\nRun iterations Trixi.jl simulations using the setup given in elixir and compute the experimental order of convergence (EOC) in the L^2 and L^infty norm. In each iteration, the resolution of the respective mesh will be doubled. Additional keyword arguments kwargs... and the optional module mod are passed directly to trixi_include.\n\nThis function assumes that the spatial resolution is set via the keywords initial_refinement_level (an integer) or cells_per_dimension (a tuple of integers, one per spatial dimension).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_analysis_errors-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.default_analysis_errors","text":"default_analysis_errors(equations)\n\nDefault analysis errors (:l2_error and :linf_error) used by the AnalysisCallback.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_analysis_integrals-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.default_analysis_integrals","text":"default_analysis_integrals(equations)\n\nDefault analysis integrals used by the AnalysisCallback.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_example-Tuple{}","page":"Trixi.jl","title":"Trixi.default_example","text":"default_example()\n\nReturn the path to an example elixir that can be used to quickly see Trixi.jl in action on a TreeMesh. See also examples_dir and get_examples.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_example_unstructured-Tuple{}","page":"Trixi.jl","title":"Trixi.default_example_unstructured","text":"default_example_unstructured()\n\nReturn the path to an example elixir that can be used to quickly see Trixi.jl in action on an UnstructuredMesh2D. This simulation is run on the example curved, unstructured mesh given in the Trixi.jl documentation regarding unstructured meshes.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.density-Tuple{Real, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.density","text":"density(p::Real, equations::LatticeBoltzmannEquations2D)\ndensity(u, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic density from the pressure p or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.density-Tuple{Real, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.density","text":"density(p::Real, equations::LatticeBoltzmannEquations3D)\ndensity(u, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic density from the pressure p or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_dof_global-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_dof_global","text":"each_dof_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the degrees of freedom (DOF) in dg. In particular, not the DOFs themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_face_node-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_face_node","text":"each_face_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the face nodes in dg. In particular, not the face_nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_face_node_global-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_face_node_global","text":"each_face_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the face nodes in mesh. In particular, not the face nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_quad_node-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_quad_node","text":"each_quad_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the quadrature nodes in dg. In particular, not the quadrature nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_quad_node_global-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_quad_node_global","text":"each_quad_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the global quadrature nodes in mesh. In particular, not the quadrature nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachboundary-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachboundary","text":"eachboundary(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the boundaries in cache. In particular, not the boundaries themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachcomponent-Tuple{Trixi.AbstractCompressibleEulerMulticomponentEquations}","page":"Trixi.jl","title":"Trixi.eachcomponent","text":"eachcomponent(equations::AbstractCompressibleEulerMulticomponentEquations)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the components in AbstractCompressibleEulerMulticomponentEquations. In particular, not the components themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachcomponent-Tuple{Trixi.AbstractIdealGlmMhdMulticomponentEquations}","page":"Trixi.jl","title":"Trixi.eachcomponent","text":"eachcomponent(equations::AbstractIdealGlmMhdMulticomponentEquations)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the components in AbstractIdealGlmMhdMulticomponentEquations. In particular, not the components themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachdim-Tuple{Any}","page":"Trixi.jl","title":"Trixi.eachdim","text":"eachdim(mesh)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the dimensions in AbstractTree. In particular, not the dimensions themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachdirection-Tuple{Trixi.AbstractTree}","page":"Trixi.jl","title":"Trixi.eachdirection","text":"eachdirection(tree::AbstractTree)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the directions in AbstractTree. In particular, not the directions themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in cache. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in mesh. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.ElementContainer1D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::ElementContainer1D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.ElementContainer2D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::ElementContainer2D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.ElementContainer3D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::ElementContainer3D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.UnstructuredElementContainer2D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::UnstructuredElementContainer2D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachinterface-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachinterface","text":"eachinterface(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the interfaces in cache. In particular, not the interfaces themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachmortar-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachmortar","text":"eachmortar(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the mortars in cache. In particular, not the mortars themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachmpiinterface-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachmpiinterface","text":"eachmpiinterface(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the MPI interfaces in cache. In particular, not the interfaces themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachmpimortar-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachmpimortar","text":"eachmpimortar(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the MPI mortars in cache. In particular, not the mortars themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachnode-Tuple{DG}","page":"Trixi.jl","title":"Trixi.eachnode","text":"eachnode(dg::DG)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the nodes in dg. In particular, not the nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachnode-Tuple{LobattoLegendreBasis}","page":"Trixi.jl","title":"Trixi.eachnode","text":"eachnode(basis::LobattoLegendreBasis)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the nodes in basis. In particular, not the nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachnode-Tuple{Trixi.LobattoLegendreAnalyzer}","page":"Trixi.jl","title":"Trixi.eachnode","text":"eachnode(analyzer::LobattoLegendreAnalyzer)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the nodes in analyzer. In particular, not the nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachvariable-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.eachvariable","text":"eachvariable(equations::AbstractEquations)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the variables in equations. In particular, not the variables themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.energy_internal","page":"Trixi.jl","title":"Trixi.energy_internal","text":"energy_internal(u, equations)\n\nReturn the internal energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.energy_kinetic","page":"Trixi.jl","title":"Trixi.energy_kinetic","text":"energy_kinetic(u, equations)\n\nReturn the kinetic energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.energy_total","page":"Trixi.jl","title":"Trixi.energy_total","text":"energy_total(u, equations)\n\nReturn the total energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.entropy","page":"Trixi.jl","title":"Trixi.entropy","text":"entropy(u, equations)\n\nReturn the chosen entropy of the conserved variables u for a given set of equations.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.entropy2cons","page":"Trixi.jl","title":"Trixi.entropy2cons","text":"entropy2cons(w, equations)\n\nConvert the entropy variables w based on a standard entropy to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2entropy.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.equilibrium_distribution-Tuple{Any, Any, Any, Any, Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.equilibrium_distribution","text":"equilibrium_distribution(alpha, rho, v1, v2, v3, equations::LatticeBoltzmannEquations3D)\n\nCalculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2, v3.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.equilibrium_distribution-Tuple{Any, Any, Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.equilibrium_distribution","text":"equilibrium_distribution(alpha, rho, v1, v2, equations::LatticeBoltzmannEquations2D)\n\nCalculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.examples_dir-Tuple{}","page":"Trixi.jl","title":"Trixi.examples_dir","text":"examples_dir()\n\nReturn the directory where the example files provided with Trixi.jl are located. If Trixi.jl is installed as a regular package (with ]add Trixi), these files are read-only and should not be modified. To find out which files are available, use, e.g., readdir:\n\nExamples\n\nreaddir(examples_dir())\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux","page":"Trixi.jl","title":"Trixi.flux","text":"flux(u, orientation_or_normal, equations)\n\nGiven the conservative variables u, calculate the (physical) flux in Cartesian direction orientation::Integer or in arbitrary direction normal::AbstractVector for the corresponding set of governing equations. orientation is 1, 2, and 3 for the x-, y-, and z-directions, respectively.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.flux-Tuple{Any, AbstractVector, Trixi.AbstractEquations{1}}","page":"Trixi.jl","title":"Trixi.flux","text":"flux(u, normal_direction::AbstractVector, equations::AbstractEquations{1})\n\nEnables calling flux with a non-integer argument normal_direction for one-dimensional equations. Returns the value of flux(u, 1, equations) scaled by normal_direction[1].\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_central-Tuple{Any, Any, Any, Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.flux_central","text":"flux_central(u_ll, u_rr, orientation_or_normal_direction, equations::AbstractEquations)\n\nThe classical central numerical flux f((u_ll) + f(u_rr)) / 2. When this flux is used as volume flux, the discretization is equivalent to the classical weak form DG method (except floating point errors).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chan_etal-Tuple{Any, Any, Integer, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_chan_etal","text":"@inline function fluxchanetal(ull, urr, orientation::Integer, equations::CompressibleEulerEquationsQuasi1D)\n\nConservative (symmetric) part of the entropy conservative flux for quasi 1D compressible Euler equations split form. This flux is a generalization of flux_ranocha for CompressibleEulerEquations1D. Further details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089 \n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chan_etal-Tuple{Any, Any, Integer, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_chan_etal","text":"flux_chan_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterEquationsQuasi1D)\n\nTotal energy conservative (mathematical entropy for quasi 1D shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., FluxPlusDissipation(flux_chan_etal, DissipationLocalLaxFriedrichs()).\n\nFurther details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nEntropy conserving two-point flux by\n\nChandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)\n\nEntropy conserving two-point flux by\n\nChandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)\n\nEntropy conserving two-point flux by\n\nChandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations1D)\n\nEntropy conserving two-point flux by\n\nAyoub Gouasmi, Karthik Duraisamy (2020) \"Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations\" arXiv:1904.00972v3 [math.NA] 4 Feb 2020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations2D)\n\nAdaption of the entropy conserving two-point flux by\n\nAyoub Gouasmi, Karthik Duraisamy (2020) \"Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations\" arXiv:1904.00972v3 [math.NA] 4 Feb 2020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)\n\nEntropy conserving two-point flux by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations2D)\n\nEntropy conserving two-point flux by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations3D)\n\nEntropy conserving two-point flux by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)\n\nEntropy conserving two-point flux adapted by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdMulticomponentEquations2D)\n\nEntropy conserving two-point flux adapted by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_es_ersing_etal-Tuple{Any, Any, Any, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_es_ersing_etal","text":"flux_es_ersing_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterTwoLayerEquations2D)\n\nEntropy stable surface flux for the two-layer shallow water equations. Uses the entropy conservative flux_wintermeyer_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables. \n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_es_ersing_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_es_ersing_etal","text":"flux_es_ersing_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterTwoLayerEquations1D)\n\nEntropy stable surface flux for the two-layer shallow water equations. Uses the entropy conservative flux_wintermeyer_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables. \n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_fjordholm_etal","text":"flux_fjordholm_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterEquations1D)\n\nTotal energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.\n\nDetails are available in Eq. (4.1) in the paper:\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_fjordholm_etal","text":"flux_fjordholm_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterEquations2D)\n\nTotal energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.\n\nDetails are available in Eq. (4.1) in the paper:\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_godunov-Tuple{Any, Any, Integer, LinearizedEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_godunov","text":"flux_godunov(u_ll, u_rr, orientation_or_normal_direction,\n equations::LinearizedEulerEquations2D)\n\nAn upwind flux for the linearized Euler equations based on diagonalization of the physical flux matrix. Given the physical flux Au, A=T Lambda T^-1 with Lambda being a diagonal matrix that holds the eigenvalues of A, decompose Lambda = Lambda^+ + Lambda^- where Lambda^+ and Lambda^- are diagonal matrices holding the positive and negative eigenvalues of A, respectively. Then for left and right states u_L u_R, the numerical flux calculated by this function is given by A^+ u_L + A^- u_R where A^pm = T Lambda^pm T^-1.\n\nThe diagonalization of the flux matrix can be found in\n\nR. F. Warming, Richard M. Beam and B. J. Hyett (1975) Diagonalization and simultaneous symmetrization of the gas-dynamic matrices DOI: 10.1090/S0025-5718-1975-0388967-5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdEquations1D)\n\nEntropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdEquations2D)\n\nEntropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdEquations3D)\n\nEntropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdMulticomponentEquations1D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdMulticomponentEquations2D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nComputes the HLLC flux (HLL with Contact) for compressible Euler equations developed by E.F. Toro Lecture slides Signal speeds: DOI: 10.1137/S1064827593260140\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations2D)\n\nComputes the HLLC flux (HLL with Contact) for compressible Euler equations developed by E.F. Toro Lecture slides Signal speeds: DOI: 10.1137/S1064827593260140\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations3D)\n\nComputes the HLLC flux (HLL with Contact) for compressible Euler equations developed by E.F. Toro Lecture slides Signal speeds: DOI: 10.1137/S1064827593260140\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)\n\nLi (2005)\n\nAn HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_kennedy_gruber-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_kennedy_gruber","text":"flux_kennedy_gruber(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nKinetic energy preserving two-point flux by\n\nKennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_kennedy_gruber-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_kennedy_gruber","text":"flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations2D)\n\nKinetic energy preserving two-point flux by\n\nKennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_kennedy_gruber-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_kennedy_gruber","text":"flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nKinetic energy preserving two-point flux by\n\nKennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_audusse_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_audusse_etal","text":"flux_nonconservative_audusse_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nNon-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.\n\nThis hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations1D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.\n\nFurther details on the hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_audusse_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_audusse_etal","text":"flux_nonconservative_audusse_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_audusse_etal(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nNon-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.\n\nThis hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations2D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.\n\nFurther details for the hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_chan_etal-Tuple{Any, Any, Integer, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_chan_etal","text":"flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,\n equations::CompressibleEulerEquationsQuasi1D)\nflux_nonconservative_chan_etal(u_ll, u_rr, normal_direction, \n equations::CompressibleEulerEquationsQuasi1D)\nflux_nonconservative_chan_etal(u_ll, u_rr, normal_ll, normal_rr,\n equations::CompressibleEulerEquationsQuasi1D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the pressure CompressibleEulerEquationsQuasi1D and the nozzle width.\n\nFurther details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089 \n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_chan_etal-Tuple{Any, Any, Integer, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_chan_etal","text":"flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquationsQuasi1D)\nflux_nonconservative_chan_etal(u_ll, u_rr, normal_direction::AbstractVector,\n equations::ShallowWaterEquationsQuasi1D) \nflux_nonconservative_chan_etal(u_ll, u_rr, \n normal_ll::AbstractVector, normal_rr::AbstractVector,\n equations::ShallowWaterEquationsQuasi1D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquationsQuasi1D and the channel width.\n\nFurther details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_chen_noelle-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_chen_noelle","text":"flux_nonconservative_chen_noelle(u_ll, u_rr,\n orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nNon-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_chen_noelle on the conservative variables.\n\nShould be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_chen_noelle in the surface flux to ensure consistency.\n\nFurther details on the hydrostatic reconstruction and its motivation can be found in\n\nGuoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_chen_noelle-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_chen_noelle","text":"flux_nonconservative_chen_noelle(u_ll, u_rr,\n orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_chen_noelle(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average ::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nNon-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_chen_noelle on the conservative variables.\n\nShould be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_chen_noelle in the surface flux to ensure consistency.\n\nFurther details on the hydrostatic reconstruction and its motivation can be found in\n\nGuoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_ersing_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_ersing_etal","text":"flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.\n\nThis is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.\n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_ersing_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_ersing_etal","text":"flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_ersing_etal(u_ll, u_rr,\n normal_direction_ll::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nThis is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.\n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_ersing_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_ersing_etal","text":"flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterTwoLayerEquations1D)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterTwoLayerEquations1D and an additional term that couples the momentum of both layers. \n\nThis is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal. \n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_ersing_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_ersing_etal","text":"flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterTwoLayerEquations2D)\nflux_nonconservative_ersing_etal(u_ll, u_rr,\n normal_direction_ll::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterTwoLayerEquations2D)\n\nwarning: Experimental code\n\n\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterTwoLayerEquations2D and an additional term that couples the momentum of both layers. \n\nThis is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.\n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_fjordholm_etal","text":"flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nNon-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations1D.\n\nThis contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.\n\nFurther details for the original finite volume formulation are available in\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\nand for curvilinear 2D case in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_fjordholm_etal","text":"flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_fjordholm_etal(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nNon-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nThis contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.\n\nFurther details for the original finite volume formulation are available in\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\nand for curvilinear 2D case in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell","text":"flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,\n equations::IdealGlmMhdEquations2D)\nflux_nonconservative_powell(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::IdealGlmMhdEquations2D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nReferences\n\nMarvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell","text":"flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,\n equations::IdealGlmMhdEquations3D)\nflux_nonconservative_powell(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::IdealGlmMhdEquations3D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations3D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nReferences\n\nMarvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell","text":"flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,\n equations::IdealGlmMhdMulticomponentEquations2D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdMulticomponentEquations2D.\n\nReferences\n\nMarvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell_local_symmetric-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D, Trixi.NonConservativeSymmetric, Integer}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell_local_symmetric","text":"flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,\n equations::IdealGlmMhdEquations2D,\n nonconservative_type::NonConservativeSymmetric,\n nonconservative_term::Integer)\n\nSymmetric part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered \"fluxes\" for subcell limiting. See, e.g.,\n\nRueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.\n\nThis function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell_local_symmetric-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell_local_symmetric","text":"flux_nonconservative_powell_local_symmetric(u_ll, u_rr,\n orientation::Integer,\n equations::IdealGlmMhdEquations2D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.\n\nThis implementation uses a non-conservative term that can be written as the product of local and symmetric parts. It is equivalent to the non-conservative flux of Bohm et al. (flux_nonconservative_powell) for conforming meshes but it yields different results on non-conforming meshes(!).\n\nThe two other flux functions with the same name return either the local or symmetric portion of the non-conservative flux based on the type of the nonconservativetype argument, employing multiple dispatch. They are used to compute the subcell fluxes in dg2dsubcelllimiters.jl.\n\nReferences\n\nRueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell_local_symmetric-Tuple{Any, Integer, IdealGlmMhdEquations2D, Trixi.NonConservativeLocal, Integer}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell_local_symmetric","text":"flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,\n equations::IdealGlmMhdEquations2D,\n nonconservative_type::NonConservativeLocal,\n nonconservative_term::Integer)\n\nLocal part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered \"fluxes\" for subcell limiting. See, e.g.,\n\nRueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.\n\nThis function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_wintermeyer_etal","text":"flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.\n\nFurther details are available in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_wintermeyer_etal","text":"flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_wintermeyer_etal(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nFurther details are available in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations1D)\n\nEntropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations2D)\n\nEntropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nEntropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerMulticomponentEquations1D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerMulticomponentEquations2D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha_turbo-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.flux_ranocha_turbo","text":"flux_ranocha_turbo(u_ll, u_rr, orientation_or_normal_direction, equations)\n\nEquivalent to flux_ranocha except that it may use specialized methods, e.g., when used with VolumeIntegralFluxDifferencing. These specialized methods may enable better use of SIMD instructions to increase runtime efficiency on modern hardware.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_shima_etal","text":"flux_shima_etal(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nThis flux is is a modification of the original kinetic energy preserving two-point flux by\n\nYuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058\n\nThe modification is in the energy flux to guarantee pressure equilibrium and was developed by\n\nNao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_shima_etal","text":"flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations2D)\n\nThis flux is is a modification of the original kinetic energy preserving two-point flux by\n\nYuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058\n\nThe modification is in the energy flux to guarantee pressure equilibrium and was developed by\n\nNao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_shima_etal","text":"flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nThis flux is is a modification of the original kinetic energy preserving two-point flux by\n\nYuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058\n\nThe modification is in the energy flux to guarantee pressure equilibrium and was developed by\n\nNao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal_turbo-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.flux_shima_etal_turbo","text":"flux_shima_etal_turbo(u_ll, u_rr, orientation_or_normal_direction, equations)\n\nEquivalent to flux_shima_etal except that it may use specialized methods, e.g., when used with VolumeIntegralFluxDifferencing. These specialized methods may enable better use of SIMD instructions to increase runtime efficiency on modern hardware.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_wintermeyer_etal","text":"flux_wintermeyer_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterEquations1D)\n\nTotal energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.\n\nFurther details are available in Theorem 1 of the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_wintermeyer_etal","text":"flux_wintermeyer_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterEquations2D)\n\nTotal energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.\n\nFurther details are available in Theorem 1 of the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_wintermeyer_etal","text":"flux_wintermeyer_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterTwoLayerEquations1D)\n\nTotal energy conservative (mathematical entropy for two-layer shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used with the nonconservative flux_nonconservative_ersing_etal. To obtain the flux for the two-layer shallow water equations the flux that is described in the paper for the normal shallow water equations is used within each layer.\n\nFurther details are available in Theorem 1 of the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_wintermeyer_etal","text":"flux_wintermeyer_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterTwoLayerEquations2D)\nflux_wintermeyer_etal(u_ll, u_rr,\n normal_direction::AbstractVector,\n equations::ShallowWaterTwoLayerEquations2D)\n\nTotal energy conservative (mathematical entropy for two-layer shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used with the nonconservative flux_nonconservative_ersing_etal. To obtain the flux for the two-layer shallow water equations the flux that is described in the paper for the normal shallow water equations is used within each layer.\n\nFurther details are available in Theorem 1 of the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_winters_etal-Tuple{Any, Any, AbstractVector, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_winters_etal","text":"flux_winters_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::PolytropicEulerEquations2D)\n\nEntropy conserving two-point flux for isothermal or polytropic gases. Requires a special weighted Stolarsky mean for the evaluation of the density denoted here as stolarsky_mean. Note, for isothermal gases where gamma = 1 this stolarsky_mean becomes the ln_mean.\n\nFor details see Section 3.2 of the following reference\n\nAndrew R. Winters, Christof Czernik, Moritz B. Schily & Gregor J. Gassner (2020) Entropy stable numerical approximations for the isothermal and polytropic Euler equations DOI: 10.1007/s10543-019-00789-w\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_boundary_outer_state-Tuple{BoundaryConditionDirichlet, Any, Any, Any, Any, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.get_boundary_outer_state","text":"get_boundary_outer_state(boundary_condition::BoundaryConditionDirichlet,\n cache, t, equations, dg, indices...)\n\nFor subcell limiting, the calculation of local bounds for non-periodic domains require the boundary outer state. This function returns the boundary value at time t and for node with spatial indices indices.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_examples-Tuple{}","page":"Trixi.jl","title":"Trixi.get_examples","text":"get_examples()\n\nReturn a list of all example elixirs that are provided by Trixi.jl. See also examples_dir and default_example.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_name-Tuple{Any}","page":"Trixi.jl","title":"Trixi.get_name","text":"get_name(x)\n\nReturns a name of x ready for pretty printing. By default, return string(y) if x isa Val{y} and return string(x) otherwise.\n\nExamples\n\njulia> Trixi.get_name(\"test\")\n\"test\"\n\njulia> Trixi.get_name(Val(:test))\n\"test\"\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_name-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.get_name","text":"get_name(equations::AbstractEquations)\n\nReturns the canonical, human-readable name for the given system of equations.\n\nExamples\n\njulia> Trixi.get_name(CompressibleEulerEquations1D(1.4))\n\"CompressibleEulerEquations1D\"\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.getmesh-Tuple{Trixi.AbstractPlotData}","page":"Trixi.jl","title":"Trixi.getmesh","text":"getmesh(pd::AbstractPlotData)\n\nExtract grid lines from pd for plotting with Plots.plot.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.global_mean_vars-Tuple{AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.global_mean_vars","text":"global_mean_vars(equations::AcousticPerturbationEquations2D)\n\nReturns the global mean variables stored in equations. This makes it easier to define flexible initial conditions for problems with constant mean flow.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.have_nonconservative_terms-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.have_nonconservative_terms","text":"have_nonconservative_terms(equations)\n\nTrait function determining whether equations represent a conservation law with or without nonconservative terms. Classical conservation laws such as the CompressibleEulerEquations2D do not have nonconservative terms. The ShallowWaterEquations2D with non-constant bottom topography are an example of equations with nonconservative terms. The return value will be True() or False() to allow dispatching on the return type.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.hydrostatic_reconstruction_audusse_etal-Tuple{Any, Any, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.hydrostatic_reconstruction_audusse_etal","text":"hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nA particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations1D. The reconstructed solution states u_ll_star and u_rr_star variables are then used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.\n\nFurther details on this hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.hydrostatic_reconstruction_audusse_etal-Tuple{Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.hydrostatic_reconstruction_audusse_etal","text":"hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterEquations2D)\n\nA particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations2D. The reconstructed solution states u_ll_star and u_rr_star variables are used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.\n\nFurther details for the hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.hydrostatic_reconstruction_chen_noelle-Tuple{Any, Any, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.hydrostatic_reconstruction_chen_noelle","text":"hydrostatic_reconstruction_chen_noelle(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nA particular type of hydrostatic reconstruction of the water height to guarantee well-balancedness for a general bottom topography of the ShallowWaterEquations1D. The reconstructed solution states u_ll_star and u_rr_star variables are used to evaluate the surface numerical flux at the interface. The key idea is a linear reconstruction of the bottom and water height at the interfaces using subcells. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.\n\nFurther details on this hydrostatic reconstruction and its motivation can be found in\n\nGuoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.hydrostatic_reconstruction_chen_noelle-Tuple{Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.hydrostatic_reconstruction_chen_noelle","text":"hydrostatic_reconstruction_chen_noelle(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\n\nA particular type of hydrostatic reconstruction of the water height to guarantee well-balancedness for a general bottom topography of the ShallowWaterEquations2D. The reconstructed solution states u_ll_star and u_rr_star variables are then used to evaluate the surface numerical flux at the interface. The key idea is a linear reconstruction of the bottom and water height at the interfaces using subcells. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.\n\nFurther details on this hydrostatic reconstruction and its motivation can be found in\n\nGuoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.init_mpi-Tuple{}","page":"Trixi.jl","title":"Trixi.init_mpi","text":"init_mpi()\n\nInitialize MPI by calling MPI.Initialized(). The function will check if MPI is already initialized and if yes, do nothing, thus it is safe to call it multiple times.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.init_p4est-Tuple{}","page":"Trixi.jl","title":"Trixi.init_p4est","text":"init_p4est()\n\nInitialize p4est by calling p4est_init and setting the log level to SC_LP_ERROR. This function will check if p4est is already initialized and if yes, do nothing, thus it is safe to call it multiple times.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.init_t8code-Tuple{}","page":"Trixi.jl","title":"Trixi.init_t8code","text":"init_t8code()\n\nInitialize t8code by calling sc_init, p4est_init, and t8_init while setting the log level to SC_LP_ERROR. This function will check if t8code is already initialized and if yes, do nothing, thus it is safe to call it multiple times.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::AcousticPerturbationEquations2D)\n\nA constant initial condition where the state variables are zero and the mean flow is constant. Uses the global mean values from equations.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::CompressibleEulerEquations1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::CompressibleEulerEquations2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::CompressibleEulerEquations3D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::IdealGlmMhdEquations1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::IdealGlmMhdEquations2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::IdealGlmMhdEquations3D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::InviscidBurgersEquation1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LatticeBoltzmannEquations2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LatticeBoltzmannEquations3D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::AcousticPerturbationEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test. Uses the global mean values from equations.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations3D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquationsQuasi1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerMulticomponentEquations1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerMulticomponentEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdEquations1D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdEquations2D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdEquations3D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdMulticomponentEquations1D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdMulticomponentEquations2D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::InviscidBurgersEquation1D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA smooth initial condition used for convergence tests (in combination with BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearizedEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearizedEulerEquations2D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::PolytropicEulerEquations2D)\n\nManufactured smooth initial condition used for convergence tests in combination with source_terms_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::ShallowWaterEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::ShallowWaterEquationsQuasi1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::ShallowWaterTwoLayerEquations1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::ShallowWaterTwoLayerEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test. Constants must be set to rho_upper = 09, rho_lower = 10, g = 100.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_density_wave-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_density_wave","text":"initial_condition_density_wave(x, t, equations::CompressibleEulerEquations1D)\n\nA sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper\n\nGregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026\n\nwith the following parameters\n\ndomain [-1, 1]\nmesh = 4x4\npolydeg = 5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_density_wave-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_density_wave","text":"initial_condition_density_wave(x, t, equations::CompressibleEulerEquations2D)\n\nA sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper\n\nGregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026\n\nwith the following parameters\n\ndomain [-1, 1]\nmesh = 4x4\npolydeg = 5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations1D)\n\nOne dimensional variant of the setup used for convergence tests of the Euler equations with self-gravity from\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nnote: Note\nThere is no additional source term necessary for the manufactured solution in one spatial dimension. Thus, source_terms_eoc_test_coupled_euler_gravity is not present there.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::HyperbolicDiffusionEquations1D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_harmonic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, HyperbolicDiffusionEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::HyperbolicDiffusionEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_harmonic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, HyperbolicDiffusionEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::HyperbolicDiffusionEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_harmonic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equations::AcousticPerturbationEquations2D)\n\nA Gaussian pulse in a constant mean flow. Uses the global mean values from equations.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA Gaussian pulse used together with BoundaryConditionDirichlet(initial_condition_gauss).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equation::LinearScalarAdvectionEquation2D)\n\nA Gaussian pulse used together with BoundaryConditionDirichlet(initial_condition_gauss).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA Gaussian pulse.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_x-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_x","text":"initial_condition_linear_x(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA linear function of x[1] used together with boundary_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_x-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_x","text":"initial_condition_linear_x(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA linear function of x[1] used together with boundary_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_x_y-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_x_y","text":"initial_condition_linear_x_y(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA linear function of x[1] + x[2] used together with boundary_condition_linear_x_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_y-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_y","text":"initial_condition_linear_y(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA linear function of x[1] used together with boundary_condition_linear_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_z-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_z","text":"initial_condition_linear_z(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA linear function of x[3] used together with boundary_condition_linear_z.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_poisson_nonperiodic-Tuple{Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_poisson_nonperiodic","text":"initial_condition_poisson_nonperiodic(x, t, equations::HyperbolicDiffusionEquations1D)\n\nA non-priodic smooth initial condition. Can be used for convergence tests in combination with source_terms_poisson_nonperiodic and boundary_condition_poisson_nonperiodic.\n\nnote: Note\nThe solution is periodic but the initial guess is not.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_sin-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_sin","text":"initial_condition_sin(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA sine wave in the conserved variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_sin-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_sin","text":"initial_condition_sin(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA sine wave in the conserved variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_sin_sin-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_sin_sin","text":"initial_condition_sin_sin(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA sine wave in the conserved variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations1D)\n\nA weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations2D)\n\nA weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations3D)\n\nA weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations1D)\n\nA for multicomponent adapted weak blast wave adapted to multicomponent and taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations2D)\n\nA for multicomponent adapted weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations1D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations2D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations3D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations1D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations2D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::PolytropicEulerEquations2D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations1D)\n\nA weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations2D)\n\nA weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.integrate_via_indices-Union{Tuple{Func}, Tuple{Func, Any, Trixi.AbstractSemidiscretization, Vararg{Any}}} where Func","page":"Trixi.jl","title":"Trixi.integrate_via_indices","text":"integrate_via_indices(func, u_ode, semi::AbstractSemidiscretization, args...; normalize=true)\n\nCall func(u, i..., element, equations, solver, args...) for all nodal indices i..., element and integrate the result using a quadrature associated with the semidiscretization semi.\n\nIf normalize is true, the result is divided by the total volume of the computational domain.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.inv_ln_mean-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.inv_ln_mean","text":"inv_ln_mean(x, y)\n\nCompute the inverse 1 / ln_mean(x, y) of the logarithmic mean ln_mean.\n\nThis function may be used to increase performance where the inverse of the logarithmic mean is needed, by replacing a (slow) division by a (fast) multiplication.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.jacobian_ad_forward-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.jacobian_ad_forward","text":"jacobian_ad_forward(semi::AbstractSemidiscretization;\n t0=zero(real(semi)),\n u0_ode=compute_coefficients(t0, semi))\n\nUses the right-hand side operator of the semidiscretization semi and forward mode automatic differentiation to compute the Jacobian J of the semidiscretization semi at state u0_ode.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.jacobian_fd-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.jacobian_fd","text":"jacobian_fd(semi::AbstractSemidiscretization;\n t0=zero(real(semi)),\n u0_ode=compute_coefficients(t0, semi))\n\nUses the right-hand side operator of the semidiscretization semi and simple second order finite difference to compute the Jacobian J of the semidiscretization semi at state u0_ode.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.linear_structure-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.linear_structure","text":"linear_structure(semi::AbstractSemidiscretization;\n t0=zero(real(semi)))\n\nWraps the right-hand side operator of the semidiscretization semi at time t0 as an affine-linear operator given by a linear operator A and a vector b.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ln_mean-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.ln_mean","text":"ln_mean(x, y)\n\nCompute the logarithmic mean\n\nln_mean(x, y) = (y - x) / (log(y) - log(x)) = (y - x) / log(y / x)\n\nProblem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Ismail and Roe (2009). Set ξ = y / x. Then, we have\n\n(y - x) / log(y / x) = (x + y) / log(ξ) * (ξ - 1) / (ξ + 1)\n\nSet f = (ξ - 1) / (ξ + 1) = (y - x) / (x + y). Then, we use the expansion\n\nlog(ξ) = 2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7) + O(ξ^9)\n\nInserting the first few terms of this expansion yields\n\n(y - x) / log(ξ) ≈ (x + y) * f / (2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7))\n = (x + y) / (2 + 2/3 * f^2 + 2/5 * f^4 + 2/7 * f^6)\n\nSince divisions are usually more expensive on modern hardware than multiplications (Agner Fog), we try to avoid computing two divisions. Thus, we use\n\nf^2 = (y - x)^2 / (x + y)^2\n = (x * (x - 2 * y) + y * y) / (x * (x + 2 * y) + y * y)\n\nGiven ε = 1.0e-4, we use the following algorithm.\n\nif f^2 < ε\n # use the expansion above\nelse\n # use the direct formula (y - x) / log(y / x)\nend\n\nReferences\n\nIsmail, Roe (2009). Affordable, entropy-consistent Euler flux functions II: Entropy production at shocks. DOI: 10.1016/j.jcp.2009.04.021\nAgner Fog. Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD, and VIA CPUs. https://www.agner.org/optimize/instruction_tables.pdf\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_adaptive_time_integrator!-Tuple{Any, AbstractString}","page":"Trixi.jl","title":"Trixi.load_adaptive_time_integrator!","text":"load_adaptive_time_integrator!(integrator, restart_file::AbstractString)\n\nLoad the context information for time integrators with error-based step size control saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_dt-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_dt","text":"load_dt(restart_file::AbstractString)\n\nLoad the time step size (dt in OrdinaryDiffEq.jl) saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_mesh-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_mesh","text":"load_mesh(restart_file::AbstractString; n_cells_max)\n\nLoad the mesh from the restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_time-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_time","text":"load_time(restart_file::AbstractString)\n\nLoad the time saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_timestep!-Tuple{Any, AbstractString}","page":"Trixi.jl","title":"Trixi.load_timestep!","text":"load_timestep!(integrator, restart_file::AbstractString)\n\nLoad the time step number saved in a restart_file and assign it to both the time step number and and the number of accepted steps (iter and stats.naccept in OrdinaryDiffEq.jl, respectively) in integrator.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_timestep-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_timestep","text":"load_timestep(restart_file::AbstractString)\n\nLoad the time step number (iter in OrdinaryDiffEq.jl) saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.max-Tuple","page":"Trixi.jl","title":"Trixi.max","text":"max(x, y, ...)\n\nReturn the maximum of the arguments. See also the maximum function to take the maximum element from a collection.\n\nThis version in Trixi.jl is semantically equivalent to Base.max but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).\n\nExamples\n\njulia> max(2, 5, 1)\n5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.max_abs_speed_naive","page":"Trixi.jl","title":"Trixi.max_abs_speed_naive","text":"max_abs_speed_naive(u_ll, u_rr, orientation::Integer, equations)\nmax_abs_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nSimple and fast estimate of the maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, based only on the local wave speeds associated to u_ll and u_rr.\n\nFor non-integer arguments normal_direction in one dimension, max_abs_speed_naive returns abs(normal_direction[1]) * max_abs_speed_naive(u_ll, u_rr, 1, equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.min-Tuple","page":"Trixi.jl","title":"Trixi.min","text":"min(x, y, ...)\n\nReturn the minimum of the arguments. See also the minimum function to take the minimum element from a collection.\n\nThis version in Trixi.jl is semantically equivalent to Base.min but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).\n\nExamples\n\njulia> min(2, 5, 1)\n1\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_chen_noelle-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.min_max_speed_chen_noelle","text":"min_max_speed_chen_noelle(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nThe approximated speeds for the HLL type numerical flux used by Chen and Noelle for their hydrostatic reconstruction. As they state in the paper, these speeds are chosen for the numerical flux to ensure positivity and to satisfy an entropy inequality.\n\nFurther details on this hydrostatic reconstruction and its motivation can be found in\n\nGuoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_chen_noelle-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_chen_noelle","text":"min_max_speed_chen_noelle(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nmin_max_speed_chen_noelle(u_ll, u_rr, normal_direction::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nSpecial estimate of the minimal and maximal wave speed of the shallow water equations for the left and right states u_ll, u_rr. These approximate speeds are used for the HLL-type numerical flux flux_hll_chen_noelle. These wave speed estimates together with a particular hydrostatic reconstruction technique guarantee that the numerical flux is positive and satisfies an entropy inequality.\n\nFurther details on this hydrostatic reconstruction and its motivation can be found in the reference below. The definition of the wave speeds are given in Equation (2.20).\n\nGuoxian Chen and Sebastian Noelle (2017) A new hydrostatic reconstruction scheme based on subcell reconstructions DOI:10.1137/15M1053074\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_davis","page":"Trixi.jl","title":"Trixi.min_max_speed_davis","text":"min_max_speed_davis(u_ll, u_rr, orientation::Integer, equations)\nmin_max_speed_davis(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nSimple and fast estimates of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr.\n\nS.F. Davis (1988) Simplified Second-Order Godunov-Type Methods DOI: 10.1137/0909030\n\nSee also FluxHLL, min_max_speed_naive, min_max_speed_einfeldt.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations)\nmin_max_speed_einfeldt(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nMore advanced mininmal and maximal wave speed computation based on\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\noriginally developed for the compressible Euler equations. A compact representation can be found in this lecture notes, eq. (9.28).\n\nSee also FluxHLL, min_max_speed_naive, min_max_speed_davis.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, AbstractVector, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations2D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, AbstractVector, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations3D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nOriginal publication:\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\n\nCompactly summarized:\n\nSiddhartha Mishra, Ulrik Skre Fjordholm and Rémi Abgrall Numerical methods for conservation laws and related equations. Link\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations::IdealGlmMhdEquations1D)\n\nCalculate minimum and maximum wave speeds for HLL-type fluxes as in\n\nLi (2005) An HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations::IdealGlmMhdEquations2D)\n\nCalculate minimum and maximum wave speeds for HLL-type fluxes as in\n\nLi (2005) An HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations3D)\n\nCalculate minimum and maximum wave speeds for HLL-type fluxes as in\n\nLi (2005) An HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_naive","page":"Trixi.jl","title":"Trixi.min_max_speed_naive","text":"min_max_speed_naive(u_ll, u_rr, orientation::Integer, equations)\nmin_max_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nSimple and fast estimate(!) of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr.\n\nAmiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002\n\nSee also FluxHLL, min_max_speed_davis, min_max_speed_einfeldt.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.modify_dt_for_tstops!-Tuple{Trixi.SimpleIntegratorSSP}","page":"Trixi.jl","title":"Trixi.modify_dt_for_tstops!","text":"modify_dt_for_tstops!(integrator::SimpleIntegratorSSP)\n\nModify the time-step size to match the time stops specified in integrator.opts.tstops. To avoid adding OrdinaryDiffEq to Trixi's dependencies, this routine is a copy of https://github.com/SciML/OrdinaryDiffEq.jl/blob/d76335281c540ee5a6d1bd8bb634713e004f62ee/src/integrators/integrator_utils.jl#L38-L54\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.multiply_dimensionwise-Tuple{AbstractMatrix, AbstractMatrix}","page":"Trixi.jl","title":"Trixi.multiply_dimensionwise","text":"multiply_dimensionwise(matrix::AbstractMatrix, data_in::AbstractArray{<:Any, NDIMS+1})\n\nMultiply the array data_in by matrix in each coordinate direction, where data_in is assumed to have the first coordinate for the number of variables and the remaining coordinates are multiplied by matrix.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.n_nonconservative_terms","page":"Trixi.jl","title":"Trixi.n_nonconservative_terms","text":"n_nonconservative_terms(equations)\n\nNumber of nonconservative terms in the form local * symmetric for a particular equation. This function needs to be specialized only if equations with nonconservative terms are combined with certain solvers (e.g., subcell limiting).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.ndofs-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.ndofs","text":"ndofs(semi::AbstractSemidiscretization)\n\nReturn the number of degrees of freedom associated with each scalar variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.negative_part-Tuple{Any}","page":"Trixi.jl","title":"Trixi.negative_part","text":"negative_part(x)\n\nReturn x if x is negative, else zero. In other words, return (x - abs(x)) / 2 for real numbers x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ode_default_options-Tuple{}","page":"Trixi.jl","title":"Trixi.ode_default_options","text":"ode_default_options()\n\nReturn the default options for OrdinaryDiffEq's solve. Pass ode_default_options()... to solve to only return the solution at the final time and enable MPI aware error-based step size control, whenever MPI is used. For example, use solve(ode, alg; ode_default_options()...).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ode_norm-Tuple{Number, Any}","page":"Trixi.jl","title":"Trixi.ode_norm","text":"ode_norm(u, t)\n\nImplementation of the weighted L2 norm of Hairer and Wanner used for error-based step size control in OrdinaryDiffEq.jl. This function is aware of MPI and uses global MPI communication when running in parallel.\n\nYou must pass this function as a keyword argument internalnorm=ode_norm to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.\n\nSee the \"Advanced Adaptive Stepsize Control\" section of the documentation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ode_unstable_check-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.ode_unstable_check","text":"ode_unstable_check(dt, u, semi, t)\n\nImplementation of the basic check for instability used in OrdinaryDiffEq.jl. Instead of checking something like any(isnan, u), this function just checks isnan(dt). This helps when using MPI parallelization, since no additional global communication is required and all ranks will return the same result.\n\nYou should pass this function as a keyword argument unstable_check=ode_unstable_check to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.\n\nSee the \"Miscellaneous\" section of the documentation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.partition!-Tuple{TreeMesh{NDIMS, <:Trixi.ParallelTree{NDIMS}} where NDIMS}","page":"Trixi.jl","title":"Trixi.partition!","text":"partition!(mesh::ParallelTreeMesh, allow_coarsening=true)\n\nPartition mesh using a static domain decomposition algorithm based on leaf cell count and tree structure. If allow_coarsening is true, the algorithm will keep leaf cells together on one rank when needed for local coarsening (i.e. when all children of a cell are leaves).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.positive_part-Tuple{Any}","page":"Trixi.jl","title":"Trixi.positive_part","text":"positive_part(x)\n\nReturn x if x is positive, else zero. In other words, return (x + abs(x)) / 2 for real numbers x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.pressure-Tuple{Real, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.pressure","text":"pressure(rho::Real, equations::LatticeBoltzmannEquations2D)\npressure(u, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic pressure from the density rho or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.pressure-Tuple{Real, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.pressure","text":"pressure(rho::Real, equations::LatticeBoltzmannEquations3D)\npressure(u, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic pressure from the density rho or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.prim2cons","page":"Trixi.jl","title":"Trixi.prim2cons","text":"prim2cons(u, equations)\n\nConvert the primitive variables u to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2prim.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.residual_steady_state-Tuple{Any, HyperbolicDiffusionEquations3D}","page":"Trixi.jl","title":"Trixi.residual_steady_state","text":"residual_steady_state(du, ::AbstractHyperbolicDiffusionEquations)\n\nUsed to determine the termination criterion of a SteadyStateCallback. For hyperbolic diffusion, this checks convergence of the potential phi.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.rotate_from_x","page":"Trixi.jl","title":"Trixi.rotate_from_x","text":"rotate_from_x(u, normal, equations)\n\nApply the rotation that maps the x-axis onto normal to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.\n\nSee also: rotate_to_x\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.rotate_to_x","page":"Trixi.jl","title":"Trixi.rotate_to_x","text":"rotate_to_x(u, normal, equations)\n\nApply the rotation that maps normal onto the x-axis to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.\n\nSee also: rotate_from_x\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.save_plot-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.save_plot","text":"save_plot(plot_data, variable_names;\n show_mesh=true, plot_arguments=Dict{Symbol,Any}(),\n time=nothing, timestep=nothing)\n\nVisualize the plot data object provided in plot_data and save result as a PNG file in the out directory, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.\n\nThe timestep is used in the filename. time is currently unused by this function.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nSee also: VisualizationCallback, show_plot\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.show_plot-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.show_plot","text":"show_plot(plot_data, variable_names;\n show_mesh=true, plot_arguments=Dict{Symbol,Any}(),\n time=nothing, timestep=nothing)\n\nVisualize the plot data object provided in plot_data and display result, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.\n\nThis function is the default plot_creator argument for the VisualizationCallback. time and timestep are currently unused by this function.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nSee also: VisualizationCallback, save_plot\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.solve","page":"Trixi.jl","title":"Trixi.solve","text":"solve(ode, alg; dt, callbacks, kwargs...)\n\nThe following structures and methods provide the infrastructure for SSP Runge-Kutta methods of type SimpleAlgorithmSSP.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::AcousticPerturbationEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquations1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquations3D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquationsQuasi1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\nThis manufactured solution source term is specifically designed for the mozzle width 'a(x) = 1.5 - 0.5 * cos(x[1] * pi)' as defined in initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerMulticomponentEquations1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerMulticomponentEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::InviscidBurgersEquation1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::PolytropicEulerEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::ShallowWaterEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\nThis manufactured solution source term is specifically designed for the bottom topography function b(x,y) = 2 + 0.5 * sin(sqrt(2)*pi*x) + 0.5 * sin(sqrt(2)*pi*y) as defined in initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::ShallowWaterEquationsQuasi1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\nThis manufactured solution source term is specifically designed for the bottom topography function b(x) = 0.2 - 0.05 * sin(sqrt(2) * pi *x[1]) and channel width 'a(x)= 1 + 0.1 * cos(sqrt(2) * pi * x[1])' as defined in initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::ShallowWaterTwoLayerEquations1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::ShallowWaterTwoLayerEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_coupled_euler_gravity-Tuple{Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_coupled_euler_gravity","text":"source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_coupled_euler_gravity-Tuple{Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_coupled_euler_gravity","text":"source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_euler-Tuple{Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_euler","text":"source_terms_eoc_test_euler(u, x, t, equations::CompressibleEulerEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_euler-Tuple{Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_euler","text":"source_terms_eoc_test_euler(u, x, t, equations::CompressibleEulerEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\nnote: Note\nThis method is to be used for testing pure Euler simulations with analytic self-gravity. If you intend to do coupled Euler-gravity simulations, you need to use source_terms_eoc_test_coupled_euler_gravity instead.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_harmonic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_harmonic","text":"source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations1D)\n\nSource term that only includes the forcing from the hyperbolic diffusion system.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_harmonic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_harmonic","text":"source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations2D)\n\nSource term that only includes the forcing from the hyperbolic diffusion system.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_harmonic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_harmonic","text":"source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations3D)\n\nSource term that only includes the forcing from the hyperbolic diffusion system.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_poisson_nonperiodic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_poisson_nonperiodic","text":"source_terms_poisson_nonperiodic(u, x, t,\n equations::HyperbolicDiffusionEquations1D)\n\nSource terms that include the forcing function f(x) and right hand side for the hyperbolic diffusion system that is used with initial_condition_poisson_nonperiodic and boundary_condition_poisson_nonperiodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_coirier_vanleer-Tuple{Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.splitting_coirier_vanleer","text":"splitting_coirier_vanleer(u, orientation::Integer,\n equations::CompressibleEulerEquations1D)\nsplitting_coirier_vanleer(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations1D)\n\nSplitting of the compressible Euler flux from Coirier and van Leer. The splitting has correction terms in the pressure splitting as well as the mass and energy flux components. The motivation for these corrections are to handle flows at the low Mach number limit.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nWilliam Coirier and Bram van Leer (1991) Numerical flux formulas for the Euler and Navier-Stokes equations. II - Progress in flux-vector splitting DOI: 10.2514/6.1991-1566\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_lax_friedrichs-Tuple{Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.splitting_lax_friedrichs","text":"splitting_lax_friedrichs(u, orientation::Integer,\n equations::CompressibleEulerEquations2D)\nsplitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations2D)\n\nNaive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) similar to a flux splitting one would apply, e.g., to Burgers' equation.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_lax_friedrichs-Tuple{Any, Integer, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.splitting_lax_friedrichs","text":"splitting_lax_friedrichs(u, orientation::Integer,\n equations::InviscidBurgersEquation1D)\nsplitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::InviscidBurgersEquation1D)\n\nNaive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ = abs(u).\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_lax_friedrichs-Tuple{Any, Integer, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.splitting_lax_friedrichs","text":"splitting_lax_friedrichs(u, orientation::Integer,\n equations::LinearScalarAdvectionEquation1D)\nsplitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::LinearScalarAdvectionEquation1D)\n\nNaive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ is the absolute value of the advection velocity.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_steger_warming-Tuple{Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.splitting_steger_warming","text":"splitting_steger_warming(u, orientation::Integer,\n equations::CompressibleEulerEquations1D)\nsplitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations1D)\n\nSplitting of the compressible Euler flux of Steger and Warming.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nJoseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_steger_warming-Tuple{Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.splitting_steger_warming","text":"splitting_steger_warming(u, orientation::Integer,\n equations::CompressibleEulerEquations2D)\nsplitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations2D)\n\nSplitting of the compressible Euler flux of Steger and Warming.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nJoseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_steger_warming-Tuple{Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.splitting_steger_warming","text":"splitting_steger_warming(u, orientation::Integer,\n equations::CompressibleEulerEquations3D)\nsplitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations3D)\n\nSplitting of the compressible Euler flux of Steger and Warming.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nJoseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_vanleer_haenel-Tuple{Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.splitting_vanleer_haenel","text":"splitting_vanleer_haenel(u, orientation::Integer,\n equations::CompressibleEulerEquations1D)\nsplitting_vanleer_haenel(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations1D)\n\nSplitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nBram van Leer (1982) Flux-Vector Splitting for the Euler Equation DOI: 10.1007/978-3-642-60543-7_5\nD. Hänel, R. Schwane and G. Seider (1987) On the accuracy of upwind schemes for the solution of the Navier-Stokes equations DOI: 10.2514/6.1987-1105\nMeng-Sing Liou and Chris J. Steffen, Jr. (1991) High-Order Polynomial Expansions (HOPE) for Flux-Vector Splitting NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_vanleer_haenel-Tuple{Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.splitting_vanleer_haenel","text":"splitting_vanleer_haenel(u, orientation::Integer,\n equations::CompressibleEulerEquations2D)\nsplitting_vanleer_haenel(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations2D)\n\nSplitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nBram van Leer (1982) Flux-Vector Splitting for the Euler Equation DOI: 10.1007/978-3-642-60543-7_5\nD. Hänel, R. Schwane and G. Seider (1987) On the accuracy of upwind schemes for the solution of the Navier-Stokes equations DOI: 10.2514/6.1987-1105\nMeng-Sing Liou and Chris J. Steffen, Jr. (1991) High-Order Polynomial Expansions (HOPE) for Flux-Vector Splitting NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.stolarsky_mean-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.stolarsky_mean","text":"stolarsky_mean(x, y, gamma)\n\nCompute an instance of a weighted Stolarsky mean of the form\n\nstolarsky_mean(x, y, gamma) = (gamma - 1)/gamma * (y^gamma - x^gamma) / (y^(gamma-1) - x^(gamma-1))\n\nwhere gamma > 1.\n\nProblem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Winters et al. (2020). Set f = (y - x) / (y + x) and g = gamma (for compact notation). Then, we use the expansions\n\n((1+f)^g - (1-f)^g) / g = 2*f + (g-1)(g-2)/3 * f^3 + (g-1)(g-2)(g-3)(g-4)/60 * f^5 + O(f^7)\n\nand\n\n((1+f)^(g-1) - (1-f)^(g-1)) / (g-1) = 2*f + (g-2)(g-3)/3 * f^3 + (g-2)(g-3)(g-4)(g-5)/60 * f^5 + O(f^7)\n\nInserting the first few terms of these expansions and performing polynomial long division we find that\n\nstolarsky_mean(x, y, gamma) ≈ (y + x) / 2 * (1 + (g-2)/3 * f^2 - (g+1)(g-2)(g-3)/45 * f^4 + (g+1)(g-2)(g-3)(2g(g-2)-9)/945 * f^6)\n\nSince divisions are usually more expensive on modern hardware than multiplications (Agner Fog), we try to avoid computing two divisions. Thus, we use\n\nf^2 = (y - x)^2 / (x + y)^2\n = (x * (x - 2 * y) + y * y) / (x * (x + 2 * y) + y * y)\n\nGiven ε = 1.0e-4, we use the following algorithm.\n\nif f^2 < ε\n # use the expansion above\nelse\n # use the direct formula (gamma - 1)/gamma * (y^gamma - x^gamma) / (y^(gamma-1) - x^(gamma-1))\nend\n\nReferences\n\nAndrew R. Winters, Christof Czernik, Moritz B. Schily & Gregor J. Gassner (2020) Entropy stable numerical approximations for the isothermal and polytropic Euler equations DOI: 10.1007/s10543-019-00789-w\nAgner Fog. Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD, and VIA CPUs. https://www.agner.org/optimize/instruction_tables.pdf\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.totalgamma-Tuple{Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.totalgamma","text":"totalgamma(u, equations::CompressibleEulerMulticomponentEquations1D)\n\nFunction that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.totalgamma-Tuple{Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.totalgamma","text":"totalgamma(u, equations::CompressibleEulerMulticomponentEquations2D)\n\nFunction that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.trixi_include-Tuple{Module, AbstractString}","page":"Trixi.jl","title":"Trixi.trixi_include","text":"trixi_include([mod::Module=Main,] elixir::AbstractString; kwargs...)\n\ninclude the file elixir and evaluate its content in the global scope of module mod. You can override specific assignments in elixir by supplying keyword arguments. It's basic purpose is to make it easier to modify some parameters while running Trixi.jl from the REPL. Additionally, this is used in tests to reduce the computational burden for CI while still providing examples with sensible default values for users.\n\nBefore replacing assignments in elixir, the keyword argument maxiters is inserted into calls to solve and Trixi.solve with it's default value used in the SciML ecosystem for ODEs, see the \"Miscellaneous\" section of the documentation.\n\nExamples\n\njulia> redirect_stdout(devnull) do\n trixi_include(@__MODULE__, joinpath(examples_dir(), \"tree_1d_dgsem\", \"elixir_advection_extended.jl\"),\n tspan=(0.0, 0.1))\n sol.t[end]\n end\n[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.\n0.1\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.uses_amr-Tuple{Any}","page":"Trixi.jl","title":"Trixi.uses_amr","text":"uses_amr(callback)\n\nChecks whether the provided callback or CallbackSet is an AMRCallback or contains one.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.varnames","page":"Trixi.jl","title":"Trixi.varnames","text":"varnames(conversion_function, equations)\n\nReturn the list of variable names when applying conversion_function to the conserved variables associated to equations. This function is mainly used internally to determine output to screen and for IO, e.g., for the AnalysisCallback and the SaveSolutionCallback. Common choices of the conversion_function are cons2cons and cons2prim.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, Integer, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, orientation, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y) from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, Integer, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, orientation, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y, 3 -> z) from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic velocity vector from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic velocity vector from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.@autoinfiltrate","page":"Trixi.jl","title":"Trixi.@autoinfiltrate","text":"@autoinfiltrate\n@autoinfiltrate condition::Bool\n\nInvoke the @infiltrate macro of the package Infiltrator.jl to create a breakpoint for ad-hoc interactive debugging in the REPL. If the optional argument condition is given, the breakpoint is only enabled if condition evaluates to true.\n\nAs opposed to using Infiltrator.@infiltrate directly, this macro does not require Infiltrator.jl to be added as a dependency to Trixi.jl. As a bonus, the macro will also attempt to load the Infiltrator module if it has not yet been loaded manually.\n\nNote: For this macro to work, the Infiltrator.jl package needs to be installed in your current Julia environment stack.\n\nSee also: Infiltrator.jl\n\nwarning: Internal use only\nPlease note that this macro is intended for internal use only. It is not part of the public API of Trixi.jl, and it thus can altered (or be removed) at any time without it being considered a breaking change.\n\n\n\n\n\n","category":"macro"},{"location":"reference-trixi/#Trixi.@threaded-Tuple{Any}","page":"Trixi.jl","title":"Trixi.@threaded","text":"@threaded for ... end\n\nSemantically the same as Threads.@threads when iterating over a AbstractUnitRange but without guarantee that the underlying implementation uses Threads.@threads or works for more general for loops. In particular, there may be an additional check whether only one thread is used to reduce the overhead of serial execution or the underlying threading capabilities might be provided by other packages such as Polyester.jl.\n\nwarn: Warn\nThis macro does not necessarily work for general for loops. For example, it does not necessarily support general iterables such as eachline(filename).\n\nSome discussion can be found at https://discourse.julialang.org/t/overhead-of-threads-threads/53964 and https://discourse.julialang.org/t/threads-threads-with-one-thread-how-to-remove-the-overhead/58435.\n\n\n\n\n\n","category":"macro"},{"location":"styleguide/#Style-guide","page":"Style guide","title":"Style guide","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"Coding style is an inherently personal - and thus hotly contested - issue. Since code is usually \"written once, read often\", it helps regular developers, new users, and reviewers if code is formatted consistently. We therefore believe in the merit of using a common coding style throughout Trixi.jl, even at the expense that not everyone can be happy with every detailed style decision. If you came here because you are furious about our code formatting rules, here is a happy little whale for you to calm you down: 🐳","category":"page"},{"location":"styleguide/#Conventions","page":"Style guide","title":"Conventions","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"The following lists a few coding conventions for Trixi.jl. Note that in addition to these conventions, we apply and enforce automated source code formatting (see below for more details):","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"Modules, types, structs with CamelCase.\nFunctions, variables with lowercase snake_case.\nIndentation with 4 spaces (never tabs!)\nMaximum line length (strictly): 92.\nFunctions that mutate their input are named with a trailing !.\nFunctions order their parameters similar to Julia Base.\nThe main modified argument comes first. For example, if the right-hand side du is modified, it should come first. If only the cache is modified, e.g., in prolong2interfaces! and its siblings, put the cache first.\nOtherwise, use the order mesh, equations, solver, cache.\nIf something needs to be specified in more detail for dispatch, put the additional argument before the general one that is specified in more detail. For example, we use have_nonconservative_terms(equations), equations and dg.mortar, dg.\nPrefer for i in ... to for i = ... for better semantic clarity and greater flexibility.\nExecutable code should only use ASCII characters.\nDocstrings and comments can and should use Unicode characters where it helps understanding.\nMultiline expressions should be explicitly grouped by parentheses and not rely on Julia's implicit line continuation syntax.\nWhen naming multiple functions of a single or similar category, prefer to put the general classification first and the specialization second. Example: Use flux_central instead of central_flux. This helps when searching for available functions on the REPL (e.g., when trying to find all flux functions).","category":"page"},{"location":"styleguide/#automated-source-code-formatting","page":"Style guide","title":"Automated source code formatting","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"We use JuliaFormatter.jl to format the source code of Trixi.jl, which will also enforce some of the Conventions listed above (e.g., line length or indentation with 4 spaces are automatically handled, while capitalization of names is not). Our format is mostly based on the SciML-style formatting rules. For more details you can have a look at the current .JuliaFormatter.toml file that holds the configuration options we use for JuliaFormatter.jl.","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"Note that we expect all contributions to Trixi.jl to be formatted with JuliaFormatter.jl before being merged to the main branch. We ensure this by running a automated check on all PRs that verify that running JuliaFormatter.jl again will not change the source code.","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"To format your contributions before created a PR (or, at least, before requesting a review of your PR), you need to install JuliaFormatter.jl first by running","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"julia -e 'using Pkg; Pkg.add(\"JuliaFormatter\")'","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"You can then recursively format the core Julia files in the Trixi.jl repo by executing","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"julia -e 'using JuliaFormatter; format([\"benchmark\", \"examples\", \"ext\", \"src\", \"test\", \"utils\"])'","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"from inside the Trixi.jl repository. For convenience, there is also a script you can directly run from your terminal shell, which will automatically install JuliaFormatter in a temporary environment and then run it:","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"utils/trixi-format.jl","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"You can get more information about using the convenience script by running it with the --help/-h flag.","category":"page"},{"location":"styleguide/#Checking-formatting-before-committing","page":"Style guide","title":"Checking formatting before committing","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"It can be convenient to check the formatting of source code automatically before each commit. We use git-hooks for it and provide a pre-commit script in the utils folder. The script uses JuliaFormatter.jl just like formatting script that runs over the whole Trixi.jl directory. You can copy the pre-commit-script into .git/hooks/pre-commit and it will check your formatting before each commit. If errors are found the commit is aborted and you can add the corrections via","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"git add -p","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"EditURL = \"../../literate/src/files/scalar_linear_advection_1d.jl\"","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#scalar_linear_advection_1d","page":"1 Introduction to DG methods","title":"1: Introduction to DG methods","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"This tutorial is about how to set up a simple way to approximate the solution of a hyperbolic partial differential equation. First, we will implement a basic and naive algorithm. Then, we will use predefined features from Trixi.jl to show how you can use Trixi.jl on your own.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We will implement the scalar linear advection equation in 1D with the advection velocity 1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"u_t + u_x = 0 textfor tin mathbbR^+ xinOmega=-11","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We define the domain Omega by setting the boundaries.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"coordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We assume periodic boundaries and the following initial condition.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"initial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#The-discontinuous-Galerkin-collocation-spectral-element-method-(DGSEM)","page":"1 Introduction to DG methods","title":"The discontinuous Galerkin collocation spectral element method (DGSEM)","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/#i.-Discretization-of-the-physical-domain","page":"1 Introduction to DG methods","title":"i. Discretization of the physical domain","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"To improve precision we want to approximate the solution on small parts of the physical domain. So, we split the domain Omega=-1 1 into elements Q_l of length dx.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"n_elements = 16 # number of elements\n\ndx = (coordinates_max - coordinates_min) / n_elements # length of one element","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"To make the calculation more efficient and storing less information, we transform each element Q_l with center point x_l to a reference element E=-1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Q_l=Bigx_l-fracdx2 x_l+fracdx2Big undersetx(xi)oversetxi(x)rightleftarrows -1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"So, for every element the transformation from the reference domain to the physical domain is defined by","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"x(xi) = x_l + fracdx2 xi xiin-1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Therefore,","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"beginalign*\nu = u(x(xi) t) \nu_x = u_xi fracdxidx 3pt\nfracdxidx = (x_xi)^-1 = frac2dx = J^-1 \nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Here, J is the Jacobian determinant of the transformation.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Using this transformation, we can transform our equation for each element Q_l.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"fracdx2 u_t^Q_l + u_xi^Q_l = 0 text for tinmathbbR^+ xiin-1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Here, u_t^Q_l and u_xi^Q_l denote the time and spatial derivatives of the solution on the element Q_l.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#ii.-Polynomial-approach","page":"1 Introduction to DG methods","title":"ii. Polynomial approach","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Now, we want to approximate the solution in each element Q_l by a polynomial of degree N. Since we transformed the equation, we can use the same polynomial approach for the reference coordinate xiin-1 1 in every physical element Q_l. This saves a lot of resources by reducing the amount of calculations needed and storing less information.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"For DGSEM we choose Lagrange basis functions l_j_j=0^N as our polynomial basis of degree N in -1 1. The solution in element Q_l can be approximated by","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"u(x(xi) t)big_Q_l approx u^Q_l(xi t) = sum_j=0^N u_j^Q_l(t) l_j(xi)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"with N+1 coefficients u_j^Q_l_j=0^N. By construction the Lagrange basis has some useful advantages. This basis is defined by N+1 nodes, which fulfill a Kronecker property at the exact same nodes. Let xi_i_i=0^N be these nodes.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"l_j(xi_i) = delta_ij =\nbegincases\n1 textif i=j \n0 textelse\nendcases","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Because of this property, the polynomial coefficients are exact the values of u^Q_l at the nodes","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"u^Q_l(xi_i t) = sum_j=0^N u_j^Q_l(t) underbracel_j(xi_i)_=delta_ij = u_i^Q_l(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Next, we want to select the nodes xi_i_i=0^N, which we use for the construction of the Lagrange polynomials. We choose the N+1 Gauss-Lobatto nodes, which are used for the Gaussian-Lobatto quadrature. These always contain the boundary points at -1 and +1 and are well suited as interpolation nodes. The corresponding weights will be referred to as w_j_j=0^N. In Trixi.jl the basis with Lagrange polynomials on Gauss-Lobatto nodes is already defined.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"using Trixi\npolydeg = 3 #= polynomial degree = N =#\nbasis = LobattoLegendreBasis(polydeg)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"The Gauss-Lobatto nodes are","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"nodes = basis.nodes","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"with the corresponding weights","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"weights = basis.weights","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"To illustrate how you can integrate using numerical quadrature with this Legendre-Gauss-Lobatto nodes, we give an example for f(x)=x^3. Since f is of degree 3, a polynomial interpolation with N=3 is exact. Therefore, the integral on -1 1 can be calculated by","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"beginalign*\nint_-1^1 f(x) dx = int_-1^1 Big( sum_j=0^3 f(xi_j)l_j(x) Big) dx\n= sum_j=0^3 f(xi_j) int_-1^1 l_j(x)dx \n= sum_j=0^3 f(xi_j) w_j\n= sum_j=0^3 xi_j^3 w_j\nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Let's use our nodes and weights for N=3 and plug in","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"integral = sum(nodes.^3 .* weights)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Using this polynomial approach leads to the equation","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"fracdx2 dotu^Q_l(xi t) + u^Q_l(xi t) = 0","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"with dotu=fracpartialpartial tu and u=fracpartialpartial xu. To approximate the solution, we need to get the polynomial coefficients u_j^Q_l_j=0^N for every element Q_l.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"After defining all nodes, we can implement the spatial coordinate x and its initial value u0 for every node.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"x = Matrix{Float64}(undef, length(nodes), n_elements)\nfor element in 1:n_elements\n x_l = coordinates_min + (element - 1) * dx + dx/2\n for i in 1:length(nodes)\n ξ = nodes[i] # nodes in [-1, 1]\n x[i, element] = x_l + dx/2 * ξ\n end\nend\n\nu0 = initial_condition_sine_wave.(x)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"To have a look at the initial sinus curve, we plot it.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"using Plots\nplot(vec(x), vec(u0), label=\"initial condition\", legend=:topleft)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#iii.-Variational-formulation","page":"1 Introduction to DG methods","title":"iii. Variational formulation","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"After defining the equation and initial condition, we want to implement an algorithm to approximate the solution.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"From now on, we only write u instead of u^Q_l for simplicity, but consider that all the following calculation only concern one element. Multiplying the new equation with the smooth Lagrange polynomials l_i_i=0^N (test functions) and integrating over the reference element E=-11, we get the variational formulation of our transformed partial differential equation for i=0N:","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"beginalign*\nint_-1^1 Big( fracdx2 dotu(xi t) + u(xi t) Big) l_i(xi)dxi\n = underbracefracdx2 int_-1^1 dotu(xi t) l_i(xi)dxi_textTerm I + underbraceint_-1^1 u(xi t) l_i(xi)dxi_textTerm II = 0\nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We deal with the two terms separately. We write int_-1 N^1 cdot dxi for the approximation of the integral using numerical quadrature with N+1 basis points. We use the Gauss-Lobatto nodes again. The numerical scalar product langlecdot cdotrangle_N is defined by langle f grangle_N = int_-1 N^1 f(xi) g(xi) dxi.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Term-I:","page":"1 Introduction to DG methods","title":"Term I:","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"In the following calculation we approximate the integral numerically with quadrature on the Gauss-Lobatto nodes xi_i_i=0^N and then use the Kronecker property of the Lagrange polynomials. This approach of using the same nodes for the interpolation and quadrature is called collocation.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"beginalign*\nfracdx2 int_-1^1 dotu(xi t) l_i(xi)dxi\napprox fracdx2 int_-1 N^1 dotu(xi t) l_i(xi)dxi \n= fracdx2 sum_k=0^N underbracedotu(xi_k t)_=dotu_k(t) underbracel_i(xi_k)_=delta_kiw_k \n= fracdx2 dotu_i(t) w_i\nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We define the Legendre-Gauss-Lobatto (LGL) mass matrix M and by the Kronecker property follows:","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"M_ij = langle l_j l_irangle_N = delta_ij w_j ij=0N","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"using LinearAlgebra\nM = diagm(weights)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Now, we can write the integral with this new matrix.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"fracdx2 int_-1 N^1 dotu(xi t) underlinel(xi)dxi = fracdx2 M underlinedotu(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"where underlinedotu = (dotu_0 dotu_N)^T and underlinel respectively.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Note: Since the LGL quadrature with N+1 nodes is exact up to functions of degree 2N-1 and dotu(xi t) l_i(xi) is of degree 2N, in general the following holds","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"int_-1^1 dotu(xi t) l_i(xi) dxi neq int_-1 N^1 dotu(xi t) l_i(xi) dxi","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"With an exact integration the mass matrix would be dense. Choosing numerical integrating and quadrature with the exact same nodes (collocation) leads to the sparse and diagonal mass matrix M. This is called mass lumping and has the big advantage of an easy invertation of the matrix.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Term-II:","page":"1 Introduction to DG methods","title":"Term II:","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We use spatial partial integration for the second term:","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"int_-1^1 u(xi t) l_i(xi) dxi = u l_i_-1^1 - int_-1^1 u l_idxi","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"The resulting integral can be solved exactly with LGL quadrature since the polynomial is now of degree 2N-1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Again, we split the calculation in two steps.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Surface-term","page":"1 Introduction to DG methods","title":"Surface term","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"As mentioned before, we approximate the solution with a polynomial in every element. Therefore, in general the value of this approximation at the interfaces between two elements is not unique. To solve this problem we introduce the idea of the numerical flux u^*, which will give an exact value at the interfaces. One of many different approaches and definitions for the calculation of the numerical flux we will deal with in 4. Numerical flux.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"u l_i_-1^1 = u^*big^1 l_i(+1) - u^*big_-1 l_i(-1)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Since the Gauss-Lobatto nodes contain the element boundaries -1 and +1, we can use the Kronecker property of l_i for the calculation of l_i(-1) and l_i(+1).","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"u underlinel_-1^1 = u^*big^1 left(beginarrayc 0 vdots 0 1 endarrayright)\n- u^*big_-1 left(beginarrayc 1 0 vdots 0endarrayright)\n= B underlineu^*(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"with the boundary matrix","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"B = beginpmatrix\n-1 0 cdots 0\n0 0 cdots 0\nvdots vdots 0 0\n0 cdots 0 1\nendpmatrix\nqquadtextandqquad\nunderlineu^*(t) = left(beginarrayc u^*big_-1 0 vdots 0 u^*big^1endarrayright)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"B = diagm([-1; zeros(polydeg - 1); 1])","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Volume-term","page":"1 Introduction to DG methods","title":"Volume term","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"As mentioned before, the new integral can be solved exact since the function inside is of degree 2N-1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"- int_-1^1 u l_idxi = - int_-1 N^1 u l_i dxi\n= - sum_k=0^N u(xi_k t) l_i(xi_k) w_k\n= - sum_k=0^N u_k(t) D_ki w_k","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"where D is the derivative matrix defined by D_ki = l_i(xi_k) for ik=0N.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"D = basis.derivative_matrix","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"To show why this matrix is called the derivative matrix, we go back to our example f(x)=x^3. We calculate the derivation of f at the Gauss-Lobatto nodes xi_k_k=0^N with N=8.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"f_x=xi_k = Big( sum_j=0^8 f(xi_j) l_j(x) Big)_x=xi_k = sum_j=0^8 f(xi_j) l_j(xi_k)\n= sum_j=0^8 f(xi_j) D_kj","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"for k=0N and therefore, underlinef = D underlinef.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"basis_N8 = LobattoLegendreBasis(8)\nplot(vec(x), x -> 3 * x^2, label=\"f'\", lw=2)\nscatter!(basis_N8.nodes, basis_N8.derivative_matrix * basis_N8.nodes.^3, label=\"Df\", lw=3)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Combining the volume term for every i=0N results in","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"int_-1^1 u underlinel dxi = - D^T M underlineu(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Putting all parts together we get the following equation for the element Q_l","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"fracdx2 M underlinedotu(t) = - B underlineu^*(t) + D^T M underlineu(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"or equivalent","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"underlinedotu^Q_l(t) = frac2dx Big - M^-1 B underlineu^Q_l^*(t) + M^-1 D^T M underlineu^Q_l(t)Big","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"This is called the weak form of the DGSEM.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Note: For every element Q_l we get a system of N+1 ordinary differential equations to calculate N+1 coefficients. Since the numerical flux u^* is depending on extern values at the interfaces, the equation systems of adjacent elements are weakly linked.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#numerical_flux","page":"1 Introduction to DG methods","title":"iv. Numerical flux","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"As mentioned above, we still have to handle the problem of different values at the same point at the interfaces. This happens with the ideas of the numerical flux f^*(u)=u^*. The role of f^* might seem minor in this simple example, but is important for more complicated problems. There are two values at the same spatial coordinate. Let's say we are looking at the interface between the elements Q_l and Q_l+1, while both elements got N+1 nodes as defined before. We call the first value of the right element u_R=u_0^Q_l+1 and the last one of the left element u_L=u_N^Q_l. So, for the value of the numerical flux on that interface the following holds","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"u^* = u^*(u_L u_R)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"These values are interpreted as start values of a so-called Riemann problem. There are many different (approximate) Riemann solvers available and useful for different problems. We will use the local Lax-Friedrichs flux.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"surface_flux = flux_lax_friedrichs","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"The only missing ingredient is the flux calculation at the boundaries -1 and +1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"u^Q_first^*big_-1 = u^Q_first^*big_-1(u^bound(-1) u_R)\nquadtextandquad\nu^Q_last^*big^1 = u^Q_last^*big^1(u_L u^bound(1))","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"The boundaries are periodic, which means that the last value of the last element u^Q_last_N is used as u_L at the first interface and accordingly for the other boundary.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Now, we implement a function, that calculates underlinedotu^Q_l for the given matrices, underlineu and underlineu^*.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"function rhs!(du, u, x, t)\n # Reset du and flux matrix\n du .= zero(eltype(du))\n flux_numerical = copy(du)\n\n # Calculate interface and boundary fluxes, $u^* = (u^*|_{-1}, 0, ..., 0, u^*|^1)^T$\n # Since we use the flux Lax-Friedrichs from Trixi.jl, we have to pass some extra arguments.\n # Trixi.jl needs the equation we are dealing with and an additional `1`, that indicates the\n # first coordinate direction.\n equations = LinearScalarAdvectionEquation1D(1.0)\n for element in 2:n_elements-1\n # left interface\n flux_numerical[1, element] = surface_flux(u[end, element-1], u[1, element], 1, equations)\n flux_numerical[end, element-1] = flux_numerical[1, element]\n # right interface\n flux_numerical[end, element] = surface_flux(u[end, element], u[1, element+1], 1, equations)\n flux_numerical[1, element+1] = flux_numerical[end, element]\n end\n # boundary flux\n flux_numerical[1, 1] = surface_flux(u[end, end], u[1, 1], 1, equations)\n flux_numerical[end, end] = flux_numerical[1, 1]\n\n # Calculate surface integrals, $- M^{-1} * B * u^*$\n for element in 1:n_elements\n du[:, element] -= (M \\ B) * flux_numerical[:, element]\n end\n\n # Calculate volume integral, $+ M^{-1} * D^T * M * u$\n for element in 1:n_elements\n flux = u[:, element]\n du[:, element] += (M \\ transpose(D)) * M * flux\n end\n\n # Apply Jacobian from mapping to reference element\n for element in 1:n_elements\n du[:, element] *= 2 / dx\n end\n\n return nothing\nend","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Combining all definitions and the function that calculates the right-hand side, we define the ODE and solve it until t=2 with OrdinaryDiffEq's solve function and the Runge-Kutta method RDPK3SpFSAL49(), which is optimized for discontinuous Galerkin methods and hyperbolic PDEs. We set some common error tolerances abstol=1.0e-6, reltol=1.0e-6 and pass save_everystep=false to avoid saving intermediate solution vectors in memory.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"using OrdinaryDiffEq\ntspan = (0.0, 2.0)\node = ODEProblem(rhs!, u0, tspan, x)\n\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)\n\nplot(vec(x), vec(sol.u[end]), label=\"solution at t=$(tspan[2])\", legend=:topleft, lw=3)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Alternative-Implementation-based-on-Trixi.jl","page":"1 Introduction to DG methods","title":"Alternative Implementation based on Trixi.jl","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Now, we implement the same example. But this time, we directly use the functionality that Trixi.jl provides.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"using Trixi, OrdinaryDiffEq, Plots","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"First, define the equation with a advection_velocity of 1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"advection_velocity = 1.0\nequations = LinearScalarAdvectionEquation1D(advection_velocity)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Then, create a DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux. The implementation of the basis and the numerical flux is now already done.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We will now create a mesh with 16 elements for the physical domain [-1, 1] with periodic boundaries. We use Trixi.jl's standard mesh TreeMesh. Since it's limited to hypercube domains, we choose 2^4=16 elements. The mesh type supports AMR, that' why n_cells_max has to be set, even if we don't need AMR here.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"coordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4, # number of elements = 2^4\n n_cells_max=30_000) # set maximum capacity of tree data structure (only needed for AMR)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"A semidiscretization collects data structures and functions for the spatial discretization. In Trixi.jl, an initial condition has the following parameter structure and is of the type SVector.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"initial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"Again, combining all definitions and the function that calculates the right-hand side, we define the ODE and solve it until t=2 with OrdinaryDiffEq's solve function and the Runge-Kutta method RDPK3SpFSAL49().","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"tspan = (0.0, 2.0)\node_trixi = semidiscretize(semi, tspan)\n\nsol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);\nnothing #hide","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"We add a plot of the new approximated solution to the one calculated before.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"plot!(sol_trixi, label=\"solution at t=$(tspan[2]) with Trixi.jl\", legend=:topleft, linestyle=:dash, lw=2)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Summary-of-the-code","page":"1 Introduction to DG methods","title":"Summary of the code","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"To sum up, here is the complete code that we used.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Raw-implementation","page":"1 Introduction to DG methods","title":"Raw implementation","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"# basis: Legendre-Gauss-Lobatto\nusing Trixi, LinearAlgebra, OrdinaryDiffEq, Plots\npolydeg = 3 #= polynomial degree =#\nbasis = LobattoLegendreBasis(polydeg)\nnodes = basis.nodes # Gauss-Lobatto nodes in [-1, 1]\nD = basis.derivative_matrix\nM = diagm(basis.weights) # mass matrix\nB = diagm([-1; zeros(polydeg - 1); 1])\n\n# mesh\ncoordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate\nn_elements = 16 # number of elements\n\ndx = (coordinates_max - coordinates_min) / n_elements # length of one element\n\nx = Matrix{Float64}(undef, length(nodes), n_elements)\nfor element in 1:n_elements\n x_l = -1 + (element - 1) * dx + dx/2\n for i in 1:length(nodes) # basis points in [-1, 1]\n ξ = nodes[i]\n x[i, element] = x_l + dx/2 * ξ\n end\nend\n\n# initial condition\ninitial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)\nu0 = initial_condition_sine_wave.(x)\n\nplot(vec(x), vec(u0), label=\"initial condition\", legend=:topleft)\n\n# flux Lax-Friedrichs\nsurface_flux = flux_lax_friedrichs\n\n# rhs! method\nfunction rhs!(du, u, x, t)\n # reset du\n du .= zero(eltype(du))\n flux_numerical = copy(du)\n\n # calculate interface and boundary fluxes\n equations = LinearScalarAdvectionEquation1D(1.0)\n for element in 2:n_elements-1\n # left interface\n flux_numerical[1, element] = surface_flux(u[end, element-1], u[1, element], 1, equations)\n flux_numerical[end, element-1] = flux_numerical[1, element]\n # right interface\n flux_numerical[end, element] = surface_flux(u[end, element], u[1, element+1], 1, equations)\n flux_numerical[1, element+1] = flux_numerical[end, element]\n end\n # boundary flux\n flux_numerical[1, 1] = surface_flux(u[end, end], u[1, 1], 1, equations)\n flux_numerical[end, end] = flux_numerical[1, 1]\n\n # calculate surface integrals\n for element in 1:n_elements\n du[:, element] -= (M \\ B) * flux_numerical[:, element]\n end\n\n # calculate volume integral\n for element in 1:n_elements\n flux = u[:, element]\n du[:, element] += (M \\ transpose(D)) * M * flux\n end\n\n # apply Jacobian from mapping to reference element\n for element in 1:n_elements\n du[:, element] *= 2 / dx\n end\n\n return nothing\nend\n\n# create ODE problem\ntspan = (0.0, 2.0)\node = ODEProblem(rhs!, u0, tspan, x)\n\n# solve\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)\n\nplot(vec(x), vec(sol.u[end]), label=\"solution at t=$(tspan[2])\", legend=:topleft, lw=3)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Alternative-Implementation-based-on-Trixi.jl-2","page":"1 Introduction to DG methods","title":"Alternative Implementation based on Trixi.jl","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"using Trixi, OrdinaryDiffEq, Plots\n\n# equation with a advection_velocity of `1`.\nadvection_velocity = 1.0\nequations = LinearScalarAdvectionEquation1D(advection_velocity)\n\n# create DG solver with flux lax friedrichs and LGL basis\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n\n# distretize domain with `TreeMesh`\ncoordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4, # number of elements = 2^4\n n_cells_max=30_000)\n\n# create initial condition and semidiscretization\ninitial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)\n\n# solve\ntspan = (0.0, 2.0)\node_trixi = semidiscretize(semi, tspan)\nsol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);\n\nplot!(sol_trixi, label=\"solution at t=$(tspan[2]) with Trixi.jl\", legend=:topleft, linestyle=:dash, lw=2)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Package-versions","page":"1 Introduction to DG methods","title":"Package versions","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"1 Introduction to DG methods","title":"1 Introduction to DG methods","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference-trixi2vtk/#Trixi2Vtk.jl-API","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.jl API","text":"","category":"section"},{"location":"reference-trixi2vtk/","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.jl","text":"CurrentModule = Trixi2Vtk","category":"page"},{"location":"reference-trixi2vtk/","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.jl","text":"Modules = [Trixi2Vtk]","category":"page"},{"location":"reference-trixi2vtk/#Trixi2Vtk.trixi2vtk-Tuple{Vararg{AbstractString}}","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.trixi2vtk","text":"trixi2vtk(filename::AbstractString...;\n format=:vtu, verbose=false, hide_progress=false, pvd=nothing,\n output_directory=\".\", nvisnodes=nothing, save_celldata=true,\n reinterpolate=true, data_is_uniform=false)\n\nConvert Trixi-generated output files to VTK files (VTU or VTI).\n\nArguments\n\nfilename: One or more Trixi solution/restart/mesh files to convert to a VTK file. Filenames support file globbing, e.g., \"solution*\" to match all files starting with solution.\nformat: Output format for solution/restart files. Can be 'vtu' or 'vti'.\nverbose: Set to true to enable verbose output.\nhide_progress: Hide progress bar (will be hidden automatically if verbose is true).\npvd: Use this filename to store PVD file (instead of auto-detecting name). Note that only the name will be used (directory and file extension are ignored).\noutput_directory: Output directory where generated files are stored.\nnvisnodes: Number of visualization nodes per element. (default: number of DG nodes for StructuredMesh or UnstructuredMesh2D, twice the number of DG nodes for TreeMesh). A value of 0 (zero) uses the number of nodes in the DG elements.\nsave_celldata: Boolean value to determine if cell-based data should be saved. (default: true)\nreinterpolate: Boolean value to determine if data should be reinterpolated onto uniform points. When false the raw data at the compute nodes is copied into the appropriate format. (default: true)\ndata_is_uniform: Boolean to indicate if the data to be converted is from a finite difference method on a uniform grid of points. (default: false)\n\nExamples\n\njulia> trixi2vtk(\"out/solution_000*.h5\")\n[...]\n\n\n\n\n\n","category":"method"}] +[{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"EditURL = \"../../literate/src/files/adaptive_mesh_refinement.jl\"","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#adaptive_mesh_refinement","page":"14 Adaptive mesh refinement","title":"14: Adaptive mesh refinement","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Adaptive mesh refinement (AMR) is a method of adapting the resolution of the numerical method to the solution features such as turbulent regions or shocks. In those critical regions of the domain, we want the simulation to use elements with smaller mesh sizes compared to other regions. This should be automatically and dynamically adapted during the run of the simulation.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Implementation-in-Trixi.jl","page":"14 Adaptive mesh refinement","title":"Implementation in Trixi.jl","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"In Trixi.jl, AMR is possible for the mesh types TreeMesh and P4estMesh. Both meshes are organized in a tree structure and therefore, each element can be refined independently. In Trixi.jl, AMR is restricted to a 2:1 refinement ratio between neighbor elements. This means that the maximum resolution difference of neighboring elements is a factor of two.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"The implementation of AMR is divided into different steps. The basic refinement setting contains an indicator and a controller. These are added to the simulation by using an AMR callback.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Indicators","page":"14 Adaptive mesh refinement","title":"Indicators","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"An indicator estimates the current accuracy of the numerical approximation. It indicates which regions of the domain need finer or coarser resolutions. In Trixi.jl, you can use for instance IndicatorLöhner and IndicatorHennemannGassner.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"IndicatorLöhner (also callable with IndicatorLoehner) is an interpretation and adaptation of a FEM indicator by Löhner (1987) and estimates a weighted second derivative of a specified variable locally.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_indicator = IndicatorLöhner(semi, variable=variable)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"All indicators have the parameter variable which is used to specify the variable for the indicator calculation. You can use for instance density, pressure or density_pressure for the compressible Euler equations. Moreover, you have the option to use simply the first conservation variable with first for any equations. This might be a good choice for a starting example.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"IndicatorHennemannGassner, also used as a shock-capturing indicator, was developed by Hennemann et al. (2021) and is explained in detail in the tutorial about shock-capturing. It can be constructed as follows.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_indicator = IndicatorHennemannGassner(semi,\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable=variable)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Another indicator is the very basic IndicatorMax. It indicates the maximal value of a variable and is therefore mostly used for verification and testing. But it might be useful for the basic understanding of the implementation of indicators and AMR in Trixi.jl.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_indicator = IndicatorMax(semi, variable=variable)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Controllers","page":"14 Adaptive mesh refinement","title":"Controllers","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"The spatial discretization into elements is tree-based for both AMR supporting mesh types TreeMesh and P4estMesh. Thus, the higher the level in the tree the higher the level of refinement. For instance, a mesh element of level 3 has double resolution in each direction compared to another element with level 2.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"To map specific indicator values to a desired level of refinement, Trixi.jl uses controllers. They are build in three levels: There is a base level of refinement base_level, which is the minimum allowed refinement level. Then, there is a medium level med_level, which corresponds to the initial level of refinement, for indicator values above the threshold med_threshold and equally, a maximal level max_level for values above max_threshold. This variant of controller is called ControllerThreeLevel in Trixi.jl.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_controller = ControllerThreeLevel(semi, amr_indicator;\n base_level=4,\n med_level=5, med_threshold=0.1,\n max_level=6, max_threshold=0.6)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"You can also set med_level=0 to use the current level as target, see the docstring of ControllerThreeLevel.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"An extension is ControllerThreeLevelCombined, which uses two different indicators. The primary indicator works the same as the single indicator for ControllerThreeLevel. The second indicator with its own maximum threshold adds the property, that the target level is set to max_level additionally if this indicator's value is greater than max_threshold_secondary. This is for instance used to assure that a shock has always the maximum refinement level.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_controller = ControllerThreeLevelCombined(semi, indicator_primary, indicator_secondary;\n base_level=2,\n med_level=6, med_threshold=0.0003,\n max_level=8, max_threshold=0.003,\n max_threshold_secondary=0.3)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"This controller is for instance used in elixir_euler_astro_jet_amr.jl.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Callback","page":"14 Adaptive mesh refinement","title":"Callback","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"The AMR indicator and controller are added to the simulation through the callback AMRCallback. It contains a semidiscretization semi, the controller amr_controller and the parameters interval, adapt_initial_condition, and adapt_initial_condition_only_refine.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Adaptive mesh refinement will be performed every interval time steps. adapt_initial_condition indicates whether the initial condition already should be adapted before the first time step. And with adapt_initial_condition_only_refine=true the mesh is only refined at the beginning but not coarsened.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_callback = AMRCallback(semi, amr_controller,\n interval=5,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Exemplary-simulation","page":"14 Adaptive mesh refinement","title":"Exemplary simulation","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Here, we want to implement a simple AMR simulation of the 2D linear advection equation for a Gaussian pulse.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"using OrdinaryDiffEq\nusing Trixi\n\nadvection_velocity = (0.2, -0.7)\nequations = LinearScalarAdvectionEquation2D(advection_velocity)\n\ninitial_condition = initial_condition_gauss\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n\ncoordinates_min = (-5.0, -5.0)\ncoordinates_max = ( 5.0, 5.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n n_cells_max=30_000)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n\n\ntspan = (0.0, 10.0)\node = semidiscretize(semi, tspan);\nnothing #hide","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"For the best understanding about indicators and controllers, we use the simple AMR indicator IndicatorMax. As described before, it returns the maximal value of the specified variable (here the only conserved variable). Therefore, regions with a high maximum are refined. This is not really useful numerical application, but a nice demonstration example.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_indicator = IndicatorMax(semi, variable=first)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"These values are transferred to a refinement level with the ControllerThreeLevel, such that every element with maximal value greater than 0.1 is refined once and elements with maximum above 0.6 are refined twice.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"amr_controller = ControllerThreeLevel(semi, amr_indicator,\n base_level=4,\n med_level=5, med_threshold=0.1,\n max_level=6, max_threshold=0.6)\n\namr_callback = AMRCallback(semi, amr_controller,\n interval=5,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true)\n\nstepsize_callback = StepsizeCallback(cfl=0.9)\n\ncallbacks = CallbackSet(amr_callback, stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Running the simulation.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"We plot the solution and add the refined mesh at the end of the simulation.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#More-examples","page":"14 Adaptive mesh refinement","title":"More examples","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Trixi.jl provides many elixirs using AMR. We want to give some examples for different mesh types:","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"elixir_euler_blast_wave_amr.jl for TreeMesh and P4estMesh\nelixir_euler_kelvin_helmholtz_instability_amr.jl for TreeMesh\nelixir_euler_double_mach_amr.jl for P4estMesh","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Animations of more interesting and complicated AMR simulations can be found below and on Trixi.jl's youtube channel \"Trixi Framework\".","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"First, we give a purely hyperbolic simulation of a Sedov blast wave with self-gravity. This simulation uses the mesh type TreeMesh as we did and the AMR indicator IndicatorHennemannGassner.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":" \n
","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Source: Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"The next example is a numerical simulation of an ideal MHD rotor on an unstructured AMR mesh. The used mesh type is a P4estMesh.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":" \n
","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"Source: Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"For more information, please have a look at the respective links.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/#Package-versions","page":"14 Adaptive mesh refinement","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"","category":"page"},{"location":"tutorials/adaptive_mesh_refinement/","page":"14 Adaptive mesh refinement","title":"14 Adaptive mesh refinement","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"EditURL = \"../../literate/src/files/structured_mesh_mapping.jl\"","category":"page"},{"location":"tutorials/structured_mesh_mapping/#structured_mesh_mapping","page":"15 Structured mesh with curvilinear mapping","title":"15: Structured mesh with curvilinear mapping","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Here, we want to introduce another mesh type of Trixi.jl. More precisely, this tutorial is about the curved mesh type StructuredMesh supporting curved meshes.","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Creating-a-curved-mesh","page":"15 Structured mesh with curvilinear mapping","title":"Creating a curved mesh","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"There are two basic options to define a curved StructuredMesh in Trixi.jl. You can implement curves for the domain boundaries, or alternatively, set up directly the complete transformation mapping. We now present one short example each.","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Mesh-defined-by-domain-boundary-curves","page":"15 Structured mesh with curvilinear mapping","title":"Mesh defined by domain boundary curves","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Both examples are based on a semdiscretization of the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"using OrdinaryDiffEq\nusing Trixi\n\nequations = CompressibleEulerEquations2D(1.4)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"We start with a pressure perturbation at (xs, 0.0) as initial condition.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"function initial_condition_pressure_perturbation(x, t, equations::CompressibleEulerEquations2D)\n xs = 1.5 # location of the initial disturbance on the x axis\n w = 1/8 # half width\n p = exp(-log(2) * ((x[1]-xs)^2 + x[2]^2)/w^2) + 1.0\n v1 = 0.0\n v2 = 0.0\n rho = 1.0\n\n return prim2cons(SVector(rho, v1, v2, p), equations)\nend\ninitial_condition = initial_condition_pressure_perturbation","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Initialize every boundary as a boundary_condition_slip_wall.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"boundary_conditions = boundary_condition_slip_wall","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"The approximation setup is an entropy-stable split-form DG method with polydeg=4. We are using the two fluxes flux_ranocha and flux_lax_friedrichs.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"solver = DGSEM(polydeg=4, surface_flux=flux_lax_friedrichs,\n volume_integral=VolumeIntegralFluxDifferencing(flux_ranocha))","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"We want to define a circular cylinder as physical domain. It contains an inner semicircle with radius r0 and an outer semicircle of radius r1.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"(Image: )","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"The domain boundary curves with curve parameter in -11 are sorted as shown in the sketch. They always are orientated from negative to positive coordinate, such that the corners have to fit like this f_1(+1) = f_4(-1), f_3(+1) = f_2(-1), etc.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"In our case we can define the domain boundary curves as follows:","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"r0 = 0.5 # inner radius\nr1 = 5.0 # outer radius\nf1(xi) = SVector( r0 + 0.5 * (r1 - r0) * (xi + 1), 0.0) # right line\nf2(xi) = SVector(-r0 - 0.5 * (r1 - r0) * (xi + 1), 0.0) # left line\nf3(eta) = SVector(r0 * cos(0.5 * pi * (eta + 1)), r0 * sin(0.5 * pi * (eta + 1))) # inner circle\nf4(eta) = SVector(r1 * cos(0.5 * pi * (eta + 1)), r1 * sin(0.5 * pi * (eta + 1))) # outer circle","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"We create a curved mesh with 16 x 16 elements. The defined domain boundary curves are passed as a tuple.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"cells_per_dimension = (16, 16)\nmesh = StructuredMesh(cells_per_dimension, (f1, f2, f3, f4), periodicity=false)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Then, we define the simulation with endtime T=3 with semi, ode and callbacks.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_conditions)\n\ntspan = (0.0, 3.0)\node = semidiscretize(semi, tspan)\n\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi, interval=analysis_interval)\n\nalive_callback = AliveCallback(analysis_interval=analysis_interval)\n\nstepsize_callback = StepsizeCallback(cfl=0.9)\n\ncallbacks = CallbackSet(analysis_callback,\n alive_callback,\n stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Running the simulation","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\n\nusing Plots\nplot(sol)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"pd = PlotData2D(sol)\nplot(pd[\"p\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Mesh-directly-defined-by-the-transformation-mapping","page":"15 Structured mesh with curvilinear mapping","title":"Mesh directly defined by the transformation mapping","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"As mentioned before, you can also define the domain for a StructuredMesh by directly setting up a transformation mapping. Here, we want to present a nice mapping, which is often used to test free-stream preservation. Exact free-stream preservation is a crucial property of any numerical method on curvilinear grids. The mapping is a reduced 2D version of the mapping described in Rueda-Ramírez et al. (2021), p.18.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"using OrdinaryDiffEq\nusing Trixi\n\nequations = CompressibleEulerEquations2D(1.4)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"As mentioned, this mapping is used for testing free-stream preservation. So, we use a constant initial condition.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"initial_condition = initial_condition_constant\n\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"We define the transformation mapping with variables in -1 1 as described in Rueda-Ramírez et al. (2021), p.18 (reduced to 2D):","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"function mapping(xi_, eta_)\n # Transform input variables between -1 and 1 onto [0,3]\n xi = 1.5 * xi_ + 1.5\n eta = 1.5 * eta_ + 1.5\n\n y = eta + 3/8 * (cos(1.5 * pi * (2 * xi - 3)/3) *\n cos(0.5 * pi * (2 * eta - 3)/3))\n\n x = xi + 3/8 * (cos(0.5 * pi * (2 * xi - 3)/3) *\n cos(2 * pi * (2 * y - 3)/3))\n\n return SVector(x, y)\nend","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Instead of a tuple of boundary functions, the mesh now has the mapping as its parameter.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"cells_per_dimension = (16, 16)\nmesh = StructuredMesh(cells_per_dimension, mapping)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan)\n\nanalysis_callback = AnalysisCallback(semi, interval=250)\n\nstepsize_callback = StepsizeCallback(cfl=0.8)\n\ncallbacks = CallbackSet(analysis_callback,\n stepsize_callback)\n\nsol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Now, we want to verify the free-stream preservation property and plot the mesh. For the verification, we calculate the absolute difference of the first conservation variable density u[1] and 1.0. To plot this error and the mesh, we are using the visualization feature ScalarPlotData2D, explained in visualization.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"error_density = let u = Trixi.wrap_array(sol.u[end], semi)\n abs.(u[1, :, :, :] .- 1.0) # density, x, y, elements\nend\npd = ScalarPlotData2D(error_density, semi)\n\nusing Plots\nplot(pd, title=\"Error in density\")\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"We observe that the errors in the variable density are at the level of machine accuracy. Moreover, the plot shows the mesh structure resulting from our transformation mapping.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"Of course, you can also use other mappings as for instance shifts by (x y)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"mapping(xi, eta) = SVector(xi + x, eta + y)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"or rotations with a rotation matrix T","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"mapping(xi, eta) = T * SVector(xi, eta).","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"For more curved mesh mappings, please have a look at some elixirs for StructuredMesh. For another curved mesh type, there is a tutorial about Trixi.jl's unstructured mesh type [UnstructuredMesh2D] and its use of the High-Order Hex-Quad Mesh (HOHQMesh) generator, created and developed by David Kopriva.","category":"page"},{"location":"tutorials/structured_mesh_mapping/#Package-versions","page":"15 Structured mesh with curvilinear mapping","title":"Package versions","text":"","category":"section"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"","category":"page"},{"location":"tutorials/structured_mesh_mapping/","page":"15 Structured mesh with curvilinear mapping","title":"15 Structured mesh with curvilinear mapping","text":"This page was generated using Literate.jl.","category":"page"},{"location":"github-git/#GitHub-and-Git","page":"GitHub & Git","title":"GitHub & Git","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"This page contains information on how to use GitHub and Git when developing Trixi.jl.","category":"page"},{"location":"github-git/#Development-workflow","page":"GitHub & Git","title":"Development workflow","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"For adding modifications to Trixi.jl, we generally follow these steps:","category":"page"},{"location":"github-git/#Create-an-issue-(optional)","page":"GitHub & Git","title":"Create an issue (optional)","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"In many cases it makes sense to start by creating an issue on GitHub. For example, if the implementation approach for a new feature is not yet clear or if there should be a discussion about the desired outcome, it is good practice to first get a consensus on what is the expected result of this modification. A GitHub issue is the place to lead this discussion, as it preserves it in the project and - together with the actual code changes - allows in the future to revisit the reasons for a particular choice of implementation or feature.","category":"page"},{"location":"github-git/#Create-a-branch-and-*immediately*-create-a-pull-request","page":"GitHub & Git","title":"Create a branch and immediately create a pull request","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"All feature development, bug fixes etc. should be developed in a branch and not directly on main. If you do not have write access to the main repository on GitHub, first create a fork of the Trixi.jl repository and clone the fork to your machine. Then, create a branch locally by executing git checkout -b yourbranch, push it to the repository, and create a pull request (PR).","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If you have already cloned Trixi.jl from the main repo to your local machine, you can also work in that clone. You just need to add your fork as additional remote repository and push your new branch there.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"git remote add myfork git@github.com:YOUR_NAME/Trixi.jl.git\n# get latest main from the main repo\ngit checkout main\ngit pull\n# create a new branch for a cool new feature, bug fix, ...\ngit checkout -b YOUR_BRANCH_NAME\n# do some work and push it to your fork\ngit push -u myfork\n# go to https://github.com/trixi-framework/Trixi.jl/pull\n# and create a PR from your new branch","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"info: Why using pull requests?\nImmediately creating a PR for your branch has the benefit that all code discussions can now be held directly next to the corresponding code. Also, the PR allows to easily compare your branch to the upstream branch (usually main) to see what you have changed. Moreover, tests will run automatically.","category":"page"},{"location":"github-git/#Make-changes","page":"GitHub & Git","title":"Make changes","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"With a branch and PR in place, you can now write your code and commit it to your branch. If you request feedback from someone else, make sure to push your branch to the repository such that the others can easily review your changes or dive in and change something themselves.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"warning: Avoid committing unwanted files\nWhen you use git add . or similar catch-all versions, make sure you do not accidentally commit unwanted files (e.g., Trixi.jl output files, images or videos etc.). If it happens anyways, you can undo the last commit (also multiple times) by running git reset HEAD~ (see also Undo last commit). However, this strategy only works if you have not yet pushed your changes. If you did push your changes, please talk to one of the core developers on how to proceed.","category":"page"},{"location":"github-git/#Keep-your-branch-in-sync-with-main","page":"GitHub & Git","title":"Keep your branch in sync with main","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"For larger features with longer-living branches, it may make sense to synchronize your branch with the current main, e.g., if there was a bug fix in main that is relevant for you. In this case, perform the following steps to merge the current main to your branch:","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Commit all your local changes to your branch and push it. This allows you to delete your clone in case you make a mistake and need to abort the merge.\nExecute git fetch to get the latest changes from the repository.\nMake sure you are in the correct branch by checking the output of git status or by running git checkout yourbranch.\nMerge main using git merge main. If there were no conflicts, hooray!, you are done. Otherwise you need to resolve your merge conflicts and commit the changes afterwards. A good guide for resolving merge conflicts can be found here.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"In general, always use git merge and not git rebase to get the latest changes from main. It is less error-prone and does not create problems on branches that are worked on collaboratively.","category":"page"},{"location":"github-git/#Prepare-for-review","page":"GitHub & Git","title":"Prepare for review","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If you feel like your branch is ready to be merged to main, prepare it for review. That is, you should","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"merge the current main to your branch\nrun tests if available, but at least ensure that you did not accidentally change the results for one of the existing example elixirs\nproperly comment your code\ndelete old/unused code, especially commented lines (unless they contain helpful code, in which case you should add a comment on why you keep this around)\nremove debug statements\nadd a elixir_xxx.jl that uses your feature (only relevant for new features)\nmake sure your code formatting adheres to the Style guide\ndescribe changes in NEWS.md if appropriate","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"After you are confident that your branch is cleaned up properly, commit all changes and push them to the repository.","category":"page"},{"location":"github-git/#Get-reviewed","page":"GitHub & Git","title":"Get reviewed","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Ask one of the core developers to review your code. Sometimes this will be done directly, either face-to-face or via a video call. Other times a review will be conducted asynchronously, with the reviewer leaving comments and annotations. In some cases it will be necessary to do multiple rounds of reviews, especially if there are larger changes to be added. Just commit and push your changes to your branch, and the corresponding pull request will be updated automatically.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Please note that a review has nothing to do with the lack of experience of the person developing changes: We try to review all code before it gets added to main, even from the most experienced developers. This is good practice and helps to keep the error rate low while ensuring that the code is developed in a consistent fashion. Furthermore, do not take criticism of your code personally - we just try to keep Trixi.jl as accessible and easy to use for everyone.","category":"page"},{"location":"github-git/#Merge-branch","page":"GitHub & Git","title":"Merge branch","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Once your branch is reviewed and declared ready for merging by the reviewer, make sure that all the latest changes have been pushed. Then, one of the developers will merge your PR. If you are one of the developers, you can also go to the pull request page on GitHub and and click on Merge pull request. Voilà, you are done! Your branch will have been merged to main and the source branch will have been deleted in the GitHub repository (if you are not working in your own fork).","category":"page"},{"location":"github-git/#Update-your-working-copy","page":"GitHub & Git","title":"Update your working copy","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Once you have merged your branch by accepting the PR on GitHub, you should clean up your local working copy of the repository by performing the following steps:","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Update your clone by running git fetch.\nCheck out main using git checkout main.\nDelete merged branch locally with git branch -d yourbranch.\nRemove local references to deleted remote branch by executing git remote prune origin.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"You can now proceed with your next changes by starting again at the top.","category":"page"},{"location":"github-git/#Using-Git","page":"GitHub & Git","title":"Using Git","text":"","category":"section"},{"location":"github-git/#Resources-for-learning-Git","page":"GitHub & Git","title":"Resources for learning Git","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Here are a few resources for learning do use Git that at least one of us found helpful in the past (roughly ordered from novice to advanced to expert):","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Git Handbook by GitHub\nLearn Git Branching","category":"page"},{"location":"github-git/#Tips-and-tricks","page":"GitHub & Git","title":"Tips and tricks","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"This is an unordered collection of different tips and tricks that can be helpful while working with Git. As usual, your mileage might vary.","category":"page"},{"location":"github-git/#Undo-last-commit","page":"GitHub & Git","title":"Undo last commit","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If you made a mistake in your last commit, e.g., by committing an unwanted file, you can undo the latest commit by running","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"git reset HEAD~","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"This only works if you have not yet pushed your branch to the GitHub repository. In this case, please talk to one of the core developers on how to proceed. Especially when you accidentally committed a large file (image, or video), please let us know as fast as possible, since the effort to fix the repository grows considerably over time.","category":"page"},{"location":"github-git/#Remove-large-file-from-repository","page":"GitHub & Git","title":"Remove large file from repository","text":"","category":"section"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"If a large file was accidentally committed and pushed to the Trixi.jl repository, please talk to one of the core developers as soon as possible so that they can fix it.","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"danger: Large files\nYou should never try to fix this yourself, as it potentially disrupts/destroys the work of others!","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Based on the instructions found here and here, the following steps need to be taken (as documented for GitLab in issue #33):","category":"page"},{"location":"github-git/","page":"GitHub & Git","title":"GitHub & Git","text":"Tell everyone to commit and push their changes to the repository.\nFix the branch in which the file was committed by removing it and committing the removal. This is especially important on main.\nPerform the following steps to clean up the Git repository:\ncd /tmp\n\n# Download bfg-1.13.0.jar from https://rtyley.github.io/bfg-repo-cleaner/\n\n# Get fresh clone of repo (so you can throw it away in case there is a problem)\ngit clone --mirror git@github.com:trixi-framework/Trixi.jl.git\n\n# Clean up repo of all files larger than 10M\njava -jar bfg-1.13.0.jar --strip-blobs-bigger-than 10M Trixi.jl.git\n\n# Enter repo\ncd Trixi.jl.git\n\n# Clean up reflog and force aggressive garbage collection\ngit reflog expire --expire=now --all && git gc --prune=now --aggressive\n\n# Push changes\ngit push\n\n# Delete clone\nrm -rf Trixi.jl.git\nTell everyone to clean up their local working copies by performing the following steps (also do this yourself):\n# Enter repo\ncd Trixi.jl\n\n# Get current changes\ngit fetch\n\n# Check out the fixed branch\ngit checkout branchname\n\n# IMPORTANT: Do a rebase instead of a pull!\ngit rebase\n\n# Clean reflog and force garbage collection\ngit reflog expire --expire=now --all && git gc --prune=now --aggressive\nIMPORTANT: You need to do a git rebase instead of a git pull when updating the fixed branch.","category":"page"},{"location":"testing/#Testing","page":"Testing","title":"Testing","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"During the development of Trixi.jl, we rely on continuous testing to ensure that modifications or new features do not break existing functionality or add other errors. In the main Trixi.jl repository (and the repositories for the visualization tool Trixi2Vtk), this is facilitated by GitHub Actions, which allows to run tests automatically upon certain events. When, how, and what is tested by GitHub Actions is controlled by the workflow file .github/workflows/ci.yml. In Trixi.jl and its related repositories, tests are triggered by","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"each git push to main and\neach git push to any pull request.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"Besides checking functionality, we also analyse the Test coverage to ensure that we do not miss important parts during testing.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"note: Test and coverage requirements\nBefore merging a pull request (PR) to main, we require thatthe code passes all functional tests\ncode coverage does not decrease.","category":"page"},{"location":"testing/#Testing-setup","page":"Testing","title":"Testing setup","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"The entry point for all testing is the file test/runtests.jl, which is run by the automated tests and which can be triggered manually by executing","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"julia> using Pkg; Pkg.test(\"Trixi\")","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"in the REPL. Since there already exist many tests, we have split them up into multiple files in the test directory to allow for faster testing of individual parts of the code. Thus in addition to performing all tests, you can also just include one of the files named test_xxx.jl to run only a specific subset, e.g.,","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"julia> # Run all 2D tests on the P4estMesh\n include(joinpath(\"test\", \"test_p4est_2d.jl\"))\n\njulia> # Run all 1D tests for the Euler equations on the TreeMesh\n include(joinpath(\"test\", \"test_tree_1d_euler.jl\"))","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"For the automated tests with GitHub Actions, we run multiple jobs in parallel to reduce the waiting time until all tests are finished. You can see the different components that are run as jobs by looking at the TRIXI_TEST variable in test/runtests.jl.","category":"page"},{"location":"testing/#Adding-new-tests","page":"Testing","title":"Adding new tests","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"We use Julia's built-in unit testing capabilities to configure tests. In general, newly added code must be covered by at least one test, and all new elixirs added to the examples/ directory must be used at least once during testing. New tests should be added to the corresponding test/test_xxx.jl file, e.g., a test involving the 3D linear advection equation on the TreeMesh would go into test/test_tree_3d_advection.jl. Please study one of the existing tests and stay consistent to the current style when creating new tests.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"Since we want to test as much as possible, we have a lot of tests and frequently create new ones. Naturally, this increases the time to wait for all tests to pass with each novel feature added to Trixi.jl. Therefore, new tests should be as short as reasonably possible, i.e., without being too insensitive to pick up changes or errors in the code.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"When you add new tests, please check whether all CI jobs still take approximately the same time. If the job where you added new tests takes much longer than everything else, please consider moving some tests from one job to another (or report this incident and ask the main developers for help).","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"note: Test duration\nAs a general rule, tests should last no more than 10 seconds when run with a single thread and after compilation (i.e., excluding the first run).","category":"page"},{"location":"testing/#Test-coverage","page":"Testing","title":"Test coverage","text":"","category":"section"},{"location":"testing/","page":"Testing","title":"Testing","text":"In addition to ensuring that the code produces the expected results, the automated tests also record the code coverage. The resulting coverage reports, i.e., which lines of code were executed by at least one test and are thus considered \"covered\" by testing, are automatically uploaded to Coveralls for easy analysis. Typically, you see a number of Coveralls results at the bottom of each pull request: One for each parallel job (see Testing setup), which can usually be ignored since they only cover parts of the code by definition, and a cumulative coverage result named coverage/coveralls. The \"Details\" link takes you to a detailed report on which lines of code are covered by tests, which ones are missed, and especially which new lines the pull requests adds to Trixi.jl's code base that are not yet covered by testing.","category":"page"},{"location":"testing/","page":"Testing","title":"Testing","text":"note: Coverage requirements\nIn general, we require pull requests to not decrease the overall test coverage percentage in main, with a hard lower bound of 97%.","category":"page"},{"location":"authors/#Authors","page":"Authors","title":"Authors","text":"","category":"section"},{"location":"authors/","page":"Authors","title":"Authors","text":"Trixi.jl's development is coordinated by a group of principal developers, who are also its main contributors and who can be contacted in case of questions about Trixi.jl. In addition, there are contributors who have provided substantial additions or modifications. Together, these two groups form \"The Trixi.jl Authors\" as mentioned under License.","category":"page"},{"location":"authors/#Principal-Developers","page":"Authors","title":"Principal Developers","text":"","category":"section"},{"location":"authors/","page":"Authors","title":"Authors","text":"Michael Schlottke-Lakemper, RWTH Aachen University/High-Performance Computing Center Stuttgart (HLRS), Germany\nGregor Gassner, University of Cologne, Germany\nHendrik Ranocha, Johannes Gutenberg University Mainz, Germany\nAndrew Winters, Linköping University, Sweden\nJesse Chan, Rice University, US","category":"page"},{"location":"authors/#Contributors","page":"Authors","title":"Contributors","text":"","category":"section"},{"location":"authors/","page":"Authors","title":"Authors","text":"The following people contributed major additions or modifications to Trixi.jl and are listed in alphabetical order:","category":"page"},{"location":"authors/","page":"Authors","title":"Authors","text":"Maximilian D. Bertrand\nBenjamin Bolm\nSimon Candelaresi\nJesse Chan\nLars Christmann\nChristof Czernik\nDaniel Doehring\nPatrick Ersing\nErik Faulhaber\nGregor Gassner\nLucas Gemein\nSven Goldberg\nJoshua Lampert\nJulia Odenthal\nSigrun Ortleb\nHendrik Ranocha\nAndrés M. Rueda-Ramírez\nFelipe Santillan\nMichael Schlottke-Lakemper\nToskan Theine\nAndrew Winters","category":"page"},{"location":"license/#License","page":"License","title":"License","text":"","category":"section"},{"location":"license/","page":"License","title":"License","text":"MIT LicenseCopyright (c) 2020-present The Trixi.jl Authors (see Authors)Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","category":"page"},{"location":"restart/#restart","page":"Restart simulation","title":"Restart simulation","text":"","category":"section"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"You can continue running an already finished simulation by first preparing the simulation for the restart and then performing the restart. Here we suppose that in the first run your simulation stops at time 1.0 and then you want it to run further to time 2.0.","category":"page"},{"location":"restart/#restart_preparation","page":"Restart simulation","title":"Prepare the simulation for a restart","text":"","category":"section"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"In you original elixir you need to specify to write out restart files. Those will later be read for the restart of your simulation. This is done almost the same way as writing the snapshots using the SaveSolutionCallback callback. For the restart files it is called SaveRestartCallback:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"save_restart = SaveRestartCallback(interval=100,\n save_final_restart=true)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Make this part of your CallbackSet.","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"An example is examples/examples/structured_2d_dgsem/elixir_advection_extended.jl.","category":"page"},{"location":"restart/#restart_perform","page":"Restart simulation","title":"Perform the simulation restart","text":"","category":"section"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Since all of the information about the simulation can be obtained from the last snapshot, the restart can be done with relatively few lines in an extra elixir file. However, some might prefer to keep everything in one elixir and conditionals like if restart with a boolean variable restart that is user defined.","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"First we need to define from which file we want to restart, e.g.","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"restart_file = \"restart_000021.h5\"\nrestart_filename = joinpath(\"out\", restart_file)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Then we load the mesh file:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"mesh = load_mesh(restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"This is then needed for the semidiscretization:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"We then define a new time span for the simulation that takes as starting time the one form the snapshot:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"tspan = (load_time(restart_filename), 2.0)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"We now also take the last dt, so that our solver does not need to first find one to fulfill the CFL condition:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"dt = load_dt(restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"The ODE that we will pass to the solver is now:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"ode = semidiscretize(semi, tspan, restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"You should now define a SaveSolutionCallback similar to the original simulation, but with save_initial_solution=false, otherwise our initial snapshot will be overwritten. If you are using one file for the original simulation and the restart you can reuse your SaveSolutionCallback, but need to set","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"save_solution.condition.save_initial_solution = false","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Before we compute the solution using OrdinaryDiffEq.jl we need to set the integrator and its time step number, e.g.:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"integrator = init(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=dt, save_everystep=false, callback=callbacks);\nload_timestep!(integrator, restart_filename)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"Now we can compute the solution:","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"sol = solve!(integrator)","category":"page"},{"location":"restart/","page":"Restart simulation","title":"Restart simulation","text":"An example is in examples/structured_2d_dgsem/elixir_advection_restart.jl.","category":"page"},{"location":"meshes/structured_mesh/#Structured-mesh","page":"Structured mesh","title":"Structured mesh","text":"","category":"section"},{"location":"meshes/structured_mesh/","page":"Structured mesh","title":"Structured mesh","text":"The StructuredMesh is a structured, curvilinear, conforming mesh type available for one-, two-, and three-dimensional simulations.","category":"page"},{"location":"meshes/structured_mesh/","page":"Structured mesh","title":"Structured mesh","text":"Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.","category":"page"},{"location":"development/#Development","page":"Development","title":"Development","text":"","category":"section"},{"location":"development/#interactive-use-of-julia","page":"Development","title":"Interactive use of Julia","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"When a Julia program is executed, Julia first loads and parses all code. Then, the just-in-time compiler has to compile all functions at their first use, which incurs an overhead each time a program is run. For proper packages and commands executed in the REPL (= \"return-eval-print loop\", which is what the Julia community calls the interactive command-line prompt that opens when executing julia without any files as arguments), however, the previously compiled functions are cached. Therefore, Trixi.jl should generally always be used interactively from the REPL without closing Julia during development, as it allows much faster turnaround times.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"If you naively run Trixi.jl from the REPL, you will not be able to change your Trixi.jl source files and then run the changed code without restarting the REPL, which destroys any potential benefits from caching. However, restarting Julia can be avoided by using the Revise.jl package, which tracks changed files and re-loads them automatically. Therefore, it is highly recommended to first install Revise with the following command in Julia: To enter the package REPL mode, press ] in the standard Julia REPL mode. Then, execute","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> add Revise","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Now you are able to run Trixi.jl from the REPL, change Trixi.jl code between runs, and enjoy the advantages of the compilation cache! Before you start using Revise regularly, please be aware of some of the Pitfalls when using Revise.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Another recommended package for working from the REPL is OhMyREPL.jl. It can be installed by running","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> add OhMyREPL","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"and adds syntax highlighting, bracket highlighting, and other helpful improvements for using Julia interactively. To automatically use OhMyREPL when starting the REPL, follow the instructions given in the official documentation.","category":"page"},{"location":"development/#Running-Trixi.jl-interactively-in-the-global-environment","page":"Development","title":"Running Trixi.jl interactively in the global environment","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"If you've installed Trixi.jl and Revise in your default environment, begin by executing:","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"This will start the Julia REPL. Then, run","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> using Revise; using Trixi","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"You can run a simulation by executing","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> trixi_include(default_example())","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Together, all of these commands can take some time, roughly half a minute on a modern workstation. Most of the time is spent on compilation of Julia code etc. If you execute the last command again in the same REPL, it will finish within a few milliseconds (maybe ~45 on a modern workstation). This demonstrates the second reason for using the REPL: the compilation cache. That is, those parts of the code that do not change between two Trixi.jl runs do not need to be recompiled and thus execute much faster after the first run.","category":"page"},{"location":"development/#Manually-starting-Trixi.jl-in-the-local-environment","page":"Development","title":"Manually starting Trixi.jl in the local environment","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"If you followed the installation instructions for developers, execute Julia with the project directory set to the run directory of the program/tool you want to use. For example, to run Trixi.jl this way, you need to start the REPL with","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia --project=path/to/Trixi.jl/run","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"and execute","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> using Revise; using Trixi","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"to load Revise and Trixi.jl. You can then proceed with the usual commands and run Trixi.jl as in the example above. The --project flag is required such that Julia can properly load Trixi.jl and all dependencies if Trixi.jl is not installed in the global environment. The same procedure also applies should you opt to install the postprocessing tool Trixi2Vtk manually such that you can modify their implementations.","category":"page"},{"location":"development/#Pitfalls-when-using-Revise","page":"Development","title":"Pitfalls when using Revise","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"While Revise is a great help for developing Julia code, there are a few situations to watch out for when using Revise. The following list of potential issues is based on personal experiences of the Trixi.jl developers and probably incomplete. Further information on limitations and possible issues with Revise can be found in the official documentation.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"tip: If in doubt, restart the REPL\nOftentimes, it is possible to recover from issues with Revise by fixing the offending code. Sometimes, however, this is not possible or you might have troubles finding out what exactly caused the problems. Therefore, in these cases, or if in doubt, restart the REPL to get a fresh start.","category":"page"},{"location":"development/#Syntax-errors-are-easy-to-miss","page":"Development","title":"Syntax errors are easy to miss","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Revise does not stop on syntax errors, e.g., when you accidentally write a[i) instead of a[i]. In this case, Revise reports an error but continues to use the old version of your files! This is especially dangerous for syntax errors, as they are detected while Revise reloads changed code, which happens in the beginning of a new execution. Thus, the syntax error message quickly disappears from the terminal once Trixi.jl starts writing output to the screen and you might not even have noticed that an error occurred at all.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Therefore, when you are deep in a coding/debugging session and wonder why your code modifications do not seem to have any effect, scroll up in your terminal to check if you missed earlier syntax errors, or - if in doubt - restart your REPL.","category":"page"},{"location":"development/#Files-are-not-tracked-after-changing-branches","page":"Development","title":"Files are not tracked after changing branches","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Sometimes, Revise stops tracking files when changing the Git branch. That is, modifications to Trixi.jl's source files will not be reloaded by Revise and thus have no effect of a currently running REPL session. This issue is particularly annoying for a developer, since it does not come with any warning! Therefore, it is good practice to always restart the REPL after changing branches.","category":"page"},{"location":"development/#Changes-to-type-definitions-are-not-allowed","page":"Development","title":"Changes to type definitions are not allowed","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Revise cannot handle changes to type definitions, e.g., when modifying the fields in a struct. In this case, Revise reports an error and refuses to run your code unless you undo the modifications. Once you undo the changes, Revise will usually continue to work as expected again. However, if you want to keep your type modifications, you need to restart the REPL.","category":"page"},{"location":"development/#Using-the-Julia-REPL-effectively","page":"Development","title":"Using the Julia REPL effectively","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"The Julia manual is an excellent resource to learn Julia. Here, we list some helpful commands than can increase your productivity in the Julia REPL.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Use the REPL help mode entered by typing ?.\njulia> using Trixi\n\nhelp?> trixi_include\nsearch: trixi_include\n\n trixi_include([mod::Module=Main,] elixir::AbstractString; kwargs...)\n\n include the file elixir and evaluate its content in the global scope of module mod. You can override specific\n assignments in elixir by supplying keyword arguments. It's basic purpose is to make it easier to modify some\n parameters while running Trixi.jl from the REPL. Additionally, this is used in tests to reduce the computational\n burden for CI while still providing examples with sensible default values for users.\n\n Examples\n ≡≡≡≡≡≡≡≡≡≡\n\n julia> trixi_include(@__MODULE__, default_example(), tspan=(0.0, 0.1))\n [...]\n\n julia> sol.t[end]\n 0.1\nYou can copy and paste REPL history including julia> prompts into the REPL.\nUse tab completion in the REPL, both for names of functions/types/variables and for function arguments.\njulia> flux_ranocha( # and TAB\nflux_ranocha(u_ll, u_rr, orientation::Integer, equations::CompressibleEulerEquations1D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_1d.jl:390\nflux_ranocha(u_ll, u_rr, orientation::Integer, equations::CompressibleEulerEquations2D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_2d.jl:839\n[...]\nUse methodswith to discover methods associated to a given type etc.\njulia> methodswith(CompressibleEulerEquations2D)\n[1] initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations2D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_2d.jl:51\n[...]\nUse @which (or @edit) for method calls.\njulia> @which trixi_include(default_example())\ntrixi_include(elixir::AbstractString; kwargs...) in Trixi at ~/.julia/dev/Trixi/src/auxiliary/special_elixirs.jl:36\nUse apropos to search through the documentation and docstrings.\njulia> apropos(\"MHD\")\nTrixi.IdealGlmMhdEquations3D\nTrixi.IdealGlmMhdMulticomponentEquations2D\nTrixi.calc_fast_wavespeed_roe\nTrixi.IdealGlmMhdEquations1D\nTrixi.initial_condition_constant\nTrixi.flux_nonconservative_powell\nTrixi.GlmSpeedCallback\nTrixi.flux_derigs_etal\nTrixi.flux_hindenlang_gassner\nTrixi.initial_condition_convergence_test\nTrixi.min_max_speed_naive\nTrixi.IdealGlmMhdEquations2D\nTrixi.IdealGlmMhdMulticomponentEquations1D\n[...]","category":"page"},{"location":"development/#Text-editors","page":"Development","title":"Text editors","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"When writing code, the choice of text editor can have a significant impact on productivity and developer satisfaction. While using the default text editor of the operating system has its own benefits (specifically the lack of an explicit installation procure), usually it makes sense to switch to a more programming-friendly tool. In the following, a few of the many options are listed and discussed:","category":"page"},{"location":"development/#VS-Code","page":"Development","title":"VS Code","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Visual Studio Code is a modern open source editor with good support for Julia. While Juno had some better support in the past, the developers of Juno and the Julia VS Code plugin are joining forces and concentrating on VS Code since support of Atom has been suspended. Basically, all comments on Juno below also apply to VS Code.","category":"page"},{"location":"development/#Juno","page":"Development","title":"Juno","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"If you are new to programming or do not have a preference for a text editor yet, Juno is a good choice for developing Julia code. It is based on Atom, a sophisticated and widely used editor for software developers, and is enhanced with several Julia-specific features. Furthermore and especially helpful for novice programmers, it has a MATLAB-like appearance with easy and interactive access to the current variables, the help system, and a debugger.","category":"page"},{"location":"development/#Vim-or-Emacs","page":"Development","title":"Vim or Emacs","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Vim and Emacs are both very popular editors that work great with Julia. One of their advantages is that they are text editors without a GUI and as such are available for almost any operating system. They also are preinstalled on virtually all Unix-like systems. However, Vim and Emacs come with their own, steep learning curve if they have never been used before. Therefore, if in doubt, it is probably easier to get started with a classic GUI-based text editor (like Juno). If you decide to use Vim or Emacs, make sure that you install the corresponding Vim plugin julia-vim or Emacs major mode julia-emacs.","category":"page"},{"location":"development/#Debugging","page":"Development","title":"Debugging","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Julia offers several options for debugging. A classical debugger is available with the Debugger.jl package or in the Julia extension for VS Code. However, it can be quite slow and, at the time of writing (January 2023), currently does not work properly with Trixi.jl. The Infiltrator.jl package on the other hand does not offer all features of a full debugger, but is a fast and simple tool that allows users to set breakpoints to open a local REPL session and access the call stack and variables.","category":"page"},{"location":"development/#Infiltrator","page":"Development","title":"Infiltrator","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"The Infiltrator package provides fast, interactive breakpoints using the @infiltrate command, which drops the user into a local REPL session. From there, it is possible to access local variables, see the call stack, and execute statements.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"The package can be installed in the Julia REPL by executing","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> add Infiltrator","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"To load the package in the Julia REPL execute","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia> using Infiltrator","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Breakpoints can be set by adding a line with the @infiltrate macro at the respective position in the code. Use Revise if you want to set and delete breakpoints in your package without having to restart Julia.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"note: Use `@autoinfiltrate` when debugging Trixi.jl\nWhen running Julia inside a package environment, e.g., inside the source code of Trixi.jl itself, the @infiltrate macro only works if Infiltrator has been added to the package dependencies. To avoid this, you can use the (non-exported) @autoinfiltrate macro in Trixi.jl, which only requires Infiltrator.jl to be available in the current environment stack and will auto-load it for you.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Triggering the breakpoint starts a REPL session where it is possible to interact with the current local scope. Possible commands are:","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"@locals: Print the local variables.\n@exfiltrate: Save the local variables to a global storage, which can be accessed with the safehouse variable outside the Infiltrator session.\n@trace: Print the current stack trace.\nExecute other arbitrary statements\n?: Print a help list with all options","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"To finish a debugging session, either use @continue to continue and eventually stop at the next breakpoint or @exit to skip further breakpoints. After the code has finished, local variables saved with @exfiltrate can be accessed in the REPL using the safehouse variable.","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"Limitations of using Infiltrator.jl are that local variables cannot be changed, and that it is not possible to step into further calls or access other function scopes.","category":"page"},{"location":"development/#Releasing-a-new-version-of-Trixi.jl,-Trixi2Vtk","page":"Development","title":"Releasing a new version of Trixi.jl, Trixi2Vtk","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Check whether everything is okay, tests pass etc.\nSet the new version number in Project.toml according to the Julian version of semver. Commit and push.\nComment @JuliaRegistrator register on the commit setting the version number.\nJuliaRegistrator will create a PR with the new version in the General registry. Wait for it to be merged.\nIncrement the version number in Project.toml again with suffix -pre. For example, if you have released version v0.2.0, use v0.2.1-pre as new version number.\nWhen a new version of Trixi.jl was released, check whether the [compat] entries in test/Project.toml in Trixi2Vtk should be updated. When a new version of Trixi2Vtk was released, check whether the [compat] entries in docs/Project.toml in Trixi.jl should be updated.\nThese entries will also be checked regularly by CompatHelper (once a day). Hence, if everything was released correctly, you should only need to do these checks manually if new minor versions with changes in the docs of Trixi2Vtk were released but no new version of Trixi.jl was released afterwards.","category":"page"},{"location":"development/#Preview-of-the-documentation","page":"Development","title":"Preview of the documentation","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"You can build the documentation of Trixi.jl locally by running","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"julia --project=docs -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'\njulia --project=docs --color=yes docs/make.jl","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"from the Trixi.jl main directory. Then, you can look at the html files generated in docs/build. For PRs triggered from branches inside the Trixi.jl main repository previews of the new documentation are generated at https://trixi-framework.github.io/Trixi.jl/previews/PRXXX, where XXX is the number of the PR. This does not work for PRs from forks for security reasons (since anyone could otherwise push arbitrary stuff to the Trixi.jl website, including malicious code).","category":"page"},{"location":"development/#trixi2vtk-dev","page":"Development","title":"Developing Trixi2Vtk","text":"","category":"section"},{"location":"development/","page":"Development","title":"Development","text":"Trixi2Vtk has Trixi.jl as dependency and uses Trixi.jl's implementation to, e.g., load mesh files. When developing Trixi2Vtk, one may want to change functions in Trixi.jl to allow them to be reused in Trixi2Vtk. To use a locally modified Trixi.jl clone instead of a Trixi.jl release, one can tell Pkg to use the local source code of Trixi.jl instead of a registered version by running","category":"page"},{"location":"development/","page":"Development","title":"Development","text":"(@v1.9) pkg> develop path/to/Trixi.jl","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"EditURL = \"../../../literate/src/files/first_steps/create_first_setup.jl\"","category":"page"},{"location":"tutorials/first_steps/create_first_setup/#create_first_setup","page":"1.2 Create first setup","title":"1.2: First steps in Trixi.jl: Create first setup","text":"","category":"section"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"In this part of the introductory guide, we will create a first Trixi.jl setup as an extension of elixir_advection_basic.jl. Since Trixi.jl has a common basic structure for the setups, you can create your own by extending and modifying the following example.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Let's consider the linear advection equation for a state u = u(x y t) on the two-dimensional spatial domain -1 1 times -1 1 with a source term","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"fracpartialpartial tu + fracpartialpartial x (02 u) - fracpartialpartial y (07 u) = - 2 e^-t\nsinbigl(2 pi (x - t) bigr) sinbigl(2 pi (y - t) bigr)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"with the initial condition","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"u(x y 0) = sinbigl(pi x bigr) sinbigl(pi y bigr)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"and periodic boundary conditions.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"The first step is to create and open a file with the .jl extension. You can do this with your favorite text editor (if you do not have one, we recommend VS Code). In this file you will create your setup.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"To be able to use functionalities of Trixi.jl, you always need to load Trixi.jl itself and the OrdinaryDiffEq.jl package.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"using Trixi\nusing OrdinaryDiffEq","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"The next thing to do is to choose an equation that is suitable for your problem. To see all the currently implemented equations, take a look at src/equations. If you are interested in adding a new physics model that has not yet been implemented in Trixi.jl, take a look at the tutorials Adding a new scalar conservation law or Adding a non-conservative equation.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"The linear scalar advection equation in two spatial dimensions","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"fracpartialpartial tu + fracpartialpartial x (a_1 u) + fracpartialpartial y (a_2 u) = 0","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"is already implemented in Trixi.jl as LinearScalarAdvectionEquation2D, for which we need to define a two-dimensional parameter advection_velocity describing the parameters a_1 and a_2. Appropriate for our problem is (0.2, -0.7).","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"advection_velocity = (0.2, -0.7)\nequations = LinearScalarAdvectionEquation2D(advection_velocity)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"To solve our problem numerically using Trixi.jl, we have to discretize the spatial domain, for which we set up a mesh. One of the most used meshes in Trixi.jl is the TreeMesh. The spatial domain used is -1 1 times -1 1. We set an initial number of elements in the mesh using initial_refinement_level, which describes the initial number of hierarchical refinements. In this simple case, the total number of elements is 2^initial_refinement_level throughout the simulation. The variable n_cells_max is used to limit the number of elements in the mesh, which cannot be exceeded when using adaptive mesh refinement.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"All minimum and all maximum coordinates must be combined into Tuples.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"coordinates_min = (-1.0, -1.0)\ncoordinates_max = ( 1.0, 1.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level = 4,\n n_cells_max = 30_000)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"To approximate the solution of the defined model, we create a DGSEM solver. The solution in each of the recently defined mesh elements will be approximated by a polynomial of degree polydeg. For more information about discontinuous Galerkin methods, check out the Introduction to DG methods tutorial.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"solver = DGSEM(polydeg=3)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Now we need to define an initial condition for our problem. All the already implemented initial conditions for LinearScalarAdvectionEquation2D can be found in src/equations/linear_scalar_advection_2d.jl. If you want to use, for example, a Gaussian pulse, it can be used as follows:","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"initial_conditions = initial_condition_gauss","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"But to show you how an arbitrary initial condition can be implemented in a way suitable for Trixi.jl, we define our own initial conditions.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"u(x y 0) = sinbigl(pi x bigr) sinbigl(pi y bigr)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"The initial conditions function must take spatial coordinates, time and equation as arguments and returns an initial condition as a statically sized vector SVector. Following the same structure, you can define your own initial conditions. The time variable t can be unused in the initial condition, but might also be used to describe an analytical solution if known. If you use the initial condition as analytical solution, you can analyze your numerical solution by computing the error, see also the section about analyzing the solution.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"function initial_condition_sinpi(x, t, equations::LinearScalarAdvectionEquation2D)\n scalar = sinpi(x[1]) * sinpi(x[2])\n return SVector(scalar)\nend\ninitial_condition = initial_condition_sinpi","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"The next step is to define a function of the source term corresponding to our problem.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"f(u x y t) = - 2 e^-t sinbigl(2 pi (x - t) bigr) sinbigl(2 pi (y - t) bigr)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"This function must take the state variable, the spatial coordinates, the time and the equation itself as arguments and returns the source term as a static vector SVector.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"function source_term_exp_sinpi(u, x, t, equations::LinearScalarAdvectionEquation2D)\n scalar = - 2 * exp(-t) * sinpi(2*(x[1] - t)) * sinpi(2*(x[2] - t))\n return SVector(scalar)\nend","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Now we collect all the information that is necessary to define a spatial discretization, which leaves us with an ODE problem in time with a span from 0.0 to 1.0. This approach is commonly referred to as the method of lines.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver;\n source_terms = source_term_exp_sinpi)\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan);\nnothing #hide","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"At this point, our problem is defined. We will use the solve function defined in OrdinaryDiffEq.jl to get the solution. OrdinaryDiffEq.jl gives us the ability to customize the solver using callbacks without actually modifying it. Trixi.jl already has some implemented Callbacks. The most widely used callbacks in Trixi.jl are step control callbacks that are activated at the end of each time step to perform some actions, e.g. to print statistics. We will show you how to use some of the common callbacks.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"To print a summary of the simulation setup at the beginning and to reset timers we use the SummaryCallback. When the returned callback is executed directly, the current timer values are shown.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"summary_callback = SummaryCallback()","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"We also want to analyze the current state of the solution in regular intervals. The AnalysisCallback outputs some useful statistical information during the solving process every interval time steps.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"analysis_callback = AnalysisCallback(semi, interval = 5)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"It is also possible to control the time step size using the StepsizeCallback if the time integration method isn't adaptive itself. To get more details, look at CFL based step size control.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"stepsize_callback = StepsizeCallback(cfl = 1.6)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"To save the current solution in regular intervals we use the SaveSolutionCallback. We would like to save the initial and final solutions as well. The data will be saved as HDF5 files located in the out folder. Afterwards it is possible to visualize a solution from saved files using Trixi2Vtk.jl and ParaView, which is described below in the section Visualize the solution.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"save_solution = SaveSolutionCallback(interval = 5,\n save_initial_solution = true,\n save_final_solution = true)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Alternatively, we have the option to print solution files at fixed time intervals.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"save_solution = SaveSolutionCallback(dt = 0.1,\n save_initial_solution = true,\n save_final_solution = true)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Another useful callback is the SaveRestartCallback. It saves information for restarting in regular intervals. We are interested in saving a restart file for the final solution as well. To perform a restart, you need to configure the restart setup in a special way, which is described in the section Restart simulation.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"save_restart = SaveRestartCallback(interval = 100, save_final_restart = true)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Create a CallbackSet to collect all callbacks so that they can be passed to the solve function.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"callbacks = CallbackSet(summary_callback, analysis_callback, stepsize_callback, save_solution,\n save_restart)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"The last step is to choose the time integration method. OrdinaryDiffEq.jl defines a wide range of ODE solvers, e.g. CarpenterKennedy2N54(williamson_condition = false). We will pass the ODE problem, the ODE solver and the callbacks to the solve function. Also, to use StepsizeCallback, we must explicitly specify the initial trial time step dt, the selected value is not important, because it will be overwritten by the StepsizeCallback. And there is no need to save every step of the solution, we are only interested in the final result.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false), dt = 1.0,\n save_everystep = false, callback = callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Finally, we print the timer summary.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"summary_callback()","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Now you can plot the solution as shown below, analyze it and improve the stability, accuracy or efficiency of your setup.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/#Visualize-the-solution","page":"1.2 Create first setup","title":"Visualize the solution","text":"","category":"section"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"In the previous part of the tutorial, we calculated the final solution of the given problem, now we want to visualize it. A more detailed explanation of visualization methods can be found in the section Visualization.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/#Using-Plots.jl","page":"1.2 Create first setup","title":"Using Plots.jl","text":"","category":"section"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"The first option is to use the Plots.jl package directly after calculations, when the solution is saved in the sol variable. We load the package and use the plot function.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"To show the mesh on the plot, we need to extract the visualization data from the solution as a PlotData2D object. Mesh extraction is possible using the getmesh function. Plots.jl has the plot! function that allows you to modify an already built graph.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"pd = PlotData2D(sol)\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/first_steps/create_first_setup/#Using-Trixi2Vtk.jl","page":"1.2 Create first setup","title":"Using Trixi2Vtk.jl","text":"","category":"section"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Another way to visualize a solution is to extract it from a saved HDF5 file. After we used the solve function with SaveSolutionCallback there is a file with the final solution. It is located in the out folder and is named as follows: solution_index.h5. The index is the final time step of the solution that is padded to 6 digits with zeros from the beginning. With Trixi2Vtk you can convert the HDF5 output file generated by Trixi.jl into a VTK file. This can be used in visualization tools such as ParaView or VisIt to plot the solution. The important thing is that currently Trixi2Vtk.jl supports conversion only for solutions in 2D and 3D spatial domains.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"If you haven't added Trixi2Vtk.jl to your project yet, you can add it as follows.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"import Pkg\nPkg.add([\"Trixi2Vtk\"])","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Now we load the Trixi2Vtk.jl package and convert the file out/solution_000018.h5 with the final solution using the trixi2vtk function saving the resulting file in the out folder.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"using Trixi2Vtk\ntrixi2vtk(joinpath(\"out\", \"solution_000018.h5\"), output_directory=\"out\")","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Now two files solution_000018.vtu and solution_000018_celldata.vtu have been generated in the out folder. The first one contains all the information for visualizing the solution, the second one contains all the cell-based or discretization-based information.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Now let's visualize the solution from the generated files in ParaView. Follow this short instruction to get the visualization.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Download, install and open ParaView.\nPress Ctrl+O and select the generated files solution_000018.vtu and solution_000018_celldata.vtu from the out folder.\nIn the upper-left corner in the Pipeline Browser window, left-click on the eye-icon near solution_000018.vtu.\nIn the lower-left corner in the Properties window, change the Coloring from Solid Color to scalar. This already generates the visualization of the final solution.\nNow let's add the mesh to the visualization. In the upper-left corner in the Pipeline Browser window, left-click on the eye-icon near solution_000018_celldata.vtu.\nIn the lower-left corner in the Properties window, change the Representation from Surface to Wireframe. Then a white grid should appear on the visualization.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Now, if you followed the instructions exactly, you should get a similar image as shown in the section Using Plots.jl:","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"(Image: paraview_trixi2vtk_example)","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"After completing this tutorial you are able to set up your own simulations with Trixi.jl. If you have an interest in contributing to Trixi.jl as a developer, refer to the third part of the introduction titled Changing Trixi.jl itself.","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"Sys.rm(\"out\"; recursive=true, force=true) #hide","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"","category":"page"},{"location":"tutorials/first_steps/create_first_setup/","page":"1.2 Create first setup","title":"1.2 Create first setup","text":"This page was generated using Literate.jl.","category":"page"},{"location":"visualization/#visualization","page":"Visualization","title":"Visualization","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"There are two possible approaches to visualize results from Trixi.jl: either directly from the REPL using Plots.jl or with ParaView/VisIt by postprocessing Trixi.jl's output files with Trixi2Vtk.","category":"page"},{"location":"visualization/#Plots.jl","page":"Visualization","title":"Plots.jl [experimental]","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By far the easiest and most convenient plotting approach is to use the powerful Plots.jl package to directly visualize Trixi.jl's results from the REPL. In the following, you will find more information on a number of topics for how to use Plots.jl together with Trixi.jl:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Getting started\nCustomizing plot results via a PlotData2D object\nPlotting a 3D solution as a 2D plot\nCreating a 1D plot\nPlotting a 2D or 3D solutions as a 1D plot\nVisualizing results during a simulation","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nPlotting via Plots.jl is still considered an experimental feature and might change in any future releases.","category":"page"},{"location":"visualization/#getting-started-plots-jl","page":"Visualization","title":"Getting started","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"After running a simulation with Trixi.jl in the REPL, load the Plots package with","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Plots","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To visualize the solution, execute","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Here we assume that sol holds the return value of the solve(...) method (with type SciMLBase.ODESolution), which is the default variable name when you use one of the example elixirs. This will generate a grid layout with one subplot for each solution variable, convenient for getting an overview of the current solution:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"You can save the resulting file as a PNG image file by calling savefig(...) with an output file name that ends in .png, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> savefig(\"solution-overview.png\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In Trixi.jl, two plot types are available: 2D heatmap plots and 1D line plots. If you use plot(sol), Trixi.jl will automatically choose the plot type that fits the dimensions of the sol input: 2D/3D data will be visualized as a heatmap, 1D data as a line plot. For more fine-grained control over what to plot, you can create such an object yourself, which can either be a PlotData2D or a PlotData1D object. For further details on both of these see below:","category":"page"},{"location":"visualization/#Customizing-plot-results-via-a-PlotData2D-object","page":"Visualization","title":"Customizing plot results via a PlotData2D object","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"For more fine-grained control over what to plot, first create a PlotData2D object by executing","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(sol)\njulia> pd = PlotData2D(u, semi)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"where u is an array containing the solution and semi is the semidiscretization. For example, if PlotData2D(sol.u[2], semi) is specified, this will create a PlotData2D instance from the 2nd saved time-step. If PlotData2D(sol(0.5), semi) is specified, it will construct a PlotData2D instance using OrdinaryDiffEq.jl's interpolation to evaluate the solution at time t=0.5.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This takes the results generated by Trixi.jl and stores them in a data format that can be understood by the Plots package, and pd holds all data relevant for plotting sol. You can pass variable names as strings to pd using a dictionary-like syntax, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(pd[\"rho\"])","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This will create a single 2D heatmap plot of the variable rho:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The default plot type and style can be overridden by passing any additional arguments that are understood by the Plots package. For example, to change the color scheme and add names to the axes, modify the previous command to","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(pd[\"rho\"], seriescolor = :heat, xguide=\"x\", yguide=\"y\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"to yield","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho-modified)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"For more details on the various format options for plot, please consult the Plots documentation.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In addition, you can plot the mesh lines on top of the solution variables by calling the getmesh(...) function on the PlotData2D object","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot!(getmesh(pd)) # here we use `plot!` with an `!` to add to the previous plot","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"which modifies the previous plot to","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho-modified-mesh)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By default, PlotData2D will convert the conserved variables to primitive variables, but this can be changed by passing an appropriate conversion function in the solution_variables keyword argument, similar to the behavior of the SaveSolutionCallback:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(sol; solution_variables=cons2cons) # Plot conservative variables","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"There are several other keyword arguments that influence how the solution data is processed for visualization with the Plots package. A detailed explanation can be found in the docstring of the PlotData2D constructor.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Another way to change the appearance of a plot is to convert the solution to a uniformly refined mesh before plotting. This can be helpful, e.g., when trying different settings for a simulation with adaptive mesh refinement, where one would like to ignore the mesh changes when comparing solutions. This is achieved with adapt_to_mesh_level, which uses the mesh adaptation routines to adapt the solution to a uniform grid. For example, the AMR solution from above could be preprocessed with","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(adapt_to_mesh_level(sol, 4)...)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"When plotted together with the mesh, this will yield the following visualization:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-rho-uniform-mesh)","category":"page"},{"location":"visualization/#Plotting-a-user-defined-scalar-field","page":"Visualization","title":"Plotting a user-defined scalar field","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To plot a scalar quantity, one can call plot(ScalarPlotData2D(u, semi)), where u is an array of nodal values of the scalar field to plot. The layout of u should match the layout of the x and y nodal coordinates of the respective solver. For example, after running trixi_include(joinpath(\"examples\", \"unstructured_2d_dgsem\", \"elixir_euler_wall_bc.jl\")), the following can be used to plot the function f(x, y) = x * y:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"x = view(semi.cache.elements.node_coordinates, 1, :, :, :)\ny = view(semi.cache.elements.node_coordinates, 2, :, :, :)\nplot(ScalarPlotData2D(x .* y, semi))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This produces the following plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: scalar-plotting-example)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This routine can be used to visualize scalar quantities which depend on the solution, such as the norm of a velocity vector or two-dimensional vorticity. For example, we can visualize vorticity for a compressible version of the Brown-Minion vortex problem:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Trixi, Plots\n\njulia> redirect_stdout(devnull) do\n # runs the elixir without any output from callbacks etc.\n trixi_include(@__MODULE__,\n joinpath(examples_dir(), \"dgmulti_2d\", \"elixir_euler_brown_minion_vortex.jl\"))\n end\n[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.\n\njulia> function compute_vorticity(velocity, mesh, equations::CompressibleEulerEquations2D,\n dg::DGMulti, cache)\n rd = dg.basis\n md = mesh.md\n @unpack Dr, Ds = rd\n @unpack rxJ, sxJ, ryJ, syJ, J = md\n v1, v2 = velocity\n dv1dy = ryJ .* (Dr * v1) + syJ .* (Ds * v1)\n dv2dx = rxJ .* (Dr * v2) + sxJ .* (Ds * v2)\n return dv2dx - dv1dy\n end;\n\njulia> compute_vorticity(velocity, semi) =\n compute_vorticity(velocity, Trixi.mesh_equations_solver_cache(semi)...);\n\njulia> function get_velocity(sol)\n rho, rhou, rhov, E = StructArrays.components(sol.u[end])\n v1 = rhou ./ rho\n v2 = rhov ./ rho\n return v1, v2\n end;\n\njulia> vorticity = compute_vorticity(get_velocity(sol), semi);\n\njulia> plot(ScalarPlotData2D(vorticity, semi;\n variable_name = \"Vorticity at t = $(sol.prob.tspan[end])\"))\nPlot{Plots.GRBackend() n=1}","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This produces the following plot of vorticity.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: vorticity-example)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Since the mesh is fairly coarse, we observe numerical artifacts due to the low resolution. These errors vanish under mesh refinement; for example, doubling the mesh resolution by running","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi_include(joinpath(examples_dir(), \"dgmulti_2d\", \"elixir_euler_BM_vortex.jl\"), cells_per_dimension = 32)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"yields the following plot of vorticity:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: vorticity-example-refined)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nWhen visualizing a scalar field, the plotted solution is reinterpolated using a high order polynomial approximation. Thus, small discrepancies may be observed when the underlying data is highly non-smooth or under-resolved.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"ScalarPlotData2D objects can also be used with Makie through iplot. For example, the following code plots two surfaces:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Trixi, CairoMakie\n\njulia> redirect_stdout(devnull) do\n # runs the elixir without any output from callbacks etc.\n trixi_include(@__MODULE__,\n joinpath(examples_dir(), \"unstructured_2d_dgsem\", \"elixir_euler_wall_bc.jl\"))\n end\n[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.\n\njulia> x = view(semi.cache.elements.node_coordinates, 1, :, :, :); # extracts the node x coordinates\n\njulia> y = view(semi.cache.elements.node_coordinates, 2, :, :, :); # extracts the node y coordinates\n\njulia> fig_ax_plt = iplot(ScalarPlotData2D((@. 1 - .25*(x^2 + y^2)), semi), plot_mesh=true, colormap=:viridis);\n\njulia> fig_ax_plt2 = iplot!(fig_ax_plt, ScalarPlotData2D((@. .125*(x+y)), semi), plot_mesh=true, colormap=:blues)\nFigureAxisPlot()","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This creates the following plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: ScalarPlotData2D_example)","category":"page"},{"location":"visualization/#Plotting-a-3D-solution-as-a-2D-plot","page":"Visualization","title":"Plotting a 3D solution as a 2D plot","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"It is possible to plot 2D slices from 3D simulation data using the TreeMesh with the same commands as above:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol) # `sol` is from a 3D simulation","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By default, plotting sol or creating a PlotData2D object from a 3D simulation will create a 2D slice of the solution in the xy-plane. You can customize this behavior by explicitly creating a PlotData2D object and passing appropriate keyword arguments:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"slice specifies the plane which is being sliced and can be :xy, :xz, or :yz (default: :xy)\npoint specifies a three-dimensional point. The sliced plane is then created such that it lies on the point (default: (0.0, 0.0, 0.0)).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"All other attributes for PlotData2D objects apply here as well.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"For example, to plot the velocity field orthogonal to the yz-plane at different x-axis locations, you can execute","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi_include(joinpath(examples_dir(), \"tree_3d_dgsem\", \"elixir_euler_taylor_green_vortex.jl\"), tspan=(0.0, 1.0))\n[...]\n\njulia> plots = []\nAny[]\n\njulia> for x in range(0, stop=pi/2, length=6)\n pd = PlotData2D(sol, slice=:yz, point=(x, 0.0, 0.0))\n push!(plots, plot(pd[\"v1\"], clims=(-1,1), title=\"x = \"*string(round(x, digits=2))))\n end\n\njulia> plot(plots..., layout=(2, 3), size=(750,350))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"which results in a 2x3 grid of slices of the yz-plane:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: plot-v1-0.0-to-0.5pi)","category":"page"},{"location":"visualization/#Creating-a-1D-plot","page":"Visualization","title":"Creating a 1D plot","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"When plotting a 1D solution with","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol) # `sol` is from a 1D simulation","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Trixi.jl automatically creates a PlotData1D object and visualizes it as a line plot: (Image: 1d-plot)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To customize your 1D plot, you can create a PlotData1D object manually as follows:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData1D(sol)\njulia> pd = PlotData1D(u, semi)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The behavior is analogous to the PlotData2D behavior.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In a very similar fashion to PlotData2D, you can customize your plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"plot(pd) creates the same plot as in plot(sol).\nplot(pd[\"rho\", \"p\"]) only plots specific variables. In this case rho and p.\nplot!(getmesh(pd)) adds mesh lines after creating a plot.\nAny attributes from Plots can be used, e.g., plot(pd, yguide=:temperature).\npd = PlotData1D(adapt_to_mesh_level(sol, 4)...) adapts the mesh before plotting (in this example to a mesh with refinement level 4).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"You can also customize the PlotData1D object itself by passing attributes to the PlotData1D constructor:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"solution_variables specifies the variables to be plotted.\nnvisnodes sets the amount of nodes per element which the solution then is interpolated on.","category":"page"},{"location":"visualization/#Plotting-a-2D-or-3D-solutions-as-a-1D-plot","page":"Visualization","title":"Plotting a 2D or 3D solutions as a 1D plot","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"It is possible to extract a straight, axis-parallel line from a 2D or 3D solution and visualize it as a 1D plot. This is done by creating a PlotData1D object with a 2D/3D solution sol as input:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData1D(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The plot is then created with:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(pd)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"By default the x-axis is extracted, which can be changed with following attributes:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"slice specifies the axis which is being extracted and can be :x, :y or :z (:z is only for 3D input and default is :x)\npoint specifies a two or three dimensional point. The sliced axis is then created in such a way, that it lies on the point. (default: (0.0, 0.0) or (0.0, 0.0, 0.0))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"All other attributes for PlotData1D objects apply here as well.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In the following, is an example for a 2D simulation of the linear scalar advection equation. First, we have the regular 2D heatmap plot:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: 2d-plot-for-slice)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"From this, we can extract a line plot parallel to the y-axis going through the point (1.0, 0.0) with the following commands:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData1D(sol, slice=:y, point=(1.0, 0.0))\njulia> plot(pd)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: 1d-plot-for-slice)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This convenient method of slicing is limited to axis-parallel slices, but for 2D/3D solutions it is also possible to create a plot along any curve you want. To do so, you first need to create a list of 2D/3D points that define your curve. Then you can create a PlotData1D with the keyword argument curve set to your list.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Let's give an example of this with the basic advection equation from above by creating a plot along the circle marked in green:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: 2d-plot-along-circle)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"We can write a function like this, that outputs a list of points on a circle:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"function circle(radius, center, n_points)\n coordinates = zeros(2, n_points)\n for i in 1:n_points\n coordinates[:,i] = radius*[cospi(2*i/n_points), sinpi(2*i/n_points)] .+ center\n end\n return coordinates\nend","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Then create and plot a PlotData1D object along a circle with radius one, center at (1,1), and 100 points:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"pd = PlotData1D(sol, curve=circle(1.0, (1.0, 1.0), 100))\nplot(pd)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This gives you the following plot: (Image: 1d-plot-along-circle)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Creating a plot like this has its downsides. For one, it is unclear what to put on the abscissa of the plot. By default, the arc length of the given curve is used. Also, with this way of plotting you lose the ability to use a mesh plot from getmesh.","category":"page"},{"location":"visualization/#Visualizing-results-during-a-simulation","page":"Visualization","title":"Visualizing results during a simulation","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To visualize solutions while a simulation is still running (also known as in-situ visualization), you can use the VisualizationCallback. It is created as a regular callback and accepts upon creation a number of keyword arguments that allow, e.g., to control the visualization interval, to specify the variables to plot, or to customize the plotting style.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"During the simulation, the visualization callback creates and displays visualizations of the current solution in regular intervals. This can be useful to, e.g., monitor the validity of a long-running simulation or for illustrative purposes. An example for how to create a VisualizationCallback can be found in examples/tree_2d_dgsem/elixir_advection_amr_visualization.jl:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"[...]\n\n# Enable in-situ visualization with a new plot generated every 20 time steps\n# and additional plotting options passed as keyword arguments\nvisualization = VisualizationCallback(interval=20; clims=(0,1))\n\n[...]","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The resulting output of the referenced elixir can be seen in the embedded video below:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":" \n
","category":"page"},{"location":"visualization/#Trixi2Vtk","page":"Visualization","title":"Trixi2Vtk","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Trixi2Vtk converts Trixi.jl's .h5 output files to VTK files, which can be read by ParaView, VisIt, and other visualization tools. It automatically interpolates solution data from the original quadrature node locations to equidistant visualization nodes at a higher resolution, to make up for the loss of accuracy from going from a high-order polynomial representation to a piecewise constant representation in VTK.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In the Julia REPL, first load the package Trixi2Vtk","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using Trixi2Vtk","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To process an HDF5 file generated by Trixi.jl, execute","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(joinpath(\"out\", \"solution_000000.h5\"), output_directory=\"out\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This will create two unstructured VTK files in the out subdirectory that can be opened with ParaView or VisIt: solution_000000.vtu contains the discontinuous Galerkin solution data while solution_000000_celldata.vtu holds any cell-based values such as the current AMR indicator or the cell refinement level.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: \"solution_000000_scalar_mesh\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This allows you to generate VTK files for solution, restart and mesh files. By default, Trixi2Vtk generates .vtu (unstructured VTK) files for both cell/element data (e.g., cell ids, element ids) and node data (e.g., solution variables). This format visualizes each cell with the same number of nodes, independent of its size. Alternatively, you can provide format=:vti as a keyword argument to trixi2vtk, which causes Trixi2Vtk to generate .vti (image data VTK) files for the solution files, while still using .vtu files for cell-/element-based data. In .vti files, a uniform resolution is used throughout the entire domain, resulting in different number of visualization nodes for each element. This can be advantageous to create publication-quality images, but increases the file size.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"If you want to convert multiple solution/restart files at once, you can just supply multiple input files as the positional arguments to trixi2vtk, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(\"out/solution_000000.h5\", \"out/solution_000040.h5\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"You may also use file globbing to select a range of files based on filename patterns, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(\"out/solution_*.h5\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"to convert all solution files in the out/ directory or","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi2vtk(\"out/restart_00[0-9]000.h5\")","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"to convert every one-thousandth restart file (out/restart_000000.h5, out/restart_001000.h5 etc.).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"When multiple solution/restart files are provided, Trixi2Vtk will also generate a .pvd file, which allows ParaView to read all .vtu/.vti files at once and which uses the time attribute in solution/restart files to inform ParaView about the solution time. A comprehensive list of all possible arguments for trixi2vtk can be found in the Trixi2Vtk.jl API.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Further information regarding the development of Trixi2Vtk can be found in the development section.","category":"page"},{"location":"visualization/#Makie.jl","page":"Visualization","title":"Makie.jl [experimental]","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In addition to Plots.jl support, Trixi.jl includes visualization utilities through Makie.jl. Trixi.jl provides Makie-based visualization options both for heatmap-type plots (similar to the Plots.jl recipes) as well as for interactive surface plots. Support is currently limited to the UnstructuredMesh2D type.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nPlotting via Makie.jl is still considered an experimental feature and might change in any future releases.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"A Makie plot can be created as follows: after running a simulation with Trixi.jl in the REPL, load a Makie backend (for example, GLMakie or CairoMakie).","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> using GLMakie","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"To visualize the solution and mesh with a heatmap-type plot, simply run","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"note: Note\nBoth Makie.jl and Plots.jl export plot, so if you load both libraries, you will have to specify which plot function to call via Plots.plot or Makie.plot.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"As with Plots.jl recipes, one can view individual solution components by creating a PlotData2D object and indexing into it with the desired variable name","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> pd = PlotData2D(sol)\njulia> plot(pd[\"rho\"])","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Unlike the Plots.jl recipe, mesh plotting is controlled using the keyword argument plot_mesh = false, e.g.,","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> plot(sol; plot_mesh=false)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The plot command also returns figure and axis handles, which can be used to edit plot titles or labels:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> fig, axes = plot(sol)\njulia> axes[1,1].title = \"New title for subplot (1,1)\"","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Trixi.jl also supports interactive surface plots using iplot. After executing","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> trixi_include(joinpath(\"examples\", \"unstructured_2d_dgsem\", \"elixir_euler_wall_bc.jl\"))","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"we can run","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"julia> iplot(sol)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This will open up an interactive visualization window:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: makie-example)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"The plot can be rotated (click and hold), zoomed in and out (scroll up and down), and panned (hold right click and drag). Two toggle buttons control whether mesh lines are visible on top of and below the solution.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Both plot and iplot use colormap = :inferno by default. A different colormap can be selected by providing an appropriate keyword argument. For example, plot(sol, colormap=:blues) and iplot(sol, colormap=:blues) produce the following figures:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"(Image: makie-plot-example) (Image: makie-iplot-example)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"EditURL = \"../../literate/src/files/adding_new_parabolic_terms.jl\"","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#adding_new_parabolic_terms","page":"13 Adding new parabolic terms","title":"13: Adding new parabolic terms","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"This demo illustrates the steps involved in adding new parabolic terms for the scalar advection equation. In particular, we will add an anisotropic diffusion. We begin by defining the hyperbolic (advection) part of the advection-diffusion equation.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"using OrdinaryDiffEq\nusing Trixi\n\n\nadvection_velocity = (1.0, 1.0)\nequations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);\nnothing #hide","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Define-a-new-parabolic-equation-type","page":"13 Adding new parabolic terms","title":"Define a new parabolic equation type","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Next, we define a 2D parabolic diffusion term type. This is similar to LaplaceDiffusion2D except that the diffusivity field refers to a spatially constant diffusivity matrix now. Note that ConstantAnisotropicDiffusion2D has a field for equations_hyperbolic. It is useful to have information about the hyperbolic system available to the parabolic part so that we can reuse functions defined for hyperbolic equations (such as varnames).","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"The abstract type Trixi.AbstractEquationsParabolic has three parameters: NDIMS (the spatial dimension, e.g., 1D, 2D, or 3D), NVARS (the number of variables), and GradientVariable, which we set as GradientVariablesConservative. This indicates that the gradient should be taken with respect to the conservative variables (e.g., the same variables used in equations_hyperbolic). Users can also take the gradient with respect to a different set of variables; see, for example, the implementation of CompressibleNavierStokesDiffusion2D, which can utilize either \"primitive\" or \"entropy\" variables.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"struct ConstantAnisotropicDiffusion2D{E, T} <: Trixi.AbstractEquationsParabolic{2, 1, GradientVariablesConservative}\n diffusivity::T\n equations_hyperbolic::E\nend\n\nvarnames(variable_mapping, equations_parabolic::ConstantAnisotropicDiffusion2D) =\n varnames(variable_mapping, equations_parabolic.equations_hyperbolic)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Next, we define the viscous flux function. We assume that the mixed hyperbolic-parabolic system is of the form","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"partial_t u(tx) + partial_x (f_1(u) - g_1(u nabla u))\n + partial_y (f_2(u) - g_2(u nabla u)) = 0","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"where f_1(u), f_2(u) are the hyperbolic fluxes and g_1(u nabla u), g_2(u nabla u) denote the viscous fluxes. For anisotropic diffusion, the viscous fluxes are the first and second components of the matrix-vector product involving diffusivity and the gradient vector.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Here, we specialize the flux to our new parabolic equation type ConstantAnisotropicDiffusion2D.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"function Trixi.flux(u, gradients, orientation::Integer, equations_parabolic::ConstantAnisotropicDiffusion2D)\n @unpack diffusivity = equations_parabolic\n dudx, dudy = gradients\n if orientation == 1\n return SVector(diffusivity[1, 1] * dudx + diffusivity[1, 2] * dudy)\n else # if orientation == 2\n return SVector(diffusivity[2, 1] * dudx + diffusivity[2, 2] * dudy)\n end\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Defining-boundary-conditions","page":"13 Adding new parabolic terms","title":"Defining boundary conditions","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Trixi.jl's implementation of parabolic terms discretizes both the gradient and divergence using weak formulation. In other words, we discretize the system","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"beginaligned\nbmq = nabla u \nbmsigma = beginpmatrix g_1(u bmq) g_2(u bmq) endpmatrix \ntextviscous contribution = nabla cdot bmsigma\nendaligned","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Boundary data must be specified for all spatial derivatives, e.g., for both the gradient equation bmq = nabla u and the divergence of the viscous flux nabla cdot bmsigma. We account for this by introducing internal Gradient and Divergence types which are used to dispatch on each type of boundary condition.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"As an example, let us introduce a Dirichlet boundary condition with constant boundary data.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"struct BoundaryConditionConstantDirichlet{T <: Real}\n boundary_value::T\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"This boundary condition contains only the field boundary_value, which we assume to be some real-valued constant which we will impose as the Dirichlet data on the boundary.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Boundary conditions have generally been defined as \"callable structs\" (also known as \"functors\"). For each boundary condition, we need to specify the appropriate boundary data to return for both the Gradient and Divergence. Since the gradient is operating on the solution u, the boundary data should be the value of u, and we can directly impose Dirichlet data.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"@inline function (boundary_condition::BoundaryConditionConstantDirichlet)(flux_inner, u_inner, normal::AbstractVector,\n x, t, operator_type::Trixi.Gradient,\n equations_parabolic::ConstantAnisotropicDiffusion2D)\n return boundary_condition.boundary_value\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"While the gradient acts on the solution u, the divergence acts on the viscous flux bmsigma. Thus, we have to supply boundary data for the Divergence operator that corresponds to bmsigma. However, we've already imposed boundary data on u for a Dirichlet boundary condition, and imposing boundary data for bmsigma might overconstrain our problem.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Thus, for the Divergence boundary data under a Dirichlet boundary condition, we simply return flux_inner, which is boundary data for bmsigma computed using the \"inner\" or interior solution. This way, we supply boundary data for the divergence operation without imposing any additional conditions.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"@inline function (boundary_condition::BoundaryConditionConstantDirichlet)(flux_inner, u_inner, normal::AbstractVector,\n x, t, operator_type::Trixi.Divergence,\n equations_parabolic::ConstantAnisotropicDiffusion2D)\n return flux_inner\nend","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#A-note-on-the-choice-of-gradient-variables","page":"13 Adding new parabolic terms","title":"A note on the choice of gradient variables","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"It is often simpler to transform the solution variables (and solution gradients) to another set of variables prior to computing the viscous fluxes (see CompressibleNavierStokesDiffusion2D for an example of this). If this is done, then the boundary condition for the Gradient operator should be modified accordingly as well.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Putting-things-together","page":"13 Adding new parabolic terms","title":"Putting things together","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"Finally, we can instantiate our new parabolic equation type, define boundary conditions, and run a simulation. The specific anisotropic diffusion matrix we use produces more dissipation in the direction (1 -1) as an isotropic diffusion.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"For boundary conditions, we impose that u=1 on the left wall, u=2 on the bottom wall, and u = 0 on the outflow walls. The initial condition is taken to be u = 0. Note that we use BoundaryConditionConstantDirichlet only for the parabolic boundary conditions, since we have not defined its behavior for the hyperbolic part.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"using Trixi: SMatrix\ndiffusivity = 5.0e-2 * SMatrix{2, 2}([2 -1; -1 2])\nequations_parabolic = ConstantAnisotropicDiffusion2D(diffusivity, equations_hyperbolic);\n\nboundary_conditions_hyperbolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1.0)),\n y_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(2.0)),\n y_pos = boundary_condition_do_nothing,\n x_pos = boundary_condition_do_nothing)\n\nboundary_conditions_parabolic = (; x_neg = BoundaryConditionConstantDirichlet(1.0),\n y_neg = BoundaryConditionConstantDirichlet(2.0),\n y_pos = BoundaryConditionConstantDirichlet(0.0),\n x_pos = BoundaryConditionConstantDirichlet(0.0));\n\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\ncoordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))\ncoordinates_max = ( 1.0, 1.0) # maximum coordinates (max(x), max(y))\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n periodicity=false, n_cells_max=30_000) # set maximum capacity of tree data structure\n\ninitial_condition = (x, t, equations) -> SVector(0.0)\n\nsemi = SemidiscretizationHyperbolicParabolic(mesh,\n (equations_hyperbolic, equations_parabolic),\n initial_condition, solver;\n boundary_conditions=(boundary_conditions_hyperbolic,\n boundary_conditions_parabolic))\n\ntspan = (0.0, 2.0)\node = semidiscretize(semi, tspan)\ncallbacks = CallbackSet(SummaryCallback())\ntime_int_tol = 1.0e-6\nsol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,\n ode_default_options()..., callback=callbacks);\n\nusing Plots\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/#Package-versions","page":"13 Adding new parabolic terms","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"","category":"page"},{"location":"tutorials/adding_new_parabolic_terms/","page":"13 Adding new parabolic terms","title":"13 Adding new parabolic terms","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"EditURL = \"../../literate/src/files/p4est_from_gmsh.jl\"","category":"page"},{"location":"tutorials/p4est_from_gmsh/#p4est_from_gmsh","page":"17 P4est mesh from gmsh","title":"17: P4est mesh from gmsh","text":"","category":"section"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"Trixi.jl supports numerical approximations from structured and unstructured quadrilateral meshes with the P4estMesh mesh type.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"The purpose of this tutorial is to demonstrate how to use the P4estMesh functionality of Trixi.jl for existing meshes with straight-sided (bilinear) elements/cells. This begins by running and visualizing an available unstructured quadrilateral mesh example. Then, the tutorial will cover how to use existing meshes generated by gmsh or any other meshing software that can export to the Abaqus input .inp format.","category":"page"},{"location":"tutorials/p4est_from_gmsh/#Running-the-simulation-of-a-near-field-flow-around-an-airfoil","page":"17 P4est mesh from gmsh","title":"Running the simulation of a near-field flow around an airfoil","text":"","category":"section"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"Trixi.jl supports solving hyperbolic-parabolic problems on several mesh types. A somewhat complex example that employs the P4estMesh is the near-field simulation of a Mach 2 flow around the NACA6412 airfoil.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"using Trixi\nredirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi_include(joinpath(examples_dir(), \"p4est_2d_dgsem\", \"elixir_euler_NACA6412airfoil_mach2.jl\"), tspan=(0.0, 0.5))\nend #hide","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"Conveniently, we use the Plots package to have a first look at the results:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"using Plots\npd = PlotData2D(sol)\nplot(pd[\"rho\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/p4est_from_gmsh/#Creating-a-mesh-using-gmsh","page":"17 P4est mesh from gmsh","title":"Creating a mesh using gmsh","text":"","category":"section"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"The creation of an unstructured quadrilateral mesh using gmsh is driven by a geometry file. There are plenty of possibilities for the user, see the documentation and tutorials.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"To begin, we provide a complete geometry file for the NACA6412 airfoil bounded by a rectangular box. After this we give a breakdown of the most important parts required for successful mesh generation that can later be used by the p4est library and Trixi.jl. We emphasize that this near-field mesh should only be used for instructive purposes and not for actual production runs.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"The associated NACA6412.geo file is given below:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":" // GMSH geometry script for a NACA 6412 airfoil with 11 degree angle of attack\n // in a box (near-field mesh).\n // see https://github.com/cfsengineering/GMSH-Airfoil-2D\n // for software to generate gmsh `.geo` geometry files for NACA airfoils.\n\n // outer bounding box\n Point(1) = {-1.25, -0.5, 0, 1.0};\n Point(2) = {1.25, -0.5, 0, 1.0};\n Point(3) = {1.25, 0.5, 0, 1.0};\n Point(4) = {-1.25, 0.5, 0, 1.0};\n\n // lines of the bounding box\n Line(1) = {1, 2};\n Line(2) = {2, 3};\n Line(3) = {3, 4};\n Line(4) = {4, 1};\n // outer box\n Line Loop(8) = {1, 2, 3, 4};\n\n // Settings\n // This value gives the global element size factor (lower -> finer mesh)\n Mesh.CharacteristicLengthFactor = 1.0 * 2^(-3);\n // Insist on quads instead of default triangles\n Mesh.RecombineAll = 1;\n // Violet instead of green base color for better visibility\n Mesh.ColorCarousel = 0;\n\n // points of the airfoil contour\n // Format: {x, y, z, DesiredCellSize}. See the documentation: https://gmsh.info/doc/texinfo/gmsh.html#Points\n // These concrete points are generated using the tool from https://github.com/cfsengineering/GMSH-Airfoil-2D\n Point(5) = {-0.4900332889206208, 0.09933466539753061, 0, 0.125};\n Point(6) = {-0.4900274857651495, 0.1021542752054094, 0, 0.125};\n Point(7) = {-0.4894921489729144, 0.1049830248247787, 0, 0.125};\n Point(8) = {-0.4884253336670712, 0.1078191282319664, 0, 0.125};\n Point(9) = {-0.4868257975566199, 0.1106599068424483, 0, 0.125};\n Point(10) = {-0.4846930063965668, 0.1135018003016681, 0, 0.125};\n Point(11) = {-0.4820271400142729, 0.1163403835785654, 0, 0.125};\n Point(12) = {-0.4788290988083472, 0.1191703902233889, 0, 0.125};\n Point(13) = {-0.4751005105908123, 0.1219857416089041, 0, 0.125};\n Point(14) = {-0.4708437376101668, 0.1247795819332056, 0, 0.125};\n Point(15) = {-0.4660618835629463, 0.1275443187232316, 0, 0.125};\n Point(16) = {-0.4607588003749649, 0.1302716685409717, 0, 0.125};\n Point(17) = {-0.4549390945110529, 0.132952707559475, 0, 0.125};\n Point(18) = {-0.448608132554204, 0.1355779266432996, 0, 0.125};\n Point(19) = {-0.4417720457819508, 0.138137290538182, 0, 0.125};\n Point(20) = {-0.4344377334597768, 0.140620300747629, 0, 0.125};\n Point(21) = {-0.4266128645686593, 0.1430160616500159, 0, 0.125};\n Point(22) = {-0.4183058776865576, 0.1453133493887722, 0, 0.125};\n Point(23) = {-0.4095259787518715, 0.147500683050503, 0, 0.125};\n Point(24) = {-0.4002831364505879, 0.1495663976315875, 0, 0.125};\n Point(25) = {-0.3905880749878933, 0.1514987182830453, 0, 0.125};\n Point(26) = {-0.3804522640292948, 0.1532858353164163, 0, 0.125};\n Point(27) = {-0.3698879056254708, 0.1549159794501833, 0, 0.125};\n Point(28) = {-0.3589079179688306, 0.1563774967770029, 0, 0.125};\n Point(29) = {-0.3475259158676376, 0.1576589229368209, 0, 0.125};\n Point(30) = {-0.3357561878650377, 0.158749055989923, 0, 0.125};\n Point(31) = {-0.3236136699747923, 0.1596370274972017, 0, 0.125};\n Point(32) = {-0.3111139160522804, 0.1603123713324616, 0, 0.125};\n Point(33) = {-0.298273064867608, 0.160765089773461, 0, 0.125};\n Point(34) = {-0.2851078039966239, 0.1609857164445887, 0, 0.125};\n Point(35) = {-0.2716353306943914, 0.160965375714529, 0, 0.125};\n Point(36) = {-0.2578733099632437, 0.1606958381868515, 0, 0.125};\n Point(37) = {-0.2438398300730194, 0.1601695719599709, 0, 0.125};\n Point(38) = {-0.2295533558334121, 0.1593797893750759, 0, 0.125};\n Point(39) = {-0.2150326799566391, 0.1583204890160489, 0, 0.125};\n Point(40) = {-0.2002968728818922, 0.1569864927736143, 0, 0.125};\n Point(41) = {-0.18536523146042, 0.1553734778363979, 0, 0.125};\n Point(42) = {-0.1702572269208345, 0.1534780035235666, 0, 0.125};\n Point(43) = {-0.1549924525477129, 0.1512975329264932, 0, 0.125};\n Point(44) = {-0.1395905715122586, 0.1488304493795921, 0, 0.125};\n Point(45) = {-0.1240712652914332, 0.1460760678321895, 0, 0.125};\n Point(46) = {-0.1084541831014299, 0.1430346412430583, 0, 0.125};\n Point(47) = {-0.09275889275279087, 0.1397073621660917, 0, 0.125};\n Point(48) = {-0.07700483330818747, 0.1360963597385416, 0, 0.125};\n Point(49) = {-0.06151286635366404, 0.1323050298149023, 0, 0.125};\n Point(50) = {-0.04602933219022032, 0.1283521764905442, 0, 0.125};\n Point(51) = {-0.03051345534800332, 0.1242331665904082, 0, 0.125};\n Point(52) = {-0.01498163190522334, 0.1199540932779839, 0, 0.125};\n Point(53) = {0.0005498526140696458, 0.1155214539466913, 0, 0.125};\n Point(54) = {0.01606484191716884, 0.1109421303284033, 0, 0.125};\n Point(55) = {0.03154732664394777, 0.106223368423828, 0, 0.125};\n Point(56) = {0.0469814611314705, 0.1013727584299359, 0, 0.125};\n Point(57) = {0.06235157928986135, 0.09639821481480275, 0, 0.125};\n Point(58) = {0.07764220964363855, 0.09130795666388933, 0, 0.125};\n Point(59) = {0.09283808959671735, 0.08611048839446452, 0, 0.125};\n Point(60) = {0.1079241789809607, 0.08081458090718853, 0, 0.125};\n Point(61) = {0.1228856729475325, 0.07542925321638272, 0, 0.125};\n Point(62) = {0.1377080142575372, 0.06996375457378261, 0, 0.125};\n Point(63) = {0.1523769050236616, 0.06442754707512513, 0, 0.125};\n Point(64) = {0.1668783179480157, 0.05883028871526293, 0, 0.125};\n Point(65) = {0.1811985070933818, 0.05318181683604975, 0, 0.125};\n Point(66) = {0.1953240182159306, 0.04749213189240609, 0, 0.125};\n Point(67) = {0.2092416986775084, 0.04177138144606024, 0, 0.125};\n Point(68) = {0.2229387069452062, 0.03602984428372727, 0, 0.125};\n Point(69) = {0.2364025216754475, 0.03027791454712048, 0, 0.125};\n Point(70) = {0.2496209503696738, 0.02452608575629232, 0, 0.125};\n Point(71) = {0.2625821375791982, 0.01878493460541621, 0, 0.125};\n Point(72) = {0.2752745726282818, 0.01306510441121807, 0, 0.125};\n Point(73) = {0.28768709681727, 0.007377288098728577, 0, 0.125};\n Point(74) = {0.2998089100619555, 0.001732210616722449, 0, 0.125};\n Point(75) = {0.3116295769214332, -0.003859389314124759, 0, 0.125};\n Point(76) = {0.3231390319647309, -0.009386778203927332, 0, 0.125};\n Point(77) = {0.3343275844265582, -0.01483924761490708, 0, 0.125};\n Point(78) = {0.3451859221046181, -0.02020613485126957, 0, 0.125};\n Point(79) = {0.3557051144551212, -0.02547684454806881, 0, 0.125};\n Point(80) = {0.3658766148492779, -0.03064087116872238, 0, 0.125};\n Point(81) = {0.3756922619615632, -0.0356878223992288, 0, 0.125};\n Point(82) = {0.3851442802702071, -0.0406074434050937, 0, 0.125};\n Point(83) = {0.394225279661484, -0.04538964189492445, 0, 0.125};\n Point(84) = {0.4029282541416501, -0.05002451391298904, 0, 0.125};\n Point(85) = {0.4112465796735204, -0.05450237026215737, 0, 0.125};\n Point(86) = {0.4191740111683733, -0.05881376343890812, 0, 0.125};\n Point(87) = {0.4267046786777481, -0.06294951494382847, 0, 0.125};\n Point(88) = {0.4338330828434404, -0.06690074281456823, 0, 0.125};\n Point(89) = {0.4405540896772232, -0.07065888921378868, 0, 0.125};\n Point(90) = {0.4468629247542237, -0.07421574789251445, 0, 0.125};\n Point(91) = {0.4527551669150955, -0.0775634913396257, 0, 0.125};\n Point(92) = {0.4582267415819197, -0.08069469742118066, 0, 0.125};\n Point(93) = {0.4632739138007936, -0.08360237530891265, 0, 0.125};\n Point(94) = {0.4678932811302005, -0.08627999049569551, 0, 0.125};\n Point(95) = {0.4720817664982195, -0.08872148869699745, 0, 0.125};\n Point(96) = {0.4758366111533843, -0.09092131844134463, 0, 0.125};\n Point(97) = {0.4791553678333992, -0.09287445215953141, 0, 0.125};\n Point(98) = {0.4820358942729613, -0.09457640559161551, 0, 0.125};\n Point(99) = {0.4844763471666588, -0.09602325534252773, 0, 0.125};\n Point(100) = {0.4864751766953637, -0.09721165443119822, 0, 0.125};\n Point(101) = {0.4880311217148797, -0.09813884569428721, 0, 0.125};\n Point(102) = {0.4891432056939881, -0.09880267292366274, 0, 0.125};\n Point(103) = {0.4898107334756874, -0.09920158963645126, 0, 0.125};\n Point(104) = {0.4900332889206208, -0.09933466539753058, 0, 0.125};\n Point(105) = {0.4897824225031319, -0.09926905587549506, 0, 0.125};\n Point(106) = {0.4890301110661922, -0.09907236506934192, 0, 0.125};\n Point(107) = {0.4877772173496635, -0.09874500608402761, 0, 0.125};\n Point(108) = {0.48602517690576, -0.09828766683852558, 0, 0.125};\n Point(109) = {0.4837759946062035, -0.09770130916007558, 0, 0.125};\n Point(110) = {0.4810322398085871, -0.09698716747297723, 0, 0.125};\n Point(111) = {0.4777970402368822, -0.09614674703990023, 0, 0.125};\n Point(112) = {0.4740740746447117, -0.09518182170326678, 0, 0.125};\n Point(113) = {0.4698675643422793, -0.09409443106501386, 0, 0.125};\n Point(114) = {0.4651822636784212, -0.09288687703518478, 0, 0.125};\n Point(115) = {0.460023449577924, -0.09156171967354482, 0, 0.125};\n Point(116) = {0.4543969102408585, -0.09012177224394632, 0, 0.125};\n Point(117) = {0.4483089331151018, -0.08857009539864649, 0, 0.125};\n Point(118) = {0.4417662922553667, -0.08690999040934186, 0, 0.125};\n Point(119) = {0.4347762351819332, -0.0851449913634191, 0, 0.125};\n Point(120) = {0.4273464693498908, -0.08327885624791403, 0, 0.125};\n Point(121) = {0.419485148335155, -0.08131555684993674, 0, 0.125};\n Point(122) = {0.411200857836944, -0.07925926741086739, 0, 0.125};\n Point(123) = {0.4025026015879757, -0.07711435198240155, 0, 0.125};\n Point(124) = {0.3933997872536054, -0.07488535044544484, 0, 0.125};\n Point(125) = {0.3839022123897198, -0.07257696316779733, 0, 0.125};\n Point(126) = {0.3740200505167618, -0.07019403429336624, 0, 0.125};\n Point(127) = {0.3637638373540689, -0.06774153367408606, 0, 0.125};\n Point(128) = {0.3531444572451353, -0.06522453747557577, 0, 0.125};\n Point(129) = {0.3421731297908021, -0.06264820750853495, 0, 0.125};\n Point(130) = {0.3308613966940724, -0.06001776935966011, 0, 0.125};\n Point(131) = {0.3192211088076166, -0.05733848941811218, 0, 0.125};\n Point(132) = {0.3072644133633567, -0.05461565091590426, 0, 0.125};\n Point(133) = {0.2950037413531683, -0.05185452912263369, 0, 0.125};\n Point(134) = {0.2824517950208982, -0.04906036585632723, 0, 0.125};\n Point(135) = {0.2696215354188702, -0.04623834349241404, 0, 0.125};\n Point(136) = {0.2565261699769623, -0.04339355867155523, 0, 0.125};\n Point(137) = {0.2431791400293651, -0.04053099592384862, 0, 0.125};\n Point(138) = {0.2295941082432855, -0.03765550144139543, 0, 0.125};\n Point(139) = {0.2157849458952252, -0.03477175724299444, 0, 0.125};\n Point(140) = {0.2017657199439165, -0.03188425598348005, 0, 0.125};\n Point(141) = {0.187550679854507, -0.02899727666564914, 0, 0.125};\n Point(142) = {0.1731542441359161, -0.02611486151457043, 0, 0.125};\n Point(143) = {0.1585909865622793, -0.02324079427214604, 0, 0.125};\n Point(144) = {0.1438756220597465, -0.02037858016395433, 0, 0.125};\n Point(145) = {0.129022992251319, -0.0175314277805827, 0, 0.125};\n Point(146) = {0.1140480506645569, -0.01470223310184333, 0, 0.125};\n Point(147) = {0.09896584761949168, -0.01189356587453844, 0, 0.125};\n Point(148) = {0.08379151482656089, -0.009107658532933174, 0, 0.125};\n Point(149) = {0.06854024973648176, -0.006346397826038436, 0, 0.125};\n Point(150) = {0.05322729969528361, -0.003611319287478529, 0, 0.125};\n Point(151) = {0.03786794596792287, -0.00090360465249055, 0, 0.125};\n Point(152) = {0.0224774877026287, 0.00177591770710904, 0, 0.125};\n Point(153) = {0.007071225915134205, 0.004426769294862437, 0, 0.125};\n Point(154) = {-0.00833555242305456, 0.007048814950562587, 0, 0.125};\n Point(155) = {-0.02372759010533726, 0.009642253300220296, 0, 0.125};\n Point(156) = {-0.03908967513210498, 0.01220760427359278, 0, 0.125};\n Point(157) = {-0.05440665578848514, 0.01474569380579989, 0, 0.125};\n Point(158) = {-0.06966345527617318, 0.01725763587663899, 0, 0.125};\n Point(159) = {-0.08484508582421563, 0.01974481207672138, 0, 0.125};\n Point(160) = {-0.09987987792382108, 0.02219618763023203, 0, 0.125};\n Point(161) = {-0.1145078729404739, 0.02450371976411331, 0, 0.125};\n Point(162) = {-0.1290321771824579, 0.0267015185742735, 0, 0.125};\n Point(163) = {-0.143440065923266, 0.02879471001709845, 0, 0.125};\n Point(164) = {-0.1577189448447794, 0.03078883518202784, 0, 0.125};\n Point(165) = {-0.1718563428491159, 0.03268980457290044, 0, 0.125};\n Point(166) = {-0.1858399037768357, 0.03450385196323842, 0, 0.125};\n Point(167) = {-0.1996573773370766, 0.03623748825421298, 0, 0.125};\n Point(168) = {-0.2132966095779342, 0.03789745574015834, 0, 0.125};\n Point(169) = {-0.2267455332406906, 0.0394906831577609, 0, 0.125};\n Point(170) = {-0.2399921583489679, 0.04102424186233269, 0, 0.125};\n Point(171) = {-0.2530245633834605, 0.04250530343879837, 0, 0.125};\n Point(172) = {-0.2658308873846617, 0.04394109901707172, 0, 0.125};\n Point(173) = {-0.2783993233102972, 0.04533888052223981, 0, 0.125};\n Point(174) = {-0.2907181129514687, 0.04670588405019788, 0, 0.125};\n Point(175) = {-0.3027755436824813, 0.0480492955198111, 0, 0.125};\n Point(176) = {-0.3145599472847223, 0.04937621871394801, 0, 0.125};\n Point(177) = {-0.3260597010456697, 0.05069364578437131, 0, 0.125};\n Point(178) = {-0.337263231291058, 0.05200843025992359, 0, 0.125};\n Point(179) = {-0.3481590194623916, 0.05332726256406103, 0, 0.125};\n Point(180) = {-0.3587356108043638, 0.05465664801682354, 0, 0.125};\n Point(181) = {-0.3689816256782782, 0.0560028872679817, 0, 0.125};\n Point(182) = {-0.3788857734692287, 0.05737205908247899, 0, 0.125};\n Point(183) = {-0.3884368690074614, 0.05877000537646382, 0, 0.125};\n Point(184) = {-0.3976238513788748, 0.06020231838219783, 0, 0.125};\n Point(185) = {-0.40643580495675, 0.06167432980291591, 0, 0.125};\n Point(186) = {-0.4148619824472646, 0.06319110180426264, 0, 0.125};\n Point(187) = {-0.4228918297057104, 0.06475741967717524, 0, 0.125};\n Point(188) = {-0.43051501204915, 0.06637778599795482, 0, 0.125};\n Point(189) = {-0.4377214417649294, 0.06805641610468524, 0, 0.125};\n Point(190) = {-0.4445013064933708, 0.06979723470503821, 0, 0.125};\n Point(191) = {-0.4508450981473512, 0.07160387342876083, 0, 0.125};\n Point(192) = {-0.4567436420215075, 0.073479669138689, 0, 0.125};\n Point(193) = {-0.4621881257395756, 0.07542766281688272, 0, 0.125};\n Point(194) = {-0.4671701276898881, 0.07745059884734995, 0, 0.125};\n Point(195) = {-0.471681644606229, 0.07955092452372269, 0, 0.125};\n Point(196) = {-0.4757151179639407, 0.0817307896190848, 0, 0.125};\n Point(197) = {-0.4792634588791559, 0.0839920458658267, 0, 0.125};\n Point(198) = {-0.4823200712220043, 0.08633624620581726, 0, 0.125};\n Point(199) = {-0.4848788726822436, 0.08876464368523246, 0, 0.125};\n Point(200) = {-0.4869343135575803, 0.09127818988394577, 0, 0.125};\n Point(201) = {-0.4884813930704814, 0.09387753278635144, 0, 0.125};\n Point(202) = {-0.4895156730580155, 0.09656301401871749, 0, 0.125};\n\n // splines of the airfoil\n Spline(5) = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104};\n Spline(6) = {104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,5};\n\n // airfoil\n Line Loop(9) = {5, 6};\n // complete domain\n Plane Surface(1) = {8, 9};\n\n // labeling of the boundary parts\n Physical Line(1) = {4}; // inflow\n Physical Line(2) = {2}; // outflow\n Physical Line(3) = {1, 3}; // airfoil\n Physical Line(4) = {5, 6}; // upper/lower wall\n Physical Surface(1) = {10};","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"From which we can construct a mesh like this: (Image: mesh_screenshot)","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"The first four points define the bounding box = (near-field) domain:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":" // outer bounding box\nPoint(1) = {-1.25, -0.5, 0, 1.0};\nPoint(2) = {1.25, -0.5, 0, 1.0};\nPoint(3) = {1.25, 0.5, 0, 1.0};\nPoint(4) = {-1.25, 0.5, 0, 1.0};","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"which is constructed from connecting the points in lines:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"// outer box\nLine(1) = {1, 2};\nLine(2) = {2, 3};\nLine(3) = {3, 4};\nLine(4) = {4, 1};\n// outer box\nLine Loop(8) = {1, 2, 3, 4};","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"This is followed by a couple (in principle optional) settings where the most important one is","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"// Insist on quads instead of default triangles\nMesh.RecombineAll = 1;","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"which forces gmsh to generate quadrilateral elements instead of the default triangles. This is strictly required to be able to use the mesh later with p4est, which supports only straight-sided quads, i.e., C2D4, CPS4, S4 in 2D and C3D in 3D. See for more details the (short) documentation on the interaction of p4est with .inp files. In principle, it should also be possible to use the recombine function of gmsh to convert the triangles to quads, but this is observed to be less robust than enforcing quads from the beginning.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"Then the airfoil is defined by a set of points:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"// points of the airfoil contour\n Point(5) = {-0.4900332889206208, 0.09933466539753061, 0, 0.125};\n Point(6) = {-0.4900274857651495, 0.1021542752054094, 0, 0.125};\n ...","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"which are connected by splines for the upper and lower part of the airfoil:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"// splines of the airfoil\n Spline(5) = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,\n ...\n 96,97,98,99,100,101,102,103,104};\n Spline(6) = {104,105,106,107,108,109,110,111,112,113,114,115,\n ...\n 200,201,202,5};","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"which are then connected to form a single line loop for easy physical group assignment:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"// airfoil\n Line Loop(9) = {5, 6};","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"At the end of the file the physical groups are defined:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"// labeling of the boundary parts\n Physical Line(1) = {4}; // Inflow. Label in Abaqus .inp file: PhysicalLine1\n Physical Line(2) = {2}; // Outflow. Label in Abaqus .inp file: PhysicalLine2\n Physical Line(3) = {1, 3}; // Upper and lower wall/farfield/... Label in Abaqus .inp file: PhysicalLine3\n Physical Line(4) = {5, 6}; // Airfoil. Label in Abaqus .inp file: PhysicalLine4","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"which are crucial for the correct assignment of boundary conditions in Trixi.jl. In particular, it is the responsibility of a user to keep track on the physical boundary names between the mesh generation and assignment of boundary condition functions in an elixir.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"After opening this file in gmsh, meshing the geometry and exporting to Abaqus .inp format, we can have a look at the input file:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"*Heading\n \n*NODE\n1, -1.25, -0.5, 0\n2, 1.25, -0.5, 0\n3, 1.25, 0.5, 0\n4, -1.25, 0.5, 0\n...\n******* E L E M E N T S *************\n*ELEMENT, type=T3D2, ELSET=Line1\n1, 1, 7\n...\n*ELEMENT, type=CPS4, ELSET=Surface1\n191, 272, 46, 263, 807\n...\n*NSET,NSET=PhysicalLine1\n1, 4, 52, 53, 54, 55, 56, 57, 58,\n*NSET,NSET=PhysicalLine2\n2, 3, 26, 27, 28, 29, 30, 31, 32,\n*NSET,NSET=PhysicalLine3\n1, 2, 3, 4, 7, 8, 9, 10, 11, 12,\n13, 14, 15, 16, 17, 18, 19, 20, 21, 22,\n23, 24, 25, 33, 34, 35, 36, 37, 38, 39,\n40, 41, 42, 43, 44, 45, 46, 47, 48, 49,\n50, 51,\n*NSET,NSET=PhysicalLine4\n5, 6, 59, 60, 61, 62, 63, 64, 65, 66,\n67, 68, 69, 70, 71, 72, 73, 74, 75, 76,\n77, 78, 79, 80, 81, 82, 83, 84, 85, 86,\n87, 88, 89, 90, 91, 92, 93, 94, 95, 96,\n97, 98, 99, 100, 101, 102, 103, 104, 105, 106,\n107, 108, 109, 110, 111, 112, 113, 114, 115, 116,\n117, 118, 119, 120, 121, 122, 123, 124, 125, 126,\n127, 128, 129, 130, 131, 132, 133, 134, 135, 136,\n137, 138, 139, 140, 141, 142, 143, 144, 145, 146,\n147, 148, 149, 150, 151, 152, 153, 154, 155, 156,\n157, 158, 159, 160, 161, 162, 163, 164, 165, 166,\n167, 168, 169, 170, 171, 172, 173, 174, 175, 176,\n177, 178, 179, 180, 181, 182, 183, 184, 185, 186,\n187, 188, 189, 190,","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"First, the coordinates of the nodes are listed, followed by the elements. Note that gmsh exports also line elements of type T3D2 which are ignored by p4est. The relevant elements in 2D which form the gridcells are of type CPS4 which are defined by their four corner nodes. This is followed by the nodesets encoded via *NSET which are used to assign boundary conditions in Trixi.jl. Trixi.jl parses the .inp file and assigns the edges (in 2D, surfaces in 3D) of elements to the corresponding boundary condition based on the supplied boundary_symbols that have to be supplied to the P4estMesh constructor:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"# boundary symbols\nboundary_symbols = [:PhysicalLine1, :PhysicalLine2, :PhysicalLine3, :PhysicalLine4]\nmesh = P4estMesh{2}(mesh_file, polydeg = polydeg, boundary_symbols = boundary_symbols)","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"The same boundary symbols have then also be supplied to the semidiscretization alongside the corresponding physical boundary conditions:","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"# Supersonic inflow boundary condition.\n# Calculate the boundary flux entirely from the external solution state, i.e., set\n# external solution state values for everything entering the domain.\n@inline function boundary_condition_supersonic_inflow(u_inner,\n normal_direction::AbstractVector,\n x, t, surface_flux_function,\n equations::CompressibleEulerEquations2D)\n u_boundary = initial_condition_mach2_flow(x, t, equations)\n flux = Trixi.flux(u_boundary, normal_direction, equations)\n\n return flux\nend\n\n# Supersonic outflow boundary condition.\n# Calculate the boundary flux entirely from the internal solution state. Analogous to supersonic inflow\n# except all the solution state values are set from the internal solution as everything leaves the domain\n@inline function boundary_condition_supersonic_outflow(u_inner,\n normal_direction::AbstractVector, x,\n t,\n surface_flux_function,\n equations::CompressibleEulerEquations2D)\nflux = Trixi.flux(u_inner, normal_direction, equations)\n\nboundary_conditions = Dict(:PhysicalLine1 => boundary_condition_supersonic_inflow, # Left boundary\n :PhysicalLine2 => boundary_condition_supersonic_outflow, # Right boundary\n :PhysicalLine3 => boundary_condition_supersonic_outflow, # Top and bottom boundary\n :PhysicalLine4 => boundary_condition_slip_wall) # Airfoil\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions = boundary_conditions)","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"Note that you have to supply the boundary_symbols keyword to the P4estMesh constructor to select the boundaries from the available nodesets in the .inp file. If the boundary_symbols keyword is not supplied, all boundaries will be assigned to the default set :all.","category":"page"},{"location":"tutorials/p4est_from_gmsh/#Package-versions","page":"17 P4est mesh from gmsh","title":"Package versions","text":"","category":"section"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\", \"Download\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"","category":"page"},{"location":"tutorials/p4est_from_gmsh/","page":"17 P4est mesh from gmsh","title":"17 P4est mesh from gmsh","text":"This page was generated using Literate.jl.","category":"page"},{"location":"code_of_conduct/","page":"Code of Conduct","title":"Code of Conduct","text":"EditURL = \"https://github.com/trixi-framework/Trixi.jl/blob/main/CODE_OF_CONDUCT.md\"","category":"page"},{"location":"code_of_conduct/#code-of-conduct","page":"Code of Conduct","title":"Code of Conduct","text":"","category":"section"},{"location":"code_of_conduct/","page":"Code of Conduct","title":"Code of Conduct","text":"Contributor Covenant Code of ConductOur PledgeWe as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.Our StandardsExamples of behavior that contributes to a positive environment for our community include:Demonstrating empathy and kindness toward other people\nBeing respectful of differing opinions, viewpoints, and experiences\nGiving and gracefully accepting constructive feedback\nAccepting responsibility and apologizing to those affected by our mistakes, and learning from the experience\nFocusing on what is best not just for us as individuals, but for the overall communityExamples of unacceptable behavior include:The use of sexualized language or imagery, and sexual attention or advances of any kind\nTrolling, insulting or derogatory comments, and personal or political attacks\nPublic or private harassment\nPublishing others' private information, such as a physical or email address, without their explicit permission\nOther conduct which could reasonably be considered inappropriate in a professional settingEnforcement ResponsibilitiesCommunity leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.ScopeThis Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.EnforcementInstances of abusive, harassing, or otherwise unacceptable behavior may be reported to Michael Schlottke-Lakemper, Hendrik Ranocha, or any other of the principal developers responsible for enforcement listed in Authors. All complaints will be reviewed and investigated promptly and fairly.All community leaders are obligated to respect the privacy and security of the reporter of any incident.Enforcement GuidelinesCommunity leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:1. CorrectionCommunity Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.2. WarningCommunity Impact: A violation through a single incident or series of actions.Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.3. Temporary BanCommunity Impact: A serious violation of community standards, including sustained inappropriate behavior.Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.4. Permanent BanCommunity Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.Consequence: A permanent ban from any sort of public interaction within the community.AttributionThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/codeofconduct.html.Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.[homepage]: https://www.contributor-covenant.orgFor answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.","category":"page"},{"location":"conventions/#conventions","page":"Conventions","title":"Conventions","text":"","category":"section"},{"location":"conventions/#Spatial-dimensions-and-directions","page":"Conventions","title":"Spatial dimensions and directions","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"We use the following numbering schemes on Cartesian or curved structured meshes.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"The orientations are numbered as 1 => x, 2 => y, 3 => z. For example, numerical fluxes such as flux_central(u_ll, u_rr, orientation, equations::AbstractEquations) use the orientation in this way.\nThe directions are numbered as 1 => -x, 2 => +x, 3 => -y, 4 => +y, 5 => -z, 6 => +z. For example, the boundary_conditions are ordered in this way when a Tuple of boundary conditions per direction is passed to the constructor of a SemidiscretizationHyperbolic.\nFor structured and unstructured curved meshes the concept of direction is generalized via the variable normal_direction. This variable points in the normal direction at a given, curved surface. For the computation of boundary fluxes the normal_direction is normalized to be a normal_vector used, for example, in FluxRotated.","category":"page"},{"location":"conventions/#Cells-vs.-elements-vs.-nodes","page":"Conventions","title":"Cells vs. elements vs. nodes","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"To uniquely distinguish between different components of the discretization, we use the following naming conventions:","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"The computational domain is discretized by a mesh, which is made up of individual cells. In general, neither the mesh nor the cells should be aware of any solver-specific knowledge, i.e., they should not store anything that goes beyond the geometrical information and the connectivity.\nThe numerical solvers do not directly store their information inside the mesh, but use own data structures. Specifically, for each cell on which a solver wants to operate, the solver creates an element to store solver-specific data.\nFor discretization schemes such as the discontinuous Galerkin or the finite element method, inside each element multiple nodes may be defined, which hold nodal information. The nodes are again a solver-specific component, just like the elements.\nWe often identify elements, nodes, etc. with their (local or global) integer index. Convenience iterators such as eachelement, eachnode use these indices.","category":"page"},{"location":"conventions/#Keywords-in-elixirs","page":"Conventions","title":"Keywords in elixirs","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Trixi.jl is distributed with several examples in the form of elixirs, small Julia scripts containing everything to set up and run a simulation. Working interactively from the Julia REPL with these scripts can be quite convenient while for exploratory research and development of Trixi.jl. For example, you can use the convenience function trixi_include to include an elixir with some modified arguments. To enable this, it is helpful to use a consistent naming scheme in elixirs, since trixi_include can only perform simple replacements. Some standard variables names are","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"polydeg for the polynomial degree of a solver\nsurface_flux for the numerical flux at surfaces\nvolume_flux for the numerical flux used in flux differencing volume terms","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Moreover, convergence_test requires that the spatial resolution is set via the keywords","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"initial_refinement_level (an integer, e.g. for the TreeMesh and the P4estMesh) or\ncells_per_dimension (a tuple of integers, one per spatial dimension, e.g. for the StructuredMesh and the DGMultiMesh).","category":"page"},{"location":"conventions/#Variable-names","page":"Conventions","title":"Variable names","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Use descriptive names (using snake_case for variables/functions and CamelCase for types)\nUse a suffix _ as in name_ for local variables that would otherwise hide existing symbols.\nUse a prefix _ as in _name to indicate internal methods/data that are \"fragile\" in the sense that there's no guarantee that they might get changed without notice. These are also not documented with a docstring (but maybe with comments using #).","category":"page"},{"location":"conventions/#Array-types-and-wrapping","page":"Conventions","title":"Array types and wrapping","text":"","category":"section"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"To allow adaptive mesh refinement efficiently when using time integrators from OrdinaryDiffEq, Trixi.jl allows to represent numerical solutions in two different ways. Some discussion can be found online and in form of comments describing Trixi.wrap_array and Trixi.wrap_array_native in the source code of Trixi.jl. The flexibility introduced by this possible wrapping enables additional performance optimizations. However, it comes at the cost of some additional abstractions (and needs to be used with caution, as described in the source code of Trixi.jl). Thus, we use the following conventions to distinguish between arrays visible to the time integrator and wrapped arrays mainly used internally.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Arrays visible to the time integrator have a suffix _ode, e.g., du_ode, u_ode.\nWrapped arrays do not have a suffix, e.g., du, u.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"Methods either accept arrays visible to the time integrator or wrapped arrays based on the following rules.","category":"page"},{"location":"conventions/","page":"Conventions","title":"Conventions","text":"When some solution is passed together with a semidiscretization semi, the solution must be a u_ode that needs to be wrapped via wrap_array(u_ode, semi) (or wrap_array_native(u_ode, semi)) for further processing.\nWhen some solution is passed together with the mesh, equations, solver, cache, ..., it is already wrapped via wrap_array (or wrap_array_native).\nExceptions of this rule are possible, e.g. for AMR, but must be documented in the code.\nwrap_array should be used as default option. wrap_array_native should only be used when necessary, e.g., to avoid additional overhead when interfacing with external C libraries such as HDF5, MPI, or visualization.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"EditURL = \"../../literate/src/files/non_periodic_boundaries.jl\"","category":"page"},{"location":"tutorials/non_periodic_boundaries/#non_periodic_boundaries","page":"6 Non-periodic boundaries","title":"6: Non-periodic boundaries","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/non_periodic_boundaries/#Dirichlet-boundary-condition","page":"6 Non-periodic boundaries","title":"Dirichlet boundary condition","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"First, let's look at the Dirichlet boundary condition BoundaryConditionDirichlet.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"BoundaryConditionDirichlet(boundary_value_function)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"In Trixi.jl, this creates a Dirichlet boundary condition where the function boundary_value_function is used to set the values at the boundary. It can be used to create a boundary condition that sets exact boundary values by passing the exact solution of the equation.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"It is important to note that standard Dirichlet boundary conditions for hyperbolic PDEs do not make sense in most cases. However, we are using a special weak form of the Dirichlet boundary condition, based on the application of the numerical surface flux. The numerical surface flux takes the solution value from inside the domain and the prescribed value of the outer boundary state as arguments, and solves an approximate Riemann problem to introduce dissipation (and hence stabilization) at the boundary. Hence, the performance of the Dirichlet BC depends on the fidelity of the numerical surface flux. An easy-to read introductory reference on this topic is the paper by Mengaldo et al..","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"The passed boundary value function is called with the same arguments as an initial condition function, i.e.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"boundary_value_function(x, t, equations)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"where x specifies the spatial coordinates, t is the current time, and equations is the corresponding system of equations.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"We want to give a short example for a simulation with such a Dirichlet BC.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"Consider the one-dimensional linear advection equation with domain Omega=0 2 and a constant zero initial condition.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"using OrdinaryDiffEq, Trixi\n\nadvection_velocity = 1.0\nequations = LinearScalarAdvectionEquation1D(advection_velocity)\n\ninitial_condition_zero(x, t, equation::LinearScalarAdvectionEquation1D) = SVector(0.0)\ninitial_condition = initial_condition_zero\n\nusing Plots\nplot(x -> sum(initial_condition(x, 0.0, equations)), label=\"initial condition\", ylim=(-1.5, 1.5))","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"Using an advection velocity of 1.0 and the (local) Lax-Friedrichs/Rusanov flux FluxLaxFriedrichs as a numerical surface flux, we are able to create an inflow boundary on the left and an outflow boundary on the right, as the Lax-Friedrichs flux is in this case an exact characteristics Riemann solver. We note that for more complex PDEs different strategies for inflow/outflow boundaries are necessary. To define the inflow values, we initialize a boundary_value_function.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"function boundary_condition_sine_sector(x, t, equation::LinearScalarAdvectionEquation1D)\n if 1 <= t <= 3\n scalar = sin(2 * pi * sum(t - 1))\n else\n scalar = zero(t)\n end\n return SVector(scalar)\nend\nboundary_condition = boundary_condition_sine_sector","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"We set the BC in negative and positive x-direction.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"boundary_conditions = (x_neg=BoundaryConditionDirichlet(boundary_condition),\n x_pos=BoundaryConditionDirichlet(boundary_condition))","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n\ncoordinates_min = (0.0,)\ncoordinates_max = (2.0,)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"For the mesh type TreeMesh the parameter periodicity must be set to false in the corresponding direction.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"mesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n n_cells_max=10_000,\n periodicity=false)\n\n\nsemi = SemidiscretizationHyperbolic(mesh, equations,\n initial_condition,\n solver,\n boundary_conditions=boundary_conditions)\n\ntspan = (0.0, 6.0)\node = semidiscretize(semi, tspan)\n\nanalysis_callback = AnalysisCallback(semi, interval=100,)\n\nstepsize_callback = StepsizeCallback(cfl=0.9)\n\ncallbacks = CallbackSet(analysis_callback,\n stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"We define some equidistant nodes for the visualization","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"visnodes = range(tspan[1], tspan[2], length=300)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"and run the simulation.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, saveat=visnodes, callback=callbacks);\n\nusing Plots\n@gif for step in 1:length(sol.u)\n plot(sol.u[step], semi, ylim=(-1.5, 1.5), legend=true, label=\"approximation\", title=\"time t=$(round(sol.t[step], digits=5))\")\n scatter!([0.0], [sum(boundary_condition(SVector(0.0), sol.t[step], equations))], label=\"boundary condition\")\nend","category":"page"},{"location":"tutorials/non_periodic_boundaries/#Other-available-example-elixirs-with-non-trivial-BC","page":"6 Non-periodic boundaries","title":"Other available example elixirs with non-trivial BC","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"Moreover, there are other boundary conditions in Trixi.jl. For instance, you can use the slip wall boundary condition boundary_condition_slip_wall.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"Trixi.jl provides some interesting examples with different combinations of boundary conditions, e.g. using boundary_condition_slip_wall and other self-defined boundary conditions using BoundaryConditionDirichlet.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"For instance, there is a 2D compressible Euler setup for a Mach 3 wind tunnel flow with a forward facing step in the elixir elixir_euler_forward_step_amr.jl discretized with a P4estMesh using adaptive mesh refinement (AMR).","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":" \n
","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"Source: Video on Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"A double Mach reflection problem for the 2D compressible Euler equations elixir_euler_double_mach_amr.jl exercises a special boundary conditions along the bottom of the domain that is a mixture of Dirichlet and slip wall.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":" \n
","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"Source: Video on Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"A channel flow around a cylinder at Mach 3 elixir_euler_supersonic_cylinder.jl contains supersonic Mach 3 inflow at the left portion of the domain and supersonic outflow at the right portion of the domain. The top and bottom of the channel as well as the cylinder are treated as Euler slip wall boundaries.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":" \n
","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"Source: Video on Trixi.jl's YouTube channel Trixi Framework","category":"page"},{"location":"tutorials/non_periodic_boundaries/#Package-versions","page":"6 Non-periodic boundaries","title":"Package versions","text":"","category":"section"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"","category":"page"},{"location":"tutorials/non_periodic_boundaries/","page":"6 Non-periodic boundaries","title":"6 Non-periodic boundaries","text":"This page was generated using Literate.jl.","category":"page"},{"location":"parallelization/#Parallelization","page":"Parallelization","title":"Parallelization","text":"","category":"section"},{"location":"parallelization/#Shared-memory-parallelization-with-threads","page":"Parallelization","title":"Shared-memory parallelization with threads","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Many compute-intensive loops in Trixi.jl are parallelized using the multi-threading support provided by Julia. You can recognize those loops by the @threaded macro prefixed to them, e.g.,","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"@threaded for element in eachelement(dg, cache)\n ...\nend","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"This will statically assign an equal iteration count to each available thread.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"To use multi-threading, you need to tell Julia at startup how many threads you want to use by either setting the environment variable JULIA_NUM_THREADS or by providing the -t/--threads command line argument. For example, to start Julia with four threads, start Julia with","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia --threads=4","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If both the environment variable and the command line argument are specified at the same time, the latter takes precedence.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If you use time integration methods from OrdinaryDiffEq.jl and want to use multiple threads therein, you need to set the keyword argument thread=OrdinaryDiffEq.True() of the algorithms, as described in the section on time integration methods.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"warning: Warning\nNot everything is parallelized yet and there are likely opportunities to improve scalability. Multi-threading isn't considered part of the public API of Trixi.jl yet.","category":"page"},{"location":"parallelization/#Distributed-computing-with-MPI","page":"Parallelization","title":"Distributed computing with MPI","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"In addition to the shared memory parallelization with multi-threading, Trixi.jl supports distributed parallelism via MPI.jl, which leverages the Message Passing Interface (MPI). MPI.jl comes with its own MPI library binaries such that there is no need to install MPI yourself. However, it is also possible to instead use an existing MPI installation, which is recommended if you are running MPI programs on a cluster or supercomputer (see the MPI.jl docs to find out how to select the employed MPI library). Additional notes on how to use a system-provided MPI installation with Trixi.jl can be found in the following subsection.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"warning: Work in progress\nMPI-based parallelization is work in progress and not finished yet. Nothing related to MPI is part of the official API of Trixi.jl yet.","category":"page"},{"location":"parallelization/#parallel_system_MPI","page":"Parallelization","title":"Using a system-provided MPI installation","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"When using Trixi.jl with a system-provided MPI backend, the underlying p4est, t8code and HDF5 libraries need to be compiled with the same MPI installation. If you want to use p4est (via the P4estMesh) or t8code (via the T8codeMesh) from Trixi.jl, you also need to use system-provided p4est or t8code installations (for notes on how to install p4est and t8code see, e.g., here and here, use the configure option --enable-mpi). Otherwise, there will be warnings that no preference is set for P4est.jl and T8code.jl that can be ignored if you do not use these libraries from Trixi.jl. Note that t8code already comes with a p4est installation, so it suffices to install t8code. In order to use system-provided p4est and t8code installations, P4est.jl and T8code.jl need to be configured to use the custom installations. Follow the steps described here and here for the configuration. The paths that point to libp4est.so (and potentially to libsc.so) need to be the same for P4est.jl and T8code.jl. This could, e.g., be libp4est.so that usually can be found in lib/ or local/lib/ in the installation directory of t8code. Note that the T8codeMesh, however, does not support MPI yet. The preferences for HDF5.jl always need to be set, even if you do not want to use HDF5 from Trixi.jl, see also issue #1079 in HDF5.jl. To set the preferences for HDF5.jl, follow the instructions described here.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"In total, in your active Julia project you should have a LocalPreferences.toml file with sections [MPIPreferences], [T8code] (only needed if T8codeMesh is used), [P4est] (only needed if P4estMesh is used), and [HDF5] as well as an entry MPIPreferences in your Project.toml to use a custom MPI installation. A LocalPreferences.toml file created as described above might look something like the following:","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"[HDF5]\nlibhdf5 = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so\"\nlibhdf5_hl = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5_hl.so\"\n\n[HDF5_jll]\nlibhdf5_hl_path = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5_hl.so\"\nlibhdf5_path = \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so\"\n\n[MPIPreferences]\n__clear__ = [\"preloads_env_switch\"]\n_format = \"1.0\"\nabi = \"OpenMPI\"\nbinary = \"system\"\ncclibs = []\nlibmpi = \"/lib/x86_64-linux-gnu/libmpi.so\"\nmpiexec = \"mpiexec\"\npreloads = []\n\n[P4est]\nlibp4est = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so\"\nlibsc = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so\"\n\n[T8code]\nlibp4est = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so\"\nlibsc = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so\"\nlibt8 = \"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libt8.so\"","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"This file is created with the following sequence of commands:","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using MPIPreferences\njulia> MPIPreferences.use_system_binary()","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Restart the Julia REPL","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using P4est\njulia> P4est.set_library_p4est!(\"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so\")\njulia> P4est.set_library_sc!(\"/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so\")\njulia> using T8code\njulia> T8code.set_libraries_path!(\"/home/mschlott/hackathon/libtrixi/t8code/install/lib/\")\njulia> using HDF5\njulia> HDF5.API.set_libraries!(\"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5.so\", \"/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5_hl.so\")","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"After the preferences are set, restart the Julia REPL again.","category":"page"},{"location":"parallelization/#parallel_usage","page":"Parallelization","title":"Usage","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"To start Trixi.jl in parallel with MPI, there are three options:","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Run from the REPL with mpiexec(): You can start a parallel execution directly from the REPL by executing\njulia> using MPI\n\njulia> mpiexec() do cmd\n run(`$cmd -n 3 $(Base.julia_cmd()) --threads=1 --project=@. -e 'using Trixi; trixi_include(default_example())'`)\n end\nThe parameter -n 3 specifies that Trixi.jl should run with three processes (or ranks in MPI parlance) and should be adapted to your available computing resources and problem size. The $(Base.julia_cmd()) argument ensures that Julia is executed in parallel with the same optimization level etc. as you used for the REPL; if this is unnecessary or undesired, you can also just use julia. Further, if you are not running Trixi.jl from a local clone but have installed it as a package, you need to omit the --project=@..\nRun from the command line with mpiexecjl: Alternatively, you can use the mpiexecjl script provided by MPI.jl, which allows you to start Trixi.jl in parallel directly from the command line. As a preparation, you need to install the script once by running\njulia> using MPI\n\njulia> MPI.install_mpiexecjl(destdir=\"/somewhere/in/your/PATH\")\nThen, to execute Trixi.jl in parallel, execute the following command from your command line:\nmpiexecjl -n 3 julia --threads=1 --project=@. -e 'using Trixi; trixi_include(default_example())'\nRun interactively with tmpi (Linux/MacOS only): If you are on a Linux/macOS system, you have a third option which lets you run Julia in parallel interactively from the REPL. This comes in handy especially during development, as in contrast to the first two options, it allows to reuse the compilation cache and thus facilitates much faster startup times after the first execution. It requires tmux and the OpenMPI library to be installed before, both of which are usually available through a package manager. Once you have installed both tools, you need to configure MPI.jl to use the OpenMPI for your system, which is explained here. Then, you can download and install the tmpi script by executing\ncurl https://raw.githubusercontent.com/Azrael3000/tmpi/master/tmpi -o /somewhere/in/your/PATH/tmpi\nFinally, you can start and control multiple Julia REPLs simultaneously by running\ntmpi 3 julia --threads=1 --project=@.\nThis will start Julia inside tmux three times and multiplexes all commands you enter in one REPL to all other REPLs (try for yourself to understand what it means). If you have no prior experience with tmux, handling the REPL this way feels slightly weird in the beginning. However, there is a lot of documentation for tmux available and once you get the hang of it, developing Trixi.jl in parallel becomes much smoother this way. Some helpful commands are the following. To close a single pane you can press Ctrl+b and then x followed by y to confirm. To quit the whole session you press Ctrl+b followed by :kill-session. Often you would like to scroll up. You can do that by pressing Ctrl+b and then [, which allows you to use the arrow keys to scroll up and down. To leave the scroll mode you press q. Switching between panes can be done by Ctrl+b followed by o. As of March 2022, newer versions of tmpi also support mpich, which is the default backend of MPI.jl (via MPICH_Jll.jl). To use this setup, you need to install mpiexecjl as described in the documentation of MPI.jl and make it available as mpirun, e.g., via a symlink of the form\nln -s ~/.julia/bin/mpiexecjl /somewhere/in/your/path/mpirun\n(assuming default installations).","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"note: Hybrid parallelism\nIt is possible to combine MPI with shared memory parallelism via threads by starting Julia with more than one thread, e.g. by passing the command line argument julia --threads=2 instead of julia --threads=1 used in the examples above. In that case, you should make sure that your system supports the number of processes/threads that you try to start.","category":"page"},{"location":"parallelization/#parallel_performance","page":"Parallelization","title":"Performance","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"For information on how to evaluate the parallel performance of Trixi.jl, please have a look at the Performance metrics of the AnalysisCallback section, specifically at the descriptions of the performance index (PID).","category":"page"},{"location":"parallelization/#Using-error-based-step-size-control-with-MPI","page":"Parallelization","title":"Using error-based step size control with MPI","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If you use error-based step size control (see also the section on error-based adaptive step sizes) together with MPI you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to OrdinaryDiffEq's solve, which are both included in ode_default_options.","category":"page"},{"location":"parallelization/#Using-parallel-input-and-output","page":"Parallelization","title":"Using parallel input and output","text":"","category":"section"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Trixi.jl allows parallel I/O using MPI by leveraging parallel HDF5.jl. On most systems, this is enabled by default. Additionally, you can also use a local installation of the HDF5 library (with MPI support). For this, you first need to use a system-provided MPI library, see also here and you need to tell HDF5.jl to use this library. To do so with HDF5.jl v0.17 and newer, set the preferences libhdf5 and libhdf5_hl to the local paths of the libraries libhdf5 and libhdf5_hl, which can be done by","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using Preferences, UUIDs\njulia> set_preferences!(\n UUID(\"f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f\"), # UUID of HDF5.jl\n \"libhdf5\" => \"/path/to/your/libhdf5.so\",\n \"libhdf5_hl\" => \"/path/to/your/libhdf5_hl.so\", force = true)","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"Alternatively, with HDF5.jl v0.17.1 or higher you can use","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"julia> using HDF5\njulia> HDF5.API.set_libraries!(\"/path/to/your/libhdf5.so\", \"/path/to/your/libhdf5_hl.so\")","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"For more information see also the documentation of HDF5.jl. In total, you should have a file called LocalPreferences.toml in the project directory that contains a section [MPIPreferences], a section [HDF5] with entries libhdf5 and libhdf5_hl, a section [P4est] with the entry libp4est as well as a section [T8code] with the entries libt8, libp4est and libsc. If you use HDF5.jl v0.16 or older, instead of setting the preferences for HDF5.jl, you need to set the environment variable JULIA_HDF5_PATH to the path, where the HDF5 binaries are located and then call ]build HDF5 from Julia.","category":"page"},{"location":"parallelization/","page":"Parallelization","title":"Parallelization","text":"If HDF5 is not MPI-enabled, Trixi.jl will fall back on a less efficient I/O mechanism. In that case, all disk I/O is performed only on rank zero and data is distributed to/gathered from the other ranks using regular MPI communication.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"EditURL = \"../../literate/src/files/behind_the_scenes_simulation_setup.jl\"","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/#behind_the_scenes_simulation_setup","page":"2 Behind the scenes of a simulation setup","title":"2: Behind the scenes of a simulation setup","text":"","category":"section"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"This tutorial will guide you through a simple Trixi.jl setup (\"elixir\"), giving an overview of what happens in the background during the initialization of a simulation. While the setup described herein does not cover all details, it involves relatively stable parts of Trixi.jl that are unlikely to undergo significant changes in the near future. The goal is to clarify some of the more fundamental, technical concepts that are applicable to a variety of (also more complex) configurations.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Trixi.jl follows the method of lines concept for solving partial differential equations (PDEs). Firstly, the PDEs are reduced to a (potentially huge) system of ordinary differential equations (ODEs) by discretizing the spatial derivatives. Subsequently, these generated ODEs may be solved with methods available in OrdinaryDiffEq.jl or those specifically implemented in Trixi.jl. The following steps elucidate the process of transitioning from PDEs to ODEs within the framework of Trixi.jl.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/#Basic-setup","page":"2 Behind the scenes of a simulation setup","title":"Basic setup","text":"","category":"section"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Import essential libraries and specify an equation.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"using Trixi, OrdinaryDiffEq\nequations = LinearScalarAdvectionEquation2D((-0.2, 0.7))","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Generate a spatial discretization using a TreeMesh with a pre-coarsened set of cells.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"coordinates_min = (-2.0, -2.0)\ncoordinates_max = (2.0, 2.0)\n\ncoarsening_patches = ((type = \"box\", coordinates_min = [0.0, -2.0],\n coordinates_max = [2.0, 0.0]),)\n\nmesh = TreeMesh(coordinates_min, coordinates_max, initial_refinement_level = 2,\n n_cells_max = 30_000,\n coarsening_patches = coarsening_patches)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"The created TreeMesh looks like the following:","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"(Image: TreeMesh_example)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Instantiate a DGSEM solver with a user-specified polynomial degree. The solver will define polydeg + 1 Gauss-Lobatto nodes and their associated weights within the reference interval -1 1 in each spatial direction. These nodes will be subsequently used to approximate solutions on each leaf cell of the TreeMesh.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"solver = DGSEM(polydeg = 3)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Gauss-Lobatto nodes with polydeg = 3:","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"(Image: Gauss-Lobatto_nodes_example)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/#Overview-of-the-[SemidiscretizationHyperbolic](@ref)-type","page":"2 Behind the scenes of a simulation setup","title":"Overview of the SemidiscretizationHyperbolic type","text":"","category":"section"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"At this stage, all necessary components for configuring the spatial discretization are in place. The remaining task is to combine these components into a single structure that will be used throughout the entire simulation process. This is where SemidiscretizationHyperbolic comes into play.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test,\n solver)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"The constructor for the SemidiscretizationHyperbolic object calls numerous sub-functions to perform the necessary initialization steps. A brief description of the key sub-functions is provided below.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"init_elements(leaf_cell_ids, mesh, equations, dg.basis, RealT, uEltype)\nThe fundamental elements for approximating the solution are the leaf cells. The solution is constructed as a polynomial of the degree specified in the DGSEM solver in each spatial direction on each leaf cell. This polynomial approximation is evaluated at the Gauss-Lobatto nodes mentioned earlier. The init_elements function extracts these leaf cells from the TreeMesh, assigns them the label \"elements\", records their coordinates, and maps the Gauss-Lobatto nodes from the 1D interval -1 1 onto each coordinate axis of every element.\n(Image: elements_example)\nThe visualization of elements with nodes shown here includes spaces between elements, which do not exist in reality. This spacing is included only for illustrative purposes to underscore the separation of elements and the independent projection of nodes onto each element.\ninit_interfaces(leaf_cell_ids, mesh, elements)\nAt this point, the elements with nodes have been defined; however, they lack the necessary communication functionality. This is crucial because the local solution polynomials on the elements are not independent of each other. Furthermore, nodes on the boundary of adjacent elements share the same spatial location, which requires a method to combine this into a meaningful solution. Here Riemann solvers come into play which can handle the principal ambiguity of a multi-valued solution at the same spatial location.\nAs demonstrated earlier, the elements can have varying sizes. Let us initially consider neighbors with equal size. For these elements, the init_interfaces function generates interfaces that store information about adjacent elements, their relative positions, and allocate containers for sharing solution data between neighbors during the solution process.\nIn our visualization, these interfaces would conceptually resemble tubes connecting the corresponding elements.\n(Image: interfaces_example)\ninit_mortars(leaf_cell_ids, mesh, elements, dg.mortar)\nReturning to the consideration of different sizes among adjacent elements, within the TreeMesh, adjacent leaf cells can vary in side length by a maximum factor of two. This implies that a large element has one neighbor of equal size with a connection through an interface, or two neighbors at half the size, requiring a connection through so called \"mortars\". In 3D, a large element would have four small neighbor elements.\nMortars store information about the connected elements, their relative positions, and allocate containers for storing the solutions along the boundaries between these elements.\nDue to the differing sizes of adjacent elements, it is not feasible to directly map boundary nodes of adjacent elements. Therefore, the concept of mortars employs a mass-conserving interpolation function to map boundary nodes from a larger element to a smaller one.\nIn our visualization, mortars are represented as branched tubes.\n(Image: mortars_example)\ninit_boundaries(leaf_cell_ids, mesh, elements)\nIn order to apply boundary conditions, it is necessary to identify the locations of the boundaries. Therefore, we initialize a \"boundaries\" object, which records the elements that contain boundaries, specifies which side of an element is a boundary, stores the coordinates of boundary nodes, and allocates containers for managing solutions at these boundaries.\nIn our visualization, boundaries and their corresponding nodes are highlighted with green, semi-transparent lines.\n(Image: boundaries_example)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"All the structures mentioned earlier are collected as a cache of type NamedTuple. Subsequently, an object of type SemidiscretizationHyperbolic is initialized using this cache, initial and boundary conditions, equations, mesh and solver.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"In conclusion, the primary purpose of a SemidiscretizationHyperbolic is to collect equations, the geometric representation of the domain, and approximation instructions, creating specialized structures to interconnect these components in a manner that enables their utilization for the numerical solution of partial differential equations (PDEs).","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"As evident from the earlier description of SemidiscretizationHyperbolic, it comprises numerous functions called subsequently. Without delving into details, the structure of the primary calls are illustrated as follows:","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"(Image: SemidiscretizationHyperbolic_structure)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/#Overview-of-the-[semidiscretize](@ref)-function","page":"2 Behind the scenes of a simulation setup","title":"Overview of the semidiscretize function","text":"","category":"section"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"At this stage, we have defined the equations and configured the domain's discretization. The final step before solving is to select a suitable time span and apply the corresponding initial conditions, which are already stored in the initialized SemidiscretizationHyperbolic object.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"The purpose of the semidiscretize function is to wrap the semidiscretization as an ODEProblem within the specified time interval. During this procedure the approximate solution is created at the given initial time via the specified initial_condition function from the SemidiscretizationHyperbolic object. This ODEProblem can be subsequently passed to the solve function from the OrdinaryDiffEq.jl package or to Trixi.solve.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"ode = semidiscretize(semi, (0.0, 1.0));\nnothing #hide","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"The semidiscretize function involves a deep tree of subsequent calls, with the primary ones explained below.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"allocate_coefficients(mesh, equations, solver, cache)\nTo apply initial conditions, a data structure (\"container\") needs to be generated to store the initial values of the target variables for each node within each element.\nSince only one-dimensional Arrays are resize!able in Julia, we use Vectors as an internal storage for the target variables and resize! them whenever needed, e.g. to change the number of elements. Then, during the solving process the same memory is reused by unsafe_wrapping multi-dimensional Arrays around the internal storage.\nwrap_array(u_ode, semi)\nAs previously noted, u_ode is constructed as a 1D vector to ensure compatibility with OrdinaryDiffEq.jl. However, for internal use within Trixi.jl, identifying which part of the vector relates to specific variables, elements, or nodes can be challenging.\nThis is why the u_ode vector is wrapped by the wrap_array function using unsafe_wrap to form a multidimensional array u. In this array, the first dimension corresponds to variables, followed by N dimensions corresponding to nodes for each of N space dimensions. The last dimension corresponds to the elements. Consequently, navigation within this multidimensional array becomes noticeably easier.\n\"Wrapping\" in this context involves the creation of a reference to the same storage location but with an alternative structural representation. This approach enables the use of both instances u and u_ode as needed, so that changes are simultaneously reflected in both. This is possible because, from a storage perspective, they share the same stored data, while access to this data is provided in different ways.\ncompute_coefficients!(u, initial_conditions, t, mesh::DG, equations, solver, cache)\nNow the variable u, intended to store solutions, has been allocated and wrapped, it is time to apply the initial conditions. The compute_coefficients! function calculates the initial conditions for each variable at every node within each element and properly stores them in the u array.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"At this stage, the semidiscretize function has all the necessary components to initialize and return an ODEProblem object, which will be used by the solve function to compute the solution.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"In summary, the internal workings of semidiscretize with brief descriptions can be presented as follows.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"(Image: semidiscretize_structure)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/#Functions-solve-and-rhs!","page":"2 Behind the scenes of a simulation setup","title":"Functions solve and rhs!","text":"","category":"section"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Once the ODEProblem object is initialized, the solve function and one of the ODE solvers from the OrdinaryDiffEq.jl package can be utilized to compute an approximated solution using the instructions contained in the ODEProblem object.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false), dt = 0.01,\n save_everystep = false);\nnothing #hide","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Since the solve function and the ODE solver have no knowledge of a particular spatial discretization, it is necessary to define a \"right-hand-side function\", rhs!, within Trixi.jl.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Trixi.jl includes a set of rhs! functions designed to compute du, i.e., fracpartial upartial t according to the structure of the setup. These rhs! functions calculate interface, mortars, and boundary fluxes, in addition to surface and volume integrals, in order to construct the du vector. This du vector is then used by the time integration method to obtain the solution at the subsequent time step. The rhs! function is called by time integration methods in each iteration of the solve loop within OrdinaryDiffEq.jl, with arguments du, u, semidiscretization, and the current time.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Trixi.jl uses a two-levels approach for rhs! functions. The first level is limited to a single function for each semidiscretization type, and its role is to redirect data to the target rhs! for specific solver and mesh types. This target rhs! function is responsible for calculating du.","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Path from the solve function call to the appropriate rhs! function call:","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"(Image: rhs_structure)","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"Computed solution:","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"using Plots\nplot(sol)\npd = PlotData2D(sol)\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"","category":"page"},{"location":"tutorials/behind_the_scenes_simulation_setup/","page":"2 Behind the scenes of a simulation setup","title":"2 Behind the scenes of a simulation setup","text":"This page was generated using Literate.jl.","category":"page"},{"location":"overview/#Overview-of-the-structure-of-Trixi.jl","page":"Overview","title":"Overview of the structure of Trixi.jl","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"Trixi.jl is designed as a library of components for discretizations of hyperbolic conservation laws. Thus, it is not a monolithic PDE solver that is configured at runtime via parameter files, as it is often found in classical numerical simulation codes. Instead, each simulation is configured by pure Julia code. Many examples of such simulation setups, called elixirs in Trixi.jl, are provided in the examples/ folder.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"Trixi.jl uses the method of lines, i.e., the full space-time discretization is separated into two steps; the spatial semidiscretization is performed at first and the resulting ODE system is solved numerically using a suitable time integration method. Thus, the main ingredients of an elixir designed to solve a PDE numerically are the spatial semidiscretization and the time integration scheme.","category":"page"},{"location":"overview/#overview-semidiscretizations","page":"Overview","title":"Semidiscretizations","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"Semidiscretizations are high-level descriptions of spatial discretizations specialized for certain PDEs. Trixi.jl's main focus is on hyperbolic conservation laws represented in a SemidiscretizationHyperbolic. Such semidiscretizations are usually named semi in Trixi.jl","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"(Image: semidiscretization_overview)","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"The basic building blocks of a semidiscretization are","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"a mesh describing the geometry of the domain\na set of equations describing the physical model\na solver describing the numerical approach","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"In addition, a semidiscretization bundles initial and boundary conditions, and possible source terms. These different ingredients of a semidiscretization can be configured individually and combined together. When a semidiscretization is constructed, it will create an internal cache, i.e., a collection of setup-specific data structures, that is usually passed to all lower level functions.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"Due to Trixi.jl's modular nature using Julia's multiple dispatch features, new ingredients can be created specifically for a certain combination of other ingredients. For example, a new mesh type can be created and implemented at first only for a specific solver. Thus, there is no need to consider all possible combinations of meshes, equations, and solvers when implementing new features. This allows rapid prototyping of new ideas and is one of the main design goals behind Trixi.jl. Below is a brief overview of the availability of different features on different mesh types.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"Feature TreeMesh StructuredMesh UnstructuredMesh2D P4estMesh DGMultiMesh Further reading\nSpatial dimension 1D, 2D, 3D 1D, 2D, 3D 2D 2D, 3D 1D, 2D, 3D \nCoordinates Cartesian curvilinear curvilinear curvilinear curvilinear \nConnectivity h-nonconforming conforming conforming h-nonconforming conforming \nElement type line, square, cube line, quadᵃ, hexᵃ quadᵃ quadᵃ, hexᵃ simplex, quadᵃ, hexᵃ \nAdaptive mesh refinement ✅ ❌ ❌ ✅ ❌ AMRCallback\nSolver type DGSEM DGSEM DGSEM DGSEM DGMulti \nDomain hypercube mapped hypercube arbitrary arbitrary arbitrary \nWeak form ✅ ✅ ✅ ✅ ✅ VolumeIntegralWeakForm\nFlux differencing ✅ ✅ ✅ ✅ ✅ VolumeIntegralFluxDifferencing\nShock capturing ✅ ✅ ✅ ✅ ❌ VolumeIntegralShockCapturingHG\nNonconservative equations ✅ ✅ ✅ ✅ ✅ e.g., GLM MHD or shallow water equations\nParabolic terms ✅ ✅ ❌ ✅ ✅ e.g., CompressibleNavierStokesDiffusion2D","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"ᵃ: quad = quadrilateral, hex = hexahedron","category":"page"},{"location":"overview/#Time-integration-methods","page":"Overview","title":"Time integration methods","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, a spatial semidiscretization can be wrapped in an ODE problem using semidiscretize, which returns an ODEProblem. This ODEProblem is a wrapper of Trixi.rhs!(du_ode, u_ode, semi, t), which gets called in ODE solvers. Further information can be found in the section on time integration methods.","category":"page"},{"location":"overview/#Next-steps","page":"Overview","title":"Next steps","text":"","category":"section"},{"location":"overview/","page":"Overview","title":"Overview","text":"We explicitly encourage people interested in Trixi.jl to have a look at the examples/ bundled with Trixi.jl to get an impression of what is possible and the general look and feel of Trixi.jl. Before doing that, it is usually good to get an idea of how to visualize numerical results.","category":"page"},{"location":"overview/","page":"Overview","title":"Overview","text":"If you like learning by doing, looking at the tutorials and trying to mix your own elixirs based thereon is probably a good next step. Otherwise, you can further dig into the documentation by looking at Trixi.jl's basic building blocks.","category":"page"},{"location":"callbacks/#callbacks-id","page":"Callbacks","title":"Callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Many of the advanced features of Trixi.jl, such as adaptive mesh refinement, are implemented as callbacks. A callback is an algorithmic entity that gets passed to the ODE solver and is called at specific points during execution to perform certain tasks. Callbacks in Trixi.jl are either called after each time step (step callbacks) or after each stage of the ODE solver (stage callbacks).","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"(Image: callbacks_illustration)","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The advantage of callbacks over hard-coding all features is that it allows to extend Trixi.jl without modifying the internal source code. Trixi.jl provides callbacks for time step control, adaptive mesh refinement, I/O, and more.","category":"page"},{"location":"callbacks/#Step-callbacks","page":"Callbacks","title":"Step callbacks","text":"","category":"section"},{"location":"callbacks/#CFL-based-time-step-control","page":"Callbacks","title":"CFL-based time step control","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Time step control can be performed with a StepsizeCallback. An example making use of this can be found at examples/tree_2d_dgsem/elixir_advection_basic.jl","category":"page"},{"location":"callbacks/#Adaptive-mesh-refinement","page":"Callbacks","title":"Adaptive mesh refinement","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Trixi.jl uses a hierarchical Cartesian mesh which can be locally refined in a solution-adaptive way. This can be used to speed up simulations with minimal loss in overall accuracy. Adaptive mesh refinement (AMR) can be used by passing an AMRCallback to the ODE solver. The AMRCallback requires a controller such as ControllerThreeLevel or ControllerThreeLevelCombined to tell the AMR algorithm which cells to refine/coarsen.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"An example elixir using AMR can be found at examples/tree_2d_dgsem/elixir_advection_amr.jl.","category":"page"},{"location":"callbacks/#Analyzing-the-numerical-solution","page":"Callbacks","title":"Analyzing the numerical solution","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The AnalysisCallback can be used to analyze the numerical solution, e.g. calculate errors or user-specified integrals, and print the results to the screen. The results can also be saved in a file. An example can be found at examples/tree_2d_dgsem/elixir_euler_vortex.jl. Note that the errors (e.g. L2 error or Linf error) are computed with respect to the initial condition. The percentage of the simulation time refers to the ratio of the current time and the final time, i.e. it does not consider the maximal number of iterations. So the simulation could finish before 100% are reached. Note that, e.g., due to AMR or smaller time step sizes, the simulation can actually take longer than the percentage indicates. In Performance metrics of the AnalysisCallback you can find a detailed description of the different performance metrics the AnalysisCallback computes.","category":"page"},{"location":"callbacks/#I/O","page":"Callbacks","title":"I/O","text":"","category":"section"},{"location":"callbacks/#Solution-and-restart-files","page":"Callbacks","title":"Solution and restart files","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"To save the solution in regular intervals you can use a SaveSolutionCallback. It is also possible to create restart files using the SaveRestartCallback. An example making use of these can be found at examples/tree_2d_dgsem/elixir_advection_extended.jl. An example showing how to restart a simulation from a restart file can be found at examples/tree_2d_dgsem/elixir_advection_restart.jl.","category":"page"},{"location":"callbacks/#Time-series","page":"Callbacks","title":"Time series","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Sometimes it is useful to record the evaluations of state variables over time at a given set of points. This can be achieved by the TimeSeriesCallback, which is used, e.g., in examples/tree_2d_dgsem/elixir_acoustics_gaussian_source.jl. The TimeSeriesCallback constructor expects a semidiscretization and a list of points at which the solution should be recorded in regular time step intervals. After the last time step, the entire record is stored in an HDF5 file.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"For the points, two different input formats are supported: You can either provide them as a list of tuples, which is handy if you specify them by hand on the REPL. Alternatively, you can provide them as a two-dimensional array, where the first dimension is the point number and the second dimension is the coordinate dimension. This is especially useful when reading them from a file.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"For example, to record the primitive variables at the points (0.0, 0.0) and (-1.0, 0.5) every five timesteps and storing the collected data in the file tseries.h5, you can create the TimeSeriesCallback as","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"time_series = TimeSeriesCallback(semi, [(0.0, 0.0), (-1.0, 0.5)];\n interval=5,\n solution_variables=cons2prim,\n filename=\"tseries.h5\")","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"For a full list of possible arguments, please check the documentation for the TimeSeriesCallback. As an alternative to specifying the point coordinates directly in the elixir or on the REPL, you can read them from a file. For instance, with a text file points.dat with content","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":" 0.0 0.0\n-1.0 0.5","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"you can create a time series callback with","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"using DelimitedFiles: readdlm\ntime_series = TimeSeriesCallback(semi, readdlm(\"points.dat\"))","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"To plot the individual point data series over time, you can create a PlotData1D from the TimeSeriesCallback and a given point ID. For example, executing","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"julia> using Trixi, Plots\n\njulia> trixi_include(joinpath(examples_dir(), \"tree_2d_dgsem\", \"elixir_acoustics_gaussian_source.jl\"))\n\njulia> pd1 = PlotData1D(time_series, 1)\n\njulia> pd2 = PlotData1D(time_series, 2)\n\njulia> plot(pd1[\"p_prime\"]); plot!(pd2[\"p_prime\"], xguide=\"t\")","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"will yield the following plot:","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"(Image: image)","category":"page"},{"location":"callbacks/#Miscellaneous","page":"Callbacks","title":"Miscellaneous","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The AliveCallback prints some information to the screen to show that a simulation is still running.\nThe SummaryCallback prints a human-readable summary of the simulation setup and controls the automated performance measurements, including an output of the recorded timers after a simulation.\nThe VisualizationCallback can be used for in-situ visualization. See Visualizing results during a simulation.\nThe TrivialCallback does nothing and can be used to easily disable some callbacks via trixi_include.","category":"page"},{"location":"callbacks/#Equation-specific-callbacks","page":"Callbacks","title":"Equation-specific callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Some callbacks provided by Trixi.jl implement specific features for certain equations:","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"The LBMCollisionCallback implements the Lattice-Boltzmann method (LBM) collision operator and should only be used when solving the Lattice-Boltzmann equations. See e.g. examples/tree_2d_dgsem/elixir_lbm_constant.jl\nThe SteadyStateCallback terminates the time integration when the residual steady state falls below a certain threshold. This checks the convergence of the potential phi for hyperbolic diffusion. See e.g. examples/tree_2d_dgsem/elixir_hypdiff_nonperiodic.jl.\nThe GlmSpeedCallback updates the divergence cleaning wave speed c_h for the ideal GLM-MHD equations. See e.g. examples/tree_2d_dgsem/elixir_mhd_alfven_wave.jl.","category":"page"},{"location":"callbacks/#Usage-of-step-callbacks","page":"Callbacks","title":"Usage of step callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Step callbacks are passed to the solve method from the ODE solver via the keyword argument callback. If you want to use a single callback cb, pass it as callback=cb. When using two or more callbacks, you need to turn them into a CallbackSet first by calling callbacks = CallbackSet(cb1, cb2) and passing it as callback=callbacks.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"note: Note\nThere are some restrictions regarding the order of callbacks in a CallbackSet.The callbacks are called after each time step but some callbacks actually belong to the next time step. Therefore, the callbacks should be ordered in the following way:Callbacks that belong to the current time step:\nSummaryCallback controls, among other things, timers and should thus be first\nSteadyStateCallback may mark a time step as the last one\nAnalysisCallback may do some checks that mark a time step as the last one\nAliveCallback should be nearby AnalysisCallback\nSaveSolutionCallback/SaveRestartCallback should save the current solution before it is degraded by AMR\nVisualizationCallback should be called before the mesh is adapted\nCallbacks that belong to the next time step:\nAMRCallback\nStepsizeCallback must be called after AMRCallback to accommodate potential changes to the mesh\nGlmSpeedCallback must be called after StepsizeCallback because the step size affects the value of c_h\nLBMCollisionCallback is already part of the calculations of the next time step and should therefore be called after StepsizeCallback","category":"page"},{"location":"callbacks/#Stage-callbacks","page":"Callbacks","title":"Stage callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"PositivityPreservingLimiterZhangShu is a positivity-preserving limiter, used to enforce physical constraints. An example elixir using this feature can be found at examples/tree_2d_dgsem/elixir_euler_positivity.jl.","category":"page"},{"location":"callbacks/#Implementing-new-callbacks","page":"Callbacks","title":"Implementing new callbacks","text":"","category":"section"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"Since Trixi.jl is compatible with OrdinaryDiffEq.jl, both packages share the same callback interface. A detailed description of it can be found in the OrdinaryDiffEq.jl documentation. Step callbacks are just called callbacks. Stage callbacks are called stage_limiter!.","category":"page"},{"location":"callbacks/","page":"Callbacks","title":"Callbacks","text":"An example elixir showing how to implement a new simple stage callback and a new simple step callback can be found at examples/tree_2d_dgsem/elixir_advection_callbacks.jl.","category":"page"},{"location":"#Trixi.jl","page":"Home","title":"Trixi.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"(Image: Docs-stable) (Image: Docs-dev) (Image: Slack) (Image: Youtube) (Image: Build Status) (Image: Codecov) (Image: Coveralls) (Image: Aqua QA) (Image: License: MIT) (Image: DOI)","category":"page"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl is a numerical simulation framework for conservation laws written in Julia. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures. Its features include:","category":"page"},{"location":"","page":"Home","title":"Home","text":"1D, 2D, and 3D simulations on line/quad/hex/simplex meshes\nCartesian and curvilinear meshes\nConforming and non-conforming meshes\nStructured and unstructured meshes\nHierarchical quadtree/octree grid with adaptive mesh refinement\nForests of quadtrees/octrees with p4est via P4est.jl\nHigh-order accuracy in space and time\nDiscontinuous Galerkin methods\nKinetic energy-preserving and entropy-stable methods based on flux differencing\nEntropy-stable shock capturing\nPositivity-preserving limiting\nFinite difference summation by parts (SBP) methods\nCompatible with the SciML ecosystem for ordinary differential equations\nExplicit low-storage Runge-Kutta time integration\nStrong stability preserving methods\nCFL-based and error-based time step control\nNative support for differentiable programming\nForward mode automatic differentiation via ForwardDiff.jl\nPeriodic and weakly-enforced boundary conditions\nMultiple governing equations:\nCompressible Euler equations\nCompressible Navier-Stokes equations\nMagnetohydrodynamics (MHD) equations\nMulti-component compressible Euler and MHD equations\nLinearized Euler and acoustic perturbation equations\nHyperbolic diffusion equations for elliptic problems\nLattice-Boltzmann equations (D2Q9 and D3Q27 schemes)\nShallow water equations\nScalar advection\nMulti-physics simulations\nSelf-gravitating gas dynamics\nShared-memory parallelization via multithreading\nMulti-node parallelization via MPI\nVisualization and postprocessing of the results\nIn-situ and a posteriori visualization with Plots.jl\nInteractive visualization with Makie.jl\nPostprocessing with ParaView/VisIt via Trixi2Vtk","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you have not yet installed Julia, please follow the instructions for your operating system. Trixi.jl works with Julia v1.8 and newer. We recommend using the latest stable release of Julia.","category":"page"},{"location":"#For-users","page":"Home","title":"For users","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl and its related tools are registered Julia packages. Hence, you can install Trixi.jl, the visualization tool Trixi2Vtk, OrdinaryDiffEq.jl, and Plots.jl by executing the following commands in the Julia REPL:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Pkg\n\njulia> Pkg.add([\"Trixi\", \"Trixi2Vtk\", \"OrdinaryDiffEq\", \"Plots\"])","category":"page"},{"location":"","page":"Home","title":"Home","text":"You can copy and paste all commands to the REPL including the leading julia> prompts - they will automatically be stripped away by Julia. The package OrdinaryDiffEq.jl provides time integration schemes used by Trixi.jl, while Plots.jl can be used to directly visualize Trixi.jl's results from the REPL.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note on package versions: If some of the examples for how to use Trixi.jl do not work, verify that you are using a recent Trixi.jl release by comparing the installed Trixi.jl version from","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Pkg; Pkg.update(\"Trixi\"); Pkg.status(\"Trixi\")","category":"page"},{"location":"","page":"Home","title":"Home","text":"to the latest release. If the installed version does not match the current release, please check the Troubleshooting section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The commands above can also be used to update Trixi.jl. A brief list of notable changes to Trixi.jl is available in NEWS.md.","category":"page"},{"location":"#for-developers","page":"Home","title":"For developers","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you plan on editing Trixi.jl itself, you can download Trixi.jl to a local folder and use the code from the cloned directory:","category":"page"},{"location":"","page":"Home","title":"Home","text":"git clone git@github.com:trixi-framework/Trixi.jl.git\ncd Trixi.jl\nmkdir run\ncd run\njulia --project=. -e 'using Pkg; Pkg.develop(PackageSpec(path=\"..\"))'","category":"page"},{"location":"","page":"Home","title":"Home","text":"If you installed Trixi.jl this way, you always have to start Julia with the --project flag set to your run directory, e.g.,","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia --project=.","category":"page"},{"location":"","page":"Home","title":"Home","text":"if already inside the run directory.","category":"page"},{"location":"","page":"Home","title":"Home","text":"The advantage of using a separate run directory is that you can also add other related packages (see below, e.g., for time integration or visualization) to the project in the run folder and always have a reproducible environment at hand to share with others.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Since the postprocessing tool Trixi2Vtk.jl typically does not need to be modified, it is recommended to install it as a normal package. Likewise, you can install OrdinaryDiffEq.jl and Plots.jl as ordinary packages. To achieve this, use the following REPL commands:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Pkg\n\njulia> Pkg.add([\"OrdinaryDiffEq\", \"Trixi2Vtk\", \"Plots\"])","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note that the postprocessing tools Trixi2Vtk.jl and Plots.jl are optional and can be omitted.","category":"page"},{"location":"#Example:-Installing-Trixi.jl-as-a-package","page":"Home","title":"Example: Installing Trixi.jl as a package","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":" ","category":"page"},{"location":"","page":"Home","title":"Home","text":"Please note that the playback speed is set to 3x, thus the entire installation procedure lasts around 45 seconds in real time (depending on the performance of your computer and on how many dependencies had already been installed before).","category":"page"},{"location":"#Usage","page":"Home","title":"Usage","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"In the Julia REPL, first load the package Trixi.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Trixi","category":"page"},{"location":"","page":"Home","title":"Home","text":"Then start a simulation by executing","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> trixi_include(default_example())","category":"page"},{"location":"","page":"Home","title":"Home","text":"Please be patient since Julia will compile the code just before running it. To visualize the results, load the package Plots","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> using Plots","category":"page"},{"location":"","page":"Home","title":"Home","text":"and generate a heatmap plot of the results with","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> plot(sol) # No trailing semicolon, otherwise no plot is shown","category":"page"},{"location":"","page":"Home","title":"Home","text":"This will open a new window with a 2D visualization of the final solution:","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: image)","category":"page"},{"location":"","page":"Home","title":"Home","text":"The method trixi_include(...) expects a single string argument with the path to a Trixi.jl elixir, i.e., a text file containing Julia code necessary to set up and run a simulation. To quickly see Trixi.jl in action, default_example() returns the path to an example elixir with a short, two-dimensional problem setup. A list of all example elixirs packaged with Trixi.jl can be obtained by running get_examples(). Alternatively, you can also browse the examples/ subdirectory. If you want to modify one of the elixirs to set up your own simulation, download it to your machine, edit the configuration, and pass the file path to trixi_include(...).","category":"page"},{"location":"#Example:-Running-a-simulation-with-Trixi.jl","page":"Home","title":"Example: Running a simulation with Trixi.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":" ","category":"page"},{"location":"","page":"Home","title":"Home","text":"If this produces weird symbols or question marks in the terminal on your system, you are probably using Mac OS with problematic fonts. In that case, please check the Troubleshooting section.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note on performance: Julia uses just-in-time compilation to transform its source code to native, optimized machine code at the time of execution and caches the compiled methods for further use. That means that the first execution of a Julia method is typically slow, with subsequent runs being much faster. For instance, in the example above the first execution of trixi_include takes about 20 seconds, while subsequent runs require less than 60 milliseconds.","category":"page"},{"location":"#Performing-a-convergence-analysis","page":"Home","title":"Performing a convergence analysis","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"To automatically determine the experimental order of convergence (EOC) for a given setup, execute","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> convergence_test(default_example(), 4)","category":"page"},{"location":"","page":"Home","title":"Home","text":"This will run a convergence test with the elixir default_example(), using four iterations with different initial refinement levels. The initial iteration will use the elixir unchanged, while for each subsequent iteration the initial_refinement_level parameter is incremented by one. Finally, the measured l^2 and l^infty errors and the determined EOCs will be displayed like this:","category":"page"},{"location":"","page":"Home","title":"Home","text":"[...]\nl2\nscalar\nerror EOC\n9.14e-06 -\n5.69e-07 4.01\n3.55e-08 4.00\n2.22e-09 4.00\n\nmean 4.00\n--------------------------------------------------------------------------------\nlinf\nscalar\nerror EOC\n6.44e-05 -\n4.11e-06 3.97\n2.58e-07 3.99\n1.62e-08 4.00\n\nmean 3.99\n--------------------------------------------------------------------------------","category":"page"},{"location":"","page":"Home","title":"Home","text":"An example with multiple variables looks like this:","category":"page"},{"location":"","page":"Home","title":"Home","text":"julia> convergence_test(joinpath(examples_dir(), \"tree_2d_dgsem\", \"elixir_euler_source_terms.jl\"), 3)","category":"page"},{"location":"","page":"Home","title":"Home","text":"[...]\nl2\nrho rho_v1 rho_v2 rho_e\nerror EOC error EOC error EOC error EOC\n9.32e-07 - 1.42e-06 - 1.42e-06 - 4.82e-06 -\n7.03e-08 3.73 9.53e-08 3.90 9.53e-08 3.90 3.30e-07 3.87\n4.65e-09 3.92 6.09e-09 3.97 6.09e-09 3.97 2.12e-08 3.96\n\nmean 3.82 mean 3.93 mean 3.93 mean 3.91\n--------------------------------------------------------------------------------\nlinf\nrho rho_v1 rho_v2 rho_e\nerror EOC error EOC error EOC error EOC\n9.58e-06 - 1.17e-05 - 1.17e-05 - 4.89e-05 -\n6.23e-07 3.94 7.48e-07 3.97 7.48e-07 3.97 3.22e-06 3.92\n4.05e-08 3.94 4.97e-08 3.91 4.97e-08 3.91 2.10e-07 3.94\n\nmean 3.94 mean 3.94 mean 3.94 mean 3.93\n--------------------------------------------------------------------------------","category":"page"},{"location":"#Showcase-of-advanced-features","page":"Home","title":"Showcase of advanced features","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The presentation From Mesh Generation to Adaptive Simulation: A Journey in Julia, originally given as part of JuliaCon 2022, outlines how to use Trixi.jl for an adaptive simulation of the compressible Euler equations in two spatial dimensions on a complex domain. More details as well as code to run the simulation presented can be found at the reproducibility repository for the presentation.","category":"page"},{"location":"#Referencing","page":"Home","title":"Referencing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use Trixi.jl in your own research or write a paper using results obtained with the help of Trixi.jl, please cite the following articles:","category":"page"},{"location":"","page":"Home","title":"Home","text":"@article{ranocha2022adaptive,\n title={Adaptive numerical simulations with {T}rixi.jl:\n {A} case study of {J}ulia for scientific computing},\n author={Ranocha, Hendrik and Schlottke-Lakemper, Michael and Winters, Andrew Ross\n and Faulhaber, Erik and Chan, Jesse and Gassner, Gregor},\n journal={Proceedings of the JuliaCon Conferences},\n volume={1},\n number={1},\n pages={77},\n year={2022},\n doi={10.21105/jcon.00077},\n eprint={2108.06476},\n eprinttype={arXiv},\n eprintclass={cs.MS}\n}\n\n@article{schlottkelakemper2021purely,\n title={A purely hyperbolic discontinuous {G}alerkin approach for\n self-gravitating gas dynamics},\n author={Schlottke-Lakemper, Michael and Winters, Andrew R and\n Ranocha, Hendrik and Gassner, Gregor J},\n journal={Journal of Computational Physics},\n pages={110467},\n year={2021},\n month={06},\n volume={442},\n publisher={Elsevier},\n doi={10.1016/j.jcp.2021.110467},\n eprint={2008.10593},\n eprinttype={arXiv},\n eprintclass={math.NA}\n}","category":"page"},{"location":"","page":"Home","title":"Home","text":"In addition, you can also refer to Trixi.jl directly as","category":"page"},{"location":"","page":"Home","title":"Home","text":"@misc{schlottkelakemper2020trixi,\n title={{T}rixi.jl: {A}daptive high-order numerical simulations\n of hyperbolic {PDE}s in {J}ulia},\n author={Schlottke-Lakemper, Michael and Gassner, Gregor J and\n Ranocha, Hendrik and Winters, Andrew R and Chan, Jesse},\n year={2021},\n month={09},\n howpublished={\\url{https://github.com/trixi-framework/Trixi.jl}},\n doi={10.5281/zenodo.3996439}\n}","category":"page"},{"location":"#authors-index-md","page":"Home","title":"Authors","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl was initiated by Michael Schlottke-Lakemper (RWTH Aachen University/High-Performance Computing Center Stuttgart (HLRS), Germany) and Gregor Gassner (University of Cologne, Germany). Together with Hendrik Ranocha (Johannes Gutenberg University Mainz, Germany) and Andrew Winters (Linköping University, Sweden), and Jesse Chan (Rice University, US), they are the principal developers of Trixi.jl. The full list of contributors can be found under Authors.","category":"page"},{"location":"#License-and-contributing","page":"Home","title":"License and contributing","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl is licensed under the MIT license (see License). Since Trixi.jl is an open-source project, we are very happy to accept contributions from the community. Please refer to Contributing for more details. Note that we strive to be a friendly, inclusive open-source community and ask all members of our community to adhere to our Code of Conduct. To get in touch with the developers, join us on Slack or create an issue.","category":"page"},{"location":"#Acknowledgments","page":"Home","title":"Acknowledgments","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"
\n
\n
\n
\n
\n
\n
\n
","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) through the following grants:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Excellence Strategy EXC 2044-390685587, Mathematics Münster: Dynamics-Geometry-Structure.\nResearch unit FOR 5409 \"Structure-Preserving Numerical Methods for Bulk- and Interface Coupling of Heterogeneous Models (SNuBIC)\" (project number 463312734).\nIndividual grant no. 528753982.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from the European Research Council through the ERC Starting Grant \"An Exascale aware and Un-crashable Space-Time-Adaptive Discontinuous Spectral Element Solver for Non-Linear Conservation Laws\" (Extreme), ERC grant agreement no. 714487.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from Vetenskapsrådet (VR, Swedish Research Council), Sweden through the VR Starting Grant \"Shallow water flows including sediment transport and morphodynamics\", VR grant agreement 2020-03642 VR.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from the United States National Science Foundation (NSF) under awards DMS-1719818 and DMS-1943186.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding from the German Federal Ministry of Education and Research (BMBF) through the project grant \"Adaptive earth system modeling with significantly reduced computation time for exascale supercomputers (ADAPTEX)\" (funding id: 16ME0668K).","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding by the Daimler und Benz Stiftung (Daimler and Benz Foundation) through grant no. 32-10/22.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Trixi.jl is supported by NumFOCUS as an Affiliated Project.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"EditURL = \"../../literate/src/files/adding_nonconservative_equation.jl\"","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#adding_nonconservative_equation","page":"11 Adding a non-conservative equation","title":"11: Adding a non-conservative equation","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"If you want to use Trixi.jl for your own research, you might be interested in a new physics model that is not present in Trixi.jl. In this tutorial, we will implement the nonconservative linear advection equation in a periodic domain","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"left\nbeginalignedpartial_t u(tx) + a(x) partial_x u(tx) = 0 \nu(0x)=sin(x) \nu(t-pi)=u(tpi)\nendaligned\nright","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"where a(x) = 2 + cos(x). The analytic solution is","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"u(tx)=-sin left(2 tan ^-1left(sqrt3 tan left(fracsqrt3 t2-tan ^-1left(frac1sqrt3tan left(fracx2right)right)right)right)right)","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"In Trixi.jl, such a mathematical model is encoded as a subtype of Trixi.AbstractEquations.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#Basic-setup","page":"11 Adding a non-conservative equation","title":"Basic setup","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"Since there is no native support for variable coefficients, we need to transform the PDE to the following system:","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"left\nbeginalignedpartial_t beginpmatrixu(tx)a(tx) endpmatrix +beginpmatrix a(tx) partial_x u(tx) 0 endpmatrix = 0 \nu(0x)=sin(x) \na(0x)=2+cos(x) \nu(t-pi)=u(tpi)\nendaligned\nright","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"# Define new physics\nusing Trixi\nusing Trixi: AbstractEquations, get_node_vars\nimport Trixi: varnames, default_analysis_integrals, flux, max_abs_speed_naive,\n have_nonconservative_terms\n\n# Since there is no native support for variable coefficients, we use two\n# variables: one for the basic unknown `u` and another one for the coefficient `a`\nstruct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,\n 2 #= two variables (u,a) =#}\nend\n\nvarnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = (\"scalar\", \"advection_velocity\")\n\ndefault_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()\n\n\n# The conservative part of the flux is zero\nflux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)\n\n# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation\nfunction max_abs_speed_naive(u_ll, u_rr, orientation::Integer, ::NonconservativeLinearAdvectionEquation)\n _, advection_velocity_ll = u_ll\n _, advection_velocity_rr = u_rr\n\n return max(abs(advection_velocity_ll), abs(advection_velocity_rr))\nend\n\n\n# We use nonconservative terms\nhave_nonconservative_terms(::NonconservativeLinearAdvectionEquation) = Trixi.True()\n\n# This \"nonconservative numerical flux\" implements the nonconservative terms.\n# In general, nonconservative terms can be written in the form\n# g(u) ∂ₓ h(u)\n# Thus, a discrete difference approximation of this nonconservative term needs\n# - `u mine`: the value of `u` at the current position (for g(u))\n# - `u_other`: the values of `u` in a neighborhood of the current position (for ∂ₓ h(u))\nfunction flux_nonconservative(u_mine, u_other, orientation,\n equations::NonconservativeLinearAdvectionEquation)\n _, advection_velocity = u_mine\n scalar, _ = u_other\n\n return SVector(advection_velocity * scalar, zero(scalar))\nend","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"The implementation of nonconservative terms uses a single \"nonconservative flux\" function flux_nonconservative. It will basically be applied in a loop of the form","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"du_m(D, u) = sum(D[m, l] * flux_nonconservative(u[m], u[l], 1, equations)) # orientation 1: x","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"where D is the derivative matrix and u contains the nodal solution values.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"Now, we can run a simple simulation using a DGSEM discretization.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"# Create a simulation setup\nusing Trixi\nusing OrdinaryDiffEq\n\nequation = NonconservativeLinearAdvectionEquation()\n\n# You can derive the exact solution for this setup using the method of\n# characteristics\nfunction initial_condition_sine(x, t, equation::NonconservativeLinearAdvectionEquation)\n x0 = -2 * atan(sqrt(3) * tan(sqrt(3) / 2 * t - atan(tan(x[1] / 2) / sqrt(3))))\n scalar = sin(x0)\n advection_velocity = 2 + cos(x[1])\n SVector(scalar, advection_velocity)\nend\n\n# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries\nmesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates\n initial_refinement_level=4, n_cells_max=10^4)\n\n# Create a DGSEM solver with polynomials of degree `polydeg`\n# Remember to pass a tuple of the form `(conservative_flux, nonconservative_flux)`\n# as `surface_flux` and `volume_flux` when working with nonconservative terms\nvolume_flux = (flux_central, flux_nonconservative)\nsurface_flux = (flux_lax_friedrichs, flux_nonconservative)\nsolver = DGSEM(polydeg=3, surface_flux=surface_flux,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\n# Setup the spatial semidiscretization containing all ingredients\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\n# Create an ODE problem with given time span\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan)\n\n# Set up some standard callbacks summarizing the simulation setup and computing\n# errors of the numerical solution\nsummary_callback = SummaryCallback()\nanalysis_callback = AnalysisCallback(semi, interval=50)\ncallbacks = CallbackSet(summary_callback, analysis_callback)\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes\n# the passed callbacks\nsol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n save_everystep=false, callback=callbacks)\n\n# Print the timer summary\nsummary_callback()\n\n# Plot the numerical solution at the final time\nusing Plots: plot\nplot(sol)","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"You see a plot of the final solution.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"We can check whether everything fits together by refining the grid and comparing the numerical errors. First, we look at the error using the grid resolution above.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"error_1 = analysis_callback(sol).l2 |> first","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"Next, we increase the grid resolution by one refinement level and run the simulation again.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"mesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates\n initial_refinement_level=5, n_cells_max=10^4)\n\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan);\n\nsummary_callback = SummaryCallback()\nanalysis_callback = AnalysisCallback(semi, interval=50)\ncallbacks = CallbackSet(summary_callback, analysis_callback);\n\nsol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n save_everystep=false, callback=callbacks);\nsummary_callback()\n\nerror_2 = analysis_callback(sol).l2 |> first","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"error_1 / error_2","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"As expected, the new error is roughly reduced by a factor of 16, corresponding to an experimental order of convergence of 4 (for polynomials of degree 3).","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#Summary-of-the-code","page":"11 Adding a non-conservative equation","title":"Summary of the code","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"Here is the complete code that we used (without the callbacks since these create a lot of unnecessary output in the doctests of this tutorial). In addition, we create the struct inside the new module NonconservativeLinearAdvection. That ensures that we can re-create structs defined therein without having to restart Julia.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"Define new physics","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"module NonconservativeLinearAdvection\n\nusing Trixi\nusing Trixi: AbstractEquations, get_node_vars\nimport Trixi: varnames, default_analysis_integrals, flux, max_abs_speed_naive,\n have_nonconservative_terms\n\n# Since there is not yet native support for variable coefficients, we use two\n# variables: one for the basic unknown `u` and another one for the coefficient `a`\nstruct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,\n 2 #= two variables (u,a) =#}\nend\n\nvarnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = (\"scalar\", \"advection_velocity\")\n\ndefault_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()\n\n\n# The conservative part of the flux is zero\nflux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)\n\n# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation\nfunction max_abs_speed_naive(u_ll, u_rr, orientation::Integer, ::NonconservativeLinearAdvectionEquation)\n _, advection_velocity_ll = u_ll\n _, advection_velocity_rr = u_rr\n\n return max(abs(advection_velocity_ll), abs(advection_velocity_rr))\nend\n\n\n# We use nonconservative terms\nhave_nonconservative_terms(::NonconservativeLinearAdvectionEquation) = Trixi.True()\n\n# This \"nonconservative numerical flux\" implements the nonconservative terms.\n# In general, nonconservative terms can be written in the form\n# g(u) ∂ₓ h(u)\n# Thus, a discrete difference approximation of this nonconservative term needs\n# - `u mine`: the value of `u` at the current position (for g(u))\n# - `u_other`: the values of `u` in a neighborhood of the current position (for ∂ₓ h(u))\nfunction flux_nonconservative(u_mine, u_other, orientation,\n equations::NonconservativeLinearAdvectionEquation)\n _, advection_velocity = u_mine\n scalar, _ = u_other\n\n return SVector(advection_velocity * scalar, zero(scalar))\nend\n\nend # module\n\n\n\n# Create a simulation setup\nimport .NonconservativeLinearAdvection\nusing Trixi\nusing OrdinaryDiffEq\n\nequation = NonconservativeLinearAdvection.NonconservativeLinearAdvectionEquation()\n\n# You can derive the exact solution for this setup using the method of\n# characteristics\nfunction initial_condition_sine(x, t, equation::NonconservativeLinearAdvection.NonconservativeLinearAdvectionEquation)\n x0 = -2 * atan(sqrt(3) * tan(sqrt(3) / 2 * t - atan(tan(x[1] / 2) / sqrt(3))))\n scalar = sin(x0)\n advection_velocity = 2 + cos(x[1])\n SVector(scalar, advection_velocity)\nend\n\n# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries\nmesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates\n initial_refinement_level=4, n_cells_max=10^4)\n\n# Create a DGSEM solver with polynomials of degree `polydeg`\n# Remember to pass a tuple of the form `(conservative_flux, nonconservative_flux)`\n# as `surface_flux` and `volume_flux` when working with nonconservative terms\nvolume_flux = (flux_central, NonconservativeLinearAdvection.flux_nonconservative)\nsurface_flux = (flux_lax_friedrichs, NonconservativeLinearAdvection.flux_nonconservative)\nsolver = DGSEM(polydeg=3, surface_flux=surface_flux,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\n# Setup the spatial semidiscretization containing all ingredients\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\n# Create an ODE problem with given time span\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan);\n\n# Set up some standard callbacks summarizing the simulation setup and computing\n# errors of the numerical solution\nsummary_callback = SummaryCallback()\nanalysis_callback = AnalysisCallback(semi, interval=50)\ncallbacks = CallbackSet(summary_callback, analysis_callback);\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes\n# the passed callbacks\nsol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n save_everystep=false);\n\n# Plot the numerical solution at the final time\nusing Plots: plot\nplot(sol);\nnothing #hide","category":"page"},{"location":"tutorials/adding_nonconservative_equation/#Package-versions","page":"11 Adding a non-conservative equation","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"","category":"page"},{"location":"tutorials/adding_nonconservative_equation/","page":"11 Adding a non-conservative equation","title":"11 Adding a non-conservative equation","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"EditURL = \"../../literate/src/files/differentiable_programming.jl\"","category":"page"},{"location":"tutorials/differentiable_programming/#differentiable_programming","page":"19 Differentiable programming","title":"19: Differentiable programming","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Julia and its ecosystem provide some tools for differentiable programming. Trixi.jl is designed to be flexible, extendable, and composable with Julia's growing ecosystem for scientific computing and machine learning. Thus, the ultimate goal is to have fast implementations that allow automatic differentiation (AD) without too much hassle for users. If some parts do not meet these requirements, please feel free to open an issue or propose a fix in a PR.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"In the following, we will walk through some examples demonstrating how to differentiate through Trixi.jl.","category":"page"},{"location":"tutorials/differentiable_programming/#Forward-mode-automatic-differentiation","page":"19 Differentiable programming","title":"Forward mode automatic differentiation","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Trixi.jl integrates well with ForwardDiff.jl for forward mode AD.","category":"page"},{"location":"tutorials/differentiable_programming/#Computing-the-Jacobian","page":"19 Differentiable programming","title":"Computing the Jacobian","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"The high-level interface to compute the Jacobian this way is jacobian_ad_forward. First, we load the required packages and compute the Jacobian of a semidiscretization of the compressible Euler equations, a system of nonlinear conservation laws.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"using Trixi, LinearAlgebra, Plots\n\nequations = CompressibleEulerEquations2D(1.4)\n\nsolver = DGSEM(3, flux_central)\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi);\nsize(J)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Next, we compute the eigenvalues of the Jacobian.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"λ = eigvals(J)\nscatter(real.(λ), imag.(λ), label=\"central flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"As you can see here, the maximal real part is close to zero.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Interestingly, if we add dissipation by switching to the flux_lax_friedrichs at the interfaces, the maximal real part of the eigenvalues increases.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"solver = DGSEM(3, flux_lax_friedrichs)\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi)\nλ = eigvals(J)\n\nscatter!(real.(λ), imag.(λ), label=\"Lax-Friedrichs flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Although the maximal real part is still somewhat small, it's larger than for the purely central discretization.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"However, we should be careful when using this analysis, since the eigenvectors are not necessarily well-conditioned.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"λ, V = eigen(J)\ncondition_number = cond(V)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"In one space dimension, the situation is a bit different.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"equations = CompressibleEulerEquations1D(1.4)\n\nsolver = DGSEM(3, flux_central)\nmesh = TreeMesh((-1.0,), (1.0,), initial_refinement_level=6, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi)\n\nλ = eigvals(J)\n\nscatter(real.(λ), imag.(λ), label=\"central flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Here, the maximal real part is basically zero to machine accuracy.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Moreover, the eigenvectors are not as ill-conditioned as in 2D.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"λ, V = eigen(J)\ncondition_number = cond(V)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"If we add dissipation, the maximal real part is still approximately zero.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"solver = DGSEM(3, flux_lax_friedrichs)\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ = jacobian_ad_forward(semi)\nλ = eigvals(J)\n\nscatter!(real.(λ), imag.(λ), label=\"Lax-Friedrichs flux\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"As you can see from the plot generated above, the maximal real part is still basically zero to machine precision.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"relative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Let's check the condition number of the eigenvectors.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"λ, V = eigen(J)\n\ncondition_number = cond(V)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Note that the condition number of the eigenvector matrix increases but is still smaller than for the example in 2D.","category":"page"},{"location":"tutorials/differentiable_programming/#Computing-other-derivatives","page":"19 Differentiable programming","title":"Computing other derivatives","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"It is also possible to compute derivatives of other dependencies using AD in Trixi.jl. For example, you can compute the gradient of an entropy-dissipative semidiscretization with respect to the ideal gas constant of the compressible Euler equations as described in the following. This example is also available as the elixir examples/special_elixirs/elixir_euler_ad.jl","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"First, we create a semidiscretization of the compressible Euler equations.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"using Trixi, LinearAlgebra, ForwardDiff\n\nequations = CompressibleEulerEquations2D(1.4)\n\n\"\"\"\n initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)\n\nThe classical isentropic vortex test case of\n- Chi-Wang Shu (1997)\n Essentially Non-Oscillatory and Weighted Essentially Non-Oscillatory\n Schemes for Hyperbolic Conservation Laws\n [NASA/CR-97-206253](https://ntrs.nasa.gov/citations/19980007543)\n\"\"\"\nfunction initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)\n inicenter = SVector(0.0, 0.0) # initial center of the vortex\n iniamplitude = 5.0 # size and strength of the vortex\n\n rho = 1.0 # base flow\n v1 = 1.0\n v2 = 1.0\n vel = SVector(v1, v2)\n p = 25.0\n\n rt = p / rho # ideal gas equation\n t_loc = 0.0\n\n cent = inicenter + vel*t_loc # shift advection of center to handle periodic BC, but only for v1 = v2 = 1.0\n cent = x - cent # distance to center point\n cent = SVector(-cent[2], cent[1])\n\n r2 = cent[1]^2 + cent[2]^2\n du = iniamplitude / (2*π) * exp(0.5 * (1 - r2)) # vel. perturbation\n dtemp = -(equations.gamma - 1) / (2 * equations.gamma * rt) * du^2 # isentropic\n\n rho = rho * (1 + dtemp)^(1 / (equations.gamma - 1))\n vel = vel + du * cent\n v1, v2 = vel\n p = p * (1 + dtemp)^(equations.gamma / (equations.gamma - 1))\n\n prim = SVector(rho, v1, v2, p)\n return prim2cons(prim, equations)\nend\n\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsolver = DGSEM(3, flux_lax_friedrichs, VolumeIntegralFluxDifferencing(flux_ranocha))\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_isentropic_vortex, solver)\n\nu0_ode = Trixi.compute_coefficients(0.0, semi)\nsize(u0_ode)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Next, we compute the Jacobian using ForwardDiff.jacobian.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"J = ForwardDiff.jacobian((du_ode, γ) -> begin\n equations_inner = CompressibleEulerEquations2D(first(γ))\n semi_inner = Trixi.remake(semi, equations=equations_inner, uEltype=eltype(γ))\n Trixi.rhs!(du_ode, u0_ode, semi_inner, 0.0)\nend, similar(u0_ode), [1.4]); # γ needs to be an `AbstractArray`\n\nround.(extrema(J), sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Note that we create a semidiscretization semi at first to determine the state u0_ode around which we want to perform the linearization. Next, we wrap the RHS evaluation inside a closure and pass that to ForwardDiff.jacobian. There, we need to make sure that the internal caches are able to store dual numbers from ForwardDiff.jl by setting uEltype appropriately. A similar approach is used by jacobian_ad_forward.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Note that the ideal gas constant does not influence the semidiscrete rate of change of the density, as demonstrated by","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"norm(J[1:4:end])","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Here, we used some knowledge about the internal memory layout of Trixi.jl, an array of structs with the conserved variables as fastest-varying index in memory.","category":"page"},{"location":"tutorials/differentiable_programming/#Differentiating-through-a-complete-simulation","page":"19 Differentiable programming","title":"Differentiating through a complete simulation","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"It is also possible to differentiate through a complete simulation. As an example, let's differentiate the total energy of a simulation using the linear scalar advection equation with respect to the wave number (frequency) of the initial data.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"using Trixi, OrdinaryDiffEq, ForwardDiff, Plots\n\nfunction energy_at_final_time(k) # k is the wave number of the initial condition\n equations = LinearScalarAdvectionEquation2D(1.0, -0.3)\n mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)\n solver = DGSEM(3, flux_lax_friedrichs)\n initial_condition = (x, t, equation) -> begin\n x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)\n return SVector(sinpi(k * sum(x_trans)))\n end\n semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n uEltype=typeof(k))\n ode = semidiscretize(semi, (0.0, 1.0))\n sol = solve(ode, BS3(), save_everystep=false)\n Trixi.integrate(energy_total, sol.u[end], semi)\nend\n\nk_values = range(0.9, 1.1, length=101)\n\nplot(k_values, energy_at_final_time.(k_values), label=\"Energy\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"You see a plot of a curve that resembles a parabola with local maximum around k = 1.0. Why's that? Well, the domain is fixed but the wave number changes. Thus, if the wave number is not chosen as an integer, the initial condition will not be a smooth periodic function in the given domain. Hence, the dissipative surface flux (flux_lax_friedrichs in this example) will introduce more dissipation. In particular, it will introduce more dissipation for \"less smooth\" initial data, corresponding to wave numbers k further away from integers.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"We can compute the discrete derivative of the energy at the final time with respect to the wave number k as follows.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"round(ForwardDiff.derivative(energy_at_final_time, 1.0), sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"This is rather small and we can treat it as zero in comparison to the value of this derivative at other wave numbers k.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"dk_values = ForwardDiff.derivative.((energy_at_final_time,), k_values);\n\nplot(k_values, dk_values, label=\"Derivative\")","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"If you remember basic calculus, a sufficient condition for a local maximum is that the first derivative vanishes and the second derivative is negative. We can also check this discretely.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"second_derivative = round(ForwardDiff.derivative(\n k -> Trixi.ForwardDiff.derivative(energy_at_final_time, k), 1.0),\n sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Having seen this application, let's break down what happens step by step.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"function energy_at_final_time(k) # k is the wave number of the initial condition\n equations = LinearScalarAdvectionEquation2D(1.0, -0.3)\n mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)\n solver = DGSEM(3, flux_lax_friedrichs)\n initial_condition = (x, t, equation) -> begin\n x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)\n return SVector(sinpi(k * sum(x_trans)))\n end\n semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n uEltype=typeof(k))\n ode = semidiscretize(semi, (0.0, 1.0))\n sol = solve(ode, BS3(), save_everystep=false)\n Trixi.integrate(energy_total, sol.u[end], semi)\nend\n\nk = 1.0\nround(ForwardDiff.derivative(energy_at_final_time, k), sigdigits=2)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"When calling ForwardDiff.derivative(energy_at_final_time, k) with k=1.0, ForwardDiff.jl will basically use the chain rule and known derivatives of existing basic functions to calculate the derivative of the energy at the final time with respect to the wave number k at k0 = 1.0. To do this, ForwardDiff.jl uses dual numbers, which basically store the result and its derivative w.r.t. a specified parameter at the same time. Thus, we need to make sure that we can treat these ForwardDiff.Dual numbers everywhere during the computation. Fortunately, generic Julia code usually supports these operations. The most basic problem for a developer is to ensure that all types are generic enough, in particular the ones of internal caches.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"The first step in this example creates some basic ingredients of our simulation.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"equations = LinearScalarAdvectionEquation2D(1.0, -0.3)\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)\nsolver = DGSEM(3, flux_lax_friedrichs);\nnothing #hide","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"These do not have internal caches storing intermediate values of the numerical solution, so we do not need to adapt them. In fact, we could also define them outside of energy_at_final_time (but would need to take care of globals or wrap everything in another function).","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Next, we define the initial condition","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"initial_condition = (x, t, equation) -> begin\n x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)\n return SVector(sinpi(k * sum(x_trans)))\nend;\nnothing #hide","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"as a closure capturing the wave number k passed to energy_at_final_time. If you call energy_at_final_time(1.0), k will be a Float64. Thus, the return values of initial_condition will be SVectors of Float64s. When calculating the ForwardDiff.derivative, k will be a ForwardDiff.Dual number. Hence, the initial_condition will return SVectors of ForwardDiff.Dual numbers.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"The semidiscretization semi uses some internal caches to avoid repeated allocations and speed up the computations, e.g. for numerical fluxes at interfaces. Thus, we need to tell Trixi.jl to allow ForwardDiff.Dual numbers in these caches. That's what the keyword argument uEltype=typeof(k) in","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n uEltype=typeof(k));\nnothing #hide","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"does. This is basically the only part where you need to modify your standard Trixi.jl code to enable automatic differentiation. From there on, the remaining steps","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"ode = semidiscretize(semi, (0.0, 1.0))\nsol = solve(ode, BS3(), save_everystep=false)\nround(Trixi.integrate(energy_total, sol.u[end], semi), sigdigits=5)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"do not need any modifications since they are sufficiently generic (and enough effort has been spend to allow general types inside these calls).","category":"page"},{"location":"tutorials/differentiable_programming/#Propagating-errors-using-Measurements.jl","page":"19 Differentiable programming","title":"Propagating errors using Measurements.jl","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"(Image: Error bars by Randall Munroe) \"Error bars\" by Randall Munroe, linked from https://xkcd.com/2110","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Similar to AD, Trixi.jl also allows propagating uncertainties using linear error propagation theory via Measurements.jl. As an example, let's create a system representing the linear advection equation in 1D with an uncertain velocity. Then, we create a semidiscretization using a sine wave as initial condition, solve the ODE, and plot the resulting uncertainties in the primitive variables.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"using Trixi, OrdinaryDiffEq, Measurements, Plots, LaTeXStrings\n\nequations = LinearScalarAdvectionEquation1D(1.0 ± 0.1)\n\nmesh = TreeMesh((-1.0,), (1.0,), n_cells_max=10^5, initial_refinement_level=5)\n\nsolver = DGSEM(3)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test,\n solver, uEltype=Measurement{Float64})\n\node = semidiscretize(semi, (0.0, 1.5))\n\nsol = solve(ode, BS3(), save_everystep=false);\n\nplot(sol)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"You should see a plot where small error bars are shown around the extrema and larger error bars are shown in the remaining parts. This result is in accordance with expectations. Indeed, the uncertain propagation speed will affect the extrema less since the local variation of the solution is relatively small there. In contrast, the local variation of the solution is large around the turning points of the sine wave, so the uncertainties will be relatively large there.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"All this is possible due to allowing generic types and having good abstractions in Julia that allow packages to work together seamlessly.","category":"page"},{"location":"tutorials/differentiable_programming/#Finite-difference-approximations","page":"19 Differentiable programming","title":"Finite difference approximations","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Trixi.jl provides the convenience function jacobian_fd to approximate the Jacobian via central finite differences.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"using Trixi, LinearAlgebra\n\nequations = CompressibleEulerEquations2D(1.4)\n\nsolver = DGSEM(3, flux_central)\n\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n\nJ_fd = jacobian_fd(semi)\n\nJ_ad = jacobian_ad_forward(semi)\n\nrelative_difference = norm(J_fd - J_ad) / size(J_fd, 1)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"This discrepancy is of the expected order of magnitude for central finite difference approximations.","category":"page"},{"location":"tutorials/differentiable_programming/#Linear-systems","page":"19 Differentiable programming","title":"Linear systems","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"When a linear PDE is discretized using a linear scheme such as a standard DG method, the resulting semidiscretization yields an affine ODE of the form","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"partial_t u(t) = A u(t) + b","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"where A is a linear operator (\"matrix\") and b is a vector. Trixi.jl allows you to obtain this linear structure in a matrix-free way by using linear_structure. The resulting operator A can be used in multiplication, e.g. mul! from LinearAlgebra, converted to a sparse matrix using sparse from SparseArrays, or converted to a dense matrix using Matrix for detailed eigenvalue analyses. For example,","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"using Trixi, LinearAlgebra, Plots\n\nequations = LinearScalarAdvectionEquation2D(1.0, -0.3)\n\nsolver = DGSEM(3, flux_lax_friedrichs)\n\nmesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, solver)\n\nA, b = linear_structure(semi)\n\nsize(A), size(b)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"Next, we compute the eigenvalues of the linear operator.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"λ = eigvals(Matrix(A))\n\nscatter(real.(λ), imag.(λ))","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"As you can see here, the maximal real part is close to machine precision.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"λ = eigvals(Matrix(A))\nrelative_maximum = maximum(real, λ) / maximum(abs, λ)","category":"page"},{"location":"tutorials/differentiable_programming/#Package-versions","page":"19 Differentiable programming","title":"Package versions","text":"","category":"section"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\", \"ForwardDiff\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"","category":"page"},{"location":"tutorials/differentiable_programming/","page":"19 Differentiable programming","title":"19 Differentiable programming","text":"This page was generated using Literate.jl.","category":"page"},{"location":"meshes/tree_mesh/#Tree-mesh","page":"Tree mesh","title":"Tree mesh","text":"","category":"section"},{"location":"meshes/tree_mesh/","page":"Tree mesh","title":"Tree mesh","text":"The TreeMesh is a Cartesian, h-non-conforming mesh type used in many parts of Trixi.jl. Often, the support for this mesh type is developed best since it was the first mesh type in Trixi.jl, and it is available in one, two, and three space dimensions.","category":"page"},{"location":"meshes/tree_mesh/","page":"Tree mesh","title":"Tree mesh","text":"It is limited to hypercube domains but supports AMR via the AMRCallback. Due to its Cartesian nature, (numerical) fluxes need to implement methods dispatching on the orientation::Integer as described in the conventions.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Unstructured-quadrilateral-mesh","page":"Unstructured mesh","title":"Unstructured quadrilateral mesh","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The UnstructuredMesh2D is an unstructured, curvilinear, conforming mesh type in two space dimensions.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Next, we describe the conventions taken in the implementation for two-dimensional unstructured quadrilateral meshes. Principally, this relates to how a file with the extension .mesh encodes information about the numbering and orientation of elements in an unstructured quadrilateral mesh with possibly curved boundaries.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We use the following unstructured mesh with three elements for this discussion:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"(Image: example-mesh)","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Further, a simulation using Trixi.jl on this example unstructured mesh is provided in examples/unstructured_2d_dgsem/elixir_euler_basic.jl.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Mesh-file-header","page":"Unstructured mesh","title":"Mesh file header","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The first two lines of the mesh file lists the mesh file type as well as the total number of corners, surfaces, elements, and the polynomial degree that the mesh will use to represent any curved sides. For the example mesh these quantities are","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"ISM-V2\n 7 9 3 8","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"corresponding to seven corners, nine surfaces, and three elements. The mesh polynomial degree of eight is taken only for illustrative purposes. In practice, this mesh polynomial degree depends on the particular application for which the curved, unstructured mesh is required.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#List-of-corner-nodes","page":"Unstructured mesh","title":"List of corner nodes","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"After these global counts that prescribe information about the mesh skeleton, the mesh file give a list of the physical (x,y) coordinates of all the corners. The corner nodes are listed in the order prescribed by mesh generator. Thus, for the example mesh this node list would be","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 1.0 -1.0\n 3.0 0.0\n 1.0 1.0\n 2.0 0.0\n 0.0 0.0\n 3.0 1.0\n 3.0 -1.0","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The corner nodes are internally referenced by their position in the list above. For example, here the node at (1.0, -1.0) would have node id 1, node id 2 would be at (3.0, 0.0) etc.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#List-of-neighbor-connectivity","page":"Unstructured mesh","title":"List of neighbor connectivity","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"After the corner list comes the neighbor connectivity along each surface in the mesh. This includes local indexing and orientation information necessary to compute the coupling between elements in the mesh. In 2D each surface is defined by connecting two nodes indexed as with the numbering above. We adopt the convention that node id 1 < node id 2.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Each surface will have two neighbors where the element on the left locally as one \"walks\" from node id 1 to node id 2 is taken to be the primary element and the element locally on the right is taken to be the secondary element. If, however, there is no secondary element index, then the surface lies along a physical boundary. In this case the only available element index is considered to be primary and the secondary index is set to zero.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The final two index numbers within the neighbor information list are used to identify the local surface within each element. The first local surface index (on the primary element) will always be positive whereas the second local surface index (on the primary element) can be positive or negative. If the second local surface index is positive, then the local coordinate systems in the primary element and secondary element match, i.e., the indexing on either side runs from 1:polydeg+1. However, if the local surface index of the secondary element is negative in the mesh file, then the coordinate system in the secondary element is flipped with respect to the primary element. Therefore, care must be taken in the implementation to ensure that the primary element indexing runs from 1:polydeg+1 whereas the secondary element indexing must run in reverse from polydeg+1:-1:1. Finally, if the secondary element index is zero, then so will be the local surface index because the surface is on a physical boundary. Also, there is no flipping of coordinate indexing required at the physical boundary because only the primary element's coordinate system exists.","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Three-examples:-One-along-a-physical-boundary-and-two-along-interior-surfaces.","page":"Unstructured mesh","title":"Three examples: One along a physical boundary and two along interior surfaces.","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Along edge {8} we connect node (2) to node (7) and are along a physical boundary in element 3 with the local surface index 1 and the neighbor information:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 2 7 3 0 1 0","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Along edge {1} we connect node (2) to node (4) such that the primary element is 3 with local surface index 2 and the secondary element is 2 with local surface index 1. Furthermore, we see that coordinate system in the secondary element 2 is flipped with respect to the primary element's coordinate system such that the sign of the local surface index in the secondary element flips. This gives the following neighbor information:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 2 4 3 2 2 -1","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Along edge {4} we connect node (1) to node (4) such that the primary element is 1 with local surface index 2 and the secondary element is 3 with local surface index 3. The coordinate systems in both elements match and no sign change is required on the local surface index in the secondary element:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 1 4 1 3 2 3","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We collect the complete neighbor information for the example mesh above:","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 2 4 3 2 2 -1\n 3 5 1 0 4 0\n 1 5 1 0 1 0\n 1 4 1 3 2 3\n 2 6 2 0 2 0\n 1 7 3 0 4 0\n 3 6 2 0 3 0\n 2 7 3 0 1 0\n 3 4 2 1 4 -3","category":"page"},{"location":"meshes/unstructured_quad_mesh/#List-of-elements","page":"Unstructured mesh","title":"List of elements","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Each quadrilateral element in the unstructured mesh is dictated by four corner points with indexing taken from the numbering given by the corner list above. We connect a set of four corner points (starting from the bottom left) in an anti-clockwise fashion thus making the element right-handed indicated using the circular arrow in the figure above. In turn, this right-handedness defines the local surface indexing (i.e. the four local sides) and the local (xi eta) coordinate system. For example, the four corners for element 1 would be listed as","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 5 1 4 3","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The mesh file also encodes information for curved surfaces either interior to the domain (as surface {9} above) or along the physical boundaries. A set of check digits are included directly below the four corner indexes to indicate whether the local surface index (1, 2, 3, or 4) within the element is straight sided, 0, or is curved, 1. If the local surface is straight sided no additional information is necessary during the mesh file read in. But for any curved surfaces the mesh file provides (x,y) coordinate values in order to construct an interpolant of this surface with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes. This list of (x,y) data will be given in the direction of the local coordinate system.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"The last piece of information provided by the mesh file are labels for the different surfaces of an element. These labels are useful to set boundary conditions along physical surfaces. The labels can be short descriptive words. The label --- indicates an internal surface where no boundary condition is required.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"As an example, the complete information for element 1 in the example mesh would be","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 5 1 4 3\n 0 0 1 1\n 1.000000000000000 1.000000000000000\n 1.024948365654583 0.934461926834452\n 1.116583018200151 0.777350964621867\n 1.295753434047077 0.606254343587194\n 1.537500000000000 0.462500000000000\n 1.768263070247418 0.329729152118310\n 1.920916981799849 0.185149035378133\n 1.986035130050921 0.054554577460044\n 2.000000000000000 0.0\n 0.0 0.0\n 0.035513826946206 0.105291711848750\n 0.148591270347399 0.317731556850611\n 0.340010713990041 0.452219430075470\n 0.575000000000000 0.462500000000000\n 0.788022294598950 0.483764065630034\n 0.926408729652601 0.644768443149389\n 0.986453164464803 0.883724792445746\n 1.000000000000000 1.000000000000000\n Slant --- --- Bezier","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"where the curved boundary information is encoded \"back to back\". That is, the first nine (x,y) nodes in the list above correspond to the interior boundary curve along local side 3 in element 1 and the next nine (x,y) nodes denote the curved physical boundary named Bezier along local side 4.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We collect the complete set of element information for the example mesh","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" 5 1 4 3\n 0 0 1 1\n 1.000000000000000 1.000000000000000\n 1.024948365654583 0.934461926834452\n 1.116583018200151 0.777350964621867\n 1.295753434047077 0.606254343587194\n 1.537500000000000 0.462500000000000\n 1.768263070247418 0.329729152118310\n 1.920916981799849 0.185149035378133\n 1.986035130050921 0.054554577460044\n 2.000000000000000 0.0\n 0.0 0.0\n 0.035513826946206 0.105291711848750\n 0.148591270347399 0.317731556850611\n 0.340010713990041 0.452219430075470\n 0.575000000000000 0.462500000000000\n 0.788022294598950 0.483764065630034\n 0.926408729652601 0.644768443149389\n 0.986453164464803 0.883724792445746\n 1.000000000000000 1.000000000000000\n Slant --- --- Bezier\n 4 2 6 3\n 0 0 0 1\n 2.000000000000000 0.0\n 1.986035130050921 0.054554577460044\n 1.920916981799849 0.185149035378133\n 1.768263070247418 0.329729152118310\n 1.537500000000000 0.462500000000000\n 1.295753434047077 0.606254343587194\n 1.116583018200151 0.777350964621867\n 1.024948365654583 0.934461926834452\n 1.000000000000000 1.000000000000000\n --- Right Top ---\n 7 2 4 1\n 0 0 0 0\n Right --- --- Bottom","category":"page"},{"location":"meshes/unstructured_quad_mesh/#Trixi.jl-on-an-unstructured-quadrilateral-mesh","page":"Unstructured mesh","title":"Trixi.jl on an unstructured quadrilateral mesh","text":"","category":"section"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"We provide an example simulation on an unstructured quadrilateral mesh by executing","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"julia> trixi_include(default_example_unstructured())","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":"Note this may download a copy of the mesh file described above for the three element unstructured mesh. This elixir provides the solution for the compressible Euler equations in two spatial dimensions for a smooth propagating wave solution. Below we provide the time evolution of the pressure wave for this example created with the Trixi2Vtk tool and visualized using ParaView.","category":"page"},{"location":"meshes/unstructured_quad_mesh/","page":"Unstructured mesh","title":"Unstructured mesh","text":" \n
","category":"page"},{"location":"reference-trixibase/#TrixiBase.jl-API","page":"TrixiBase.jl","title":"TrixiBase.jl API","text":"","category":"section"},{"location":"reference-trixibase/","page":"TrixiBase.jl","title":"TrixiBase.jl","text":"CurrentModule = TrixiBase","category":"page"},{"location":"reference-trixibase/","page":"TrixiBase.jl","title":"TrixiBase.jl","text":"Modules = [TrixiBase]","category":"page"},{"location":"reference-trixibase/#TrixiBase.trixi_include-Tuple{Module, AbstractString}","page":"TrixiBase.jl","title":"TrixiBase.trixi_include","text":"trixi_include([mod::Module=Main,] elixir::AbstractString; kwargs...)\n\ninclude the file elixir and evaluate its content in the global scope of module mod. You can override specific assignments in elixir by supplying keyword arguments. Its basic purpose is to make it easier to modify some parameters while running simulations from the REPL. Additionally, this is used in tests to reduce the computational burden for CI while still providing examples with sensible default values for users.\n\nBefore replacing assignments in elixir, the keyword argument maxiters is inserted into calls to solve with it's default value used in the SciML ecosystem for ODEs, see the \"Miscellaneous\" section of the documentation.\n\nExamples\n\njulia> using TrixiBase, Trixi\n\njulia> redirect_stdout(devnull) do\n trixi_include(@__MODULE__, joinpath(examples_dir(), \"tree_1d_dgsem\", \"elixir_advection_extended.jl\"),\n tspan=(0.0, 0.1))\n sol.t[end]\n end\n[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.\n0.1\n\n\n\n\n\n","category":"method"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"EditURL = \"../../literate/src/files/time_stepping.jl\"","category":"page"},{"location":"tutorials/time_stepping/#time_stepping","page":"18 Explicit time stepping","title":"18: Explicit time stepping","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"For the time integration, Trixi.jl uses the package OrdinaryDiffEq.jl from the SciML ecosystem. The interface to this package is the solve(...) function. It always requires an ODE problem and a time integration algorithm as input parameters.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"solve(ode, alg; kwargs...)","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"In Trixi.jl, the ODE problem is created by semidiscretize(semi, tspan) for a semidiscretization semi and the time span tspan. In particular, semidiscretize returns an ODEProblem used by OrdinaryDiffEq.jl.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"OrdinaryDiffEq.jl provides many integration algorithms, which are summarized in the documentation. Particularly interesting for Trixi.jl are their strong stability preserving (SSP) methods and low-storage methods. There are some differences regarding the choice of the used time step.","category":"page"},{"location":"tutorials/time_stepping/#adaptive_step_sizes","page":"18 Explicit time stepping","title":"Error-based adaptive step sizes","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"First, we treat time integration algorithms with adaptive step sizes, such as SSPRK43. It is used in some elixirs, like elixir_euler_colliding_flow.jl or elixir_euler_astro_jet_amr.jl.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"Other error-based adaptive integration algorithms are for instance RDPK3SpFSAL35, RDPK3Sp35, RDPK3SpFSAL49, RDPK3Sp49, RDPK3SpFSAL510, RDPK3Sp510.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"They already contain an error-based adaptive step size control and heuristics to guess a starting step size. If this heuristic fails in your case, you can specify an appropriately small initial step size as keyword argument dt=... of solve.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"If you run Trixi in parallel with MPI you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to enable MPI aware error-based adaptive step size control. These keyword arguments are also included in ode_default_options.","category":"page"},{"location":"tutorials/time_stepping/#CFL-based-step-size-control","page":"18 Explicit time stepping","title":"CFL-based step size control","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"The SciML ecosystem also provides time integration algorithms without adaptive time stepping on their own, such as CarpenterKennedy2N54. Moreover, you also can deactivate the automatic adaptivity of adaptive integration algorithms by passing adaptive=false in the solve function.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"These algorithms require another way of setting the step size. You have to pass dt=... in the solve function. Without other settings, the simulation uses this fixed time step.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"For hyperbolic PDEs, it is natural to use an adaptive CFL-based step size control. Here, the time step is proportional to a ratio of the local measure of mesh spacing Delta x_i for an element i and the maximum (local) wave speed lambda_max related to the largest-magnitude eigenvalue of the flux Jacobian of the hyperbolic system.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"Delta t_n = textCFL * min_i fracDelta x_ilambda_max(u_i^n)","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"We compute Delta x_i by scaling the element size by a factor of 1(N+1), cf. Gassner and Kopriva (2011), Section 5.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"Trixi.jl provides such a CFL-based step size control. It is implemented as the callback StepsizeCallback.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"stepsize_callback = StepsizeCallback(; cfl=1.0)","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"A suitable CFL number depends on many parameters such as the chosen grid, the integration algorithm and the polynomial degree of the spatial DG discretization. So, the optimal number for an example is mostly determined experimentally.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"You can add this CFL-based step size control to your simulation like any other callback.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"callbacks = CallbackSet(stepsize_callback)\nalg = CarpenterKennedy2N54(williamson_condition=false)\nsolve(ode, alg;\n dt=1.0 # solve needs some value here but it will be overwritten by the stepsize_callback\n callback=callbacks)","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"You can find simple examples with a CFL-based step size control for instance in the elixirs elixir_advection_basic.jl or elixir_euler_source_terms.jl.","category":"page"},{"location":"tutorials/time_stepping/#Package-versions","page":"18 Explicit time stepping","title":"Package versions","text":"","category":"section"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"","category":"page"},{"location":"tutorials/time_stepping/","page":"18 Explicit time stepping","title":"18 Explicit time stepping","text":"This page was generated using Literate.jl.","category":"page"},{"location":"contributing/#Contributing","page":"Contributing","title":"Contributing","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Trixi.jl is an open-source project and we are very happy to accept contributions from the community. Please feel free to open issues or submit patches (preferably as merge requests) any time. For planned larger contributions, it is often beneficial to get in contact with one of the principal developers first (see Authors).","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Trixi.jl and its contributions are licensed under the MIT license (see License). As a contributor, you certify that all your contributions are in conformance with the Developer Certificate of Origin (Version 1.1), which is reproduced below.","category":"page"},{"location":"contributing/#Developer-Certificate-of-Origin-(Version-1.1)","page":"Contributing","title":"Developer Certificate of Origin (Version 1.1)","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The following text was taken from https://developercertificate.org:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n1 Letterman Drive\nSuite D4700\nSan Francisco, CA, 94129\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\n\nDeveloper's Certificate of Origin 1.1\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n have the right to submit it under the open source license\n indicated in the file; or\n\n(b) The contribution is based upon previous work that, to the best\n of my knowledge, is covered under an appropriate open source\n license and I have the right under that license to submit that\n work with modifications, whether created in whole or in part\n by me, under the same open source license (unless I am\n permitted to submit under a different license), as indicated\n in the file; or\n\n(c) The contribution was provided directly to me by some other\n person who certified (a), (b) or (c) and I have not modified\n it.\n\n(d) I understand and agree that this project and the contribution\n are public and that a record of the contribution (including all\n personal information I submit with it, including my sign-off) is\n maintained indefinitely and may be redistributed consistent with\n this project or the open source license(s) involved.","category":"page"},{"location":"performance/#Performance","page":"Performance","title":"Performance","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"Trixi.jl is designed to balance performance and readability. Since Julia provides a lot of zero-cost abstractions, it is often possible to optimize both goals simultaneously.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"The usual development workflow in Julia is","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Make it work.\nMake it nice.\nMake it fast.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"To achieve the third step, you should be familiar with (at least) the section on performance tips in the Julia manual. Here, we just list some important aspects you should consider when developing Trixi.jl.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Consider using @views/view(...) when using array slices, except on the left-side of an assignment (further details).\nFunctions are essentially for free, since they are usually automatically inlined where it makes sense (using @inline can be used as an additional hint to the compiler) (further details).\nFunction barriers can improve performance due to type stability (further details).\nLook for type instabilities using @code_warntype. Consider using @descend from Cthulhu.jl to investigate deeper call chains.","category":"page"},{"location":"performance/#Manual-benchmarking","page":"Performance","title":"Manual benchmarking","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"If you modify some internal parts of Trixi.jl, you should check the impact on performance. Hence, you should at least investigate the performance roughly by comparing the reported timings of several elixirs. Deeper investigations and micro-benchmarks should usually use BenchmarkTools.jl. For example, the following steps were used to benchmark the changes introduced in PR #256.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"git checkout e7ebf3846b3fd62ee1d0042e130afb50d7fe8e48 (new version)\nStart julia --threads=1 --check-bounds=no.\nExecute the following code in the REPL to benchmark the rhs! call at the final state.\njulia> using BenchmarkTools, Revise; using Trixi\n\njulia> trixi_include(\"examples/2d/elixir_euler_sedov_blast_wave.jl\")\n\njulia> du_test = copy(sol.u[end]); u_test = copy(sol.u[end]);\n\njulia> @benchmark Trixi.rhs!(\n $(du_test),\n $(u_test),\n $(semi),\n $(sol.t[end]))\nBenchmarkTools.Trial:\n memory estimate: 10.48 KiB\n allocs estimate: 67\n --------------\n minimum time: 4.510 ms (0.00% GC)\n median time: 4.646 ms (0.00% GC)\n mean time: 4.699 ms (0.00% GC)\n maximum time: 7.183 ms (0.00% GC)\n --------------\n samples: 1065\n evals/sample: 1\n\nshell> git checkout 222241ff54f8a4ca9876cc1fc25ae262416a4ea0\n\njulia> trixi_include(\"examples/2d/elixir_euler_sedov_blast_wave.jl\")\n\njulia> @benchmark Trixi.rhs!(\n $(du_test),\n $(u_test),\n $(semi),\n $(sol.t[end]))\nBenchmarkTools.Trial:\n memory estimate: 10.36 KiB\n allocs estimate: 67\n --------------\n minimum time: 4.500 ms (0.00% GC)\n median time: 4.635 ms (0.00% GC)\n mean time: 4.676 ms (0.00% GC)\n maximum time: 5.880 ms (0.00% GC)\n --------------\n samples: 1070\n evals/sample: 1\nRun the @benchmark ... commands multiple times to see whether there are any significant fluctuations.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Follow these steps for both commits you want to compare. The relevant benchmark results you should typically be looking at are the median and mean values of the runtime and the memory/allocs estimate. In this example, the differences of the runtimes are of the order of the fluctuations one gets when running the benchmarks multiple times. Since the memory/allocs are (roughly) the same, there doesn't seem to be a significant performance regression here.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"You can also make it more detailed by benchmarking only, e.g., the calculation of the volume terms, but whether that's necessary depends on the modifications you made and their (potential) impact.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Some more detailed description of manual profiling and benchmarking as well as resulting performance improvements of Trixi.jl are given in the following blog posts.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Improving performance of AMR with p4est, cf. #638\nImproving performance of EC methods, cf. #643","category":"page"},{"location":"performance/#Automated-benchmarking","page":"Performance","title":"Automated benchmarking","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"We use PkgBenchmark.jl to provide a standard set of benchmarks for Trixi.jl. The relevant benchmark script is benchmark/benchmarks.jl. To benchmark the changes made in a PR, please proceed as follows:","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Check out the latest main branch of your Trixi.jl development repository.\nCheck out the latest development branch of your PR.\nChange your working directory to the benchmark directory of Trixi.jl.\nExecute julia run_benchmarks.jl.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"This will take some hours to complete and requires at least 8 GiB of RAM. When everything is finished, some output files will be created in the benchmark directory of Trixi.jl.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"warning: Warning\nPlease note that the benchmark scripts use --check-bounds=no at the moment. Thus, they will not work in any useful way for Julia v1.10 (and newer?), see Julia issue #50985.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"You can also run a standard set of benchmarks manually via","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"julia> using PkgBenchmark, Trixi\n\njulia> results = benchmarkpkg(Trixi, BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`))\n\njulia> export_markdown(pkgdir(Trixi, \"benchmark\", \"single_benchmark.md\"), results)","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"This will save a markdown file with a summary of the benchmark results similar to this example. Note that this will take quite some time. Additional options are described in the docs of PkgBenchmark.jl. A particularly useful option is to specify a BenchmarkConfig including Julia command line options affecting the performance such as disabling bounds-checking and setting the number of threads.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"A useful feature when developing Trixi.jl is to compare the performance of Trixi.jl's current state vs. the main branch. This can be achieved by executing","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"julia> using PkgBenchmark, Trixi\n\njulia> results = judge(Trixi,\n BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`), # target\n BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`, id=\"main\") # baseline\n )\n\njulia> export_markdown(pkgdir(Trixi, \"benchmark\", \"results.md\"), results)","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"By default, the target is the current state of the repository. Remember that you need to be in a clean state (commit or stash your changes) to run this successfully. You can also run this comparison and an additional one using two threads via","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"julia> include(\"benchmark/run_benchmarks.jl\")","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Then, markdown files including the results are saved in benchmark/. This example result was obtained using a GitHub action for the PR #535. Note that GitHub actions run on in the cloud in a virtual machine. Hence, we do not really have control over it and performance results must be taken with a grain of salt. Nevertheless, significant runtime differences and differences of memory allocations should be robust indicators of performance changes.","category":"page"},{"location":"performance/#Runtime-performance-vs.-latency-aka-using-@nospecialize-selectively","page":"Performance","title":"Runtime performance vs. latency aka using @nospecialize selectively","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"Usually, Julia will compile specialized versions of each method, using as much information from the types of function arguments as possible (based on some heuristics). The compiler will generate code that is as efficient as comparable code written in a low-level language such as C or Fortran. However, there are cases where the runtime performance does not really matter but the time needed to compile specializations becomes significant. This is related to latency or the time-to-first-plot problem, well-known in the Julia community. In such a case, it can be useful to remove some burden from the compiler by avoiding specialization on every possible argument types using the macro @nospecialize. A prime example of such a case is pretty printing of structs in the Julia REPL, see the associated PR for further discussions.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"As a rule of thumb:","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Do not use @nospecialize in performance-critical parts, in particular not for methods involved in computing Trixi.rhs!.\nConsider using @nospecialize for methods like custom implementations of Base.show.","category":"page"},{"location":"performance/#performance-metrics","page":"Performance","title":"Performance metrics of the AnalysisCallback","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"The AnalysisCallback computes two performance indicators that you can use to evaluate the serial and parallel performance of Trixi.jl. They represent measured run times that are normalized by the number of rhs! evaluations and the number of degrees of freedom of the problem setup. The normalization ensures that we can compare different measurements for each type of indicator independent of the number of time steps or mesh size. All indicators have in common that they are still in units of time, thus lower is better for each of them.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"Here, the term \"degrees of freedom\" (DOFs) refers to the number of independent state vectors that are used to represent the numerical solution. For example, if you use a DGSEM-type scheme in 2D on a mesh with 8 elements and with 5-by-5 Gauss-Lobatto nodes in each element (i.e., a polynomial degree of 4), the total number of DOFs would be","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"n_textDOFsDGSEM = textnumber of elements cdot textnumber of nodes per element = 8 cdot (5 cdot 5) = 200","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"In contrast, for a finite volume-type scheme on a mesh with 8 elements, the total number of DOFs would be (independent of the number of spatial dimensions)","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"n_textDOFsFV = textnumber of elements = 8","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"since for standard finite volume methods you store a single state vector in each element. Note that we specifically count the number of state vectors and not the number of state variables for the DOFs. That is, in the previous example n_textDOFsFV is equal to 8 independent of whether this is a compressible Euler setup with 5 state variables or a linear scalar advection setup with one state variable.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"For each indicator, the measurements are always since the last invocation of the AnalysisCallback. That is, if the analysis callback is called multiple times, the indicators are repeatedly computed and can thus also be used to track the performance over the course of a longer simulation, e.g., to analyze setups with varying performance characteristics. Note that the time spent in the AnalysisCallback itself is always excluded, i.e., the performance measurements are not distorted by potentially expensive solution analysis computations. All other parts of a Trixi.jl simulation are included, however, thus make sure that you disable everything you do not want to be measured (such as I/O callbacks, visualization etc.).","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"note: Performance indicators and adaptive mesh refinement\nCurrently it is not possible to compute meaningful performance indicators for a simulation with arbitrary adaptive mesh refinement, since this would require to explicitly keep track of the number of DOF updates due to the mesh size changing repeatedly. The only way to do this at the moment is by setting the analysis interval to the same value as the AMR interval.","category":"page"},{"location":"performance/#Local,-rhs!-only-indicator","page":"Performance","title":"Local, rhs!-only indicator","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"The local, rhs!-only indicator is computed as","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"texttimeDOFrhs = fract_texttextttrhsn_textDOFslocal cdot n_textcallstextttrhs","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"where t_texttextttrhs is the accumulated time spent in rhs!, n_textDOFslocal is the local number of DOFs (i.e., on the current MPI rank; if doing a serial run, you can just think of this as the number of DOFs), and n_textcallstextttrhs is the number of times the rhs! function has been evaluated. Note that for this indicator, we measure only the time spent in rhs!, i.e., by definition all computations outside of rhs! - specifically all other callbacks and the time integration method - are not taken into account.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"The local, rhs!-only indicator is usually most useful if you do serial measurements and are interested in the performance of the implementation of your core numerical methods (e.g., when doing performance tuning).","category":"page"},{"location":"performance/#Performance-index-(PID)","page":"Performance","title":"Performance index (PID)","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"The performance index (PID) is computed as","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"textPID = fract_textwall cdot n_textranksMPIn_textDOFsglobal cdot n_textcallstextttrhs","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"where t_textwall is the walltime since the last call to the AnalysisCallback, n_textranksMPI is the number of MPI ranks used, n_textDOFsglobal is the global number of DOFs (i.e., the sum of DOFs over all MPI ranks; if doing a serial run, you can just think of this as the number of DOFs), and n_textcallstextttrhs is the number of times the rhs! function has been evaluated since the last call to the AnalysisCallback. The PID measures everything except the time spent in the AnalysisCallback itself - specifically, all other callbacks and the time integration method itself are included.","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"The PID is usually most useful if you would like to compare the parallel performance of your code to its serial performance. Specifically, it allows you to evaluate the parallelization overhead of your code by giving you a measure of the resources that are necessary to solve a given simulation setup. In a sense, it mimics the \"core hours\" metric that is often used by supercomputer centers to measure how many resources a particular compute job requires. It can thus be seen as a proxy for \"energy used\" and, as an extension, \"monetary cost\".","category":"page"},{"location":"performance/","page":"Performance","title":"Performance","text":"note: Initialization overhead in measurements\nWhen using one of the integration schemes from OrdinaryDiffEq.jl, their implementation will initialize some OrdinaryDiffEq.jl-specific information during the first time step. Among other things, one additional call to rhs! is performed. Therefore, make sure that for performance measurements using the PID either the number of timesteps or the workload per rhs! call is large enough to make the initialization overhead negligible. Note that the extra call to rhs! is properly accounted for in both the number of calls and the measured time, so you do not need to worry about it being expensive. If you want a perfect timing result, you need to set the analysis interval such that the AnalysisCallback is invoked at least once during the course of the simulation and discard the first PID value.","category":"page"},{"location":"performance/#Performance-issues-with-multi-threaded-reductions","page":"Performance","title":"Performance issues with multi-threaded reductions","text":"","category":"section"},{"location":"performance/","page":"Performance","title":"Performance","text":"False sharing is a known performance issue for systems with distributed caches. It also occurred for the implementation of a thread parallel bounds checking routine for the subcell IDP limiting in PR #1736. After some testing and discussion, it turned out that initializing a vector of length n * Threads.nthreads() and only using every n-th entry instead of a vector of length Threads.nthreads() fixes the problem. Since there are no processors with caches over 128B, we use n = 128B / size(uEltype). Now, the bounds checking routine of the IDP limiting scales as hoped.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"EditURL = \"../../literate/src/files/custom_semidiscretization.jl\"","category":"page"},{"location":"tutorials/custom_semidiscretization/#custom_semidiscretization","page":"20 Custom semidiscretizations","title":"20: Custom semidiscretizations","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"As described in the overview section, semidiscretizations are high-level descriptions of spatial discretizations in Trixi.jl. Trixi.jl's main focus is on hyperbolic conservation laws represented in a SemidiscretizationHyperbolic. Hyperbolic-parabolic problems based on the advection-diffusion equation or the compressible Navier-Stokes equations can be represented in a SemidiscretizationHyperbolicParabolic. This is described in the basic tutorial on parabolic terms and its extension to custom parabolic terms. In this tutorial, we will describe how these semidiscretizations work and how they can be used to create custom semidiscretizations involving also other tasks.","category":"page"},{"location":"tutorials/custom_semidiscretization/#Overview-of-the-right-hand-side-evaluation","page":"20 Custom semidiscretizations","title":"Overview of the right-hand side evaluation","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"The semidiscretizations provided by Trixi.jl are set up to create ODEProblems from the SciML ecosystem for ordinary differential equations. In particular, a spatial semidiscretization can be wrapped in an ODE problem using semidiscretize, which returns an ODEProblem. This ODEProblem bundles an initial condition, a right-hand side (RHS) function, the time span, and possible parameters. The ODEProblems created by Trixi.jl use the semidiscretization passed to semidiscretize as a parameter. For a SemidiscretizationHyperbolic, the ODEProblem wraps Trixi.rhs! as ODE RHS. For a SemidiscretizationHyperbolicParabolic, Trixi.jl uses a SplitODEProblem combining Trixi.rhs_parabolic! for the (potentially) stiff part and Trixi.rhs! for the other part.","category":"page"},{"location":"tutorials/custom_semidiscretization/#Standard-Trixi.jl-setup","page":"20 Custom semidiscretizations","title":"Standard Trixi.jl setup","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"In this tutorial, we will consider the linear advection equation with source term","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"partial_t u(tx) + partial_x u(tx) = -exp(-t) sinbigl(pi (x - t) bigr)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"with periodic boundary conditions in the domain [-1, 1] as a model problem. The initial condition is","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"u(0x) = sin(pi x)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"The source term results in some damping and the analytical solution","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"u(tx) = exp(-t) sinbigl(pi (x - t) bigr)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"First, we discretize this equation using the standard functionality of Trixi.jl.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"using Trixi, OrdinaryDiffEq, Plots","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"The linear scalar advection equation is already implemented in Trixi.jl as LinearScalarAdvectionEquation1D. We construct it with an advection velocity 1.0.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"equations = LinearScalarAdvectionEquation1D(1.0)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Next, we use a standard DGSEM solver.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"solver = DGSEM(polydeg = 3)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"We create a simple TreeMesh in 1D.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"coordinates_min = (-1.0,)\ncoordinates_max = (+1.0,)\nmesh = TreeMesh(coordinates_min, coordinates_max;\n initial_refinement_level = 4,\n n_cells_max = 10^4,\n periodicity = true)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"We wrap everything in in a semidiscretization and pass the source terms as a standard Julia function. Please note that Trixi.jl uses SVectors from StaticArrays.jl to store the conserved variables u. Thus, the return value of the source terms must be wrapped in an SVector - even if we consider just a scalar problem.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"function initial_condition(x, t, equations)\n return SVector(exp(-t) * sinpi(x[1] - t))\nend\n\nfunction source_terms_standard(u, x, t, equations)\n return -initial_condition(x, t, equations)\nend\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition,\n solver;\n source_terms = source_terms_standard)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Now, we can create the ODEProblem, solve the resulting ODE using a time integration method from OrdinaryDiffEq.jl, and visualize the numerical solution at the final time using Plots.jl.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"tspan = (0.0, 3.0)\node = semidiscretize(semi, tspan)\n\nsol = solve(ode, RDPK3SpFSAL49(); ode_default_options()...)\n\nplot(sol; label = \"numerical sol.\", legend = :topright)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"We can also plot the analytical solution for comparison. Since Trixi.jl uses SVectors for the variables, we take their first (and only) component to get the scalar value for manual plotting.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"let\n x = range(-1.0, 1.0; length = 200)\n plot!(x, first.(initial_condition.(x, sol.t[end], equations)),\n label = \"analytical sol.\", linestyle = :dash, legend = :topright)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"We can also add the initial condition to the plot.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"plot!(sol.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"You can of course also use some callbacks provided by Trixi.jl as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"summary_callback = SummaryCallback()\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi; interval = analysis_interval)\nalive_callback = AliveCallback(; analysis_interval)\ncallbacks = CallbackSet(summary_callback,\n analysis_callback,\n alive_callback)\n\nsol = solve(ode, RDPK3SpFSAL49();\n ode_default_options()..., callback = callbacks)\nsummary_callback()","category":"page"},{"location":"tutorials/custom_semidiscretization/#Using-a-custom-ODE-right-hand-side-function","page":"20 Custom semidiscretizations","title":"Using a custom ODE right-hand side function","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Next, we will solve the same problem but use our own ODE RHS function. To demonstrate this, we will artificially create a global variable containing the current time of the simulation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"const GLOBAL_TIME = Ref(0.0)\n\nfunction source_terms_custom(u, x, t, equations)\n t = GLOBAL_TIME[]\n return -initial_condition(x, t, equations)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Next, we create our own RHS function to update the global time of the simulation before calling the RHS function from Trixi.jl.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"function rhs_source_custom!(du_ode, u_ode, semi, t)\n GLOBAL_TIME[] = t\n Trixi.rhs!(du_ode, u_ode, semi, t)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Next, we create an ODEProblem manually copying over the data from the one we got from semidiscretize earlier.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"ode_source_custom = ODEProblem(rhs_source_custom!,\n ode.u0,\n ode.tspan,\n ode.p #= semi =#)\nsol_source_custom = solve(ode_source_custom, RDPK3SpFSAL49();\n ode_default_options()...)\n\nplot(sol_source_custom; label = \"numerical sol.\")\nlet\n x = range(-1.0, 1.0; length = 200)\n plot!(x, first.(initial_condition.(x, sol_source_custom.t[end], equations)),\n label = \"analytical sol.\", linestyle = :dash, legend = :topleft)\nend\nplot!(sol_source_custom.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"This also works with callbacks as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"summary_callback = SummaryCallback()\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi; interval = analysis_interval)\nalive_callback = AliveCallback(; analysis_interval)\ncallbacks = CallbackSet(summary_callback,\n analysis_callback,\n alive_callback)\n\nsol = solve(ode_source_custom, RDPK3SpFSAL49();\n ode_default_options()..., callback = callbacks)\nsummary_callback()","category":"page"},{"location":"tutorials/custom_semidiscretization/#Setting-up-a-custom-semidiscretization","page":"20 Custom semidiscretizations","title":"Setting up a custom semidiscretization","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Using a global constant is of course not really nice from a software engineering point of view. Thus, it can often be useful to collect additional data in the parameters of the ODEProblem. Thus, it is time to create our own semidiscretization. Here, we create a small wrapper of a standard semidiscretization of Trixi.jl and the current global time of the simulation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"struct CustomSemidiscretization{Semi, T} <: Trixi.AbstractSemidiscretization\n semi::Semi\n t::T\nend\n\nsemi_custom = CustomSemidiscretization(semi, Ref(0.0))","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"To get pretty printing in the REPL, you can consider specializing","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Base.show(io::IO, parameters::CustomSemidiscretization)\nBase.show(io::IO, ::MIME\"text/plain\", parameters::CustomSemidiscretization)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"for your custom semidiscretiation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Next, we create our own source terms that use the global time stored in the custom semidiscretiation.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"source_terms_custom_semi = let semi_custom = semi_custom\n function source_terms_custom_semi(u, x, t, equations)\n t = semi_custom.t[]\n return -initial_condition(x, t, equations)\n end\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"We also create a custom ODE RHS to update the current global time stored in the custom semidiscretization. We unpack the standard semidiscretization created by Trixi.jl and pass it to Trixi.rhs!.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"function rhs_semi_custom!(du_ode, u_ode, semi_custom, t)\n semi_custom.t[] = t\n Trixi.rhs!(du_ode, u_ode, semi_custom.semi, t)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Finally, we set up an ODEProblem and solve it numerically.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"ode_semi_custom = ODEProblem(rhs_semi_custom!,\n ode.u0,\n ode.tspan,\n semi_custom)\nsol_semi_custom = solve(ode_semi_custom, RDPK3SpFSAL49();\n ode_default_options()...)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"If we want to make use of additional functionality provided by Trixi.jl, e.g., for plotting, we need to implement a few additional specializations. In this case, we forward everything to the standard semidiscretization provided by Trixi.jl wrapped in our custom semidiscretization.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Base.ndims(semi::CustomSemidiscretization) = ndims(semi.semi)\nfunction Trixi.mesh_equations_solver_cache(semi::CustomSemidiscretization)\n Trixi.mesh_equations_solver_cache(semi.semi)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Now, we can plot the numerical solution as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"plot(sol_semi_custom; label = \"numerical sol.\")\nlet\n x = range(-1.0, 1.0; length = 200)\n plot!(x, first.(initial_condition.(x, sol_semi_custom.t[end], equations)),\n label = \"analytical sol.\", linestyle = :dash, legend = :topleft)\nend\nplot!(sol_semi_custom.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"This also works with many callbacks as usual. However, the AnalysisCallback requires some special handling since it makes use of a performance counter contained in the standard semidiscretizations of Trixi.jl to report some performance metrics. Here, we forward all accesses to the performance counter to the wrapped semidiscretization.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"function Base.getproperty(semi::CustomSemidiscretization, s::Symbol)\n if s === :performance_counter\n wrapped_semi = getfield(semi, :semi)\n wrapped_semi.performance_counter\n else\n getfield(semi, s)\n end\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Moreover, the AnalysisCallback also performs some error calculations. We also need to forward them to the wrapped semidiscretization.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"function Trixi.calc_error_norms(func, u, t, analyzer,\n semi::CustomSemidiscretization,\n cache_analysis)\n Trixi.calc_error_norms(func, u, t, analyzer,\n semi.semi,\n cache_analysis)\nend","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"Now, we can work with the callbacks used before as usual.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"summary_callback = SummaryCallback()\nanalysis_interval = 100\nanalysis_callback = AnalysisCallback(semi_custom;\n interval = analysis_interval)\nalive_callback = AliveCallback(; analysis_interval)\ncallbacks = CallbackSet(summary_callback,\n analysis_callback,\n alive_callback)\n\nsol = solve(ode_semi_custom, RDPK3SpFSAL49();\n ode_default_options()..., callback = callbacks)\nsummary_callback()","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"For even more advanced usage of custom semidiscretizations, you may look at the source code of the ones contained in Trixi.jl, e.g.,","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"SemidiscretizationHyperbolicParabolic\nSemidiscretizationEulerGravity\nSemidiscretizationEulerAcoustics\nSemidiscretizationCoupled","category":"page"},{"location":"tutorials/custom_semidiscretization/#Package-versions","page":"20 Custom semidiscretizations","title":"Package versions","text":"","category":"section"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"","category":"page"},{"location":"tutorials/custom_semidiscretization/","page":"20 Custom semidiscretizations","title":"20 Custom semidiscretizations","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"EditURL = \"../../literate/src/files/DGSEM_FluxDiff.jl\"","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#DGSEM_FluxDiff","page":"4 DGSEM with flux differencing","title":"4: DGSEM with flux differencing","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"This tutorial starts with a presentation of the weak formulation of the discontinuous Galerkin spectral element method (DGSEM) in order to fix the notation of the used operators. Then, the DGSEM formulation with flux differencing (split form DGSEM) and its implementation in Trixi.jl is shown.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We start with the one-dimensional conservation law","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"u_t + f(u)_x = 0 qquad tin mathbbR^+ xinOmega","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"with the physical flux f.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We split the domain Omega into elements K with center x_K and size Delta x. With the transformation mapping x(xi)=x_K + fracDelta x2 xi we can transform the reference element -11 to every physical element. So, the equation can be restricted to the reference element using the determinant of the Jacobian matrix of the transformation mapping J=fracpartial xpartial xi=fracDelta x2.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"J u_t + f(u)_xi = 0 qquad tin mathbbR^+ xiin -11","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#The-weak-form-of-the-DGSEM","page":"4 DGSEM with flux differencing","title":"The weak form of the DGSEM","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We consider the so-called discontinuous Galerkin spectral element method (DGSEM) with collocation. It results from choosing a nodal DG ansatz using N+1 Gauss-Lobatto nodes xi_i in -11 with matching interpolation weights w_i, which are used for numerical integration and interpolation with the Lagrange polynomial basis l_i of degree N. The Lagrange functions are created with those nodes and hence fulfil a Kronecker property at the GL nodes. The weak formulation of the DGSEM for one element is","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"J underlinedotu(t) = - M^-1 B underlinef^* + M^-1 D^T M underlinef","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"where underlineu=(u_0 u_1 dots u_N)^TinmathbbR^N+1 is the collected pointwise evaluation of u at the discretization nodes and dotu = partial u partial t = u_t is the temporal derivative. The nodal values of the flux function f results with collocation in underlinef, since underlinef_j=f(underlineu_j). Moreover, we got the numerical flux f^*=f^*(u^- u^+).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We will now have a short overview over the operators we used.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"The derivative matrix DinmathbbR^(N+1)times (N+1) mimics a spatial derivation on a discrete level with underlinef_x approx D underlinef. It is defined by D_ij = l_j(xi_i).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"The diagonal mass matrix M is defined by M_ij=langle l_j l_irangle_N with the numerical scalar product langle cdot cdotrangle_N defined for functions f and g by","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"langle f grangle_N = int_-1 N^1 f(xi) g(xi) dxi = sum_k=0^N f(xi_k) g(xi_k) w_k","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"The multiplication by M matches a discrete integration","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":" int_-1^1 f(xi) underlinel(xi) dxi approx M underlinef","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"The boundary matrix B=textdiag(-1 0 0 1) represents an evaluation of a function at the boundaries xi_0=-1 and xi_N=1.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"For these operators the following property holds:","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":" M D + (M D)^T = B","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"This is called the summation-by-parts (SBP) property since it mimics integration by parts on a discrete level (Gassner (2013)).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"The explicit definitions of the operators and the construction of the 1D algorithm can be found for instance in the tutorial introduction to DG methods or in more detail in Kopriva (2009).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"This property shows the equivalence between the weak form and the following strong formulation of the DGSEM.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"beginalign*\nJ underlinedotu(t)\n= - M^-1 B underlinef^* + M^-1 D^T M underlinef5pt\n= - M^-1 B underlinef^* + M^-1 (B - MD) underlinef5pt\n= - M^-1 B (underlinef^* - underlinef) - D underlinef\nendalign*","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"More information about the equivalence you can find in Kopriva, Gassner (2010).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#DGSEM-with-flux-differencing","page":"4 DGSEM with flux differencing","title":"DGSEM with flux differencing","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"When using the diagonal SBP property it is possible to rewrite the application of the derivative operator D in the calculation of the volume integral into a subcell based finite volume type differencing formulation (Fisher, Carpenter (2013)). Generalizing","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"(D underlinef)_i = sum_j D_ij underlinef_j\n= 2sum_j frac12 D_ij (underlinef_j + underlinef_i)\neqqcolon 2sum_j D_ij f_textcentral(u_i u_j)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"we replace D underlinef in the strong form by 2D underlinef_vol(u^- u^+) with the consistent two-point volume flux f_vol and receive the DGSEM formulation with flux differencing (split form DGSEM) (Gassner, Winters, Kopriva (2016)).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"beginalign*\nJ underlinedotu(t) = - M^-1 B (underlinef^* - underlinef) - 2D underlinef_vol(u^- u^+)5pt\n= - M^-1 B (underlinef^* - underlinef_vol(underlineu underlineu)) - 2D underlinef_vol(u^- u^+)5pt\n= - M^-1 B underlinef_surface^* - (2D - M^-1 B) underlinef_vol5pt\n= - M^-1 B underlinef_surface^* - D_split underlinef_vol\nendalign*","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"This formulation is in a weak form type formulation and can be implemented by using the derivative split matrix D_split=(2D-M^-1B) and two different fluxes. We divide between the surface flux f=f_surface used for the numerical flux f_surface^* and the already mentioned volume flux f_vol especially for this formulation.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"This formulation creates a more stable version of DGSEM, because it fulfils entropy stability. Moreover it allows the construction of entropy conserving discretizations without relying on exact integration. This is achieved when using a two-point entropy conserving flux function as volume flux in the volume flux differencing formulation. Then, the numerical surface flux can be used to control the dissipation of the discretization and to guarantee decreasing entropy, i.e. entropy stability.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#fluxDiffExample","page":"4 DGSEM with flux differencing","title":"Implementation in Trixi.jl","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"Now, we have a look at the implementation of DGSEM with flux differencing with Trixi.jl.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"using OrdinaryDiffEq, Trixi","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We implement a simulation for the compressible Euler equations in 2D","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"partial_t beginpmatrix rho rho v_1 rho v_2 rho e endpmatrix\n+ partial_x beginpmatrix rho v_1 rho v_1^2 + p rho v_1 v_2 (rho e +p) v_1 endpmatrix\n+ partial_y beginpmatrix rho v_2 rho v_1 v_2 rho v_2^2 + p (rho e +p) v_2 endpmatrix\n= beginpmatrix 0 0 0 0 endpmatrix","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"for an ideal gas with ratio of specific heats gamma=14. Here, rho is the density, v_1, v_2 the velocities, e the specific total energy and","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"p = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2) right)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"the pressure.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"gamma = 1.4\nequations = CompressibleEulerEquations2D(gamma)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"As our initial condition we will use a weak blast wave from Hennemann, Gassner (2020). The primitive variables are defined by","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"beginpmatrix rho v_1 v_2 p endpmatrix\n= beginpmatrix 10 00 00 10 endpmatrix textif x_2 05\ntextand beginpmatrix rho v_1 v_2 p endpmatrix\n= beginpmatrix 11691 01882 * cos(phi) 01882 * sin(phi) 1245 endpmatrix textelse","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"with phi = tan^-1(fracx_2x_1).","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"This initial condition is implemented in Trixi.jl under the name initial_condition_weak_blast_wave.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"initial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"In Trixi.jl, flux differencing for the volume integral can be implemented with VolumeIntegralFluxDifferencing using symmetric two-point volume fluxes. First, we set up a simulation with the entropy conserving and kinetic energy preserving flux flux_ranocha by Hendrik Ranocha (2018) as surface and volume flux.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We will confirm the entropy conservation property numerically.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"volume_flux = flux_ranocha # = f_vol\nsolver = DGSEM(polydeg=3, surface_flux=volume_flux,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"Now, we implement Trixi.jl's mesh, semi and ode in a simple framework. For more information please have a look at the documentation, the basic tutorial introduction to DG methods or some basic elixirs.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"coordinates_min = (-2.0, -2.0)\ncoordinates_max = ( 2.0, 2.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=5,\n n_cells_max=10_000,\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_condition_periodic)\n\n# ODE solvers\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"To analyse the entropy conservation of the approximation, we will use the analysis calllback implemented in Trixi. It provides some information about the approximation including the entropy change.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"analysis_callback = AnalysisCallback(semi, interval=100);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We now run the simulation using flux_ranocha for both surface and volume flux.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=analysis_callback);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"A look at the change in entropy sum partial Spartial U cdot U_t in the analysis callback confirms that the flux is entropy conserving since the change is about machine precision.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We can plot the approximated solution at the time t=0.4.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"Now, we can use for instance the dissipative flux flux_lax_friedrichs as surface flux to get an entropy stable method.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"using OrdinaryDiffEq, Trixi\n\ngamma = 1.4\nequations = CompressibleEulerEquations2D(gamma)\n\ninitial_condition = initial_condition_weak_blast_wave\n\nvolume_flux = flux_ranocha # = f_vol\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\ncoordinates_min = (-2.0, -2.0)\ncoordinates_max = ( 2.0, 2.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=5,\n n_cells_max=10_000,\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_condition_periodic)\n\n# ODE solvers\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan);\n\nanalysis_callback = AnalysisCallback(semi, interval=100);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"We now run the simulation using the volume flux flux_ranocha and surface flux flux_lax_friedrichs.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=analysis_callback);\nnothing #hide","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"The change in entropy confirms the expected entropy stability.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"Of course, you can use more than these two fluxes in Trixi. Here, we will give a short list of possible fluxes for the compressible Euler equations. For the volume flux Trixi.jl provides for example flux_ranocha, flux_shima_etal, flux_chandrashekar, flux_kennedy_gruber. As surface flux you can use all volume fluxes and additionally for instance flux_lax_friedrichs, flux_hll, flux_hllc.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/#Package-versions","page":"4 DGSEM with flux differencing","title":"Package versions","text":"","category":"section"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"","category":"page"},{"location":"tutorials/DGSEM_FluxDiff/","page":"4 DGSEM with flux differencing","title":"4 DGSEM with flux differencing","text":"This page was generated using Literate.jl.","category":"page"},{"location":"multi-physics_coupling/#multi-physics-coupling","page":"Coupling","title":"Multi-physics coupling","text":"","category":"section"},{"location":"multi-physics_coupling/","page":"Coupling","title":"Coupling","text":"A complex simulation can consist of different spatial domains in which different equations are being solved, different numerical methods being used or the grid structure is different. One example would be a fluid in a tank and an extended hot plate attached to it. We would then like to solve the Navier-Stokes equations in the fluid domain and the heat conduction equations in the plate. The coupling would happen at the interface through the exchange of thermal energy.","category":"page"},{"location":"multi-physics_coupling/#Converter-coupling","page":"Coupling","title":"Converter coupling","text":"","category":"section"},{"location":"multi-physics_coupling/","page":"Coupling","title":"Coupling","text":"It may happen that the two systems to be coupled do not share any variables, but share some of the physics. In such a situation, the same physics is just represented in a different form and with a different set of variables. This is the case, for instance assuming two domains, if there is a fluid system in one domain and a Vlasov system in the other domain. In that case we would have variables representing distribution functions of the Vlasov system on one side and variables representing the mechanical quantities, like density, of the fluid system. To translate the fields from one description to the other one needs to use converter functions. These functions need to be hand tailored by the user in the elixir file where each pair of coupled systems requires two coupling functions, one for each direction.","category":"page"},{"location":"multi-physics_coupling/","page":"Coupling","title":"Coupling","text":"In the general case, we have a system A with m variables u_Ai i = 1 dots m and another system B with n variables u_Bj j = 1 dots n. We then define two coupling functions, one that transforms u_A into u_B and one that goes the other way.","category":"page"},{"location":"multi-physics_coupling/","page":"Coupling","title":"Coupling","text":"In their minimal form they take the position vector x, state vector u and the equations of the two coupled systems and return the transformed variables. By passing the equations we can make use of their parameters, if they are required. Examples can be seen in examples/structured_2d_dgsem/elixir_advection_coupled.jl.","category":"page"},{"location":"multi-physics_coupling/#Warning-about-binary-compatibility","page":"Coupling","title":"Warning about binary compatibility","text":"","category":"section"},{"location":"multi-physics_coupling/","page":"Coupling","title":"Coupling","text":"Currently the coordinate values on the nodes can differ by machine precision when simulating the mesh and when splitting the mesh in multiple domains. This is an issue coming from the coordinate interpolation on the nodes. As a result, running a simulation in a single system and in two coupled domains may result in a difference of the order of the machine precision. While this is not an issue for most practical problems, it is best to keep this in mind when comparing test runs.","category":"page"},{"location":"meshes/dgmulti_mesh/#DGMulti","page":"DGMulti mesh","title":"Unstructured meshes and the DGMulti solver","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Trixi.jl includes support for simplicial and tensor product meshes via the DGMulti solver type, which is based on the StartUpDG.jl package. DGMulti solvers also provide support for quadrilateral and hexahedral meshes, though this feature is currently restricted to Cartesian grids. On these line/quad/hex meshes, the DGMulti solver also allows to use all (finite domain) SBP derivative operators provided by SummationByPartsOperators.jl, including several finite difference SBP methods.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"We make a few simplifying assumptions about supported meshes:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"meshes consist of a single type of element\nmeshes are conforming (e.g., each face of an element is shared with at most one other element).\nthe geometric mapping from reference to physical elements is polynomial (currently, only affine mappings are supported).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"StartUpDG.jl includes both simple uniform meshes via uniform_mesh, as well as support for triangular meshes constructed using Triangulate.jl, a wrapper around Jonathan Shewchuk's Triangle package.","category":"page"},{"location":"meshes/dgmulti_mesh/#The-DGMulti-solver-type","page":"DGMulti mesh","title":"The DGMulti solver type","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Trixi.jl solvers on simplicial meshes use the DGMulti solver type, which allows users to specify element_type and approximation_type in addition to polydeg, surface_flux, surface_integral, and volume_integral.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"DGMulti(; polydeg::Integer,\n element_type::AbstractElemShape,\n approximation_type=Polynomial(),\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n RefElemData_kwargs...)","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Here, element_type can be Tri(), Quad(), Tet(), or Hex(), and approximation_type can be","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Polynomial(), which specifies a DG discretization using a polynomial basis using quadrature rules which are exact for degree 2 * polydeg integrands, or\nSBP(), which specifies a DG discretization using multi-dimensional SBP operators. Types of SBP discretizations available include: SBP{Kubatko{LobattoFaceNodes}}() (the default choice), SBP{Kubatko{LegendreFaceNodes}}(), and SBP{Hicken}(). For polydeg = 1, ..., 4, the SBP{Kubatko{LegendreFaceNodes}}() SBP nodes are identical to the SBP nodes of Chen and Shu. More detailed descriptions of each SBP node set can be found in the StartUpDG.jl docs. Trixi.jl will also specialize certain parts of the solver based on the SBP approximation type.\na (periodic or non-periodic) derivative operator from SummationByPartsOperators.jl, usually constructed as D = derivative_operator(...). In this case, you do not need to pass a polydeg. Periodic derivative operators will only work with single-element meshes constructed using DGMultiMesh.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Additional options can also be specified through RefElemData_kwargs:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"quad_rule_vol = quad_nodes(Tri(), Nq) will substitute in a volume quadrature rule of degree Nq instead of the default (which is a quadrature rule of degree polydeg). Here, a degree Nq rule will be exact for at least degree 2*Nq integrands (such that the mass matrix is integrated exactly). Quadrature rules of which exactly integrate degree Nq integrands may also be specified (for example, quad_rule_vol = StartUpDG.quad_nodes_tri(Nq) on triangles).\nquad_rule_face = quad_nodes(Line(), Nq)) will use a face quadrature rule of degree Nq rather than the default. This rule is also exact for at least degree 2*Nq integrands.","category":"page"},{"location":"meshes/dgmulti_mesh/#The-GaussSBP()-approximation-type-on-Quad()-and-Hex()-meshes","page":"DGMulti mesh","title":"The GaussSBP() approximation type on Quad() and Hex() meshes","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"When using VolumeIntegralFluxDifferencing on Quad() and Hex() meshes, one can also specify approximation_type = GaussSBP() to use an entropy stable Gauss collocation scheme. Here, GaussSBP() refers to \"generalized\" summation-by-parts operators (see for example Ranocha 2018 or Fernandez and Zingg 2015).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Unlike traditional SBP operators, generalized SBP operators are constructed from nodes which do not include boundary nodes (i.e., Gauss quadrature nodes as opposed to Gauss-Lobatto quadrature nodes). This makes the computation of interface fluxes slightly more expensive, but also usually results in a more accurate solution. Roughly speaking, an entropy stable Gauss collocation scheme will yield results similar to a modal entropy stable scheme using a Polynomial() approximation type, but will be more efficient at high orders of approximation.","category":"page"},{"location":"meshes/dgmulti_mesh/#Trixi.jl-elixirs-on-simplicial-and-tensor-product-element-meshes","page":"DGMulti mesh","title":"Trixi.jl elixirs on simplicial and tensor product element meshes","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Example elixirs with triangular, quadrilateral, and tetrahedral meshes can be found in the examples/dgmulti_2d/ and examples/dgmulti_3d/ folders. Some key elixirs to look at:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"examples/dgmulti_2d/elixir_euler_weakform.jl: basic weak form DG discretization on a uniform triangular mesh. Changing element_type = Quad() or approximation_type = SBP() will switch to a quadrilateral mesh or an SBP-type discretization. Changing surface_integral = SurfaceIntegralWeakForm(flux_ec) and volume_integral = VolumeIntegralFluxDifferencing(flux_ec) for some entropy conservative flux (e.g., flux_chandrashekar or flux_ranocha) will switch to an entropy conservative formulation.\nexamples/dgmulti_2d/elixir_euler_triangulate_pkg_mesh.jl: uses an unstructured mesh generated by Triangulate.jl.\nexamples/dgmulti_3d/elixir_euler_weakform.jl: ´basic weak form DG discretization on a uniform tetrahedral mesh. Changing element_type = Hex() will switch to a hexahedral mesh. Changing surface_integral = SurfaceIntegralWeakForm(flux_ec) and volume_integral = VolumeIntegralFluxDifferencing(flux_ec) for some entropy conservative flux (e.g., flux_chandrashekar or flux_ranocha) will switch to an entropy conservative formulation.","category":"page"},{"location":"meshes/dgmulti_mesh/#For-developers","page":"DGMulti mesh","title":"For developers","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/#DGMultiMesh-wrapper-type","page":"DGMulti mesh","title":"DGMultiMesh wrapper type","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"DGMulti meshes in Trixi.jl are represented using a DGMultiMesh{NDIMS, ...} type. This mesh type is assumed to have fields md::MeshData, which contains geometric terms derived from the mapping between the reference and physical elements, and boundary_faces, which contains a Dict of boundary segment names (symbols) and list of faces which lie on that boundary segment.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"A DGMultiMesh can be constructed in several ways. For example, DGMultiMesh(dg::DGMulti) will return a Cartesian mesh on -1 1^d with element types specified by dg. DGMulti meshes can also be constructed by specifying a list of vertex coordinates vertex_coordinates_x, vertex_coordinates_y, vertex_coordinates_z and a connectivity matrix EToV where EToV[e,:] gives the vertices which correspond to element e. These quantities are available from most unstructured mesh generators.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Initial support for curved DGMultiMeshes is available for flux differencing solvers using SBP and GaussSBP approximation types on quadrilateral and hexahedral meshes. These can be called by specifying mesh = DGMultiMesh(dg, cells_per_dimension, mapping), where mapping is a function which specifies the warping of the mesh (e.g., mapping(xi, eta) = SVector{2}(xi, eta) is the identity mapping) similar to the mapping argument used by StructuredMesh.","category":"page"},{"location":"meshes/dgmulti_mesh/#Variable-naming-conventions","page":"DGMulti mesh","title":"Variable naming conventions","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"We use the convention that coordinates on the reference element are r in 1D, r s in 2D, or r s t in 3D. Physical coordinates use the standard conventions x (1D), x y (2D), and x y z (3D).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"(Image: \"Ref-to-physical mapping\")","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Derivatives of reference coordinates with respect to physical coordinates are abbreviated, e.g., fracpartial rpartial x = r_x. Additionally, J is used to denote the determinant of the Jacobian of the reference-to-physical mapping.","category":"page"},{"location":"meshes/dgmulti_mesh/#Variable-meanings-and-conventions-in-StartUpDG.jl","page":"DGMulti mesh","title":"Variable meanings and conventions in StartUpDG.jl","text":"","category":"section"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"StartUpDG.jl exports structs RefElemData{NDIMS, ElemShape, ...} (which contains data associated with the reference element, such as interpolation points, quadrature rules, face nodes, normals, and differentiation/interpolation/projection matrices) and MeshData{NDIMS} (which contains geometric data associated with a mesh). These are currently used for evaluating DG formulations in a matrix-free fashion. These structs contain fields similar (but not identical) to those in Globals1D, Globals2D, Globals3D in the Matlab codes from \"Nodal Discontinuous Galerkin Methods\" by Hesthaven and Warburton (2007).","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"In general, we use the following code conventions:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"variables such as r, s,... and x, y,... correspond to values at nodal interpolation points.\nvariables ending in q (e.g., rq, sq,... and xq, yq,...) correspond to values at volume quadrature points.\nvariables ending in f (e.g., rf, sf,... and xf, yf,...) correspond to values at face quadrature points.\nvariables ending in p (e.g., rp, sp,...) correspond to \"plotting\" points, which are usually a fine grid of equispaced points.\nV matrices correspond to interpolation matrices from nodal interpolation points, e.g., Vq interpolates to volume quadrature points, Vf interpolates to face quadrature points.\ngeometric quantities in MeshData are stored as matrices of dimension textnumber of points per element times textnumber of elements.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Quantities in rd::RefElemData:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"rd.Np, rd.Nq, rd.Nf: the number of nodal interpolation points, volume quadrature points, and face quadrature points on the reference element, respectively.\nrd.Vq: interpolation matrices from values at nodal interpolation points to volume quadrature points\nrd.wq: volume quadrature weights on the reference element\nrd.Vf: interpolation matrices from values at nodal interpolation points to face quadrature points\nrd.wf: a vector containing face quadrature weights on the reference element\nrd.M: the quadrature-based mass matrix, computed via rd.Vq' * diagm(rd.wq) * rd.Vq.\nrd.Pq: a quadrature-based L^2 projection matrix rd.Pq = rd.M \\ rd.Vq' * diagm(rd.wq) which maps between values at quadrature points and values at nodal points.\nDr, Ds, Dt matrices are nodal differentiation matrices with respect to the rst coordinates, e.g., Dr*f.(r,s) approximates the derivative of f(rs) at nodal points.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"Quantities in md::MeshData:","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"md.xyz is a tuple of matrices md.x, md.y, md.z, where column e contains coordinates of physical interpolation points.\nmd.xyzq is a tuple of matrices md.xq, md.yq, md.zq, where column e contains coordinates of physical quadrature points.\nmd.rxJ, md.sxJ, ... are matrices where column e contains values of Jfracpartial rpartial x, Jfracpartial spartial x, etc. at nodal interpolation points on the element e.\nmd.J is a matrix where column e contains values of the Jacobian J at nodal interpolation points.\nmd.Jf is a matrix where column e contains values of the face Jacobian (e.g., determinant of the geometric mapping between a physical face and a reference face) at face quadrature points.\nmd.nxJ, md.nyJ, ... are matrices where column e contains values of components of the unit normal scaled by the face Jacobian md.Jf at face quadrature points.","category":"page"},{"location":"meshes/dgmulti_mesh/","page":"DGMulti mesh","title":"DGMulti mesh","text":"For more details, please see the StartUpDG.jl docs.","category":"page"},{"location":"meshes/p4est_mesh/#P4est-based-mesh","page":"P4est-based mesh","title":"P4est-based mesh","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The P4estMesh is an unstructured, curvilinear, nonconforming mesh type for quadrilateral (2D) and hexahedral (3D) cells. It supports quadtree/octree-based adaptive mesh refinement (AMR) via the C library p4est. See AMRCallback for further information.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Due to its curvilinear nature, (numerical) fluxes need to implement methods dispatching on the normal::AbstractVector. Rotationally invariant equations such as the compressible Euler equations can use FluxRotated to wrap numerical fluxes implemented only for Cartesian meshes. This simplifies the re-use of existing functionality for the TreeMesh but is usually less efficient, cf. PR #550.","category":"page"},{"location":"meshes/p4est_mesh/#Construction-of-a-P4estMesh-from-an-Abaqus-file","page":"P4est-based mesh","title":"Construction of a P4estMesh from an Abaqus file","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"One available option to construct a P4estMesh is to read in an Abaqus (.inp) mesh file. We briefly describe the structure of this file, the conventions it uses, and how the mesh file is parsed to create an initial unstructured, curvilinear, and conforming mesh.","category":"page"},{"location":"meshes/p4est_mesh/#Mesh-in-two-spatial-dimensions","page":"P4est-based mesh","title":"Mesh in two spatial dimensions","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For this discussion we use the following two-dimensional unstructured curved mesh with three elements:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"(Image: abaqus-2dmesh-docs)","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"We note that the corner and element connectivity information parsed from the Abaqus file creates a straight sided (linear) mesh. From this linear mesh there are two strategies available to make the mesh curvilinear:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Apply a mapping function to describe a transformation of the linear mesh to another physical domain. The mapping is approximated using interpolation polynomial of a user specified polynomial degree. The default value of this polynomial degree is 1 that corresponds to an uncurved geometry.\nHigh-order boundary information is available in the .inp mesh file because it was created with the HOHQMesh mesh generator, which is available via the Julia package HOHQMesh.jl. This information is used to create appropriate transfinite mappings during the mesh construction.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"We divide our discussion into two parts. The first part discusses the standard corner and element information contained in the .inp mesh file. The second part specifically deals with the mesh file parsing of an Abaqus file created by HOHQMesh.jl.","category":"page"},{"location":"meshes/p4est_mesh/#Mesh-file-header","page":"P4est-based mesh","title":"Mesh file header","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"An Abaqus .inp mesh file typically begins with a *Heading. Though optional, the *Heading is helpful to give users some information about the mesh described by the mesh file. In particular, a .inp mesh file created with HOHQMesh will contain the header","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*Heading\n File created by HOHQMesh","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"This heading is used to indicate to the mesh constructor which of the above mapping strategies to apply in order to create a curvilinear mesh. If the Abaqus file header is not present then the P4estMesh is created with the first strategy above.","category":"page"},{"location":"meshes/p4est_mesh/#corner-node-list","page":"P4est-based mesh","title":"List of corner nodes","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Next, prefaced with *NODE, comes a list of the physical (x,y,z) coordinates of all the corners. The first integer in the list of the corners provides its id number. Thus, for the two-dimensional example mesh this block of corner information is","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*NODE\n1, 1.0, -1.0, 0.0\n2, 3.0, 0.0, 0.0\n3, 1.0, 1.0, 0.0\n4, 2.0, 0.0, 0.0\n5, 0.0, 0.0, 0.0\n6, 3.0, 1.0, 0.0\n7, 3.0, -1.0, 0.0","category":"page"},{"location":"meshes/p4est_mesh/#element-list","page":"P4est-based mesh","title":"List of elements","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The element connectivity is given after the list of corners. The header for this information block is","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*ELEMENT, type=CPS4, ELSET=Surface1","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The Abaqus element type CPS4 corresponds to a quadrilateral element. Each quadrilateral element in the unstructured mesh is dictated by four corner points with indexing taken from the numbering given by the corner list above. The elements connect a set of four corner points (starting from the bottom left) in an anti-clockwise fashion; making the element right-handed. This element handedness is indicated using the circular arrow in the figure above. Just as with the corner list, the first integer in the element connectivity list indicates the element id number. Thus, the element connectivity list for the three element example mesh is","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*ELEMENT, type=CPS4, ELSET=Surface1\n1, 5, 1, 4, 3\n2, 4, 2, 6, 3\n3, 7, 2, 4, 1","category":"page"},{"location":"meshes/p4est_mesh/#Element-neighbor-connectivity","page":"P4est-based mesh","title":"Element neighbor connectivity","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The construction of the element neighbor ids and identifying physical boundary surfaces is done using functionality directly from the p4est library. For example, the neighbor connectivity is created in the mesh constructor using the wrapper read_inp_p4est function.","category":"page"},{"location":"meshes/p4est_mesh/#Encoding-of-boundaries","page":"P4est-based mesh","title":"Encoding of boundaries","text":"","category":"section"},{"location":"meshes/p4est_mesh/#HOHQMesh-boundary-information","page":"P4est-based mesh","title":"HOHQMesh boundary information","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"If present, any additional information in the mesh file that was created by HOHQMesh is prefaced with ** to make it an Abaqus comment. This ensures that the read in of the file by a standard Abaqus file parser, as done in the read_inp_p4est function, is done correctly.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The high-order, curved boundary information and labels of the physical boundary created by HOHQMesh is found below the comment line","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** ***** HOHQMesh boundary information ***** **","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Next comes the polynomial degree that the mesh will use to represent any curved sides","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** mesh polynomial degree = 8","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The mesh file then, again, provides the element connectivity as well as information for curved surfaces either interior to the domain or along the physical boundaries. A set of check digits are included directly below the four corner indexes to indicate whether the local surface index (-y, +x, +y, or -x) within the element is straight sided, 0, or is curved, 1. If the local surface is straight sided no additional information is necessary during the mesh file read in. But for any curved surfaces the mesh file provides (x,y,z) coordinate values in order to construct an interpolant of this surface with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes. This list of (x,y,z) data will be given in the direction of the local coordinate system. Given below is the element curvature information for the example mesh:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** 5 1 4 3\n** 0 0 1 1\n** 1.000000000000000 1.000000000000000 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 2.000000000000000 0.0 0.0\n** 0.0 0.0 0.0\n** 0.035513826946206 0.105291711848750 0.0\n** 0.148591270347399 0.317731556850611 0.0\n** 0.340010713990041 0.452219430075470 0.0\n** 0.575000000000000 0.462500000000000 0.0\n** 0.788022294598950 0.483764065630034 0.0\n** 0.926408729652601 0.644768443149389 0.0\n** 0.986453164464803 0.883724792445746 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 4 2 6 3\n** 0 0 0 1\n** 2.000000000000000 0.0 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 7 2 4 1\n** 0 0 0 0","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The last piece of information provided by HOHQMesh are labels for the different surfaces of an element. These labels are useful to set boundary conditions along physical surfaces. The labels can be short descriptive words up to 32 characters in length. The label --- indicates an internal surface where no boundary condition is required.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"It is important to note that these labels are given in the following order according to the local surface index -x +x -y +y as required by the p4est library.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"** Bezier --- Slant ---\n** --- Right --- Top\n** Bottom --- Right ---","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For completeness, we provide the entire Abaqus mesh file for the example mesh in the figure above:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*Heading\n File created by HOHQMesh\n*NODE\n1, 1.0, -1.0, 0.0\n2, 3.0, 0.0, 0.0\n3, 1.0, 1.0, 0.0\n4, 2.0, 0.0, 0.0\n5, 0.0, 0.0, 0.0\n6, 3.0, 1.0, 0.0\n7, 3.0, -1.0, 0.0\n*ELEMENT, type=CPS4, ELSET=Surface1\n1, 5, 1, 4, 3\n2, 4, 2, 6, 3\n3, 7, 2, 4, 1\n** ***** HOHQMesh boundary information ***** **\n** mesh polynomial degree = 8\n** 5 1 4 3\n** 0 0 1 1\n** 1.000000000000000 1.000000000000000 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 2.000000000000000 0.0 0.0\n** 0.0 0.0 0.0\n** 0.035513826946206 0.105291711848750 0.0\n** 0.148591270347399 0.317731556850611 0.0\n** 0.340010713990041 0.452219430075470 0.0\n** 0.575000000000000 0.462500000000000 0.0\n** 0.788022294598950 0.483764065630034 0.0\n** 0.926408729652601 0.644768443149389 0.0\n** 0.986453164464803 0.883724792445746 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 4 2 6 3\n** 0 0 0 1\n** 2.000000000000000 0.0 0.0\n** 1.986035130050921 0.054554577460044 0.0\n** 1.920916981799849 0.185149035378133 0.0\n** 1.768263070247418 0.329729152118310 0.0\n** 1.537500000000000 0.462500000000000 0.0\n** 1.295753434047077 0.606254343587194 0.0\n** 1.116583018200151 0.777350964621867 0.0\n** 1.024948365654583 0.934461926834452 0.0\n** 1.000000000000000 1.000000000000000 0.0\n** 7 2 4 1\n** 0 0 0 0\n** Bezier --- Slant ---\n** --- Right --- Top\n** Bottom --- Right ---","category":"page"},{"location":"meshes/p4est_mesh/#Standard-Abaqus-format-boundary-information","page":"P4est-based mesh","title":"Standard Abaqus format boundary information","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"As an alternative to an Abaqus mesh generated by HOHQMesh, .inp files with boundary information encoded as nodesets *NSET,NSET= can be used to construct a p4est mesh. This is especially useful for usage of existing meshes (consisting of bilinear elements) which could stem from the popular gmsh meshing software.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"In addition to the list of nodes and elements given above, there are nodesets of the form ","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*NSET,NSET=PhysicalLine1\n1, 4, 52, 53, 54, 55, 56, 57, 58, ","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"present which are used to associate the edges defined through their corner nodes with a label. In this case it is called PhysicalLine1. By looping over every element and its associated edges, consisting of two nodes, we query the read in NSETs if the current node pair is present.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"To prevent that every nodeset following *NSET,NSET= is treated as a boundary, the user must supply a boundary_symbols keyword to the P4estMesh constructor:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"boundary_symbols = [:PhysicalLine1]\n\nmesh = P4estMesh{2}(mesh_file, polydeg = polydeg, boundary_symbols = boundary_symbols)","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"By doing so, only nodesets with a label present in boundary_symbols are treated as physical boundaries. Other nodesets that could be used for diagnostics are not treated as external boundaries. Note that there is a leading colon : compared to the label in the .inp mesh file. This is required to turn the label into a Symbol.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"A 2D example for this mesh, which is read-in for an unstructured mesh file created with gmsh, is presented in examples/p4est_2d_dgsem/elixir_euler_NACA6412airfoil_mach2.jl.","category":"page"},{"location":"meshes/p4est_mesh/#Mesh-in-three-spatial-dimensions","page":"P4est-based mesh","title":"Mesh in three spatial dimensions","text":"","category":"section"},{"location":"meshes/p4est_mesh/#HOHQMesh-Extended-Abaqus-format","page":"P4est-based mesh","title":"HOHQMesh-Extended Abaqus format","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The 3D Abaqus file format with high-order boundary information from HOHQMesh is very similar to the 2D version discussed above. There are only three changes:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"The element connectivity would be given in terms of the eight corners that define a hexahedron. The corners are numbered as shown in the figure below. The header of the element list changes to be\n*ELEMENT, type=C3D8, ELSET=Volume1\nwhere C3D8 corresponds to a Abaqus hexahedral element.\nThere are six check digits included directly below the eight corner indexes to indicate whether the local face within the element is straight sided, 0, or is curved, 1. For curved faces (x,y,z) coordinate values are available in order to construct an face interpolant with the mesh polynomial order at the Chebyshev-Gauss-Lobatto nodes.\nThe boundary labels are given in the following order according to the local surface index -x +x -y +y -z +z as required by the p4est library.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For completeness, we also give a short description and derivation of the three-dimensional transfinite mapping formulas used to compute the physical coordinates mathbfx=(xyz) of a (possibly curved) hexahedral element give the reference coordinates boldsymbolxi = (xi eta zeta) which lie in -11^3. That is, we will create an expression mathbfx= mathbfX(boldsymbolxi).","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Below we provide a sketch of a single hexahedral element with curved faces. This is done to introduce the numbering conventions for corners, edges, and faces of the element.","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"(Image: abaqus-3dmesh-docs)","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"When the hexahedron is a straight sided (linear) element we compute the transfinite mapping directly from the element corner points according to","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"beginaligned\nmathbfX_linear(boldsymbolxi) = frac18quad mathbfx_1(1-xi)(1-eta)(1-zeta)\n + mathbfx_2(1+xi)(1-eta)(1-zeta)-015cm\n qquad + mathbfx_3(1+xi)(1+eta)(1-zeta)\n + mathbfx_4(1-xi)(1+eta)(1-zeta) \n qquad + mathbfx_5(1-xi)(1-eta)(1+zeta)\n + mathbfx_6(1+xi)(1-eta)(1+zeta) \n qquad + mathbfx_7(1+xi)(1+eta)(1+zeta)\n + mathbfx_8(1-xi)(1+eta)(1+zeta)quad\nendaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Next, we create a transfinite mapping function, mathbfX(boldsymbolxi), for a hexahedron that has one or more curved faces. For this we assume that have a set of six interpolating polynomials Gamma_i_i=1^6 that approximate the faces. The interpolating polynomial for any curved faces is provided by the information in a HOHQMesh Abaqus mesh file or is constructed on the fly via a bi-linear interpolation routine for any linear faces. Explicitly, these six face interpolation polynomials depend on the computational coordinates boldsymbolxi as follows","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":" beginaligned\n Gamma_1(xi zeta) quad quad Gamma_3(xi eta) quad quad Gamma_4(eta zeta)01cm\n Gamma_2(xi zeta) quad quad Gamma_5(xi eta) quad quad Gamma_6(eta zeta)\n endaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"To determine the form of the mapping we first create linear interpolations between two opposing faces, e.g., Gamma_3 and Gamma_5 and sum them together to have","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"beginaligned\n boldsymbolSigma(boldsymbolxi) = frac12quad(1-xi)Gamma_6(etazeta) + (1+xi)Gamma_4(etazeta) -015cm\n qquad+ (1-eta)Gamma_1(xizeta) + (1+eta)Gamma_2(xizeta) -015cm\n qquad +(1-zeta)Gamma_3(xieta) + (1+zeta)Gamma_5(xieta)quad\nendaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Unfortunately, the linear interpolations boldsymbolSigma(boldsymbolxi) no longer match at the faces, e.g., evaluating at eta = -1 we have","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"boldsymbolSigma(xi-1zeta) = Gamma_1(xizeta) + frac12(1-xi)Gamma_6(-1zeta) + (1+xi)Gamma_4(-1zeta)\n +(1-zeta)Gamma_3(xi-1) + (1+zeta)Gamma_5(xi-1)","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"which is the desired face Gamma_1(xizeta) plus four edge error terms. Analogous edge error terms occur at the other faces evaluating boldsymbolSigma(boldsymbolxi) at eta=1, xi=pm 1, and zeta=pm 1. In order to match the faces, we subtract a linear interpolant in the xi, eta, and zeta directions of the edge error terms, e.g., the terms in braces in the above equation. So, continuing the example above, the correction term to be subtracted for face Gamma_1 to match would be","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"left(frac1-eta2right) bigg frac12 (1-xi)Gamma_6(-1zeta) + (1+xi)Gamma_4(-1zeta)+(1-zeta)Gamma_3(xi-1)\n + (1+zeta)Gamma_5(xi-1) bigg","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"For clarity, and to allow an easier comparison to the implementation, we introduce auxiliary notation for the 12 edge values present in the complete correction term. That is, for given values of xi, eta, and zeta we have","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":" beginaligned\n textttedge_1 = Gamma_1(xi -1) quad quad textttedge_5 = Gamma_2(xi -1) quad quad textttedge_9 = Gamma_6(eta -1)01cm\n textttedge_2 = Gamma_1(1 zeta) quad quadtextttedge_6 = Gamma_2(1 zeta) quad quad textttedge_10 = Gamma_4(eta -1)01cm\n textttedge_3 = Gamma_1(xi 1) quad quad textttedge_7 = Gamma_2(xi 1) quad quad textttedge_11 = Gamma_4(eta 1)01cm\n textttedge_4 = Gamma_1(-1 zeta) quad quad textttedge_8 = Gamma_2(-1 zeta) quad quad textttedge_12 = Gamma_6(eta 1)\n endaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"With this notation for the edge terms (and after some algebraic manipulation) we write the complete edge correction term, mathcalC_textttedge(boldsymbolxi), as","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"beginaligned\nmathcalC_textttedge(boldsymbolxi) = frac14quad (1-eta)(1-zeta)textttedge_1-015cm\n qquad + (1+xi)(1-eta)textttedge_2 \n qquad + (1-eta)(1+zeta)textttedge_3 \n qquad + (1-xi)(1-eta)textttedge_4 \n qquad + (1+eta)(1-zeta)textttedge_5 \n qquad + (1+xi)(1+eta)textttedge_6 \n qquad + (1+eta)(1+zeta)textttedge_7 \n qquad + (1-xi)(1+eta)textttedge_8 \n qquad + (1-xi)(1-zeta)textttedge_9 \n qquad + (1+xi)(1-zeta)textttedge_10 \n qquad + (1+xi)(1+zeta)textttedge_11 \n qquad + (1-xi)(1+zeta)textttedge_12quad\nendaligned","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"However, subtracting the edge correction terms mathcalC_textttedge(boldsymbolxi) from boldsymbolSigma(boldsymbolxi) removes the interior element contributions twice. Thus, to complete the construction of the transfinite mapping mathbfX(boldsymbolxi) we add the transfinite map of the straight sided hexahedral element to find","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"mathbfX(boldsymbolxi) = boldsymbolSigma(boldsymbolxi)\n - mathcalC_textttedge(boldsymbolxi)\n + mathbfX_linear(boldsymbolxi)","category":"page"},{"location":"meshes/p4est_mesh/#Construction-from-standard-Abaqus","page":"P4est-based mesh","title":"Construction from standard Abaqus","text":"","category":"section"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"Also for a mesh in standard Abaqus format there are no qualitative changes when going from 2D to 3D. The most notable difference is that boundaries are formed in 3D by faces defined by four nodes while in 2D boundaries are edges consisting of two elements. A simple mesh file, which is used also in examples/p4est_3d_dgsem/elixir_euler_free_stream_boundaries.jl, is given below:","category":"page"},{"location":"meshes/p4est_mesh/","page":"P4est-based mesh","title":"P4est-based mesh","text":"*Heading\n\n*NODE\n1, -2, 0, 0\n2, -1, 0, 0\n3, -1, 1, 0\n4, -2, 1, 0\n5, -2, 0, 1\n6, -1, 0, 1\n7, -1, 1, 1\n8, -2, 1, 1\n9, -1.75, 1, 0\n10, -1.5, 1, 0\n11, -1.25, 1, 0\n12, -1, 0.75000000000035, 0\n13, -1, 0.50000000000206, 0\n14, -1, 0.25000000000104, 0\n15, -1.25, 0, 0\n16, -1.5, 0, 0\n17, -1.75, 0, 0\n18, -2, 0.24999999999941, 0\n19, -2, 0.49999999999869, 0\n20, -2, 0.74999999999934, 0\n21, -1.75, 0, 1\n22, -1.5, 0, 1\n23, -1.25, 0, 1\n24, -1, 0.24999999999941, 1\n25, -1, 0.49999999999869, 1\n26, -1, 0.74999999999934, 1\n27, -1.25, 1, 1\n28, -1.5, 1, 1\n29, -1.75, 1, 1\n30, -2, 0.75000000000035, 1\n31, -2, 0.50000000000206, 1\n32, -2, 0.25000000000104, 1\n33, -2, 0, 0.24999999999941\n34, -2, 0, 0.49999999999869\n35, -2, 0, 0.74999999999934\n36, -2, 1, 0.24999999999941\n37, -2, 1, 0.49999999999869\n38, -2, 1, 0.74999999999934\n39, -1, 0, 0.24999999999941\n40, -1, 0, 0.49999999999869\n41, -1, 0, 0.74999999999934\n42, -1, 1, 0.24999999999941\n43, -1, 1, 0.49999999999869\n44, -1, 1, 0.74999999999934\n45, -1.25, 0.25000000000063, 0\n46, -1.25, 0.50000000000122, 0\n47, -1.25, 0.7500000000001, 0\n48, -1.5, 0.25000000000023, 0\n49, -1.5, 0.50000000000038, 0\n50, -1.5, 0.74999999999984, 0\n51, -1.75, 0.24999999999982, 0\n52, -1.75, 0.49999999999953, 0\n53, -1.75, 0.74999999999959, 0\n54, -1.75, 0.25000000000063, 1\n55, -1.75, 0.50000000000122, 1\n56, -1.75, 0.7500000000001, 1\n57, -1.5, 0.25000000000023, 1\n58, -1.5, 0.50000000000038, 1\n59, -1.5, 0.74999999999984, 1\n60, -1.25, 0.24999999999982, 1\n61, -1.25, 0.49999999999953, 1\n62, -1.25, 0.74999999999959, 1\n63, -2, 0.24999999999982, 0.24999999999941\n64, -2, 0.49999999999953, 0.24999999999941\n65, -2, 0.74999999999959, 0.24999999999941\n66, -2, 0.25000000000023, 0.49999999999869\n67, -2, 0.50000000000038, 0.49999999999869\n68, -2, 0.74999999999984, 0.49999999999869\n69, -2, 0.25000000000063, 0.74999999999934\n70, -2, 0.50000000000122, 0.74999999999934\n71, -2, 0.7500000000001, 0.74999999999934\n72, -1.25, 1, 0.74999999999934\n73, -1.25, 1, 0.49999999999869\n74, -1.25, 1, 0.24999999999941\n75, -1.5, 1, 0.74999999999934\n76, -1.5, 1, 0.49999999999869\n77, -1.5, 1, 0.24999999999941\n78, -1.75, 1, 0.74999999999934\n79, -1.75, 1, 0.49999999999869\n80, -1.75, 1, 0.24999999999941\n81, -1, 0.25000000000063, 0.24999999999941\n82, -1, 0.50000000000122, 0.24999999999941\n83, -1, 0.7500000000001, 0.24999999999941\n84, -1, 0.25000000000023, 0.49999999999869\n85, -1, 0.50000000000038, 0.49999999999869\n86, -1, 0.74999999999984, 0.49999999999869\n87, -1, 0.24999999999982, 0.74999999999934\n88, -1, 0.49999999999953, 0.74999999999934\n89, -1, 0.74999999999959, 0.74999999999934\n90, -1.75, 0, 0.74999999999934\n91, -1.75, 0, 0.49999999999869\n92, -1.75, 0, 0.24999999999941\n93, -1.5, 0, 0.74999999999934\n94, -1.5, 0, 0.49999999999869\n95, -1.5, 0, 0.24999999999941\n96, -1.25, 0, 0.74999999999934\n97, -1.25, 0, 0.49999999999869\n98, -1.25, 0, 0.24999999999941\n99, -1.75, 0.25000000000043, 0.74999999999934\n100, -1.75, 0.25000000000023, 0.49999999999869\n101, -1.75, 0.25000000000002, 0.24999999999941\n102, -1.75, 0.5000000000008, 0.74999999999934\n103, -1.75, 0.50000000000038, 0.49999999999869\n104, -1.75, 0.49999999999995, 0.24999999999941\n105, -1.75, 0.74999999999997, 0.74999999999934\n106, -1.75, 0.74999999999984, 0.49999999999869\n107, -1.75, 0.74999999999972, 0.24999999999941\n108, -1.5, 0.25000000000023, 0.74999999999934\n109, -1.5, 0.25000000000023, 0.49999999999869\n110, -1.5, 0.25000000000023, 0.24999999999941\n111, -1.5, 0.50000000000038, 0.74999999999934\n112, -1.5, 0.50000000000038, 0.49999999999869\n113, -1.5, 0.50000000000038, 0.24999999999941\n114, -1.5, 0.74999999999984, 0.74999999999934\n115, -1.5, 0.74999999999984, 0.49999999999869\n116, -1.5, 0.74999999999984, 0.24999999999941\n117, -1.25, 0.25000000000002, 0.74999999999934\n118, -1.25, 0.25000000000023, 0.49999999999869\n119, -1.25, 0.25000000000043, 0.24999999999941\n120, -1.25, 0.49999999999995, 0.74999999999934\n121, -1.25, 0.50000000000038, 0.49999999999869\n122, -1.25, 0.5000000000008, 0.24999999999941\n123, -1.25, 0.74999999999972, 0.74999999999934\n124, -1.25, 0.74999999999984, 0.49999999999869\n125, -1.25, 0.74999999999997, 0.24999999999941\n******* E L E M E N T S *************\n*ELEMENT, type=C3D8, ELSET=Volume1\n153, 54, 21, 5, 32, 99, 90, 35, 69\n154, 99, 90, 35, 69, 100, 91, 34, 66\n155, 100, 91, 34, 66, 101, 92, 33, 63\n156, 101, 92, 33, 63, 51, 17, 1, 18\n157, 55, 54, 32, 31, 102, 99, 69, 70\n158, 102, 99, 69, 70, 103, 100, 66, 67\n159, 103, 100, 66, 67, 104, 101, 63, 64\n160, 104, 101, 63, 64, 52, 51, 18, 19\n161, 56, 55, 31, 30, 105, 102, 70, 71\n162, 105, 102, 70, 71, 106, 103, 67, 68\n163, 106, 103, 67, 68, 107, 104, 64, 65\n164, 107, 104, 64, 65, 53, 52, 19, 20\n165, 29, 56, 30, 8, 78, 105, 71, 38\n166, 78, 105, 71, 38, 79, 106, 68, 37\n167, 79, 106, 68, 37, 80, 107, 65, 36\n168, 80, 107, 65, 36, 9, 53, 20, 4\n169, 57, 22, 21, 54, 108, 93, 90, 99\n170, 108, 93, 90, 99, 109, 94, 91, 100\n171, 109, 94, 91, 100, 110, 95, 92, 101\n172, 110, 95, 92, 101, 48, 16, 17, 51\n173, 58, 57, 54, 55, 111, 108, 99, 102\n174, 111, 108, 99, 102, 112, 109, 100, 103\n175, 112, 109, 100, 103, 113, 110, 101, 104\n176, 113, 110, 101, 104, 49, 48, 51, 52\n177, 59, 58, 55, 56, 114, 111, 102, 105\n178, 114, 111, 102, 105, 115, 112, 103, 106\n179, 115, 112, 103, 106, 116, 113, 104, 107\n180, 116, 113, 104, 107, 50, 49, 52, 53\n181, 28, 59, 56, 29, 75, 114, 105, 78\n182, 75, 114, 105, 78, 76, 115, 106, 79\n183, 76, 115, 106, 79, 77, 116, 107, 80\n184, 77, 116, 107, 80, 10, 50, 53, 9\n185, 60, 23, 22, 57, 117, 96, 93, 108\n186, 117, 96, 93, 108, 118, 97, 94, 109\n187, 118, 97, 94, 109, 119, 98, 95, 110\n188, 119, 98, 95, 110, 45, 15, 16, 48\n189, 61, 60, 57, 58, 120, 117, 108, 111\n190, 120, 117, 108, 111, 121, 118, 109, 112\n191, 121, 118, 109, 112, 122, 119, 110, 113\n192, 122, 119, 110, 113, 46, 45, 48, 49\n193, 62, 61, 58, 59, 123, 120, 111, 114\n194, 123, 120, 111, 114, 124, 121, 112, 115\n195, 124, 121, 112, 115, 125, 122, 113, 116\n196, 125, 122, 113, 116, 47, 46, 49, 50\n197, 27, 62, 59, 28, 72, 123, 114, 75\n198, 72, 123, 114, 75, 73, 124, 115, 76\n199, 73, 124, 115, 76, 74, 125, 116, 77\n200, 74, 125, 116, 77, 11, 47, 50, 10\n201, 24, 6, 23, 60, 87, 41, 96, 117\n202, 87, 41, 96, 117, 84, 40, 97, 118\n203, 84, 40, 97, 118, 81, 39, 98, 119\n204, 81, 39, 98, 119, 14, 2, 15, 45\n205, 25, 24, 60, 61, 88, 87, 117, 120\n206, 88, 87, 117, 120, 85, 84, 118, 121\n207, 85, 84, 118, 121, 82, 81, 119, 122\n208, 82, 81, 119, 122, 13, 14, 45, 46\n209, 26, 25, 61, 62, 89, 88, 120, 123\n210, 89, 88, 120, 123, 86, 85, 121, 124\n211, 86, 85, 121, 124, 83, 82, 122, 125\n212, 83, 82, 122, 125, 12, 13, 46, 47\n213, 7, 26, 62, 27, 44, 89, 123, 72\n214, 44, 89, 123, 72, 43, 86, 124, 73\n215, 43, 86, 124, 73, 42, 83, 125, 74\n216, 42, 83, 125, 74, 3, 12, 47, 11\n*NSET,NSET=PhysicalSurface1\n1, 2, 3, 4, 5, 6, 7, 8, 9, 10, \n11, 12, 13, 14, 15, 16, 17, 18, 19, 20, \n21, 22, 23, 24, 25, 26, 27, 28, 29, 30, \n31, 32, 33, 34, 35, 36, 37, 38, 45, 46, \n47, 48, 49, 50, 51, 52, 53, 54, 55, 56, \n57, 58, 59, 60, 61, 62, 63, 64, 65, 66, \n67, 68, 69, 70, 71, \n*NSET,NSET=PhysicalSurface2\n1, 2, 3, 4, 5, 6, 7, 8, 9, 10, \n11, 12, 13, 14, 15, 16, 17, 21, 22, 23, \n24, 25, 26, 27, 28, 29, 33, 34, 35, 36, \n37, 38, 39, 40, 41, 42, 43, 44, 72, 73, \n74, 75, 76, 77, 78, 79, 80, 81, 82, 83, \n84, 85, 86, 87, 88, 89, 90, 91, 92, 93, \n94, 95, 96, 97, 98, ","category":"page"},{"location":"troubleshooting/#Troubleshooting-and-FAQ","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"In general, Trixi.jl works best with the newest Julia release and up-to-date dependencies. If something does not work as expected, try updating your installed Julia packages via the package manager, e.g., by running","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"julia> import Pkg; Pkg.update()","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"If you do not use the latest stable release of Julia from the official website, consider updating your Julia installation.","category":"page"},{"location":"troubleshooting/#old-release","page":"Troubleshooting and FAQ","title":"Installing Trixi.jl as a package only provides an older release","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Trixi.jl requires fairly recent versions of several of its dependencies, which sometimes causes issues when other installed packages have conflicting version requirements. In this case, Julia's package manager Pkg will try to handle this gracefully by going back in history until it finds a Trixi.jl release whose version requirements can be met, resulting in an older - and usually outdated - version of Trixi.jl being installed.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"The following example illustrates this issue:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"The current Trixi.jl release v0.3.6 requires package Foo with a minimum version of v0.2.\nAn older Trixi.jl release v0.2.1 requires package Foo only with a minimum version of v0.1.\nA user has already installed package Bar, which itself requires Foo with a maximum version of v0.1.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"In this case, installing Trixi.jl via Pkg will result in version v0.2.1 to be installed instead of the current release v0.3.6. That is, a specific release of Trixi.jl may not be installable if it has a dependency with a higher minimum version that at the same time is restricted to a lower maximum version by another installed package.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"You can check whether an outdated version of Trixi.jl is installed by executing","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"julia> import Pkg; Pkg.update(\"Trixi\"); Pkg.status(\"Trixi\")","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"in the REPL and comparing the reported Trixi.jl version with the version of the latest release. If the versions differ, you can confirm that it is due to a version conflict by forcing Pkg to install the latest Trixi.jl release, where version is the current release:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"julia> Pkg.add(name=\"Trixi\", version=\"0.3.6\")","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"In case of a conflict, the command above will produce an error that informs you about the offending packages, similar to the following:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":" Updating registry at `~/.julia/registries/General`\n Resolving package versions...\nERROR: Unsatisfiable requirements detected for package DataStructures [864edb3b]:\n DataStructures [864edb3b] log:\n ├─possible versions are: [0.9.0, 0.10.0, 0.11.0-0.11.1, 0.12.0, 0.13.0, 0.14.0-0.14.1, 0.15.0, 0.16.1, 0.17.0-0.17.20, 0.18.0-0.18.8] or uninstalled\n ├─restricted by compatibility requirements with DiffEqCallbacks [459566f4] to versions: 0.18.0-0.18.8\n │ └─DiffEqCallbacks [459566f4] log:\n │ ├─possible versions are: [2.0.0, 2.1.0, 2.2.0, 2.3.0, 2.4.0, 2.5.0-2.5.2, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 2.10.0, 2.11.0, 2.12.0-2.12.1, 2.13.0-2.13.5, 2.14.0-2.14.1, 2.15.0] or uninstalled\n │ ├─restricted by compatibility requirements with Trixi [a7f1ee26] to versions: [2.14.0-2.14.1, 2.15.0]\n │ │ └─Trixi [a7f1ee26] log:\n │ │ ├─possible versions are: [0.1.0-0.1.2, 0.2.0-0.2.6, 0.3.0-0.3.6] or uninstalled\n │ │ └─restricted to versions 0.3.6 by an explicit requirement, leaving only versions 0.3.6\n │ └─restricted by compatibility requirements with StaticArrays [90137ffa] to versions: 2.15.0 or uninstalled, leaving only versions: 2.15.0\n │ └─StaticArrays [90137ffa] log:\n │ ├─possible versions are: [0.8.0-0.8.3, 0.9.0-0.9.2, 0.10.0, 0.10.2-0.10.3, 0.11.0-0.11.1, 0.12.0-0.12.5, 1.0.0-1.0.1] or uninstalled\n │ └─restricted by compatibility requirements with Trixi [a7f1ee26] to versions: 1.0.0-1.0.1\n │ └─Trixi [a7f1ee26] log: see above\n └─restricted by compatibility requirements with JLD2 [033835bb] to versions: [0.9.0, 0.10.0, 0.11.0-0.11.1, 0.12.0, 0.13.0, 0.14.0-0.14.1, 0.15.0, 0.16.1, 0.17.0-0.17.20] — no versions left\n └─JLD2 [033835bb] log:\n ├─possible versions are: [0.1.0-0.1.14, 0.2.0-0.2.4, 0.3.0-0.3.1] or uninstalled\n └─restricted by compatibility requirements with BinaryBuilder [12aac903] to versions: 0.1.0-0.1.14\n └─BinaryBuilder [12aac903] log:\n ├─possible versions are: [0.1.0-0.1.2, 0.1.4, 0.2.0-0.2.6] or uninstalled\n └─restricted to versions * by an explicit requirement, leaving only versions [0.1.0-0.1.2, 0.1.4, 0.2.0-0.2.6]","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"From the error message, we can see that ultimately BinaryBuilder is the problem here: It restricts the package DataStructures to version v0.17 (via its dependency JLD2), while Trixi.jl requires at least v0.18 (via its dependency DiffEqCallbacks). Following the official Pkg documentation, there are a number of things you can try to fix such errors:","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Try updating all packages with julia -e 'using Pkg; Pkg.update()'. A newer version of the problematic package may exist that has updated version requirements.\nRemove the offending package. Running\njulia> import Pkg; Pkg.rm(\"BinaryBuilder\"); Pkg.update(); Pkg.status()\nin the REPL will remove BinaryBuilder and (hopefully) update Trixi.jl to the latest version.\nReport the versioning issue to us and/or the development repository of the conflicting package. Maybe it is possible to lift the version restrictions such that both packages can live side by side.\nInstead of installing Trixi.jl and conflicting packages in the same (default) environment, consider creating new environments/projects and install only packages required for the specific tasks, as explained in the official Pkg documentation. For example, if you use Trixi.jl for a research project (Bachelor/Master thesis or a paper), you should create a new Julia project/environment for that research and add Trixi.jl as a dependency. If you track all your code and the Project.toml, Manifest.toml files (generated by Pkg) in a version control system such as git, you can make your research easily reproducible (if you also record the version of Julia you are using and leave some comments for others who do not know what you are trying to do, including your future self 😉).","category":"page"},{"location":"troubleshooting/#font-issues","page":"Troubleshooting and FAQ","title":"There are many questions marks and weird symbols in the output of Trixi.jl","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"This probably means that the default font used by your operating system does not support enough Unicode symbols. Try installing a modern font with decent unicode support, e.g. JuliaMono. Detailed installation instructions are available there.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"This problems affects users of Mac OS particularly often. At the time of writing, installing JuliaMono is as simple as","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"$ brew tap homebrew/cask-fonts\n$ brew install --cask font-juliamono","category":"page"},{"location":"troubleshooting/#There-are-no-timing-results-of-the-initial-mesh-creation","page":"Troubleshooting and FAQ","title":"There are no timing results of the initial mesh creation","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"By default, the SummaryCallback resets the timer used internally by Trixi.jl when it is initialized (when solve is called). If this step needs to be timed, e.g. to debug performance problems, explicit timings can be used as follows.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"using Trixi\n\nbegin\n Trixi.reset_timer!(Trixi.timer())\n\n equations = LinearScalarAdvectionEquation2D(0.2, -0.7)\n mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), n_cells_max=10^5, initial_refinement_level=5)\n solver = DGSEM(3)\n semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, solver)\n\n Trixi.print_timer(Trixi.timer())\nend","category":"page"},{"location":"troubleshooting/#MPI-ranks-are-assigned-zero-cells-in-[P4estMesh](@ref)-even-though-there-are-enough-cells","page":"Troubleshooting and FAQ","title":"MPI ranks are assigned zero cells in P4estMesh even though there are enough cells","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"The P4estMesh allows one to coarsen the mesh by default. When Trixi.jl is parallelized with multiple MPI ranks, this has the consequence that sibling cells (i.e., child cells with the same parent cell) are kept on the same MPI rank to be able to coarsen them easily. This might cause an unbalanced distribution of cells on different ranks. For 2D meshes, this also means that initially each rank will at least own 4 cells, and for 3D meshes, initially each rank will at least own 8 cells. See issue #1329.","category":"page"},{"location":"troubleshooting/#Installing-and-updating-everything-takes-a-lot-of-time","page":"Troubleshooting and FAQ","title":"Installing and updating everything takes a lot of time","text":"","category":"section"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Julia compiles code to get good (C/Fortran-like) performance. At the same time, Julia provides a dynamic environment and usually compiles code just before using it. Over time, Julia has improved its caching infrastructure, allowing to store and reuse more results from (pre-)compilation. This often results in an increased time to install/update packages, in particular when updating to Julia v1.8 or v1.9 from older versions.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"Some packages used together with Trixi.jl provide options to configure the amount of precompilation. For example, OrdinaryDiffEq.jl precompiles many ODE solvers for a good runtime experience of average users. Currently, Trixi.jl does not use all of the available solvers. Thus, you can save some time at every update by setting their precompilation options.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"At the time of writing, this could look as follows. First, you need to activate the environment where you have installed OrdinaryDiffEq.jl. Then, you need to execute the following Julia code.","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"using Preferences, UUIDs\nlet uuid = UUID(\"1dea7af3-3e70-54e6-95c3-0bf5283fa5ed\")\n set_preferences!(uuid, \"PrecompileAutoSpecialize\" => false)\n set_preferences!(uuid, \"PrecompileAutoSwitch\" => false)\n set_preferences!(uuid, \"PrecompileDefaultSpecialize\" => true)\n set_preferences!(uuid, \"PrecompileFunctionWrapperSpecialize\" => false)\n set_preferences!(uuid, \"PrecompileLowStorage\" => true)\n set_preferences!(uuid, \"PrecompileNoSpecialize\" => false)\n set_preferences!(uuid, \"PrecompileNonStiff\" => true)\n set_preferences!(uuid, \"PrecompileStiff\" => false)\nend","category":"page"},{"location":"troubleshooting/","page":"Troubleshooting and FAQ","title":"Troubleshooting and FAQ","text":"This disables precompilation of all implicit methods. This should usually not affect the runtime latency with Trixi.jl since most setups use explicit time integration methods.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"EditURL = \"../../literate/src/files/shock_capturing.jl\"","category":"page"},{"location":"tutorials/shock_capturing/#shock_capturing","page":"5 Shock capturing with flux differencing and stage limiter","title":"5: Shock capturing with flux differencing and stage limiter","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"This tutorial contains a short summary of the idea of shock capturing for DGSEM with flux differencing and its implementation in Trixi.jl. In the second part, an implementation of a positivity preserving limiter is added to the simulation.","category":"page"},{"location":"tutorials/shock_capturing/#Shock-capturing-with-flux-differencing","page":"5 Shock capturing with flux differencing and stage limiter","title":"Shock capturing with flux differencing","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"The following rough explanation is on a very basic level. More information about an entropy stable shock-capturing strategy for DGSEM discretizations of advection dominated problems, such as the compressible Euler equations or the compressible Navier-Stokes equations, can be found in Hennemann et al. (2021). In Rueda-Ramírez et al. (2021) you find the extension to the systems with non-conservative terms, such as the compressible magnetohydrodynamics (MHD) equations.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"The strategy for a shock-capturing method presented by Hennemann et al. is based on a hybrid blending of a high-order DG method with a low-order variant. The low-order subcell finite volume (FV) method is created directly with the Legendre-Gauss-Lobatto (LGL) nodes already used for the high-order DGSEM. Then, the final method is a convex combination with regulating indicator alpha of these two methods.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Since the surface integral is equal for both the DG and the subcell FV method, only the volume integral divides between the two methods.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"This strategy for the volume integral is implemented in Trixi.jl under the name of VolumeIntegralShockCapturingHG with the three parameters of the indicator and the volume fluxes for the DG and the subcell FV method.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Note, that the DG method is based on the flux differencing formulation. Hence, you have to use a two-point flux, such as flux_ranocha, flux_shima_etal, flux_chandrashekar or flux_kennedy_gruber, for the DG volume flux. We would recommend to use the entropy conserving flux flux_ranocha by Ranocha (2018) for the compressible Euler equations.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;\n volume_flux_dg=volume_flux_dg,\n volume_flux_fv=volume_flux_fv)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"We now focus on a choice of the shock capturing indicator indicator_sc. A possible indicator is alpha_HG presented by Hennemann et al. (p.10), which depends on the current approximation with modal coefficients m_j_j=0^N of a given variable.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"The indicator is calculated for every DG element by itself. First, we calculate a smooth alpha by","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"alpha = frac11+exp(-frac-smathbbT(mathbbE-mathbbT))","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"with the total energy mathbbE=maxbig(fracm_N^2sum_j=0^N m_j^2 fracm_N-1^2sum_j=0^N-1 m_j^2big), threshold mathbbT= 05 * 10^-18*(N+1)^14 and parameter s=lnbig(frac1-0000100001big)approx 921024.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"For computational efficiency, alpha_min is introduced and used for","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"tildealpha = begincases\n0 textif alphaalpha_min\nalpha textif alpha_minleq alpha leq 1- alpha_min\n1 textif 1-alpha_minalpha\nendcases","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Moreover, the parameter alpha_max sets a maximal value for alpha by","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"alpha = mintildealpha alpha_max","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"This allows to control the maximal dissipation.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"To remove numerical artifact the final indicator is smoothed with all the neighboring elements' indicators. This is activated with alpha_smooth=true.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"alpha_HG = max_E alpha 05 * alpha_E","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"where E are all elements sharing a face with the current element.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Furthermore, you can specify the variable used for the calculation. For instance you can choose density, pressure or both with density_pressure for the compressible Euler equations. For every equation there is also the option to use the first conservation variable with first.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"This indicator is implemented in Trixi.jl and called IndicatorHennemannGassner with the parameters equations, basis, alpha_max, alpha_min, alpha_smooth and variable.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"indicator_sc = IndicatorHennemannGassner(equations, basis,\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable=variable)","category":"page"},{"location":"tutorials/shock_capturing/#Positivity-preserving-limiter","page":"5 Shock capturing with flux differencing and stage limiter","title":"Positivity preserving limiter","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Some numerical solutions are physically meaningless, for instance negative values of pressure or density for the compressible Euler equations. This often results in crashed simulations since the calculation of numerical fluxes or stable time steps uses mathematical operations like roots or logarithms. One option to avoid these cases are a-posteriori positivity preserving limiters. Trixi.jl provides the fully-discrete positivity-preserving limiter of Zhang, Shu (2011).","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"It works the following way. For every passed (scalar) variable and for every DG element we calculate the minimal value value_min. If this value falls below the given threshold varepsilon, the approximation is slightly adapted such that the minimal value of the relevant variable lies now above the threshold.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"underlineu^new = theta * underlineu + (1-theta) * u_mean","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"where underlineu are the collected pointwise evaluation coefficients in element e and u_mean the integral mean of the quantity in e. The new coefficients are a convex combination of these two values with factor","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"theta = fracvalue_mean - varepsilonvalue_mean - value_min","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"where value_mean is the relevant variable evaluated for the mean value u_mean.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"The adapted approximation keeps the exact same mean value, but the relevant variable is now greater or equal the threshold varepsilon at every node in every element.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"We specify the variables the way we did before for the shock capturing variables. For the compressible Euler equations density, pressure or the combined variable density_pressure are a reasonable choice.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"You can implement the limiter in Trixi.jl using PositivityPreservingLimiterZhangShu with parameters threshold and variables.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=thresholds,\n variables=variables)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Then, the limiter is added to the time integration method in the solve function. For instance, like","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"CarpenterKennedy2N54(stage_limiter!, williamson_condition=false)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"or","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"SSPRK43(stage_limiter!).","category":"page"},{"location":"tutorials/shock_capturing/#Simulation-with-shock-capturing-and-positivity-preserving","page":"5 Shock capturing with flux differencing and stage limiter","title":"Simulation with shock capturing and positivity preserving","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Now, we can run a simulation using the described methods of shock capturing and positivity preserving limiters. We want to give an example for the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"using OrdinaryDiffEq, Trixi\n\nequations = CompressibleEulerEquations2D(1.4)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"As our initial condition we use the Sedov blast wave setup.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"function initial_condition_sedov_blast_wave(x, t, equations::CompressibleEulerEquations2D)\n # Set up polar coordinates\n inicenter = SVector(0.0, 0.0)\n x_norm = x[1] - inicenter[1]\n y_norm = x[2] - inicenter[2]\n r = sqrt(x_norm^2 + y_norm^2)\n\n r0 = 0.21875 # = 3.5 * smallest dx (for domain length=4 and max-ref=6)\n # r0 = 0.5 # = more reasonable setup\n E = 1.0\n p0_inner = 3 * (equations.gamma - 1) * E / (3 * pi * r0^2)\n p0_outer = 1.0e-5 # = true Sedov setup\n # p0_outer = 1.0e-3 # = more reasonable setup\n\n # Calculate primitive variables\n rho = 1.0\n v1 = 0.0\n v2 = 0.0\n p = r > r0 ? p0_outer : p0_inner\n\n return prim2cons(SVector(rho, v1, v2, p), equations)\nend\ninitial_condition = initial_condition_sedov_blast_wave","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"basis = LobattoLegendreBasis(3)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"We set the numerical fluxes and divide between the surface flux and the two volume fluxes for the DG and FV method. Here, we are using flux_lax_friedrichs and flux_ranocha.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"surface_flux = flux_lax_friedrichs\nvolume_flux = flux_ranocha","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Now, we specify the shock capturing indicator alpha.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"We implement the described indicator of Hennemann, Gassner as explained above with parameters equations, basis, alpha_max, alpha_min, alpha_smooth and variable. Since density and pressure are the critical variables in this example, we use density_pressure = density * pressure = rho * p as indicator variable.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"indicator_sc = IndicatorHennemannGassner(equations, basis,\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable=density_pressure)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"Now, we can use the defined fluxes and the indicator to implement the volume integral using shock capturing.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;\n volume_flux_dg=volume_flux,\n volume_flux_fv=surface_flux)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"We finalize the discretization by implementing Trixi.jl's solver, mesh, semi and ode, while solver now has the extra parameter volume_integral.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"solver = DGSEM(basis, surface_flux, volume_integral)\n\ncoordinates_min = (-2.0, -2.0)\ncoordinates_max = ( 2.0, 2.0)\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=6,\n n_cells_max=10_000)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n\ntspan = (0.0, 1.0)\node = semidiscretize(semi, tspan);\nnothing #hide","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"We add some callbacks to get an solution analysis and use a CFL-based time step size calculation.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"analysis_callback = AnalysisCallback(semi, interval=100)\n\nstepsize_callback = StepsizeCallback(cfl=0.8)\n\ncallbacks = CallbackSet(analysis_callback, stepsize_callback);\nnothing #hide","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"We now run the simulation using the positivity preserving limiter of Zhang and Shu for the variables density and pressure.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=(5.0e-6, 5.0e-6),\n variables=(Trixi.density, pressure))\n\nsol = solve(ode, CarpenterKennedy2N54(stage_limiter!, williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\n\nusing Plots\nplot(sol)","category":"page"},{"location":"tutorials/shock_capturing/#Package-versions","page":"5 Shock capturing with flux differencing and stage limiter","title":"Package versions","text":"","category":"section"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"","category":"page"},{"location":"tutorials/shock_capturing/","page":"5 Shock capturing with flux differencing and stage limiter","title":"5 Shock capturing with flux differencing and stage limiter","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"EditURL = \"../../literate/src/files/DGMulti_1.jl\"","category":"page"},{"location":"tutorials/DGMulti_1/#DGMulti_1","page":"7 DG schemes via DGMulti solver","title":"7: DG schemes via DGMulti solver","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"DGMulti is a DG solver that allows meshes with simplex elements. The basic idea and implementation of this solver is explained in section \"Meshes\". Here, we want to give some examples and a quick overview about the options with DGMulti.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"We start with a simple example we already used in the tutorial about flux differencing. There, we implemented a simulation with initial_condition_weak_blast_wave for the 2D compressible Euler equations CompressibleEulerEquations2D and used the DG formulation with flux differencing using volume flux flux_ranocha and surface flux flux_lax_friedrichs.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"Here, we want to implement the equivalent example, only now using the DGMulti solver instead of DGSEM.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq\n\nequations = CompressibleEulerEquations2D(1.4)\n\ninitial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"To use the Gauss-Lobatto nodes again, we choose approximation_type=SBP() in the solver. Since we want to start with a Cartesian domain discretized with squares, we use the element type Quad().","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3,\n element_type = Quad(),\n approximation_type = SBP(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))\n\ncells_per_dimension = (32, 32)\nmesh = DGMultiMesh(dg,\n cells_per_dimension, # initial_refinement_level = 5\n coordinates_min=(-2.0, -2.0),\n coordinates_max=( 2.0, 2.0),\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n boundary_conditions=boundary_condition_periodic)\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=10)\nanalysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\ncallbacks = CallbackSet(analysis_callback, alive_callback);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"Run the simulation with the same time integration algorithm as before.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"sol = solve(ode, RDPK3SpFSAL49(), abstol=1.0e-6, reltol=1.0e-6,\n callback=callbacks, save_everystep=false);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"plot(pd[\"rho\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"This simulation is not as fast as the equivalent with TreeMesh since no special optimizations for quads (for instance tensor product structure) have been implemented. Figure 4 in \"Efficient implementation of modern entropy stable and kinetic energy preserving discontinuous Galerkin methods for conservation laws\" (2021) provides a nice runtime comparison between the different mesh types. On the other hand, the functions are more general and thus we have more option we can choose from.","category":"page"},{"location":"tutorials/DGMulti_1/#Simulation-with-Gauss-nodes","page":"7 DG schemes via DGMulti solver","title":"Simulation with Gauss nodes","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"For instance, we can change the approximation type of our simulation.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq\nequations = CompressibleEulerEquations2D(1.4)\ninitial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"We now use Gauss nodes instead of Gauss-Lobatto nodes which can be done for the element types Quad() and Hex(). Therefore, we set approximation_type=GaussSBP(). Alternatively, we can use a modal approach using the approximation type Polynomial().","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3,\n element_type = Quad(),\n approximation_type = GaussSBP(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))\n\ncells_per_dimension = (32, 32)\nmesh = DGMultiMesh(dg,\n cells_per_dimension, # initial_refinement_level = 5\n coordinates_min=(-2.0, -2.0),\n coordinates_max=( 2.0, 2.0),\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n boundary_conditions=boundary_condition_periodic)\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=10)\nanalysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\ncallbacks = CallbackSet(analysis_callback, alive_callback);\n\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)","category":"page"},{"location":"tutorials/DGMulti_1/#Simulation-with-triangular-elements","page":"7 DG schemes via DGMulti solver","title":"Simulation with triangular elements","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"Also, we can set another element type. We want to use triangles now.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq\nequations = CompressibleEulerEquations2D(1.4)\ninitial_condition = initial_condition_weak_blast_wave","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"Since there is no direct equivalent to Gauss-Lobatto nodes on triangles, the approximation type SBP() now uses Gauss-Lobatto nodes on faces and special nodes in the interior of the triangular. More details can be found in the documentation of StartUpDG.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3,\n element_type = Tri(),\n approximation_type = SBP(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))\n\ncells_per_dimension = (32, 32)\nmesh = DGMultiMesh(dg,\n cells_per_dimension, # initial_refinement_level = 5\n coordinates_min=(-2.0, -2.0),\n coordinates_max=( 2.0, 2.0),\n periodicity=true)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n boundary_conditions=boundary_condition_periodic)\ntspan = (0.0, 0.4)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=10)\nanalysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\ncallbacks = CallbackSet(analysis_callback, alive_callback);\n\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd)","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"plot(pd[\"rho\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/DGMulti_1/#Triangular-meshes-on-non-Cartesian-domains","page":"7 DG schemes via DGMulti solver","title":"Triangular meshes on non-Cartesian domains","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"To use triangular meshes on a non-Cartesian domain, Trixi.jl uses the package StartUpDG.jl. The following example is based on elixir_euler_triangulate_pkg_mesh.jl and uses a pre-defined mesh from StartUpDG.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Trixi, OrdinaryDiffEq","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"We want to simulate the smooth initial condition initial_condition_convergence_test with source terms source_terms_convergence_test for the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"equations = CompressibleEulerEquations2D(1.4)\ninitial_condition = initial_condition_convergence_test\nsource_terms = source_terms_convergence_test","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"We create the solver DGMulti with triangular elements (Tri()) as before.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"dg = DGMulti(polydeg = 3, element_type = Tri(),\n approximation_type=Polynomial(),\n surface_flux = flux_lax_friedrichs,\n volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"StartUpDG.jl provides for instance a pre-defined Triangulate geometry for a rectangular domain with hole RectangularDomainWithHole. Other pre-defined Triangulate geometries are e.g., SquareDomain, Scramjet, and CircularDomain.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"meshIO = StartUpDG.triangulate_domain(StartUpDG.RectangularDomainWithHole());\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"The pre-defined Triangulate geometry in StartUpDG has integer boundary tags. With DGMultiMesh we assign boundary faces based on these integer boundary tags and create a mesh compatible with Trixi.jl.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"mesh = DGMultiMesh(dg, meshIO, Dict(:outer_boundary=>1, :inner_boundary=>2))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"boundary_condition_convergence_test = BoundaryConditionDirichlet(initial_condition)\nboundary_conditions = (; :outer_boundary => boundary_condition_convergence_test,\n :inner_boundary => boundary_condition_convergence_test)\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n source_terms = source_terms,\n boundary_conditions = boundary_conditions)\n\ntspan = (0.0, 0.2)\node = semidiscretize(semi, tspan)\n\nalive_callback = AliveCallback(alive_interval=20)\nanalysis_callback = AnalysisCallback(semi, interval=200, uEltype=real(dg))\ncallbacks = CallbackSet(alive_callback, analysis_callback);\n\nsol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt = 0.5 * estimate_dt(mesh, dg), save_everystep=false, callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using Plots\npd = PlotData2D(sol)\nplot(pd[\"rho\"])\nplot!(getmesh(pd))","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"For more information, please have a look in the StartUpDG.jl documentation.","category":"page"},{"location":"tutorials/DGMulti_1/#Package-versions","page":"7 DG schemes via DGMulti solver","title":"Package versions","text":"","category":"section"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"StartUpDG\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"","category":"page"},{"location":"tutorials/DGMulti_1/","page":"7 DG schemes via DGMulti solver","title":"7 DG schemes via DGMulti solver","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"EditURL = \"../../literate/src/files/adding_new_scalar_equations.jl\"","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#adding_new_scalar_equations","page":"10 Adding a new scalar conservation law","title":"10: Adding a new scalar conservation law","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"If you want to use Trixi.jl for your own research, you might be interested in a new physics model that's not already included in Trixi.jl. In this tutorial, we will implement the cubic conservation law","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"partial_t u(tx) + partial_x u(tx)^3 = 0","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"in a periodic domain in one space dimension. In Trixi.jl, such a mathematical model is encoded as a subtype of Trixi.AbstractEquations.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Basic-setup","page":"10 Adding a new scalar conservation law","title":"Basic setup","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"using Trixi\n\nstruct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,\n 1 #= number of primary variables, i.e. scalar =#};\nend","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"We create CubicEquation as an empty struct since we do not use any parameters for this equation. Other models could bundle arbitrary parameters, e.g., the ideal gas constant for the compressible Euler equations.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"Next, we define the physical flux f(u) = u^3 using the calling structure used in Trixi.jl.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"Trixi.flux(u, orientation, equation::CubicEquation) = u.^3\nTrixi.varnames(_, ::CubicEquation) = (\"scalar\",)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"In Trixi.jl, the conserved variables u are usually passed as SVectors of variables at a single physical location. Hence, we must use u.^3 instead of the scalar operation u^3.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"That's already enough to run a simple simulation with a standard DGSEM discretization using the non-dissipative central flux at interfaces.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"using OrdinaryDiffEq\n\n# Create a simulation setup\nequation = CubicEquation()\n\ninitial_condition_sine(x, t, equation::CubicEquation) = SVector(sinpi(x[1]))\n\nmesh = TreeMesh(-1.0, 1.0, # min/max coordinates\n initial_refinement_level=4,\n n_cells_max=10^4)\n\nsolver = DGSEM(3 #= polynomial degree =#, flux_central)\n\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"We wrap the return value of the initial_condition_sine inside an SVector since that's the approach used in Trixi.jl also for systems of equations. We need to index the spatial coordinate x[1], since it is an SVector with one component. In multiple space dimensions, all spatial coordinates are passed together.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"Next, we create an ODEProblem from the SciML/DifferentialEquations ecosystem. We can solve this ODE numerically using any time integration method, e.g., SSPRK43 from OrdinaryDiffEq.jl. Before, we set up a callback to summarize the simulation setup.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"# Create ODE problem with given time span\ntspan = (0.0, 0.09)\node = semidiscretize(semi, tspan)\n\nsummary_callback = SummaryCallback()\ncallbacks = CallbackSet(summary_callback)\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks\nsol = solve(ode, SSPRK43();\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"That's it, you ran your first simulation using your new equation with Trixi.jl! Now, we can plot the solution at the final time using Plots.jl.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"You can already see that discontinuities will develop and oscillations start to occur around steep parts of the wave. That's expected from our central discretization. To avoid these issues, we need to use dissipative numerical fluxes (approximate Riemann solvers) at interfaces.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Advanced-setup","page":"10 Adding a new scalar conservation law","title":"Advanced setup","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"Thus, we add a Godunov's flux for our cubic equation. That is easy for this equation since the wave speed f'(u) = 3u^2 is always non-negative.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"@inline Trixi.flux_godunov(u_ll, u_rr, orientation, equation::CubicEquation) = flux(u_ll, orientation, equation)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"Let's run the example again but with a dissipative numerical flux at interfaces. remake will recreate the semidiscretization we used before and only change selected parameters, in this case the solver.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"# A new setup with dissipation\nsemi = remake(semi, solver=DGSEM(3, flux_godunov))\node = semidiscretize(semi, tspan)\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot!(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"You can see that there are fewer oscillations, in particular around steep edges. Now let's increase the final time (and also the spatial resolution).","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)\nsemi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))\node = semidiscretize(semi, (0.0, 0.5) #= tspan =#)\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"You can observe that nonclassical shocks develop and are stable under grid refinement, e.g. for initial_refinement_level=12. In this case, these nonclassical shocks can be avoided by using an entropy-dissipative semidiscretization. Thus, we need to define an entropy-conservative numerical flux","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"@inline function Trixi.flux_ec(u_ll, u_rr, orientation, equation::CubicEquation)\n return SVector(0.25 * (u_ll[1]^3 + u_ll[1]^2 * u_rr[1] + u_ll[1] * u_rr[1]^2 + u_rr[1]^3))\nend","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"and use a VolumeIntegralFluxDifferencing instead of the standard VolumeIntegralWeakForm in the DGSEM.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"# Let's use a provably entropy-dissipative semidiscretization\nsemi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))\node = semidiscretize(semi, (0.0, 0.5))\nsol = solve(ode, SSPRK43(); ode_default_options()...);\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"Possible next steps could be","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"to define Trixi.max_abs_speeds(u, equations::CubicEquation) = 3 * u[1]^2 to use CFL-based time step control via a StepsizeCallback\nto define quantities of interest like Trixi.entropy(u, equations::CubicEquation) = u[1]^2 and integrate them in a simulation using the AnalysisCallback\nto experiment with shock-capturing volume integrals VolumeIntegralShockCapturingHG and adaptive mesh refinement AMRCallback","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"For further reading, Trixi.jl provides another example on adding a scalar equation. In the elixir about the KPP problem, the 2D scalar \"KPP equation\" from Kurganov, Petrova, Popov (2007) is implemented.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Summary-of-the-code","page":"10 Adding a new scalar conservation law","title":"Summary of the code","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"To sum up, here is the complete code that we used (without the callbacks since these create a lot of unnecessary output in the doctests of this tutorial). In addition, we create the struct inside the new module CubicConservationLaw. That ensures that we can re-create structs defined therein without having to restart Julia.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"# Define new physics\nmodule CubicConservationLaw\n\nusing Trixi\n\nstruct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,\n 1 #= number of primary variables, i.e. scalar =#}\nend\n\n@inline Trixi.flux(u, orientation, equation::CubicEquation) = u.^3\nTrixi.varnames(_, ::CubicEquation) = (\"scalar\",)\n\n@inline Trixi.flux_godunov(u_ll, u_rr, orientation, equation::CubicEquation) = flux(u_ll, orientation, equation)\n@inline function Trixi.flux_ec(u_ll, u_rr, orientation, equation::CubicEquation)\n return SVector(0.25 * (u_ll[1]^3 + u_ll[1]^2 * u_rr[1] + u_ll[1] * u_rr[1]^2 + u_rr[1]^3))\nend\n\nend # module\n\n\n# Create a simulation setup\nimport .CubicConservationLaw\nusing Trixi\nusing OrdinaryDiffEq\nusing Plots\n\nequation = CubicConservationLaw.CubicEquation()\n\ninitial_condition_sine(x, t, equation::CubicConservationLaw.CubicEquation) = SVector(sinpi(x[1]))\n\nmesh = TreeMesh(-1.0, 1.0, # min/max coordinates\n initial_refinement_level=4,\n n_cells_max=10^4)\n\nsolver = DGSEM(3 #= polynomial degree =#, flux_central)\n\nsemi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n\n# Create ODE problem with given time span\ntspan = (0.0, 0.1)\node = semidiscretize(semi, tspan)\n\n# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)\n\n\n# A new setup with dissipation\nsemi = remake(semi, solver=DGSEM(3, flux_godunov))\node = semidiscretize(semi, tspan)\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot!(sol)\n\n\n# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)\nsemi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))\node = semidiscretize(semi, (0.0, 0.5))\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)\n\n\n# Let's use a provably entropy-dissipative semidiscretization\nsemi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))\node = semidiscretize(semi, (0.0, 0.5))\nsol = solve(ode, SSPRK43(); ode_default_options()...)\nplot(sol)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/#Package-versions","page":"10 Adding a new scalar conservation law","title":"Package versions","text":"","category":"section"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"","category":"page"},{"location":"tutorials/adding_new_scalar_equations/","page":"10 Adding a new scalar conservation law","title":"10 Adding a new scalar conservation law","text":"This page was generated using Literate.jl.","category":"page"},{"location":"time_integration/#time-integration","page":"Time integration","title":"Time integration methods","text":"","category":"section"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, explicit Runge-Kutta methods from OrdinaryDiffEq.jl are tested extensively. Interesting classes of time integration schemes are","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"Explicit low-storage Runge-Kutta methods\nStrong stability preserving methods","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"Some common options for solve from OrdinaryDiffEq.jl are the following. Further documentation can be found in the SciML docs.","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"If you use a fixed time step method like CarpenterKennedy2N54, you need to pass a time step as dt=.... If you use a StepsizeCallback, the value passed as dt=... is irrelevant since it will be overwritten by the StepsizeCallback. If you want to use an adaptive time step method such as SSPRK43 or RDPK3SpFSAL49 and still want to use CFL-based step size control via the StepsizeCallback, you need to pass the keyword argument adaptive=false to solve.\nYou should usually set save_everystep=false. Otherwise, OrdinaryDiffEq.jl will (try to) save the numerical solution after every time step in RAM (until you run out of memory or start to swap).\nYou can set the maximal number of time steps via maxiters=....\nSSP methods and many low-storage methods from OrdinaryDiffEq.jl support stage_limiter!s and step_limiter!s, e.g., PositivityPreservingLimiterZhangShu from Trixi.jl.\nIf you start Julia with multiple threads and want to use them also in the time integration method from OrdinaryDiffEq.jl, you need to pass the keyword argument thread=OrdinaryDiffEq.True() to the algorithm, e.g., RDPK3SpFSAL49(thread=OrdinaryDiffEq.True()) or CarpenterKennedy2N54(thread=OrdinaryDiffEq.True(), williamson_condition=false). For more information on using thread-based parallelism in Trixi.jl, please refer to Shared-memory parallelization with threads.\nIf you use error-based step size control (see also the section on error-based adaptive step sizes together with MPI, you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to OrdinaryDiffEq's solve, which are both included in ode_default_options.","category":"page"},{"location":"time_integration/","page":"Time integration","title":"Time integration","text":"note: Number of `rhs!` calls\nIf you use explicit Runge-Kutta methods from OrdinaryDiffEq.jl, the total number of rhs! calls can be (slightly) bigger than the number of steps times the number of stages, e.g. to allow for interpolation (dense output), root-finding for continuous callbacks, and error-based time step control. In general, you often should not need to worry about this if you use Trixi.jl.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"EditURL = \"../../../literate/src/files/first_steps/getting_started.jl\"","category":"page"},{"location":"tutorials/first_steps/getting_started/#getting_started","page":"1.1 Getting started","title":"1.1: First steps in Trixi.jl: Getting started","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Trixi.jl is a numerical simulation framework for conservation laws and is written in the Julia programming language. This tutorial is intended for beginners in Julia and Trixi.jl. After reading it, you will know how to install Julia and Trixi.jl on your computer, and you will be able to download setup files from our GitHub repository, modify them, and run simulations.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"The contents of this tutorial:","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Julia installation\nTrixi.jl installation\nRunning a simulation\nGetting an existing setup file\nModifying an existing setup","category":"page"},{"location":"tutorials/first_steps/getting_started/#Julia-installation","page":"1.1 Getting started","title":"Julia installation","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Trixi.jl is compatible with the latest stable release of Julia. Additional details regarding Julia support can be found in the README.md file. The current default Julia installation is managed through juliaup. You may follow our concise installation guidelines for Windows, Linux, and MacOS provided below. In the event of any issues during the installation process, please consult the official Julia installation instruction.","category":"page"},{"location":"tutorials/first_steps/getting_started/#Windows","page":"1.1 Getting started","title":"Windows","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Open a terminal by pressing Win+r and entering cmd in the opened window.\nTo install Julia, execute the following command in the terminal:\nwinget install julia -s msstore\nVerify the successful installation of Julia by executing the following command in the terminal:\njulia\nTo exit Julia, execute exit() or press Ctrl+d.","category":"page"},{"location":"tutorials/first_steps/getting_started/#Linux-and-MacOS","page":"1.1 Getting started","title":"Linux and MacOS","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"To install Julia, run the following command in a terminal:\ncurl -fsSL https://install.julialang.org | sh\nFollow the instructions displayed in the terminal during the installation process.\nIf an error occurs during the execution of the previous command, you may need to install curl. On Ubuntu-type systems, you can use the following command:\nsudo apt install curl\nAfter installing curl, repeat the first step once more to proceed with Julia installation.\nVerify the successful installation of Julia by executing the following command in the terminal:\njulia\nTo exit Julia, execute exit() or press Ctrl+d.","category":"page"},{"location":"tutorials/first_steps/getting_started/#Trixi.jl-installation","page":"1.1 Getting started","title":"Trixi.jl installation","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Trixi.jl and its related tools are registered Julia packages, thus their installation happens inside Julia. For a smooth workflow experience with Trixi.jl, you need to install Trixi.jl, OrdinaryDiffEq.jl, and Plots.jl.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Open a terminal and start Julia.\nExecute following commands:\nimport Pkg\nPkg.add([\"OrdinaryDiffEq\", \"Plots\", \"Trixi\"])","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Now you have installed all these packages. OrdinaryDiffEq.jl provides time integration schemes used by Trixi.jl and Plots.jl can be used to directly visualize Trixi.jl results from the Julia REPL.","category":"page"},{"location":"tutorials/first_steps/getting_started/#Usage","page":"1.1 Getting started","title":"Usage","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/#Running-a-simulation","page":"1.1 Getting started","title":"Running a simulation","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"To get you started, Trixi.jl has a large set of example setups, that can be taken as a basis for your future investigations. In Trixi.jl, we call these setup files \"elixirs\", since they contain Julia code that takes parts of Trixi.jl and combines them into something new.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Any of the examples can be executed using the trixi_include function. trixi_include(...) expects a single string argument with a path to a file containing Julia code. For convenience, the examples_dir function returns a path to the examples folder, which has been locally downloaded while installing Trixi.jl. joinpath(...) can be used to join path components into a full path.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Let's execute a short two-dimensional problem setup. It approximates the solution of the compressible Euler equations in 2D for an ideal gas (CompressibleEulerEquations2D) with a weak blast wave as the initial condition.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Start Julia in a terminal and execute the following code:","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"using Trixi, OrdinaryDiffEq\ntrixi_include(joinpath(examples_dir(), \"tree_2d_dgsem\", \"elixir_euler_ec.jl\"))","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"using Trixi, OrdinaryDiffEq #hide\ntrixi_include(@__MODULE__,joinpath(examples_dir(), \"tree_2d_dgsem\", \"elixir_euler_ec.jl\")) #hide","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"To analyze the result of the computation, we can use the Plots.jl package and the function plot(...), which creates a graphical representation of the solution. sol is a variable defined in the executed example and it contains the solution at the final moment of the simulation.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"To obtain a list of all Trixi.jl elixirs execute get_examples. It returns the paths to all example setups.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"get_examples()","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Editing an existing elixir is the best way to start your first own investigation using Trixi.jl.","category":"page"},{"location":"tutorials/first_steps/getting_started/#Getting-an-existing-setup-file","page":"1.1 Getting started","title":"Getting an existing setup file","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"To edit an existing elixir, you first have to find a suitable one and then copy it to a local folder. Let's have a look at how to download the elixir_euler_ec.jl elixir used in the previous section from the Trixi.jl GitHub repository.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"All examples are located inside the examples folder.\nNavigate to the file elixir_euler_ec.jl.\nRight-click the Raw button on the right side of the webpage and choose Save as... (or Save Link As...).\nChoose a folder and save the file.","category":"page"},{"location":"tutorials/first_steps/getting_started/#Modifying-an-existing-setup","page":"1.1 Getting started","title":"Modifying an existing setup","text":"","category":"section"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"As an example, we will change the initial condition for calculations that occur in elixir_euler_ec.jl. In this example we consider the compressible Euler equations in two spatial dimensions,","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"fracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho v_2 rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\nrho v_1 rho v_1^2 + p rho v_1 v_2 (rho e + p) v_1\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_2 rho v_1 v_2 rho v_2^2 + p (rho e + p) v_2\nendpmatrix\n=\nbeginpmatrix\n0 0 0 0\nendpmatrix","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"for an ideal gas with the specific heat ratio gamma. Here, rho is the density, v_1 and v_2 are the velocities, e is the specific total energy, and","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"p = (gamma - 1) left( rho e - frac12 rho (v_1^2 + v_2^2) right)","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"is the pressure. Initial conditions consist of initial values for rho, rho v_1, rho v_2 and rho e. One of the common initial conditions for the compressible Euler equations is a simple density wave. Let's implement it.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Open the downloaded file elixir_euler_ec.jl with a text editor.\nGo to the line with the following code:\ninitial_condition = initial_condition_weak_blast_wave\nHere, initial_condition_weak_blast_wave is used as the initial condition.\nComment out the line using the # symbol:\n# initial_condition = initial_condition_weak_blast_wave\nNow you can create your own initial conditions. Add the following code after the commented line:","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"function initial_condition_density_waves(x, t, equations::CompressibleEulerEquations2D)\n v1 = 0.1 # velocity along x-axis\n v2 = 0.2 # velocity along y-axis\n rho = 1.0 + 0.98 * sinpi(sum(x) - t * (v1 + v2)) # density wave profile\n p = 20 # pressure\n rho_e = p / (equations.gamma - 1) + 1/2 * rho * (v1^2 + v2^2)\n return SVector(rho, rho*v1, rho*v2, rho_e)\nend\ninitial_condition = initial_condition_density_waves","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Execute the following code one more time, but instead of path/to/file paste the path to the elixir_euler_ec.jl file that you just edited.\nusing Trixi\ntrixi_include(path/to/file)\nusing Plots\nplot(sol)","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Then you will obtain a new solution from running the simulation with a different initial condition.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"trixi_include(@__MODULE__,joinpath(examples_dir(), \"tree_2d_dgsem\", \"elixir_euler_ec.jl\"), #hide\n initial_condition=initial_condition) #hide\npd = PlotData2D(sol) #hide\np1 = plot(pd[\"rho\"]) #hide\np2 = plot(pd[\"v1\"], clim=(0.05, 0.15)) #hide\np3 = plot(pd[\"v2\"], clim=(0.15, 0.25)) #hide\np4 = plot(pd[\"p\"], clim=(10, 30)) #hide\nplot(p1, p2, p3, p4) #hide","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"To get exactly the same picture execute the following.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"pd = PlotData2D(sol)\np1 = plot(pd[\"rho\"])\np2 = plot(pd[\"v1\"], clim=(0.05, 0.15))\np3 = plot(pd[\"v2\"], clim=(0.15, 0.25))\np4 = plot(pd[\"p\"], clim=(10, 30))\nplot(p1, p2, p3, p4)","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Feel free to make further changes to the initial condition to observe different solutions.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Now you are able to download, modify and execute simulation setups for Trixi.jl. To explore further details on setting up a new simulation with Trixi.jl, refer to the second part of the introduction titled Create first setup.","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"Sys.rm(\"out\"; recursive=true, force=true) #hide","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"","category":"page"},{"location":"tutorials/first_steps/getting_started/","page":"1.1 Getting started","title":"1.1 Getting started","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"EditURL = \"../../literate/src/files/upwind_fdsbp.jl\"","category":"page"},{"location":"tutorials/upwind_fdsbp/#upwind_fdsbp","page":"9 Upwind FD SBP schemes","title":"9: Upwind FD SBP schemes","text":"","category":"section"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"General tensor product SBP methods are supported via the DGMulti solver in a reasonably complete way, see the previous tutorial. Nevertheless, there is also experimental support for SBP methods with other solver and mesh types.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"The first step is to set up an SBP operator. A classical (central) SBP operator can be created as follows.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"using Trixi\nD_SBP = derivative_operator(SummationByPartsOperators.MattssonNordström2004(),\n derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Instead of prefixing the source of coefficients MattssonNordström2004(), you can also load the package SummationByPartsOperators.jl. Either way, this yields an object representing the operator efficiently. If you want to compare it to coefficients presented in the literature, you can convert it to a matrix.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Matrix(D_SBP)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Upwind SBP operators are a concept introduced in 2017 by Ken Mattsson. You can create them as follows.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"D_upw = upwind_operators(SummationByPartsOperators.Mattsson2017,\n derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Upwind operators are derivative operators biased towards one direction. The \"minus\" variants has a bias towards the left side, i.e., it uses values from more nodes to the left than from the right to compute the discrete derivative approximation at a given node (in the interior of the domain). In matrix form, this means more non-zero entries are left from the diagonal.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Matrix(D_upw.minus)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Analogously, the \"plus\" variant has a bias towards the right side.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Matrix(D_upw.plus)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"For more information on upwind SBP operators, please refer to the documentation of SummationByPartsOperators.jl and references cited there.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"The basic idea of upwind SBP schemes is to apply a flux vector splitting and use appropriate upwind operators for both parts of the flux. In 1D, this means to split the flux","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"f(u) = f^-(u) + f^+(u)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"such that f^-(u) is associated with left-going waves and f^+(u) with right-going waves. Then, we apply upwind SBP operators D^- D^+ with an appropriate upwind bias, resulting in","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"partial_x f(u) approx D^+ f^-(u) + D^- f^+(u)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Note that the established notations of upwind operators D^pm and flux splittings f^pm clash. The right-going waves from f^+ need an operator biased towards their upwind side, i.e., the left side. This upwind bias is provided by the operator D^-.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Many classical flux vector splittings have been developed for finite volume methods and are described in the book \"Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction\" of Eleuterio F. Toro (2009), DOI: 10.1007/b79761. One such a well-known splitting provided by Trixi.jl is splitting_steger_warming.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"Trixi.jl comes with several example setups using upwind SBP methods with flux vector splitting, e.g.,","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"elixir_euler_vortex.jl\nelixir_euler_taylor_green_vortex.jl","category":"page"},{"location":"tutorials/upwind_fdsbp/#Package-versions","page":"9 Upwind FD SBP schemes","title":"Package versions","text":"","category":"section"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"SummationByPartsOperators\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"","category":"page"},{"location":"tutorials/upwind_fdsbp/","page":"9 Upwind FD SBP schemes","title":"9 Upwind FD SBP schemes","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"EditURL = \"../../literate/src/files/hohqmesh_tutorial.jl\"","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#hohqmesh_tutorial","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16: Unstructured meshes with HOHQMesh.jl","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Trixi.jl supports numerical approximations on unstructured quadrilateral meshes with the UnstructuredMesh2D mesh type.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The purpose of this tutorial is to demonstrate how to use the UnstructuredMesh2D functionality of Trixi.jl. This begins by running and visualizing an available unstructured quadrilateral mesh example. Then, the tutorial will demonstrate how to conceptualize a problem with curved boundaries, generate a curvilinear mesh using the available software in the Trixi.jl ecosystem, and then run a simulation using Trixi.jl on said mesh.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Unstructured quadrilateral meshes can be made with the High-Order Hex-Quad Mesh (HOHQMesh) generator created and developed by David Kopriva. HOHQMesh is a mesh generator specifically designed for spectral element methods. It provides high-order boundary curve information (needed to accurately set boundary conditions) and elements can be larger (due to the high accuracy of the spatial approximation) compared to traditional finite element mesh generators. For more information about the design and features of HOHQMesh one can refer to its official documentation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"HOHQMesh is incorporated into the Trixi.jl framework via the registered Julia package HOHQMesh.jl. This package provides a Julia wrapper for the HOHQMesh generator that allows users to easily create mesh files without the need to build HOHQMesh from source. To install the HOHQMesh package execute","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"import Pkg; Pkg.add(\"HOHQMesh\")","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Now we are ready to generate an unstructured quadrilateral mesh that can be used by Trixi.jl.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Running-and-visualizing-an-unstructured-simulation","page":"16 Unstructured meshes with HOHQMesh.jl","title":"Running and visualizing an unstructured simulation","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Trixi.jl supports solving hyperbolic problems on several mesh types. There is a default example for this mesh type that can be executed by","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"using Trixi\nredirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi_include(default_example_unstructured())\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"This will compute a smooth, manufactured solution test case for the 2D compressible Euler equations on the curved quadrilateral mesh described in the Trixi.jl documentation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Apart from the usual error and timing output provided by the Trixi.jl run, it is useful to visualize and inspect the solution. One option available in the Trixi.jl framework to visualize the solution on unstructured quadrilateral meshes is post-processing the Trixi.jl output file(s) with the Trixi2Vtk tool and plotting them with ParaView.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"To convert the HDF5-formatted .h5 output file(s) from Trixi.jl into VTK format execute the following","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"using Trixi2Vtk\nredirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi2vtk(\"out/solution_000180.h5\", output_directory=\"out\")\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Note this step takes about 15-30 seconds as the package Trixi2Vtk must be precompiled and executed for the first time in your REPL session. The trixi2vtk command above will convert the solution file at the final time into a .vtu file which can be read in and visualized with ParaView. Optional arguments for trixi2vtk are: (1) Pointing to the output_directory where the new files will be saved; it defaults to the current directory. (2) Specifying a higher number of visualization nodes. For instance, if we want to use 12 uniformly spaced nodes for visualization we can execute","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"redirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi2vtk(\"out/solution_000180.h5\", output_directory=\"out\", nvisnodes=12)\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"By default trixi2vtk sets nvisnodes to be the same as the number of nodes specified in the elixir file used to run the simulation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Finally, if you want to convert all the solution files to VTK execute","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"redirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\ntrixi2vtk(\"out/solution_000*.h5\", output_directory=\"out\", nvisnodes=12)\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"then it is possible to open the .pvd file with ParaView and create a video of the simulation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Creating-a-mesh-using-HOHQMesh","page":"16 Unstructured meshes with HOHQMesh.jl","title":"Creating a mesh using HOHQMesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The creation of an unstructured quadrilateral mesh using HOHQMesh.jl is driven by a control file. In this file the user dictates the domain to be meshed, prescribes any desired boundary curvature, the polynomial order of said boundaries, etc. In this tutorial we cover several basic features of the possible control inputs. For a complete discussion on this topic see the HOHQMesh control file documentation.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"To begin, we provide a complete control file in this tutorial. After this we give a breakdown of the control file components to explain the chosen parameters.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Suppose we want to create a mesh of a domain with straight sided outer boundaries and a curvilinear \"ice cream cone\" shaped object at its center.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"(Image: mesh_boundary_cartoon)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The associated ice_cream_straight_sides.control file is created below.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"open(\"out/ice_cream_straight_sides.control\", \"w\") do io\n println(io, raw\"\"\"\n\\begin{CONTROL_INPUT}\n \\begin{RUN_PARAMETERS}\n mesh file name = ice_cream_straight_sides.mesh\n plot file name = ice_cream_straight_sides.tec\n stats file name = none\n mesh file format = ISM-v2\n polynomial order = 4\n plot file format = skeleton\n \\end{RUN_PARAMETERS}\n\n \\begin{BACKGROUND_GRID}\n x0 = [-8.0, -8.0, 0.0]\n dx = [1.0, 1.0, 0.0]\n N = [16,16,1]\n \\end{BACKGROUND_GRID}\n\n \\begin{SPRING_SMOOTHER}\n smoothing = ON\n smoothing type = LinearAndCrossBarSpring\n number of iterations = 25\n \\end{SPRING_SMOOTHER}\n\n\\end{CONTROL_INPUT}\n\n\\begin{MODEL}\n\n \\begin{INNER_BOUNDARIES}\n\n \\begin{CHAIN}\n name = IceCreamCone\n \\begin{END_POINTS_LINE}\n name = LeftSlant\n xStart = [-2.0, 1.0, 0.0]\n xEnd = [ 0.0, -3.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{END_POINTS_LINE}\n name = RightSlant\n xStart = [ 0.0, -3.0, 0.0]\n xEnd = [ 2.0, 1.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{CIRCULAR_ARC}\n name = IceCream\n units = degrees\n center = [ 0.0, 1.0, 0.0]\n radius = 2.0\n start angle = 0.0\n end angle = 180.0\n \\end{CIRCULAR_ARC}\n \\end{CHAIN}\n\n \\end{INNER_BOUNDARIES}\n\n\\end{MODEL}\n\\end{FILE}\n\"\"\")\nend","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The first three blocks of information are wrapped within a CONTROL_INPUT environment block as they define the core components of the quadrilateral mesh that will be generated.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The first block of information in RUN_PARAMETERS is","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"\\begin{RUN_PARAMETERS}\n mesh file name = ice_cream_straight_sides.mesh\n plot file name = ice_cream_straight_sides.tec\n stats file name = none\n mesh file format = ISM-v2\n polynomial order = 4\n plot file format = skeleton\n\\end{RUN_PARAMETERS}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The mesh and plot file names will be the files created by HOHQMesh once successfully executed. The stats file name is available if you wish to also save a collection of mesh statistics. For this example it is deactivated. These file names given within RUN_PARAMETERS should match that of the control file, and although this is not required by HOHQMesh, it is a useful style convention. The mesh file format ISM-v2 in the format currently required by Trixi.jl. The polynomial order prescribes the order of an interpolant constructed on the Chebyshev-Gauss-Lobatto nodes that is used to represent any curved boundaries on a particular element. The plot file format of skeleton means that visualizing the plot file will only draw the element boundaries (and no internal nodes). Alternatively, the format can be set to sem to visualize the interior nodes of the approximation as well.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The second block of information in BACKGROUND_GRID is","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"\\begin{BACKGROUND_GRID}\n x0 = [-8.0, -8.0, 0.0]\n dx = [1.0, 1.0, 0.0]\n N = [16,16,1]\n\\end{BACKGROUND_GRID}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"This lays a grid of Cartesian elements for the domain beginning at the point x0 as its bottom-left corner. The value of dx, which could differ in each direction if desired, controls the step size taken in each Cartesian direction. The values in N set how many Cartesian box elements are set in each coordinate direction. The above parameters define a 16times 16 element square mesh on -88^2. Further, this sets up four outer boundaries of the domain that are given the default names: Top, Left, Bottom, Right.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The third block of information in SPRING_SMOOTHER is","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"\\begin{SPRING_SMOOTHER}\n smoothing = ON\n smoothing type = LinearAndCrossBarSpring\n number of iterations = 25\n\\end{SPRING_SMOOTHER}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Once HOHQMesh generates the mesh, a spring-mass-dashpot model is created to smooth the mesh and create \"nicer\" quadrilateral elements. The default parameters of Hooke's law for the spring-mass-dashpot model have been selected after a fair amount of experimentation across many meshes. If you wish to deactivate this feature you can set smoothing = OFF (or remove this block from the control file).","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"After the CONTROL_INPUT environment block comes the MODEL environment block. It is here where the user prescribes curved boundary information with either:","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"An OUTER_BOUNDARY (covered in the next section of this tutorial).\nOne or more INNER_BOUNDARIES.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"There are several options to describe the boundary curve data to HOHQMesh like splines or parametric curves.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"For the example ice_cream_straight_sides.control we define three internal boundaries; two straight-sided and one as a circular arc. Within the HOHQMesh control input each curve must be assigned to a CHAIN as shown below in the complete INNER_BOUNDARIES block.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"\\begin{INNER_BOUNDARIES}\n\n \\begin{CHAIN}\n name = IceCreamCone\n \\begin{END_POINTS_LINE}\n name = LeftSlant\n xStart = [-2.0, 1.0, 0.0]\n xEnd = [ 0.0, -3.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{END_POINTS_LINE}\n name = RightSlant\n xStart = [ 0.0, -3.0, 0.0]\n xEnd = [ 2.0, 1.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{CIRCULAR_ARC}\n name = IceCream\n units = degrees\n center = [ 0.0, 1.0, 0.0]\n radius = 2.0\n start angle = 0.0\n end angle = 180.0\n \\end{CIRCULAR_ARC}\n \\end{CHAIN}\n\n\\end{INNER_BOUNDARIES}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"It is important to note there are two name quantities one for the CHAIN and one for the PARAMETRIC_EQUATION_CURVE. The name for the CHAIN is used internally by HOHQMesh, so if you have multiple CHAINs they must be given a unique name. The name for the PARAMETRIC_EQUATION_CURVE will be printed to the appropriate boundaries within the .mesh file produced by HOHQMesh.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"We create the mesh file ice_cream_straight_sides.mesh and its associated file for plotting ice_cream_straight_sides.tec by using HOHQMesh.jl's function generate_mesh.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"using HOHQMesh\ncontrol_file = joinpath(\"out\", \"ice_cream_straight_sides.control\")\noutput = generate_mesh(control_file);\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The mesh file ice_cream_straight_sides.mesh and its associated file for plotting ice_cream_straight_sides.tec are placed in the out folder. The resulting mesh generated by HOHQMesh.jl is given in the following figure.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"(Image: mesh_straight_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"We note that Trixi.jl uses the boundary name information from the control file to assign boundary conditions in an elixir file. Therefore, the name should start with a letter and consist only of alphanumeric characters and underscores. Please note that the name will be treated as case sensitive.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Example-simulation-on-ice_cream_straight_sides.mesh","page":"16 Unstructured meshes with HOHQMesh.jl","title":"Example simulation on ice_cream_straight_sides.mesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"With this newly generated mesh we are ready to run a Trixi.jl simulation on an unstructured quadrilateral mesh. For this we must create a new elixir file.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The elixir file given below creates an initial condition for a uniform background flow state with a free stream Mach number of 0.3. A focus for this part of the tutorial is to specify the boundary conditions and to construct the new mesh from the file that was generated in the previous exercise.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"It is straightforward to set the different boundary condition types in an elixir by assigning a particular function to a boundary name inside a Julia dictionary, Dict, variable. Observe that the names of these boundaries match those provided by HOHQMesh either by default, e.g. Bottom, or user assigned, e.g. IceCream. For this problem setup use","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Freestream boundary conditions on the four box edges.\nFree slip wall boundary condition on the interior curved boundaries.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"To construct the unstructured quadrilateral mesh from the HOHQMesh file we point to the appropriate location with the variable mesh_file and then feed this into the constructor for the UnstructuredMesh2D type in Trixi.jl","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"# create the unstructured mesh from your mesh file\nusing Trixi\nmesh_file = joinpath(\"out\", \"ice_cream_straight_sides.mesh\")\nmesh = UnstructuredMesh2D(mesh_file);","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The complete elixir file for this simulation example is given below.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"using OrdinaryDiffEq, Trixi\n\nequations = CompressibleEulerEquations2D(1.4) # set gas gamma = 1.4\n\n# freestream flow state with Ma_inf = 0.3\n@inline function uniform_flow_state(x, t, equations::CompressibleEulerEquations2D)\n\n # set the freestream flow parameters\n rho_freestream = 1.0\n u_freestream = 0.3\n p_freestream = inv(equations.gamma)\n\n theta = 0.0 # zero angle of attack\n si, co = sincos(theta)\n v1 = u_freestream * co\n v2 = u_freestream * si\n\n prim = SVector(rho_freestream, v1, v2, p_freestream)\n return prim2cons(prim, equations)\nend\n\n# initial condition\ninitial_condition = uniform_flow_state\n\n# boundary condition types\nboundary_condition_uniform_flow = BoundaryConditionDirichlet(uniform_flow_state)\n\n# boundary condition dictionary\nboundary_conditions = Dict( :Bottom => boundary_condition_uniform_flow,\n :Top => boundary_condition_uniform_flow,\n :Right => boundary_condition_uniform_flow,\n :Left => boundary_condition_uniform_flow,\n :LeftSlant => boundary_condition_slip_wall,\n :RightSlant => boundary_condition_slip_wall,\n :IceCream => boundary_condition_slip_wall );\n\n# DGSEM solver.\n# 1) polydeg must be >= the polynomial order set in the HOHQMesh control file to guarantee\n# freestream preservation. As a extra task try setting polydeg=3\n# 2) VolumeIntegralFluxDifferencing with central volume flux is activated\n# for dealiasing\nvolume_flux = flux_ranocha\nsolver = DGSEM(polydeg=4, surface_flux=flux_hll,\n volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n\n# create the unstructured mesh from your mesh file\nmesh_file = joinpath(\"out\", \"ice_cream_straight_sides.mesh\")\nmesh = UnstructuredMesh2D(mesh_file)\n\n# Create semidiscretization with all spatial discretization-related components\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n boundary_conditions=boundary_conditions)\n\n# Create ODE problem from semidiscretization with time span from 0.0 to 2.0\ntspan = (0.0, 2.0)\node = semidiscretize(semi, tspan)\n\n\n# Create the callbacks to output solution files and adapt the time step\nsummary_callback = SummaryCallback()\nsave_solution = SaveSolutionCallback(interval=10,\n save_initial_solution=true,\n save_final_solution=true)\nstepsize_callback = StepsizeCallback(cfl=1.0)\n\ncallbacks = CallbackSet(summary_callback, save_solution, stepsize_callback)\n\nredirect_stdio(stdout=devnull, stderr=devnull) do # code that prints annoying stuff we don't want to see here #hide\n# Evolve ODE problem in time using `solve` from OrdinaryDiffEq\nsol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback\n save_everystep=false, callback=callbacks);\n# print the timer summary\nsummary_callback()\nend #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Visualization of the solution is carried out in a similar way as above. That is, one converts the .h5 output files with trixi2vtk and then plot the solution in ParaView. An example plot of the pressure at the final time is shown below.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"(Image: simulation_straight_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Making-a-mesh-with-a-curved-outer-boundary","page":"16 Unstructured meshes with HOHQMesh.jl","title":"Making a mesh with a curved outer boundary","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Let us modify the mesh from the previous task and place a circular outer boundary instead of straight-sided outer boundaries. Note, the \"ice cream cone\" shape is still placed at the center of the domain.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"We create the new control file ice_cream_curved_sides.control file below and will then highlight the major differences compared to ice_cream_straight_sides.control.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"open(\"out/ice_cream_curved_sides.control\", \"w\") do io\n println(io, raw\"\"\"\n\\begin{CONTROL_INPUT}\n \\begin{RUN_PARAMETERS}\n mesh file name = ice_cream_curved_sides.mesh\n plot file name = ice_cream_curved_sides.tec\n stats file name = none\n mesh file format = ISM-v2\n polynomial order = 4\n plot file format = skeleton\n \\end{RUN_PARAMETERS}\n\n \\begin{BACKGROUND_GRID}\n background grid size = [1.0, 1.0, 0.0]\n \\end{BACKGROUND_GRID}\n\n \\begin{SPRING_SMOOTHER}\n smoothing = ON\n smoothing type = LinearAndCrossBarSpring\n number of iterations = 25\n \\end{SPRING_SMOOTHER}\n\n\\end{CONTROL_INPUT}\n\n\\begin{MODEL}\n\n \\begin{OUTER_BOUNDARY}\n \\begin{PARAMETRIC_EQUATION_CURVE}\n name = OuterCircle\n xEqn = x(t) = 8.0*sin(2.0*pi*t)\n yEqn = y(t) = 8.0*cos(2.0*pi*t)\n zEqn = z(t) = 0.0\n \\end{PARAMETRIC_EQUATION_CURVE}\n\n \\end{OUTER_BOUNDARY}\n\n \\begin{INNER_BOUNDARIES}\n\n \\begin{CHAIN}\n name = IceCreamCone\n \\begin{END_POINTS_LINE}\n name = LeftSlant\n xStart = [-2.0, 1.0, 0.0]\n xEnd = [ 0.0, -3.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{END_POINTS_LINE}\n name = RightSlant\n xStart = [ 0.0, -3.0, 0.0]\n xEnd = [ 2.0, 1.0, 0.0]\n \\end{END_POINTS_LINE}\n\n \\begin{CIRCULAR_ARC}\n name = IceCream\n units = degrees\n center = [ 0.0, 1.0, 0.0]\n radius = 2.0\n start angle = 0.0\n end angle = 180.0\n \\end{CIRCULAR_ARC}\n \\end{CHAIN}\n\n \\end{INNER_BOUNDARIES}\n\n\\end{MODEL}\n\\end{FILE}\n\"\"\")\nend","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The first alteration is that we have altered the second block of information BACKGROUND_GRID within the CONTROL_INPUT to be","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"\\begin{BACKGROUND_GRID}\n background grid size = [1.0, 1.0, 0.0]\n\\end{BACKGROUND_GRID}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"This mesh control file has an outer boundary that determines the extent of the domain to be meshed. Therefore, we only need to supply the background grid size to the BACKGROUND_GRID control input.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The second alteration is that the MODEL now contains information for an OUTER_BOUNDARY. In this case it is a circle of radius 8 centered at [0.0, 0.0, 0.0] written as a set of PARAMETRIC_EQUATION_CURVEs.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":" \\begin{OUTER_BOUNDARY}\n\n \\begin{PARAMETRIC_EQUATION_CURVE}\n name = OuterCircle\n xEqn = x(t) = 8.0*sin(2.0*pi*t)\n yEqn = y(t) = 8.0*cos(2.0*pi*t)\n zEqn = z(t) = 0.0\n \\end{PARAMETRIC_EQUATION_CURVE}\n\n \\end{OUTER_BOUNDARY}","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Just as with the inner boundary curves, we must assign a name to the OUTER_BOUNDARY. It will be included in the generated .mesh file and is used within the Trixi.jl elixir file to set boundary conditions.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Again, we create the .mesh and .tec files with HOHQMesh.jl's function generate_mesh","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"control_file = joinpath(\"out\", \"ice_cream_curved_sides.control\")\noutput = generate_mesh(control_file);\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The files are placed in the out folder.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The resulting mesh generated by HOHQMesh.jl is given in the following figure.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"(Image: mesh_curved_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Running-Trixi.jl-on-ice_cream_curved_sides.mesh","page":"16 Unstructured meshes with HOHQMesh.jl","title":"Running Trixi.jl on ice_cream_curved_sides.mesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"We can reuse much of the elixir file to setup the uniform flow over an ice cream cone from the previous part of this tutorial. The only component of the elixir file that must be changed is the boundary condition dictionary because we now have a boundary named OuterCircle instead of four edges of a bounding box.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"# boundary condition dictionary\nboundary_conditions = Dict( :OuterCircle => boundary_condition_uniform_flow,\n :LeftSlant => boundary_condition_slip_wall,\n :RightSlant => boundary_condition_slip_wall,\n :IceCream => boundary_condition_slip_wall );\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Also, we must update the construction of the mesh from our new mesh file ice_cream_curved_sides.mesh that is located in the out folder.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"# create the unstructured mesh from your mesh file\nmesh_file = joinpath(\"out\", \"ice_cream_curved_sides.mesh\")\nmesh = UnstructuredMesh2D(mesh_file);\nnothing #hide","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"We can then post-process the solution file at the final time on the new mesh with Trixi2Vtk and visualize with ParaView.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"(Image: simulation_curved_sides)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Setting-up-a-simulation-with-AMR-via-P4estMesh","page":"16 Unstructured meshes with HOHQMesh.jl","title":"Setting up a simulation with AMR via P4estMesh","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"The above explained mesh file format of ISM-V2 only works with UnstructuredMesh2D and so does not support AMR. On the other hand, the mesh type P4estMesh allows AMR. The mesh constructor for the P4estMesh imports an unstructured, conforming mesh from an Abaqus mesh file (.inp).","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"As described above, the first block of the HOHQMesh control file contains the parameter mesh file format. If you set mesh file format = ABAQUS instead of ISM-V2, HOHQMesh.jl's function generate_mesh creates an Abaqus mesh file .inp.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"using HOHQMesh\ncontrol_file = joinpath(\"out\", \"ice_cream_straight_sides.control\")\noutput = generate_mesh(control_file);","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Now, you can create a P4estMesh from your mesh file. It is described in detail in the P4est-based mesh part of the Trixi.jl docs.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"using Trixi\nmesh_file = joinpath(\"out\", \"ice_cream_straight_sides.inp\")\nmesh = P4estMesh{2}(mesh_file)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"Since P4estMesh supports AMR, we just have to extend the setup from the first example by the standard AMR procedure. For more information about AMR in Trixi.jl, see the matching tutorial.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"amr_indicator = IndicatorLöhner(semi, variable=density)\n\namr_controller = ControllerThreeLevel(semi, amr_indicator,\n base_level=0,\n med_level =1, med_threshold=0.05,\n max_level =3, max_threshold=0.1)\n\namr_callback = AMRCallback(semi, amr_controller,\n interval=5,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true)\n\ncallbacks = CallbackSet(..., amr_callback)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"We can then post-process the solution file at the final time on the new mesh with Trixi2Vtk and visualize with ParaView, see the appropriate visualization section for details.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"(Image: simulation_straight_sides_p4est_amr)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/#Package-versions","page":"16 Unstructured meshes with HOHQMesh.jl","title":"Package versions","text":"","category":"section"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\", \"Trixi2Vtk\", \"HOHQMesh\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"","category":"page"},{"location":"tutorials/hohqmesh_tutorial/","page":"16 Unstructured meshes with HOHQMesh.jl","title":"16 Unstructured meshes with HOHQMesh.jl","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"EditURL = \"../../literate/src/files/DGMulti_2.jl\"","category":"page"},{"location":"tutorials/DGMulti_2/#DGMulti_2","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8: Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"","category":"section"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly\nD = derivative_operator(MattssonNordström2004(), derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"D = periodic_derivative_operator(derivative_order=1, accuracy_order=2,\n xmin=0.0, xmax=1.0, N=11)","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"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","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly\nD = couple_continuously(legendre_derivative_operator(xmin=0.0, xmax=1.0, N=4),\n UniformPeriodicMesh1D(xmin=-1.0, xmax=1.0, Nx=10))","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"To choose a discontinuous coupling (DGSEM), use couple_discontinuously() instead of couple_continuously().","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"For more information and other SBP operators, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.","category":"page"},{"location":"tutorials/DGMulti_2/#Package-versions","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"Package versions","text":"","category":"section"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"StartUpDG\", \"SummationByPartsOperators\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"","category":"page"},{"location":"tutorials/DGMulti_2/","page":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"EditURL = \"../../literate/src/files/parabolic_terms.jl\"","category":"page"},{"location":"tutorials/parabolic_terms/#parabolic_terms","page":"12 Parabolic terms","title":"12: Parabolic terms","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"Experimental support for parabolic diffusion terms is available in Trixi.jl. This demo illustrates parabolic terms for the advection-diffusion equation.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"using OrdinaryDiffEq\nusing Trixi","category":"page"},{"location":"tutorials/parabolic_terms/#Splitting-a-system-into-hyperbolic-and-parabolic-parts.","page":"12 Parabolic terms","title":"Splitting a system into hyperbolic and parabolic parts.","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"For a mixed hyperbolic-parabolic system, we represent the hyperbolic and parabolic parts of the system separately. We first define the hyperbolic (advection) part of the advection-diffusion equation.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"advection_velocity = (1.5, 1.0)\nequations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"Next, we define the parabolic diffusion term. The constructor requires knowledge of equations_hyperbolic to be passed in because the LaplaceDiffusion2D applies diffusion to every variable of the hyperbolic system.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"diffusivity = 5.0e-2\nequations_parabolic = LaplaceDiffusion2D(diffusivity, equations_hyperbolic);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/#Boundary-conditions","page":"12 Parabolic terms","title":"Boundary conditions","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"As with the equations, we define boundary conditions separately for the hyperbolic and parabolic part of the system. For this example, we impose inflow BCs for the hyperbolic system (no condition is imposed on the outflow), and we impose Dirichlet boundary conditions for the parabolic equations. Both BoundaryConditionDirichlet and BoundaryConditionNeumann are defined for LaplaceDiffusion2D.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"The hyperbolic and parabolic boundary conditions are assumed to be consistent with each other.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"boundary_condition_zero_dirichlet = BoundaryConditionDirichlet((x, t, equations) -> SVector(0.0))\n\nboundary_conditions_hyperbolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1 + 0.5 * x[2])),\n y_neg = boundary_condition_zero_dirichlet,\n y_pos = boundary_condition_do_nothing,\n x_pos = boundary_condition_do_nothing)\n\nboundary_conditions_parabolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1 + 0.5 * x[2])),\n y_neg = boundary_condition_zero_dirichlet,\n y_pos = boundary_condition_zero_dirichlet,\n x_pos = boundary_condition_zero_dirichlet);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/#Defining-the-solver-and-mesh","page":"12 Parabolic terms","title":"Defining the solver and mesh","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"The process of creating the DG solver and mesh is the same as for a purely hyperbolic system of equations.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\ncoordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))\ncoordinates_max = ( 1.0, 1.0) # maximum coordinates (max(x), max(y))\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4,\n periodicity=false, n_cells_max=30_000) # set maximum capacity of tree data structure\n\ninitial_condition = (x, t, equations) -> SVector(0.0);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/#Semidiscretizing-and-solving","page":"12 Parabolic terms","title":"Semidiscretizing and solving","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"To semidiscretize a hyperbolic-parabolic system, we create a SemidiscretizationHyperbolicParabolic. This differs from a SemidiscretizationHyperbolic in that we pass in a Tuple containing both the hyperbolic and parabolic equation, as well as a Tuple containing the hyperbolic and parabolic boundary conditions.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"semi = SemidiscretizationHyperbolicParabolic(mesh,\n (equations_hyperbolic, equations_parabolic),\n initial_condition, solver;\n boundary_conditions=(boundary_conditions_hyperbolic,\n boundary_conditions_parabolic))","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"The rest of the code is identical to the hyperbolic case. We create a system of ODEs through semidiscretize, defining callbacks, and then passing the system to OrdinaryDiffEq.jl.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"tspan = (0.0, 1.5)\node = semidiscretize(semi, tspan)\ncallbacks = CallbackSet(SummaryCallback())\ntime_int_tol = 1.0e-6\nsol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,\n ode_default_options()..., callback=callbacks);\nnothing #hide","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"We can now visualize the solution, which develops a boundary layer at the outflow boundaries.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"using Plots\nplot(sol)","category":"page"},{"location":"tutorials/parabolic_terms/#Package-versions","page":"12 Parabolic terms","title":"Package versions","text":"","category":"section"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"","category":"page"},{"location":"tutorials/parabolic_terms/","page":"12 Parabolic terms","title":"12 Parabolic terms","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"EditURL = \"../../literate/src/files/index.jl\"","category":"page"},{"location":"tutorials/introduction/#Tutorials-for-Trixi.jl","page":"Introduction","title":"Tutorials for Trixi.jl","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"The tutorial section for Trixi.jl also contains interactive step-by-step explanations via Binder.","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Right now, you are using the classic documentation. The corresponding interactive notebooks can be opened in Binder and viewed in nbviewer via the icons (Image: ) and (Image: ) in the respective tutorial. You can also open the raw notebook files via (Image: ).","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"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.","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"There are tutorials for the following topics:","category":"page"},{"location":"tutorials/introduction/#[1-First-steps-in-Trixi.jl](@ref-getting_started)","page":"Introduction","title":"1 First steps in Trixi.jl","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial provides guidance for getting started with Trixi.jl, and Julia as well. It outlines the installation procedures for both Julia and Trixi.jl, the execution of Trixi.jl elixirs, the fundamental structure of a Trixi.jl setup, the visualization of results, and the development process for Trixi.jl.","category":"page"},{"location":"tutorials/introduction/#[2-Behind-the-scenes-of-a-simulation-setup](@ref-behind_the_scenes_simulation_setup)","page":"Introduction","title":"2 Behind the scenes of a simulation setup","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial will guide you through a simple Trixi.jl setup (\"elixir\"), giving an overview of what happens in the background during the initialization of a simulation. While the setup described herein does not cover all details, it involves relatively stable parts of Trixi.jl that are unlikely to undergo significant changes in the near future. The goal is to clarify some of the more fundamental, technical concepts that are applicable to a variety of (also more complex) configurations.s","category":"page"},{"location":"tutorials/introduction/#[3-Introduction-to-DG-methods](@ref-scalar_linear_advection_1d)","page":"Introduction","title":"3 Introduction to DG methods","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial gives an introduction to discontinuous Galerkin (DG) methods with the example of the scalar linear advection equation in 1D. Starting with some theoretical explanations, we first implement a raw version of a discontinuous Galerkin spectral element method (DGSEM). Then, we will show how to use features of Trixi.jl to achieve the same result.","category":"page"},{"location":"tutorials/introduction/#[4-DGSEM-with-flux-differencing](@ref-DGSEM_FluxDiff)","page":"Introduction","title":"4 DGSEM with flux differencing","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"To improve stability often the flux differencing formulation of the DGSEM (split form) is used. We want to present the idea and formulation on a basic 1D level. Then, we show how this formulation can be implemented in Trixi.jl and analyse entropy conservation for two different flux combinations.","category":"page"},{"location":"tutorials/introduction/#[5-Shock-capturing-with-flux-differencing-and-stage-limiter](@ref-shock_capturing)","page":"Introduction","title":"5 Shock capturing with flux differencing and stage limiter","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Using the flux differencing formulation, a simple procedure to capture shocks is a hybrid blending of a high-order DG method and a low-order subcell finite volume (FV) method. We present the idea on a very basic level and show the implementation in Trixi.jl. Then, a positivity preserving limiter is explained and added to an exemplary simulation of the Sedov blast wave with the 2D compressible Euler equations.","category":"page"},{"location":"tutorials/introduction/#[6-Non-periodic-boundary-conditions](@ref-non_periodic_boundaries)","page":"Introduction","title":"6 Non-periodic boundary conditions","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Thus far, all examples used periodic boundaries. In Trixi.jl, you can also set up a simulation with non-periodic boundaries. This tutorial presents the implementation of the classical Dirichlet boundary condition with a following example. Then, other non-periodic boundaries are mentioned.","category":"page"},{"location":"tutorials/introduction/#[7-DG-schemes-via-DGMulti-solver](@ref-DGMulti_1)","page":"Introduction","title":"7 DG schemes via DGMulti solver","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial is about the more general DG solver DGMulti, introduced here. We are showing some examples for this solver, for instance with discretization nodes by Gauss or triangular elements. Moreover, we present a simple way to include pre-defined triangulate meshes for non-Cartesian domains using the package StartUpDG.jl.","category":"page"},{"location":"tutorials/introduction/#[8-Other-SBP-schemes-(FD,-CGSEM)-via-DGMulti-solver](@ref-DGMulti_2)","page":"Introduction","title":"8 Other SBP schemes (FD, CGSEM) via DGMulti solver","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Supplementary to the previous tutorial about DG schemes via the DGMulti solver we now present the possibility for DGMulti to use other SBP schemes via the package SummationByPartsOperators.jl. For instance, we show how to set up a finite differences (FD) scheme and a continuous Galerkin (CGSEM) method.","category":"page"},{"location":"tutorials/introduction/#[9-Upwind-FD-SBP-schemes](@ref-upwind_fdsbp)","page":"Introduction","title":"9 Upwind FD SBP schemes","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"General SBP schemes can not only be used via the DGMulti solver but also with a general DG solver. In particular, upwind finite difference SBP methods can be used together with the TreeMesh. Similar to general SBP schemes in the DGMulti framework, the interface is based on the package SummationByPartsOperators.jl.","category":"page"},{"location":"tutorials/introduction/#[10-Adding-a-new-scalar-conservation-law](@ref-adding_new_scalar_equations)","page":"Introduction","title":"10 Adding a new scalar conservation law","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial explains how to add a new physics model using the example of the cubic conservation law. First, we define the equation using a struct CubicEquation and the physical flux. Then, the corresponding standard setup in Trixi.jl (mesh, solver, semi and ode) is implemented and the ODE problem is solved by OrdinaryDiffEq's solve method.","category":"page"},{"location":"tutorials/introduction/#[11-Adding-a-non-conservative-equation](@ref-adding_nonconservative_equation)","page":"Introduction","title":"11 Adding a non-conservative equation","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"In this part, another physics model is implemented, the nonconservative linear advection equation. We run two different simulations with different levels of refinement and compare the resulting errors.","category":"page"},{"location":"tutorials/introduction/#[12-Parabolic-terms](@ref-parabolic_terms)","page":"Introduction","title":"12 Parabolic terms","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial describes how parabolic terms are implemented in Trixi.jl, e.g., to solve the advection-diffusion equation.","category":"page"},{"location":"tutorials/introduction/#[13-Adding-new-parabolic-terms](@ref-adding_new_parabolic_terms)","page":"Introduction","title":"13 Adding new parabolic terms","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial describes how new parabolic terms can be implemented using Trixi.jl.","category":"page"},{"location":"tutorials/introduction/#[14-Adaptive-mesh-refinement](@ref-adaptive_mesh_refinement)","page":"Introduction","title":"14 Adaptive mesh refinement","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Adaptive mesh refinement (AMR) helps to increase the accuracy in sensitive or turbolent regions while not wasting resources for less interesting parts of the domain. This leads to much more efficient simulations. This tutorial presents the implementation strategy of AMR in Trixi.jl, including the use of different indicators and controllers.","category":"page"},{"location":"tutorials/introduction/#[15-Structured-mesh-with-curvilinear-mapping](@ref-structured_mesh_mapping)","page":"Introduction","title":"15 Structured mesh with curvilinear mapping","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"In this tutorial, the use of Trixi.jl's structured curved mesh type StructuredMesh is explained. We present the two basic option to initialize such a mesh. First, the curved domain boundaries of a circular cylinder are set by explicit boundary functions. Then, a fully curved mesh is defined by passing the transformation mapping.","category":"page"},{"location":"tutorials/introduction/#[16-Unstructured-meshes-with-HOHQMesh.jl](@ref-hohqmesh_tutorial)","page":"Introduction","title":"16 Unstructured meshes with HOHQMesh.jl","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"The purpose of this tutorial is to demonstrate how to use the UnstructuredMesh2D functionality of Trixi.jl. This begins by running and visualizing an available unstructured quadrilateral mesh example. Then, the tutorial will demonstrate how to conceptualize a problem with curved boundaries, generate a curvilinear mesh using the available HOHQMesh software in the Trixi.jl ecosystem, and then run a simulation using Trixi.jl on said mesh. In the end, the tutorial briefly explains how to simulate an example using AMR via P4estMesh.","category":"page"},{"location":"tutorials/introduction/#[17-P4est-mesh-from-gmsh](@ref-p4est_from_gmsh)","page":"Introduction","title":"17 P4est mesh from gmsh","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial describes how to obtain a P4estMesh from an existing mesh generated by gmsh or any other meshing software that can export to the Abaqus input .inp format. The tutorial demonstrates how edges/faces can be associated with boundary conditions based on the physical nodesets.","category":"page"},{"location":"tutorials/introduction/#[18-Explicit-time-stepping](@ref-time_stepping)","page":"Introduction","title":"18 Explicit time stepping","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial is about time integration using OrdinaryDiffEq.jl. It explains how to use their algorithms and presents two types of time step choices - with error-based and CFL-based adaptive step size control.","category":"page"},{"location":"tutorials/introduction/#[19-Differentiable-programming](@ref-differentiable_programming)","page":"Introduction","title":"19 Differentiable programming","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This part deals with some basic differentiable programming topics. For example, a Jacobian, its eigenvalues and a curve of total energy (through the simulation) are calculated and plotted for a few semidiscretizations. Moreover, we calculate an example for propagating errors with Measurement.jl at the end.","category":"page"},{"location":"tutorials/introduction/#[20-Custom-semidiscretization](@ref-custom_semidiscretization)","page":"Introduction","title":"20 Custom semidiscretization","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This tutorial describes the semidiscretiations of Trixi.jl and explains how to extend them for custom tasks.","category":"page"},{"location":"tutorials/introduction/#Examples-in-Trixi.jl","page":"Introduction","title":"Examples in Trixi.jl","text":"","category":"section"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"Trixi.jl already contains several more coding examples, the so-called elixirs. You can find them in the folder examples/. They are structured by the underlying mesh type and the respective number of spatial dimensions. The name of an elixir is composed of the underlying system of conservation equations (for instance advection or euler) and other special characteristics like the initial condition (e.g. gauss, astro_jet, blast_wave) or the included simulation features (e.g. amr, shockcapturing).","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"","category":"page"},{"location":"tutorials/introduction/","page":"Introduction","title":"Introduction","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"EditURL = \"../../../literate/src/files/first_steps/changing_trixi.jl\"","category":"page"},{"location":"tutorials/first_steps/changing_trixi/#changing_trixi","page":"1.3 Changing Trixi.jl itself","title":"1.3: First steps in Trixi.jl: Changing Trixi.jl itself","text":"","category":"section"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"If you plan on editing Trixi.jl itself, you can download Trixi.jl locally and run it from the cloned directory.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/#Cloning-Trixi.jl","page":"1.3 Changing Trixi.jl itself","title":"Cloning Trixi.jl","text":"","category":"section"},{"location":"tutorials/first_steps/changing_trixi/#Windows","page":"1.3 Changing Trixi.jl itself","title":"Windows","text":"","category":"section"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"If you are using Windows, you can clone Trixi.jl by using the GitHub Desktop tool:","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"If you do not have a GitHub account yet, create it on the GitHub website.\nDownload and install GitHub Desktop and then log in to your account.\nOpen GitHub Desktop, press Ctrl+Shift+O.\nIn the opened window, paste trixi-framework/Trixi.jl and choose the path to the folder where you want to save Trixi.jl. Then click Clone and Trixi.jl will be cloned to your computer.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"Now you cloned Trixi.jl and only need to tell Julia to use the local clone as the package sources:","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"Open a terminal using Win+r and cmd. Navigate to the folder with the cloned Trixi.jl using cd.\nCreate a new directory run, enter it, and start Julia with the --project=. flag:\nmkdir run\ncd run\njulia --project=.\nNow run the following commands to install all relevant packages:\nusing Pkg; Pkg.develop(PackageSpec(path=\"..\")) # Tell Julia to use the local Trixi.jl clone\nPkg.add([\"OrdinaryDiffEq\", \"Plots\"]) # Install additional packages","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"Now you already installed Trixi.jl from your local clone. Note that if you installed Trixi.jl this way, you always have to start Julia with the --project flag set to your run directory, e.g.,","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"julia --project=.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"if already inside the run directory.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/#Linux","page":"1.3 Changing Trixi.jl itself","title":"Linux","text":"","category":"section"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"You can clone Trixi.jl to your computer by executing the following commands:","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"git clone git@github.com:trixi-framework/Trixi.jl.git\n# If an error occurs, try the following:\n# git clone https://github.com/trixi-framework/Trixi.jl\ncd Trixi.jl\nmkdir run\ncd run\njulia --project=. -e 'using Pkg; Pkg.develop(PackageSpec(path=\"..\"))' # Tell Julia to use the local Trixi.jl clone\njulia --project=. -e 'using Pkg; Pkg.add([\"OrdinaryDiffEq\", \"Plots\"])' # Install additional packages","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"Note that if you installed Trixi.jl this way, you always have to start Julia with the --project flag set to your run directory, e.g.,","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"julia --project=.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"if already inside the run directory.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/#Additional-reading","page":"1.3 Changing Trixi.jl itself","title":"Additional reading","text":"","category":"section"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"To further delve into Trixi.jl, you may have a look at the following introductory tutorials.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"Introduction to DG methods will teach you how to set up a simple way to approximate the solution of a hyperbolic partial differential equation. It will be especially useful to learn about the Discontinuous Galerkin method and the way it is implemented in Trixi.jl.\nAdding a new scalar conservation law and Adding a non-conservative equation describe how to add new physics models that are not yet included in Trixi.jl.\nCallbacks gives an overview of how to regularly execute specific actions during a simulation, e.g., to store the solution or adapt the mesh.","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"","category":"page"},{"location":"tutorials/first_steps/changing_trixi/","page":"1.3 Changing Trixi.jl itself","title":"1.3 Changing Trixi.jl itself","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference-trixi/#Trixi.jl-API","page":"Trixi.jl","title":"Trixi.jl API","text":"","category":"section"},{"location":"reference-trixi/","page":"Trixi.jl","title":"Trixi.jl","text":"CurrentModule = Trixi","category":"page"},{"location":"reference-trixi/","page":"Trixi.jl","title":"Trixi.jl","text":"Modules = [Trixi]","category":"page"},{"location":"reference-trixi/#Trixi.Trixi","page":"Trixi.jl","title":"Trixi.Trixi","text":"Trixi\n\nTrixi.jl is a numerical simulation framework for hyperbolic conservation laws. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi.jl is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures.\n\nTo get started, run your first simulation with Trixi.jl using\n\ntrixi_include(default_example())\n\nSee also: trixi-framework/Trixi.jl\n\n\n\n\n\n","category":"module"},{"location":"reference-trixi/#Trixi.boundary_condition_do_nothing","page":"Trixi.jl","title":"Trixi.boundary_condition_do_nothing","text":"boundary_condition_do_nothing = Trixi.BoundaryConditionDoNothing()\n\nImposing no boundary condition just evaluates the flux at the inner state.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.boundary_condition_periodic","page":"Trixi.jl","title":"Trixi.boundary_condition_periodic","text":"boundary_condition_periodic = Trixi.BoundaryConditionPeriodic()\n\nA singleton struct indicating periodic boundary conditions.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.flux_hll","page":"Trixi.jl","title":"Trixi.flux_hll","text":"flux_hll\n\nSee FluxHLL.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.flux_hlle","page":"Trixi.jl","title":"Trixi.flux_hlle","text":"flux_hlle\n\nSee min_max_speed_einfeldt. This is a FluxHLL-type two-wave solver with special estimates of the wave speeds.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.flux_lax_friedrichs","page":"Trixi.jl","title":"Trixi.flux_lax_friedrichs","text":"flux_lax_friedrichs\n\nSee FluxLaxFriedrichs.\n\n\n\n\n\n","category":"constant"},{"location":"reference-trixi/#Trixi.AMRCallback","page":"Trixi.jl","title":"Trixi.AMRCallback","text":"AMRCallback(semi, controller [,adaptor=AdaptorAMR(semi)];\n interval,\n adapt_initial_condition=true,\n adapt_initial_condition_only_refine=true,\n dynamic_load_balancing=true)\n\nPerforms adaptive mesh refinement (AMR) every interval time steps for a given semidiscretization semi using the chosen controller.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AbstractEquations","page":"Trixi.jl","title":"Trixi.AbstractEquations","text":"AbstractEquations{NDIMS, NVARS}\n\nAn abstract supertype of specific equations such as the compressible Euler equations. The type parameters encode the number of spatial dimensions (NDIMS) and the number of primary variables (NVARS) of the physics model.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AbstractMesh","page":"Trixi.jl","title":"Trixi.AbstractMesh","text":"AbstractMesh{NDIMS}\n\nAn abstract supertype of specific mesh types such as TreeMesh or StructuredMesh. The type parameters encode the number of spatial dimensions (NDIMS).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AcousticPerturbationEquations2D","page":"Trixi.jl","title":"Trixi.AcousticPerturbationEquations2D","text":"AcousticPerturbationEquations2D(v_mean_global, c_mean_global, rho_mean_global)\n\nAcoustic perturbation equations (APE) in two space dimensions. The equations are given by\n\nbeginaligned\n fracpartialmathbfvpartial t + nabla (barmathbfvcdotmathbfv)\n + nablaleft( fracbarc^2 tildepbarrho right) = 0 \n fracpartial tildeppartial t +\n nablacdot (barrho mathbfv + barmathbfv tildep) = 0\nendaligned\n\nThe bar bar(cdot) indicates time-averaged quantities. The unknowns of the APE are the perturbed velocities mathbfv = (v_1 v_2)^T and the scaled perturbed pressure tildep = fracpbarc^2, where p denotes the perturbed pressure and the perturbed variables are defined by phi = phi - barphi.\n\nIn addition to the unknowns, Trixi.jl currently stores the mean values in the state vector, i.e. the state vector used internally is given by\n\nmathbfu =\n beginpmatrix\n v_1 v_2 tildep barv_1 barv_2 barc barrho\n endpmatrix\n\nThis affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the mean values must be zero.\nThe mean values have to be considered when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes these variables too.\nTrixi.jl's visualization tools will visualize the mean values by default.\n\nThe constructor accepts a 2-tuple v_mean_global and scalars c_mean_global and rho_mean_global which can be used to make the definition of initial conditions for problems with constant mean flow more flexible. These values are ignored if the mean values are defined internally in an initial condition.\n\nThe equations are based on the APE-4 system introduced in the following paper:\n\nRoland Ewert and Wolfgang Schröder (2003) Acoustic perturbation equations based on flow decomposition via source filtering DOI: 10.1016/S0021-9991(03)00168-2\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.Adiabatic","page":"Trixi.jl","title":"Trixi.Adiabatic","text":"struct Adiabatic\n\nUsed to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_normal_flux_function should be a function with signature boundary_value_normal_flux_function(x, t, equations) and return a scalar value for the normal heat flux at point x and time t.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AliveCallback","page":"Trixi.jl","title":"Trixi.AliveCallback","text":"AliveCallback(analysis_interval=0, alive_interval=analysis_interval÷10)\n\nInexpensive callback showing that a simulation is still running by printing some information such as the current time to the screen every alive_interval time steps. If analysis_interval ≂̸ 0, the output is omitted every analysis_interval time steps.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AnalysisCallback","page":"Trixi.jl","title":"Trixi.AnalysisCallback","text":"AnalysisCallback(semi; interval=0,\n save_analysis=false,\n output_directory=\"out\",\n analysis_filename=\"analysis.dat\",\n extra_analysis_errors=Symbol[],\n extra_analysis_integrals=())\n\nAnalyze a numerical solution every interval time steps and print the results to the screen. If save_analysis, the results are also saved in joinpath(output_directory, analysis_filename).\n\nAdditional errors can be computed, e.g. by passing extra_analysis_errors = (:l2_error_primitive, :linf_error_primitive) or extra_analysis_errors = (:conservation_error,).\n\nIf you want to omit the computation (to safe compute-time) of the default_analysis_errors, specify analysis_errors = Symbol[]. Note: default_analysis_errors are :l2_error and :linf_error for all equations. If you want to compute extra_analysis_errors such as :conservation_error solely, i.e., without :l2_error, :linf_error you need to specify analysis_errors = [:conservation_error] instead of extra_analysis_errors = [:conservation_error].\n\nFurther scalar functions func in extra_analysis_integrals are applied to the numerical solution and integrated over the computational domain. Some examples for this are entropy, energy_kinetic, energy_internal, and energy_total. You can also write your own function with the same signature as the examples listed above and pass it via extra_analysis_integrals. See the developer comments about Trixi.analyze, Trixi.pretty_form_utf, and Trixi.pretty_form_ascii for further information on how to create custom analysis quantities.\n\nIn addition, the analysis callback records and outputs a number of quantities that are useful for evaluating the computational performance, such as the total runtime, the performance index (time/DOF/rhs!), the time spent in garbage collection (GC), or the current memory usage (alloc'd memory).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AnalysisCallbackCoupled","page":"Trixi.jl","title":"Trixi.AnalysisCallbackCoupled","text":"AnalysisCallbackCoupled(semi, callbacks...)\n\nCombine multiple analysis callbacks for coupled simulations with a SemidiscretizationCoupled. For each coupled system, an indididual AnalysisCallback must be created and passed to the AnalysisCallbackCoupled in order, i.e., in the same sequence as the indidvidual semidiscretizations are stored in the SemidiscretizationCoupled.\n\nwarning: Experimental code\nThis is an experimental feature and can change any time.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.AveragingCallback","page":"Trixi.jl","title":"Trixi.AveragingCallback","text":"AveragingCallback(semi::SemidiscretizationHyperbolic, tspan; output_directory=\"out\",\n filename=\"averaging.h5\")\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nA callback that averages the flow field described by semi which must be a semidiscretization of the compressible Euler equations in two dimensions. The callback records the mean velocity, mean speed of sound, mean density, and mean vorticity for each node over the time interval given by tspan and stores the results in an HDF5 file filename in the directory output_directory. Note that this callback does not support adaptive mesh refinement (AMRCallback).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionCoupled","page":"Trixi.jl","title":"Trixi.BoundaryConditionCoupled","text":"BoundaryConditionCoupled(other_semi_index, indices, uEltype, coupling_converter)\n\nBoundary condition to glue two meshes together. Solution values at the boundary of another mesh will be used as boundary values. This requires the use of SemidiscretizationCoupled. The other mesh is specified by other_semi_index, which is the index of the mesh in the tuple of semidiscretizations.\n\nNote that the elements and nodes of the two meshes at the coupled boundary must coincide. This is currently only implemented for StructuredMesh.\n\nArguments\n\nother_semi_index: the index in SemidiscretizationCoupled of the semidiscretization from which the values are copied\nindices::Tuple: node/cell indices at the boundary of the mesh in the other semidiscretization. See examples below.\nuEltype::Type: element type of solution\ncoupling_converter::CouplingConverter: function to call for converting the solution state of one system to the other system\n\nExamples\n\n# Connect the left boundary of mesh 2 to our boundary such that our positive\n# boundary direction will match the positive y direction of the other boundary\nBoundaryConditionCoupled(2, (:begin, :i), Float64, fun)\n\n# Connect the same two boundaries oppositely oriented\nBoundaryConditionCoupled(2, (:begin, :i_backwards), Float64, fun)\n\n# Using this as y_neg boundary will connect `our_cells[i, 1, j]` to `other_cells[j, end-i, end]`\nBoundaryConditionCoupled(2, (:j, :i_backwards, :end), Float64, fun)\n\nwarning: Experimental code\nThis is an experimental feature and can change any time.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionDirichlet","page":"Trixi.jl","title":"Trixi.BoundaryConditionDirichlet","text":"BoundaryConditionDirichlet(boundary_value_function)\n\nCreate a Dirichlet boundary condition that uses the function boundary_value_function to specify the values at the boundary. This can be used to create a boundary condition that specifies exact boundary values by passing the exact solution of the equation. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as\n\nboundary_value_function(x, t, equations)\n\nwhere x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.\n\nExamples\n\njulia> BoundaryConditionDirichlet(initial_condition_convergence_test)\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionNavierStokesWall","page":"Trixi.jl","title":"Trixi.BoundaryConditionNavierStokesWall","text":"struct BoundaryConditionNavierStokesWall\n\nCreates a wall-type boundary conditions for the compressible Navier-Stokes equations. The fields boundary_condition_velocity and boundary_condition_heat_flux are intended to be boundary condition types such as the NoSlip velocity boundary condition and the Adiabatic or Isothermal heat boundary condition.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundaryConditionNeumann","page":"Trixi.jl","title":"Trixi.BoundaryConditionNeumann","text":"BoundaryConditionNeumann(boundary_normal_flux_function)\n\nSimilar to BoundaryConditionDirichlet, but creates a Neumann boundary condition for parabolic equations that uses the function boundary_normal_flux_function to specify the values of the normal flux at the boundary. The passed boundary value function will be called with the same arguments as an initial condition function is called, i.e., as\n\nboundary_normal_flux_function(x, t, equations)\n\nwhere x specifies the coordinates, t is the current time, and equation is the corresponding system of equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.BoundsCheckCallback","page":"Trixi.jl","title":"Trixi.BoundsCheckCallback","text":"BoundsCheckCallback(; output_directory=\"out\", save_errors=false, interval=1)\n\nSubcell limiting techniques with SubcellLimiterIDP are constructed to adhere certain local or global bounds. To make sure that these bounds are actually met, this callback calculates the maximum deviation from the bounds. The maximum deviation per applied bound is printed to the screen at the end of the simulation. For more insights, when setting save_errors=true the occurring errors are exported every interval time steps during the simulation. Then, the maximum deviations since the last export are saved in \"output_directory/deviations.txt\". The BoundsCheckCallback has to be applied as a stage callback for the SSPRK time integration scheme.\n\nnote: Note\nFor SubcellLimiterIDP, the solution is corrected in the a posteriori correction stage SubcellLimiterIDPCorrection. So, to check the final solution, this bounds check callback must be called after the correction stage.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CarpenterKennedy2N43","page":"Trixi.jl","title":"Trixi.CarpenterKennedy2N43","text":" CarpenterKennedy2N43()\n\nCarpenter, Kennedy (1994) Third order 2N storage RK schemes with error control\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CarpenterKennedy2N54","page":"Trixi.jl","title":"Trixi.CarpenterKennedy2N54","text":"CarpenterKennedy2N54()\n\nThe following structures and methods provide a minimal implementation of the low-storage explicit Runge-Kutta method of\n\nCarpenter, Kennedy (1994) Fourth order 2N storage RK schemes, Solution 3\n\nusing the same interface as OrdinaryDiffEq.jl.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquations1D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquations1D","text":"CompressibleEulerEquations1D(gamma)\n\nThe compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\nrho v_1 rho v_1^2 + p (rho e +p) v_1\nendpmatrix\n=\nbeginpmatrix\n0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in one space dimension. Here, rho is the density, v_1 the velocity, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho v_1^2 right)\n\nthe pressure.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquations2D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquations2D","text":"CompressibleEulerEquations2D(gamma)\n\nThe compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho v_2 rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v_1 rho v_1^2 + p rho v_1 v_2 (rho e +p) v_1\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_2 rho v_1 v_2 rho v_2^2 + p (rho e +p) v_2\nendpmatrix\n=\nbeginpmatrix\n0 0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in two space dimensions. Here, rho is the density, v_1, v_2 the velocities, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2) right)\n\nthe pressure.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquations3D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquations3D","text":"CompressibleEulerEquations3D(gamma)\n\nThe compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho v_2 rho v_3 rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v_1 rho v_1^2 + p rho v_1 v_2 rho v_1 v_3 ( rho e +p) v_1\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_2 rho v_1 v_2 rho v_2^2 + p rho v_1 v_3 ( rho e +p) v_2\nendpmatrix\n+\nfracpartialpartial z\nbeginpmatrix\nrho v_3 rho v_1 v_3 rho v_2 v_3 rho v_3^2 + p ( rho e +p) v_3\nendpmatrix\n=\nbeginpmatrix\n0 0 0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in three space dimensions. Here, rho is the density, v_1, v_2, v_3 the velocities, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2+v_3^2) right)\n\nthe pressure.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerEquationsQuasi1D","page":"Trixi.jl","title":"Trixi.CompressibleEulerEquationsQuasi1D","text":"CompressibleEulerEquationsQuasi1D(gamma)\n\nThe quasi-1d compressible Euler equations (see Chan et al. DOI: 10.48550/arXiv.2307.12089 for details)\n\nfracpartialpartial t\nbeginpmatrix\na rho a rho v_1 a e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\na rho v_1 a rho v_1^2 a v_1 (e +p)\nendpmatrix\n+ \na fracpartialpartial x\nbeginpmatrix\n0 p 0 \nendpmatrix\n=\nbeginpmatrix\n0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in one space dimension. Here, rho is the density, v_1 the velocity, e the specific total energy rather than specific internal energy, a the (possibly) variable nozzle width, and\n\np = (gamma - 1) left( e - frac12 rho v_1^2 right)\n\nthe pressure.\n\nThe nozzle width function a(x) is set inside the initial condition routine for a particular problem setup. To test the conservative form of the compressible Euler equations one can set the nozzle width variable a to one. \n\nIn addition to the unknowns, Trixi.jl currently stores the nozzle width values at the approximation points despite being fixed in time. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the nozzle width must be zero.\nThe nozzle width values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the nozzle width by default.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerMulticomponentEquations1D","page":"Trixi.jl","title":"Trixi.CompressibleEulerMulticomponentEquations1D","text":"CompressibleEulerMulticomponentEquations1D(; gammas, gas_constants)\n\nMulticomponent version of the compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho v_1 rho e rho_1 rho_2 vdots rho_n\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\nrho v_1^2 + p (rho e +p) v_1 rho_1 v_1 rho_2 v_1 vdots rho_n v_1\nendpmatrix\n\n=\nbeginpmatrix\n0 0 0 0 vdots 0\nendpmatrix\n\nfor calorically perfect gas in one space dimension. Here, rho_i is the density of component i, rho=sum_i=1^nrho_i the sum of the individual rho_i, v_1 the velocity, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho v_1^2 right)\n\nthe pressure,\n\ngamma=fracsum_i=1^nrho_i C_vigamma_isum_i=1^nrho_i C_vi\n\ntotal heat capacity ratio, gamma_i heat capacity ratio of component i,\n\nC_vi=fracRgamma_i-1\n\nspecific heat capacity at constant volume of component i.\n\nIn case of more than one component, the specific heat ratios gammas and the gas constants gas_constants should be passed as tuples, e.g., gammas=(1.4, 1.667).\n\nThe remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleEulerMulticomponentEquations2D","page":"Trixi.jl","title":"Trixi.CompressibleEulerMulticomponentEquations2D","text":"CompressibleEulerMulticomponentEquations2D(; gammas, gas_constants)\n\nMulticomponent version of the compressible Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho v_1 rho v_2 rho e rho_1 rho_2 vdots rho_n\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\nrho v_1^2 + p rho v_1 v_2 ( rho e +p) v_1 rho_1 v_1 rho_2 v_1 vdots rho_n v_1\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_1 v_2 rho v_2^2 + p ( rho e +p) v_2 rho_1 v_2 rho_2 v_2 vdots rho_n v_2\nendpmatrix\n=\nbeginpmatrix\n0 0 0 0 0 vdots 0\nendpmatrix\n\nfor calorically perfect gas in two space dimensions. Here, rho_i is the density of component i, rho=sum_i=1^nrho_i the sum of the individual rho_i, v_1, v_2 the velocities, e the specific total energy rather than specific internal energy, and\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2 + v_2^2) right)\n\nthe pressure,\n\ngamma=fracsum_i=1^nrho_i C_vigamma_isum_i=1^nrho_i C_vi\n\ntotal heat capacity ratio, gamma_i heat capacity ratio of component i,\n\nC_vi=fracRgamma_i-1\n\nspecific heat capacity at constant volume of component i.\n\nIn case of more than one component, the specific heat ratios gammas and the gas constants gas_constants in [kJ/(kg*K)] should be passed as tuples, e.g., gammas=(1.4, 1.667).\n\nThe remaining variables like the specific heats at constant volume cv or the specific heats at constant pressure cp are then calculated considering a calorically perfect gas.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleNavierStokesDiffusion1D","page":"Trixi.jl","title":"Trixi.CompressibleNavierStokesDiffusion1D","text":"CompressibleNavierStokesDiffusion1D(equations; mu, Pr,\n gradient_variables=GradientVariablesPrimitive())\n\nContains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations1D.\n\nequations: instance of the CompressibleEulerEquations1D\nmu: dynamic viscosity,\nPr: Prandtl number,\ngradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().\n\nFluid properties such as the dynamic viscosity mu can be provided in any consistent unit system, e.g., [mu] = kg m⁻¹ s⁻¹.\n\nThe particular form of the compressible Navier-Stokes implemented is\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v rho e\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v rho v^2 + p (rho e + p) v\nendpmatrix\n=\nfracpartialpartial x\nbeginpmatrix\n0 tau tau v - q\nendpmatrix\n\nwhere the system is closed with the ideal gas assumption giving\n\np = (gamma - 1) left( rho e - frac12 rho v^2 right)\n\nas the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations1D. The terms on the right hand side of the system above are built from the viscous stress\n\ntau = mu fracpartialpartial x v\n\nwhere the heat flux is\n\nq = -kappa fracpartialpartial x left(Tright)quad T = fracpRrho\n\nwhere T is the temperature and kappa is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is\n\nkappa = fracgamma mu R(gamma - 1)textrmPr\n\nFrom this combination of temperature T and thermal conductivity kappa we see that the gas constant R cancels and the heat flux becomes\n\nq = -kappa fracpartialpartial x left(Tright) = -fracgamma mu(gamma - 1)textrmPr fracpartialpartial x left(fracprhoright)\n\nwhich is the form implemented below in the flux function.\n\nIn one spatial dimensions we require gradients for two quantities, e.g., primitive quantities\n\nfracpartialpartial x v fracpartialpartial x T\n\nor the entropy variables\n\nfracpartialpartial x w_2 fracpartialpartial x w_3\n\nwhere\n\nw_2 = fracrho v1p w_3 = -fracrhop\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleNavierStokesDiffusion2D","page":"Trixi.jl","title":"Trixi.CompressibleNavierStokesDiffusion2D","text":"CompressibleNavierStokesDiffusion2D(equations; mu, Pr,\n gradient_variables=GradientVariablesPrimitive())\n\nContains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations2D.\n\nequations: instance of the CompressibleEulerEquations2D\nmu: dynamic viscosity,\nPr: Prandtl number,\ngradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().\n\nFluid properties such as the dynamic viscosity mu can be provided in any consistent unit system, e.g., [mu] = kg m⁻¹ s⁻¹.\n\nThe particular form of the compressible Navier-Stokes implemented is\n\nfracpartialpartial t\nbeginpmatrix\nrho rho mathbfv rho e\nendpmatrix\n+\nnabla cdot\nbeginpmatrix\n rho mathbfv rho mathbfvmathbfv^T + p underlineI (rho e + p) mathbfv\nendpmatrix\n=\nnabla cdot\nbeginpmatrix\n0 underlinetau underlinetaumathbfv - mathbfq\nendpmatrix\n\nwhere the system is closed with the ideal gas assumption giving\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2) right)\n\nas the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor\n\nunderlinetau = mu left(nablamathbfv + left(nablamathbfvright)^Tright) - frac23 mu left(nablacdotmathbfvright)underlineI\n\nwhere underlineI is the 2times 2 identity matrix and the heat flux is\n\nmathbfq = -kappanablaleft(Tright)quad T = fracpRrho\n\nwhere T is the temperature and kappa is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is\n\nkappa = fracgamma mu R(gamma - 1)textrmPr\n\nFrom this combination of temperature T and thermal conductivity kappa we see that the gas constant R cancels and the heat flux becomes\n\nmathbfq = -kappanablaleft(Tright) = -fracgamma mu(gamma - 1)textrmPrnablaleft(fracprhoright)\n\nwhich is the form implemented below in the flux function.\n\nIn two spatial dimensions we require gradients for three quantities, e.g., primitive quantities\n\nnabla v_1 nabla v_2 nabla T\n\nor the entropy variables\n\nnabla w_2 nabla w_3 nabla w_4\n\nwhere\n\nw_2 = fracrho v_1p w_3 = fracrho v_2p w_4 = -fracrhop\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.CompressibleNavierStokesDiffusion3D","page":"Trixi.jl","title":"Trixi.CompressibleNavierStokesDiffusion3D","text":"CompressibleNavierStokesDiffusion3D(equations; mu, Pr,\n gradient_variables=GradientVariablesPrimitive())\n\nContains the diffusion (i.e. parabolic) terms applied to mass, momenta, and total energy together with the advective terms from the CompressibleEulerEquations3D.\n\nequations: instance of the CompressibleEulerEquations3D\nmu: dynamic viscosity,\nPr: Prandtl number,\ngradient_variables: which variables the gradients are taken with respect to. Defaults to GradientVariablesPrimitive().\n\nFluid properties such as the dynamic viscosity mu can be provided in any consistent unit system, e.g., [mu] = kg m⁻¹ s⁻¹.\n\nThe particular form of the compressible Navier-Stokes implemented is\n\nfracpartialpartial t\nbeginpmatrix\nrho rho mathbfv rho e\nendpmatrix\n+\nnabla cdot\nbeginpmatrix\n rho mathbfv rho mathbfvmathbfv^T + p underlineI (rho e + p) mathbfv\nendpmatrix\n=\nnabla cdot\nbeginpmatrix\n0 underlinetau underlinetaumathbfv - mathbfq\nendpmatrix\n\nwhere the system is closed with the ideal gas assumption giving\n\np = (gamma - 1) left( rho e - frac12 rho (v_1^2+v_2^2+v_3^2) right)\n\nas the pressure. The value of the adiabatic constant gamma is taken from the CompressibleEulerEquations2D. The terms on the right hand side of the system above are built from the viscous stress tensor\n\nunderlinetau = mu left(nablamathbfv + left(nablamathbfvright)^Tright) - frac23 mu left(nablacdotmathbfvright)underlineI\n\nwhere underlineI is the 3times 3 identity matrix and the heat flux is\n\nmathbfq = -kappanablaleft(Tright)quad T = fracpRrho\n\nwhere T is the temperature and kappa is the thermal conductivity for Fick's law. Under the assumption that the gas has a constant Prandtl number, the thermal conductivity is\n\nkappa = fracgamma mu R(gamma - 1)textrmPr\n\nFrom this combination of temperature T and thermal conductivity kappa we see that the gas constant R cancels and the heat flux becomes\n\nmathbfq = -kappanablaleft(Tright) = -fracgamma mu(gamma - 1)textrmPrnablaleft(fracprhoright)\n\nwhich is the form implemented below in the flux function.\n\nIn two spatial dimensions we require gradients for three quantities, e.g., primitive quantities\n\nnabla v_1 nabla v_2 nabla v_3 nabla T\n\nor the entropy variables\n\nnabla w_2 nabla w_3 nabla w_4 nabla w_5\n\nwhere\n\nw_2 = fracrho v_1p w_3 = fracrho v_2p w_4 = fracrho v_3p w_5 = -fracrhop\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ControllerThreeLevel","page":"Trixi.jl","title":"Trixi.ControllerThreeLevel","text":"ControllerThreeLevel(semi, indicator; base_level=1,\n med_level=base_level, med_threshold=0.0,\n max_level=base_level, max_threshold=1.0)\n\nAn AMR controller based on three levels (in descending order of precedence):\n\nset the target level to max_level if indicator > max_threshold\nset the target level to med_level if indicator > med_threshold; if med_level < 0, set the target level to the current level\nset the target level to base_level otherwise\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ControllerThreeLevelCombined","page":"Trixi.jl","title":"Trixi.ControllerThreeLevelCombined","text":"ControllerThreeLevelCombined(semi, indicator_primary, indicator_secondary;\n base_level=1,\n med_level=base_level, med_threshold=0.0,\n max_level=base_level, max_threshold=1.0,\n max_threshold_secondary=1.0)\n\nAn AMR controller based on three levels (in descending order of precedence):\n\nset the target level to max_level if indicator_primary > max_threshold\nset the target level to med_level if indicator_primary > med_threshold; if med_level < 0, set the target level to the current level\nset the target level to base_level otherwise\n\nIf indicator_secondary >= max_threshold_secondary, set the target level to max_level.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DG","page":"Trixi.jl","title":"Trixi.DG","text":"DG(; basis, mortar, surface_integral, volume_integral)\n\nCreate a discontinuous Galerkin method. If basis isa LobattoLegendreBasis, this creates a DGSEM.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DGMulti-Tuple{SummationByPartsOperators.AbstractDerivativeOperator}","page":"Trixi.jl","title":"Trixi.DGMulti","text":"DGMulti(approximation_type::AbstractDerivativeOperator;\n element_type::AbstractElemShape,\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n kwargs...)\n\nCreate a summation by parts (SBP) discretization on the given element_type using a tensor product structure based on the 1D SBP derivative operator passed as approximation_type.\n\nFor more info, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMulti-Tuple{}","page":"Trixi.jl","title":"Trixi.DGMulti","text":"DGMulti(; polydeg::Integer,\n element_type::AbstractElemShape,\n approximation_type=Polynomial(),\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n RefElemData_kwargs...)\n\nCreate a discontinuous Galerkin method which uses\n\napproximations of polynomial degree polydeg\nelement type element_type (Tri(), Quad(), Tet(), and Hex() currently supported)\n\nOptional:\n\napproximation_type (default is Polynomial(); SBP() also supported for Tri(), Quad(), and Hex() element types).\nRefElemData_kwargs are additional keyword arguments for RefElemData, such as quad_rule_vol. For more info, see the StartUpDG.jl docs.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh{NDIMS, ...}\n\nDGMultiMesh describes a mesh type which wraps StartUpDG.MeshData and boundary_faces in a dispatchable type. This is intended to store geometric data and connectivities for any type of mesh (Cartesian, affine, curved, structured/unstructured).\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Tuple{DGMulti{2, Tri, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{2, Tri, ApproxType}} where {ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any, Dict{Symbol, Int64}}","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti{2, Tri}, triangulateIO, boundary_dict::Dict{Symbol, Int})\n\ndg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).\ntriangulateIO is a TriangulateIO mesh representation\nboundary_dict is a Dict{Symbol, Int} which associates each integer TriangulateIO boundary tag with a Symbol.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType<:SummationByPartsOperators.AbstractPeriodicDerivativeOperator, SurfaceIntegral, VolumeIntegral, Mortar}}, Tuple{NDIMS}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti)\n\nConstructs a single-element DGMultiMesh for a single periodic element given a DGMulti with approximation_type set to a periodic (finite difference) SBP operator from SummationByPartsOperators.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any, AbstractArray}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti{NDIMS}, vertex_coordinates, EToV;\n is_on_boundary=nothing,\n periodicity=ntuple(_->false, NDIMS)) where {NDIMS}\n\ndg::DGMulti contains information associated with to the reference element (e.g., quadrature, basis evaluation, differentiation, etc).\nvertex_coordinates is a tuple of vectors containing x,y,... components of the vertex coordinates\nEToV is a 2D array containing element-to-vertex connectivities for each element\nis_on_boundary specifies boundary using a Dict{Symbol, <:Function}\nperiodicity is a tuple of booleans specifying if the domain is periodic true/false in the (x,y,z) direction.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any, Any}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti{NDIMS}, cells_per_dimension, mapping;\n is_on_boundary=nothing,\n periodicity=ntuple(_ -> false, NDIMS), kwargs...) where {NDIMS}\n\nConstructs a Curved() DGMultiMesh with element type dg.basis.element_type.\n\nmapping is a function which maps from a reference [-1, 1]^NDIMS domain to a mapped domain, e.g., xy = mapping(x, y) in 2D.\nis_on_boundary specifies boundary using a Dict{Symbol, <:Function}\nperiodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, Any}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti, cells_per_dimension;\n coordinates_min=(-1.0, -1.0), coordinates_max=(1.0, 1.0),\n is_on_boundary=nothing,\n periodicity=ntuple(_ -> false, NDIMS))\n\nConstructs a Cartesian DGMultiMesh with element type dg.basis.element_type. The domain is the tensor product of the intervals [coordinates_min[i], coordinates_max[i]].\n\nis_on_boundary specifies boundary using a Dict{Symbol, <:Function}\nperiodicity is a tuple of Bools specifying periodicity = true/false in the (x,y,z) direction.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiMesh-Union{Tuple{NDIMS}, Tuple{DGMulti{NDIMS, ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar, <:StartUpDG.RefElemData{NDIMS, ElemType, ApproxType}} where {ElemType, ApproxType, SurfaceIntegral, VolumeIntegral, Mortar}, String}} where NDIMS","page":"Trixi.jl","title":"Trixi.DGMultiMesh","text":"DGMultiMesh(dg::DGMulti, filename::String)\n\ndg::DGMulti contains information associated with the reference element (e.g., quadrature, basis evaluation, differentiation, etc).\nfilename is a path specifying a .mesh file generated by HOHQMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGSEM","page":"Trixi.jl","title":"Trixi.DGSEM","text":"DGSEM(; RealT=Float64, polydeg::Integer,\n surface_flux=flux_central,\n surface_integral=SurfaceIntegralWeakForm(surface_flux),\n volume_integral=VolumeIntegralWeakForm(),\n mortar=MortarL2(basis))\n\nCreate a discontinuous Galerkin spectral element method (DGSEM) using a LobattoLegendreBasis with polynomials of degree polydeg.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DissipationGlobalLaxFriedrichs","page":"Trixi.jl","title":"Trixi.DissipationGlobalLaxFriedrichs","text":"DissipationGlobalLaxFriedrichs(λ)\n\nCreate a global Lax-Friedrichs dissipation operator with dissipation coefficient λ.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.DissipationLocalLaxFriedrichs","page":"Trixi.jl","title":"Trixi.DissipationLocalLaxFriedrichs","text":"DissipationLocalLaxFriedrichs(max_abs_speed=max_abs_speed_naive)\n\nCreate a local Lax-Friedrichs dissipation operator where the maximum absolute wave speed is estimated as max_abs_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to max_abs_speed_naive.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.EulerAcousticsCouplingCallback","page":"Trixi.jl","title":"Trixi.EulerAcousticsCouplingCallback","text":"EulerAcousticsCouplingCallback\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nA callback that couples the acoustic perturbation equations and compressible Euler equations. Must be used in conjunction with SemidiscretizationEulerAcoustics. This callback manages the flow solver - which is always one time step ahead of the acoustics solver - and calculates the acoustic source term after each time step. The linearized Lamb vector is used as the source term, i.e.\n\nmathbfs = -(mathbfomega times barmathbfv\n + barmathbfomega times mathbfv)\n\nwhere mathbfv denotes the velocity, mathbfomega denotes the vorticity, the bar bar(cdot) indicates time-averaged quantities (see AveragingCallback) and prime (cdot) denotes perturbed quantities defined by phi = phi - barphi. Note that the perturbed quantities here are based entirely on the pure flow solution and should not be confused with the state variables of the acoustic perturbation equations.\n\nIn addition, this callback manages the time step size for both solvers and initializes the mean values of the acoustic perturbation equations using results obtained with the AveragingCallback.\n\nMichael Schlottke-Lakemper (2017) A direct-hybrid method for aeroacoustic analysis DOI: 10.18154/RWTH-2017-04082\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.EulerAcousticsCouplingCallback-Tuple{Any, AbstractString, Any, Real, Real}","page":"Trixi.jl","title":"Trixi.EulerAcousticsCouplingCallback","text":"EulerAcousticsCouplingCallback(ode_euler, averaging_file::AbstractString, alg,\n cfl_acoustics::Real, cfl_euler::Real; kwargs...)\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nCreates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_file (see AveragingCallback).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.EulerAcousticsCouplingCallback-Tuple{Any, DiscreteCallback{<:Any, <:AveragingCallback}, Any, Real, Real}","page":"Trixi.jl","title":"Trixi.EulerAcousticsCouplingCallback","text":"EulerAcousticsCouplingCallback(ode_euler,\n averaging_callback::DiscreteCallback{<:Any, <:AveragingCallback},\n alg, cfl_acoustics::Real, cfl_euler::Real; kwargs...)\n\nwarning: Experimental code\nThis callback is experimental and may change in any future release.\n\nCreates an EulerAcousticsCouplingCallback based on the pure flow ODEProblem given by ode_euler. Creates an integrator using the time integration method alg and the keyword arguments to solve ode_euler (consult the OrdinaryDiffEq documentation for further information). Manages the step size for both solvers by using the minimum of the maximum step size obtained with CFL numbers cfl_acoustics for the acoustics solver and cfl_euler for and flow solver, respectively. The mean values for the acoustic perturbation equations are read from averaging_callback (see AveragingCallback).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.FDSBP","page":"Trixi.jl","title":"Trixi.FDSBP","text":"FDSBP(D_SBP; surface_integral, volume_integral)\n\nSpecialization of DG methods that uses general summation by parts (SBP) operators from SummationByPartsOperators.jl. In particular, this includes classical finite difference (FD) SBP methods. These methods have the same structure as classical DG methods - local operations on elements with connectivity through interfaces without imposing any continuity constraints.\n\nD_SBP is an SBP derivative operator from SummationByPartsOperators.jl. The other arguments have the same meaning as in DG or DGSEM.\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxHLL","page":"Trixi.jl","title":"Trixi.FluxHLL","text":"FluxHLL(min_max_speed=min_max_speed_davis)\n\nCreate an HLL (Harten, Lax, van Leer) numerical flux where the minimum and maximum wave speeds are estimated as λ_min, λ_max = min_max_speed(u_ll, u_rr, orientation_or_normal_direction, equations), defaulting to min_max_speed_davis. Original paper:\n\nAmiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxHydrostaticReconstruction","page":"Trixi.jl","title":"Trixi.FluxHydrostaticReconstruction","text":"FluxHydrostaticReconstruction(numerical_flux, hydrostatic_reconstruction)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nAllow for some kind of hydrostatic reconstruction of the solution state prior to the surface flux computation. This is a particular strategy to ensure that the method remains well-balanced for the shallow water equations, see ShallowWaterEquations1D or ShallowWaterEquations2D.\n\nFor example, the hydrostatic reconstruction from Audusse et al. is implemented in one and two spatial dimensions, see hydrostatic_reconstruction_audusse_etal or the original paper\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\nOther hydrostatic reconstruction techniques are available, particularly to handle wet / dry fronts. A good overview of the development and application of hydrostatic reconstruction can be found in\n\nGuoxian Chen and Sebastian Noelle A unified surface-gradient and hydrostatic reconstruction scheme for the shallow water equations (2021) RWTH Aachen preprint\nAndreas Buttinger-Kreuzhuber, Zsolt Horváth, Sebastian Noelle, Günter Blöschl and Jürgen Waser (2019) A fast second-order shallow water scheme on two-dimensional structured grids over abrupt topography DOI: 10.1016/j.advwatres.2019.03.010\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxLMARS","page":"Trixi.jl","title":"Trixi.FluxLMARS","text":"FluxLMARS(c)(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations2D)\n\nLow Mach number approximate Riemann solver (LMARS) for atmospheric flows using an estimate c of the speed of sound.\n\nReferences:\n\nXi Chen et al. (2013) A Control-Volume Model of the Compressible Euler Equations with a Vertical Lagrangian Coordinate DOI: 10.1175/MWR-D-12-00129.1\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxLMARS-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.FluxLMARS","text":"FluxLMARS(c)(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nLow Mach number approximate Riemann solver (LMARS) for atmospheric flows using an estimate c of the speed of sound.\n\nReferences:\n\nXi Chen et al. (2013) A Control-Volume Model of the Compressible Euler Equations with a Vertical Lagrangian Coordinate DOI: 10.1175/MWR-D-12-00129.1\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.FluxLaxFriedrichs","page":"Trixi.jl","title":"Trixi.FluxLaxFriedrichs","text":"FluxLaxFriedrichs(max_abs_speed=max_abs_speed_naive)\n\nLocal Lax-Friedrichs (Rusanov) flux with maximum wave speed estimate provided by max_abs_speed, cf. DissipationLocalLaxFriedrichs and max_abs_speed_naive.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxPlusDissipation","page":"Trixi.jl","title":"Trixi.FluxPlusDissipation","text":"FluxPlusDissipation(numerical_flux, dissipation)\n\nCombine a numerical_flux with a dissipation operator to create a new numerical flux.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxRotated","page":"Trixi.jl","title":"Trixi.FluxRotated","text":"FluxRotated(numerical_flux)\n\nCompute a numerical_flux flux in direction of a normal vector by rotating the solution, computing the numerical flux in x-direction, and rotating the calculated flux back.\n\nRequires a rotationally invariant equation with equation-specific functions rotate_to_x and rotate_from_x.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.FluxUpwind","page":"Trixi.jl","title":"Trixi.FluxUpwind","text":"FluxUpwind(splitting)\n\nA numerical flux f(u_left, u_right) = f⁺(u_left) + f⁻(u_right) based on flux vector splitting.\n\nThe SurfaceIntegralUpwind with a given splitting is equivalent to the SurfaceIntegralStrongForm with FluxUpwind(splitting) as numerical flux (up to floating point differences).\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.GlmSpeedCallback","page":"Trixi.jl","title":"Trixi.GlmSpeedCallback","text":"GlmSpeedCallback(; glm_scale=0.5, cfl)\n\nUpdate the divergence cleaning wave speed c_h according to the time step computed in StepsizeCallback for the ideal GLM-MHD equations. The cfl number should be set to the same value as for the time step size calculation. The glm_scale ensures that the GLM wave speed is lower than the fastest physical waves in the MHD solution and should thus be set to a value within the interval [0,1]. Note that glm_scale = 0 deactivates the divergence cleaning.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.GradientVariablesPrimitive","page":"Trixi.jl","title":"Trixi.GradientVariablesPrimitive","text":"GradientVariablesPrimitive and GradientVariablesEntropy are gradient variable type parameters for CompressibleNavierStokesDiffusion1D. By default, the gradient variables are set to be GradientVariablesPrimitive. Specifying GradientVariablesEntropy instead uses the entropy variable formulation from\n\nHughes, Mallet, Franca (1986) A new finite element formulation for computational fluid dynamics: I. Symmetric forms of the compressible Euler and Navier-Stokes equations and the second law of thermodynamics. https://doi.org/10.1016/0045-7825(86)90127-1\n\nUnder GradientVariablesEntropy, the Navier-Stokes discretization is provably entropy stable.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HypDiffN3Erk3Sstar52","page":"Trixi.jl","title":"Trixi.HypDiffN3Erk3Sstar52","text":"HypDiffN3Erk3Sstar52()\n\nFive stage, second-order accurate explicit Runge-Kutta scheme with stability region optimized for the hyperbolic diffusion equation with LLF flux and polynomials of degree polydeg=3.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HyperbolicDiffusionEquations1D","page":"Trixi.jl","title":"Trixi.HyperbolicDiffusionEquations1D","text":"HyperbolicDiffusionEquations1D\n\nThe linear hyperbolic diffusion equations in one space dimension. A description of this system can be found in Sec. 2.5 of the book\n\nMasatsuka (2013) I Do Like CFD, Too: Vol 1. Freely available at http://www.cfdbooks.com/\n\nFurther analysis can be found in the paper\n\nNishikawa (2007) A first-order system approach for diffusion equation. I: Second-order residual-distribution schemes DOI: 10.1016/j.jcp.2007.07.029\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HyperbolicDiffusionEquations2D","page":"Trixi.jl","title":"Trixi.HyperbolicDiffusionEquations2D","text":"HyperbolicDiffusionEquations2D\n\nThe linear hyperbolic diffusion equations in two space dimensions. A description of this system can be found in Sec. 2.5 of the book \"I Do Like CFD, Too: Vol 1\". The book is freely available at http://www.cfdbooks.com/ and further analysis can be found in the paper by Nishikawa DOI: 10.1016/j.jcp.2007.07.029\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.HyperbolicDiffusionEquations3D","page":"Trixi.jl","title":"Trixi.HyperbolicDiffusionEquations3D","text":"HyperbolicDiffusionEquations3D\n\nThe linear hyperbolic diffusion equations in three space dimensions. A description of this system can be found in Sec. 2.5 of the book \"I Do Like CFD, Too: Vol 1\". The book is freely available at http://www.cfdbooks.com/ and further analysis can be found in the paper by Nishikawa DOI: 10.1016/j.jcp.2007.07.029\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdEquations1D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdEquations1D","text":"IdealGlmMhdEquations1D(gamma)\n\nThe ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in one space dimension.\n\nnote: Note\nThere is no divergence cleaning variable psi because the divergence-free constraint is satisfied trivially in one spatial dimension.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdEquations2D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdEquations2D","text":"IdealGlmMhdEquations2D(gamma)\n\nThe ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in two space dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdEquations3D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdEquations3D","text":"IdealGlmMhdEquations3D(gamma)\n\nThe ideal compressible GLM-MHD equations for an ideal gas with ratio of specific heats gamma in three space dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdMulticomponentEquations1D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdMulticomponentEquations1D","text":"IdealGlmMhdMulticomponentEquations1D\n\nThe ideal compressible multicomponent GLM-MHD equations in one space dimension.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IdealGlmMhdMulticomponentEquations2D","page":"Trixi.jl","title":"Trixi.IdealGlmMhdMulticomponentEquations2D","text":"IdealGlmMhdMulticomponentEquations2D\n\nThe ideal compressible multicomponent GLM-MHD equations in two space dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IndicatorHennemannGassner","page":"Trixi.jl","title":"Trixi.IndicatorHennemannGassner","text":"IndicatorHennemannGassner(equations::AbstractEquations, basis;\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable)\nIndicatorHennemannGassner(semi::AbstractSemidiscretization;\n alpha_max=0.5,\n alpha_min=0.001,\n alpha_smooth=true,\n variable)\n\nIndicator used for shock-capturing (when passing the equations and the basis) or adaptive mesh refinement (AMR, when passing the semi).\n\nSee also VolumeIntegralShockCapturingHG.\n\nReferences\n\nHennemann, Gassner (2020) \"A provably entropy stable subcell shock capturing approach for high order split form DG\" arXiv: 2008.12044\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IndicatorLöhner","page":"Trixi.jl","title":"Trixi.IndicatorLöhner","text":"IndicatorLöhner (equivalent to IndicatorLoehner)\n\nIndicatorLöhner(equations::AbstractEquations, basis;\n f_wave=0.2, variable)\nIndicatorLöhner(semi::AbstractSemidiscretization;\n f_wave=0.2, variable)\n\nAMR indicator adapted from a FEM indicator by Löhner (1987), also used in the FLASH code as standard AMR indicator. The indicator estimates a weighted second derivative of a specified variable locally.\n\nWhen constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.\n\nReferences\n\nLöhner (1987) \"An adaptive finite element scheme for transient problems in CFD\" doi: 10.1016/0045-7825(87)90098-3\nhttps://flash.rochester.edu/site/flashcode/usersupport/flash4ug_4p62/node59.html#SECTION05163100000000000000\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.IndicatorMax","page":"Trixi.jl","title":"Trixi.IndicatorMax","text":"IndicatorMax(equations::AbstractEquations, basis; variable)\nIndicatorMax(semi::AbstractSemidiscretization; variable)\n\nA simple indicator returning the maximum of variable in an element. When constructed to be used for AMR, pass the semi. Pass the equations, and basis if this indicator should be used for shock capturing.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.InviscidBurgersEquation1D","page":"Trixi.jl","title":"Trixi.InviscidBurgersEquation1D","text":"InviscidBurgersEquation1D\n\nThe inviscid Burgers' equation\n\npartial_t u + frac12 partial_1 u^2 = 0\n\nin one space dimension.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.Isothermal","page":"Trixi.jl","title":"Trixi.Isothermal","text":"struct Isothermal\n\nUsed to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and return a scalar value for the temperature at point x and time t.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LaplaceDiffusion1D","page":"Trixi.jl","title":"Trixi.LaplaceDiffusion1D","text":"LaplaceDiffusion1D(diffusivity, equations)\n\nLaplaceDiffusion1D represents a scalar diffusion term nabla cdot (kappanabla u)) with diffusivity kappa applied to each solution component defined by equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LaplaceDiffusion2D","page":"Trixi.jl","title":"Trixi.LaplaceDiffusion2D","text":"LaplaceDiffusion2D(diffusivity, equations)\n\nLaplaceDiffusion2D represents a scalar diffusion term nabla cdot (kappanabla u)) with diffusivity kappa applied to each solution component defined by equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LaplaceDiffusion3D","page":"Trixi.jl","title":"Trixi.LaplaceDiffusion3D","text":"LaplaceDiffusion3D(diffusivity, equations)\n\nLaplaceDiffusion3D represents a scalar diffusion term nabla cdot (kappanabla u)) with diffusivity kappa applied to each solution component defined by equations.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LatticeBoltzmannEquations2D","page":"Trixi.jl","title":"Trixi.LatticeBoltzmannEquations2D","text":"LatticeBoltzmannEquations2D(; Ma, Re, collision_op=collision_bgk,\n c=1, L=1, rho0=1, u0=nothing, nu=nothing)\n\nThe Lattice-Boltzmann equations\n\npartial_t u_alpha + v_alpha1 partial_1 u_alpha + v_alpha2 partial_2 u_alpha = 0\n\nin two space dimensions for the D2Q9 scheme.\n\nThe characteristic Mach number and Reynolds numbers are specified as Ma and Re. By the default, the collision operator collision_op is set to the BGK model. c, L, and rho0 specify the mean thermal molecular velocity, the characteristic length, and the reference density, respectively. They can usually be left to the default values. If desired, instead of the Mach number, one can set the macroscopic reference velocity u0 directly (Ma needs to be set to nothing in this case). Likewise, instead of the Reynolds number one can specify the kinematic viscosity nu directly (in this case, Re needs to be set to nothing).\n\nThe nine discrete velocity directions of the D2Q9 scheme are sorted as follows [4]:\n\n 6 2 5 y\n ┌───┼───┐ │\n │ │ │\n 3 ┼ 9 ┼ 1 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 7 4 8 z\n\nNote that usually the velocities are numbered from 0 to 8, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 9, where 1 through 8 correspond to the velocity directions in [4] and 9 is the zero velocity.\n\nThe corresponding opposite directions are:\n\n1 ←→ 3\n2 ←→ 4\n3 ←→ 1\n4 ←→ 2\n5 ←→ 7\n6 ←→ 8\n7 ←→ 5\n8 ←→ 6\n9 ←→ 9\n\nThe main sources for the base implementation were\n\nMisun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024\nKarsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.\nDieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0\nDieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LatticeBoltzmannEquations3D","page":"Trixi.jl","title":"Trixi.LatticeBoltzmannEquations3D","text":"LatticeBoltzmannEquations3D(; Ma, Re, collision_op=collision_bgk,\n c=1, L=1, rho0=1, u0=nothing, nu=nothing)\n\nThe Lattice-Boltzmann equations\n\npartial_t u_alpha + v_alpha1 partial_1 u_alpha + v_alpha2 partial_2 u_alpha + v_alpha3 partial_3 u_alpha = 0\n\nin three space dimensions for the D3Q27 scheme.\n\nThe characteristic Mach number and Reynolds numbers are specified as Ma and Re. By the default, the collision operator collision_op is set to the BGK model. c, L, and rho0 specify the mean thermal molecular velocity, the characteristic length, and the reference density, respectively. They can usually be left to the default values. If desired, instead of the Mach number, one can set the macroscopic reference velocity u0 directly (Ma needs to be set to nothing in this case). Likewise, instead of the Reynolds number one can specify the kinematic viscosity nu directly (in this case, Re needs to be set to nothing).\n\nThe twenty-seven discrete velocity directions of the D3Q27 scheme are sorted as follows [4]:\n\nplane at z = -1:\n 24 17 21 y\n ┌───┼───┐ │\n │ │ │\n 10 ┼ 6 ┼ 15 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 20 12 26 z\nplane at z = 0:\n 14 3 7 y\n ┌───┼───┐ │\n │ │ │\n 2 ┼ 27 ┼ 1 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 8 4 13 z\nplane at z = +1:\n 25 11 19 y\n ┌───┼───┐ │\n │ │ │\n 16 ┼ 5 ┼ 9 ──── x\n │ │ ╱\n └───┼───┘ ╱\n 22 18 23 z\n\nNote that usually the velocities are numbered from 0 to 26, where 0 corresponds to the zero velocity. Due to Julia using 1-based indexing, here we use indices from 1 to 27, where 1 through 26 correspond to the velocity directions in [4] and 27 is the zero velocity.\n\nThe corresponding opposite directions are:\n\n1 ←→ 2\n2 ←→ 1\n3 ←→ 4\n4 ←→ 3\n5 ←→ 6\n6 ←→ 5\n7 ←→ 8\n8 ←→ 7\n9 ←→ 10\n10 ←→ 9\n11 ←→ 12\n12 ←→ 11\n13 ←→ 14\n14 ←→ 13\n15 ←→ 16\n16 ←→ 15\n17 ←→ 18\n18 ←→ 17\n19 ←→ 20\n20 ←→ 19\n21 ←→ 22\n22 ←→ 21\n23 ←→ 24\n24 ←→ 23\n25 ←→ 26\n26 ←→ 25\n27 ←→ 27\n\nThe main sources for the base implementation were\n\nMisun Min, Taehun Lee, A spectral-element discontinuous Galerkin lattice Boltzmann method for nearly incompressible flows, J Comput Phys 230(1), 2011 doi:10.1016/j.jcp.2010.09.024\nKarsten Golly, Anwendung der Lattice-Boltzmann Discontinuous Galerkin Spectral Element Method (LB-DGSEM) auf laminare und turbulente nahezu inkompressible Strömungen im dreidimensionalen Raum, Master Thesis, University of Cologne, 2018.\nDieter Hänel, Molekulare Gasdynamik, Springer-Verlag Berlin Heidelberg, 2004 doi:10.1007/3-540-35047-0\nDieter Krüger et al., The Lattice Boltzmann Method, Springer International Publishing, 2017 doi:10.1007/978-3-319-44649-3\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearScalarAdvectionEquation1D","page":"Trixi.jl","title":"Trixi.LinearScalarAdvectionEquation1D","text":"LinearScalarAdvectionEquation1D\n\nThe linear scalar advection equation\n\npartial_t u + a partial_1 u = 0\n\nin one space dimension with constant velocity a.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearScalarAdvectionEquation2D","page":"Trixi.jl","title":"Trixi.LinearScalarAdvectionEquation2D","text":"LinearScalarAdvectionEquation2D\n\nThe linear scalar advection equation\n\npartial_t u + a_1 partial_1 u + a_2 partial_2 u = 0\n\nin two space dimensions with constant velocity a.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearScalarAdvectionEquation3D","page":"Trixi.jl","title":"Trixi.LinearScalarAdvectionEquation3D","text":"LinearScalarAdvectionEquation3D\n\nThe linear scalar advection equation\n\npartial_t u + a_1 partial_1 u + a_2 partial_2 u + a_3 partial_3 u = 0\n\nin three space dimensions with constant velocity a.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LinearizedEulerEquations2D","page":"Trixi.jl","title":"Trixi.LinearizedEulerEquations2D","text":"LinearizedEulerEquations2D(v_mean_global, c_mean_global, rho_mean_global)\n\nLinearized euler equations in two space dimensions. The equations are given by\n\npartial_t\nbeginpmatrix\n rho v_1 v_2 p\nendpmatrix\n+\npartial_x\nbeginpmatrix\n barrho v_1 + barv_1 rho barv_1 v_1 + fracpbarrho barv_1 v_2 barv_1 p + c^2 barrho v_1\nendpmatrix\n+\npartial_y\nbeginpmatrix\n barrho v_2 + barv_2 rho barv_2 v_1 barv_2 v_2 + fracpbarrho barv_2 p + c^2 barrho v_2\nendpmatrix\n=\nbeginpmatrix\n 0 0 0 0\nendpmatrix\n\nThe bar bar(cdot) indicates uniform mean flow variables and c is the speed of sound. The unknowns are the acoustic velocities v = (v_1 v_2), the pressure p and the density rho.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.LobattoLegendreBasis","page":"Trixi.jl","title":"Trixi.LobattoLegendreBasis","text":"LobattoLegendreBasis([RealT=Float64,] polydeg::Integer)\n\nCreate a nodal Lobatto-Legendre basis for polynomials of degree polydeg.\n\nFor the special case polydeg=0 the DG method reduces to a finite volume method. Therefore, this function sets the center point of the cell as single node.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NoSlip","page":"Trixi.jl","title":"Trixi.NoSlip","text":"struct NoSlip\n\nUse to create a no-slip boundary condition with BoundaryConditionNavierStokesWall. The field boundary_value_function should be a function with signature boundary_value_function(x, t, equations) and should return a SVector{NDIMS} whose entries are the velocity vector at a point x and time t.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NonConservativeLocal","page":"Trixi.jl","title":"Trixi.NonConservativeLocal","text":"NonConservativeLocal()\n\nStruct used for multiple dispatch on non-conservative flux functions in the format of \"local * symmetric\". When the argument nonconservative_type is of type NonConservativeLocal, the function returns the local part of the non-conservative term.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NonConservativeSymmetric","page":"Trixi.jl","title":"Trixi.NonConservativeSymmetric","text":"NonConservativeSymmetric()\n\nStruct used for multiple dispatch on non-conservative flux functions in the format of \"local * symmetric\". When the argument nonconservative_type is of type NonConservativeSymmetric, the function returns the symmetric part of the non-conservative term.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.P4estMesh","page":"Trixi.jl","title":"Trixi.P4estMesh","text":"P4estMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nAn unstructured curved mesh based on trees that uses the C library p4est to manage trees and mesh refinement.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.P4estMesh-Tuple{Any}","page":"Trixi.jl","title":"Trixi.P4estMesh","text":"P4estMesh(trees_per_dimension; polydeg,\n mapping=nothing, faces=nothing, coordinates_min=nothing, coordinates_max=nothing,\n RealT=Float64, initial_refinement_level=0, periodicity=true, unsaved_changes=true,\n p4est_partition_allow_for_coarsening=true)\n\nCreate a structured curved P4estMesh of the specified size.\n\nThere are three ways to map the mesh to the physical domain.\n\nDefine a mapping that maps the hypercube [-1, 1]^n.\nSpecify a Tuple faces of functions that parametrize each face.\nCreate a rectangular mesh by specifying coordinates_min and coordinates_max.\n\nNon-periodic boundaries will be called :x_neg, :x_pos, :y_neg, :y_pos, :z_neg, :z_pos.\n\nArguments\n\ntrees_per_dimension::NTupleE{NDIMS, Int}: the number of trees in each dimension.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.\nmapping: a function of NDIMS variables to describe the mapping that transforms the reference mesh ([-1, 1]^n) to the physical domain. Use only one of mapping, faces and coordinates_min/coordinates_max.\nfaces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D). Use only one of mapping, faces and coordinates_min/coordinates_max.\ncoordinates_min: vector or tuple of the coordinates of the corner in the negative direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.\ncoordinates_max: vector or tuple of the coordinates of the corner in the positive direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\np4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.P4estMesh-Union{Tuple{String}, Tuple{NDIMS}} where NDIMS","page":"Trixi.jl","title":"Trixi.P4estMesh","text":"P4estMesh{NDIMS}(meshfile::String;\n mapping=nothing, polydeg=1, RealT=Float64,\n initial_refinement_level=0, unsaved_changes=true,\n p4est_partition_allow_for_coarsening=true,\n boundary_symbols = nothing)\n\nMain mesh constructor for the P4estMesh that imports an unstructured, conforming mesh from an Abaqus mesh file (.inp). Each element of the conforming mesh parsed from the meshfile is created as a p4est tree datatype.\n\nTo create a curved unstructured mesh P4estMesh two strategies are available:\n\np4est_mesh_from_hohqmesh_abaqus: High-order, curved boundary information created by HOHQMesh.jl is available in the meshfile. The mesh polynomial degree polydeg of the boundaries is provided from the meshfile. The computation of the mapped tree coordinates is done with transfinite interpolation with linear blending similar to UnstructuredMesh2D. Boundary name information is also parsed from the meshfile such that different boundary conditions can be set at each named boundary on a given tree.\np4est_mesh_from_standard_abaqus: By default, with mapping=nothing and polydeg=1, this creates a straight-sided from the information parsed from the meshfile. If a mapping function is specified then it computes the mapped tree coordinates via polynomial interpolants with degree polydeg. The mesh created by this function will only have one boundary :all if boundary_symbols is not specified. If boundary_symbols is specified the mesh file will be parsed for nodesets defining the boundary nodes from which boundary edges (2D) and faces (3D) will be assigned.\n\nNote that the mapping and polydeg keyword arguments are only used by the p4est_mesh_from_standard_abaqus function. The p4est_mesh_from_hohqmesh_abaqus function obtains the mesh polydeg directly from the meshfile and constructs the transfinite mapping internally.\n\nThe particular strategy is selected according to the header present in the meshfile where the constructor checks whether or not the meshfile was created with HOHQMesh.jl. If the Abaqus file header is not present in the meshfile then the P4estMesh is created with the function p4est_mesh_from_standard_abaqus.\n\nThe default keyword argument initial_refinement_level=0 corresponds to a forest where the number of trees is the same as the number of elements in the original meshfile. Increasing the initial_refinement_level allows one to uniformly refine the base mesh given in the meshfile to create a forest with more trees before the simulation begins. For example, if a two-dimensional base mesh contains 25 elements then setting initial_refinement_level=1 creates an initial forest of 2^2 * 25 = 100 trees.\n\nArguments\n\nmeshfile::String: an uncurved Abaqus mesh file that can be imported by p4est.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\np4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.\nboundary_symbols::Vector{Symbol}: A vector of symbols that correspond to the boundary names in the meshfile. If nothing is passed then all boundaries are named :all. \n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ParametersEulerGravity","page":"Trixi.jl","title":"Trixi.ParametersEulerGravity","text":"ParametersEulerGravity(; background_density=0.0,\n gravitational_constant=1.0,\n cfl=1.0,\n resid_tol=1.0e-4,\n n_iterations_max=10^4,\n timestep_gravity=timestep_gravity_erk52_3Sstar!)\n\nSet up parameters for the gravitational part of a SemidiscretizationEulerGravity.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ParsaniKetchesonDeconinck3Sstar32","page":"Trixi.jl","title":"Trixi.ParsaniKetchesonDeconinck3Sstar32","text":"ParsaniKetchesonDeconinck3Sstar32()\n\nParsani, Ketcheson, Deconinck (2013) Optimized explicit RK schemes for the spectral difference method applied to wave propagation problems DOI: 10.1137/120885899\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ParsaniKetchesonDeconinck3Sstar94","page":"Trixi.jl","title":"Trixi.ParsaniKetchesonDeconinck3Sstar94","text":"ParsaniKetchesonDeconinck3Sstar94()\n\nParsani, Ketcheson, Deconinck (2013) Optimized explicit RK schemes for the spectral difference method applied to wave propagation problems DOI: 10.1137/120885899\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PerformanceCounter","page":"Trixi.jl","title":"Trixi.PerformanceCounter","text":"PerformanceCounter()\n\nA PerformanceCounter can be used to track the runtime performance of some calls. Add a new runtime measurement via put!(counter, runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PerformanceCounterList","page":"Trixi.jl","title":"Trixi.PerformanceCounterList","text":"PerformanceCounterList{N}()\n\nA PerformanceCounterList{N} can be used to track the runtime performance of calls to multiple functions, adding them up. Add a new runtime measurement via put!(counter.counters[i], runtime) and get the averaged runtime of all measurements added so far via take!(counter), resetting the counter.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PlotData1D","page":"Trixi.jl","title":"Trixi.PlotData1D","text":"PlotData1D\n\nHolds all relevant data for creating 1D plots of multiple solution variables and to visualize the mesh.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PlotData1D-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.PlotData1D","text":"PlotData1D(u, semi [or mesh, equations, solver, cache];\n solution_variables=nothing, nvisnodes=nothing)\n\nCreate a new PlotData1D object that can be used for visualizing 1D DGSEM solution data array u with Plots.jl. All relevant geometrical information is extracted from the semidiscretization semi. By default, the primitive variables (if existent) or the conservative variables (otherwise) from the solution are used for plotting. This can be changed by passing an appropriate conversion function to solution_variables.\n\nnvisnodes specifies the number of visualization nodes to be used. If it is nothing, twice the number of solution DG nodes are used for visualization, and if set to 0, exactly the number of nodes in the DG elements are used.\n\nWhen visualizing data from a two-dimensional simulation, a 1D slice is extracted for plotting. slice specifies the axis along which the slice is extracted and may be :x, or :y. The slice position is specified by a point that lies on it, which defaults to (0.0, 0.0). Both of these values are ignored when visualizing 1D data. This applies analogously to three-dimensional simulations, where slice may be :xy, :xz, or :yz.\n\nAnother way to visualize 2D/3D data is by creating a plot along a given curve. This is done with the keyword argument curve. It can be set to a list of 2D/3D points which define the curve. When using curve any other input from slice or point will be ignored.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData1D-Tuple{Union{ODESolution{T, N, uType, uType2, DType, tType, rateType, P} where {T, N, uType, uType2, DType, tType, rateType, P<:(ODEProblem{uType_, tType_, isinplace, P_} where {uType_, tType_, isinplace, P_<:Trixi.AbstractSemidiscretization})}, Trixi.TimeIntegratorSolution}}","page":"Trixi.jl","title":"Trixi.PlotData1D","text":"PlotData1D(sol; kwargs...)\n\nCreate a PlotData1D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData2DCartesian","page":"Trixi.jl","title":"Trixi.PlotData2DCartesian","text":"PlotData2D\n\nHolds all relevant data for creating 2D plots of multiple solution variables and to visualize the mesh.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PolytropicEulerEquations2D","page":"Trixi.jl","title":"Trixi.PolytropicEulerEquations2D","text":"PolytropicEulerEquations2D(gamma, kappa)\n\nThe polytropic Euler equations\n\nfracpartialpartial t\nbeginpmatrix\nrho rho v_1 rho v_2\nendpmatrix\n+\nfracpartialpartial x\nbeginpmatrix\n rho v_1 rho v_1^2 + kapparho^gamma rho v_1 v_2\nendpmatrix\n+\nfracpartialpartial y\nbeginpmatrix\nrho v_2 rho v_1 v_2 rho v_2^2 + kapparho^gamma\nendpmatrix\n=\nbeginpmatrix\n0 0 0\nendpmatrix\n\nfor an ideal gas with ratio of specific heats gamma in two space dimensions. Here, rho is the density and v_1 andv_2 the velocities and\n\np = kapparho^gamma\n\nthe pressure, which we replaced using this relation.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.PositivityPreservingLimiterZhangShu","page":"Trixi.jl","title":"Trixi.PositivityPreservingLimiterZhangShu","text":"PositivityPreservingLimiterZhangShu(; threshold, variables)\n\nThe fully-discrete positivity-preserving limiter of\n\nZhang, Shu (2011) Maximum-principle-satisfying and positivity-preserving high-order schemes for conservation laws: survey and new developments doi: 10.1098/rspa.2011.0153\n\nThe limiter is applied to all scalar variables in their given order using the associated thresholds to determine the minimal acceptable values. The order of the variables is important and might have a strong influence on the robustness.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SaveRestartCallback","page":"Trixi.jl","title":"Trixi.SaveRestartCallback","text":"SaveRestartCallback(; interval=0,\n save_final_restart=true,\n output_directory=\"out\")\n\nSave the current numerical solution in a restart file every interval time steps.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SaveSolutionCallback","page":"Trixi.jl","title":"Trixi.SaveSolutionCallback","text":"SaveSolutionCallback(; interval::Integer=0,\n dt=nothing,\n save_initial_solution=true,\n save_final_solution=true,\n output_directory=\"out\",\n solution_variables=cons2prim)\n\nSave the current numerical solution in regular intervals. Either pass interval to save every interval time steps or pass dt to save in intervals of dt in terms of integration time by adding additional (shortened) time steps where necessary (note that this may change the solution). solution_variables can be any callable that converts the conservative variables at a single point to a set of solution variables. The first parameter passed to solution_variables will be the set of conservative variables and the second parameter is the equation struct.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationCoupled","page":"Trixi.jl","title":"Trixi.SemidiscretizationCoupled","text":"SemidiscretizationCoupled\n\nA struct used to bundle multiple semidiscretizations. semidiscretize will return an ODEProblem that synchronizes time steps between the semidiscretizations. Each call of rhs! will call rhs! for each semidiscretization individually. The semidiscretizations can be coupled by gluing meshes together using BoundaryConditionCoupled.\n\nwarning: Experimental code\nThis is an experimental feature and can change any time.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationCoupled-Tuple","page":"Trixi.jl","title":"Trixi.SemidiscretizationCoupled","text":"SemidiscretizationCoupled(semis...)\n\nCreate a coupled semidiscretization that consists of the semidiscretizations passed as arguments.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SemidiscretizationEulerAcoustics","page":"Trixi.jl","title":"Trixi.SemidiscretizationEulerAcoustics","text":"SemidiscretizationEulerAcoustics(semi_acoustics::SemiAcoustics, semi_euler::SemiEuler;\n source_region=x->true, weights=x->1.0)\n\nwarning: Experimental code\nThis semidiscretization is experimental and may change in any future release.\n\nConstruct a semidiscretization of the acoustic perturbation equations that is coupled with the compressible Euler equations via source terms for the perturbed velocity. Both semidiscretizations have to use the same mesh and solvers with a shared basis. The coupling region is described by a function source_region that maps the coordinates of a single node to true or false depending on whether the point lies within the coupling region or not. A weighting function weights that maps coordinates to weights is applied to the acoustic source terms. Note that this semidiscretization should be used in conjunction with EulerAcousticsCouplingCallback and only works in two dimensions.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationEulerGravity","page":"Trixi.jl","title":"Trixi.SemidiscretizationEulerGravity","text":"SemidiscretizationEulerGravity\n\nA struct containing everything needed to describe a spatial semidiscretization of a the compressible Euler equations with self-gravity, reformulating the Poisson equation for the gravitational potential as steady-state problem of the hyperblic diffusion equations.\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) \"A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics\" arXiv: 2008.10593\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationEulerGravity-Union{Tuple{SemiGravity}, Tuple{SemiEuler}, Tuple{Mesh}, Tuple{SemiEuler, SemiGravity, Any}} where {Mesh, SemiEuler<:(SemidiscretizationHyperbolic{Mesh, <:Trixi.AbstractCompressibleEulerEquations}), SemiGravity<:(SemidiscretizationHyperbolic{Mesh, <:Trixi.AbstractHyperbolicDiffusionEquations})}","page":"Trixi.jl","title":"Trixi.SemidiscretizationEulerGravity","text":"SemidiscretizationEulerGravity(semi_euler::SemiEuler, semi_gravity::SemiGravity, parameters)\n\nConstruct a semidiscretization of the compressible Euler equations with self-gravity. parameters should be given as ParametersEulerGravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolic","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolic","text":"SemidiscretizationHyperbolic\n\nA struct containing everything needed to describe a spatial semidiscretization of a hyperbolic conservation law.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolic-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolic","text":"SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver;\n source_terms=nothing,\n boundary_conditions=boundary_condition_periodic,\n RealT=real(solver),\n uEltype=RealT,\n initial_cache=NamedTuple())\n\nConstruct a semidiscretization of a hyperbolic PDE.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolicParabolic","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolicParabolic","text":"SemidiscretizationHyperbolicParabolic\n\nA struct containing everything needed to describe a spatial semidiscretization of a mixed hyperbolic-parabolic conservation law.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SemidiscretizationHyperbolicParabolic-Tuple{Any, Tuple, Any, Any}","page":"Trixi.jl","title":"Trixi.SemidiscretizationHyperbolicParabolic","text":"SemidiscretizationHyperbolicParabolic(mesh, both_equations, initial_condition, solver;\n solver_parabolic=default_parabolic_solver(),\n source_terms=nothing,\n both_boundary_conditions=(boundary_condition_periodic, boundary_condition_periodic),\n RealT=real(solver),\n uEltype=RealT,\n both_initial_caches=(NamedTuple(), NamedTuple()))\n\nConstruct a semidiscretization of a hyperbolic-parabolic PDE.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ShallowWaterEquations1D","page":"Trixi.jl","title":"Trixi.ShallowWaterEquations1D","text":"ShallowWaterEquations1D(; gravity, H0 = 0)\n\nShallow water equations (SWE) in one space dimension. The equations are given by\n\nbeginaligned\n fracpartial hpartial t + fracpartialpartial x(h v) = 0 \n fracpartialpartial t(h v) + fracpartialpartial xleft(h v^2 + fracg2h^2right)\n + g h fracpartial bpartial x = 0\nendaligned\n\nThe unknown quantities of the SWE are the water height h and the velocity v. The gravitational constant is denoted by g and the (possibly) variable bottom topography function b(x). Conservative variable water height h is measured from the bottom topography b, therefore one also defines the total water height as H = h + b.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nThe bottom topography function b(x) is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.\n\nIn addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography must be zero.\nThe bottom topography values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the bottom topography by default.\n\nReferences for the SWE are many but a good introduction is available in Chapter 13 of the book:\n\nRandall J. LeVeque (2002) Finite Volume Methods for Hyperbolic Problems DOI: 10.1017/CBO9780511791253\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ShallowWaterEquations2D","page":"Trixi.jl","title":"Trixi.ShallowWaterEquations2D","text":"ShallowWaterEquations2D(; gravity, H0 = 0)\n\nShallow water equations (SWE) in two space dimensions. The equations are given by\n\nbeginaligned\n fracpartial hpartial t + fracpartialpartial x(h v_1)\n + fracpartialpartial y(h v_2) = 0 \n fracpartialpartial t(h v_1) + fracpartialpartial xleft(h v_1^2 + fracg2h^2right)\n + fracpartialpartial y(h v_1 v_2) + g h fracpartial bpartial x = 0 \n fracpartialpartial t(h v_2) + fracpartialpartial x(h v_1 v_2)\n + fracpartialpartial yleft(h v_2^2 + fracg2h^2right) + g h fracpartial bpartial y = 0\nendaligned\n\nThe unknown quantities of the SWE are the water height h and the velocities mathbfv = (v_1 v_2)^T. The gravitational constant is denoted by g and the (possibly) variable bottom topography function b(xy). Conservative variable water height h is measured from the bottom topography b, therefore one also defines the total water height as H = h + b.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nThe bottom topography function b(xy) is set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero.\n\nIn addition to the unknowns, Trixi.jl currently stores the bottom topography values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography must be zero.\nThe bottom topography values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the bottom topography by default.\n\nReferences for the SWE are many but a good introduction is available in Chapter 13 of the book:\n\nRandall J. LeVeque (2002) Finite Volume Methods for Hyperbolic Problems DOI: 10.1017/CBO9780511791253\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ShallowWaterEquationsQuasi1D","page":"Trixi.jl","title":"Trixi.ShallowWaterEquationsQuasi1D","text":"ShallowWaterEquationsQuasi1D(; gravity, H0 = 0, threshold_limiter = nothing threshold_wet = nothing)\n\nThe quasi-1D shallow water equations (SWE). The equations are given by\n\nbeginaligned\n fracpartialpartial t(a h) + fracpartialpartial x(a h v) = 0 \n fracpartialpartial t(a h v) + fracpartialpartial x(a h v^2)\n + g a h fracpartialpartial x(h + b) = 0\nendaligned\n\nThe unknown quantities of the Quasi-1D SWE are the water height h and the scaled velocity v. The gravitational constant is denoted by g, the (possibly) variable bottom topography function b(x), and (possibly) variable channel width a(x). The water height h is measured from the bottom topography b, therefore one also defines the total water height as H = h + b.\n\nThe additional quantity H_0 is also available to store a reference value for the total water height that is useful to set initial conditions or test the \"lake-at-rest\" well-balancedness.\n\nThe bottom topography function b(x) and channel width a(x) are set inside the initial condition routine for a particular problem setup. To test the conservative form of the SWE one can set the bottom topography variable b to zero and a to one. \n\nIn addition to the unknowns, Trixi.jl currently stores the bottom topography and channel width values at the approximation points despite being fixed in time. This is done for convenience of computing the bottom topography gradients on the fly during the approximation as well as computing auxiliary quantities like the total water height H or the entropy variables. This affects the implementation and use of these equations in various ways:\n\nThe flux values corresponding to the bottom topography and channel width must be zero.\nThe bottom topography and channel width values must be included when defining initial conditions, boundary conditions or source terms.\nAnalysisCallback analyzes this variable.\nTrixi.jl's visualization tools will visualize the bottom topography and channel width by default.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SimpleSSPRK33","page":"Trixi.jl","title":"Trixi.SimpleSSPRK33","text":"SimpleSSPRK33(; stage_callbacks=())\n\nThe third-order SSP Runge-Kutta method of Shu and Osher.\n\nReferences\n\nShu, Osher (1988) \"Efficient Implementation of Essentially Non-oscillatory Shock-Capturing Schemes\" (Eq. 2.18) DOI: 10.1016/0021-9991(88)90177-5\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SteadyStateCallback","page":"Trixi.jl","title":"Trixi.SteadyStateCallback","text":"SteadyStateCallback(; abstol=1.0e-8, reltol=1.0e-6)\n\nTerminates the integration when the residual_steady_state(du, equations) falls below the threshold specified by abstol, reltol.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.StepsizeCallback","page":"Trixi.jl","title":"Trixi.StepsizeCallback","text":"StepsizeCallback(; cfl=1.0)\n\nSet the time step size according to a CFL condition with CFL number cfl if the time integration method isn't adaptive itself.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.StructuredMesh","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nA structured curved mesh.\n\nDifferent numbers of cells per dimension are possible and arbitrary functions can be used as domain faces.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.StructuredMesh-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh(cells_per_dimension, coordinates_min, coordinates_max; periodicity=true)\n\nCreate a StructuredMesh that represents a uncurved structured mesh with a rectangular domain.\n\nArguments\n\ncells_per_dimension::NTuple{NDIMS, Int}: the number of cells in each dimension.\ncoordinates_min::NTuple{NDIMS, RealT}: coordinate of the corner in the negative direction of each dimension.\ncoordinates_max::NTuple{NDIMS, RealT}: coordinate of the corner in the positive direction of each dimension.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.StructuredMesh-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh(cells_per_dimension, mapping; RealT=Float64, unsaved_changes=true, mapping_as_string=mapping2string(mapping, length(cells_per_dimension)))\n\nCreate a StructuredMesh of the given size and shape that uses RealT as coordinate type.\n\nArguments\n\ncells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.\nmapping: a function of NDIMS variables to describe the mapping, which transforms the reference mesh to the physical domain. If no mapping_as_string is defined, this function must be defined with the name mapping to allow for restarts. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.\nRealT::Type: the type that should be used for coordinates.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\nmapping_as_string::String: the code that defines the mapping. If CodeTracking can't find the function definition, it can be passed directly here. The code string must define the mapping function with the name mapping. This will be changed in the future, see https://github.com/trixi-framework/Trixi.jl/issues/541.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.StructuredMesh-Tuple{Any, Tuple}","page":"Trixi.jl","title":"Trixi.StructuredMesh","text":"StructuredMesh(cells_per_dimension, faces; RealT=Float64, unsaved_changes=true, faces_as_string=faces2string(faces))\n\nCreate a StructuredMesh of the given size and shape that uses RealT as coordinate type.\n\nArguments\n\ncells_per_dimension::NTupleE{NDIMS, Int}: the number of cells in each dimension.\nfaces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D).\nRealT::Type: the type that should be used for coordinates.\nperiodicity: either a Bool deciding if all of the boundaries are periodic or an NTuple{NDIMS, Bool} deciding for each dimension if the boundaries in this dimension are periodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SubcellLimiterIDP","page":"Trixi.jl","title":"Trixi.SubcellLimiterIDP","text":"SubcellLimiterIDP(equations::AbstractEquations, basis;\n local_minmax_variables_cons = String[],\n positivity_variables_cons = String[],\n positivity_variables_nonlinear = [],\n positivity_correction_factor = 0.1,\n max_iterations_newton = 10,\n newton_tolerances = (1.0e-12, 1.0e-14),\n gamma_constant_newton = 2 * ndims(equations))\n\nSubcell invariant domain preserving (IDP) limiting used with VolumeIntegralSubcellLimiting including:\n\nLocal maximum/minimum Zalesak-type limiting for conservative variables (local_minmax_variables_cons)\nPositivity limiting for conservative variables (positivity_variables_cons) and nonlinear variables\n\n(positivity_variables_nonlinear)\n\nConservative variables to be limited are passed as a vector of strings, e.g. local_minmax_variables_cons = [\"rho\"] and positivity_variables_cons = [\"rho\"]. For nonlinear variables the specific functions are passed in a vector, e.g. positivity_variables_nonlinear = [pressure].\n\nThe bounds are calculated using the low-order FV solution. The positivity limiter uses positivity_correction_factor such that u^new >= positivity_correction_factor * u^FV. The limiting of nonlinear variables uses a Newton-bisection method with a maximum of max_iterations_newton iterations, relative and absolute tolerances of newton_tolerances and a provisional update constant gamma_constant_newton (gamma_constant_newton>=2*d, where d = #dimensions). See equation (20) of Pazner (2020) and equation (30) of Rueda-Ramírez et al. (2022).\n\nnote: Note\nThis limiter and the correction callback SubcellLimiterIDPCorrection only work together. Without the callback, no correction takes place, leading to a standard low-order FV scheme.\n\nReferences\n\nRueda-Ramírez, Pazner, Gassner (2022) Subcell Limiting Strategies for Discontinuous Galerkin Spectral Element Methods DOI: 10.1016/j.compfluid.2022.105627\nPazner (2020) Sparse invariant domain preserving discontinuous Galerkin methods with subcell convex limiting DOI: 10.1016/j.cma.2021.113876\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SubcellLimiterIDPCorrection","page":"Trixi.jl","title":"Trixi.SubcellLimiterIDPCorrection","text":"SubcellLimiterIDPCorrection()\n\nPerform antidiffusive correction stage for the a posteriori IDP limiter SubcellLimiterIDP called with VolumeIntegralSubcellLimiting.\n\nnote: Note\nThis callback and the actual limiter SubcellLimiterIDP only work together. This is not a replacement but a necessary addition.\n\nReferences\n\nRueda-Ramírez, Pazner, Gassner (2022) Subcell Limiting Strategies for Discontinuous Galerkin Spectral Element Methods DOI: 10.1016/j.compfluid.2022.105627\nPazner (2020) Sparse invariant domain preserving discontinuous Galerkin methods with subcell convex limiting DOI: 10.1016/j.cma.2021.113876\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SurfaceIntegralStrongForm","page":"Trixi.jl","title":"Trixi.SurfaceIntegralStrongForm","text":"SurfaceIntegralStrongForm(surface_flux=flux_central)\n\nThe classical strong form surface integral type for FD/DG methods.\n\nSee also VolumeIntegralStrongForm.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SurfaceIntegralUpwind","page":"Trixi.jl","title":"Trixi.SurfaceIntegralUpwind","text":"SurfaceIntegralUpwind(splitting)\n\nCouple elements with upwind simultaneous approximation terms (SATs) that use a particular flux splitting, e.g., splitting_steger_warming.\n\nSee also VolumeIntegralUpwind.\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.SurfaceIntegralWeakForm","page":"Trixi.jl","title":"Trixi.SurfaceIntegralWeakForm","text":"SurfaceIntegralWeakForm(surface_flux=flux_central)\n\nThe classical weak form surface integral type for DG methods as explained in standard textbooks.\n\nSee also VolumeIntegralWeakForm.\n\nReferences\n\nKopriva (2009) Implementing Spectral Methods for Partial Differential Equations: Algorithms for Scientists and Engineers doi: 10.1007/978-90-481-2261-5\nHesthaven, Warburton (2007) Nodal Discontinuous Galerkin Methods: Algorithms, Analysis, and Applications doi: 10.1007/978-0-387-72067-8\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.T8codeMesh","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nAn unstructured curved mesh based on trees that uses the C library 't8code' to manage trees and mesh refinement.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.T8codeMesh-Tuple{Any}","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh(trees_per_dimension; polydeg, mapping=identity,\n RealT=Float64, initial_refinement_level=0, periodicity=true)\n\nCreate a structured potentially curved 'T8codeMesh' of the specified size.\n\nNon-periodic boundaries will be called ':xneg', ':xpos', ':yneg', ':ypos', ':zneg', ':zpos'.\n\nArguments\n\n'treesperdimension::NTupleE{NDIMS, Int}': the number of trees in each dimension.\n'polydeg::Integer': polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.\nmapping: a function of NDIMS variables to describe the mapping that transforms the reference mesh ([-1, 1]^n) to the physical domain. Use only one of mapping, faces and coordinates_min/coordinates_max.\nfaces::NTuple{2*NDIMS}: a tuple of 2 * NDIMS functions that describe the faces of the domain. Each function must take NDIMS-1 arguments. faces[1] describes the face onto which the face in negative x-direction of the unit hypercube is mapped. The face in positive x-direction of the unit hypercube will be mapped onto the face described by faces[2]. faces[3:4] describe the faces in positive and negative y-direction respectively (in 2D and 3D). faces[5:6] describe the faces in positive and negative z-direction respectively (in 3D). Use only one of mapping, faces and coordinates_min/coordinates_max.\ncoordinates_min: vector or tuple of the coordinates of the corner in the negative direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.\ncoordinates_max: vector or tuple of the coordinates of the corner in the positive direction of each dimension to create a rectangular mesh. Use only one of mapping, faces and coordinates_min/coordinates_max.\n'RealT::Type': the type that should be used for coordinates.\n'initialrefinementlevel::Integer': refine the mesh uniformly to this level before the simulation starts.\n'periodicity': either a 'Bool' deciding if all of the boundaries are periodic or an 'NTuple{NDIMS, Bool}' deciding for each dimension if the boundaries in this dimension are periodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.T8codeMesh-Tuple{Ptr{P4est.LibP4est.p4est_connectivity}}","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh(conn::Ptr{p4est_connectivity}; kwargs...)\n\nMain mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a p4est_connectivity data structure.\n\nArguments\n\nconn::Ptr{p4est_connectivity}: Pointer to a P4est connectivity object.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.T8codeMesh-Tuple{Ptr{P4est.LibP4est.p8est_connectivity}}","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh(conn::Ptr{p8est_connectivity}; kwargs...)\n\nMain mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a p4est_connectivity data structure.\n\nArguments\n\nconn::Ptr{p4est_connectivity}: Pointer to a P4est connectivity object.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.T8codeMesh-Tuple{Ptr{T8code.Libt8.t8_cmesh}}","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh(cmesh::Ptr{t8_cmesh},\n mapping=nothing, polydeg=1, RealT=Float64,\n initial_refinement_level=0)\n\nMain mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a t8_cmesh data structure.\n\nArguments\n\ncmesh::Ptr{t8_cmesh}: Pointer to a cmesh object.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.T8codeMesh-Tuple{String, Any}","page":"Trixi.jl","title":"Trixi.T8codeMesh","text":"T8codeMesh(meshfile::String, ndims; kwargs...)\n\nMain mesh constructor for the T8codeMesh that imports an unstructured, conforming mesh from a Gmsh mesh file (.msh).\n\nArguments\n\nmeshfile::String: path to a Gmsh mesh file.\nndims: Mesh file dimension: 2 or 3.\nmapping: a function of NDIMS variables to describe the mapping that transforms the imported mesh to the physical domain. Use nothing for the identity map.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree. The default of 1 creates an uncurved geometry. Use a higher value if the mapping will curve the imported uncurved mesh.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.TimeSeriesCallback","page":"Trixi.jl","title":"Trixi.TimeSeriesCallback","text":"TimeSeriesCallback(semi, point_coordinates;\n interval=1, solution_variables=cons2cons,\n output_directory=\"out\", filename=\"time_series.h5\",\n RealT=real(solver), uEltype=eltype(cache.elements))\n\nCreate a callback that records point-wise data at points given in point_coordinates every interval time steps. The point coordinates are to be specified either as a vector of coordinate tuples or as a two-dimensional array where the first dimension is the point number and the second dimension is the coordinate dimension. By default, the conservative variables are recorded, but this can be controlled by passing a different conversion function to solution_variables.\n\nAfter the last time step, the results are stored in an HDF5 file filename in directory output_directory.\n\nThe real data type RealT and data type for solution variables uEltype default to the respective types used in the solver and the cache.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.TrafficFlowLWREquations1D","page":"Trixi.jl","title":"Trixi.TrafficFlowLWREquations1D","text":"TrafficFlowLWREquations1D\n\nThe classic Lighthill-Witham Richards (LWR) model for 1D traffic flow. The car density is denoted by u in 0 1 and the maximum possible speed (e.g. due to speed limits) is v_textmax.\n\npartial_t u + v_textmax partial_1 u (1 - u) = 0\n\nFor more details see e.g. Section 11.1 of \n\nRandall LeVeque (2002)\n\nFinite Volume Methods for Hyperbolic Problems [DOI: 10.1017/CBO9780511791253]https://doi.org/10.1017/CBO9780511791253\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.TreeMesh","page":"Trixi.jl","title":"Trixi.TreeMesh","text":"TreeMesh{NDIMS} <: AbstractMesh{NDIMS}\n\nA Cartesian mesh based on trees of hypercubes to support adaptive mesh refinement.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.UnstructuredMesh2D","page":"Trixi.jl","title":"Trixi.UnstructuredMesh2D","text":"UnstructuredMesh2D <: AbstractMesh{2}\n\nAn unstructured (possibly curved) quadrilateral mesh.\n\nUnstructuredMesh2D(filename; RealT=Float64, periodicity=false)\n\nAll mesh information, neighbour coupling, and boundary curve information is read in from a mesh file filename.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.UnstructuredSortedBoundaryTypes","page":"Trixi.jl","title":"Trixi.UnstructuredSortedBoundaryTypes","text":"UnstructuredSortedBoundaryTypes\n\nGeneral container to sort the boundary conditions by type for some unstructured meshes/solvers. It stores a set of global indices for each boundary condition type to expedite computation during the call to calc_boundary_flux!. The original dictionary form of the boundary conditions set by the user in the elixir file is also stored for printing.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ViscousFormulationBassiRebay1","page":"Trixi.jl","title":"Trixi.ViscousFormulationBassiRebay1","text":"ViscousFormulationBassiRebay1()\n\nThe classical BR1 flux from\n\nF. Bassi, S. Rebay (1997) A High-Order Accurate Discontinuous Finite Element Method for the Numerical Solution of the Compressible Navier-Stokes Equations DOI: 10.1006/jcph.1996.5572\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.ViscousFormulationLocalDG","page":"Trixi.jl","title":"Trixi.ViscousFormulationLocalDG","text":"ViscousFormulationLocalDG(penalty_parameter)\n\nThe local DG (LDG) flux from \"The Local Discontinuous Galerkin Method for Time-Dependent Convection-Diffusion Systems\" by Cockburn and Shu (1998).\n\nNote that, since this implementation does not involve the parabolic \"upwinding\" vector, the LDG solver is equivalent to ViscousFormulationBassiRebay1 with an LDG-type penalization.\n\nCockburn and Shu (1998). The Local Discontinuous Galerkin Method for Time-Dependent Convection-Diffusion Systems DOI: 10.1137/S0036142997316712\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VisualizationCallback-Tuple{}","page":"Trixi.jl","title":"Trixi.VisualizationCallback","text":"VisualizationCallback(; interval=0,\n solution_variables=cons2prim,\n variable_names=[],\n show_mesh=false,\n plot_data_creator=PlotData2D,\n plot_creator=show_plot,\n plot_arguments...)\n\nCreate a callback that visualizes results during a simulation, also known as in-situ visualization.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in any future releases.\n\nThe interval specifies the number of time step iterations after which a new plot is generated. The available variables to plot are configured with the solution_variables parameter, which acts the same way as for the SaveSolutionCallback. The variables to be actually plotted can be selected by providing a single string or a list of strings to variable_names, and if show_mesh is true, an additional plot with the mesh will be generated.\n\nTo customize the generated figure, plot_data_creator allows to use different plot data types. With plot_creator you can further specify an own function to visualize results, which must support the same interface as the default implementation show_plot. All remaining keyword arguments are collected and passed as additional arguments to the plotting command.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.VolumeIntegralFluxDifferencing","page":"Trixi.jl","title":"Trixi.VolumeIntegralFluxDifferencing","text":"VolumeIntegralFluxDifferencing(volume_flux)\n\nVolume integral type for DG methods based on SBP operators and flux differencing using a symmetric two-point volume_flux. This volume_flux needs to satisfy the interface of numerical fluxes in Trixi.jl.\n\nReferences\n\nLeFloch, Mercier, Rohde (2002) Fully Discrete, Entropy Conservative Schemes of Arbitrary Order doi: 10.1137/S003614290240069X\nFisher, Carpenter (2013) High-order entropy stable finite difference schemes for nonlinear conservation laws: Finite domains doi: 10.1016/j.jcp.2013.06.014\nHendrik Ranocha (2017) Comparison of Some Entropy Conservative Numerical Fluxes for the Euler Equations arXiv: 1701.02264 doi: 10.1007/s10915-017-0618-1\nChen, Shu (2017) Entropy stable high order discontinuous Galerkin methods with suitable quadrature rules for hyperbolic conservation laws doi: 10.1016/j.jcp.2017.05.025\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralPureLGLFiniteVolume","page":"Trixi.jl","title":"Trixi.VolumeIntegralPureLGLFiniteVolume","text":"VolumeIntegralPureLGLFiniteVolume(volume_flux_fv)\n\nA volume integral that only uses the subcell finite volume schemes of the VolumeIntegralShockCapturingHG.\n\nThis gives a formally O(1)-accurate finite volume scheme on an LGL-type subcell mesh (LGL = Legendre-Gauss-Lobatto).\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nHennemann, Gassner (2020) \"A provably entropy stable subcell shock capturing approach for high order split form DG\" arXiv: 2008.12044\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralShockCapturingHG","page":"Trixi.jl","title":"Trixi.VolumeIntegralShockCapturingHG","text":"VolumeIntegralShockCapturingHG(indicator; volume_flux_dg=flux_central,\n volume_flux_fv=flux_lax_friedrichs)\n\nShock-capturing volume integral type for DG methods using a convex blending of the finite volume method with numerical flux volume_flux_fv and the VolumeIntegralFluxDifferencing with volume flux volume_flux_dg. The amount of blending is determined by the indicator, e.g., IndicatorHennemannGassner.\n\nReferences\n\nHennemann, Gassner (2020) \"A provably entropy stable subcell shock capturing approach for high order split form DG\" arXiv: 2008.12044\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralStrongForm","page":"Trixi.jl","title":"Trixi.VolumeIntegralStrongForm","text":"VolumeIntegralStrongForm()\n\nThe classical strong form volume integral type for FD/DG methods.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralSubcellLimiting","page":"Trixi.jl","title":"Trixi.VolumeIntegralSubcellLimiting","text":"VolumeIntegralSubcellLimiting(limiter;\n volume_flux_dg, volume_flux_fv)\n\nA subcell limiting volume integral type for DG methods based on subcell blending approaches with a low-order FV method. Used with limiter SubcellLimiterIDP.\n\nnote: Note\nSubcell limiting methods are not fully functional on non-conforming meshes. This is mainly because the implementation assumes that low- and high-order schemes have the same surface terms, which is not guaranteed for non-conforming meshes. The low-order scheme with a high-order mortar is not invariant domain preserving.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralUpwind","page":"Trixi.jl","title":"Trixi.VolumeIntegralUpwind","text":"VolumeIntegralUpwind(splitting)\n\nSpecialized volume integral for finite difference summation-by-parts (FDSBP) solvers. Can be used together with the upwind SBP operators of Mattsson (2017) implemented in SummationByPartsOperators.jl. The splitting controls the discretization.\n\nSee also splitting_steger_warming, splitting_lax_friedrichs, splitting_vanleer_haenel.\n\nReferences\n\nMattsson (2017) Diagonal-norm upwind SBP operators doi: 10.1016/j.jcp.2017.01.042\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.VolumeIntegralWeakForm","page":"Trixi.jl","title":"Trixi.VolumeIntegralWeakForm","text":"VolumeIntegralWeakForm()\n\nThe classical weak form volume integral type for DG methods as explained in standard textbooks.\n\nReferences\n\nKopriva (2009) Implementing Spectral Methods for Partial Differential Equations: Algorithms for Scientists and Engineers doi: 10.1007/978-90-481-2261-5\nHesthaven, Warburton (2007) Nodal Discontinuous Galerkin Methods: Algorithms, Analysis, and Applications doi: 10.1007/978-0-387-72067-8\n\nVolumeIntegralWeakForm() is only implemented for conserved terms as non-conservative terms should always be discretized in conjunction with a flux-splitting scheme, see VolumeIntegralFluxDifferencing. This treatment is required to achieve, e.g., entropy-stability or well-balancedness.\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Base.getindex-Tuple{Trixi.AbstractPlotData, Any}","page":"Trixi.jl","title":"Base.getindex","text":"Base.getindex(pd::AbstractPlotData, variable_name)\n\nExtract a single variable variable_name from pd for plotting with Plots.plot.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Base.resize!-Tuple{Trixi.AbstractContainer, Any}","page":"Trixi.jl","title":"Base.resize!","text":"resize!(c::AbstractContainer, new_length) -> AbstractContainer\n\nResize c to contain new_length elements. If new_length is smaller than the current container length, the first new_length elements will be retained. If new_length is larger, the new elements are invalidated.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.compute_coefficients!-Tuple{Any, Any, Any, Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"PolynomialBases.compute_coefficients!","text":"compute_coefficients!(u_ode, func, t, semi::AbstractSemidiscretization)\n\nSame as compute_coefficients but stores the result in u_ode.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.compute_coefficients-Tuple{Any, Any, Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"PolynomialBases.compute_coefficients","text":"compute_coefficients(func, t, semi::AbstractSemidiscretization)\n\nCompute the discrete coefficients of the continuous function func at time t associated with the semidiscretization semi. For example, the discrete coefficients of func for a discontinuous Galerkin spectral element method (DGSEM) are the values of func at the Lobatto-Legendre nodes. Similarly, a classical finite difference method will use the values of func at the nodes of the grid assoociated with the semidiscretization semi.\n\nFor semidiscretizations semi associated with an initial condition, func can be omitted to use the given initial condition at time t.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.integrate-Tuple{Any, Any, LobattoLegendreBasis}","page":"Trixi.jl","title":"PolynomialBases.integrate","text":"integrate(f, u, basis::LobattoLegendreBasis)\n\nMap the function f to the coefficients u and integrate with respect to the quadrature rule given by basis.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#PolynomialBases.integrate-Union{Tuple{Func}, Tuple{Func, Any, Trixi.AbstractSemidiscretization}} where Func","page":"Trixi.jl","title":"PolynomialBases.integrate","text":"integrate([func=(u_node,equations)->u_node,] u_ode, semi::AbstractSemidiscretization; normalize=true)\n\nCall func(u_node, equations) for each vector of nodal variables u_node in u_ode and integrate the result using a quadrature associated with the semidiscretization semi.\n\nIf normalize is true, the result is divided by the total volume of the computational domain.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SciMLBase.add_tstop!-Tuple{Trixi.SimpleIntegratorSSP, Any}","page":"Trixi.jl","title":"SciMLBase.add_tstop!","text":"add_tstop!(integrator::SimpleIntegratorSSP, t)\n\nAdd a time stop during the time integration process. This function is called after the periodic SaveSolutionCallback to specify the next stop to save the solution.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SummationByPartsOperators.semidiscretize-Tuple{SemidiscretizationHyperbolicParabolic, Any}","page":"Trixi.jl","title":"SummationByPartsOperators.semidiscretize","text":"semidiscretize(semi::SemidiscretizationHyperbolicParabolic, tspan)\n\nWrap the semidiscretization semi as a split ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The parabolic right-hand side is the first function of the split ODE problem and will be used by default by the implicit part of IMEX methods from the SciML ecosystem.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SummationByPartsOperators.semidiscretize-Tuple{Trixi.AbstractSemidiscretization, Any, AbstractString}","page":"Trixi.jl","title":"SummationByPartsOperators.semidiscretize","text":"semidiscretize(semi::AbstractSemidiscretization, tspan, restart_file::AbstractString)\n\nWrap the semidiscretization semi as an ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem. The initial condition etc. is taken from the restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#SummationByPartsOperators.semidiscretize-Tuple{Trixi.AbstractSemidiscretization, Any}","page":"Trixi.jl","title":"SummationByPartsOperators.semidiscretize","text":"semidiscretize(semi::AbstractSemidiscretization, tspan)\n\nWrap the semidiscretization semi as an ODE problem in the time interval tspan that can be passed to solve from the SciML ecosystem.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.DGMultiBasis-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.DGMultiBasis","text":"DGMultiBasis(element_type, polydeg; approximation_type = Polynomial(), kwargs...)\n\nConstructs a basis for DGMulti solvers. Returns a \"StartUpDG.RefElemData\" object. The kwargs arguments are additional keyword arguments for RefElemData, such as quad_rule_vol. These are the same as the RefElemData_kwargs used in DGMulti. For more info, see the StartUpDG.jl docs.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.LBMCollisionCallback-Tuple{}","page":"Trixi.jl","title":"Trixi.LBMCollisionCallback","text":"LBMCollisionCallback()\n\nApply the Lattice-Boltzmann method (LBM) collision operator before each time step. See LatticeBoltzmannEquations2D for further details.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.P4estMeshCubedSphere-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.P4estMeshCubedSphere","text":"P4estMeshCubedSphere(trees_per_face_dimension, layers, inner_radius, thickness;\n polydeg, RealT=Float64,\n initial_refinement_level=0, unsaved_changes=true,\n p4est_partition_allow_for_coarsening=true)\n\nBuild a \"Cubed Sphere\" mesh as P4estMesh with 6 * trees_per_face_dimension^2 * layers trees.\n\nThe mesh will have two boundaries, :inside and :outside.\n\nArguments\n\ntrees_per_face_dimension::Integer: the number of trees in the first two local dimensions of each face.\nlayers::Integer: the number of trees in the third local dimension of each face, i.e., the number of layers of the sphere.\ninner_radius::Integer: the inner radius of the sphere.\nthickness::Integer: the thickness of the sphere. The outer radius will be inner_radius + thickness.\npolydeg::Integer: polynomial degree used to store the geometry of the mesh. The mapping will be approximated by an interpolation polynomial of the specified degree for each tree.\nRealT::Type: the type that should be used for coordinates.\ninitial_refinement_level::Integer: refine the mesh uniformly to this level before the simulation starts.\nunsaved_changes::Bool: if set to true, the mesh will be saved to a mesh file.\np4est_partition_allow_for_coarsening::Bool: Must be true when using AMR to make mesh adaptivity independent of domain partitioning. Should be false for static meshes to permit more fine-grained partitioning.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData2D-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.PlotData2D","text":"PlotData2D(u, semi [or mesh, equations, solver, cache];\n solution_variables=nothing,\n grid_lines=true, max_supported_level=11, nvisnodes=nothing,\n slice=:xy, point=(0.0, 0.0, 0.0))\n\nCreate a new PlotData2D object that can be used for visualizing 2D/3D DGSEM solution data array u with Plots.jl. All relevant geometrical information is extracted from the semidiscretization semi. By default, the primitive variables (if existent) or the conservative variables (otherwise) from the solution are used for plotting. This can be changed by passing an appropriate conversion function to solution_variables.\n\nIf grid_lines is true, also extract grid vertices for visualizing the mesh. The output resolution is indirectly set via max_supported_level: all data is interpolated to 2^max_supported_level uniformly distributed points in each spatial direction, also setting the maximum allowed refinement level in the solution. nvisnodes specifies the number of visualization nodes to be used. If it is nothing, twice the number of solution DG nodes are used for visualization, and if set to 0, exactly the number of nodes in the DG elements are used.\n\nWhen visualizing data from a three-dimensional simulation, a 2D slice is extracted for plotting. slice specifies the plane that is being sliced and may be :xy, :xz, or :yz. The slice position is specified by a point that lies on it, which defaults to (0.0, 0.0, 0.0). Both of these values are ignored when visualizing 2D data.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nExamples\n\njulia> using Trixi, Plots\n\njulia> trixi_include(default_example())\n[...]\n\njulia> pd = PlotData2D(sol)\nPlotData2D(...)\n\njulia> plot(pd) # To plot all available variables\n\njulia> plot(pd[\"scalar\"]) # To plot only a single variable\n\njulia> plot!(getmesh(pd)) # To add grid lines to the plot\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.PlotData2D-Tuple{Union{ODESolution{T, N, uType, uType2, DType, tType, rateType, P} where {T, N, uType, uType2, DType, tType, rateType, P<:(ODEProblem{uType_, tType_, isinplace, P_} where {uType_, tType_, isinplace, P_<:Trixi.AbstractSemidiscretization})}, Trixi.TimeIntegratorSolution}}","page":"Trixi.jl","title":"Trixi.PlotData2D","text":"PlotData2D(sol; kwargs...)\n\nCreate a PlotData2D object from a solution object created by either OrdinaryDiffEq.solve! (which returns a SciMLBase.ODESolution) or Trixi.jl's own solve! (which returns a TimeIntegratorSolution).\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ScalarPlotData2D-Tuple{Any, Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.ScalarPlotData2D","text":"ScalarPlotData2D(u, semi::AbstractSemidiscretization; kwargs...)\n\nReturns an PlotData2DTriangulated object which is used to visualize a single scalar field. u should be an array whose entries correspond to values of the scalar field at nodal points.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.SummaryCallback","page":"Trixi.jl","title":"Trixi.SummaryCallback","text":"SummaryCallback()\n\nCreate and return a callback that prints a human-readable summary of the simulation setup at the beginning of a simulation and then resets the timer. When the returned callback is executed directly, the current timer values are shown.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.TrivialCallback-Tuple{}","page":"Trixi.jl","title":"Trixi.TrivialCallback","text":"TrivialCallback()\n\nA callback that does nothing. This can be useful to disable some callbacks easily via trixi_include.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.adapt!-Tuple{T8codeMesh, Any}","page":"Trixi.jl","title":"Trixi.adapt!","text":"Trixi.adapt!(mesh::T8codeMesh, adapt_callback; kwargs...)\n\nAdapt a T8codeMesh according to a user-defined adapt_callback.\n\nArguments\n\nmesh::T8codeMesh: Initialized mesh object.\nadapt_callback: A user-defined callback which tells the adaption routines if an element should be refined, coarsened or stay unchanged.\nThe expected callback signature is as follows:\n`adapt_callback(forest, ltreeid, eclass_scheme, lelemntid, elements, is_family, user_data)`\n # Arguments\n - `forest`: Pointer to the analyzed forest.\n - `ltreeid`: Local index of the current tree where the analyzed elements are part of.\n - `eclass_scheme`: Element class of `elements`.\n - `lelemntid`: Local index of the first element in `elements`.\n - `elements`: Array of elements. If consecutive elements form a family\n they are passed together, otherwise `elements` consists of just one element.\n - `is_family`: Boolean signifying if `elements` represents a family or not.\n - `user_data`: Void pointer to some arbitrary user data. Default value is `C_NULL`.\n # Returns\n -1 : Coarsen family of elements.\n 0 : Stay unchanged.\n 1 : Refine element.\nkwargs:\nrecursive = true: Adapt the forest recursively. If true the caller must ensure that the callback returns 0 for every analyzed element at some point to stop the recursion.\nbalance = true: Make sure the adapted forest is 2^(NDIMS-1):1 balanced.\npartition = true: Partition the forest to redistribute elements evenly among MPI ranks.\nghost = true: Create a ghost layer for MPI data exchange.\nuser_data = C_NULL: Pointer to some arbitrary user-defined data.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.adapt_to_mesh_level!-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.adapt_to_mesh_level!","text":"adapt_to_mesh_level!(u_ode, semi, level)\nadapt_to_mesh_level!(sol::Trixi.TrixiODESolution, level)\n\nLike adapt_to_mesh_level, but modifies the solution and parts of the semidiscretization (mesh and caches) in place.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.adapt_to_mesh_level-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.adapt_to_mesh_level","text":"adapt_to_mesh_level(u_ode, semi, level)\nadapt_to_mesh_level(sol::Trixi.TrixiODESolution, level)\n\nUse the regular adaptive mesh refinement routines to adaptively refine/coarsen the solution u_ode with semidiscretization semi towards a uniformly refined grid with refinement level level. The solution and semidiscretization are copied such that the original objects remain unaltered.\n\nA convenience method accepts an ODE solution object, from which solution and semidiscretization are extracted as needed.\n\nSee also: adapt_to_mesh_level!\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.balance!-Tuple{T8codeMesh}","page":"Trixi.jl","title":"Trixi.balance!","text":"Trixi.balance!(mesh::T8codeMesh)\n\nBalance a T8codeMesh to ensure 2^(NDIMS-1):1 face neighbors.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_x-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_x","text":"boundary_condition_linear_x(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation1D)\n\nBoundary conditions for initial_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_x-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_x","text":"boundary_condition_linear_x(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation2D)\n\nBoundary conditions for initial_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_x_y-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_x_y","text":"boundary_condition_linear_x_y(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation2D)\n\nBoundary conditions for initial_condition_linear_x_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_y-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_y","text":"boundary_condition_linear_y(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation2D)\n\nBoundary conditions for initial_condition_linear_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_linear_z-Tuple{Any, Any, Any, Any, Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_linear_z","text":"boundary_condition_linear_z(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equation::LinearScalarAdvectionEquation1D)\n\nBoundary conditions for boundary_condition_linear_z.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_noslip_wall-Tuple{Any, Any, Any, Any, Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_noslip_wall","text":"boundary_condition_noslip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equations::LatticeBoltzmannEquations2D)\n\nNo-slip wall boundary condition using the bounce-back approach.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_poisson_nonperiodic-Tuple{Any, Any, Any, Any, Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_poisson_nonperiodic","text":"boundary_condition_poisson_nonperiodic(u_inner, orientation, direction, x, t,\n surface_flux_function,\n equations::HyperbolicDiffusionEquations1D)\n\nBoundary conditions used for convergence tests in combination with initial_condition_poisson_nonperiodic and source_terms_poisson_nonperiodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::AcousticPerturbationEquations2D)\n\nUse an orthogonal projection of the perturbed velocities to zero out the normal velocity while retaining the possibility of a tangential velocity in the boundary state. Further details are available in the paper:\n\nMarcus Bauer, Jürgen Dierke and Roland Ewert (2011) Application of a discontinuous Galerkin method to discretize acoustic perturbation equations DOI: 10.2514/1.J050333\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations2D)\n\nShould be used together with StructuredMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations3D)\n\nShould be used together with StructuredMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::CompressibleEulerEquations2D)\n\nDetermine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:\n\nJ. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF\n\nDetails about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book\n\nEleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761\n\nShould be used together with UnstructuredMesh2D.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::CompressibleEulerEquations3D)\n\nDetermine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:\n\nJ. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF\n\nDetails about the 1D pressure Riemann solution can be found in Section 6.3.3 of the book\n\nEleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction 3rd edition DOI: 10.1007/b79761\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, AbstractVector, Any, Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, normal_direction, x, t, surface_flux_function,\n equations::ShallowWaterEquations2D)\n\nCreate a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value. For details see Section 9.2.5 of the book:\n\nEleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations1D)\n\nDetermine the boundary numerical surface flux for a slip wall condition. Imposes a zero normal velocity at the wall. Density is taken from the internal solution state and pressure is computed as an exact solution of a 1D Riemann problem. Further details about this boundary state are available in the paper:\n\nJ. J. W. van der Vegt and H. van der Ven (2002) Slip flow boundary conditions in discontinuous Galerkin discretizations of the Euler equations of gas dynamics PDF\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations2D)\n\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::CompressibleEulerEquations3D)\n\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation_or_normal, x, t, surface_flux_function,\n equations::ShallowWaterEquations1D)\n\nCreate a boundary state by reflecting the normal velocity component and keep the tangential velocity component unchanged. The boundary water height is taken from the internal value.\n\nFor details see Section 9.2.5 of the book:\n\nEleuterio F. Toro (2001) Shock-Capturing Methods for Free-Surface Shallow Flows 1st edition ISBN 0471987662\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_slip_wall-Tuple{Any, Any, Any, Any, Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_slip_wall","text":"boundary_condition_slip_wall(u_inner, orientation, direction, x, t,\n surface_flux_function, equations::ShallowWaterEquations2D)\n\nShould be used together with TreeMesh.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_wall-Tuple{Any, Any, Any, Any, Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_wall","text":"boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,\n equations::AcousticPerturbationEquations2D)\n\nBoundary conditions for a solid wall.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.boundary_condition_wall-Tuple{Any, Any, Any, Any, Any, Any, LinearizedEulerEquations2D}","page":"Trixi.jl","title":"Trixi.boundary_condition_wall","text":"boundary_condition_wall(u_inner, orientation, direction, x, t, surface_flux_function,\n equations::LinearizedEulerEquations2D)\n\nBoundary conditions for a solid wall.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_error_norms-Tuple{Any, Any, Any, Trixi.AbstractSemidiscretization, Any}","page":"Trixi.jl","title":"Trixi.calc_error_norms","text":"calc_error_norms([func=(u_node,equations)->u_node,] u_ode, t, analyzer, semi::AbstractSemidiscretization, cache_analysis)\n\nCalculate discrete L2 and L∞ error norms of func applied to each nodal variable u_node in u_ode. If no exact solution is available, \"errors\" are calculated using some reference state and can be useful for regression tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_fast_wavespeed_roe-Tuple{Any, Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.calc_fast_wavespeed_roe","text":"calc_fast_wavespeed_roe(u_ll, u_rr, direction, equations::IdealGlmMhdEquations1D)\n\nCompute the fast magnetoacoustic wave speed using Roe averages as given by\n\nCargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_fast_wavespeed_roe-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.calc_fast_wavespeed_roe","text":"calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations2D)\n\nCompute the fast magnetoacoustic wave speed using Roe averages as given by\n\nCargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_fast_wavespeed_roe-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.calc_fast_wavespeed_roe","text":"calc_fast_wavespeed_roe(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations3D)\n\nCompute the fast magnetoacoustic wave speed using Roe averages as given by\n\nCargo and Gallice (1997) Roe Matrices for Ideal MHD and Systematic Construction of Roe Matrices for Systems of Conservation Laws DOI: 10.1006/jcph.1997.5773\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_wavespeed_roe-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.calc_wavespeed_roe","text":"calc_wavespeed_roe(u_ll, u_rr, direction::Integer,\n equations::ShallowWaterEquations1D)\n\nCalculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} See for instance equation (62) in \n\nPaul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044\n\nOr equation (9.17) in this lecture notes.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.calc_wavespeed_roe-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.calc_wavespeed_roe","text":"calc_wavespeed_roe(u_ll, u_rr, direction::Integer,\n equations::ShallowWaterEquations2D)\n\nCalculate Roe-averaged velocity v_roe and wavespeed c_roe = sqrt{g * h_roe} depending on direction. See for instance equation (62) in \n\nPaul A. Ullrich, Christiane Jablonowski, and Bram van Leer (2010) High-order finite-volume methods for the shallow-water equations on the sphere DOI: 10.1016/j.jcp.2010.04.044\n\nOr this slides, slides 8 and 9.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.collision_bgk-Tuple{Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.collision_bgk","text":"collision_bgk(u, dt, equations::LatticeBoltzmannEquations2D)\n\nCollision operator for the Bhatnagar, Gross, and Krook (BGK) model.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.collision_bgk-Tuple{Any, Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.collision_bgk","text":"collision_bgk(u, dt, equations::LatticeBoltzmannEquations3D)\n\nCollision operator for the Bhatnagar, Gross, and Krook (BGK) model.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.cons2cons-Tuple{Any, Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.cons2cons","text":"cons2cons(u, equations)\n\nReturn the conserved variables u. While this function is as trivial as identity, it is also as useful.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.cons2entropy","page":"Trixi.jl","title":"Trixi.cons2entropy","text":"cons2entropy(u, equations)\n\nConvert the conserved variables u to the entropy variables for a given set of equations with chosen standard entropy.\n\nu is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by entropy2cons.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.cons2prim","page":"Trixi.jl","title":"Trixi.cons2prim","text":"cons2prim(u, equations)\n\nConvert the conserved variables u to the primitive variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by prim2cons.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.convergence_test-Tuple{Module, AbstractString, Any}","page":"Trixi.jl","title":"Trixi.convergence_test","text":"convergence_test([mod::Module=Main,] elixir::AbstractString, iterations; kwargs...)\n\nRun iterations Trixi.jl simulations using the setup given in elixir and compute the experimental order of convergence (EOC) in the L^2 and L^infty norm. In each iteration, the resolution of the respective mesh will be doubled. Additional keyword arguments kwargs... and the optional module mod are passed directly to trixi_include.\n\nThis function assumes that the spatial resolution is set via the keywords initial_refinement_level (an integer) or cells_per_dimension (a tuple of integers, one per spatial dimension).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_analysis_errors-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.default_analysis_errors","text":"default_analysis_errors(equations)\n\nDefault analysis errors (:l2_error and :linf_error) used by the AnalysisCallback.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_analysis_integrals-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.default_analysis_integrals","text":"default_analysis_integrals(equations)\n\nDefault analysis integrals used by the AnalysisCallback.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_example-Tuple{}","page":"Trixi.jl","title":"Trixi.default_example","text":"default_example()\n\nReturn the path to an example elixir that can be used to quickly see Trixi.jl in action on a TreeMesh. See also examples_dir and get_examples.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.default_example_unstructured-Tuple{}","page":"Trixi.jl","title":"Trixi.default_example_unstructured","text":"default_example_unstructured()\n\nReturn the path to an example elixir that can be used to quickly see Trixi.jl in action on an UnstructuredMesh2D. This simulation is run on the example curved, unstructured mesh given in the Trixi.jl documentation regarding unstructured meshes.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.density-Tuple{Real, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.density","text":"density(p::Real, equations::LatticeBoltzmannEquations2D)\ndensity(u, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic density from the pressure p or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.density-Tuple{Real, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.density","text":"density(p::Real, equations::LatticeBoltzmannEquations3D)\ndensity(u, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic density from the pressure p or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.download-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.download","text":"Trixi.download(src_url, file_path)\n\nDownload a file from given src_url to given file_path if file_path is not already a file. This function just returns file_path. This is a small wrapper of Downloads.download(src_url, file_path) that avoids race conditions when multiple MPI ranks are used.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_dof_global-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_dof_global","text":"each_dof_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the degrees of freedom (DOF) in dg. In particular, not the DOFs themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_face_node-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_face_node","text":"each_face_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the face nodes in dg. In particular, not the face_nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_face_node_global-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_face_node_global","text":"each_face_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the face nodes in mesh. In particular, not the face nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_quad_node-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_quad_node","text":"each_quad_node(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the quadrature nodes in dg. In particular, not the quadrature nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.each_quad_node_global-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.each_quad_node_global","text":"each_quad_node_global(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the global quadrature nodes in mesh. In particular, not the quadrature nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachboundary-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachboundary","text":"eachboundary(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the boundaries in cache. In particular, not the boundaries themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachcomponent-Tuple{Trixi.AbstractCompressibleEulerMulticomponentEquations}","page":"Trixi.jl","title":"Trixi.eachcomponent","text":"eachcomponent(equations::AbstractCompressibleEulerMulticomponentEquations)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the components in AbstractCompressibleEulerMulticomponentEquations. In particular, not the components themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachcomponent-Tuple{Trixi.AbstractIdealGlmMhdMulticomponentEquations}","page":"Trixi.jl","title":"Trixi.eachcomponent","text":"eachcomponent(equations::AbstractIdealGlmMhdMulticomponentEquations)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the components in AbstractIdealGlmMhdMulticomponentEquations. In particular, not the components themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachdim-Tuple{Any}","page":"Trixi.jl","title":"Trixi.eachdim","text":"eachdim(mesh)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the dimensions in AbstractTree. In particular, not the dimensions themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachdirection-Tuple{Trixi.AbstractTree}","page":"Trixi.jl","title":"Trixi.eachdirection","text":"eachdirection(tree::AbstractTree)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the directions in AbstractTree. In particular, not the directions themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in cache. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{DGMultiMesh, DGMulti{NDIMS, ElemType, ApproxType} where {NDIMS, ElemType, ApproxType}, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(mesh::DGMultiMesh, dg::DGMulti, other_args...)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in mesh. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.ElementContainer1D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::ElementContainer1D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.ElementContainer2D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::ElementContainer2D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.ElementContainer3D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::ElementContainer3D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachelement-Tuple{Trixi.UnstructuredElementContainer2D}","page":"Trixi.jl","title":"Trixi.eachelement","text":"eachelement(elements::UnstructuredElementContainer2D)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the elements in elements. In particular, not the elements themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachinterface-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachinterface","text":"eachinterface(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the interfaces in cache. In particular, not the interfaces themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachmortar-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachmortar","text":"eachmortar(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the mortars in cache. In particular, not the mortars themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachmpiinterface-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachmpiinterface","text":"eachmpiinterface(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the MPI interfaces in cache. In particular, not the interfaces themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachmpimortar-Tuple{DG, Any}","page":"Trixi.jl","title":"Trixi.eachmpimortar","text":"eachmpimortar(dg::DG, cache)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the MPI mortars in cache. In particular, not the mortars themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachnode-Tuple{DG}","page":"Trixi.jl","title":"Trixi.eachnode","text":"eachnode(dg::DG)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the nodes in dg. In particular, not the nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachnode-Tuple{LobattoLegendreBasis}","page":"Trixi.jl","title":"Trixi.eachnode","text":"eachnode(basis::LobattoLegendreBasis)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the nodes in basis. In particular, not the nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachnode-Tuple{Trixi.LobattoLegendreAnalyzer}","page":"Trixi.jl","title":"Trixi.eachnode","text":"eachnode(analyzer::LobattoLegendreAnalyzer)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the nodes in analyzer. In particular, not the nodes themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.eachvariable-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.eachvariable","text":"eachvariable(equations::AbstractEquations)\n\nReturn an iterator over the indices that specify the location in relevant data structures for the variables in equations. In particular, not the variables themselves are returned.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.energy_internal","page":"Trixi.jl","title":"Trixi.energy_internal","text":"energy_internal(u, equations)\n\nReturn the internal energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.energy_kinetic","page":"Trixi.jl","title":"Trixi.energy_kinetic","text":"energy_kinetic(u, equations)\n\nReturn the kinetic energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.energy_total","page":"Trixi.jl","title":"Trixi.energy_total","text":"energy_total(u, equations)\n\nReturn the total energy of the conserved variables u for a given set of equations, e.g., the CompressibleEulerEquations2D.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.entropy","page":"Trixi.jl","title":"Trixi.entropy","text":"entropy(u, equations)\n\nReturn the chosen entropy of the conserved variables u for a given set of equations.\n\nu is a vector of the conserved variables at a single node, i.e., a vector of the correct length nvariables(equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.entropy2cons","page":"Trixi.jl","title":"Trixi.entropy2cons","text":"entropy2cons(w, equations)\n\nConvert the entropy variables w based on a standard entropy to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2entropy.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.equilibrium_distribution-Tuple{Any, Any, Any, Any, Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.equilibrium_distribution","text":"equilibrium_distribution(alpha, rho, v1, v2, v3, equations::LatticeBoltzmannEquations3D)\n\nCalculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2, v3.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.equilibrium_distribution-Tuple{Any, Any, Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.equilibrium_distribution","text":"equilibrium_distribution(alpha, rho, v1, v2, equations::LatticeBoltzmannEquations2D)\n\nCalculate the local equilibrium distribution for the distribution function with index alpha and given the macroscopic state defined by rho, v1, v2.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.examples_dir-Tuple{}","page":"Trixi.jl","title":"Trixi.examples_dir","text":"examples_dir()\n\nReturn the directory where the example files provided with Trixi.jl are located. If Trixi.jl is installed as a regular package (with ]add Trixi), these files are read-only and should not be modified. To find out which files are available, use, e.g., readdir:\n\nExamples\n\nreaddir(examples_dir())\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux","page":"Trixi.jl","title":"Trixi.flux","text":"flux(u, orientation_or_normal, equations)\n\nGiven the conservative variables u, calculate the (physical) flux in Cartesian direction orientation::Integer or in arbitrary direction normal::AbstractVector for the corresponding set of governing equations. orientation is 1, 2, and 3 for the x-, y-, and z-directions, respectively.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.flux-Tuple{Any, AbstractVector, Trixi.AbstractEquations{1}}","page":"Trixi.jl","title":"Trixi.flux","text":"flux(u, normal_direction::AbstractVector, equations::AbstractEquations{1})\n\nEnables calling flux with a non-integer argument normal_direction for one-dimensional equations. Returns the value of flux(u, 1, equations) scaled by normal_direction[1].\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_central-Tuple{Any, Any, Any, Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.flux_central","text":"flux_central(u_ll, u_rr, orientation_or_normal_direction, equations::AbstractEquations)\n\nThe classical central numerical flux f((u_ll) + f(u_rr)) / 2. When this flux is used as volume flux, the discretization is equivalent to the classical weak form DG method (except floating point errors).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chan_etal-Tuple{Any, Any, Integer, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_chan_etal","text":"@inline function fluxchanetal(ull, urr, orientation::Integer, equations::CompressibleEulerEquationsQuasi1D)\n\nConservative (symmetric) part of the entropy conservative flux for quasi 1D compressible Euler equations split form. This flux is a generalization of flux_ranocha for CompressibleEulerEquations1D. Further details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089 \n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chan_etal-Tuple{Any, Any, Integer, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_chan_etal","text":"flux_chan_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterEquationsQuasi1D)\n\nTotal energy conservative (mathematical entropy for quasi 1D shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., FluxPlusDissipation(flux_chan_etal, DissipationLocalLaxFriedrichs()).\n\nFurther details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nEntropy conserving two-point flux by\n\nChandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)\n\nEntropy conserving two-point flux by\n\nChandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)\n\nEntropy conserving two-point flux by\n\nChandrashekar (2013) Kinetic Energy Preserving and Entropy Stable Finite Volume Schemes for Compressible Euler and Navier-Stokes Equations DOI: 10.4208/cicp.170712.010313a\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations1D)\n\nEntropy conserving two-point flux by\n\nAyoub Gouasmi, Karthik Duraisamy (2020) \"Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations\" arXiv:1904.00972v3 [math.NA] 4 Feb 2020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_chandrashekar-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_chandrashekar","text":"flux_chandrashekar(u_ll, u_rr, orientation, equations::CompressibleEulerMulticomponentEquations2D)\n\nAdaption of the entropy conserving two-point flux by\n\nAyoub Gouasmi, Karthik Duraisamy (2020) \"Formulation of Entropy-Stable schemes for the multicomponent compressible Euler equations\" arXiv:1904.00972v3 [math.NA] 4 Feb 2020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)\n\nEntropy conserving two-point flux by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations2D)\n\nEntropy conserving two-point flux by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations3D)\n\nEntropy conserving two-point flux by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)\n\nEntropy conserving two-point flux adapted by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_derigs_etal-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_derigs_etal","text":"flux_derigs_etal(u_ll, u_rr, orientation, equations::IdealGlmMhdMulticomponentEquations2D)\n\nEntropy conserving two-point flux adapted by\n\nDerigs et al. (2018) Ideal GLM-MHD: About the entropy consistent nine-wave magnetic field divergence diminishing ideal magnetohydrodynamics equations for multicomponent DOI: 10.1016/j.jcp.2018.03.002\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_fjordholm_etal","text":"flux_fjordholm_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterEquations1D)\n\nTotal energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.\n\nDetails are available in Eq. (4.1) in the paper:\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_fjordholm_etal","text":"flux_fjordholm_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterEquations2D)\n\nTotal energy conservative (mathematical entropy for shallow water equations). When the bottom topography is nonzero this should only be used as a surface flux otherwise the scheme will not be well-balanced. For well-balancedness in the volume flux use flux_wintermeyer_etal.\n\nDetails are available in Eq. (4.1) in the paper:\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_godunov-Tuple{Any, Any, Integer, LinearizedEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_godunov","text":"flux_godunov(u_ll, u_rr, orientation_or_normal_direction,\n equations::LinearizedEulerEquations2D)\n\nAn upwind flux for the linearized Euler equations based on diagonalization of the physical flux matrix. Given the physical flux Au, A=T Lambda T^-1 with Lambda being a diagonal matrix that holds the eigenvalues of A, decompose Lambda = Lambda^+ + Lambda^- where Lambda^+ and Lambda^- are diagonal matrices holding the positive and negative eigenvalues of A, respectively. Then for left and right states u_L u_R, the numerical flux calculated by this function is given by A^+ u_L + A^- u_R where A^pm = T Lambda^pm T^-1.\n\nThe diagonalization of the flux matrix can be found in\n\nR. F. Warming, Richard M. Beam and B. J. Hyett (1975) Diagonalization and simultaneous symmetrization of the gas-dynamic matrices DOI: 10.1090/S0025-5718-1975-0388967-5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdEquations1D)\n\nEntropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdEquations2D)\n\nEntropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdEquations3D)\n\nEntropy conserving and kinetic energy preserving two-point flux of Hindenlang and Gassner (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdMulticomponentEquations1D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hindenlang_gassner-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_hindenlang_gassner","text":"flux_hindenlang_gassner(u_ll, u_rr, orientation_or_normal_direction,\n equations::IdealGlmMhdMulticomponentEquations2D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux of Hindenlang (2019), extending flux_ranocha to the MHD equations.\n\nReferences\n\nFlorian Hindenlang, Gregor Gassner (2019) A new entropy conservative two-point flux for ideal MHD equations derived from first principles. Presented at HONOM 2019: European workshop on high order numerical methods for evolutionary PDEs, theory and applications\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nComputes the HLLC flux (HLL with Contact) for compressible Euler equations developed by E.F. Toro Lecture slides Signal speeds: DOI: 10.1137/S1064827593260140\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations2D)\n\nComputes the HLLC flux (HLL with Contact) for compressible Euler equations developed by E.F. Toro Lecture slides Signal speeds: DOI: 10.1137/S1064827593260140\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations3D)\n\nComputes the HLLC flux (HLL with Contact) for compressible Euler equations developed by E.F. Toro Lecture slides Signal speeds: DOI: 10.1137/S1064827593260140\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_hllc-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hllc","text":"flux_hllc(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)\n\nLi (2005)\n\nAn HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_kennedy_gruber-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_kennedy_gruber","text":"flux_kennedy_gruber(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nKinetic energy preserving two-point flux by\n\nKennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_kennedy_gruber-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_kennedy_gruber","text":"flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations2D)\n\nKinetic energy preserving two-point flux by\n\nKennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_kennedy_gruber-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_kennedy_gruber","text":"flux_kennedy_gruber(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nKinetic energy preserving two-point flux by\n\nKennedy and Gruber (2008) Reduced aliasing formulations of the convective terms within the Navier-Stokes equations for a compressible fluid DOI: 10.1016/j.jcp.2007.09.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_audusse_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_audusse_etal","text":"flux_nonconservative_audusse_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nNon-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.\n\nThis hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations1D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.\n\nFurther details on the hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_audusse_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_audusse_etal","text":"flux_nonconservative_audusse_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_audusse_etal(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nNon-symmetric two-point surface flux that discretizes the nonconservative (source) term. The discretization uses the hydrostatic_reconstruction_audusse_etal on the conservative variables.\n\nThis hydrostatic reconstruction ensures that the finite volume numerical fluxes remain well-balanced for discontinuous bottom topographies ShallowWaterEquations2D. Should be used together with FluxHydrostaticReconstruction and hydrostatic_reconstruction_audusse_etal in the surface flux to ensure consistency.\n\nFurther details for the hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_chan_etal-Tuple{Any, Any, Integer, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_chan_etal","text":"flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,\n equations::CompressibleEulerEquationsQuasi1D)\nflux_nonconservative_chan_etal(u_ll, u_rr, normal_direction, \n equations::CompressibleEulerEquationsQuasi1D)\nflux_nonconservative_chan_etal(u_ll, u_rr, normal_ll, normal_rr,\n equations::CompressibleEulerEquationsQuasi1D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the pressure CompressibleEulerEquationsQuasi1D and the nozzle width.\n\nFurther details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089 \n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_chan_etal-Tuple{Any, Any, Integer, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_chan_etal","text":"flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquationsQuasi1D)\nflux_nonconservative_chan_etal(u_ll, u_rr, normal_direction::AbstractVector,\n equations::ShallowWaterEquationsQuasi1D) \nflux_nonconservative_chan_etal(u_ll, u_rr, \n normal_ll::AbstractVector, normal_rr::AbstractVector,\n equations::ShallowWaterEquationsQuasi1D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquationsQuasi1D and the channel width.\n\nFurther details are available in the paper:\n\nJesse Chan, Khemraj Shukla, Xinhui Wu, Ruofeng Liu, Prani Nalluri (2023) High order entropy stable schemes for the quasi-one-dimensional shallow water and compressible Euler equations DOI: 10.48550/arXiv.2307.12089\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_ersing_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_ersing_etal","text":"flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.\n\nThis is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.\n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_ersing_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_ersing_etal","text":"flux_nonconservative_ersing_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_ersing_etal(u_ll, u_rr,\n normal_direction_ll::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric path-conservative two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nThis is a modified version of flux_nonconservative_wintermeyer_etal that gives entropy conservation and well-balancedness in both the volume and surface when combined with flux_wintermeyer_etal.\n\nFor further details see:\n\nPatrick Ersing, Andrew R. Winters (2023) An entropy stable discontinuous Galerkin method for the two-layer shallow water equations on curvilinear meshes DOI: 10.48550/arXiv.2306.12699\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_fjordholm_etal","text":"flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nNon-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations1D.\n\nThis contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.\n\nFurther details for the original finite volume formulation are available in\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\nand for curvilinear 2D case in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_fjordholm_etal","text":"flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_fjordholm_etal(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nNon-symmetric two-point surface flux discretizing the nonconservative (source) term of that contains the gradient of the bottom topography ShallowWaterEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nThis contains additional terms compared to flux_nonconservative_wintermeyer_etal that account for possible discontinuities in the bottom topography function. Thus, this flux should be used in general at interfaces. For flux differencing volume terms, flux_nonconservative_wintermeyer_etal is analytically equivalent but slightly cheaper.\n\nFurther details for the original finite volume formulation are available in\n\nUlrik S. Fjordholm, Siddhartha Mishr and Eitan Tadmor (2011) Well-balanced and energy stable schemes for the shallow water equations with discontinuous topography DOI: 10.1016/j.jcp.2011.03.042\n\nand for curvilinear 2D case in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell","text":"flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,\n equations::IdealGlmMhdEquations2D)\nflux_nonconservative_powell(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::IdealGlmMhdEquations2D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nReferences\n\nMarvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell","text":"flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,\n equations::IdealGlmMhdEquations3D)\nflux_nonconservative_powell(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::IdealGlmMhdEquations3D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations3D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nReferences\n\nMarvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell-Tuple{Any, Any, Integer, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell","text":"flux_nonconservative_powell(u_ll, u_rr, orientation::Integer,\n equations::IdealGlmMhdMulticomponentEquations2D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdMulticomponentEquations2D.\n\nReferences\n\nMarvin Bohm, Andrew R.Winters, Gregor J. Gassner, Dominik Derigs, Florian Hindenlang, Joachim Saur An entropy stable nodal discontinuous Galerkin method for the resistive MHD equations. Part I: Theory and numerical verification DOI: 10.1016/j.jcp.2018.06.027\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell_local_symmetric-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D, Trixi.NonConservativeSymmetric, Integer}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell_local_symmetric","text":"flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,\n equations::IdealGlmMhdEquations2D,\n nonconservative_type::NonConservativeSymmetric,\n nonconservative_term::Integer)\n\nSymmetric part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered \"fluxes\" for subcell limiting. See, e.g.,\n\nRueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.\n\nThis function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell_local_symmetric-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell_local_symmetric","text":"flux_nonconservative_powell_local_symmetric(u_ll, u_rr,\n orientation::Integer,\n equations::IdealGlmMhdEquations2D)\n\nNon-symmetric two-point flux discretizing the nonconservative (source) term of Powell and the Galilean nonconservative term associated with the GLM multiplier of the IdealGlmMhdEquations2D.\n\nThis implementation uses a non-conservative term that can be written as the product of local and symmetric parts. It is equivalent to the non-conservative flux of Bohm et al. (flux_nonconservative_powell) for conforming meshes but it yields different results on non-conforming meshes(!).\n\nThe two other flux functions with the same name return either the local or symmetric portion of the non-conservative flux based on the type of the nonconservativetype argument, employing multiple dispatch. They are used to compute the subcell fluxes in dg2dsubcelllimiters.jl.\n\nReferences\n\nRueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_powell_local_symmetric-Tuple{Any, Integer, IdealGlmMhdEquations2D, Trixi.NonConservativeLocal, Integer}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_powell_local_symmetric","text":"flux_nonconservative_powell_local_symmetric(u_ll, orientation::Integer,\n equations::IdealGlmMhdEquations2D,\n nonconservative_type::NonConservativeLocal,\n nonconservative_term::Integer)\n\nLocal part of the Powell and GLM non-conservative terms. Needed for the calculation of the non-conservative staggered \"fluxes\" for subcell limiting. See, e.g.,\n\nRueda-Ramírez, Gassner (2023). A Flux-Differencing Formula for Split-Form Summation By Parts Discretizations of Non-Conservative Systems. https://arxiv.org/pdf/2211.14009.pdf.\n\nThis function is used to compute the subcell fluxes in dg2dsubcell_limiters.jl.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_wintermeyer_etal","text":"flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations1D.\n\nFurther details are available in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_wintermeyer_etal","text":"flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations2D)\nflux_nonconservative_wintermeyer_etal(u_ll, u_rr,\n normal_direction_ll ::AbstractVector,\n normal_direction_average::AbstractVector,\n equations::ShallowWaterEquations2D)\n\nNon-symmetric two-point volume flux discretizing the nonconservative (source) term that contains the gradient of the bottom topography ShallowWaterEquations2D.\n\nOn curvilinear meshes, this nonconservative flux depends on both the contravariant vector (normal direction) at the current node and the averaged one. This is different from numerical fluxes used to discretize conservative terms.\n\nFurther details are available in the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction, equations::CompressibleEulerEquations1D)\n\nEntropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations2D)\n\nEntropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nEntropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerMulticomponentEquations1D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha-Tuple{Any, Any, Integer, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.flux_ranocha","text":"flux_ranocha(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerMulticomponentEquations2D)\n\nAdaption of the entropy conserving and kinetic energy preserving two-point flux by\n\nHendrik Ranocha (2018) Generalised Summation-by-Parts Operators and Entropy Stability of Numerical Methods for Hyperbolic Balance Laws PhD thesis, TU Braunschweig\n\nSee also\n\nHendrik Ranocha (2020) Entropy Conserving and Kinetic Energy Preserving Numerical Methods for the Euler Equations Using Summation-by-Parts Operators Proceedings of ICOSAHOM 2018\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_ranocha_turbo-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.flux_ranocha_turbo","text":"flux_ranocha_turbo(u_ll, u_rr, orientation_or_normal_direction, equations)\n\nEquivalent to flux_ranocha except that it may use specialized methods, e.g., when used with VolumeIntegralFluxDifferencing. These specialized methods may enable better use of SIMD instructions to increase runtime efficiency on modern hardware.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_shima_etal","text":"flux_shima_etal(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nThis flux is is a modification of the original kinetic energy preserving two-point flux by\n\nYuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058\n\nThe modification is in the energy flux to guarantee pressure equilibrium and was developed by\n\nNao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_shima_etal","text":"flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations2D)\n\nThis flux is is a modification of the original kinetic energy preserving two-point flux by\n\nYuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058\n\nThe modification is in the energy flux to guarantee pressure equilibrium and was developed by\n\nNao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_shima_etal","text":"flux_shima_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::CompressibleEulerEquations3D)\n\nThis flux is is a modification of the original kinetic energy preserving two-point flux by\n\nYuichi Kuya, Kosuke Totani and Soshi Kawai (2018) Kinetic energy and entropy preserving schemes for compressible flows by split convective forms DOI: 10.1016/j.jcp.2018.08.058\n\nThe modification is in the energy flux to guarantee pressure equilibrium and was developed by\n\nNao Shima, Yuichi Kuya, Yoshiharu Tamaki, Soshi Kawai (JCP 2020) Preventing spurious pressure oscillations in split convective form discretizations for compressible flows DOI: 10.1016/j.jcp.2020.110060\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_shima_etal_turbo-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.flux_shima_etal_turbo","text":"flux_shima_etal_turbo(u_ll, u_rr, orientation_or_normal_direction, equations)\n\nEquivalent to flux_shima_etal except that it may use specialized methods, e.g., when used with VolumeIntegralFluxDifferencing. These specialized methods may enable better use of SIMD instructions to increase runtime efficiency on modern hardware.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.flux_wintermeyer_etal","text":"flux_wintermeyer_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterEquations1D)\n\nTotal energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.\n\nFurther details are available in Theorem 1 of the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.flux_wintermeyer_etal","text":"flux_wintermeyer_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterEquations2D)\n\nTotal energy conservative (mathematical entropy for shallow water equations) split form. When the bottom topography is nonzero this scheme will be well-balanced when used as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_etal.\n\nFurther details are available in Theorem 1 of the paper:\n\nNiklas Wintermeyer, Andrew R. Winters, Gregor J. Gassner and David A. Kopriva (2017) An entropy stable nodal discontinuous Galerkin method for the two dimensional shallow water equations on unstructured curvilinear meshes with discontinuous bathymetry DOI: 10.1016/j.jcp.2017.03.036\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_winters_etal-Tuple{Any, Any, AbstractVector, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_winters_etal","text":"flux_winters_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::PolytropicEulerEquations2D)\n\nEntropy conserving two-point flux for isothermal or polytropic gases. Requires a special weighted Stolarsky mean for the evaluation of the density denoted here as stolarsky_mean. Note, for isothermal gases where gamma = 1 this stolarsky_mean becomes the ln_mean.\n\nFor details see Section 3.2 of the following reference\n\nAndrew R. Winters, Christof Czernik, Moritz B. Schily & Gregor J. Gassner (2020) Entropy stable numerical approximations for the isothermal and polytropic Euler equations DOI: 10.1007/s10543-019-00789-w\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_boundary_outer_state-Tuple{BoundaryConditionDirichlet, Any, Any, Any, Any, Vararg{Any}}","page":"Trixi.jl","title":"Trixi.get_boundary_outer_state","text":"get_boundary_outer_state(boundary_condition::BoundaryConditionDirichlet,\n cache, t, equations, dg, indices...)\n\nFor subcell limiting, the calculation of local bounds for non-periodic domains require the boundary outer state. This function returns the boundary value at time t and for node with spatial indices indices.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_examples-Tuple{}","page":"Trixi.jl","title":"Trixi.get_examples","text":"get_examples()\n\nReturn a list of all example elixirs that are provided by Trixi.jl. See also examples_dir and default_example.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_name-Tuple{Any}","page":"Trixi.jl","title":"Trixi.get_name","text":"get_name(x)\n\nReturns a name of x ready for pretty printing. By default, return string(y) if x isa Val{y} and return string(x) otherwise.\n\nExamples\n\njulia> Trixi.get_name(\"test\")\n\"test\"\n\njulia> Trixi.get_name(Val(:test))\n\"test\"\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.get_name-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.get_name","text":"get_name(equations::AbstractEquations)\n\nReturns the canonical, human-readable name for the given system of equations.\n\nExamples\n\njulia> Trixi.get_name(CompressibleEulerEquations1D(1.4))\n\"CompressibleEulerEquations1D\"\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.getmesh-Tuple{Trixi.AbstractPlotData}","page":"Trixi.jl","title":"Trixi.getmesh","text":"getmesh(pd::AbstractPlotData)\n\nExtract grid lines from pd for plotting with Plots.plot.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.global_mean_vars-Tuple{AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.global_mean_vars","text":"global_mean_vars(equations::AcousticPerturbationEquations2D)\n\nReturns the global mean variables stored in equations. This makes it easier to define flexible initial conditions for problems with constant mean flow.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.have_nonconservative_terms-Tuple{Trixi.AbstractEquations}","page":"Trixi.jl","title":"Trixi.have_nonconservative_terms","text":"have_nonconservative_terms(equations)\n\nTrait function determining whether equations represent a conservation law with or without nonconservative terms. Classical conservation laws such as the CompressibleEulerEquations2D do not have nonconservative terms. The ShallowWaterEquations2D with non-constant bottom topography are an example of equations with nonconservative terms. The return value will be True() or False() to allow dispatching on the return type.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.hydrostatic_reconstruction_audusse_etal-Tuple{Any, Any, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.hydrostatic_reconstruction_audusse_etal","text":"hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterEquations1D)\n\nA particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations1D. The reconstructed solution states u_ll_star and u_rr_star variables are then used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.\n\nFurther details on this hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.hydrostatic_reconstruction_audusse_etal-Tuple{Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.hydrostatic_reconstruction_audusse_etal","text":"hydrostatic_reconstruction_audusse_etal(u_ll, u_rr, orientation_or_normal_direction,\n equations::ShallowWaterEquations2D)\n\nA particular type of hydrostatic reconstruction on the water height to guarantee well-balancedness for a general bottom topography ShallowWaterEquations2D. The reconstructed solution states u_ll_star and u_rr_star variables are used to evaluate the surface numerical flux at the interface. Use in combination with the generic numerical flux routine FluxHydrostaticReconstruction.\n\nFurther details for the hydrostatic reconstruction and its motivation can be found in\n\nEmmanuel Audusse, François Bouchut, Marie-Odile Bristeau, Rupert Klein, and Benoit Perthame (2004) A fast and stable well-balanced scheme with hydrostatic reconstruction for shallow water flows DOI: 10.1137/S1064827503431090\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.init_mpi-Tuple{}","page":"Trixi.jl","title":"Trixi.init_mpi","text":"init_mpi()\n\nInitialize MPI by calling MPI.Initialized(). The function will check if MPI is already initialized and if yes, do nothing, thus it is safe to call it multiple times.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.init_p4est-Tuple{}","page":"Trixi.jl","title":"Trixi.init_p4est","text":"init_p4est()\n\nInitialize p4est by calling p4est_init and setting the log level to SC_LP_ERROR. This function will check if p4est is already initialized and if yes, do nothing, thus it is safe to call it multiple times.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.init_t8code-Tuple{}","page":"Trixi.jl","title":"Trixi.init_t8code","text":"init_t8code()\n\nInitialize t8code by calling sc_init, p4est_init, and t8_init while setting the log level to SC_LP_ERROR. This function will check if t8code is already initialized and if yes, do nothing, thus it is safe to call it multiple times.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::AcousticPerturbationEquations2D)\n\nA constant initial condition where the state variables are zero and the mean flow is constant. Uses the global mean values from equations.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::CompressibleEulerEquations1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::CompressibleEulerEquations2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::CompressibleEulerEquations3D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::IdealGlmMhdEquations1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::IdealGlmMhdEquations2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::IdealGlmMhdEquations3D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::InviscidBurgersEquation1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LatticeBoltzmannEquations2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LatticeBoltzmannEquations3D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_constant-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_constant","text":"initial_condition_constant(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA constant initial condition to test free-stream preservation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::AcousticPerturbationEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test. Uses the global mean values from equations.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations3D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerEquationsQuasi1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerMulticomponentEquations1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::CompressibleEulerMulticomponentEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdEquations1D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdEquations2D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdEquations3D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdMulticomponentEquations1D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::IdealGlmMhdMulticomponentEquations2D)\n\nAn Alfvén wave as smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::InviscidBurgersEquation1D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA smooth initial condition used for convergence tests (in combination with BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, LinearizedEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::LinearizedEulerEquations2D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::PolytropicEulerEquations2D)\n\nManufactured smooth initial condition used for convergence tests in combination with source_terms_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::ShallowWaterEquations2D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::ShallowWaterEquationsQuasi1D)\n\nA smooth initial condition used for convergence tests in combination with source_terms_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_convergence_test-Tuple{Any, Any, TrafficFlowLWREquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_convergence_test","text":"initial_condition_convergence_test(x, t, equations::TrafficFlowLWREquations1D)\n\nA smooth initial condition used for convergence tests.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_density_wave-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_density_wave","text":"initial_condition_density_wave(x, t, equations::CompressibleEulerEquations1D)\n\nA sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper\n\nGregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026\n\nwith the following parameters\n\ndomain [-1, 1]\nmesh = 4x4\npolydeg = 5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_density_wave-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_density_wave","text":"initial_condition_density_wave(x, t, equations::CompressibleEulerEquations2D)\n\nA sine wave in the density with constant velocity and pressure; reduces the compressible Euler equations to the linear advection equations. This setup is the test case for stability of EC fluxes from paper\n\nGregor J. Gassner, Magnus Svärd, Florian J. Hindenlang (2020) Stability issues of entropy-stable and/or split-form high-order schemes arXiv: 2007.09026\n\nwith the following parameters\n\ndomain [-1, 1]\nmesh = 4x4\npolydeg = 5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations1D)\n\nOne dimensional variant of the setup used for convergence tests of the Euler equations with self-gravity from\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nnote: Note\nThere is no additional source term necessary for the manufactured solution in one spatial dimension. Thus, source_terms_eoc_test_coupled_euler_gravity is not present there.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::CompressibleEulerEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_eoc_test_coupled_euler_gravity or source_terms_eoc_test_euler.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::HyperbolicDiffusionEquations1D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_harmonic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, HyperbolicDiffusionEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::HyperbolicDiffusionEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_harmonic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_eoc_test_coupled_euler_gravity-Tuple{Any, Any, HyperbolicDiffusionEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_eoc_test_coupled_euler_gravity","text":"initial_condition_eoc_test_coupled_euler_gravity(x, t, equations::HyperbolicDiffusionEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with source_terms_harmonic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equations::AcousticPerturbationEquations2D)\n\nA Gaussian pulse in a constant mean flow. Uses the global mean values from equations.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA Gaussian pulse used together with BoundaryConditionDirichlet(initial_condition_gauss).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equation::LinearScalarAdvectionEquation2D)\n\nA Gaussian pulse used together with BoundaryConditionDirichlet(initial_condition_gauss).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_gauss-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_gauss","text":"initial_condition_gauss(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA Gaussian pulse.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_x-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_x","text":"initial_condition_linear_x(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA linear function of x[1] used together with boundary_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_x-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_x","text":"initial_condition_linear_x(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA linear function of x[1] used together with boundary_condition_linear_x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_x_y-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_x_y","text":"initial_condition_linear_x_y(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA linear function of x[1] + x[2] used together with boundary_condition_linear_x_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_y-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_y","text":"initial_condition_linear_y(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA linear function of x[1] used together with boundary_condition_linear_y.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_linear_z-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_linear_z","text":"initial_condition_linear_z(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA linear function of x[3] used together with boundary_condition_linear_z.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_poisson_nonperiodic-Tuple{Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_poisson_nonperiodic","text":"initial_condition_poisson_nonperiodic(x, t, equations::HyperbolicDiffusionEquations1D)\n\nA non-priodic smooth initial condition. Can be used for convergence tests in combination with source_terms_poisson_nonperiodic and boundary_condition_poisson_nonperiodic.\n\nnote: Note\nThe solution is periodic but the initial guess is not.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_sin-Tuple{Any, Any, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.initial_condition_sin","text":"initial_condition_sin(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA sine wave in the conserved variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_sin-Tuple{Any, Any, LinearScalarAdvectionEquation3D}","page":"Trixi.jl","title":"Trixi.initial_condition_sin","text":"initial_condition_sin(x, t, equations::LinearScalarAdvectionEquation1D)\n\nA sine wave in the conserved variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_sin_sin-Tuple{Any, Any, LinearScalarAdvectionEquation2D}","page":"Trixi.jl","title":"Trixi.initial_condition_sin_sin","text":"initial_condition_sin_sin(x, t, equations::LinearScalarAdvectionEquation2D)\n\nA sine wave in the conserved variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations1D)\n\nA weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations2D)\n\nA weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerEquations3D)\n\nA weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations1D)\n\nA for multicomponent adapted weak blast wave adapted to multicomponent and taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::CompressibleEulerMulticomponentEquations2D)\n\nA for multicomponent adapted weak blast wave taken from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations1D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations2D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdEquations3D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations1D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, IdealGlmMhdMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::IdealGlmMhdMulticomponentEquations2D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::PolytropicEulerEquations2D)\n\nA weak blast wave adapted from\n\nSebastian Hennemann, Gregor J. Gassner (2020) A provably entropy stable subcell shock capturing approach for high order split form DG arXiv: 2008.12044\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, ShallowWaterEquations1D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations1D)\n\nA weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.initial_condition_weak_blast_wave-Tuple{Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.initial_condition_weak_blast_wave","text":"initial_condition_weak_blast_wave(x, t, equations::ShallowWaterEquations2D)\n\nA weak blast wave discontinuity useful for testing, e.g., total energy conservation. Note for the shallow water equations to the total energy acts as a mathematical entropy function.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.integrate_via_indices-Union{Tuple{Func}, Tuple{Func, Any, Trixi.AbstractSemidiscretization, Vararg{Any}}} where Func","page":"Trixi.jl","title":"Trixi.integrate_via_indices","text":"integrate_via_indices(func, u_ode, semi::AbstractSemidiscretization, args...; normalize=true)\n\nCall func(u, i..., element, equations, solver, args...) for all nodal indices i..., element and integrate the result using a quadrature associated with the semidiscretization semi.\n\nIf normalize is true, the result is divided by the total volume of the computational domain.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.inv_ln_mean-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.inv_ln_mean","text":"inv_ln_mean(x, y)\n\nCompute the inverse 1 / ln_mean(x, y) of the logarithmic mean ln_mean.\n\nThis function may be used to increase performance where the inverse of the logarithmic mean is needed, by replacing a (slow) division by a (fast) multiplication.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.jacobian_ad_forward-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.jacobian_ad_forward","text":"jacobian_ad_forward(semi::AbstractSemidiscretization;\n t0=zero(real(semi)),\n u0_ode=compute_coefficients(t0, semi))\n\nUses the right-hand side operator of the semidiscretization semi and forward mode automatic differentiation to compute the Jacobian J of the semidiscretization semi at state u0_ode.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.jacobian_fd-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.jacobian_fd","text":"jacobian_fd(semi::AbstractSemidiscretization;\n t0=zero(real(semi)),\n u0_ode=compute_coefficients(t0, semi))\n\nUses the right-hand side operator of the semidiscretization semi and simple second order finite difference to compute the Jacobian J of the semidiscretization semi at state u0_ode.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.linear_structure-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.linear_structure","text":"linear_structure(semi::AbstractSemidiscretization;\n t0=zero(real(semi)))\n\nWraps the right-hand side operator of the semidiscretization semi at time t0 as an affine-linear operator given by a linear operator A and a vector b.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ln_mean-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.ln_mean","text":"ln_mean(x, y)\n\nCompute the logarithmic mean\n\nln_mean(x, y) = (y - x) / (log(y) - log(x)) = (y - x) / log(y / x)\n\nProblem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Ismail and Roe (2009). Set ξ = y / x. Then, we have\n\n(y - x) / log(y / x) = (x + y) / log(ξ) * (ξ - 1) / (ξ + 1)\n\nSet f = (ξ - 1) / (ξ + 1) = (y - x) / (x + y). Then, we use the expansion\n\nlog(ξ) = 2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7) + O(ξ^9)\n\nInserting the first few terms of this expansion yields\n\n(y - x) / log(ξ) ≈ (x + y) * f / (2 * f * (1 + f^2 / 3 + f^4 / 5 + f^6 / 7))\n = (x + y) / (2 + 2/3 * f^2 + 2/5 * f^4 + 2/7 * f^6)\n\nSince divisions are usually more expensive on modern hardware than multiplications (Agner Fog), we try to avoid computing two divisions. Thus, we use\n\nf^2 = (y - x)^2 / (x + y)^2\n = (x * (x - 2 * y) + y * y) / (x * (x + 2 * y) + y * y)\n\nGiven ε = 1.0e-4, we use the following algorithm.\n\nif f^2 < ε\n # use the expansion above\nelse\n # use the direct formula (y - x) / log(y / x)\nend\n\nReferences\n\nIsmail, Roe (2009). Affordable, entropy-consistent Euler flux functions II: Entropy production at shocks. DOI: 10.1016/j.jcp.2009.04.021\nAgner Fog. Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD, and VIA CPUs. https://www.agner.org/optimize/instruction_tables.pdf\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_adaptive_time_integrator!-Tuple{Any, AbstractString}","page":"Trixi.jl","title":"Trixi.load_adaptive_time_integrator!","text":"load_adaptive_time_integrator!(integrator, restart_file::AbstractString)\n\nLoad the context information for time integrators with error-based step size control saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_dt-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_dt","text":"load_dt(restart_file::AbstractString)\n\nLoad the time step size (dt in OrdinaryDiffEq.jl) saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_mesh-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_mesh","text":"load_mesh(restart_file::AbstractString; n_cells_max)\n\nLoad the mesh from the restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_time-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_time","text":"load_time(restart_file::AbstractString)\n\nLoad the time saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_timestep!-Tuple{Any, AbstractString}","page":"Trixi.jl","title":"Trixi.load_timestep!","text":"load_timestep!(integrator, restart_file::AbstractString)\n\nLoad the time step number saved in a restart_file and assign it to both the time step number and and the number of accepted steps (iter and stats.naccept in OrdinaryDiffEq.jl, respectively) in integrator.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.load_timestep-Tuple{AbstractString}","page":"Trixi.jl","title":"Trixi.load_timestep","text":"load_timestep(restart_file::AbstractString)\n\nLoad the time step number (iter in OrdinaryDiffEq.jl) saved in a restart_file.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.max-Tuple","page":"Trixi.jl","title":"Trixi.max","text":"max(x, y, ...)\n\nReturn the maximum of the arguments. See also the maximum function to take the maximum element from a collection.\n\nThis version in Trixi.jl is semantically equivalent to Base.max but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).\n\nExamples\n\njulia> max(2, 5, 1)\n5\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.max_abs_speed_naive","page":"Trixi.jl","title":"Trixi.max_abs_speed_naive","text":"max_abs_speed_naive(u_ll, u_rr, orientation::Integer, equations)\nmax_abs_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nSimple and fast estimate of the maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, based only on the local wave speeds associated to u_ll and u_rr.\n\nFor non-integer arguments normal_direction in one dimension, max_abs_speed_naive returns abs(normal_direction[1]) * max_abs_speed_naive(u_ll, u_rr, 1, equations).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.min-Tuple","page":"Trixi.jl","title":"Trixi.min","text":"min(x, y, ...)\n\nReturn the minimum of the arguments. See also the minimum function to take the minimum element from a collection.\n\nThis version in Trixi.jl is semantically equivalent to Base.min but may be implemented differently. In particular, it may avoid potentially expensive checks necessary in the presence of NaNs (or signed zeros).\n\nExamples\n\njulia> min(2, 5, 1)\n1\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_davis","page":"Trixi.jl","title":"Trixi.min_max_speed_davis","text":"min_max_speed_davis(u_ll, u_rr, orientation::Integer, equations)\nmin_max_speed_davis(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nSimple and fast estimates of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr.\n\nS.F. Davis (1988) Simplified Second-Order Godunov-Type Methods DOI: 10.1137/0909030\n\nSee eq. (10.38) from\n\nEleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction DOI: 10.1007/b79761\n\nSee also FluxHLL, min_max_speed_naive, min_max_speed_einfeldt.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations)\nmin_max_speed_einfeldt(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nMore advanced mininmal and maximal wave speed computation based on\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\noriginally developed for the compressible Euler equations. A compact representation can be found in this lecture notes, eq. (9.28).\n\nSee also FluxHLL, min_max_speed_naive, min_max_speed_davis.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, AbstractVector, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations2D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, AbstractVector, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, normal_direction, equations::CompressibleEulerEquations3D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nOriginal publication:\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\n\nCompactly summarized:\n\nSiddhartha Mishra, Ulrik Skre Fjordholm and Rémi Abgrall Numerical methods for conservation laws and related equations. Link\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations2D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation, equations::CompressibleEulerEquations3D)\n\nComputes the HLLE (Harten-Lax-van Leer-Einfeldt) flux for the compressible Euler equations. Special estimates of the signal velocites and linearization of the Riemann problem developed by Einfeldt to ensure that the internal energy and density remain positive during the computation of the numerical flux.\n\nBernd Einfeldt (1988) On Godunov-type methods for gas dynamics. DOI: 10.1137/0725021\nBernd Einfeldt, Claus-Dieter Munz, Philip L. Roe and Björn Sjögreen (1991) On Godunov-type methods near low densities. DOI: 10.1016/0021-9991(91)90211-3\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations::IdealGlmMhdEquations1D)\n\nCalculate minimum and maximum wave speeds for HLL-type fluxes as in\n\nLi (2005) An HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation::Integer, equations::IdealGlmMhdEquations2D)\n\nCalculate minimum and maximum wave speeds for HLL-type fluxes as in\n\nLi (2005) An HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_einfeldt-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.min_max_speed_einfeldt","text":"min_max_speed_einfeldt(u_ll, u_rr, orientation_or_normal_direction, equations::IdealGlmMhdEquations3D)\n\nCalculate minimum and maximum wave speeds for HLL-type fluxes as in\n\nLi (2005) An HLLC Riemann solver for magneto-hydrodynamics DOI: 10.1016/j.jcp.2004.08.020\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.min_max_speed_naive","page":"Trixi.jl","title":"Trixi.min_max_speed_naive","text":"min_max_speed_naive(u_ll, u_rr, orientation::Integer, equations)\nmin_max_speed_naive(u_ll, u_rr, normal_direction::AbstractVector, equations)\n\nSimple and fast estimate(!) of the minimal and maximal wave speed of the Riemann problem with left and right states u_ll, u_rr, usually based only on the local wave speeds associated to u_ll and u_rr. Slightly more diffusive than min_max_speed_davis.\n\nAmiram Harten, Peter D. Lax, Bram van Leer (1983) On Upstream Differencing and Godunov-Type Schemes for Hyperbolic Conservation Laws DOI: 10.1137/1025002\n\nSee eq. (10.37) from\n\nEleuterio F. Toro (2009) Riemann Solvers and Numerical Methods for Fluid Dynamics: A Practical Introduction DOI: 10.1007/b79761\n\nSee also FluxHLL, min_max_speed_davis, min_max_speed_einfeldt.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.modify_dt_for_tstops!-Tuple{Trixi.SimpleIntegratorSSP}","page":"Trixi.jl","title":"Trixi.modify_dt_for_tstops!","text":"modify_dt_for_tstops!(integrator::SimpleIntegratorSSP)\n\nModify the time-step size to match the time stops specified in integrator.opts.tstops. To avoid adding OrdinaryDiffEq to Trixi's dependencies, this routine is a copy of https://github.com/SciML/OrdinaryDiffEq.jl/blob/d76335281c540ee5a6d1bd8bb634713e004f62ee/src/integrators/integrator_utils.jl#L38-L54\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.multiply_dimensionwise-Tuple{AbstractMatrix, AbstractMatrix}","page":"Trixi.jl","title":"Trixi.multiply_dimensionwise","text":"multiply_dimensionwise(matrix::AbstractMatrix, data_in::AbstractArray{<:Any, NDIMS+1})\n\nMultiply the array data_in by matrix in each coordinate direction, where data_in is assumed to have the first coordinate for the number of variables and the remaining coordinates are multiplied by matrix.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.n_nonconservative_terms","page":"Trixi.jl","title":"Trixi.n_nonconservative_terms","text":"n_nonconservative_terms(equations)\n\nNumber of nonconservative terms in the form local * symmetric for a particular equation. This function needs to be specialized only if equations with nonconservative terms are combined with certain solvers (e.g., subcell limiting).\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.ndofs-Tuple{Trixi.AbstractSemidiscretization}","page":"Trixi.jl","title":"Trixi.ndofs","text":"ndofs(semi::AbstractSemidiscretization)\n\nReturn the number of degrees of freedom associated with each scalar variable.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.negative_part-Tuple{Any}","page":"Trixi.jl","title":"Trixi.negative_part","text":"negative_part(x)\n\nReturn x if x is negative, else zero. In other words, return (x - abs(x)) / 2 for real numbers x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ode_default_options-Tuple{}","page":"Trixi.jl","title":"Trixi.ode_default_options","text":"ode_default_options()\n\nReturn the default options for OrdinaryDiffEq's solve. Pass ode_default_options()... to solve to only return the solution at the final time and enable MPI aware error-based step size control, whenever MPI is used. For example, use solve(ode, alg; ode_default_options()...).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ode_norm-Tuple{Number, Any}","page":"Trixi.jl","title":"Trixi.ode_norm","text":"ode_norm(u, t)\n\nImplementation of the weighted L2 norm of Hairer and Wanner used for error-based step size control in OrdinaryDiffEq.jl. This function is aware of MPI and uses global MPI communication when running in parallel.\n\nYou must pass this function as a keyword argument internalnorm=ode_norm to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.\n\nSee the \"Advanced Adaptive Stepsize Control\" section of the documentation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.ode_unstable_check-NTuple{4, Any}","page":"Trixi.jl","title":"Trixi.ode_unstable_check","text":"ode_unstable_check(dt, u, semi, t)\n\nImplementation of the basic check for instability used in OrdinaryDiffEq.jl. Instead of checking something like any(isnan, u), this function just checks isnan(dt). This helps when using MPI parallelization, since no additional global communication is required and all ranks will return the same result.\n\nYou should pass this function as a keyword argument unstable_check=ode_unstable_check to OrdinaryDiffEq.jl's solve when using error-based step size control with MPI parallel execution of Trixi.jl.\n\nSee the \"Miscellaneous\" section of the documentation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.partition!-Tuple{T8codeMesh}","page":"Trixi.jl","title":"Trixi.partition!","text":"Trixi.partition!(mesh::T8codeMesh)\n\nPartition a T8codeMesh in order to redistribute elements evenly among MPI ranks.\n\nArguments\n\nmesh::T8codeMesh: Initialized mesh object.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.partition!-Tuple{TreeMesh{NDIMS, <:Trixi.ParallelTree{NDIMS}} where NDIMS}","page":"Trixi.jl","title":"Trixi.partition!","text":"partition!(mesh::ParallelTreeMesh, allow_coarsening=true)\n\nPartition mesh using a static domain decomposition algorithm based on leaf cell count and tree structure. If allow_coarsening is true, the algorithm will keep leaf cells together on one rank when needed for local coarsening (i.e. when all children of a cell are leaves).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.positive_part-Tuple{Any}","page":"Trixi.jl","title":"Trixi.positive_part","text":"positive_part(x)\n\nReturn x if x is positive, else zero. In other words, return (x + abs(x)) / 2 for real numbers x.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.pressure-Tuple{Real, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.pressure","text":"pressure(rho::Real, equations::LatticeBoltzmannEquations2D)\npressure(u, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic pressure from the density rho or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.pressure-Tuple{Real, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.pressure","text":"pressure(rho::Real, equations::LatticeBoltzmannEquations3D)\npressure(u, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic pressure from the density rho or the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.prim2cons","page":"Trixi.jl","title":"Trixi.prim2cons","text":"prim2cons(u, equations)\n\nConvert the primitive variables u to the conserved variables for a given set of equations. u is a vector type of the correct length nvariables(equations). Notice the function doesn't include any error checks for the purpose of efficiency, so please make sure your input is correct. The inverse conversion is performed by cons2prim.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.residual_steady_state-Tuple{Any, HyperbolicDiffusionEquations3D}","page":"Trixi.jl","title":"Trixi.residual_steady_state","text":"residual_steady_state(du, ::AbstractHyperbolicDiffusionEquations)\n\nUsed to determine the termination criterion of a SteadyStateCallback. For hyperbolic diffusion, this checks convergence of the potential phi.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.rotate_from_x","page":"Trixi.jl","title":"Trixi.rotate_from_x","text":"rotate_from_x(u, normal, equations)\n\nApply the rotation that maps the x-axis onto normal to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.\n\nSee also: rotate_to_x\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.rotate_to_x","page":"Trixi.jl","title":"Trixi.rotate_to_x","text":"rotate_to_x(u, normal, equations)\n\nApply the rotation that maps normal onto the x-axis to the convservative variables u. This is used by FluxRotated to calculate the numerical flux of rotationally invariant equations in arbitrary normal directions.\n\nSee also: rotate_from_x\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.save_plot-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.save_plot","text":"save_plot(plot_data, variable_names;\n show_mesh=true, plot_arguments=Dict{Symbol,Any}(),\n time=nothing, timestep=nothing)\n\nVisualize the plot data object provided in plot_data and save result as a PNG file in the out directory, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.\n\nThe timestep is used in the filename. time is currently unused by this function.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nSee also: VisualizationCallback, show_plot\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.set_log_type-Tuple{Any}","page":"Trixi.jl","title":"Trixi.set_log_type","text":"Trixi.set_log_type(type; force = true)\n\nSet the type of the (natural) log function to be used in Trixi.jl. The default is \"sqrt_Trixi_NaN\" which returns NaN for negative arguments instead of throwing an error. Alternatively, you can set type to \"sqrt_Base\" to use the Julia built-in sqrt function which provides a stack-trace of the error which might come in handy when debugging code.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.set_sqrt_type-Tuple{Any}","page":"Trixi.jl","title":"Trixi.set_sqrt_type","text":"Trixi.set_sqrt_type(type; force = true)\n\nSet the type of the square root function to be used in Trixi.jl. The default is \"sqrt_Trixi_NaN\" which returns NaN for negative arguments instead of throwing an error. Alternatively, you can set type to \"sqrt_Base\" to use the Julia built-in sqrt function which provides a stack-trace of the error which might come in handy when debugging code.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.show_plot-Tuple{Any, Any}","page":"Trixi.jl","title":"Trixi.show_plot","text":"show_plot(plot_data, variable_names;\n show_mesh=true, plot_arguments=Dict{Symbol,Any}(),\n time=nothing, timestep=nothing)\n\nVisualize the plot data object provided in plot_data and display result, plotting only the variables in variable_names and, optionally, the mesh (if show_mesh is true). Additionally, plot_arguments will be unpacked and passed as keyword arguments to the Plots.plot command.\n\nThis function is the default plot_creator argument for the VisualizationCallback. time and timestep are currently unused by this function.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nSee also: VisualizationCallback, save_plot\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.solve","page":"Trixi.jl","title":"Trixi.solve","text":"solve(ode, alg; dt, callbacks, kwargs...)\n\nThe following structures and methods provide the infrastructure for SSP Runge-Kutta methods of type SimpleAlgorithmSSP.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, AcousticPerturbationEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::AcousticPerturbationEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquations1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquations3D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerEquationsQuasi1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\nThis manufactured solution source term is specifically designed for the mozzle width 'a(x) = 1.5 - 0.5 * cos(x[1] * pi)' as defined in initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerMulticomponentEquations1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::CompressibleEulerMulticomponentEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::InviscidBurgersEquation1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, PolytropicEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::PolytropicEulerEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, ShallowWaterEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::ShallowWaterEquations2D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\nThis manufactured solution source term is specifically designed for the bottom topography function b(x,y) = 2 + 0.5 * sin(sqrt(2)*pi*x) + 0.5 * sin(sqrt(2)*pi*y) as defined in initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::ShallowWaterEquationsQuasi1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test (and BoundaryConditionDirichlet(initial_condition_convergence_test) in non-periodic domains).\n\nThis manufactured solution source term is specifically designed for the bottom topography function b(x) = 0.2 - 0.05 * sin(sqrt(2) * pi *x[1]) and channel width 'a(x)= 1 + 0.1 * cos(sqrt(2) * pi * x[1])' as defined in initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_convergence_test-Tuple{Any, Any, Any, TrafficFlowLWREquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_convergence_test","text":"source_terms_convergence_test(u, x, t, equations::TrafficFlowLWREquations1D)\n\nSource terms used for convergence tests in combination with initial_condition_convergence_test.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_coupled_euler_gravity-Tuple{Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_coupled_euler_gravity","text":"source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_coupled_euler_gravity-Tuple{Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_coupled_euler_gravity","text":"source_terms_eoc_test_coupled_euler_gravity(u, x, t, equations::CompressibleEulerEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_euler-Tuple{Any, Any, Any, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_euler","text":"source_terms_eoc_test_euler(u, x, t, equations::CompressibleEulerEquations2D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_eoc_test_euler-Tuple{Any, Any, Any, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_eoc_test_euler","text":"source_terms_eoc_test_euler(u, x, t, equations::CompressibleEulerEquations3D)\n\nSetup used for convergence tests of the Euler equations with self-gravity used in\n\nMichael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020) A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics arXiv: 2008.10593\n\nin combination with initial_condition_eoc_test_coupled_euler_gravity.\n\nnote: Note\nThis method is to be used for testing pure Euler simulations with analytic self-gravity. If you intend to do coupled Euler-gravity simulations, you need to use source_terms_eoc_test_coupled_euler_gravity instead.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_harmonic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_harmonic","text":"source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations1D)\n\nSource term that only includes the forcing from the hyperbolic diffusion system.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_harmonic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations2D}","page":"Trixi.jl","title":"Trixi.source_terms_harmonic","text":"source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations2D)\n\nSource term that only includes the forcing from the hyperbolic diffusion system.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_harmonic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations3D}","page":"Trixi.jl","title":"Trixi.source_terms_harmonic","text":"source_terms_harmonic(u, x, t, equations::HyperbolicDiffusionEquations3D)\n\nSource term that only includes the forcing from the hyperbolic diffusion system.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.source_terms_poisson_nonperiodic-Tuple{Any, Any, Any, HyperbolicDiffusionEquations1D}","page":"Trixi.jl","title":"Trixi.source_terms_poisson_nonperiodic","text":"source_terms_poisson_nonperiodic(u, x, t,\n equations::HyperbolicDiffusionEquations1D)\n\nSource terms that include the forcing function f(x) and right hand side for the hyperbolic diffusion system that is used with initial_condition_poisson_nonperiodic and boundary_condition_poisson_nonperiodic.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_coirier_vanleer-Tuple{Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.splitting_coirier_vanleer","text":"splitting_coirier_vanleer(u, orientation::Integer,\n equations::CompressibleEulerEquations1D)\nsplitting_coirier_vanleer(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations1D)\n\nSplitting of the compressible Euler flux from Coirier and van Leer. The splitting has correction terms in the pressure splitting as well as the mass and energy flux components. The motivation for these corrections are to handle flows at the low Mach number limit.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nWilliam Coirier and Bram van Leer (1991) Numerical flux formulas for the Euler and Navier-Stokes equations. II - Progress in flux-vector splitting DOI: 10.2514/6.1991-1566\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_lax_friedrichs-Tuple{Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.splitting_lax_friedrichs","text":"splitting_lax_friedrichs(u, orientation::Integer,\n equations::CompressibleEulerEquations2D)\nsplitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations2D)\n\nNaive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) similar to a flux splitting one would apply, e.g., to Burgers' equation.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_lax_friedrichs-Tuple{Any, Integer, InviscidBurgersEquation1D}","page":"Trixi.jl","title":"Trixi.splitting_lax_friedrichs","text":"splitting_lax_friedrichs(u, orientation::Integer,\n equations::InviscidBurgersEquation1D)\nsplitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::InviscidBurgersEquation1D)\n\nNaive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ = abs(u).\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_lax_friedrichs-Tuple{Any, Integer, LinearScalarAdvectionEquation1D}","page":"Trixi.jl","title":"Trixi.splitting_lax_friedrichs","text":"splitting_lax_friedrichs(u, orientation::Integer,\n equations::LinearScalarAdvectionEquation1D)\nsplitting_lax_friedrichs(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::LinearScalarAdvectionEquation1D)\n\nNaive local Lax-Friedrichs style flux splitting of the form f⁺ = 0.5 (f + λ u) and f⁻ = 0.5 (f - λ u) where λ is the absolute value of the advection velocity.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_steger_warming-Tuple{Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.splitting_steger_warming","text":"splitting_steger_warming(u, orientation::Integer,\n equations::CompressibleEulerEquations1D)\nsplitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations1D)\n\nSplitting of the compressible Euler flux of Steger and Warming.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nJoseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_steger_warming-Tuple{Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.splitting_steger_warming","text":"splitting_steger_warming(u, orientation::Integer,\n equations::CompressibleEulerEquations2D)\nsplitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations2D)\n\nSplitting of the compressible Euler flux of Steger and Warming.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nJoseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_steger_warming-Tuple{Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.splitting_steger_warming","text":"splitting_steger_warming(u, orientation::Integer,\n equations::CompressibleEulerEquations3D)\nsplitting_steger_warming(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations3D)\n\nSplitting of the compressible Euler flux of Steger and Warming.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nJoseph L. Steger and R. F. Warming (1979) Flux Vector Splitting of the Inviscid Gasdynamic Equations With Application to Finite Difference Methods NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_vanleer_haenel-Tuple{Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.splitting_vanleer_haenel","text":"splitting_vanleer_haenel(u, orientation::Integer,\n equations::CompressibleEulerEquations1D)\nsplitting_vanleer_haenel(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations1D)\n\nSplitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nBram van Leer (1982) Flux-Vector Splitting for the Euler Equation DOI: 10.1007/978-3-642-60543-7_5\nD. Hänel, R. Schwane and G. Seider (1987) On the accuracy of upwind schemes for the solution of the Navier-Stokes equations DOI: 10.2514/6.1987-1105\nMeng-Sing Liou and Chris J. Steffen, Jr. (1991) High-Order Polynomial Expansions (HOPE) for Flux-Vector Splitting NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.splitting_vanleer_haenel-Tuple{Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.splitting_vanleer_haenel","text":"splitting_vanleer_haenel(u, orientation::Integer,\n equations::CompressibleEulerEquations2D)\nsplitting_vanleer_haenel(u, which::Union{Val{:minus}, Val{:plus}}\n orientation::Integer,\n equations::CompressibleEulerEquations2D)\n\nSplitting of the compressible Euler flux from van Leer. This splitting further contains a reformulation due to Hänel et al. where the energy flux uses the enthalpy. The pressure splitting is independent from the splitting of the convective terms. As such there are many pressure splittings suggested across the literature. We implement the 'p4' variant suggested by Liou and Steffen as it proved the most robust in practice.\n\nReturns a tuple of the fluxes \"minus\" (associated with waves going into the negative axis direction) and \"plus\" (associated with waves going into the positive axis direction). If only one of the fluxes is required, use the function signature with argument which set to Val{:minus}() or Val{:plus}().\n\nwarning: Experimental implementation (upwind SBP)\nThis is an experimental feature and may change in future releases.\n\nReferences\n\nBram van Leer (1982) Flux-Vector Splitting for the Euler Equation DOI: 10.1007/978-3-642-60543-7_5\nD. Hänel, R. Schwane and G. Seider (1987) On the accuracy of upwind schemes for the solution of the Navier-Stokes equations DOI: 10.2514/6.1987-1105\nMeng-Sing Liou and Chris J. Steffen, Jr. (1991) High-Order Polynomial Expansions (HOPE) for Flux-Vector Splitting NASA Technical Memorandum\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.stolarsky_mean-Tuple{Any, Any, Any}","page":"Trixi.jl","title":"Trixi.stolarsky_mean","text":"stolarsky_mean(x, y, gamma)\n\nCompute an instance of a weighted Stolarsky mean of the form\n\nstolarsky_mean(x, y, gamma) = (gamma - 1)/gamma * (y^gamma - x^gamma) / (y^(gamma-1) - x^(gamma-1))\n\nwhere gamma > 1.\n\nProblem: The formula above has a removable singularity at x == y. Thus, some care must be taken to implement it correctly without problems or loss of accuracy when x ≈ y. Here, we use the approach proposed by Winters et al. (2020). Set f = (y - x) / (y + x) and g = gamma (for compact notation). Then, we use the expansions\n\n((1+f)^g - (1-f)^g) / g = 2*f + (g-1)(g-2)/3 * f^3 + (g-1)(g-2)(g-3)(g-4)/60 * f^5 + O(f^7)\n\nand\n\n((1+f)^(g-1) - (1-f)^(g-1)) / (g-1) = 2*f + (g-2)(g-3)/3 * f^3 + (g-2)(g-3)(g-4)(g-5)/60 * f^5 + O(f^7)\n\nInserting the first few terms of these expansions and performing polynomial long division we find that\n\nstolarsky_mean(x, y, gamma) ≈ (y + x) / 2 * (1 + (g-2)/3 * f^2 - (g+1)(g-2)(g-3)/45 * f^4 + (g+1)(g-2)(g-3)(2g(g-2)-9)/945 * f^6)\n\nSince divisions are usually more expensive on modern hardware than multiplications (Agner Fog), we try to avoid computing two divisions. Thus, we use\n\nf^2 = (y - x)^2 / (x + y)^2\n = (x * (x - 2 * y) + y * y) / (x * (x + 2 * y) + y * y)\n\nGiven ε = 1.0e-4, we use the following algorithm.\n\nif f^2 < ε\n # use the expansion above\nelse\n # use the direct formula (gamma - 1)/gamma * (y^gamma - x^gamma) / (y^(gamma-1) - x^(gamma-1))\nend\n\nReferences\n\nAndrew R. Winters, Christof Czernik, Moritz B. Schily & Gregor J. Gassner (2020) Entropy stable numerical approximations for the isothermal and polytropic Euler equations DOI: 10.1007/s10543-019-00789-w\nAgner Fog. Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD, and VIA CPUs. https://www.agner.org/optimize/instruction_tables.pdf\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.totalgamma-Tuple{Any, CompressibleEulerMulticomponentEquations1D}","page":"Trixi.jl","title":"Trixi.totalgamma","text":"totalgamma(u, equations::CompressibleEulerMulticomponentEquations1D)\n\nFunction that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.totalgamma-Tuple{Any, CompressibleEulerMulticomponentEquations2D}","page":"Trixi.jl","title":"Trixi.totalgamma","text":"totalgamma(u, equations::CompressibleEulerMulticomponentEquations2D)\n\nFunction that calculates the total gamma out of all partial gammas using the partial density fractions as well as the partial specific heats at constant volume.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.uses_amr-Tuple{Any}","page":"Trixi.jl","title":"Trixi.uses_amr","text":"uses_amr(callback)\n\nChecks whether the provided callback or CallbackSet is an AMRCallback or contains one.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.varnames","page":"Trixi.jl","title":"Trixi.varnames","text":"varnames(conversion_function, equations)\n\nReturn the list of variable names when applying conversion_function to the conserved variables associated to equations. This function is mainly used internally to determine output to screen and for IO, e.g., for the AnalysisCallback and the SaveSolutionCallback. Common choices of the conversion_function are cons2cons and cons2prim.\n\n\n\n\n\n","category":"function"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, Integer, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, orientation, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y) from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, Integer, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, orientation, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic velocity for the given orientation (1 -> x, 2 -> y, 3 -> z) from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, LatticeBoltzmannEquations2D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, equations::LatticeBoltzmannEquations2D)\n\nCalculate the macroscopic velocity vector from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.velocity-Tuple{Any, LatticeBoltzmannEquations3D}","page":"Trixi.jl","title":"Trixi.velocity","text":"velocity(u, equations::LatticeBoltzmannEquations3D)\n\nCalculate the macroscopic velocity vector from the particle distribution functions u.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.@autoinfiltrate","page":"Trixi.jl","title":"Trixi.@autoinfiltrate","text":"@autoinfiltrate\n@autoinfiltrate condition::Bool\n\nInvoke the @infiltrate macro of the package Infiltrator.jl to create a breakpoint for ad-hoc interactive debugging in the REPL. If the optional argument condition is given, the breakpoint is only enabled if condition evaluates to true.\n\nAs opposed to using Infiltrator.@infiltrate directly, this macro does not require Infiltrator.jl to be added as a dependency to Trixi.jl. As a bonus, the macro will also attempt to load the Infiltrator module if it has not yet been loaded manually.\n\nNote: For this macro to work, the Infiltrator.jl package needs to be installed in your current Julia environment stack.\n\nSee also: Infiltrator.jl\n\nwarning: Internal use only\nPlease note that this macro is intended for internal use only. It is not part of the public API of Trixi.jl, and it thus can altered (or be removed) at any time without it being considered a breaking change.\n\n\n\n\n\n","category":"macro"},{"location":"reference-trixi/#Trixi.@threaded-Tuple{Any}","page":"Trixi.jl","title":"Trixi.@threaded","text":"@threaded for ... end\n\nSemantically the same as Threads.@threads when iterating over a AbstractUnitRange but without guarantee that the underlying implementation uses Threads.@threads or works for more general for loops. In particular, there may be an additional check whether only one thread is used to reduce the overhead of serial execution or the underlying threading capabilities might be provided by other packages such as Polyester.jl.\n\nwarn: Warn\nThis macro does not necessarily work for general for loops. For example, it does not necessarily support general iterables such as eachline(filename).\n\nSome discussion can be found at https://discourse.julialang.org/t/overhead-of-threads-threads/53964 and https://discourse.julialang.org/t/threads-threads-with-one-thread-how-to-remove-the-overhead/58435.\n\n\n\n\n\n","category":"macro"},{"location":"styleguide/#Style-guide","page":"Style guide","title":"Style guide","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"Coding style is an inherently personal - and thus hotly contested - issue. Since code is usually \"written once, read often\", it helps regular developers, new users, and reviewers if code is formatted consistently. We therefore believe in the merit of using a common coding style throughout Trixi.jl, even at the expense that not everyone can be happy with every detailed style decision. If you came here because you are furious about our code formatting rules, here is a happy little whale for you to calm you down: 🐳","category":"page"},{"location":"styleguide/#Conventions","page":"Style guide","title":"Conventions","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"The following lists a few coding conventions for Trixi.jl. Note that in addition to these conventions, we apply and enforce automated source code formatting (see below for more details):","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"Modules, types, structs with CamelCase.\nFunctions, variables with lowercase snake_case.\nIndentation with 4 spaces (never tabs!)\nMaximum line length (strictly): 92.\nFunctions that mutate their input are named with a trailing !.\nFunctions order their parameters similar to Julia Base.\nThe main modified argument comes first. For example, if the right-hand side du is modified, it should come first. If only the cache is modified, e.g., in prolong2interfaces! and its siblings, put the cache first.\nOtherwise, use the order mesh, equations, solver, cache.\nIf something needs to be specified in more detail for dispatch, put the additional argument before the general one that is specified in more detail. For example, we use have_nonconservative_terms(equations), equations and dg.mortar, dg.\nPrefer for i in ... to for i = ... for better semantic clarity and greater flexibility.\nExecutable code should only use ASCII characters.\nDocstrings and comments can and should use Unicode characters where it helps understanding.\nMultiline expressions should be explicitly grouped by parentheses and not rely on Julia's implicit line continuation syntax.\nWhen naming multiple functions of a single or similar category, prefer to put the general classification first and the specialization second. Example: Use flux_central instead of central_flux. This helps when searching for available functions on the REPL (e.g., when trying to find all flux functions).","category":"page"},{"location":"styleguide/#automated-source-code-formatting","page":"Style guide","title":"Automated source code formatting","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"We use JuliaFormatter.jl to format the source code of Trixi.jl, which will also enforce some of the Conventions listed above (e.g., line length or indentation with 4 spaces are automatically handled, while capitalization of names is not). Our format is mostly based on the SciML-style formatting rules. For more details you can have a look at the current .JuliaFormatter.toml file that holds the configuration options we use for JuliaFormatter.jl.","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"Note that we expect all contributions to Trixi.jl to be formatted with JuliaFormatter.jl before being merged to the main branch. We ensure this by running a automated check on all PRs that verify that running JuliaFormatter.jl again will not change the source code.","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"To format your contributions before created a PR (or, at least, before requesting a review of your PR), you need to install JuliaFormatter.jl first by running","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"julia -e 'using Pkg; Pkg.add(\"JuliaFormatter\")'","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"You can then recursively format the core Julia files in the Trixi.jl repo by executing","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"julia -e 'using JuliaFormatter; format([\"benchmark\", \"examples\", \"ext\", \"src\", \"test\", \"utils\"])'","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"from inside the Trixi.jl repository. For convenience, there is also a script you can directly run from your terminal shell, which will automatically install JuliaFormatter in a temporary environment and then run it:","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"utils/trixi-format.jl","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"You can get more information about using the convenience script by running it with the --help/-h flag.","category":"page"},{"location":"styleguide/#Checking-formatting-before-committing","page":"Style guide","title":"Checking formatting before committing","text":"","category":"section"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"It can be convenient to check the formatting of source code automatically before each commit. We use git-hooks for it and provide a pre-commit script in the utils folder. The script uses JuliaFormatter.jl just like formatting script that runs over the whole Trixi.jl directory. You can copy the pre-commit-script into .git/hooks/pre-commit and it will check your formatting before each commit. If errors are found the commit is aborted and you can add the corrections via","category":"page"},{"location":"styleguide/","page":"Style guide","title":"Style guide","text":"git add -p","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"EditURL = \"../../literate/src/files/scalar_linear_advection_1d.jl\"","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#scalar_linear_advection_1d","page":"3 Introduction to DG methods","title":"3: Introduction to DG methods","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"This tutorial is about how to set up a simple way to approximate the solution of a hyperbolic partial differential equation. First, we will implement a basic and naive algorithm. Then, we will use predefined features from Trixi.jl to show how you can use Trixi.jl on your own.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We will implement the scalar linear advection equation in 1D with the advection velocity 1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"u_t + u_x = 0 textfor tin mathbbR^+ xinOmega=-11","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We define the domain Omega by setting the boundaries.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"coordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We assume periodic boundaries and the following initial condition.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"initial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#The-discontinuous-Galerkin-collocation-spectral-element-method-(DGSEM)","page":"3 Introduction to DG methods","title":"The discontinuous Galerkin collocation spectral element method (DGSEM)","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/#i.-Discretization-of-the-physical-domain","page":"3 Introduction to DG methods","title":"i. Discretization of the physical domain","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"To improve precision we want to approximate the solution on small parts of the physical domain. So, we split the domain Omega=-1 1 into elements Q_l of length dx.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"n_elements = 16 # number of elements\n\ndx = (coordinates_max - coordinates_min) / n_elements # length of one element","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"To make the calculation more efficient and storing less information, we transform each element Q_l with center point x_l to a reference element E=-1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Q_l=Bigx_l-fracdx2 x_l+fracdx2Big undersetx(xi)oversetxi(x)rightleftarrows -1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"So, for every element the transformation from the reference domain to the physical domain is defined by","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"x(xi) = x_l + fracdx2 xi xiin-1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Therefore,","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"beginalign*\nu = u(x(xi) t) \nu_x = u_xi fracdxidx 3pt\nfracdxidx = (x_xi)^-1 = frac2dx = J^-1 \nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Here, J is the Jacobian determinant of the transformation.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Using this transformation, we can transform our equation for each element Q_l.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"fracdx2 u_t^Q_l + u_xi^Q_l = 0 text for tinmathbbR^+ xiin-1 1","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Here, u_t^Q_l and u_xi^Q_l denote the time and spatial derivatives of the solution on the element Q_l.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#ii.-Polynomial-approach","page":"3 Introduction to DG methods","title":"ii. Polynomial approach","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Now, we want to approximate the solution in each element Q_l by a polynomial of degree N. Since we transformed the equation, we can use the same polynomial approach for the reference coordinate xiin-1 1 in every physical element Q_l. This saves a lot of resources by reducing the amount of calculations needed and storing less information.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"For DGSEM we choose Lagrange basis functions l_j_j=0^N as our polynomial basis of degree N in -1 1. The solution in element Q_l can be approximated by","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"u(x(xi) t)big_Q_l approx u^Q_l(xi t) = sum_j=0^N u_j^Q_l(t) l_j(xi)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"with N+1 coefficients u_j^Q_l_j=0^N. By construction the Lagrange basis has some useful advantages. This basis is defined by N+1 nodes, which fulfill a Kronecker property at the exact same nodes. Let xi_i_i=0^N be these nodes.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"l_j(xi_i) = delta_ij =\nbegincases\n1 textif i=j \n0 textelse\nendcases","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Because of this property, the polynomial coefficients are exact the values of u^Q_l at the nodes","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"u^Q_l(xi_i t) = sum_j=0^N u_j^Q_l(t) underbracel_j(xi_i)_=delta_ij = u_i^Q_l(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Next, we want to select the nodes xi_i_i=0^N, which we use for the construction of the Lagrange polynomials. We choose the N+1 Gauss-Lobatto nodes, which are used for the Gaussian-Lobatto quadrature. These always contain the boundary points at -1 and +1 and are well suited as interpolation nodes. The corresponding weights will be referred to as w_j_j=0^N. In Trixi.jl the basis with Lagrange polynomials on Gauss-Lobatto nodes is already defined.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"using Trixi\npolydeg = 3 #= polynomial degree = N =#\nbasis = LobattoLegendreBasis(polydeg)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"The Gauss-Lobatto nodes are","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"nodes = basis.nodes","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"with the corresponding weights","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"weights = basis.weights","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"To illustrate how you can integrate using numerical quadrature with this Legendre-Gauss-Lobatto nodes, we give an example for f(x)=x^3. Since f is of degree 3, a polynomial interpolation with N=3 is exact. Therefore, the integral on -1 1 can be calculated by","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"beginalign*\nint_-1^1 f(x) dx = int_-1^1 Big( sum_j=0^3 f(xi_j)l_j(x) Big) dx\n= sum_j=0^3 f(xi_j) int_-1^1 l_j(x)dx \n= sum_j=0^3 f(xi_j) w_j\n= sum_j=0^3 xi_j^3 w_j\nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Let's use our nodes and weights for N=3 and plug in","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"integral = sum(nodes.^3 .* weights)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Using this polynomial approach leads to the equation","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"fracdx2 dotu^Q_l(xi t) + u^Q_l(xi t) = 0","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"with dotu=fracpartialpartial tu and u=fracpartialpartial xu. To approximate the solution, we need to get the polynomial coefficients u_j^Q_l_j=0^N for every element Q_l.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"After defining all nodes, we can implement the spatial coordinate x and its initial value u0 for every node.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"x = Matrix{Float64}(undef, length(nodes), n_elements)\nfor element in 1:n_elements\n x_l = coordinates_min + (element - 1) * dx + dx/2\n for i in 1:length(nodes)\n ξ = nodes[i] # nodes in [-1, 1]\n x[i, element] = x_l + dx/2 * ξ\n end\nend\n\nu0 = initial_condition_sine_wave.(x)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"To have a look at the initial sinus curve, we plot it.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"using Plots\nplot(vec(x), vec(u0), label=\"initial condition\", legend=:topleft)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#iii.-Variational-formulation","page":"3 Introduction to DG methods","title":"iii. Variational formulation","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"After defining the equation and initial condition, we want to implement an algorithm to approximate the solution.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"From now on, we only write u instead of u^Q_l for simplicity, but consider that all the following calculation only concern one element. Multiplying the new equation with the smooth Lagrange polynomials l_i_i=0^N (test functions) and integrating over the reference element E=-11, we get the variational formulation of our transformed partial differential equation for i=0N:","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"beginalign*\nint_-1^1 Big( fracdx2 dotu(xi t) + u(xi t) Big) l_i(xi)dxi\n = underbracefracdx2 int_-1^1 dotu(xi t) l_i(xi)dxi_textTerm I + underbraceint_-1^1 u(xi t) l_i(xi)dxi_textTerm II = 0\nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We deal with the two terms separately. We write int_-1 N^1 cdot dxi for the approximation of the integral using numerical quadrature with N+1 basis points. We use the Gauss-Lobatto nodes again. The numerical scalar product langlecdot cdotrangle_N is defined by langle f grangle_N = int_-1 N^1 f(xi) g(xi) dxi.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Term-I:","page":"3 Introduction to DG methods","title":"Term I:","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"In the following calculation we approximate the integral numerically with quadrature on the Gauss-Lobatto nodes xi_i_i=0^N and then use the Kronecker property of the Lagrange polynomials. This approach of using the same nodes for the interpolation and quadrature is called collocation.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"beginalign*\nfracdx2 int_-1^1 dotu(xi t) l_i(xi)dxi\napprox fracdx2 int_-1 N^1 dotu(xi t) l_i(xi)dxi \n= fracdx2 sum_k=0^N underbracedotu(xi_k t)_=dotu_k(t) underbracel_i(xi_k)_=delta_kiw_k \n= fracdx2 dotu_i(t) w_i\nendalign*","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We define the Legendre-Gauss-Lobatto (LGL) mass matrix M and by the Kronecker property follows:","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"M_ij = langle l_j l_irangle_N = delta_ij w_j ij=0N","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"using LinearAlgebra\nM = diagm(weights)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Now, we can write the integral with this new matrix.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"fracdx2 int_-1 N^1 dotu(xi t) underlinel(xi)dxi = fracdx2 M underlinedotu(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"where underlinedotu = (dotu_0 dotu_N)^T and underlinel respectively.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Note: Since the LGL quadrature with N+1 nodes is exact up to functions of degree 2N-1 and dotu(xi t) l_i(xi) is of degree 2N, in general the following holds","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"int_-1^1 dotu(xi t) l_i(xi) dxi neq int_-1 N^1 dotu(xi t) l_i(xi) dxi","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"With an exact integration the mass matrix would be dense. Choosing numerical integrating and quadrature with the exact same nodes (collocation) leads to the sparse and diagonal mass matrix M. This is called mass lumping and has the big advantage of an easy invertation of the matrix.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Term-II:","page":"3 Introduction to DG methods","title":"Term II:","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We use spatial partial integration for the second term:","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"int_-1^1 u(xi t) l_i(xi) dxi = u l_i_-1^1 - int_-1^1 u l_idxi","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"The resulting integral can be solved exactly with LGL quadrature since the polynomial is now of degree 2N-1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Again, we split the calculation in two steps.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Surface-term","page":"3 Introduction to DG methods","title":"Surface term","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"As mentioned before, we approximate the solution with a polynomial in every element. Therefore, in general the value of this approximation at the interfaces between two elements is not unique. To solve this problem we introduce the idea of the numerical flux u^*, which will give an exact value at the interfaces. One of many different approaches and definitions for the calculation of the numerical flux we will deal with in 4. Numerical flux.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"u l_i_-1^1 = u^*big^1 l_i(+1) - u^*big_-1 l_i(-1)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Since the Gauss-Lobatto nodes contain the element boundaries -1 and +1, we can use the Kronecker property of l_i for the calculation of l_i(-1) and l_i(+1).","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"u underlinel_-1^1 = u^*big^1 left(beginarrayc 0 vdots 0 1 endarrayright)\n- u^*big_-1 left(beginarrayc 1 0 vdots 0endarrayright)\n= B underlineu^*(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"with the boundary matrix","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"B = beginpmatrix\n-1 0 cdots 0\n0 0 cdots 0\nvdots vdots 0 0\n0 cdots 0 1\nendpmatrix\nqquadtextandqquad\nunderlineu^*(t) = left(beginarrayc u^*big_-1 0 vdots 0 u^*big^1endarrayright)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"B = diagm([-1; zeros(polydeg - 1); 1])","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Volume-term","page":"3 Introduction to DG methods","title":"Volume term","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"As mentioned before, the new integral can be solved exact since the function inside is of degree 2N-1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"- int_-1^1 u l_idxi = - int_-1 N^1 u l_i dxi\n= - sum_k=0^N u(xi_k t) l_i(xi_k) w_k\n= - sum_k=0^N u_k(t) D_ki w_k","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"where D is the derivative matrix defined by D_ki = l_i(xi_k) for ik=0N.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"D = basis.derivative_matrix","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"To show why this matrix is called the derivative matrix, we go back to our example f(x)=x^3. We calculate the derivation of f at the Gauss-Lobatto nodes xi_k_k=0^N with N=8.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"f_x=xi_k = Big( sum_j=0^8 f(xi_j) l_j(x) Big)_x=xi_k = sum_j=0^8 f(xi_j) l_j(xi_k)\n= sum_j=0^8 f(xi_j) D_kj","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"for k=0N and therefore, underlinef = D underlinef.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"basis_N8 = LobattoLegendreBasis(8)\nplot(vec(x), x -> 3 * x^2, label=\"f'\", lw=2)\nscatter!(basis_N8.nodes, basis_N8.derivative_matrix * basis_N8.nodes.^3, label=\"Df\", lw=3)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Combining the volume term for every i=0N results in","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"int_-1^1 u underlinel dxi = - D^T M underlineu(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Putting all parts together we get the following equation for the element Q_l","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"fracdx2 M underlinedotu(t) = - B underlineu^*(t) + D^T M underlineu(t)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"or equivalent","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"underlinedotu^Q_l(t) = frac2dx Big - M^-1 B underlineu^Q_l^*(t) + M^-1 D^T M underlineu^Q_l(t)Big","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"This is called the weak form of the DGSEM.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Note: For every element Q_l we get a system of N+1 ordinary differential equations to calculate N+1 coefficients. Since the numerical flux u^* is depending on extern values at the interfaces, the equation systems of adjacent elements are weakly linked.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#numerical_flux","page":"3 Introduction to DG methods","title":"iv. Numerical flux","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"As mentioned above, we still have to handle the problem of different values at the same point at the interfaces. This happens with the ideas of the numerical flux f^*(u)=u^*. The role of f^* might seem minor in this simple example, but is important for more complicated problems. There are two values at the same spatial coordinate. Let's say we are looking at the interface between the elements Q_l and Q_l+1, while both elements got N+1 nodes as defined before. We call the first value of the right element u_R=u_0^Q_l+1 and the last one of the left element u_L=u_N^Q_l. So, for the value of the numerical flux on that interface the following holds","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"u^* = u^*(u_L u_R)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"These values are interpreted as start values of a so-called Riemann problem. There are many different (approximate) Riemann solvers available and useful for different problems. We will use the local Lax-Friedrichs flux.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"surface_flux = flux_lax_friedrichs","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"The only missing ingredient is the flux calculation at the boundaries -1 and +1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"u^Q_first^*big_-1 = u^Q_first^*big_-1(u^bound(-1) u_R)\nquadtextandquad\nu^Q_last^*big^1 = u^Q_last^*big^1(u_L u^bound(1))","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"The boundaries are periodic, which means that the last value of the last element u^Q_last_N is used as u_L at the first interface and accordingly for the other boundary.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Now, we implement a function, that calculates underlinedotu^Q_l for the given matrices, underlineu and underlineu^*.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"function rhs!(du, u, x, t)\n # Reset du and flux matrix\n du .= zero(eltype(du))\n flux_numerical = copy(du)\n\n # Calculate interface and boundary fluxes, $u^* = (u^*|_{-1}, 0, ..., 0, u^*|^1)^T$\n # Since we use the flux Lax-Friedrichs from Trixi.jl, we have to pass some extra arguments.\n # Trixi.jl needs the equation we are dealing with and an additional `1`, that indicates the\n # first coordinate direction.\n equations = LinearScalarAdvectionEquation1D(1.0)\n for element in 2:n_elements-1\n # left interface\n flux_numerical[1, element] = surface_flux(u[end, element-1], u[1, element], 1, equations)\n flux_numerical[end, element-1] = flux_numerical[1, element]\n # right interface\n flux_numerical[end, element] = surface_flux(u[end, element], u[1, element+1], 1, equations)\n flux_numerical[1, element+1] = flux_numerical[end, element]\n end\n # boundary flux\n flux_numerical[1, 1] = surface_flux(u[end, end], u[1, 1], 1, equations)\n flux_numerical[end, end] = flux_numerical[1, 1]\n\n # Calculate surface integrals, $- M^{-1} * B * u^*$\n for element in 1:n_elements\n du[:, element] -= (M \\ B) * flux_numerical[:, element]\n end\n\n # Calculate volume integral, $+ M^{-1} * D^T * M * u$\n for element in 1:n_elements\n flux = u[:, element]\n du[:, element] += (M \\ transpose(D)) * M * flux\n end\n\n # Apply Jacobian from mapping to reference element\n for element in 1:n_elements\n du[:, element] *= 2 / dx\n end\n\n return nothing\nend","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Combining all definitions and the function that calculates the right-hand side, we define the ODE and solve it until t=2 with OrdinaryDiffEq's solve function and the Runge-Kutta method RDPK3SpFSAL49(), which is optimized for discontinuous Galerkin methods and hyperbolic PDEs. We set some common error tolerances abstol=1.0e-6, reltol=1.0e-6 and pass save_everystep=false to avoid saving intermediate solution vectors in memory.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"using OrdinaryDiffEq\ntspan = (0.0, 2.0)\node = ODEProblem(rhs!, u0, tspan, x)\n\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)\n\nplot(vec(x), vec(sol.u[end]), label=\"solution at t=$(tspan[2])\", legend=:topleft, lw=3)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Alternative-Implementation-based-on-Trixi.jl","page":"3 Introduction to DG methods","title":"Alternative Implementation based on Trixi.jl","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Now, we implement the same example. But this time, we directly use the functionality that Trixi.jl provides.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"using Trixi, OrdinaryDiffEq, Plots","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"First, define the equation with a advection_velocity of 1.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"advection_velocity = 1.0\nequations = LinearScalarAdvectionEquation1D(advection_velocity)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Then, create a DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux. The implementation of the basis and the numerical flux is now already done.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We will now create a mesh with 16 elements for the physical domain [-1, 1] with periodic boundaries. We use Trixi.jl's standard mesh TreeMesh. Since it's limited to hypercube domains, we choose 2^4=16 elements. The mesh type supports AMR, that' why n_cells_max has to be set, even if we don't need AMR here.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"coordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4, # number of elements = 2^4\n n_cells_max=30_000) # set maximum capacity of tree data structure (only needed for AMR)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"A semidiscretization collects data structures and functions for the spatial discretization. In Trixi.jl, an initial condition has the following parameter structure and is of the type SVector.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"initial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"Again, combining all definitions and the function that calculates the right-hand side, we define the ODE and solve it until t=2 with OrdinaryDiffEq's solve function and the Runge-Kutta method RDPK3SpFSAL49().","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"tspan = (0.0, 2.0)\node_trixi = semidiscretize(semi, tspan)\n\nsol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);\nnothing #hide","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"We add a plot of the new approximated solution to the one calculated before.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"plot!(sol_trixi, label=\"solution at t=$(tspan[2]) with Trixi.jl\", legend=:topleft, linestyle=:dash, lw=2)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Summary-of-the-code","page":"3 Introduction to DG methods","title":"Summary of the code","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"To sum up, here is the complete code that we used.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Raw-implementation","page":"3 Introduction to DG methods","title":"Raw implementation","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"# basis: Legendre-Gauss-Lobatto\nusing Trixi, LinearAlgebra, OrdinaryDiffEq, Plots\npolydeg = 3 #= polynomial degree =#\nbasis = LobattoLegendreBasis(polydeg)\nnodes = basis.nodes # Gauss-Lobatto nodes in [-1, 1]\nD = basis.derivative_matrix\nM = diagm(basis.weights) # mass matrix\nB = diagm([-1; zeros(polydeg - 1); 1])\n\n# mesh\ncoordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate\nn_elements = 16 # number of elements\n\ndx = (coordinates_max - coordinates_min) / n_elements # length of one element\n\nx = Matrix{Float64}(undef, length(nodes), n_elements)\nfor element in 1:n_elements\n x_l = -1 + (element - 1) * dx + dx/2\n for i in 1:length(nodes) # basis points in [-1, 1]\n ξ = nodes[i]\n x[i, element] = x_l + dx/2 * ξ\n end\nend\n\n# initial condition\ninitial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)\nu0 = initial_condition_sine_wave.(x)\n\nplot(vec(x), vec(u0), label=\"initial condition\", legend=:topleft)\n\n# flux Lax-Friedrichs\nsurface_flux = flux_lax_friedrichs\n\n# rhs! method\nfunction rhs!(du, u, x, t)\n # reset du\n du .= zero(eltype(du))\n flux_numerical = copy(du)\n\n # calculate interface and boundary fluxes\n equations = LinearScalarAdvectionEquation1D(1.0)\n for element in 2:n_elements-1\n # left interface\n flux_numerical[1, element] = surface_flux(u[end, element-1], u[1, element], 1, equations)\n flux_numerical[end, element-1] = flux_numerical[1, element]\n # right interface\n flux_numerical[end, element] = surface_flux(u[end, element], u[1, element+1], 1, equations)\n flux_numerical[1, element+1] = flux_numerical[end, element]\n end\n # boundary flux\n flux_numerical[1, 1] = surface_flux(u[end, end], u[1, 1], 1, equations)\n flux_numerical[end, end] = flux_numerical[1, 1]\n\n # calculate surface integrals\n for element in 1:n_elements\n du[:, element] -= (M \\ B) * flux_numerical[:, element]\n end\n\n # calculate volume integral\n for element in 1:n_elements\n flux = u[:, element]\n du[:, element] += (M \\ transpose(D)) * M * flux\n end\n\n # apply Jacobian from mapping to reference element\n for element in 1:n_elements\n du[:, element] *= 2 / dx\n end\n\n return nothing\nend\n\n# create ODE problem\ntspan = (0.0, 2.0)\node = ODEProblem(rhs!, u0, tspan, x)\n\n# solve\nsol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)\n\nplot(vec(x), vec(sol.u[end]), label=\"solution at t=$(tspan[2])\", legend=:topleft, lw=3)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Alternative-Implementation-based-on-Trixi.jl-2","page":"3 Introduction to DG methods","title":"Alternative Implementation based on Trixi.jl","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"using Trixi, OrdinaryDiffEq, Plots\n\n# equation with a advection_velocity of `1`.\nadvection_velocity = 1.0\nequations = LinearScalarAdvectionEquation1D(advection_velocity)\n\n# create DG solver with flux lax friedrichs and LGL basis\nsolver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n\n# distretize domain with `TreeMesh`\ncoordinates_min = -1.0 # minimum coordinate\ncoordinates_max = 1.0 # maximum coordinate\nmesh = TreeMesh(coordinates_min, coordinates_max,\n initial_refinement_level=4, # number of elements = 2^4\n n_cells_max=30_000)\n\n# create initial condition and semidiscretization\ninitial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))\n\nsemi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)\n\n# solve\ntspan = (0.0, 2.0)\node_trixi = semidiscretize(semi, tspan)\nsol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);\n\nplot!(sol_trixi, label=\"solution at t=$(tspan[2]) with Trixi.jl\", legend=:topleft, linestyle=:dash, lw=2)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/#Package-versions","page":"3 Introduction to DG methods","title":"Package versions","text":"","category":"section"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"These results were obtained using the following versions.","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"using InteractiveUtils\nversioninfo()\n\nusing Pkg\nPkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n mode=PKGMODE_MANIFEST)","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"","category":"page"},{"location":"tutorials/scalar_linear_advection_1d/","page":"3 Introduction to DG methods","title":"3 Introduction to DG methods","text":"This page was generated using Literate.jl.","category":"page"},{"location":"reference-trixi2vtk/#Trixi2Vtk.jl-API","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.jl API","text":"","category":"section"},{"location":"reference-trixi2vtk/","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.jl","text":"CurrentModule = Trixi2Vtk","category":"page"},{"location":"reference-trixi2vtk/","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.jl","text":"Modules = [Trixi2Vtk]","category":"page"},{"location":"reference-trixi2vtk/#Trixi2Vtk.trixi2vtk-Tuple{Vararg{AbstractString}}","page":"Trixi2Vtk.jl","title":"Trixi2Vtk.trixi2vtk","text":"trixi2vtk(filename::AbstractString...;\n format=:vtu, verbose=false, hide_progress=false, pvd=nothing,\n output_directory=\".\", nvisnodes=nothing, save_celldata=true,\n reinterpolate=true, data_is_uniform=false)\n\nConvert Trixi-generated output files to VTK files (VTU or VTI).\n\nArguments\n\nfilename: One or more Trixi solution/restart/mesh files to convert to a VTK file. Filenames support file globbing, e.g., \"solution*\" to match all files starting with solution.\nformat: Output format for solution/restart files. Can be 'vtu' or 'vti'.\nverbose: Set to true to enable verbose output.\nhide_progress: Hide progress bar (will be hidden automatically if verbose is true).\npvd: Use this filename to store PVD file (instead of auto-detecting name). Note that only the name will be used (directory and file extension are ignored).\noutput_directory: Output directory where generated files are stored.\nnvisnodes: Number of visualization nodes per element. (default: number of DG nodes for StructuredMesh or UnstructuredMesh2D, twice the number of DG nodes for TreeMesh). A value of 0 (zero) uses the number of nodes in the DG elements.\nsave_celldata: Boolean value to determine if cell-based data should be saved. (default: true)\nreinterpolate: Boolean value to determine if data should be reinterpolated onto uniform points. When false the raw data at the compute nodes is copied into the appropriate format. (default: true)\ndata_is_uniform: Boolean to indicate if the data to be converted is from a finite difference method on a uniform grid of points. (default: false)\n\nExamples\n\njulia> trixi2vtk(\"out/solution_000*.h5\")\n[...]\n\n\n\n\n\n","category":"method"}] } diff --git a/previews/PR1624/styleguide/index.html b/previews/PR1624/styleguide/index.html index 3b404bd4eac..7e268d252cf 100644 --- a/previews/PR1624/styleguide/index.html +++ b/previews/PR1624/styleguide/index.html @@ -1,2 +1,2 @@ -Style guide · Trixi.jl

Style guide

Coding style is an inherently personal - and thus hotly contested - issue. Since code is usually "written once, read often", it helps regular developers, new users, and reviewers if code is formatted consistently. We therefore believe in the merit of using a common coding style throughout Trixi.jl, even at the expense that not everyone can be happy with every detailed style decision. If you came here because you are furious about our code formatting rules, here is a happy little whale for you to calm you down: 🐳

Conventions

The following lists a few coding conventions for Trixi.jl. Note that in addition to these conventions, we apply and enforce automated source code formatting (see below for more details):

  • Modules, types, structs with CamelCase.
  • Functions, variables with lowercase snake_case.
  • Indentation with 4 spaces (never tabs!)
  • Maximum line length (strictly): 92.
  • Functions that mutate their input are named with a trailing !.
  • Functions order their parameters similar to Julia Base.
    • The main modified argument comes first. For example, if the right-hand side du is modified, it should come first. If only the cache is modified, e.g., in prolong2interfaces! and its siblings, put the cache first.
    • Otherwise, use the order mesh, equations, solver, cache.
    • If something needs to be specified in more detail for dispatch, put the additional argument before the general one that is specified in more detail. For example, we use have_nonconservative_terms(equations), equations and dg.mortar, dg.
  • Prefer for i in ... to for i = ... for better semantic clarity and greater flexibility.
  • Executable code should only use ASCII characters.
  • Docstrings and comments can and should use Unicode characters where it helps understanding.
  • Multiline expressions should be explicitly grouped by parentheses and not rely on Julia's implicit line continuation syntax.
  • When naming multiple functions of a single or similar category, prefer to put the general classification first and the specialization second. Example: Use flux_central instead of central_flux. This helps when searching for available functions on the REPL (e.g., when trying to find all flux functions).

Automated source code formatting

We use JuliaFormatter.jl to format the source code of Trixi.jl, which will also enforce some of the Conventions listed above (e.g., line length or indentation with 4 spaces are automatically handled, while capitalization of names is not). Our format is mostly based on the SciML-style formatting rules. For more details you can have a look at the current .JuliaFormatter.toml file that holds the configuration options we use for JuliaFormatter.jl.

Note that we expect all contributions to Trixi.jl to be formatted with JuliaFormatter.jl before being merged to the main branch. We ensure this by running a automated check on all PRs that verify that running JuliaFormatter.jl again will not change the source code.

To format your contributions before created a PR (or, at least, before requesting a review of your PR), you need to install JuliaFormatter.jl first by running

julia -e 'using Pkg; Pkg.add("JuliaFormatter")'

You can then recursively format the core Julia files in the Trixi.jl repo by executing

julia -e 'using JuliaFormatter; format(["benchmark", "examples", "ext", "src", "test", "utils"])'

from inside the Trixi.jl repository. For convenience, there is also a script you can directly run from your terminal shell, which will automatically install JuliaFormatter in a temporary environment and then run it:

utils/trixi-format.jl

You can get more information about using the convenience script by running it with the --help/-h flag.

Checking formatting before committing

It can be convenient to check the formatting of source code automatically before each commit. We use git-hooks for it and provide a pre-commit script in the utils folder. The script uses JuliaFormatter.jl just like formatting script that runs over the whole Trixi.jl directory. You can copy the pre-commit-script into .git/hooks/pre-commit and it will check your formatting before each commit. If errors are found the commit is aborted and you can add the corrections via

git add -p
+Style guide · Trixi.jl

Style guide

Coding style is an inherently personal - and thus hotly contested - issue. Since code is usually "written once, read often", it helps regular developers, new users, and reviewers if code is formatted consistently. We therefore believe in the merit of using a common coding style throughout Trixi.jl, even at the expense that not everyone can be happy with every detailed style decision. If you came here because you are furious about our code formatting rules, here is a happy little whale for you to calm you down: 🐳

Conventions

The following lists a few coding conventions for Trixi.jl. Note that in addition to these conventions, we apply and enforce automated source code formatting (see below for more details):

  • Modules, types, structs with CamelCase.
  • Functions, variables with lowercase snake_case.
  • Indentation with 4 spaces (never tabs!)
  • Maximum line length (strictly): 92.
  • Functions that mutate their input are named with a trailing !.
  • Functions order their parameters similar to Julia Base.
    • The main modified argument comes first. For example, if the right-hand side du is modified, it should come first. If only the cache is modified, e.g., in prolong2interfaces! and its siblings, put the cache first.
    • Otherwise, use the order mesh, equations, solver, cache.
    • If something needs to be specified in more detail for dispatch, put the additional argument before the general one that is specified in more detail. For example, we use have_nonconservative_terms(equations), equations and dg.mortar, dg.
  • Prefer for i in ... to for i = ... for better semantic clarity and greater flexibility.
  • Executable code should only use ASCII characters.
  • Docstrings and comments can and should use Unicode characters where it helps understanding.
  • Multiline expressions should be explicitly grouped by parentheses and not rely on Julia's implicit line continuation syntax.
  • When naming multiple functions of a single or similar category, prefer to put the general classification first and the specialization second. Example: Use flux_central instead of central_flux. This helps when searching for available functions on the REPL (e.g., when trying to find all flux functions).

Automated source code formatting

We use JuliaFormatter.jl to format the source code of Trixi.jl, which will also enforce some of the Conventions listed above (e.g., line length or indentation with 4 spaces are automatically handled, while capitalization of names is not). Our format is mostly based on the SciML-style formatting rules. For more details you can have a look at the current .JuliaFormatter.toml file that holds the configuration options we use for JuliaFormatter.jl.

Note that we expect all contributions to Trixi.jl to be formatted with JuliaFormatter.jl before being merged to the main branch. We ensure this by running a automated check on all PRs that verify that running JuliaFormatter.jl again will not change the source code.

To format your contributions before created a PR (or, at least, before requesting a review of your PR), you need to install JuliaFormatter.jl first by running

julia -e 'using Pkg; Pkg.add("JuliaFormatter")'

You can then recursively format the core Julia files in the Trixi.jl repo by executing

julia -e 'using JuliaFormatter; format(["benchmark", "examples", "ext", "src", "test", "utils"])'

from inside the Trixi.jl repository. For convenience, there is also a script you can directly run from your terminal shell, which will automatically install JuliaFormatter in a temporary environment and then run it:

utils/trixi-format.jl

You can get more information about using the convenience script by running it with the --help/-h flag.

Checking formatting before committing

It can be convenient to check the formatting of source code automatically before each commit. We use git-hooks for it and provide a pre-commit script in the utils folder. The script uses JuliaFormatter.jl just like formatting script that runs over the whole Trixi.jl directory. You can copy the pre-commit-script into .git/hooks/pre-commit and it will check your formatting before each commit. If errors are found the commit is aborted and you can add the corrections via

git add -p
diff --git a/previews/PR1624/testing/index.html b/previews/PR1624/testing/index.html index 86771912753..76542b77d89 100644 --- a/previews/PR1624/testing/index.html +++ b/previews/PR1624/testing/index.html @@ -1,6 +1,6 @@ -Testing · Trixi.jl

Testing

During the development of Trixi.jl, we rely on continuous testing to ensure that modifications or new features do not break existing functionality or add other errors. In the main Trixi.jl repository (and the repositories for the visualization tool Trixi2Vtk), this is facilitated by GitHub Actions, which allows to run tests automatically upon certain events. When, how, and what is tested by GitHub Actions is controlled by the workflow file .github/workflows/ci.yml. In Trixi.jl and its related repositories, tests are triggered by

  • each git push to main and
  • each git push to any pull request.

Besides checking functionality, we also analyse the Test coverage to ensure that we do not miss important parts during testing.

Test and coverage requirements

Before merging a pull request (PR) to main, we require that

  • the code passes all functional tests
  • code coverage does not decrease.

Testing setup

The entry point for all testing is the file test/runtests.jl, which is run by the automated tests and which can be triggered manually by executing

julia> using Pkg; Pkg.test("Trixi")

in the REPL. Since there already exist many tests, we have split them up into multiple files in the test directory to allow for faster testing of individual parts of the code. Thus in addition to performing all tests, you can also just include one of the files named test_xxx.jl to run only a specific subset, e.g.,

julia> # Run all 2D tests on the P4estMesh
+Testing · Trixi.jl

Testing

During the development of Trixi.jl, we rely on continuous testing to ensure that modifications or new features do not break existing functionality or add other errors. In the main Trixi.jl repository (and the repositories for the visualization tool Trixi2Vtk), this is facilitated by GitHub Actions, which allows to run tests automatically upon certain events. When, how, and what is tested by GitHub Actions is controlled by the workflow file .github/workflows/ci.yml. In Trixi.jl and its related repositories, tests are triggered by

  • each git push to main and
  • each git push to any pull request.

Besides checking functionality, we also analyse the Test coverage to ensure that we do not miss important parts during testing.

Test and coverage requirements

Before merging a pull request (PR) to main, we require that

  • the code passes all functional tests
  • code coverage does not decrease.

Testing setup

The entry point for all testing is the file test/runtests.jl, which is run by the automated tests and which can be triggered manually by executing

julia> using Pkg; Pkg.test("Trixi")

in the REPL. Since there already exist many tests, we have split them up into multiple files in the test directory to allow for faster testing of individual parts of the code. Thus in addition to performing all tests, you can also just include one of the files named test_xxx.jl to run only a specific subset, e.g.,

julia> # Run all 2D tests on the P4estMesh
        include(joinpath("test", "test_p4est_2d.jl"))
 
 julia> # Run all 1D tests for the Euler equations on the TreeMesh
-       include(joinpath("test", "test_tree_1d_euler.jl"))

For the automated tests with GitHub Actions, we run multiple jobs in parallel to reduce the waiting time until all tests are finished. You can see the different components that are run as jobs by looking at the TRIXI_TEST variable in test/runtests.jl.

Adding new tests

We use Julia's built-in unit testing capabilities to configure tests. In general, newly added code must be covered by at least one test, and all new elixirs added to the examples/ directory must be used at least once during testing. New tests should be added to the corresponding test/test_xxx.jl file, e.g., a test involving the 3D linear advection equation on the TreeMesh would go into test/test_tree_3d_advection.jl. Please study one of the existing tests and stay consistent to the current style when creating new tests.

Since we want to test as much as possible, we have a lot of tests and frequently create new ones. Naturally, this increases the time to wait for all tests to pass with each novel feature added to Trixi.jl. Therefore, new tests should be as short as reasonably possible, i.e., without being too insensitive to pick up changes or errors in the code.

When you add new tests, please check whether all CI jobs still take approximately the same time. If the job where you added new tests takes much longer than everything else, please consider moving some tests from one job to another (or report this incident and ask the main developers for help).

Test duration

As a general rule, tests should last no more than 10 seconds when run with a single thread and after compilation (i.e., excluding the first run).

Test coverage

In addition to ensuring that the code produces the expected results, the automated tests also record the code coverage. The resulting coverage reports, i.e., which lines of code were executed by at least one test and are thus considered "covered" by testing, are automatically uploaded to Coveralls for easy analysis. Typically, you see a number of Coveralls results at the bottom of each pull request: One for each parallel job (see Testing setup), which can usually be ignored since they only cover parts of the code by definition, and a cumulative coverage result named coverage/coveralls. The "Details" link takes you to a detailed report on which lines of code are covered by tests, which ones are missed, and especially which new lines the pull requests adds to Trixi.jl's code base that are not yet covered by testing.

Coverage requirements

In general, we require pull requests to not decrease the overall test coverage percentage in main, with a hard lower bound of 97%.

+ include(joinpath("test", "test_tree_1d_euler.jl"))

For the automated tests with GitHub Actions, we run multiple jobs in parallel to reduce the waiting time until all tests are finished. You can see the different components that are run as jobs by looking at the TRIXI_TEST variable in test/runtests.jl.

Adding new tests

We use Julia's built-in unit testing capabilities to configure tests. In general, newly added code must be covered by at least one test, and all new elixirs added to the examples/ directory must be used at least once during testing. New tests should be added to the corresponding test/test_xxx.jl file, e.g., a test involving the 3D linear advection equation on the TreeMesh would go into test/test_tree_3d_advection.jl. Please study one of the existing tests and stay consistent to the current style when creating new tests.

Since we want to test as much as possible, we have a lot of tests and frequently create new ones. Naturally, this increases the time to wait for all tests to pass with each novel feature added to Trixi.jl. Therefore, new tests should be as short as reasonably possible, i.e., without being too insensitive to pick up changes or errors in the code.

When you add new tests, please check whether all CI jobs still take approximately the same time. If the job where you added new tests takes much longer than everything else, please consider moving some tests from one job to another (or report this incident and ask the main developers for help).

Test duration

As a general rule, tests should last no more than 10 seconds when run with a single thread and after compilation (i.e., excluding the first run).

Test coverage

In addition to ensuring that the code produces the expected results, the automated tests also record the code coverage. The resulting coverage reports, i.e., which lines of code were executed by at least one test and are thus considered "covered" by testing, are automatically uploaded to Coveralls for easy analysis. Typically, you see a number of Coveralls results at the bottom of each pull request: One for each parallel job (see Testing setup), which can usually be ignored since they only cover parts of the code by definition, and a cumulative coverage result named coverage/coveralls. The "Details" link takes you to a detailed report on which lines of code are covered by tests, which ones are missed, and especially which new lines the pull requests adds to Trixi.jl's code base that are not yet covered by testing.

Coverage requirements

In general, we require pull requests to not decrease the overall test coverage percentage in main, with a hard lower bound of 97%.

diff --git a/previews/PR1624/time_integration/index.html b/previews/PR1624/time_integration/index.html index 3410eeb0cf4..f221057ab63 100644 --- a/previews/PR1624/time_integration/index.html +++ b/previews/PR1624/time_integration/index.html @@ -1,2 +1,2 @@ -Time integration · Trixi.jl

Time integration methods

Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, explicit Runge-Kutta methods from OrdinaryDiffEq.jl are tested extensively. Interesting classes of time integration schemes are

Some common options for solve from OrdinaryDiffEq.jl are the following. Further documentation can be found in the SciML docs.

  • If you use a fixed time step method like CarpenterKennedy2N54, you need to pass a time step as dt=.... If you use a StepsizeCallback, the value passed as dt=... is irrelevant since it will be overwritten by the StepsizeCallback. If you want to use an adaptive time step method such as SSPRK43 or RDPK3SpFSAL49 and still want to use CFL-based step size control via the StepsizeCallback, you need to pass the keyword argument adaptive=false to solve.
  • You should usually set save_everystep=false. Otherwise, OrdinaryDiffEq.jl will (try to) save the numerical solution after every time step in RAM (until you run out of memory or start to swap).
  • You can set the maximal number of time steps via maxiters=....
  • SSP methods and many low-storage methods from OrdinaryDiffEq.jl support stage_limiter!s and step_limiter!s, e.g., PositivityPreservingLimiterZhangShu from Trixi.jl.
  • If you start Julia with multiple threads and want to use them also in the time integration method from OrdinaryDiffEq.jl, you need to pass the keyword argument thread=OrdinaryDiffEq.True() to the algorithm, e.g., RDPK3SpFSAL49(thread=OrdinaryDiffEq.True()) or CarpenterKennedy2N54(thread=OrdinaryDiffEq.True(), williamson_condition=false). For more information on using thread-based parallelism in Trixi.jl, please refer to Shared-memory parallelization with threads.
  • If you use error-based step size control (see also the section on error-based adaptive step sizes together with MPI, you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to OrdinaryDiffEq's solve, which are both included in ode_default_options.
Number of `rhs!` calls

If you use explicit Runge-Kutta methods from OrdinaryDiffEq.jl, the total number of rhs! calls can be (slightly) bigger than the number of steps times the number of stages, e.g. to allow for interpolation (dense output), root-finding for continuous callbacks, and error-based time step control. In general, you often should not need to worry about this if you use Trixi.jl.

+Time integration · Trixi.jl

Time integration methods

Trixi.jl is compatible with the SciML ecosystem for ordinary differential equations. In particular, explicit Runge-Kutta methods from OrdinaryDiffEq.jl are tested extensively. Interesting classes of time integration schemes are

Some common options for solve from OrdinaryDiffEq.jl are the following. Further documentation can be found in the SciML docs.

  • If you use a fixed time step method like CarpenterKennedy2N54, you need to pass a time step as dt=.... If you use a StepsizeCallback, the value passed as dt=... is irrelevant since it will be overwritten by the StepsizeCallback. If you want to use an adaptive time step method such as SSPRK43 or RDPK3SpFSAL49 and still want to use CFL-based step size control via the StepsizeCallback, you need to pass the keyword argument adaptive=false to solve.
  • You should usually set save_everystep=false. Otherwise, OrdinaryDiffEq.jl will (try to) save the numerical solution after every time step in RAM (until you run out of memory or start to swap).
  • You can set the maximal number of time steps via maxiters=....
  • SSP methods and many low-storage methods from OrdinaryDiffEq.jl support stage_limiter!s and step_limiter!s, e.g., PositivityPreservingLimiterZhangShu from Trixi.jl.
  • If you start Julia with multiple threads and want to use them also in the time integration method from OrdinaryDiffEq.jl, you need to pass the keyword argument thread=OrdinaryDiffEq.True() to the algorithm, e.g., RDPK3SpFSAL49(thread=OrdinaryDiffEq.True()) or CarpenterKennedy2N54(thread=OrdinaryDiffEq.True(), williamson_condition=false). For more information on using thread-based parallelism in Trixi.jl, please refer to Shared-memory parallelization with threads.
  • If you use error-based step size control (see also the section on error-based adaptive step sizes together with MPI, you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to OrdinaryDiffEq's solve, which are both included in ode_default_options.
Number of `rhs!` calls

If you use explicit Runge-Kutta methods from OrdinaryDiffEq.jl, the total number of rhs! calls can be (slightly) bigger than the number of steps times the number of stages, e.g. to allow for interpolation (dense output), root-finding for continuous callbacks, and error-based time step control. In general, you often should not need to worry about this if you use Trixi.jl.

diff --git a/previews/PR1624/troubleshooting/index.html b/previews/PR1624/troubleshooting/index.html index d7bc16966a0..03fdc04ffcb 100644 --- a/previews/PR1624/troubleshooting/index.html +++ b/previews/PR1624/troubleshooting/index.html @@ -1,5 +1,5 @@ -Troubleshooting and FAQ · Trixi.jl

Troubleshooting and FAQ

In general, Trixi.jl works best with the newest Julia release and up-to-date dependencies. If something does not work as expected, try updating your installed Julia packages via the package manager, e.g., by running

julia> import Pkg; Pkg.update()

If you do not use the latest stable release of Julia from the official website, consider updating your Julia installation.

Installing Trixi.jl as a package only provides an older release

Trixi.jl requires fairly recent versions of several of its dependencies, which sometimes causes issues when other installed packages have conflicting version requirements. In this case, Julia's package manager Pkg will try to handle this gracefully by going back in history until it finds a Trixi.jl release whose version requirements can be met, resulting in an older - and usually outdated - version of Trixi.jl being installed.

The following example illustrates this issue:

  • The current Trixi.jl release v0.3.6 requires package Foo with a minimum version of v0.2.
  • An older Trixi.jl release v0.2.1 requires package Foo only with a minimum version of v0.1.
  • A user has already installed package Bar, which itself requires Foo with a maximum version of v0.1.

In this case, installing Trixi.jl via Pkg will result in version v0.2.1 to be installed instead of the current release v0.3.6. That is, a specific release of Trixi.jl may not be installable if it has a dependency with a higher minimum version that at the same time is restricted to a lower maximum version by another installed package.

You can check whether an outdated version of Trixi.jl is installed by executing

julia> import Pkg; Pkg.update("Trixi"); Pkg.status("Trixi")

in the REPL and comparing the reported Trixi.jl version with the version of the latest release. If the versions differ, you can confirm that it is due to a version conflict by forcing Pkg to install the latest Trixi.jl release, where version is the current release:

julia> Pkg.add(name="Trixi", version="0.3.6")

In case of a conflict, the command above will produce an error that informs you about the offending packages, similar to the following:

   Updating registry at `~/.julia/registries/General`
+Troubleshooting and FAQ · Trixi.jl

Troubleshooting and FAQ

In general, Trixi.jl works best with the newest Julia release and up-to-date dependencies. If something does not work as expected, try updating your installed Julia packages via the package manager, e.g., by running

julia> import Pkg; Pkg.update()

If you do not use the latest stable release of Julia from the official website, consider updating your Julia installation.

Installing Trixi.jl as a package only provides an older release

Trixi.jl requires fairly recent versions of several of its dependencies, which sometimes causes issues when other installed packages have conflicting version requirements. In this case, Julia's package manager Pkg will try to handle this gracefully by going back in history until it finds a Trixi.jl release whose version requirements can be met, resulting in an older - and usually outdated - version of Trixi.jl being installed.

The following example illustrates this issue:

  • The current Trixi.jl release v0.3.6 requires package Foo with a minimum version of v0.2.
  • An older Trixi.jl release v0.2.1 requires package Foo only with a minimum version of v0.1.
  • A user has already installed package Bar, which itself requires Foo with a maximum version of v0.1.

In this case, installing Trixi.jl via Pkg will result in version v0.2.1 to be installed instead of the current release v0.3.6. That is, a specific release of Trixi.jl may not be installable if it has a dependency with a higher minimum version that at the same time is restricted to a lower maximum version by another installed package.

You can check whether an outdated version of Trixi.jl is installed by executing

julia> import Pkg; Pkg.update("Trixi"); Pkg.status("Trixi")

in the REPL and comparing the reported Trixi.jl version with the version of the latest release. If the versions differ, you can confirm that it is due to a version conflict by forcing Pkg to install the latest Trixi.jl release, where version is the current release:

julia> Pkg.add(name="Trixi", version="0.3.6")

In case of a conflict, the command above will produce an error that informs you about the offending packages, similar to the following:

   Updating registry at `~/.julia/registries/General`
   Resolving package versions...
 ERROR: Unsatisfiable requirements detected for package DataStructures [864edb3b]:
  DataStructures [864edb3b] log:
@@ -44,4 +44,4 @@
   set_preferences!(uuid, "PrecompileNoSpecialize" => false)
   set_preferences!(uuid, "PrecompileNonStiff" => true)
   set_preferences!(uuid, "PrecompileStiff" => false)
-end

This disables precompilation of all implicit methods. This should usually not affect the runtime latency with Trixi.jl since most setups use explicit time integration methods.

+end

This disables precompilation of all implicit methods. This should usually not affect the runtime latency with Trixi.jl since most setups use explicit time integration methods.

diff --git a/previews/PR1624/tutorials/DGMulti_1/fbd159b8.svg b/previews/PR1624/tutorials/DGMulti_1/0064e13f.svg similarity index 58% rename from previews/PR1624/tutorials/DGMulti_1/fbd159b8.svg rename to previews/PR1624/tutorials/DGMulti_1/0064e13f.svg index 64f7ea02a5b..60e1d919426 100644 --- a/previews/PR1624/tutorials/DGMulti_1/fbd159b8.svg +++ b/previews/PR1624/tutorials/DGMulti_1/0064e13f.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGMulti_1/fadf51f7.svg b/previews/PR1624/tutorials/DGMulti_1/10abe6bf.svg similarity index 90% rename from previews/PR1624/tutorials/DGMulti_1/fadf51f7.svg rename to previews/PR1624/tutorials/DGMulti_1/10abe6bf.svg index 6194e618c3a..787f50792f0 100644 --- a/previews/PR1624/tutorials/DGMulti_1/fadf51f7.svg +++ b/previews/PR1624/tutorials/DGMulti_1/10abe6bf.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGMulti_1/61e49aa9.svg b/previews/PR1624/tutorials/DGMulti_1/208d42b7.svg similarity index 77% rename from previews/PR1624/tutorials/DGMulti_1/61e49aa9.svg rename to previews/PR1624/tutorials/DGMulti_1/208d42b7.svg index 017ede98d17..a6914442f66 100644 --- a/previews/PR1624/tutorials/DGMulti_1/61e49aa9.svg +++ b/previews/PR1624/tutorials/DGMulti_1/208d42b7.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGMulti_1/9bd05ce4.svg b/previews/PR1624/tutorials/DGMulti_1/5d9b08f6.svg similarity index 76% rename from previews/PR1624/tutorials/DGMulti_1/9bd05ce4.svg rename to previews/PR1624/tutorials/DGMulti_1/5d9b08f6.svg index 4cfb73825b6..05f6a241b71 100644 --- a/previews/PR1624/tutorials/DGMulti_1/9bd05ce4.svg +++ b/previews/PR1624/tutorials/DGMulti_1/5d9b08f6.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGMulti_1/f8f84043.svg b/previews/PR1624/tutorials/DGMulti_1/95b64f7c.svg similarity index 90% rename from previews/PR1624/tutorials/DGMulti_1/f8f84043.svg rename to previews/PR1624/tutorials/DGMulti_1/95b64f7c.svg index 8a8eacb9227..fb608895746 100644 --- a/previews/PR1624/tutorials/DGMulti_1/f8f84043.svg +++ b/previews/PR1624/tutorials/DGMulti_1/95b64f7c.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGMulti_1/165f977b.svg b/previews/PR1624/tutorials/DGMulti_1/fba4076c.svg similarity index 89% rename from previews/PR1624/tutorials/DGMulti_1/165f977b.svg rename to previews/PR1624/tutorials/DGMulti_1/fba4076c.svg index 10aa8411e73..ca7dedac91d 100644 --- a/previews/PR1624/tutorials/DGMulti_1/165f977b.svg +++ b/previews/PR1624/tutorials/DGMulti_1/fba4076c.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGMulti_1/index.html b/previews/PR1624/tutorials/DGMulti_1/index.html index 41712c0179f..df4d1a4984a 100644 --- a/previews/PR1624/tutorials/DGMulti_1/index.html +++ b/previews/PR1624/tutorials/DGMulti_1/index.html @@ -1,5 +1,5 @@ -5 DG schemes via DGMulti solver · Trixi.jl

5: DG schemes via DGMulti solver

DGMulti is a DG solver that allows meshes with simplex elements. The basic idea and implementation of this solver is explained in section "Meshes". Here, we want to give some examples and a quick overview about the options with DGMulti.

We start with a simple example we already used in the tutorial about flux differencing. There, we implemented a simulation with initial_condition_weak_blast_wave for the 2D compressible Euler equations CompressibleEulerEquations2D and used the DG formulation with flux differencing using volume flux flux_ranocha and surface flux flux_lax_friedrichs.

Here, we want to implement the equivalent example, only now using the DGMulti solver instead of DGSEM.

using Trixi, OrdinaryDiffEq
+7 DG schemes via DGMulti solver · Trixi.jl

7: DG schemes via DGMulti solver

DGMulti is a DG solver that allows meshes with simplex elements. The basic idea and implementation of this solver is explained in section "Meshes". Here, we want to give some examples and a quick overview about the options with DGMulti.

We start with a simple example we already used in the tutorial about flux differencing. There, we implemented a simulation with initial_condition_weak_blast_wave for the 2D compressible Euler equations CompressibleEulerEquations2D and used the DG formulation with flux differencing using volume flux flux_ranocha and surface flux flux_lax_friedrichs.

Here, we want to implement the equivalent example, only now using the DGMulti solver instead of DGSEM.

using Trixi, OrdinaryDiffEq
 
 equations = CompressibleEulerEquations2D(1.4)
 
@@ -28,11 +28,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                  0                run time:       1.06200000e-06 s
+ #timesteps:                  0                run time:       1.24200000e-06 s
  Δt:             0.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
  sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:         NaN s
                                                PID:                   Inf s
- #DOFs per field:         16384                alloc'd memory:       2386.347 MiB
+ #DOFs per field:         16384                alloc'd memory:       2585.584 MiB
  #elements:                1024
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -41,18 +41,18 @@
  ∑∂S/∂U ⋅ Uₜ :  -4.07691781e-17
 ────────────────────────────────────────────────────────────────────────────────────────────────────
 
-#timesteps:     10 │ Δt: 8.7782e-03 │ sim. time: 6.2446e-02 (15.612%)  │ run time: 1.5205e-01 s
-#timesteps:     20 │ Δt: 1.2426e-02 │ sim. time: 1.7307e-01 (43.267%)  │ run time: 2.9937e-01 s
-#timesteps:     30 │ Δt: 1.3710e-02 │ sim. time: 3.0622e-01 (76.554%)  │ run time: 4.5032e-01 s
+#timesteps:     10 │ Δt: 8.7782e-03 │ sim. time: 6.2446e-02 (15.612%)  │ run time: 1.4813e-01 s
+#timesteps:     20 │ Δt: 1.2426e-02 │ sim. time: 1.7307e-01 (43.267%)  │ run time: 2.9160e-01 s
+#timesteps:     30 │ Δt: 1.3710e-02 │ sim. time: 3.0622e-01 (76.554%)  │ run time: 4.3570e-01 s
 
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                 37                run time:       5.57844587e-01 s
+ #timesteps:                 37                run time:       5.40248358e-01 s
  Δt:             9.57329122e-03                └── GC time:    0.00000000e+00 s (0.000%)
- sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  9.40224390e-08 s
-                                               PID:            1.00798758e-07 s
- #DOFs per field:         16384                alloc'd memory:       2391.208 MiB
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  9.08240690e-08 s
+                                               PID:            9.76392068e-08 s
+ #DOFs per field:         16384                alloc'd memory:       2590.445 MiB
  #elements:                1024
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -65,8 +65,8 @@
 Trixi.jl simulation finished.  Final time: 0.4  Time steps: 37 (accepted), 37 (total)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
using Plots
 pd = PlotData2D(sol)
-plot(pd)
Example block output
plot(pd["rho"])
-plot!(getmesh(pd))
Example block output

This simulation is not as fast as the equivalent with TreeMesh since no special optimizations for quads (for instance tensor product structure) have been implemented. Figure 4 in "Efficient implementation of modern entropy stable and kinetic energy preserving discontinuous Galerkin methods for conservation laws" (2021) provides a nice runtime comparison between the different mesh types. On the other hand, the functions are more general and thus we have more option we can choose from.

Simulation with Gauss nodes

For instance, we can change the approximation type of our simulation.

using Trixi, OrdinaryDiffEq
+plot(pd)
Example block output
plot(pd["rho"])
+plot!(getmesh(pd))
Example block output

This simulation is not as fast as the equivalent with TreeMesh since no special optimizations for quads (for instance tensor product structure) have been implemented. Figure 4 in "Efficient implementation of modern entropy stable and kinetic energy preserving discontinuous Galerkin methods for conservation laws" (2021) provides a nice runtime comparison between the different mesh types. On the other hand, the functions are more general and thus we have more option we can choose from.

Simulation with Gauss nodes

For instance, we can change the approximation type of our simulation.

using Trixi, OrdinaryDiffEq
 equations = CompressibleEulerEquations2D(1.4)
 initial_condition = initial_condition_weak_blast_wave
initial_condition_weak_blast_wave (generic function with 13 methods)

We now use Gauss nodes instead of Gauss-Lobatto nodes which can be done for the element types Quad() and Hex(). Therefore, we set approximation_type=GaussSBP(). Alternatively, we can use a modal approach using the approximation type Polynomial().

dg = DGMulti(polydeg = 3,
              element_type = Quad(),
@@ -95,11 +95,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                  0                run time:       1.52300000e-06 s
+ #timesteps:                  0                run time:       1.43300000e-06 s
  Δt:             0.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
  sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:         NaN s
                                                PID:                   Inf s
- #DOFs per field:         16384                alloc'd memory:       2422.014 MiB
+ #DOFs per field:         16384                alloc'd memory:       2618.868 MiB
  #elements:                1024
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -108,19 +108,19 @@
  ∑∂S/∂U ⋅ Uₜ :  -1.01164379e-01
 ────────────────────────────────────────────────────────────────────────────────────────────────────
 
-#timesteps:     10 │ Δt: 5.0548e-03 │ sim. time: 3.3436e-02 (8.359%)   │ run time: 4.7752e-01 s
-#timesteps:     20 │ Δt: 8.8313e-03 │ sim. time: 1.0601e-01 (26.503%)  │ run time: 9.4270e-01 s
-#timesteps:     30 │ Δt: 1.0521e-02 │ sim. time: 2.0438e-01 (51.094%)  │ run time: 1.4082e+00 s
-#timesteps:     40 │ Δt: 1.1006e-02 │ sim. time: 3.1245e-01 (78.113%)  │ run time: 1.8753e+00 s
+#timesteps:     10 │ Δt: 5.0548e-03 │ sim. time: 3.3436e-02 (8.359%)   │ run time: 4.8293e-01 s
+#timesteps:     20 │ Δt: 8.8313e-03 │ sim. time: 1.0601e-01 (26.503%)  │ run time: 9.5003e-01 s
+#timesteps:     30 │ Δt: 1.0521e-02 │ sim. time: 2.0438e-01 (51.094%)  │ run time: 1.4173e+00 s
+#timesteps:     40 │ Δt: 1.1006e-02 │ sim. time: 3.1245e-01 (78.113%)  │ run time: 1.8849e+00 s
 
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                 48                run time:       2.27908016e+00 s
+ #timesteps:                 48                run time:       2.26586407e+00 s
  Δt:             1.00192333e-02                └── GC time:    0.00000000e+00 s (0.000%)
- sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  3.04877188e-07 s
-                                               PID:            3.18857922e-07 s
- #DOFs per field:         16384                alloc'd memory:       2424.384 MiB
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  3.00558227e-07 s
+                                               PID:            3.17029669e-07 s
+ #DOFs per field:         16384                alloc'd memory:       2621.238 MiB
  #elements:                1024
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -133,7 +133,7 @@
 Trixi.jl simulation finished.  Final time: 0.4  Time steps: 48 (accepted), 48 (total)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
using Plots
 pd = PlotData2D(sol)
-plot(pd)
Example block output

Simulation with triangular elements

Also, we can set another element type. We want to use triangles now.

using Trixi, OrdinaryDiffEq
+plot(pd)
Example block output

Simulation with triangular elements

Also, we can set another element type. We want to use triangles now.

using Trixi, OrdinaryDiffEq
 equations = CompressibleEulerEquations2D(1.4)
 initial_condition = initial_condition_weak_blast_wave
initial_condition_weak_blast_wave (generic function with 13 methods)

Since there is no direct equivalent to Gauss-Lobatto nodes on triangles, the approximation type SBP() now uses Gauss-Lobatto nodes on faces and special nodes in the interior of the triangular. More details can be found in the documentation of StartUpDG.jl.

dg = DGMulti(polydeg = 3,
              element_type = Tri(),
@@ -162,11 +162,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                  0                run time:       1.08200000e-06 s
+ #timesteps:                  0                run time:       1.17300000e-06 s
  Δt:             0.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
  sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:         NaN s
                                                PID:                   Inf s
- #DOFs per field:         30720                alloc'd memory:       2464.805 MiB
+ #DOFs per field:         30720                alloc'd memory:       2652.463 MiB
  #elements:                2048
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -175,19 +175,19 @@
  ∑∂S/∂U ⋅ Uₜ :  -6.74736856e-03
 ────────────────────────────────────────────────────────────────────────────────────────────────────
 
-#timesteps:     10 │ Δt: 6.6947e-03 │ sim. time: 4.5960e-02 (11.490%)  │ run time: 8.2017e-01 s
-#timesteps:     20 │ Δt: 1.0524e-02 │ sim. time: 1.3699e-01 (34.249%)  │ run time: 1.6243e+00 s
-#timesteps:     30 │ Δt: 1.2096e-02 │ sim. time: 2.5197e-01 (62.993%)  │ run time: 2.4411e+00 s
-#timesteps:     40 │ Δt: 1.2622e-02 │ sim. time: 3.7597e-01 (93.993%)  │ run time: 3.2655e+00 s
+#timesteps:     10 │ Δt: 6.6947e-03 │ sim. time: 4.5960e-02 (11.490%)  │ run time: 8.1025e-01 s
+#timesteps:     20 │ Δt: 1.0524e-02 │ sim. time: 1.3699e-01 (34.249%)  │ run time: 1.6059e+00 s
+#timesteps:     30 │ Δt: 1.2096e-02 │ sim. time: 2.5197e-01 (62.993%)  │ run time: 2.4140e+00 s
+#timesteps:     40 │ Δt: 1.2622e-02 │ sim. time: 3.7597e-01 (93.993%)  │ run time: 3.2298e+00 s
 
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                 42                run time:       3.44302981e+00 s
+ #timesteps:                 42                run time:       3.40467542e+00 s
  Δt:             1.13592115e-02                └── GC time:    0.00000000e+00 s (0.000%)
- sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  2.85553711e-07 s
-                                               PID:            2.93127595e-07 s
- #DOFs per field:         30720                alloc'd memory:       2473.716 MiB
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  2.83179097e-07 s
+                                               PID:            2.89989257e-07 s
+ #DOFs per field:         30720                alloc'd memory:       2661.374 MiB
  #elements:                2048
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -200,10 +200,10 @@
 Trixi.jl simulation finished.  Final time: 0.4  Time steps: 42 (accepted), 42 (total)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
using Plots
 pd = PlotData2D(sol)
-plot(pd)
Example block output
plot(pd["rho"])
-plot!(getmesh(pd))
Example block output

Triangular meshes on non-Cartesian domains

To use triangular meshes on a non-Cartesian domain, Trixi.jl uses the package StartUpDG.jl. The following example is based on elixir_euler_triangulate_pkg_mesh.jl and uses a pre-defined mesh from StartUpDG.jl.

using Trixi, OrdinaryDiffEq

We want to simulate the smooth initial condition initial_condition_convergence_test with source terms source_terms_convergence_test for the 2D compressible Euler equations.

equations = CompressibleEulerEquations2D(1.4)
+plot(pd)
Example block output
plot(pd["rho"])
+plot!(getmesh(pd))
Example block output

Triangular meshes on non-Cartesian domains

To use triangular meshes on a non-Cartesian domain, Trixi.jl uses the package StartUpDG.jl. The following example is based on elixir_euler_triangulate_pkg_mesh.jl and uses a pre-defined mesh from StartUpDG.jl.

using Trixi, OrdinaryDiffEq

We want to simulate the smooth initial condition initial_condition_convergence_test with source terms source_terms_convergence_test for the 2D compressible Euler equations.

equations = CompressibleEulerEquations2D(1.4)
 initial_condition = initial_condition_convergence_test
-source_terms = source_terms_convergence_test
source_terms_convergence_test (generic function with 14 methods)

We create the solver DGMulti with triangular elements (Tri()) as before.

dg = DGMulti(polydeg = 3, element_type = Tri(),
+source_terms = source_terms_convergence_test
source_terms_convergence_test (generic function with 13 methods)

We create the solver DGMulti with triangular elements (Tri()) as before.

dg = DGMulti(polydeg = 3, element_type = Tri(),
              approximation_type=Polynomial(),
              surface_flux = flux_lax_friedrichs,
              volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
@@ -242,11 +242,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                  0                run time:       1.02200000e-06 s
+ #timesteps:                  0                run time:       1.42200000e-06 s
  Δt:             1.49245207e-03                └── GC time:    0.00000000e+00 s (0.000%)
  sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:         NaN s
                                                PID:                   Inf s
- #DOFs per field:          5980                alloc'd memory:       2507.877 MiB
+ #DOFs per field:          5980                alloc'd memory:       2703.909 MiB
  #elements:                 598
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -255,12 +255,12 @@
  ∑∂S/∂U ⋅ Uₜ :  -1.23444983e-02
 ────────────────────────────────────────────────────────────────────────────────────────────────────
 
-#timesteps:     20 │ Δt: 1.4925e-03 │ sim. time: 2.9849e-02 (14.925%)  │ run time: 5.4895e-01 s
-#timesteps:     40 │ Δt: 1.4925e-03 │ sim. time: 5.9698e-02 (29.849%)  │ run time: 1.0717e+00 s
-#timesteps:     60 │ Δt: 1.4925e-03 │ sim. time: 8.9547e-02 (44.774%)  │ run time: 1.6095e+00 s
-#timesteps:     80 │ Δt: 1.4925e-03 │ sim. time: 1.1940e-01 (59.698%)  │ run time: 2.1313e+00 s
-#timesteps:    100 │ Δt: 1.4925e-03 │ sim. time: 1.4925e-01 (74.623%)  │ run time: 2.6591e+00 s
-#timesteps:    120 │ Δt: 1.4925e-03 │ sim. time: 1.7909e-01 (89.547%)  │ run time: 3.1829e+00 s
+#timesteps:     20 │ Δt: 1.4925e-03 │ sim. time: 2.9849e-02 (14.925%)  │ run time: 5.3836e-01 s
+#timesteps:     40 │ Δt: 1.4925e-03 │ sim. time: 5.9698e-02 (29.849%)  │ run time: 1.0654e+00 s
+#timesteps:     60 │ Δt: 1.4925e-03 │ sim. time: 8.9547e-02 (44.774%)  │ run time: 1.5912e+00 s
+#timesteps:     80 │ Δt: 1.4925e-03 │ sim. time: 1.1940e-01 (59.698%)  │ run time: 2.1177e+00 s
+#timesteps:    100 │ Δt: 1.4925e-03 │ sim. time: 1.4925e-01 (74.623%)  │ run time: 2.6445e+00 s
+#timesteps:    120 │ Δt: 1.4925e-03 │ sim. time: 1.7909e-01 (89.547%)  │ run time: 3.1722e+00 s
 ────────────────────────────────────────────────────────────────────────────────────────────────────
 Trixi.jl simulation finished.  Final time: 0.2  Time steps: 135 (accepted), 135 (total)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
@@ -269,11 +269,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                135                run time:       3.57582854e+00 s
+ #timesteps:                135                run time:       3.57029004e+00 s
  Δt:             1.14223386e-05                └── GC time:    0.00000000e+00 s (0.000%)
- sim. time:      2.00000000e-01 (100.000%)     time/DOF/rhs!:  8.76292946e-07 s
-                                               PID:            8.83090824e-07 s
- #DOFs per field:          5980                alloc'd memory:       2508.350 MiB
+ sim. time:      2.00000000e-01 (100.000%)     time/DOF/rhs!:  8.74988798e-07 s
+                                               PID:            8.81678523e-07 s
+ #DOFs per field:          5980                alloc'd memory:       2704.381 MiB
  #elements:                 598
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -283,7 +283,7 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
using Plots
 pd = PlotData2D(sol)
 plot(pd["rho"])
-plot!(getmesh(pd))
Example block output

For more information, please have a look in the StartUpDG.jl documentation.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+plot!(getmesh(pd))
Example block output

For more information, please have a look in the StartUpDG.jl documentation.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
 versioninfo()
 
 using Pkg
@@ -303,7 +303,7 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
  [1dea7af3] OrdinaryDiffEq v6.66.0
-  [91a5bcdd] Plots v1.39.0
+ [91a5bcdd] Plots v1.39.0
   [472ebc20] StartUpDG v0.17.7
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`
-Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

+ [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl` +Info Packages marked with have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/DGMulti_2/index.html b/previews/PR1624/tutorials/DGMulti_2/index.html index 289f8a84398..3e765fe53ae 100644 --- a/previews/PR1624/tutorials/DGMulti_2/index.html +++ b/previews/PR1624/tutorials/DGMulti_2/index.html @@ -1,5 +1,5 @@ -6 Other SBP schemes (FD, CGSEM) via DGMulti solver · Trixi.jl

6: Other SBP schemes (FD, CGSEM) via DGMulti solver

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
+8 Other SBP schemes (FD, CGSEM) via DGMulti solver · Trixi.jl

8: Other SBP schemes (FD, CGSEM) via DGMulti solver

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)
SBP first-derivative operator of order 2 on a grid in [0.0, 1.0] using 11 nodes 
 and coefficients of Mattsson, Nordström (2004) 
@@ -32,5 +32,5 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
   [472ebc20] StartUpDG v0.17.7
-  [9f78cca6] SummationByPartsOperators v0.5.52
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

+ [9f78cca6] SummationByPartsOperators v0.5.53 + [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/DGSEM_FluxDiff/464dc32e.svg b/previews/PR1624/tutorials/DGSEM_FluxDiff/081aafce.svg similarity index 94% rename from previews/PR1624/tutorials/DGSEM_FluxDiff/464dc32e.svg rename to previews/PR1624/tutorials/DGSEM_FluxDiff/081aafce.svg index 557d75bb58a..37f6af2e22b 100644 --- a/previews/PR1624/tutorials/DGSEM_FluxDiff/464dc32e.svg +++ b/previews/PR1624/tutorials/DGSEM_FluxDiff/081aafce.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGSEM_FluxDiff/7294c625.svg b/previews/PR1624/tutorials/DGSEM_FluxDiff/b2d0b36c.svg similarity index 95% rename from previews/PR1624/tutorials/DGSEM_FluxDiff/7294c625.svg rename to previews/PR1624/tutorials/DGSEM_FluxDiff/b2d0b36c.svg index c63f1a637af..4fda4762dd3 100644 --- a/previews/PR1624/tutorials/DGSEM_FluxDiff/7294c625.svg +++ b/previews/PR1624/tutorials/DGSEM_FluxDiff/b2d0b36c.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/DGSEM_FluxDiff/index.html b/previews/PR1624/tutorials/DGSEM_FluxDiff/index.html index 478e4c00226..92ee5435899 100644 --- a/previews/PR1624/tutorials/DGSEM_FluxDiff/index.html +++ b/previews/PR1624/tutorials/DGSEM_FluxDiff/index.html @@ -1,5 +1,5 @@ -2 DGSEM with flux differencing · Trixi.jl

2: DGSEM with flux differencing

This tutorial starts with a presentation of the weak formulation of the discontinuous Galerkin spectral element method (DGSEM) in order to fix the notation of the used operators. Then, the DGSEM formulation with flux differencing (split form DGSEM) and its implementation in Trixi.jl is shown.

We start with the one-dimensional conservation law

\[u_t + f(u)_x = 0, \qquad t\in \mathbb{R}^+, x\in\Omega\]

with the physical flux $f$.

We split the domain $\Omega$ into elements $K$ with center $x_K$ and size $\Delta x$. With the transformation mapping $x(\xi)=x_K + \frac{\Delta x}{2} \xi$ we can transform the reference element $[-1,1]$ to every physical element. So, the equation can be restricted to the reference element using the determinant of the Jacobian matrix of the transformation mapping $J=\frac{\partial x}{\partial \xi}=\frac{\Delta x}{2}$.

\[J u_t + f(u)_{\xi} = 0, \qquad t\in \mathbb{R}^+, \xi\in [-1,1]\]

The weak form of the DGSEM

We consider the so-called discontinuous Galerkin spectral element method (DGSEM) with collocation. It results from choosing a nodal DG ansatz using $N+1$ Gauss-Lobatto nodes $\xi_i$ in $[-1,1]$ with matching interpolation weights $w_i$, which are used for numerical integration and interpolation with the Lagrange polynomial basis $l_i$ of degree $N$. The Lagrange functions are created with those nodes and hence fulfil a Kronecker property at the GL nodes. The weak formulation of the DGSEM for one element is

\[J \underline{\dot{u}}(t) = - M^{-1} B \underline{f}^* + M^{-1} D^T M \underline{f}\]

where $\underline{u}=(u_0, u_1, \dots, u_N)^T\in\mathbb{R}^{N+1}$ is the collected pointwise evaluation of $u$ at the discretization nodes and $\dot{u} = \partial u / \partial t = u_t$ is the temporal derivative. The nodal values of the flux function $f$ results with collocation in $\underline{f}$, since $\underline{f}_j=f(\underline{u}_j)$. Moreover, we got the numerical flux $f^*=f^*(u^-, u^+)$.

We will now have a short overview over the operators we used.

The derivative matrix $D\in\mathbb{R}^{(N+1)\times (N+1)}$ mimics a spatial derivation on a discrete level with $\underline{f}_x \approx D \underline{f}$. It is defined by $D_{ij} = l_j'(\xi_i)$.

The diagonal mass matrix $M$ is defined by $M_{ij}=\langle l_j, l_i\rangle_N$ with the numerical scalar product $\langle \cdot, \cdot\rangle_N$ defined for functions $f$ and $g$ by

\[\langle f, g\rangle_N := \int_{-1, N}^1 f(\xi) g(\xi) d\xi := \sum_{k=0}^N f(\xi_k) g(\xi_k) w_k.\]

The multiplication by $M$ matches a discrete integration

\[ \int_{-1}^1 f(\xi) \underline{l}(\xi) d\xi \approx M \underline{f},\]

The boundary matrix $B=\text{diag}([-1, 0,..., 0, 1])$ represents an evaluation of a function at the boundaries $\xi_0=-1$ and $\xi_N=1$.

For these operators the following property holds:

\[ M D + (M D)^T = B.\]

This is called the summation-by-parts (SBP) property since it mimics integration by parts on a discrete level (Gassner (2013)).

The explicit definitions of the operators and the construction of the 1D algorithm can be found for instance in the tutorial introduction to DG methods or in more detail in Kopriva (2009).

This property shows the equivalence between the weak form and the following strong formulation of the DGSEM.

\[\begin{align*} +4 DGSEM with flux differencing · Trixi.jl

4: DGSEM with flux differencing

This tutorial starts with a presentation of the weak formulation of the discontinuous Galerkin spectral element method (DGSEM) in order to fix the notation of the used operators. Then, the DGSEM formulation with flux differencing (split form DGSEM) and its implementation in Trixi.jl is shown.

We start with the one-dimensional conservation law

\[u_t + f(u)_x = 0, \qquad t\in \mathbb{R}^+, x\in\Omega\]

with the physical flux $f$.

We split the domain $\Omega$ into elements $K$ with center $x_K$ and size $\Delta x$. With the transformation mapping $x(\xi)=x_K + \frac{\Delta x}{2} \xi$ we can transform the reference element $[-1,1]$ to every physical element. So, the equation can be restricted to the reference element using the determinant of the Jacobian matrix of the transformation mapping $J=\frac{\partial x}{\partial \xi}=\frac{\Delta x}{2}$.

\[J u_t + f(u)_{\xi} = 0, \qquad t\in \mathbb{R}^+, \xi\in [-1,1]\]

The weak form of the DGSEM

We consider the so-called discontinuous Galerkin spectral element method (DGSEM) with collocation. It results from choosing a nodal DG ansatz using $N+1$ Gauss-Lobatto nodes $\xi_i$ in $[-1,1]$ with matching interpolation weights $w_i$, which are used for numerical integration and interpolation with the Lagrange polynomial basis $l_i$ of degree $N$. The Lagrange functions are created with those nodes and hence fulfil a Kronecker property at the GL nodes. The weak formulation of the DGSEM for one element is

\[J \underline{\dot{u}}(t) = - M^{-1} B \underline{f}^* + M^{-1} D^T M \underline{f}\]

where $\underline{u}=(u_0, u_1, \dots, u_N)^T\in\mathbb{R}^{N+1}$ is the collected pointwise evaluation of $u$ at the discretization nodes and $\dot{u} = \partial u / \partial t = u_t$ is the temporal derivative. The nodal values of the flux function $f$ results with collocation in $\underline{f}$, since $\underline{f}_j=f(\underline{u}_j)$. Moreover, we got the numerical flux $f^*=f^*(u^-, u^+)$.

We will now have a short overview over the operators we used.

The derivative matrix $D\in\mathbb{R}^{(N+1)\times (N+1)}$ mimics a spatial derivation on a discrete level with $\underline{f}_x \approx D \underline{f}$. It is defined by $D_{ij} = l_j'(\xi_i)$.

The diagonal mass matrix $M$ is defined by $M_{ij}=\langle l_j, l_i\rangle_N$ with the numerical scalar product $\langle \cdot, \cdot\rangle_N$ defined for functions $f$ and $g$ by

\[\langle f, g\rangle_N := \int_{-1, N}^1 f(\xi) g(\xi) d\xi := \sum_{k=0}^N f(\xi_k) g(\xi_k) w_k.\]

The multiplication by $M$ matches a discrete integration

\[ \int_{-1}^1 f(\xi) \underline{l}(\xi) d\xi \approx M \underline{f},\]

The boundary matrix $B=\text{diag}([-1, 0,..., 0, 1])$ represents an evaluation of a function at the boundaries $\xi_0=-1$ and $\xi_N=1$.

For these operators the following property holds:

\[ M D + (M D)^T = B.\]

This is called the summation-by-parts (SBP) property since it mimics integration by parts on a discrete level (Gassner (2013)).

The explicit definitions of the operators and the construction of the 1D algorithm can be found for instance in the tutorial introduction to DG methods or in more detail in Kopriva (2009).

This property shows the equivalence between the weak form and the following strong formulation of the DGSEM.

\[\begin{align*} J \underline{\dot{u}}(t) &= - M^{-1} B \underline{f}^* + M^{-1} D^T M \underline{f}\\[5pt] &= - M^{-1} B \underline{f}^* + M^{-1} (B - MD) \underline{f}\\[5pt] @@ -54,11 +54,11 @@ ──────────────────────────────────────────────────────────────────────────────────────────────────── Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3) ──────────────────────────────────────────────────────────────────────────────────────────────────── - #timesteps: 0 run time: 7.81000000e-07 s + #timesteps: 0 run time: 8.42000000e-07 s Δt: 0.00000000e+00 └── GC time: 0.00000000e+00 s (0.000%) sim. time: 0.00000000e+00 (0.000%) time/DOF/rhs!: NaN s PID: Inf s - #DOFs per field: 16384 alloc'd memory: 2516.749 MiB + #DOFs per field: 16384 alloc'd memory: 2700.882 MiB #elements: 1024 Variable: rho rho_v1 rho_v2 rho_e @@ -71,19 +71,19 @@ ──────────────────────────────────────────────────────────────────────────────────────────────────── Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3) ──────────────────────────────────────────────────────────────────────────────────────────────────── - #timesteps: 61 run time: 8.85897993e-01 s + #timesteps: 61 run time: 9.11395485e-01 s Δt: 2.65388338e-06 └── GC time: 0.00000000e+00 s (0.000%) - sim. time: 4.00000000e-01 (100.000%) time/DOF/rhs!: 9.09829036e-08 s - PID: 9.74935153e-08 s - #DOFs per field: 16384 alloc'd memory: 2518.476 MiB + sim. time: 4.00000000e-01 (100.000%) time/DOF/rhs!: 9.30133547e-08 s + PID: 1.00329540e-07 s + #DOFs per field: 16384 alloc'd memory: 2702.610 MiB #elements: 1024 Variable: rho rho_v1 rho_v2 rho_e L2 error: 6.17814257e-02 5.02178088e-02 5.02253900e-02 2.25981851e-01 Linf error: 2.91149630e-01 3.21787795e-01 3.22040740e-01 1.04645370e+00 - ∑∂S/∂U ⋅ Uₜ : -2.34481695e-18 + ∑∂S/∂U ⋅ Uₜ : -4.30663196e-18 ────────────────────────────────────────────────────────────────────────────────────────────────────

A look at the change in entropy $\sum \partial S/\partial U \cdot U_t$ in the analysis callback confirms that the flux is entropy conserving since the change is about machine precision.

We can plot the approximated solution at the time t=0.4.

using Plots
-plot(sol)
Example block output

Now, we can use for instance the dissipative flux flux_lax_friedrichs as surface flux to get an entropy stable method.

using OrdinaryDiffEq, Trixi
+plot(sol)
Example block output

Now, we can use for instance the dissipative flux flux_lax_friedrichs as surface flux to get an entropy stable method.

using OrdinaryDiffEq, Trixi
 
 gamma = 1.4
 equations = CompressibleEulerEquations2D(gamma)
@@ -113,11 +113,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                  0                run time:       7.72000000e-07 s
+ #timesteps:                  0                run time:       8.51000000e-07 s
  Δt:             0.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
  sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:         NaN s
                                                PID:                   Inf s
- #DOFs per field:         16384                alloc'd memory:       2603.176 MiB
+ #DOFs per field:         16384                alloc'd memory:       2699.726 MiB
  #elements:                1024
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -130,11 +130,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                 37                run time:       5.19967342e-01 s
+ #timesteps:                 37                run time:       5.44143161e-01 s
  Δt:             9.70561500e-03                └── GC time:    0.00000000e+00 s (0.000%)
- sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  8.58841763e-08 s
-                                               PID:            9.36932658e-08 s
- #DOFs per field:         16384                alloc'd memory:       2604.902 MiB
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  9.01071495e-08 s
+                                               PID:            9.81093957e-08 s
+ #DOFs per field:         16384                alloc'd memory:       2701.452 MiB
  #elements:                1024
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -142,7 +142,7 @@
  Linf error:     2.61815838e-01   2.48816692e-01   2.48316760e-01   9.30972696e-01
  ∑∂S/∂U ⋅ Uₜ :  -1.40306972e-04
 ────────────────────────────────────────────────────────────────────────────────────────────────────

The change in entropy confirms the expected entropy stability.

using Plots
-plot(sol)
Example block output

Of course, you can use more than these two fluxes in Trixi. Here, we will give a short list of possible fluxes for the compressible Euler equations. For the volume flux Trixi.jl provides for example flux_ranocha, flux_shima_etal, flux_chandrashekar, flux_kennedy_gruber. As surface flux you can use all volume fluxes and additionally for instance flux_lax_friedrichs, flux_hll, flux_hllc.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+plot(sol)
Example block output

Of course, you can use more than these two fluxes in Trixi. Here, we will give a short list of possible fluxes for the compressible Euler equations. For the volume flux Trixi.jl provides for example flux_ranocha, flux_shima_etal, flux_chandrashekar, flux_kennedy_gruber. As surface flux you can use all volume fluxes and additionally for instance flux_lax_friedrichs, flux_hll, flux_hllc.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
 versioninfo()
 
 using Pkg
@@ -162,6 +162,6 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
  [1dea7af3] OrdinaryDiffEq v6.66.0
-  [91a5bcdd] Plots v1.39.0
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`
-Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

+ [91a5bcdd] Plots v1.39.0 + [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl` +Info Packages marked with have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/adaptive_mesh_refinement/1bd6887d.svg b/previews/PR1624/tutorials/adaptive_mesh_refinement/52aac2a9.svg similarity index 85% rename from previews/PR1624/tutorials/adaptive_mesh_refinement/1bd6887d.svg rename to previews/PR1624/tutorials/adaptive_mesh_refinement/52aac2a9.svg index 9c53eee82c9..637a08626b3 100644 --- a/previews/PR1624/tutorials/adaptive_mesh_refinement/1bd6887d.svg +++ b/previews/PR1624/tutorials/adaptive_mesh_refinement/52aac2a9.svg @@ -1,35 +1,35 @@ - + - + - + - + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/adaptive_mesh_refinement/index.html b/previews/PR1624/tutorials/adaptive_mesh_refinement/index.html index 4cdab2ec780..b0c8f8e8814 100644 --- a/previews/PR1624/tutorials/adaptive_mesh_refinement/index.html +++ b/previews/PR1624/tutorials/adaptive_mesh_refinement/index.html @@ -1,5 +1,5 @@ -12 Adaptive mesh refinement · Trixi.jl

12: Adaptive mesh refinement

Adaptive mesh refinement (AMR) is a method of adapting the resolution of the numerical method to the solution features such as turbulent regions or shocks. In those critical regions of the domain, we want the simulation to use elements with smaller mesh sizes compared to other regions. This should be automatically and dynamically adapted during the run of the simulation.

Implementation in Trixi.jl

In Trixi.jl, AMR is possible for the mesh types TreeMesh and P4estMesh. Both meshes are organized in a tree structure and therefore, each element can be refined independently. In Trixi.jl, AMR is restricted to a 2:1 refinement ratio between neighbor elements. This means that the maximum resolution difference of neighboring elements is a factor of two.

The implementation of AMR is divided into different steps. The basic refinement setting contains an indicator and a controller. These are added to the simulation by using an AMR callback.

Indicators

An indicator estimates the current accuracy of the numerical approximation. It indicates which regions of the domain need finer or coarser resolutions. In Trixi.jl, you can use for instance IndicatorLöhner and IndicatorHennemannGassner.

IndicatorLöhner (also callable with IndicatorLoehner) is an interpretation and adaptation of a FEM indicator by Löhner (1987) and estimates a weighted second derivative of a specified variable locally.

amr_indicator = IndicatorLöhner(semi, variable=variable)

All indicators have the parameter variable which is used to specify the variable for the indicator calculation. You can use for instance density, pressure or density_pressure for the compressible Euler equations. Moreover, you have the option to use simply the first conservation variable with first for any equations. This might be a good choice for a starting example.

IndicatorHennemannGassner, also used as a shock-capturing indicator, was developed by Hennemann et al. (2021) and is explained in detail in the tutorial about shock-capturing. It can be constructed as follows.

amr_indicator = IndicatorHennemannGassner(semi,
+14 Adaptive mesh refinement · Trixi.jl

14: Adaptive mesh refinement

Adaptive mesh refinement (AMR) is a method of adapting the resolution of the numerical method to the solution features such as turbulent regions or shocks. In those critical regions of the domain, we want the simulation to use elements with smaller mesh sizes compared to other regions. This should be automatically and dynamically adapted during the run of the simulation.

Implementation in Trixi.jl

In Trixi.jl, AMR is possible for the mesh types TreeMesh and P4estMesh. Both meshes are organized in a tree structure and therefore, each element can be refined independently. In Trixi.jl, AMR is restricted to a 2:1 refinement ratio between neighbor elements. This means that the maximum resolution difference of neighboring elements is a factor of two.

The implementation of AMR is divided into different steps. The basic refinement setting contains an indicator and a controller. These are added to the simulation by using an AMR callback.

Indicators

An indicator estimates the current accuracy of the numerical approximation. It indicates which regions of the domain need finer or coarser resolutions. In Trixi.jl, you can use for instance IndicatorLöhner and IndicatorHennemannGassner.

IndicatorLöhner (also callable with IndicatorLoehner) is an interpretation and adaptation of a FEM indicator by Löhner (1987) and estimates a weighted second derivative of a specified variable locally.

amr_indicator = IndicatorLöhner(semi, variable=variable)

All indicators have the parameter variable which is used to specify the variable for the indicator calculation. You can use for instance density, pressure or density_pressure for the compressible Euler equations. Moreover, you have the option to use simply the first conservation variable with first for any equations. This might be a good choice for a starting example.

IndicatorHennemannGassner, also used as a shock-capturing indicator, was developed by Hennemann et al. (2021) and is explained in detail in the tutorial about shock-capturing. It can be constructed as follows.

amr_indicator = IndicatorHennemannGassner(semi,
                                           alpha_max=0.5,
                                           alpha_min=0.001,
                                           alpha_smooth=true,
@@ -53,7 +53,7 @@
             save_everystep=false, callback=callbacks);

We plot the solution and add the refined mesh at the end of the simulation.

using Plots
 pd = PlotData2D(sol)
 plot(pd)
-plot!(getmesh(pd))
Example block output

More examples

Trixi.jl provides many elixirs using AMR. We want to give some examples for different mesh types:

Animations of more interesting and complicated AMR simulations can be found below and on Trixi.jl's youtube channel "Trixi Framework".

First, we give a purely hyperbolic simulation of a Sedov blast wave with self-gravity. This simulation uses the mesh type TreeMesh as we did and the AMR indicator IndicatorHennemannGassner.

U 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�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 BB6$D+ literal 205696 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
6%c|66R$*GR}qCz*Nktca3l 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 diff --git a/previews/PR1624/tutorials/out/solution_000010.vtu b/previews/PR1624/tutorials/out/solution_000010.vtu index 431cdad652b6ab649cbfcc86f87d14cf88c95415..af6fc48038bc15581ac963e9fd5d1b0a50b35374 100644 GIT binary patch delta 12052 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 AY5)KL diff --git a/previews/PR1624/tutorials/out/solution_000020.vtu b/previews/PR1624/tutorials/out/solution_000020.vtu index d90babd33cf417103641662c4331547b685755e3..01aafe1c226d38f3d25f599e79adda35bc8fbafc 100644 GIT binary patch delta 12070 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 OYh<9VW*kio<@AJ&~pyMT? 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ᒥ|pGNOE(J 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

D?uZ^YFf=S!%!6bHLM`dL@e>J#71t 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 Q*sc=qTdhwad54{n>Y5U`DoNiU(i?O0& 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 z zf3+JUh}W2oEdKBu`5pEC@uZ)9`N)Bjkarb6QXPTvUd4<27QcsnjTzP}zXJQ@ zknTB7*mp9{iO;|2((uK-afGgS^l?02d2Qd99Prm?>-8f776< zCCK*+znHiR`nM8$V!eSfT1#gHqdz~rGuuw-_A4e&rgmO<;5VM;yHsn=uWaD&Jtw>9 zzI~fdioaw{DR`(zdF{vurAK0VA57@gYpcr@yhF%4~(z;iLlDVocH zGxYcGumw(EaA)NjV9~SH1L=Lh8R1_XPeEVHVeR18KPY zUe%wY^_Co66FhDK`o)tsqz~uf(`JdUR7Zbaiq?H(58j(1zGvhc>~|U!mTaAZdwr+X z|KiWWuAfuRC_SBseWv!qC_nV;z`MUAyO1t6s`O6}o{Qc0?3oPuankR?%SK4Q9d~Fl zoo8-N@sc?UJKcYMo!O4`2h}l0F9CCPmL_~e`h_<`o=ZUQl66yf`=e3l9E-%*lkzc(X2UPk^q@xn@t>sg}MUmQ7~e`hrMbF8*lix%ov_WbX8F7g|f zsfttm)yKClw1K^v;nfSBP)_+s^=0&ZpvLlFOR2muD?0*)0fp2>gRGDq?D1ke`GYqS zfiVk#H*d+O)BQBhr#YMajlcIj_Iuc|wf!$ULO%5VxDd@3y-BCNh>s3kc3qs-^NNKz zmuTGtq`hk$2-(B^3VUBX_Wj&nlyC4o(uw>;QC-8PZ_s<@pYiSo@W7e%TjwA>pl+Tk z=>>`XJwfNIX0!DDX}{7IHy^*m3BTa>?-==;VAGU>Nx&8EiXmj5#J;2K|NQ*=JKmA} z&$w5WL&-lExSH;ve7CEz7YKI_IQ*OHFNhj}7o!m8@(*33bh{$%|CHW2{+hkV<#wfW z7Ukde{-Z$lOrGIjOnSp>S_TldiTJD|{P1_n37TIjW>>$Fd}iIn-Gt?#!`@Tih%L#56+Kdf`zkXK(7{V)&R~8s zai=912=*TzK8q73##{t*!Mr@bkHxjGi?Ug~oU|nl0T2A_xOV{I(4lu&IkJnm->Z1n zeuBxoC&o-)y|@4cV7+b~z~cJF`WYY$nBTYLSvfO}ZCTuYw5XfK``>$Jg4uw#)X6iu zVmw~4IPYmfL=^8M#2PVuBa>Wa*RI{%IojMlMJ8L;c`~d%>&om%r_Vs~+&c4d48^rL zzWi|XXeJx(AI9zA@#fH8)0)ZJ><4*qFHwW)kw5wx0O*Ie$OtF)`{oaFMO8#!5HHKrT%0xdbceRTZ|`8H+~ zVa

(UXeEQKw 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 z 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 literal 205696 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 )kDWdU}d+ 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%0DI#LIn?wxf0n zk^5ctk;~^4G?RZQ5-@!USe8eJjNJ2IPLwiCoCos$w zD)Tae2VmYy8qR%8a2hWoenZFr3@2q9I`yvtiZ%6|r;9caEsD)2pHKo!X>2{w#OhGA zMDq1BLIY5Gljh=(lk2~EBQ6HjnGks4h6m;m#KicQ7hk^pGn!5u6=l{VrJi61sUApQz}y z01NMLzn^5S15%}5g?B$i06m7c@yd~z;1bDSM$^GcI3=Yjg(0J0uaP(Uq&JmRkAu+E0*qF|8x(eLy_RRisTn*{$ zt!IKM+kioD8rD1f8~*I+DtWW;8+h;Ee=sv!2e>yrUn$wF2e*EbslEYY(6%|Z>QI;* zZIUFkPD@>diHClk&E}hcY~XA9*NopV{ww#1<_Bn;yXC#~^v&Y_FnzZ4P|? znv!^Mrx!e%((&Uf0J!zBx7ePFHL8EBE|#&61)uV6&vh8!LSpVaNB`QT~X7l;a37{2SqP^5K0Yv?Rq@g`_f^u*G>&roUY({%3_47 zH?Ut9{cel1yI*E|U=x6PoPRbg$e)WIFf&Ue=4zr>RA_`7$-U9Dwi(W!cKvYSfg+2z z@vG>jr#Q!lq&l2RSDRBp*aH9H^QGykj1TU`l#?^CZjEOJ`=06Typ2kU)Gkn8Zo%0N zuXN1({O2zQqbZ!3j9E;s&Q7&dqLb z6&zoWuX0>US2=9O?~@Rhh#UOdwIHjTyTnw3F0Zr=iZ(=|d4dw}rfxjKzp(p=N449d zcXvhJM59e8t-4&T{G&Sbpl{~%&dm(;=9L)4Gr=3D@m;GO0ABcWq9B9aJcvGU{Q4|s zstFA-ea61jQGsToD{1=U2`HQgr(7qcaO0SG>A#6M8vcyajdc{FvNU4GMIY-?Z%b!R zqOx+7wOoL1r@8=ru2WHLbp}Tr?j4T#r$F?%`N)5s1C6MB==b(^s~VJh#hrsRw-W6v zD5s1neuO$$%{LDlSfIMeCbRwTuj2(=vr>^twsW+dS5U%t10dqJAAbM3zptBs zI$G73u(F8UL>K#uEs`Io;(LcW)6u;Ys7Le19(z|lynL+T+YK5wd{fmv?^U8K>d1N0 z?q08mdMJpRa|CJNj~HVV`&UA0!aG@$gBIuuMR;ZitaJz}k;5kBvCKLvPXtJdb$9Q9bIjrCA6cS{;3s;yW=B-t_8R ze=f-sC?Get*k;%Ql2Os*wI?_6U(Gr_n+|OFk&Sg{yeU1p@k1xMOq2*O=5!DoGR%f$ zE7@B^Aq;46N2lWrHAOs!P?qB$Y9CxY37^%DB0@WzchhEB&*INuOEnSmJycNJiMR9y z34R*2TvV76!Sf8GSn|`j(R-u{H$~r&;wpqIhCOK;FiZFx#!LGFc5lcn{T{9aU;WN) zyS#k~uS<_bOQrdP{mewqM80+4d^IJ zsBe-k^G0M0jLk)BQ&)b1hf{@o-;*jqkL_dL&NKA*nb?NZtU^NkRdeLgoZb@X(#Z|7 z>FI%~lPYb|LtXINtHr@``9#qE+V*AZC4WFs3RI)DOyI}92>k&;6(Ci7L8HP^2rTeZ zgtF+of+9xRujAg?K`29gx=hjr+@dhLVo7fdv6;Kx2%Q$lzuLlMpj-v?w~sW& zj8blMoHO(^NF*3`y$|kRoH}&rvV; zfG28r=E&C`yiy<~+!TV)TQolD#G(eMB_0@+HM_(8J4VTKYc6myk}9W{Ee4RLn`@+J zor9l#rG#EI=7sw#)C&Kj=)C{Adfzx6lD%hEvNE$}o%4{>-!&^AKvftxXyLGUeD)C-$Nw&3C}6w8}ry+3jfpQ>H2r+suA4ZETuwQB{!zLU zp=I8$x?(Va`R&@hso)|3PEof5JTrK~p9|HCwOZ3i?TPiH;_GMZLdV;u4_;3q8;1`H zgbkLlsYiktBE1llmIyO$p3bkBFe;;;=g{{PT#s97uh)a^}$02y!M32r7)HfsoiO zN8@e<@J@D%;lZjDY;0_)KGH@&8WzJ+Yh?lR&u7&JwI+Z_FNK?g_R_#(G?dIuP7Yo& z=%L}k)qzY`=3CcWjxc9S>E{F<2Wks>^CNqofW=H!)4m_^z;V79SRsWlQ(HH$#rzYv z{Ixjsr0548=UW_-TzCoguZtB`%0$Al5wVs|?^{5Av+(X;s~XV7ni@YDSpg`DC~8Lg z^TCkRT%2%XCiHk9rTU~e7jO@V9?Qj7LGhlYHWk(a@G-rlpqMZd$b|ePk+({KBrFH* zyJw$($UCmTq^8nfaM}A;N@v=^TIVXShGGgJDDZBDYxm)G86DEHay}6L@T?}RdM|i0smOE8pKG+Xu^!yasSw-(rzdl40XPb@tuJqZGanS#pahafC=9C*b)3%L8QtBf8U!mOXA zaxCji=PzB- zA-*KPY_w5_nkGQ_+7usA@#Lw0>xDK1+nm04a{r_IWVBDF!+`28ls&w1T>|9^>T0U^ zt&I;9aEY3cc%T;VJd|=Kj>{pFw~;8vBCHT04TZ#0Non)5e0@f&nz1aAc5c5hRApT#nw z(|!>dG1c6tbf>*vbG9U|9jzdCzFrUgVkwi;Hm{7YrkGVrlT@QIH(EQg%%7q0hemHd zx4YrebFa&XHPz6fVD*1B5+>-ob(h0mqt$3jnU34V?JV?4P@+&%vL&9Eb9=Pl)XCoD zL+10~&j#qXaO1&1k4p4;jeWyf$xBq~bu4LjlM%YA8U2~8NFQ%Z>Y%D>(m+F*m^m4( z@==tLgnCsk70uVXuxi9-j`pf3)J`gE;k>Fd?APwdqPG9`UjMt5hO!HOugJI*gYMB@ z+I>?mgIYwMd6WHB6~Dso!K#|7jH*N%3TnJDL(^|sd&yDqXN&fmX#Dklm*Z|mbUgyGy_R|&FE+g-f7gQn-B;$0{a5!H&K8!M zGRkY9;ud1=4W#1ew~*$B^y`fH=?}mlQ(zk;Ty2%SyL|{ASC|ZH28yG4+CHqsd)%n) z+89zLaR@yHw=7ugYT*2qPGDaBACR0y_mx&$1-%sA^r69@2klL3jrvtUi|^)_^WvMo zfhGHs-Y=Wmp#Mm%KIbVt9=w@E_XzC6CN4F>F71=w>4IrJLhu37e4%(ptlk38blRL! z(%ysLcHS)T_Wgp7dYA^Qm<9owL2JirQ3)xH+L{yZwnNm9HNDE^A1FNcoDk&Bz+>)9 z8HG3UVcOy}HhglYlGex}&HWF9QJFfVWg`AK_YFCCbKJ#t7YDF&GzYk8p`k( zB~W`ivqet#4Uqc5<@z=@07fRo8u|Zs(y!p0w(xh11PjkqHv<1_fxDmOtu9IBfiuB; zBTr7gvnNuB=k4pd+pT*B_j0%I=h`9L*P??8i7Di&fYIs{GSi} zDv|y8-mojko7tT`$J79i1gFcty!M0T-{?%92lxWpt)Ku6=n5OSCJtQttwAXBOclLS z3*@aCA7QTb0%at2kL!!Pz*jlc#HijAI(H~njfvQEXzh8E#q@VXx(@kIl;*dgr2 z)&!5Dhpp zK^H;=F<7&t!XQ!S4Ge`09D9RQ0o{^gIYF}ojH7tNeoclS{3fkV-U=XrvUL9y6ja;+ z?x+#}ybX7Bk?eCqs-tQCzD1buJ9 z9%MbPzvWhk>@ScC3H)xtUQ!cmiw?CT$&C!tUUf8}mV`7l%yt4ZRAb>3Tph#u^s~(W zq^u%@%nOdXswaI_OB>#Id3#84&*wz7OS9Oytgli}Z?0km8P^%-b@!19VOG~9tMhO_ zM17fanh6km+;q*EWCQsm-xf7JXrYd_{-Npy4_IY77>P5x0iEyoRJ}QR3O;J=#S%qv zgF`>#dU+KA82|CjZRQFYFekwj_2{lSB$G9hOIMEs17_b;uB#m(he&JZ#mgk{w&adh zq8>GP8YLBzf0hNl@4gf({M{Rx>lSjhI-iDAewAM&iDbYc>7Cgapb1Bu3R}+}d4R(e zE{Zc1ad3IWwMmNk2zzmVm3j)Og83JV8iW=%p?5-*(BhpSaAx;`!Dd!6oHm+i(8$UJ z!1E6?$36VgGVvG@n!|kdWZH zADZzA6f(Za`L84f256k4UP|zSVZDnyH?vcKb?%_g?3)hwdCYNZ_u?E-SV5Lx+X>I{ zjUa=mS0cQ+97*lsPz(tDz5W}#Hw3?R9p{)BE`s`N9b7jFLV%6xp|G6JTkxs**tmDL z81@9~$Q1~0z$SvA6|xKoH1|Sz3IE+;aEYWV-g|urN@#wNXl|GT?^!J6Ej>tZ0lQM} z@+;D)kY7vbyBNW4EQI8BQcII2MuOH$8(^?2ma<(s1%&ww`;g zHu(7LHgafk73F^RvUj0W8ds^TKAd!`#$B|fPFO;D__x(RIXdb(_^*+s(?%cl(KCV4 zL~Z#7_^!<7XE|}TxcSSG!=RUWxV_T%Dm-5meJ|lJBJHDxK7UD*6fkLqYpT%PsGH>dWTp6V18>Ft0}Zml$DBY9Mh{pJ3h7EV-LclG>t zavI!qu%2QFVq}=kasSgtttCwn1bFed__==CJ8EZzf5H1|`hZ@h=LKDW|~ zysF_TFP>ZTxwYUy^U8HH#~Ro*6Y|&AuM2h$3?5AcPr!z;fn(a%axiat(iSeX0rWKe zY>LxmP}G5OF+Fr2_FZ!=d}P@QV)h)_FU(be(JfA~Q}l_4NXC3 zs`9?MlYF0n#Qox^#CNbu|E)Jlo&p~dc|Z9w(E~Js*!!c_e*lB+>s&GykHNjmW3^`C zpW&4zeShxoH1I3r%*EQn0dRp6*VV9XgoBSBtV|b&!F;x4vLRc4uri}%C^6~@HHhbF z9~jvH;&rKURhv?%swJt>loV2Q>x{r^DONY?b+mm;XkYuRF7z!Jvzj;ouY^le z74c@Pej- z=0>91EU@#^@@x+ECUT09@`?~~6eQLLAbg4ep4EF1RVtwXE|Fc^pWc^&)oBj*?tc;k zr!1FPG`$`}u}R7i3J)fD=Wz~4mx(%f_=8pPBfSb#bzS1}n2-gc115VW-^VZ~9?J&6 zu!YHR{^2b7b_$?2ZmaIc0`RMRSVc_SdC*T?#?oQkj|FVq=Lu9=#(Wfw==Z~R5c9vE z;zmiC;m4NgcmLkVLB+E8iR^$nY;Dr&({O?d^1I+6RB*JI~~RU4J>UU9Q4Z-BW`Ve%BAoW~)cK`XtMX&k}*D=eqpQqn{uuCK0#J zTzQS9e3y<@|MmuXQtr~WTUw9R-Ls7wB4LAzS^+Y=S%i@J-_yVL*EE5(tgNW>v?=UO zR(EgCiU0>vCw}_;bSQm3@71eYve38j>_@>y4M6Op)s7q(|#+3vYY} zZY6uCItbjrvp>Q&zjS55{KeH;MvoEz%=N|NsCpsu6RCfv(x##L)gwc-KL#+ujs4-N zG)-tZnZ@q zB#_n@1UR*fmcD=Q1mdSQ*EcC-fpb~*<_1vNTXVo#rj=hZ-HNPxp~N`R;bmkp25vH40Qa; zjHdEQ@R`e@vU%rNPdtU3La|%zpm6R^-VLM!Dy`q9pAY{4uDgzOA2ojlPXhlvkvC_> zV=g2a6DXbp=D+FRbZ8w1@>vq8tX=a^aTOdB^u=1h?f^40JW2&fC9^ci+ zq=vW#u_nE}paV*gmh@dlEeijzyMJ+r#0701>)UjVKgk~-94EqB6i>0?iCyNoit@*t z={ft~4O}Uo>)E%ihqzkF;g>e=^Ej_cyY^$Ri|AXit+-()6A1KXp(JG)6f4%@Ym$bf(*_q=xgA3Cz9_9E)d;8XB_5@vJulq1fM*oO$8P> z|4amL{<=tn1_GSG!=DRnFjqhU*Z&r|Gdk zbLJ-b*h&ge-~B+3;GB18uKjH`j&PPFz@K zGxml{2VUxWck5DL3r=ZB#3o|#8h_e77_4fPivNsl=!wwmz~f@f32j;0@hZ)W1)(Zc z_{tN6U1rW3FQBd`@>>f)!$S{`c7C?uBXcGG9=A`hErt|HnHTc$)x9v|S5!eL^=3ta zY_S9ScCXsp!?_x_i!eWSkIu&(vbBx}O%VLad}vCKxFy=|b&6$w-4yT7b<@1xT!l|Z z`z|^!r{PQ{MVdS7chSN7oj#5ZS~y`t`18?|eUU&)1k+kb8cxXfiwxXV$BP8Wqebn^ z(5`FDo`lbD;zaaCLhCsv{J{OOJ>{wpbm`^JrMhu@^ryZRdpze&yv zw}|Y^9;@L$zn@BA(UC^icyAlF(Q@M%vUUdr!DM*u1DD`g0dw4dqfkuRR{|x!Jx$12 zaSnZ9Y9I1kmmP0cAMkf0q(uo#m3%%)sH0**lYB;{GU&qE-Tk>Cdi;H__~Y4^-@yt+ z{mQ_XW5C>R>9uuP9u0^n`getb2iLCKU7c-Z^LOGW#z+>V*{uiP}qzvN!mdu12aw+>unT_r+$Cc?d3 zS%+Yspq6B)N*!FMzEI@AJ^@@lYS}|qCiJ-Z<_ag_Z?K$B`1k?SEHn+M`@lNX2YhfNQL{OvYe1@W<+}7#fd*!N2dwV{23lT)gB} zPW==P>D2I(ynh7A7{p71*DK*H?Sj@2Wh8K6znj!ZuMcexg$etaLZFwJ_EE!wR(QTB z?fB-M7K2+mtK4;zV zTmyba;tH-arNXOY4F9!^s6%*hX0coT8n9-Od8hPM11_%rjQ&@y2;>K@LAk z`k+Z8(B9azeOL7eQRJWI94_U9%l#I@9p%!1%RBghg3k#^-xB;uu&M>hn3SArl*OR( z=79Ii5(i+fNO`vOYNX)At+ z(OF3mUQl|Ago$pG{{6j;C9(KV)p%b+rV3glKYj^CzB4R7NbZTl_|@I+WlFq4nDpcS zdXUZ{T%)2h7KbL-TBnDn>y#J9II4dur6vUN;uSA=$(W0kSK0pTnf{EucjD%6y5fpm zi4i{?^&lMKzgnzmG#ihpl&rf@&Xgjb8iL5KcK0G5$gP~(9-V{po8!K2Zs)*8bK8MD zxgaF#o@eDxQv=Tr4khbFY(Z3EXKa@FHWpqRrDf^8ihLkyHg|gY0}ClgV3$hV#FW=N zUW4D4LE5aaTdL+Lf-@wOJU;ae^FK|c5hAmRbl8raV*O18*`6~JQ58zV;`}Y02Fpq8 zt3Zom!<|`#Z`5ivc6bc~1^2#GMv#GOMeD5MC*+{xN{On9;~Qk{{SPl=%gjGb5!yjUJR^6gN9f0;_eK3;YJ{RHeWD$#Xtf4!jjfaVpV zV6J;sL_{7u_@2dXlA#0rS8wE~_q&1@Qhonvo=yhi%nDj(D9%H#-aubcM;<6_XplNh zFAs)=z1U79A5iIczFX^h6bv$dE~z{$2kjjE;s~;pfP)&XSW~|y9Lujg!_4IfHZ0B? z(Un-iGSQ=+ZjT9QIjyM5#5@UPxoA0gqZiw2S<6bat$$|1cpnA4Y(FifC znz!QSwLl`xmB!*mBNRGsqS&&W3|?Ce5>-b01bOMY2g>(O?o#ejJ#ux>A>3yA2+SQjzgk5#UkZ(`#?jvY^|Arp)d1 z7g6=Ga2N_QdNM@jpkgW zjj){sU_NmwW|U+bqB8GhX1_6^eqqZBZz8!-??Gi#QA$hPmh;2Qgu0vPle`D7hM(J` zf?VI5op^K6B{6@?SKmLP(S?2rukTr*UhJiF8!I+A^%l{Kci*kiB)Yn)3tv(6Yw&4k zXK~_LCx~kI=n}zi5{=35@)A&yN%x6*K49I4nwb8@7PmWkwpK@wfj)nsNtEsxi6Ba zl+kbxk_VvP2JhrFB?5guC&jR)i#6>%Xy>E%X&PtVqd{xe#ybB_2DgICL>Q5Bk+xK>Sbp$+wf%G_3J7)sM;*d-}(AJwZbbnty)i4z7zQ6$+t z!Ke4Gyh&^>L&vl7{hNZ{qR+mx6l~4j#ffsyd)QnFN4@KwfA}qM4>umZNbFI16}`U1 zZeUb>;<0ak=+$|*4NvNBBTJ5E=(I*H7^rLM$d2U`{HuUFttu>{@HlovR|`6FH`Sx3|& zJ8^AMJrup8^-!??Wg$+HZuc=VI}aE2zHmzZjWK@QsM)!}7mSA9dbN1ZfdgIA=wjO6 z!SPf+u9#b-ZMbawFP$Bo0zBg0XKV9^p=d#|-09k#<`Iww%`?EfNzWig#)pTy$&g_=^%UA>@KS2jm znuy^^;WQ=vV($2Bk>0r%r9Al6d&;sqi=!Ei{auXC*IpI>C z?}j%=xN(aEgJt_is_2@Ch`>{46!!@euSwms#`%k0Q-2iJ$NhGh_B2A}(0gMdFDMSk zaEpi6XM%)y@qrs#UkWKSaY~mBPpT`DXpKFiH?s*Px|8wCJ|>(IFNxtaWk*O+&1+kc z+>&Z2u~8?PMkooMYC-Y*E;Ah-oAdJXRW>s8bC17W_0lYidUArDsJV# z!Kmmh9xnYBz^UDoslmDgE@AW+a-yezaa)fu)t5$Sbg6)5iZB-_yPv`JPwoPNA7pO* z8T$t6`IatTrK<%Oq(^*gZWO_QTjL`MeVM@NlU7-FN(9Wi(zl)ylnPT`sCnMis)TL1 zK}kU$qQDtOU-jKIOBfsc)hs6N0c?!)5sfT<1EYt?HKGDCK{63~FU_`1sH@P+u$=LLL3m?JHi8%71}V zoyG__OI`C*D$#(X$08HG3bf##UrQ~exep9xAgA<4^E1 zWUBuiN8Zr5M-FF-gV7@K!1Db+7^&J-W>#bXt1^n~G0_=CPOgf*OBd#_q@#lhtw;gr zVo6Tc+4UcG!Pg_~W7jy+-o8am#yNuZ628*<8~F)|>dVMEt$7~I!6yv{`YQW`S$K=hZx*{TH8%b*~-p6WO>9)KB(vfZ7 zamMnfHY8zy%V6z-79!awmnxdVgT3Z<|F$O1fxMu8L_FunhWx&sGBE$82pLhkpK?)# z1DiTWaNJUG4x{aM7`;L(hEzzI5HpM;kMqO0$aw(D2dcFg;+m7AF(ZoCsnSZU97BjQ8MxK(W~mfG^ zT&_f-Ie%yp^_5|cgtO@v05- z5&o*aHXCEEQw_TEUmLQU!;qJ7?k%#gpe8n{qJm5whs0`@24E47;tPq2A0cJ!JnkY{ zwOC<0@qd+>7!X zgoz`REOTfC4WjC3-a>=rizUZ=>b+3im_T+yFXRDwxC636JBj@>CN z>i$?pjOIF)uUMDRD)exwV}3v?%1hF?^}QWe&SDa`b_ea1p5<+bWM+-ohXi8D@IIfq0_v*ycqA1LV&b z8}lPWX20jrn6#usSI)uk|4StW*XP(f!UKEQCx~LoO87 z^b%kW28qB_h(iCBT^&rn(X7R?(FZl9tnE)dv2yXRWYd4oIsA(P2M zv2Z-;g!N-l1GP3d-U#z3!%vP|AOB@*fkctn{j9G>aDKhVvX3(W3|}@5;&Y1z52C_c z_~nkVA2JW-A6tk)TaD~f{pG44uD{7`iqH*OCB*%SqjQBl7CW5Vx&V}A-=cm>DghJu z&fn1d&IjCdSFP-CSc7CXq7-Aj1c(mO)h)HoL7aSp*d%NTyb!)_G}E;O9XIF+39D&Q zpXE?}R!)BO#$Ta^{{2Q+v-p*9y9feNM;&jkgpbhswZYQxtvSH>d%{ZY$q`WA?^wP5 z=ov^Vy8fjgt`Pn#I(%^3uLe}8at&s^9D<>(eI%znR^XfD!_Ni0kKxT!ioXKqGC;sH z8A!}i1c_JF@Au4fgE2g7a5>~Ns324&914kqmNeiUE>G#T86^!5;Z}! z7t$AqG~NS-yG=%ge`V2GpY}z2O+`HSm^t2^j~49`Bon?(Zi@fx{;Ia;?}Q8eT)*|} z=Ll#yfYzk4zktqZwIS1I|De``0mH5u5&YqH^p(s{H}T>NHp%%eyO4`Co8m&w4w%4J z?g?>xfQL0Zt%Wq_QJaNZB(}Q3C}D(p>>$}XcpLxETSj;jnm+tOeEwoQydk`pHP6h5 ztD5xQ`a{NmKNFf8h*lniUTs{pJB;6fgNv-3mUkYcps_PLI+?3|?BL^1-zL#V4~@`Zz}P z(XY;0k3CUK{G4IKTMBbBT#cRlO5b}~G~-R=CG(qS(eVbB6z@P~95Y&S%cU?y^^+(U zoR+si4{>Wv=6OZ@q%qz9F#(_*l9MNxTzY)^Fj618X@=jBuhB}$eubVNyL0?2upH(4 zO2N3RR)#KF-fUvNn1^0fW&eKeZz_6srb{A7QU7Fqw|SnZ7K{r1+?^?Fdx&2BC#}f( zBMjxJ1k3CZzUU*}AFJ`u1ZSa2

1IgQp+u*#Cd-b}#lJ4gY10kCa5kjvE@`f8+wi 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 BfrbD8 diff --git a/previews/PR1624/tutorials/out/solution_000030.vtu b/previews/PR1624/tutorials/out/solution_000030.vtu index 1056a82c4c87a6d4d54d40463de74a969eaa557f..d459fcdbb7cd02579363f37d4d62bddd2e2731e2 100644 GIT binary patch delta 12125 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 TL}7GcJ_4UaIrC9p delta 12123 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

*eoNp^% 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 fEy;zd+aX*<#Q)No%?K|yB6X=<^zxibdrQ%7u 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

}i~S=AB@lj8VX6Uf}P#B8sP@ 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


iY&SUcSSSwQf<*Y^l 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/R^xs?kFy023eWX2^$n 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≤P&nsg- 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 literal 205696 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 z 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 z zSJHaC7LY!WUNsBsqS<*ckOAfiCDPA#+yP!j`;{({3HJG^xQooTfn8FWeBJR6px@V* zkKX~l7CpIa`al-OH~m4GKXAWa{nMTEFrPBZyDNVY@(qn&*@i$n$TRHll>l7BepodY z+9yC?U2qoW3#OMho|J(0krR~nSOLCq`FXL664*QbBR_Eg^uKzT)3AYkuIDlywZgn* z?!C2BC8W1jweOvVbajtpc?9~GFHO>1hxGYV#!1_t9*$p6ALNJkC1Fub8rJ%-Zz@2! zuoL*?W)uIUufXRv1ky;-1CM4uc{hR`WXo+gZ;itJwO>~DCjmbd`F(iyCEPEk%a-dR z*jfJR@etlOc%NOTnH%bL>DV)--Ecn*pIfEPV8_LsbAgw@j{g`mB7Z~uyf#If$N^G4 za+qGl`E_IETcLdpz3+`40Q<(XajrXn_!s`M& z7TdN|!aOuGB3iK@_~dWLYOC+S6NRrGoLvEaIy-;h>OHVy>GIVE1a=CqYoVos`(|$+ z-m?YDV+lX~RUGQ2cU|mOE97SjbZdu0y2+=J)D4h6%k<}^9pE^R^#OfI&o!sAeA z<@a(u*vE12M+)A@`CqRhKYqW*PxmfB3+&xknq!y_=pDSA`3m&ksP4Lmd81MG#q0}! z*SGqss{qE1U0f{%T&X}PO9i5{aT;C*drMxim>w|iaJHfG?jAsYu? z@q;Y1G{bff+TYJ^U5FgqhrclIohJ0ZCjL$XdKhQXPbFNnK<|g^#qBj<*YRAw%`c!G zE?sgHu7&$~zKm2+gnF$pze@cGuBUmFV2XKTCeL%`D!8ut?+znYK;D9HQwxy))tl!B zALJitozvjHU7Rk7N$`BOJBtYO_X zFPkfgHTXGw8qA)K2mO!}I-Ws*{tIz(xE(LAALPOO_?E?;-aUZ97o-kjzp!L5{~-#n z^4&z*X~3U};bCo1?wgwYY3v8~?WvN>1nhXyLW9?(yk;0yF@HV3PPeuP>VI#YqOS(% z@7$+}CLuk{V`XD5F6XN(9bV@SQDw+vhkSX(Ge`07Uo{r9rtU!g!Rtp^F#rE{II)8j z&^d{%)EiK#JXOmE(7J@C9Q&JPS!ehlFx+onf`BYwiNqyVMZozaHXrO?1*!B(aa^G? z`)>*R(|GZ;In1MDK6HwFg!?gml9s{#DmKh5<1nDWbBA1JjP zOs58UJ$suFer^^M-xBb=p-4Au7~4@2@7{*}NQ{qi2QG*C0pdFVct1*s*r%|e%e-)T8-%87aCr)I-;Uw68!gis z#TaNN1%wRV@4U((Jf=vXfW+~F(c>f@FP&#Pjq{@;){uN_(T~K=Y~MM;%jJ|GyutZy zi>2}yvkmcwAMtyj--j?(>QqQ#%#GYYjqU1AYB+=C`?G(5fr9_gQzX27?*a?aOa1ti z@PVsUGrMqp!2-~IK<;xV2+nn#2I2#L!-AFMPZ+b1^!U^41Z`!{6CRZy&`!z|sq!Q| zPK%R<gmXY#*c4)5Pu+k+~jkBzEm=qsX_v z@{#n8b}$>RAHv7E07|YMB6h#r$3^5tZfGV*mr0}WTjAJ9y|C`srhfShjl0+UE)Wyer5_SKxI8;DHyBaAWYtsrbRcx(zF(-JaJ{`ddOJZU|VHxORh}!z$(d zO>7B8FI%2sw_r7H0N`QYjuVvdj3WL)cn*FJ4(T86))K!^dqQan`RUeb{fYivMZE@#tp{{Z%~Q=zl(AaSD(z{ixMb^1SsN*r8>e{pq96zj|zh;lY&->a(DOs$~t(A#z zI)|-j`hS3>$E%}pI_K$PV*lOuI_+4W|5On99jQu(>Td)x-8w-%YT$87Zre8XfGprR ztMLwaiW=X3zDeNUZBMn&CIgNfh?4Jzxc}E>wz?5;ao~w^DCl2`?7i>=@M1z)z&O;` z|M^vqs~|7hcroJg_svVDF#_6${l16mOaGwDAQo^(_h8{>KrhE%hp?T@;X^xd{hSU= zc(VYWEu1-WRHs|hS%pr0$Y)0>-^>9of9veVJZy*j;CgGwKf=8z zbPq5~wEL7dVA$AVr#|2nMY^Au*YqA!nb-zc{2)Re3piv$LERxBG0s(kSMmOhQLjBXPdX^_6RY4>a~g zs{q;tr*Po=$;RfzYyo_>;P&Bq zoxr&OxM;dDQ5G<`{^gft=qJL-)Rsq}-L)#E3k@J$Hdww^M>tX&hz;G-dziBxL<9o=mUoc^PE5Tui^3XFe4%c_dn%P z3o~3Fe^-0G{{X4xu57{ms9HhQ6W7PeRgRqZ(h}`ojq|y~;U_476EaakIN$8U;|+K| z_9S$`8p~^ne(UrCO4cqYuLpelSdVTB?Bri9>edDM>tQb)XTY8f<9Bd>C>O6(!t*=7 zgZKII_|AK=h8?d1T>f_9fFNM#vh_Rs9PWGM@!~dz!08Wk&%#11TtBCL9gnY6b34g) zuu~-~T?*Gf^l)}6ejf2E+^_Zko+{9!#`U(keJTOB*JFzmb^JV6ir;`khxL;uR-(8+ zRAfa3;qoMwo*ltH{@q%F^}8j9nJ~5+eQ(9jgOw|{4(IE#RcGS# zz0+$++{(#oA$(Il!F2-r^Ukni&vE%R8JvHy{)TK05_d;7g91Wk|e? zq=N0$kl!8jjKrnKrB)=Kdfx9NarVO~2PyBiaR(3_c#fjBBtL0Bo8&tyhLLhCdt-=f zUdBu24_ue@ha5PvL*brW8Gnf92d%r|=n5DWDgiZ;p=>2ehH1loM_Z z%?|RD5z2MXg`xRC7CTSLAIHrHGRGzg24R{6@*gh>hV7zUf1jBmx8lnn-`9|Wh6gBi zO8=WrP;H>3_W(P>dO82fJ%dG%N%4T8|Ku9nEFio8E7$E`I=LOBU;8KbVDmu^#O4D6 z=_Cl9k|2;hf@c4a7Ml%vxb-m-0K`uV%iI59%fE8}uebkSI=LM5{*T-KrHg3cf5312 zv$qM;VUT5gDVX}N9TNWK7vkoD{AN)K;$NF$8RbxL?%)04$Dt&>^q<{uNH>uUa5n_~ zXBYte|DoAG{m_5q-^bku@^k;C-~Olf`JW7f3;uv7|ID8Dudgihi;vrC%1{ zVFBq?|JqGMl_E<-QOdvlm{M-)zjB7ayI}p&f9>`ciy$)t%f#rv?F+#@KRF269A_r@ z`QYJ?vE#0iKt7^w=_ z2+EmI-bZPfQtG3jNvYp4JdFXp8kOS&;}R|tv`3V3RG;IX1@YAdcX;5Z^c30c7-igY z&NM+6hWXMTL*lpMH=b3*^4{MC@Caf3=Z>T~#ygo|a6?%44jzDlKtIm`o+$8no&}Pw z%!jD3oVuNX+(-QVCxUMyMxbHgJw!-9spqkncYxvm?uWB5dGH75mJ5` zTLQ7m*2a>gTNtqt%n+p5?XI$p+*iby(r+$Y;#I_P(o8BEhBDaAbXSMOwd4u*`= z2x9%d9trZ^=EYUYI+DG(HmP4xsT+wq`rj{~#Coy9HH{eEPK1EthWX7Fe$sA_uC9P9 zfq1B!OVaxse?w0LzU3T!T@BD>&nh$Kp+fuXVFN16pYGLpodaw(`E&*IhuOgiZ#+M2 zOnRb-vGZpQff2KjbvjPox&9$;jgEnbhY@8>2y zj4KW=Ph$Q2*z`DT&zOW-&lbQ#+eW6h1Gb(op~25X!fVA1^X4}zS__z0U86T(#OXF( zqcYeY8PQL67QC z^@o=U%hpD$0vHpv-@S_U&eEN)z{u!n&x5bO!}F{V%R`Z!5J}-VJyL^(HR%6;+-ESB z{9)HcfTp)Up27X+R)XsG6M$NF?%%Ne^z0nf*sj@?J=(->Z94Khdeaa;FDy?QhJvey z`)FPE$8t1n_iHTMw%&P(v0_*Sma1T0S}gB{@li#F1GYm!>cj}fUMW>@J@8&sOotcS zTf{2ag5{LyU4;L*rKpg7s#PXN@Maz2%Q|mx?XW-Yo)M`}9Zkg!tltBSh60SFchtX^WUFeCH-Ds zc#9v-pFPD(##Km%6uj66US%_^gwrF~7f3&|_74Kb2K%=%Pq!)p&YfoU#`A;p?TP$& zp2RUZJ&o;6kFPh!_Du>n%42)i3xpoRQThnBvwfa%3YTZ5$Pj{`%jFk7 zgnt{QMyBBOC+x-$F<^b7Npc=vC+Fa`ie)KTF;|Q=r9p&0PfvJ|=TJ1BM8-w)B`;#< z>IYs346v>;{*lzHvN2f;%gZmdusziJY2XN9+`9cbf%B!WP~E^d zw5#tY#;LFKoEXD)rf(8{8ljnXnv=RacjLXGuB;Oqadpe7J@dj@1HLqKLBY=e@3z`zb19=~KV~ldRSpoe-DEW8r?Loe%LCN3l4$T4b(`btPV@R3E@8Ing zPT!e31SJ|I7i9*PnvB|E+H`Dp2x^2~mgrdf0r>!|VlPGk#ovPjPhs*I)ol#?1hj z@h=}X{Sg^I6`a2G5AXiFu2X=L9`vt#%YWsQ<_CTCfBGey4v|+v%Fxi^%6DUZwaDwr zSkQ@gRp@!@j-_X_O(@@OzmCRb`0nxAwBYO4>(D`6gQoGr^+?!o>tvBpJyQ5q=5f=q z3H|K8dz+^Le&6@Wb5=5?4ynXD#2!D~hJHG(zsP-{1GTL4)vrF&j^wv)7C+_OhF2_%zkF~AExYP{T|L!}qT-J=R?zjJ&52TR zH#c-4CGkeb58k8bc(|+13R^$=`&Kr;cB~8iJ+)=cLK^(O@ZqgVde}$tV$0EHt(8us za(3II%v_-97nR6PCDh&~627aa z8qS#k`-@q9RXcB-Y(kPJr0iwQYS6ut>xBKnCF;Joel{>vSW~JDH9Mrrz7x;Wib+#Rpbe4-m;@A5E zU&NQA@*@MKT)nx7{paDb7S6QN!nGzwGPaeai{}!}tj~K2AZ${nmJIJeP(xy#KJnI4=pc-4SeewM$0)A{Gyx^`sy@ z-^E96sVPXa{zz%T_Y`!UMPhpEqZIV`z!^!7eW}RyZeneVUK+Z_`+iB}K`Q#m^;y`+ zJq0CIAK7GAkb*MZb8FZQ-XilT1>;P!WEA>9X!hBbRP;DBAf{~&&Vi@DR-7f6j?#Yl z46%%*p}R@)3zHIQXgxjqZ9C0W)Gw4UGR2XKKB`_xLx<9kc#m=j`kRUr?cS?q^QWRt z`fK;=^HPw$pjp5fIG0|3dfy$Di4>G>AA7p;NGiI^CF6bicM5W5Kees(K+vp7%C{`K^S4c!rdViLp2jWmK zo#&C;&tp)112eVVu2)E6wk6QnDFKz;FnD{{Bp%&c|MaEl!PiLjz3|lw^skV4{Fs`! zOC*Y?xmSN5+Li92MZnG7X~-wdV%}OP9o1e~P&sfY6MfZOdh?ko8wIxJ-_R>bLmH=4 zvbvhn;CDOPr;BLP(L!cOsd;WXQsX_nef!%Cl)1kvW35#ZvdTzkvusa-?{Dn8=M(z| zi90d$*yg@L+O!Kf7R^bBvF{QKv*IfxCX=ortQUnAWn0Bj_)C<)TOUy4^b+a(;b!S& zdI8`6u9K{di9`m{=Xiy;zC`PPl~b#~4@4i{ZW7Yl?1?xs^aE#u|0|X5vyig-k%gpe za(AAP$U$dP*VW#H?>OkbKKVw|rv&yLN~V3@QigV}Yi<&b%Rtu^KkVM`pNSq=Yx`t8 zhVOk2pFEQ1QiufauRWkrT!KXFrL~&gB_WafZr_?q-=aCYUF& zRc@6&A5qDuay8SxK!05sp8j_?44HimdQx@w6*4_})3oGq659HAYnYT~8rqaxMvoGt zQNhPu_a9Qrp?#cjea7z2=x9a0M`lql@|9IqdhhfKIiGB-_5y!c(Y?%(oL+|dNA|UT z*jRxW*d=b=fpd%Y-iS<&ORGlqj1z+DktL}9vEU1z?PZ8B%eJK`tQFsB4YaO3uCnv_I74 zv^lhAUE-_G*USZoLWJZJWY z5At=QiqiWp!d1J`WpkaIg%&+%Y$Y-zNTnT_yV*rPhwq+gpHn$1c&ZC+I1s?M+|q+m zR(`GJoa;q1oKkGG@LdwehyUeWhka=kydu4J%-v|joVO&qq!;ZB+<(^jdmlP8mi*_M za~JYlFYT_`(S^zmbNPMQ)Qtq@uN_5;UC3SZ;_a5UE;#p_*=8?yH!87|Q>t|8Mn;MI zr%U^~(b#;vD@}7Z>SMj8%bC=TmS22lkv8u^>ji1r-hS;tUpkdvEZ^-#`pH)u``-1U z;9s9TWj^(yvUY=(BQw3|-L;xh$Cy5}nRb7$T6#a6f1h@Bz-|E9MZ9>$(lCJD^!fb= z1Ur2NX;0E*_oMUXcFq>UgXq9wa)Yqm5K7rmx}~{e2%W175Ok>NLJvnn7cfr>>^aIS zJJ5|T{t`NIyr3JM8p{cKbOG$WQ0Y*V(2b}jjb$PZ_aMCoa>%rz2T2QEt(%JKK^&Xw zxFvh9<8=1MjZ(Ag>dRax+KtPQ!aucFWQ1us$?W zx6a&HzYmS4>1gk#7J-c(v4ni{QTAm&Y`GS9{*h*VGI3kCU_yChH)wN-i{pZLliKo#1JnfN>B?i%`)`5iB zqXS5HXs&hOdk4B%cgWHTez(WGa*of%6VBP-tCfG-+>Z89|9A`EmPT{|L3=&Fz_1i)^6jO@TqkeEsZP1kA>-V5jQ`{SRyStF6M|{oo z&Q5g6t=q26T(2blOx2UDY!g>BH zpMtJ8x1rrvtu>kInvi`^-KBVmdZem*$3uO(4t>7nZ`vW!fs`h{cv=BJwmC6k&Gw-g zF&x*@bQ`HhN-GT)-di=G2mEUO=}z!_-G=v7H3l7MyWY8P?_}GMh@kw-fVFwKQ;sC4=oz=TmZ28i*?}W_8jx9b@y_)0TI3ym%=P6L_}=y&pFN(TSFLsFVbdKJ0F$VYqr*ZA88 zl=?d5ZZw?#R`rHPizG^mPZ`W1G`qH}nQs74E*1@g@ps zZFXd*2@6Ggwmn&VEn15FX7?WdUQ~pdt5d78%nHyOz2b|$ba|*eEBlAiSPrs}Q4M`G zTY%J#96IEol!uxEre1An%tjXin#MK%W+Kn;A4A1sGm%qW(#;jHGpyp0^!l^usA=Iw zG3{mG!8aXQUVlnL&pJ$vj&LQRi*fP?E0W%zaM#wzo8zyM8DH)0u;@rsEc3ZnrXdV5 z(+k}=;r#-YzWsT8&s+$~+$#1cJoGto%T>?in|6WUkyf0zR%eB{f8S#mU3EsbLmU^G zzvsZZ|7P}3@oY4M#0v{GGmw`BoV>9y4W;b8M%(3^h9<^7mY1ewqMg|%18I6Q(D~g7 zcC^hIXw&{BgG4|09u&2)@WM2F=W6*XeGX3&a*5#9EDcIRCA3t>>KKyI^jK#Z_4O3g z`MB51K^6G5g7XOn=NG8mK2tzqHWKk(Q(tJFCbN$Z@BXz@%(9;O+bhb3X2Ruh$5 zQ=EZ}7;WacDXIR7c>q*J!uH-q6|76x8tJ)}3m#RK(;=ua|#51F4h+wy6{)poq~p zuTZDgh{fP%(ldo*BqM9pIMh- ze8O0_lQ{IlBk*{Nc>*fsPTKy3=M74Yc^{uqmxNR} zVg1iN8Qy!}))=`IjXosr%r2KnN9LQxsbcst(B(av)dMoG(16{eBW1^<(T!m)!K&|X zQ1Zje>vuM!qp|?Gx?0{;^i(e9^X~srk#=?G5tf2f#4%oaanG(a)V#ZG-p2>Vg?&=` zD9kT)7B25Cfaf{nT*u2mn~sWNxqRt`Qjut0#Gv3-nD;jRZPaUk?~B!Rol$W}KtE%n zbFW$_qK#|;k=7P(Q6$axrt1R9sNS2ueCw?=w3Qc8drf7bOXsdMZ`_`ZKFpPUP}>=S z%*0(kU%Z)!uKTOE*(IkTk8+V;|6}Mp+`0PVIF784U-r(PSqT~6d#;gH_6pe}T7Df>HRxCI>ve{HHDP>VjGP|5A0 ze0$sn@=U$wB8H|*t-21#wWIz)1ygcP~Tc>rmIW*2Jx-1{9rit0#;VY2PxbTox z;A=gBEC{#xb-Rwx$a9JEPukS~I1JO2}5k#BYAOOsy{)o*!CxsWabRlU#4GBGy- zHF@!CWm8Ln7+;xG1o0<=p2OeX_nMJ}^sDD&tLSCh#-i;0gA71AW^R5!hCU<@OOG1)|=(2%l@}j+baY%KSvQ%Qr`*BP&XIVtbfDcuFay-)l+5}qfq$e4d5!j_*1`6@Ha-huB46#J&$OVmkC`BW5M4Q&-o zq?A{+7U+I8p?@+*(}ji!K~DhTUR^Zd4&THHH?A&%rAGhitF|wMHd>d6Yx;D^SufQH z%Y>DteKEbiS6#*lrw!jEU}eKi3bu|PVkTRgEU6TKS^A#GB2v5U+x?E3Bn0&ss#_-r zHmgf`)8TW1YrP1w$r?RIEXu%^dQ}ViBEajMUdoN7-DtET%RPejFi1;&*LV)QaE|KJoE#O_zWlAQQk@2&wJp6roy~w*ykGyXIZ+y^aojjb!*&rP zi?f&p5kkoReV5PyPhRXK!au{cCW3_0qiHiN2!?4Amv50-AWQEz2#^10V>Yc7rG>Z} zvhkm;D2mR0pQvXt5kA#Y{gaoo6zWlJ*M|2ATe#rePU-jTLOSbXYaB7~eV`4TbZ zQKt~(>FS-akIsWRsNqmY5tHxikjIp#$dJVU%*mN!puCSmXQLY{9*-$&l*v5&v~=7pJc z1;1n$%EScQkob2spRiZ6&T~7XJ{W#~uPh`p2D?8qmf_!@jRf1zF2+xEU^LDu#AmIV zku=h`sqs#&Scc`)MP|mgh*zHAja;MLOO@y7iP~mpW5mrraVC9?23Rrp0ZE5@wfVN#$m0cVEFolIo zOP-ufB*~F|o;hnBdn-z61&x1TRP%`>de61tBwYbEJhp%=tGkLzd|JXLl$qoeZ>%F4 zwvy?`pbacRoML&zRt9_tu`R>@YephnU%Bn`Oe5z6rX><9Hn5$*6xVdCe+bEnpx}X{ z7+jm~!^mzhLjsl8e{olcf$bFgp11k{mPWQZ#@5XR3vygse2Fi?aI^DWt#0qIku1-b zH>8E&sr53v!%!OhBB7NL+MokHBT6f|X5Qe(<*=>f7lu%SPK4R-&=SzK+1#Wkb%t6| z^)FviU4;hCWaS&A(O`O4;ppC%6Od=*>a0G=MaWLtDNH+qz!gbe!RoEMz#)L;yi~gp z%;9($d1X@rY|*pc6!PN&#uMe4a~Uqcb*eO$ll%cx4}5u8dG0pkBA!n7z2*(CZ15Ay zu6cs@%(L6tQjZ};aN4z0nl$jEWn$4lGY?!}qej|U&0zW0tMgWG5@AY;Yi<0tKQt*# zvtpit!22t4n7zLvAnU*UGsoQrn1^)7&k}Be&UeGLrqgM#{;oNgP$>n{KaH!H@N!VA z&q)yN4Fn971e+|%C-D9&4V}>Md7w!2-uat8H{lu|J()kr3;0_A>EZW?fo>~J+cqXS zAo$`;o?GQ}xV`Ox==bMCH?>)+R+@59_v8Fos zX9mE^V}_l5xq6`cdo=4!Yb!7>j+tTT_y(mbXP@@ZEds5|Kibz}H6YqhIhIx%(2FZN z_W7w7fR$HYZGtxk$i6NAB{|~=9{yQdH4P1ij-t_4w=+ZGYL=1Tm6>v=J+_fqYV-mo zjj@rPyO#`Y+cPFUXi*Goa+{K<*rr7BRA>?7^9e_Xz!Gox-W z5e8VA+iP#CMS-Wx!9u1i??CwCfZju`YcOQut+**An?*P4tV zpD`11A;ba11IZn&s~y6lxOyLuoRJd^E_MZ?B12u9YWHDb4m)%3Pyv+abuBJE(+(3h z6Z815ynrOqQ)Qweg}}yluJ#RU3~0FRHe0Ih2(z9wKP2Bc53jDD6?*Ki3tktVAv)1< z3bMZ=@!~O;hI+5{I}#_fz|PIpgZfq@*g0!k#u2Rsza{eW9LS#slzyxKx^j5Iy_mb0 z)hHjhrNkK#FXRB8wt5{(Qv+b-e=e6F)q4oQh%9yG^5`dkjp5@C_BpL%6FffRiz@QDc;#)>~{uQMuB!BbP0em3kdf&2;Y zwt#b2k#Len{H;@y7>{|Rb|=w1Qgo}XTYyUm_HT<(P*uo4#_|dA!CEq~xxi#YTi=9; zN-oVr_wHd%(eu8JLe^kqU8j*#Q4Jns8Ou@e3d4|uHu*QneBiY%^$GH*Q}ATyTRVU6 z&xrbJ5ur-19*G;hra8wOi}~1&m%RP#iOldFayYy-LL3UAiS4Pc7!Z=Z@Gz+ydvnjy zPS8FP$)L@CE!BAs%Z^F@Z9a1w88J~i=Ug(2j177_X4@7Zk<9)5l`$z;X|;s^Fk3Kk zu;F^Zc<%xBIl#%=Z|E0>f3FpjQz%D1e4X%Y$SOgGNpnjTd>>#RblECx%OVh+sE5ck zdpg)Rjb`2O_=6cZySKKQzenDG>^u<2PeQPeo$l8~H?X%HUPa@vzL*c`=JFD`8pcD> z&aHNvfC#ijPJDQ(g1z$nS}>p{jclyW(1h#yBAXNo-o+#uSmP%FCHZUtWYbB>{g1N{ zQpIyvcDRmUlkKmXPb`ID_8QLY*YX{ZdE>MBomra4?~_({W$JMDs_6*`xr=uoRNQZr>Tn?^x zJBesrDk3|?CYqc=*9;2NH87-g&nuLN47uiP7I?+;kg$DAXok;}2%FimmuGrIf>hV! zs~(3BkhqKMi+1aR*s>GJLcrmCQyleeZ8br1q^D5DvE}(GY-2K1dys(#Vhy7U2{{QiIgbAK_tN` zX&_PlfC~9U%6ek!>NtV3=k*uj-1;UNmmeP4E=d)VTe%EXGe;V^)^WtpSnxlTty)HP9eNA#EX14pZpt1c>-IC{=UfK`If+I zZp`O5+)Ma5r1GtkV!Ej(jo<9aqA6nR#t@@IMT+pWbkUBHgFN9*&@L5ft;iehSwI`azd4&E8 z-CW$-ErbdIg=4ihK=_!pVQ$;g+oYbGY+tqhgFyYcuO?TlsEMO_C<>NT5iS>8?NZjy zBSdC(yST8;5m?5e47$vJG==<@@_8XzO4wxikRfootZ7hPDXi^dJK@(Xe&i#Q(=>oZ zZ;J|$V;ZxPcLM!)38rf{N$ycVDl)2^wSw*AzlJ61C#=)r9?y(f)_it9Sp~)whL^Rfyav~cEvf~)z zlW4`f|2cYd9quCZDe_fM7b=ij?q00^1<9Bb_mFh2#vSa4CQ^38un&>=Z(;m{!~`Ov z;F0fmvl(;iu15d3l_AoC(RE%c5t!(X{}1WbFPP2yz}UAA-3 ziLN^%q<|DG6t%5My*L3AYzx?jgK2;;N3ddNA_ug+FzE1v`8<&OQMVH%!2)-OL%3<* zGlH|Mv?JoQoG{8tqo-+00C1Dm2rrN+!B-L;ZJvK5!P8D{Ig%@9A&>npMe8YP;M2T4 zWbGvklOOS_D#~*J;l6~YuBFBxw0t2h?vxSS`_I6vg4_aJ-cS3_LDUsWl%6m8^~Mim z{7{$4WU!j(6lPaJmTiq5IiUpgil75}#=Yd0%&~_UU z6Fj=yV2J)Afwx8O6ir1OAkK-+RIi9{!_`=tE`3BB&b?z%jQuDJ3N^gXevIdUL8#dM z{oj)C@hO8ulJtvELHlOUc9sR`TJWOvpEiUQjD)n-*2}>9O52XfSp%R={>SeJ4h z{G;`(sbW4KgxcjTmYURoykOyOngATOr5k@5;g10~1GyiWH)_HYAMII^D9b=p#ehq3 zZY!K_oBC+LSPN6$G(Uaqp9ig&Vl}_NOb3!xWq(KPFeozxhNC09!P)H#z1PZnffn~Z z-CFn?(0cnjv+Ma*_-oeMz~;}ObZsM0CRxClnVIxX@j zKSMLsl-{w^TTpxU1u^c@0Yh3A$+lU?z?UiblyYnw*8YSH9U5!UVD?Apx2g^>d-i&P znn53MH4C_1+BylV<1e%-1vY>_9zB^0&i{aok<~}qXFq`Mv!c~_k}r_*UD3^NmaQs4e@*g>Q>y1Ag&o~ektY_`!@je^0xTmmw$rV7*I7(G6X2v zh=uBMbD@l|w{TSG0Gv)45OtHAfL?y-!zMSF@&D%YLN|5k@yiRGb>S-e@XE>Wh~(QY z0O|GjtoN3I^Cd*r!;TK8O3&p0Y-@mLiAC|w|JT~Bkc+JbYIKwtK>ASs~;W)rGqe%Ns7iopb?a$Zo=hVqF8{pir#p9(}4=qGK2bNjRK#EE=;yBGFaLcx|fAqugIr(xX%du`p|6v$}xgPMh)a3%dW%nHwBnqm%E}FYp z_!wsM7YQ3ByMsvEt8upJ&LB@upT4Fx0T9#nF>(y#0gvpO-suuAFd(dB8M+n%|7j_x z)6i)__LU1X>>RJ)w=4e?$P7v$bL)Ab;N`pE0=Lo$b*@OD-W{qn<7Eh+x_wSln*0b1 zw7>2LPnLtFkF+a!iIp&oP2>5Kw+~^j_P)akuFgMJU_QfqJ*lO`iTV&v;G1qv9L4EzkF1hm#r-ok;@`0O#239UmVaXLLGoT)FT1hz+XDA`L*6675_NmpC90S^x$%V`$39EV zMw|yKxPn;H6<_W#YQ*}c`Hswro3M0sf2y#n&ymltfY`N?8S-qlI2De5#|oc)75_H% z0coYPRA-QTk9<&kD&Cmijn%adIb^8_f$#D61(WY?A-Ufl_^1Z$VRzAHmD>S1$QK^` z6UD$Uq+UPuLA}={(4tjUVP~iYET0Ll4<*vV6!Q+waduj$*7V1Wri%^$*JYU-*Q=1k zn^F<_ZZ()--VsIc>oDYQ>&)6T`T%)j`mayCHWjlrlKgj0qZavbN6ja_u^LIgn}7;b zWn&HV7Xu>cB9O+rG)P)@5nan}?4Z3C)AbKlmi*d`9TqH=ir6$GDJR5ic#LZ>D?fBt3}Xh5 zrmh36tsP`3Ro13+dli$t{M{~$Fop<8cIm5(cOmBb-UI%8S(tk6TdgH(HH0ESIjp1G z68W6eKuP`B0@Gn)31_`(jJ(aCw%QwrMOp>aXIFFYVKu*{^xqfCA)Orj1-w(Lh%(?w zEgm<+(iTNlkw!OcZ_UgwH#!no3Zd2fe%l`NS`u1nD-}R`fO;vB!QzNJ?G0}uOiY@~zNcSxw0abHqB&L_`tMs4IVgT5ZwSkmRD)LPDjq#9Zz`lY#ydMXq4dHK8x9lJR~*?d~?u;nTeoBQ%z z{|QCRK?Rp{#4fi$~?Ev!mv_`(Su>n@{ z?1OmB1!LqX`qjy6^B2KNurOE{95r3i&s?|vPL8m)U!Jch62N*jBO5Xz6_8BtoRXiM6gd{Lj>%l9N7#Q5M$OzYp2T{1cvxqltgjAn&^`r zCHV0i5rW)C3=a=aV`qF1Utiy^$Fwpc(aLKqdRHAYqqjs%!>o`2|BwM1LIBdgVyPNr zVTO?T44K^^m%%&^4s^X8__5E!vD)=!o`|Vj(L94l1QJs!ZgyJA0Q)M^n^Vt z@W}?u|JBPv{QeXEbza09`7lCrUp@LJw$h{T=i}jpd|2Wh-U|%FDB@?I+UwjvcF&Ki zOIcfE*^hM|Gb)8*ir423qvf6;b@jU`*Tm~F=|H7VdFC^i>=J*9tLH0(bc8efY{{+cSI{xX0`AB{eF|8yPU|Bxo-_pb(g_Yewp&q022L?qq|N7{wrtB-`D($m_?{f?2ip$4buE%>ng(-XNBFX z>uhX*Zgm#PZDxW|2b^4gZ~evC?bI|gH$EU1B_MF<;R0ei;!X)xIG{&seB)I!0=(r& zej!Wc2a;}QZ^{-rjTIn1fXM0j zoPckp&_q*6vr^L(d^*!Q`!eGylv}LUIofdqz7x`>wqw_!_i_UqryOqSGH4GTnjT z%=d_12TRDq9ZG4Hc+ZGU_><3b)Jy-n-!yQk*u z{lr!{<0@H~=U)bXU7lO(dYupBl@@3!Cq_Vd(9bHjm@n|;JsXNQ9IwC&YuPKP)gZW1 zJo#Fc`!hHa$(o>4BE@@;GS|N-|AB_zPcKmCe1-fat>eNgqad!YmBw^#4}!v9?*+n$ z&@s>AMqPP&bf?C@J2{SvOV6qJbEA=`g3gef;K3~>1&37V zq;ZVuk;&8}29(j&B`3~`0wp3#y+(I}6c4Yq=boeG$C-Dvg6~DiqEsPzEL+?%=vTgz zbcP1hxa}IH(usi6_y?8KanlF^-H1C^+1M|DbFY0Q9PB9JCWPxE>Pd8H-GS``S_buF zzNp_uPqaQxI8)-CuWpK8>-LfujT6MLwii#G8&gB~`Sm5}aZOZ&Lu7?k_72W}&g8%C z5)-toiC(bQ_a-Xl$%PM?QJ|woCiFuO1W|t4a}lI>j(`>98E;6Q19|%jq1^;VbeZIm zbwB@kRPu#2TfNv>)YXBJf%_yUI>^_^+x)f>>c1p+;rV#_7)6Ou{5d|aL@~1}zx&Gg zK~mWDZc}NTQ;{;;wYl;LTcbg1yaGEZRkC%AXjgux)@2kgCCDSiU)fKA(?vy+t!IBTfzrc=!_ zREUY_u}CCA5!1Es8 zcs?D;qO1nW-FK%oQ4I^8;*e`f=tZ%KMc8x(@2K-(;7OIjj~Qs&lm7Y8lZoYuSNJSQ zyd`ZmJKPS4?n!%$JZ^$a3ZN5{4~5TD>eN5({e)+V);<(ROvAIZ@gk?p+ksCN3_f&f z0PQVP>7H2y@XxGZ(9g1cFmCXQju`y}oVx=ujjoSEB4){imBljH9;_`Y?(`Zwwq&~D zczq9QXHhxRdmVsTF3VgC)eW!|J-&}T?t|y3O8V8dyI|(Nw@>iGIUEXmW%$ktX(

lzXaYO*Yj$8lLqV5%kETn*n>BQE_wgPbijj3f%r3jRbVz#-09YT zb>PI`z}tyZIiMu+*06ZE51gc5)+($LgDWPolY*1_K;ZMkn5#FtA>Q4o64_b`HH90V zFjA%i&qt5BOgcSaB#p{FCy_vyxkS%x^mY&`^knpoycvW%k6o!9Y2#qI0EKO%VHt30 zZadzvONMrNhO~;Zm!LB%@7HW9WpH)jbeUhrv3@f2Qux9ya6I(RsqHT#1Jy<;4QhvS z(EW1S;nRfUxze}Wjsthtz@PO(@%>DCAb)7dnrg=j@uvE})GC)jb0#ZM=a4pF|J0Z! zmnj2nkEn7>RDWady@QgDi;BTA)oc%k@qPGIrR_(awL0{AHJt+w%>cdozQUP9P57`o zkK`_;92CobmArB{6KYMp*Lrdz8D@;-J>E0+0n(cJj%$BpARkG?&ooMRs7&W?XmgPR z)DwzzC*!F>Zsbz4pwTwgY;!BPgLWL@+l=7my*7tj-1yHq@QMhG7?A70uWVv9oZnxc zblygsc)gvvo~~k|Xp>oqcs;^9NmF5WO%`Y_M1M3OtYTN%;jM3lc{K7DTa0OaQ5rx4e8i*-n^*5Z ztN*6jix1>LN!TTOjanHXRT|sPFDnDxhmCx0b_#-JIR`N&-Z4ZuLUX0FqZcb7w{I>J zeu9KW2&+wPJw|}3Xqj4RIcDh|Qf{U>f(&x}zN2`fABiH~*QvN%jX8REUyodPig>0^ zs69TJg*@tHdNlNY3w!#v^K6mdXKW>9Gk0008F_s6(!|+YRalGvXuw24GbxtE#NmMfmfG^Loxy%;M*d?EGu^Ibcv zkgaQ@#LouFlo(wRPE0}`(kR9?hDKszr>)p2=}nL|4O&OPEIEYwaBW#H!wwsNB-7kH z9))CHdu1#?{RFw?A|!P8zdIO*x1$N0i4meUnNW3B$OVzBcT3@*7KR=3xr| z*k)K@B4YdDl}%8}18h+~&7L1xVebWJ_;YN!vD=|19!oy!!_=dcsD6Z$Aw7wL9WNgy zU~uP%X7*wxcKsB6M%{O1OvcUk-zQ85scR2Q)2=nfOn8mnzht|KWHr8Enu&-?E~E5Lr|#*hB2ev72A|8UH@F^R~n499j>lpsS(4>LUj3o+$;(rh6uWr$$1 zlPJqZ4W?~XUt}~sg7tNaS5`H@MG9t{aur)^u?pS`%}aPQLeBYH&faPk!;eB#Kd@5( zR;jpO_m`8gAo;Zni^_OB87?pPVpYo>_FG+wvRCp9}qgn7c)K{fh0_Gy>l0x!PL#u_wQ?LAZr_r z*R%GH{dY-OM~?^uCS7?T+M4?Z(YQb(zvw!Ssot%g+xP89F4&Q#%3CdCZkOIx`wZv- zk^vRm8yx%m%?|xgWeBrWCMNHeUBn6(sQ!?O@B^Kv-tu}EMIeh9Q6p#48PIWVPRost z4^r_^l7{q(f#q+fPO$n*!mKw{S*fDl&@V5!uDwkfa%|LQOP`d4yI;zxbL7>*p^WZx zvJPjMq3~sptSJr-`OJOMOqPe@n+sO^Qz&Rtom!am(18oz-_#<&5|Bq|B)O1B0!!ZY z)hjwiU^G#@Q_WcqR_jd;S}7U>;lY=Vul!|UL?ogY%pU^B49}nDH!=gk9QA9@1I(bE zXJP-uwlk0x(7Vs*9|Ik3YOR%~JqAd)=ffdhYxu20+2B;REBI_2${DHT0l$R|`d6+5 z!Q$&>QeVYdLI2{?O!ZMFd^p00$T2r)m~w$hu21DhpM~20)}~d`by6fnC!0DG_+p^QsjosWmg*D@OVVwuXi7S zkjv?RZf;{>=^CqRUC|pbzV`Y^)8#q*+}Fi^2g`wPGMc`{S}lO!G{L6|t~0=}`gFTe z>^pcVG3;-tTshRLbjkYdQUxjv1W0NxO@q(>kxP8EB*yEQ_*zB|-@(w7iBu2a6fj@n zviD534a6sMD?a}-2brwzM>{Nkg>)5Jrb^qRK!++sM~eFeR6Qre>U{kx95T##kb7YR zz@zKar_?CWWoDaL60YBX_@c`>>XB65uY%}yb>cyvgaZDW;%)S@nHXLXJ+e2?$%tR89i@w)E&q^j?<(4rS> zy$QuiXurpwTlQx1__>wq!=E+vapuKUVpnb}lqNT~bUNPWn8RYcDV!;UM@OlBJ`-z% zr{}G_HzR1H%d0IZ24mqUI80$B>^b2%Ma^xOjE&Iz(Zlwe*_vnozxGAmcg}dN()oYe zxD~3@mO(<(V~fgMVRB?1)yAEd{;Rn7+zpr3R*Wu=zm8H8OLC7I+(Wn8I?710uA;*w zk=)#~dgxD$2~I@C3%z$SYl1*ziy!$%dD4s~<73WKPTrTE;0q479$W~$hOT5&@}9r< z0DtwJ%iLDI691;xrC9h3I$XLfJ(ewxX8qUg6f`D^I_T%#w<+MjZ(MnL)aoFDH+klqnR=&y&qk-V zXc1}R4vIx3{)+r)cGV1;Ric0jtpwgYyUvdO__eVkGj56M-a7d;Dn<_-FuGyA9;%D4 zh-d1x+Nt6{TF-L-jo?SmWNaj{AOB~yqke-#Ml!mKn(Bln2ce{rXXS~WY2#^kC3qFJ zE%3n06=kmFIcP?pm7pt60h(l;^LO}F8tRg7=vUq6fNptb`gzwl;vG#^uGiYm;(z>i zY&st>;~ST5U1ELv3k=y`pZl%401Uk!3QX^f0CoTP!d8qO4Xt4P7opCG=g4rgyb+|r zd!CPw3aCwk4a?g1Px}Tz<+Z9vowK6oiwBDl$ag7}+e`B3(c%#pe0z@b(EKl4tyvV= zB^iX|61$9S7FThSq*aMbc4fR|$zi)53ZZ#432v4NT~NUB-Umj>m1Cbk)_6_U1y7Z5 z4fB_Dz*mT?HTQLmE#dyZ6)&>+3Ne@_X_i zrX27a7u;s>?}q0V%z_`mYi-amCA)Go zFc!v)rNs-`B?Bet?Xn&2Xc+G*l#w-P2E_%DS5DNQL5g<0yw&s@sN4DH`#K>Wy1KnJ zdTNvner6A;CPY1jUN<+to;{N^GUFQa4r^*9d(KMYX>N>1AtcLu{rZ(a7?@)ZzsT{!5FQRJKkGl^3rmVa)i1az0$!Q^`VzO( z!1rI0n3^>)r2Z!3>teButc~76Syei*8M9Lpl$TUsu}Oe*q3Im<&Oy?Mo1X|=V=A*( z&D+J&=;`XiY1a@<&Unc$Q5xXG)j7veCMH&gwO08+;C7n8qSnG&IebWyE{6I4c}~k(O>-ut0nFcN408^B{Gd$ z{txr85T&S#jXyFlb0%%o>zq3XqwqOZ!CwQ&Rj=avCr6vGe{(mHP30;iFWtnjFfY*X*v ziU`|abT#6O4f4Slub+~qB5N%&$fT?2c=|h1OQFB{_~M&y_| zw&j1cWB14skv4K~?Avs<9vOO zJKhY$izajQ1(5(9x|8t`E+Off$YxFeDGVfpIGdy5pkPJUA#KDK1U?|LcjFvLY0wmkIq3me)*0rQdlZ0ho&w9Yk8)7ULlJH(s{yY5 z8$ADd9H9d;+|zCr4$Lf1*zaa&firh*-#FZ&gx+u86z-;i z<(E4ofBeFKNX8FHSX)mDwj{xiJ7GJOoX?=^u@s}lu0kEbgUzss`ND&;f=r@1NsX_3}lNP5@CSu-Dfx1FiYlf_Mn);EhJS_|wZLaF&(n4b`>3FgD5ONv(1hOz2gAoOf#; zT&jDwE-tH_oauwElX*J{UTYHZ|*DrKf9FePc8>gE=-t+ zAzBaxPc%#$eyzcxmK%~UuT!DA;a?RR=Be@F;s>j%4D`o6JvTfDud$&ftYVWJ{i^se zWtu+<@S?!1y1DZ@Dkf!g=vcUCECh0NCCn~eloGSa^ADn$oZAlZc#O_nHga~-2T(H(qFyzI8jOgO$E z8F$&@xh^_FdH>$U5HsAo@_}HYiYw}o8}#60cr?DNczIm5!WQT95SjT(sfqt|OX3!t z6-5oRZLO=0%uu_3Mi(O5ypP|xU3z~8AK*!)u{o(Kws`LqF)oed%jkudAtYT9`sgFO zPZ5){+PKBlih(A=Yy8#2v%4u|hPb8QN!3ucTlnaNi{-To-e^(}I+=azEgrMc6kI{n zimyJ-X8&#$f}c$2U8!XDMW@0o+IZLsaXGr_v0FXuc%(^%-p5xsuB7^$u72w&uAng; zLHn@;^$iPidUP7Y7k}zHyyF{Ld$TAKU66qe0>Ry2;ykqRFIkdtR0=97 zY^_o|>4+BLK~1LP<~WlWeW!1EIeOQ7gX5;wOVnZK8+%E8AxeFPH6?d7675w<7tkS8wwio#7v|6Z+VRw*0twfzPfJRsZKsYDLQP(_n*gm6>>J*%Ra0uAonj^9Q3}^ zbMiO%*h^DRqoRo_b;Ra46j|YnasT<>DrG`XS(RMK_{fhYY};x?EC9TcX-%EZ^D&yk zrA#^hKnHEs9{C|kY>yW`ieyK~&CxniHztW;74))_V2aC+=V*d(`oO)v3FtZA0UpX} zFMOd*E;4Sg88T$0YCY?7MxTk$oFs0kKxL?pi=>Wwd@BC4OkyK^UIf!N;c~F zw~nX}E=>&hUH$pyidtrL)@O58q=OQdSqq8%*#8R(`CVQYxvGZxyXy1@+5-GfrsSVR zM{;~%6@hcSLiH!K2n5?t5xo&6|?E{JFQWVu#-&wiVgW~EeZh?cna6`Ca4V;whS+W`#f_cpP zm(P41gpcfaZJRFgp_>-sRv&^-;WPoH5~#UR_Q>lh9xnNcm24| z?U!cP%MN&on!_*1vL4h34b)b|K8HX1g12tmc7keynLjxf8ljfyj9>oD4BUeXGqgrE z;DoZyyMpRuz+OC4tNX7Oj+U$ZOfj&6uLrp4EM-i9`@>JVWRooLRvKrU`7Q$_axdT` z`XK=-_MMrduZO_X5ksxCw{F0yVfMexPWqsdV9=4QrK&o3hS8+LE$cQoN8$cDO~o6yjSevt)8B!_GhrU| zJ}!W%IQL}pyae!n-f|;JaSf~2(!m3N&0;>(Iku?^a|ny_r{l8M5p0>$#+CFFFU)ag z7TliV25$j{fXK7&m?&q}8i`py_EWoZNvHc4VlOo#BO7A?J)#CS3$-QSXp-XP*b7X6 z?cvkHzA`d6Jgo6#>u?#95|?=JW=5$b#a%1S{ zEq7MiFa|Oz8nT66q|H17vHLTNg}SG1#VXBVx?X)b8P{5o!C|Mv=XOsJ$}7P~0_64B zS(O26RkJB%T^b555;KFqXHVV8I{FdA^F1x|kH;|`V!P#RuNh>FZ*ukD?i{wttQ0dW zN)MGM zdr}@0sen-v6*qxiAEjWOo(x=*j&KV+YY2&QB=0OFT>+;!XxsM&Yk=!DhVT3{;lQGh zC4YX;2R8cY%)Iz{2YkP@xN%qJ2?&V1(*3lm2!8Qjy|5zp1jK2}2k%g)!p^R67T5n7 zI`2m=yD*GrWmGcDNXW`262&?8%$BTdWyWhol*o!?6*98--t&8o87V?UT4qX_At`#l z|G@Lp^E~I=_w~81i^!7%cT-lg2iKy>6xDlI?r+EfWCmZy&~>Xq`J0gBBhd#yfe=y z8t#(8;2R7B(ai1On7S+(ZC?ZW``gJ;U91UEg!J#M-F*d=iSnik_XeQ0r*w=r=mhAa zp~HRu=jdQs<XPM7+21vcyJDG8u$Q_Uj z4f(p$#;*NzS2fc%XK8M`1f612{(35pJ+UmVh$hs9CD zf6UBII6~0|cZvc3e5iWZRZ>V@1BZ1#d6~?hhBYMfW8ChkVtDf7#XpXBp!~-Qo_g~J ze8aLQ6?`+r{&M9NFZ=v(xkr!EC}{-DWPDI7NmGNZCEUrxDtqv3woycZ^c~DQu&8{S z^9FqD&QZ?n;tewcz80}O>%_D_r^CLiH(ip8QV6z81KUp$sWql5tb$zk zKYa>6F$iCXS1~&%{Y!@8-OPkyd>$+cCCA@wC882%4&)@5ZTwOD3mNVV(+BcJ$ z&#V}d`tUlCyd}UkGmBz6g%>dK+MniWj()ggxwHI8yBo$Gtkz4>VYur(^)C4ff|>Wf zQp=}SK{1tAgoWlTsB}p5p$YMRDjY$6%eu}5+iMINkY!my*Bj$h@3R}=5M>PUY%YNg zJ{z;P&u+s(6%l!;tCe)NQ`?XadFKg|0>zbKy12M3C0**+iohiD#E{d=qj2AWrcj|~%b zg;QxCSG5a%qm;it&U%}jfE*W|=8MfyVS-MJa*O;7%BQcNyZAy8Z>g&3jHg_{ANNXg z(mygo<0ZFHZM}Iw)u3X*=tYZ_gx>fRO{+k`u&6ppc|qJUA7lN7oEaB&MGG5a$rC)cq7u`1|jgA!ErjVSQ229U}Wz?3c&V_}uP45?> z>wI+TlUw&dX{#7#iKrQPA}3xIUT%xH@Xc2Pu@2zBU*fNiDQ2N)`FlbYEUAcN;Dw5& z{D0uVaQC=zuoy~_Fw%ZwcOA`gw)|=??FAYnGVd;vJ_1L(Je=JWRo{))X1Pjlfqz+}*gU<@|zCX_-q9Q*Nqx3yn!2U?HqyJ9?U}6~1^HUl@ zxf%DnGn@+mZ720G)#(Ssy~|qt;rw`X&`#tJ|O9G1hc21s*xrD<77(4m^_c5BD;=zU_`c@GU|pt$K0hf0INSbWh) zU!g8wskqkh%p9#)GD9bWLESmdxi1BmE|-9u^d~jZetjt6ME3~-iyv5hnS17vY$j08zc*r2m4+%u zivuoc=K-aXb9_^k%_wj2t5vDaOYoHT;=82SOyEeByQU|biK?WSe6ISG0{U=ry6<)` z&^6j-I;Qu;dtxlQtZNww#2;O*6H|!<|7j<9wG1Sp|D3nk*-UCtlwgZk!;4=)^t$_a zcl2ZM(BI5z^hOmR9p~?-m+L}5Q%_I%^}h#i7q9&ZGdK#Hn|2?KHBEq?C|$iV=SiUR zDWUCr%?~uq9_Eb3DBwo7^{bL8Y1k(hpgzpI0E!$N6GD{-5WSPd<~mImn9GVbcA&2S zhd%wGc0bDxcL-E$CnINof}!P9io+1_VoTrGzVsCtwpx|dT2Vl@eBaDgMjq&EKN(`x z_!AsrJ}&*O{Ts46H{eVf_!$%yM5!j(vB0df9GQZ45lrcP@aIz#J(OvBiLLdSa9l6B zZGI~UbhR$dGvZ^#3$3p2Ggfu6{?XCbbxY^r-rq*f(|Z@OyR5^AYOxX=oSt_%8MBT0 zV^1n(ir>T9ITzxV$b@0{BugUIO<`>P?2ZG8+IjdT%xLt)ye95tx@R7`?Ty)He2GnO zBJkK)Kf_MDG&X-Y7ES4+44Z@>Np_W6;0KSiUwpE(#bMm~e1VeydMy5-4xUrT7vy(m z;KQr1WR>Fg7b$;y*XEP8SFt^`qrH5EOjiL`UyowElW-0fH(b^HpkxB4x7Kv!dqeS2 z(?JFfk{D>Bd+7)rT_7Gz@H9U4pBO)e;J2;9?Awj7 zOny6X&M^l*c1iS_`Vj#aRYIB0d`3{if^?z4keF9bSxVcK+y-?iirkMpErUgInmfA9 z>5$IkWlD(&f{yApU($$n!tp)@H#=g!_50^qrSsqG;Svw|zRp1@yxgWFxj%$pm10z{ ztR9B>QIQ#YCpw{TiCM_Wfo2$=Me*Gxrxr3PjTtlA_&`c&k71cuC(LUXcf0hc8Gcg3 zQNAx@07v^HtInR5hOeoPT~X7Cf;$X%D5xYwu{)oW-5t|wxG%yyZu~lNuX~59tfh(% zKFnR4JM$(3a(8qzzbp=dqc(=eZ;?CU82YDG45L~wY}!bu$w(Kr1=CKlTa`hYAF=^r z8mW*tFtdLdb;N~o67Si)jd3!8FnRKj9Sr9~_xFNpq5jrX4v$g+oc3v0v3jly(JtXq1&Nl3&FUT1xdTK55c~XT&a_8lsWML*<%W z)ZT26DuBnEeMbQHd-NThB$z|V1#c-1YkMfIV$*b5_7e6B@jA*IDUL_pj|%V&U4ojN zpR%rNQ(-bT`Qf9aJ4ok2vc}nikDy%dYns;{MtR47lQaG${x1dkKNtv7VP@AtuH&q8 zNNu_-j8SD0*p{=<1#l0bi8J|+bbU(E-pkR@$y3yLYoOpf$1^f4%r_q*ojDJ}-pp>9 z`WB&?w=C-#v+q!FmHK8&un_DB8Xk|*IfM_)7Z*EBHjq+1v51Cg10;WTv^qvQgB(lC zSJ#A;Ad4E$mQ@)OtTVrGWcwH$&R61UY4~;kDw8HIo#31Wl0qX4*V$g6=*H4mlC*Nr zDD&UHzT1J|GL2qTnNkc|FeHRe?8SlVds-%4-cL}-N5PoiO;v!??d})*KOt!T)U|a< zaToNSvhELURuow8S`#Zi`~m$m%lM@1RSc{Ie#T$iP6y{%Z(pVQF9YQ)WvJ>`C4t=! zubvzBE+H9`s@?pd*JwMFFQl8k38)S%kkkn0pvj65w00^5#WFQg&g{Jcc3mFeAR?FjD*T{8j^sAS}@6}C^PW(r+Eh=TtU7^wx7om zbb*h_$oZWCRs?^2Bl!{&1JsOyn>e&ok)lY&h_i$SGF^LZIXxv&!`I5_ zXP=*f5yK1jN!)!v&gf%3adCUJJzl?MrC<#FcEz*)lF0zq5BD&yXdHT!{AS4SS2*Z8 z$FP1(P#Fc2J8*x9)I!4_Brh3rn*-lICW@BP7No#^^7=Bf2(WEoI(p~#Enw7}lm!jF zk(AJz=hDk2fc57Kw@^nCP&57Ej#O!hLf164=ggTc0*5+%dza=ZuzLFKdJVfhpsf7* z&qIqIFlyAQf1Kk$2YEcfuXOpqs5H-aRo6@C_eXhww6iL}uiZiY8#fQIFu(G_{UIqj z@n|<<6w-mbpKm#WrBu*~fMBOzu0cRPc%>(ZT@uiD6+FLD#{+(SCA(1&FM|qX&o&`d zW5DcoA^&Sm1URuaTeX#S0jwy#nAU!HpwK(Qyh(cDJQ8$qy3iBm062c$is|L@1k^0b zNrfG?KaPOCn+Sw{Q$poY zc}Cx~D8W|7RF+7V7YaY^=uk~v2b#HpYHRF+!T8DWfk8SiG{3^x{Vl)=6gV?E|K&&k z`}SM*b=PB&^P6wON-VM9%GeMC&W%SDT0dm-#nQlvP0pa{i>3;WzX#DlA2asK183|JeJHD-T#ylvrx}zXwy_Sxa}t zf1rpLBPEL}CZs-#v@T=V_m|X(+-j#>3lclGgCc)fYOPV$9J0#YWDT;CV#!du>R3 zWy3{1+0G3W#xQ!kmo;O>7WdB`+*Z0S1xubKAMhWM#h zp-=DOGRN1#>s$GBneTfz!PD}a5C9})PvnWDB(X&lVr_-6h?ksnXL zOt?1IX9ok~<%5rVdtq_a@z3Q}_u&`S3=Zznc<5$ur0dq?W$b)zjx1i=1Q*%QJk8fM zhW5wqSKYqqge5M~nNoT+Vp_ex$KM8xaC@h2w+HaV$C(Fp*sOz;LGvljY0!j(BxoC5wz^__6M0F_r@IqV zUR@Xe{-7Oi8jL;scfA`k_R5l^+^@v~S23I1b_X^k)B9U1)sE?DXMwz2J1*JY*@bol zyccihtufz;PcXzOWRthxPu6j!uirFb?XS`Lwhlm3IQ;gp(4K_iB zFWa(Y*ARTbzwGaQ2Ej9WBT_ld2%gRMJn$pl<91d&u6_8^0q5&V&chS}w4Y<4(Ya25 zE~*^f^V#k2@O|3qjJ`G~S?~7EOsoy=Zk8ziAm-=p6~0!_ifeO$j}Yll}ty)et`a0@m)L%5tS z+I2s(3CfEU8s-&O!bIDfVw<6n@Ht^?qsYJ?(~bV{j<&vm+4bCaD?fL@#pfSb=MP2%+izv8`}o^a-EVYofk9$RM6J z8V>{gJoy$kq%oCkh!#y!0~EMnKDNZr48^*y->SG!0}rP@Pn&)F1nN}3J8OL14|eO; zc;;xB!&lQacgC(=gCahQ3#O5>Sca06&aRmU6Oz{z`XF%+*VeMXeB1^1zq(4*_4+D2 z)BP(|q8h-&*rP1n0?K$hxKE^5kO8WsDHn7N+{T5X%%rXs*7%S}+Ks3jBPb9>;vUJ* zi~Y(+`y=cWaoEXy6W1jroEOMgoSW@|(}z=eM`D-I@m~hL7LT>y-y(je(H$9VtNzR1 zOWPk-(WU(MU(m>@nT>#&%8niA?H zO1!5Qr^NkH3AxwUeglgmFT93twSv1c;RTtDXW(+b`el(tKByl@e_w8CA8mf-QPd3l zgqnIo;)c`rfTq@}uKyopd}OzFOhsiKF_U`>sP!|z0`9)w-eVM)=F}}ukTQnG%eV9p}}9RL;6*VBw>2bU%@L;XEEbu z#EZzbf2hSyMO@1F2&9LQ@CT!xAHb{g<$7GA&`y+FLz!% zbS)6YXOG_g7rX=}z85K$vD6^4g+aTU^VR6J*oi}NX$0`rQ1bhbE-g;0@BT(fmjIq6 zRZIV*ngkE7I-R}qXau>kl%>{qR04@*8`|1=GOTTwrYN$wjuajaR-8_p0;vWnX*N5O+0|=+TerRc>L!r+i z_G&_i`B5)^KjTv~1V5h!Oqu-h1*>vn@wbjkgCByC-Kkjx~3 zsLGQoS2{gGroWFJ4HgHZEH}@xQwbw0ip+a)w}e4tw~j;0`7>z4BmTkcrUNK`NPmao zg(#Sjl=;o*&yQFL%&h?v+(2dS3EP(j3BX5KzBcnm9yooJ)m~MM2Fx{ASo78r(cVW7 z^201Sz_%@Tx3IJgsnMpq76@)Y3yU6F>YPzPl1%v7ymBlGc8!vXNKOUk&YU))9jQlO zhD8^j?B)aVHeSAt2jN8hKY#TaTL|j6d48D5CK~K?1sU^46{5vMvZscGp96tKJsYeO z3LdW87qtBhMA}JB++`oa!K}07w-YcQg>#$UMk~GG-np622{HcQdODYzj)p(FbC&g; z;eI%v_KM0nvRH&16&)D3Mmm8&YppB$>1V+FFx&fY-V-1@s!qdcX@R)GKa##q{R=1! zjvRV?P6&Gc;^3~mKL{GK)TP6&bpX44N2AD~H>mY5?T3l&AK+UhVOZIo2bSFE9(kuR z2{bbes_8_#5ckvxI+3s@pe1WwL2Eh$R%EK3-0Yc%x=&wHjN&Me^QZ|q71E4S+n9&? z3iH6$TxPlf?Hk~7I1NGjHuLF^nvBf?V6DMIG{EdzZ@&kgJif|e%TKE0F>f) zKE9e=23l+QoWaOhxE0j3l`bZVX_Y_Re=I5mg@QM(o2=8oSamA9%c*{N$78DG)jB_H zQCgkiV-ds}$^%SFbmw5JUu59G8CmQZK@*-W<%Cx%MdiX(x#4jg(OVIU-1x#Om2I1W z2&@^Fl~T!4#e~6o`Z2yr_*wCzqSyNra49A#S<#aYKh=As$7{t2z1}>(|JL&YuI|@A zXucwW5u^_6v(s zH*r&}uvdD2Ej}a^QB_2!!ETl(!?;c};cd-~U-B;Yu+%D?vU%bjR+Q_rG&U*2&lrV; z%?upaH^S7YLpE)n1 z29D3%zH7Je1m602{@#L?H;ljJCGpj?7Ba8YeMl{>hdnb|#Re(WFwC1w`{Q03{LswI zW7~WWYJQa4*i0yd`P6TgEUuSAFcQJ-8c)>WX3h}A71LlUYp$i(BB{M#Yw}5ze|L#hTnrt{)&gr`#C_Z>g=;!dTKbo zWGaOA@M*YH7ic6fA`0uo+4g8+eW3yKD;4L%SKxN<%ZC{fN?6vP67JKTf-1ACks`A~ zFhuRgR%R#-bo~5#l+9WkdoMP2Zz*>IbDs*8Q7sB6lP0;m!a;^>r>f~?H$ zg;JwQ;nrBU($Kvr6!_GA*8r%NJ)J0@eXihEiq3Pe*tR#8pbS6QsFRv(zFi0 zZ-^w=x=WUH8t7hf2MVwcC8?BkNl>&Q*+;wuhmMfrbEH$@1=Zh?Gi%y|O2)U~U!r(y z*GmE-{m%cm|7QpKRTBGmjBW|lUkUP7ZC^msl1AK%U0vX--}w`s>~<(jte-P3uN56E zSeh2R>jsjA4?NaHrqP{Tfu-!ST#!#+v*#jP048QiV&&ZG(UhjtTgQnkBIj`{?0vv{ z#FqAO|F&%@m?&&)?O4tMwY@mq#kB#oPN%ANzHLBKf#t%qIu!sb|3{+u!Wz+Bo-fa9qm7 zf@`TA*{@gX@q+u{+PZm-=KI^AELZM|XYy^-`04NE9~KTkxc=Xr4wGhda1yK>M0p`0 zZyVvAkUL=Dd3o2$A77+M${IAH%?|_;|5M(((1KiyyW}n+TV$T9BdGr44j^=qd#=9l zM_oUgZ#I8c29q)$raf4N!52&aEUsmKls9!UYa*B*tWixFcDjj##S|AA{4;QPMv2foD|3=dGym;GGgXlMaA1k5{FSN z(YCmCl@1tJHeEbzB7*7?3YK-n%s?lPm!RxD9+dKA85EN9pl9E5-#F^afi;zB_B1Pd zB*o|X^GdH5;ENcj4vrE*Jf0>)^#MGH+)uZNp$`I%){IBJ*Im#9Ve`9xd;P#DZTu?= zvfJQdaE1xVf4-=G+3Vjj@zTYv662QwC$*PkqK~lCNt~!&OW+v^5(;` z;5yW@FFt$e3|QF_XST=yBUbi1_u`*vQ~vGKEG zEdCt+u360HpsxXEA39qdes2yZm6oW6gxN8j6dkFUxg<1=jd#273t-NIu@rf7o5!a_tZp%xxu^0Fue>6wX5HUK zBH>=wlSy=7`@mBh`&=Dd*LgPRJ;i^x+2v6o=U+SQb7klwvnCt1RSNt2yGI|p4!zZn zhzo#;LHAQGc&0*!AGd^d6Oy4~*u~S$#69}6o$|p(K3D9}Gg+)L9}a_gteNziN})>u zNruW&9^_gn(0_T+4gNY`sCzo!2eUZ*vD9sefTucZNKTel!mU-w&EC8UXhCyRE#O2D zw8!fwmM3Ci;ZGiIA(#N&W)3xB#xPj*@-tQGBX1}nAnEf_Jro~SH)NaE5XUT8>@KI9 zonhVW=ZkAhc5uR#%kmbPE@ZCwXK%`!k6i=GM$ynyT&o~0UsLe}tFA_SiyOz_p>?xk z=>~VOeb$>S{*h{2IcIk0326oHX%rdl{ZWi(TQ~ONqtdXRe!!Onp-6mPJFsiuXC1!! zpyDtys>2y`6n9K5t1w5M)oVOa^38lF5Yk-k`!QA2G~3t1vrQ!T=i?a^qiB zutVlw$%>;@cQHpt*h{uy2dqoS!z7WW46QJ0*2Sksao=`DRDHYQyq&I_4o0S7>dM8jVicCde)3x$`t0* zs(hLu@@Y?b0{UdMWHCuPcob^E2T#7G;CvVG30>`f&gVc()HwI%Zx!v4b-=XOQj$l^ zdHMHVqBXmX8!9$6ZV%+YM-SZnNV4g6klL;8W88ylAm(>(ZQ0UwgvwI=?azqebIX-| z=bR@|Ky9`A80i6s0Y+9-M1AA+uHe;ivj$}Q;3kXIbw%8-n3QoTg9&OEY)h*1(?d2d zj@HtFqxfI@vXkfT99Vr9^j+Tn5+*s=?@rG<1GSaL@3Y=K3Qd$R+T=>mVz(i=1WnHk zkm1fGVm6Y87S)0*f7p$oHsRyn*lZ-hj~7OZ4X6MMy+0-HV4=RjRq4M0=zT(e71fQPzpd*eU+yIV+9l&2qriUf z`?#wO`OY8UFtKbyudxaKwuq736dFfvA!{ps?+U?P&-!Fzz5y^=^204dts33;KiiV& zXN%Y#PDHNX^99zU^J2&MJdjUE!HO8!5p=d_a%JqG2AO?6oyqy?26&sRYx}qJKj8JA z?^L6W7wT+!OLg&^0l2IrZ5Gv64S3Z|tkiB3dr*>OCgQxkP@_&>)t$%gp!}xo2X=aW zB+%e}mL}%~FgJWt5XPN`ih5297k`RCY0ItuB#u4+WdF4@1+e&|iw}?5KK%Luh+HU| ztcb}%WKd0-%_|b+@LAV2t9WEFG#Yy$grbLF(sSDg!Gg#PzN#+{G{u zy*{bV>`~8v5|6)~eyPEVgs8YLXR;A{DD1*8Y3xxDm(?Oxup5BBUTi(wcY+jEIfh?8 z+HeX~-1+hOH=6)r%qBf_U0E5Z&Hon={nHv;R!)w-00|0~g8xc+@6w<{$r3)X(yYKd z;MVhRQ5O-E>S%LwvO<}gQ_=M7w}7X#kV|)KF!5s%jiqW!LBo7+>@S#ffnU)(nIZiz z(5FjPF(9 zs?h-Bc(n0~r~7w7C$f=b%gP_6 zVAHqokQqcsyzX6rgw8u;EIgNDoU#Ts%y*7NoMXW8`AyR`@nl$(z(}3-Z3tYI@e)Yk zn?b82s`8Yn%fPSiQ$+WNU1ZFBEd45zFlN6;jZQjOgERXS+-?I=KqElXx@VyWdCs|R zt?2#+3>v}XE3c`rO%Bb|Co*j)+x6))53?R%%A~a8eK3Sr$FF?W6(0i=efb8vpBUhH z?)s*sMLBr;q@3RLS||F=uCOB{ISkT{vx`gee@9<^4#f?sAH$ao%!L=2Pvg^aLy6Oz z=V7pWv7@<@D)uXWcT2R!8rHOQOC9*!fJZGtQgZUnVD5?1Z2FgHA!&X3FOqUmY%!x0 z(YPs#FKkQ*X!hKO(}f*>M*D~}-C(LHt?p^;y8N-nU|Iq)#v97?vY6mMf8tNPv$BE| zPm-j>_etPQN%3ESyOj7|yQK0{JxaJ9(UnAfNEC)VdRnZ0!X8&gcYNr-#ez#Oe_yWh zBhFWQ+TDj8&Jqb_3x~uX0ABd}{XYA=4W!wrxq4T~6#DCD=odQO#&VUzhi{iWf-&AT zPhE0L;I+I`)L}>LfwzY_7j`|M`kL>k-<%>=F)lIuJ#3AGxD9vuh&^-L6>Z{+L^RGmNFxf03R`fPo72OWb;$kkwMQIE<$a`tju_`{66~>=ah>a*>BM&(%$Xl5wPWgvS7o-&%~;dDPn*l_Ii5AjGt-ys!yP0M;tzJa@OvfeOH!Uh z{yEe|qScLnsatZI@5=V!rb}@K!&5!DH|^=G81^oF%HVs#M+J;IOk|E%NOWM4KWcTf zdA&Ga%%(f&OE+%f%*MW-iTcl>GgNi72yco1bpF{)AZMXtVUOV}z0?&LAl1^oLfcJkns*XRt23M~oePTJ@ zfjb{wni{2S!rLl?$=hz(c&Vnkz2T+~3}QP|Y4^zo60xlQ<6SM-#tUB0&ac6T`3+QC zv>)M9)$wTo`d-kP`E2Qw>kVT6p*)`k>wWwPHK)uxHpa_BGdEWiOrUxM-M_utm+({X zypK}fWU=ekg&RF}!T5`(*(&1+bJ%&knuFtsG0ZNHo}nGo$JERg3GYe-vDOumSqDpd zm}2|2sxsIGQm!Mek6fdJf1b(I!1A5T&ZRtP^H1e@rECt zX3LAb$SMu5P|$1gc-Dcmq3d+Mg2cJS5mLu((ZJvoxe^+pe~=egk=oOVK)ogFwCRV; zxJ%NXXDx3N#7LKr&zX@zMfN97e!jABt1s*w!Sn=0GQYhUs-K~;8j$$(^6OZ59LbZx$a;b3!92O+k zzU;dJ(%$LO`47B6vDS0DSBmpci!o|{H}wKAhkd%k=Ryx{z(#;3|0?)2cHK)eYX$|_ zT&caKJPb&Gx#uQdY6h=O`zWfq$)L4v(hg2PAN@Ql-SqI-0FmDq{vA)< zj)LL?#`pDqqa|0X_mj`&(BysRt&5jl0K2lVlzNRCWdGUpL;K5WBvIep!cV@9Y)o|b z=*V9Hq26L=^1&LQtMX`S!KxlvsCYko+f@VNp7N;p^$vqbjoH-W*F%vrm3V3*VT;)PB<=|gdbFg-G9r`zUy3C0=2xNA1wUs*h0oAYHcMsb} zqRXRY6jhQvDD{L?Psw5d3SMww(2OT?4F2bwiq8ilPKNjBv8^{c?{>QUL{BM_;&SL> zEKUL6atQx*hsc5Qv&UbA&pD%OI(b&44sIZaYJ}5%r~%AhLMQnuB0y6N`OjyK0q6qP zcIUj92QW6#ypjKEO=11e9#x}y7vTwg!P&`Sa>V8`8YmNf60F_REi9c>L@v+pd%n{u zh^(P8CH%r1K~y$%_>uNH!RTz%FwK_(1;Z@v0T1p|=+$($(C$+ML_eTr+QA~1pAP?IpVX%)It=}9~h+8RrT8;Y& zx0(tgS?PBO>k6H3bpCJxUcog5hPoz&=}rY^X}uAG*44gW5}l(85|WZPhyM{2o=2Z> zn^l)YfuzaDQ;s^I&cTC^ce6Y|*uzrRL}HF4OA{>bc%KFCM%b1sQ-=bzC+6vDng*zL zhmi20#T5LriO>EqV~+|sL=q@Of&js{j)YS`54^f&W%W~90?p^m*e`|gqM$Xql9BI9 zz-|zYh9A0#h&)_J__QMkUZn2yY!*TxFVz0b5dCUFM24$hQ5uO0T;VO2vIf4{%BR1^ zM55*SvQMdJq|v=}NBu<(31T0hg@pebDRi;%=z@PCkvG27+@{AJ1{Cjv)Jk;bfV5u$ zz41$(sQ2jDno8Cv@SI7S9Ps*y9$PUung)^K>&3VI!>^_ScA9vR-@zrQM&|Q5@6`sd zb-;er%ya-%6c0zq#qOf$J7ra}dw%G$XDyBTZX!_Fmd=_WDL{AU%hHZS4S-7e$b;Ko zDnU)a*j5R;gA&jC<@f690=%FqzG@vn-0Mlbh&5_J_MBck?j*#X5F?;!XW|d+Kbjv? zyz7G=x6S2;AN2v(f+d$rlb(Vq)~wg@yzkM@%M<4y&H6nMif`% z-2SUys0N)T4s87XGlt~f&sj4nZlQXWEyK&=f58nk4@%!EV$QIxQZCDs6PM&s9aBH)Sf` z5B`n<{revDcYVH~w=Bnb7hfHP=@EhP!cH&IoItXf!u&MaIyH2X(qb4Gb?cLNP9ns( zw0uYE+8)tsFtckCaTW$tyvUPKGJ~HrKJ7o9aK@K5b)`OYd&47!w}vh|+{U51bRkcp z^0E8N39b549{fAUs6%J=2sHCJ_cBT40{$8A`Tp&?2V6{Sl(0{`hkq^Knyx)5fHfzo zSB}KV!_%Ki>fM60@ViarKPG2vh&;l%0`k+2P))l!{ZctEye?=FLO~;iHShOxrrlM7 zvkNprKk2M6&%JEFi`!oTVY);y>8vPZzj9*yF~>3dD^65unesT++v{p)ysHcASgUv# z9PDsF26a^zSs}J;q)iP!R|ACv+?rf8sYNJKHp>M0f zoc#?yTsps`U8#kkrcl7S@Yyb?neA)(#Ti3US-}vA_Vdti<-N3VkRPsdwYS!%&4hQ9 z^X%RhVkmAjrE9I&3Af%DXLjp3;zk+$Cl|JE!&rA|_nfFW%vTVn5F_~vnmVgfn3}Z^ z4e3J`GQt-h)PHtyFhfwI3yH;Dom4@#ueN%b0=?$N=Wiph$AsX0A6>^@< zb;CO^4&`1s-VM1JJCBv?^up89R7dDyx{2J-iSAhz0#vfP|KEAaPPp*tHPyj#H(dQn zMiP3X8`@CV`8RlXL;h#dbeg@LFw;wjRxr8?){0$>pOx=~e2zq_jL7pwC8ZErCJ|IQ zdcKv3c<&q-Gn^5lLa^qs_B%yO1bGr7zvn0tAXs#yI^gbr;;&q|DI!GiK@00sy0LmV zo>JHBXx0h;n=G`GZ)t<#l;&Z~?H#bZH|21_(;iHJZsm)FN-tibElX2x?#1P+BFnPz zy;#tpGgGsq7mJ3(=~z7M!eXQj{S@Ne_!4RHz1W>@jQ&elXrAlF;$0Crd^X+K0Pk`> z7i!0Q|75oU-*jMo$2rn88H7bo57Ap4#W~l_p1!lHjX@@c@e_Vq#kIU=bEU3dj$4}@5E;r(o=ckKjOC-t>xA@bX}d5W5>}hJV{AAetf?ZPxd|PbYE-3v)ff>&ll_Qjq`fXAp^$$3@h`a-7)q*BgCnB zw+)9pWSKg*RE|SB=$(hoWMU_s+$BMy7JUCa*GTmHCLE|>nTonfFc0I8X3neO*y)-` zSQ3$Y`M%q

1A|T?$;p={G8gIpL?72Hz)Rwo4=l8oajfo*z%f#M7HF@_k`BzfcP% z;i$U)hDck#cp-`z&l#?^81@;=*j9LnII5XAzq-xsjW&I(${= zq7{Bk61v;r5WiUt{FMcS@|*qzE0Ujrrpk`Ot%hZ$*kk;#>9ym>h^zegs*h*&iuF5C zo_Ly-^U(nq5A4$@cu9)mA5G261qor&s9f4Fk%HKL$6779{4iA1=RbSR=qcc$e{9G5 z`Vjt*w3nK0CV^`>W7Zv*_R+WMy7)Zizkp)SpKm>P6@56ommR9th{*I)kNj`jc&I)ITX$0#w?D{n?!{|`uS^7iIf>l<+A?muPD6Mg7tI_p}- zRuXb4e@r)~NQxcq%N-{)_5xw2M!6<z+Ka*afIG`go5RhC}48~GpidH%9A-R>IHN9LK;Aq;*9}pD`IP%E$Gf_^v5#h$bkm{3XbxAgV4|8Lm-3bYdWUbfMN3T*-0Ees{$HMKpENO*UOb zhrg+>e{~ZF&Q;H|UCKRyF{jpGfr=`6+@i?+FK$=CF7fft{}h!#t=~nRoBOwcP)3@_ zzbkqutMqGwj+zKEx_sa8zs7UmjOSH54sT)fJ>Nj+=J{ZPSa#^7%ga%MZKzbRjlw&H z+cyp*sMfy|977b2qeTHE?3+27IGso^(7sYJF%_>+!<}(oX)~YjA~dYqm2pymDcZut zQfHU&#^W*5n(GsSvDJ7pmq(F;%#F~l9EVCm_f|eHscnaX(XK@1%Yb_Q)pJ5%^Y`}Dsk_o>z)|Y)l$jDZ zdyPRjW$hLa)?cIWRoqlyqsG1&1KWhHkHet>s$}3fTaSD51rg-@gO+6bgeq_=fApBA zXMvzf^)J_0{Uzb##>&~klZy(}>-nA3F+!S4iTyEsoy#h(h@ z4)4qVr|7)nss8>rj;#15RH$qrqlifOoI__k-~Ih{|GW3x^Z0xoXT0C9=QE38n-qHaa4vF*9SrW|ci8zw5tIiy?O&K! zBD$D4hiGRvNqHT=@i*4=V3@{d_`Qn&>XVJX$K9ZSI=)7jgeMw;%nN_JYiV53zJXWc z{iHY8T#=taqFji6vtn0nUpGq3-ShE}h#?vgOX*uVWdz!`+y}DM>`+DEfB$y=d;-o% z*;QqPEq!8%0d4S^emycQ+ZvUAyFo`a6phYyl9|#zawz2RKDy)CXTj{>ab5j5 z6ZAAFV%+kwJIGIW*+EnN82ri>n7aK3p(n4Ng@+H;f+ac1fr+d{`?4Ku)TQRp$C-Ur zqFKC9j_aKW=nMuYHBujDG3FxYN%jxxdbQxpfT%!6`3R~$*=;8R=g>mElGC*#hM@P( ziFiiGyC`6Mf9iD^eK2BV7%i-bKzHu@JI*)8QP6cCLuJw(iOM$KNIww?glbb0O`_sZ zm~J%H17>41*A~?;$vpvPMozAL-r)jDgYU@)PJNc4ia6ZMe-qZtpPS%=ykfY4rnO=4Mj?eH!>!tK!{N z&b|0BZ_@2Dw`p|lk#yZ((*+Q|KGCBwwvIBmKR>&Cn;N!U9hY$&k%ilLZ<^>__JGDz zXFB(bd*Nl@zp}gS0-=VnoW`Jj3U+ul$(HOBfjjp;&$qc{1b=&dKg}~?jBkPDkN0=j z!{r_IESx8AVE&iqjd$(}#mU;+!RVVR4*7L~$!6zi$h-T8=7C5Z-0!5P{>jAwb}}Ts z_b$Bx#rnAD*wQ7Sm&YONn`zQ`&mW$YbGCADZ#dt}%f~J7dr~~GSW6NnD^-((@Fj^DBXYIXYdIUYEC=X z>)fw~utqd+UfLR#o8KF78h6M2T+Tx>Ep|B5sLtT++gDJQU3%lyN)~M4d58Pdlqr2y zZ_=bo+#%{d)#Ci%JPuWCj8~I?gr|b9M++8u;lVR5XC(ZsF~?z726LVpSgUaB`x>S1 zxHGxdb!5vJ%KS^Rtv&38d5d}(&1}ozOpABpVA*VKq<6EW?|1aZ!+6V^D)B<`NzW(FJa?% zYmQ%?PvM`{0e!khA(;1Tdaa`TYg|E>vMdGP;(v+VSKc-!!7b)b2fF8@pa5T0LY$BR z-gF(?sq-=#hlK|}ym28B>#gKXZ(7}fXc{d|~5GppJ6i6L}M++x}pY7P0~Rg(Tz=HqIG zItV_rt6mAp%a!?&%+8R9KjjfqW%m^ z&3t`%UetwBZ)uANRrY}EQwC-n-_vo_Wz0WWU;iq(RS@Mg-R^7E=T@PLDGuZ8Owd^=MuyLd?pgWKz;9eM1bc`tLA z88bWFcCfc~Gcm;?LzjdW8xLc+IOERcOF+@Icl@H9)>v=vS1;w*%lMz4$?)Xi72q%w zUi{|VDF_ZbT7(obz=#)zK3%!$1^<&2j^1`S2G{>t&3uud@WlhE`HIWVz}cbnvqz80 z!9u^o;OE)XP{m660v)S5KBf1uj4Pf7FWjeR%Ze9;9N7%+|3tZP>{;fA=Go`5_}#$p zJ15w1)Zu%DbaVocPrY?{_t!nRX(<0e<1jTYcmO->-Bsa**DN)Rv7+#Wm_>1D-ad*S zNHXjM{Te7)su1E{V1U`h-2b9E=77)}As;bP2sfEe=ki^pg6}T#)t9cXgHWmbVA*wA z{PWR&cZZba;3d6y1|drRa#|u^lX-mxF~mjp1ifX1yma!lE%db5e42Rtag+};-lkz2 zyvl~PXdmclbT5NV%Y2Ckuj`Rk)6++3T$8ATKY1i#lo|_Ee(1l{PVxCTE+;&^Sq^?m zmNiMOe?nGbJ8P+md%(T0M`yOKGD9A2jU_S7eniLC9i33|3HAE^Ei`)D3uHTT_)C?_ zP~PU?S<_2Qc>VESPM%+5C?Mufi@?DFV5aE$Pe-B+ow-rmL|s^eRDC}wybWZ+Q;qjR z-v6FND-+4@qY}P?tvhqfb%M=E$z;FZU#n6SnDaNFEAtO>9vULzxQjr-SAO1S%Y|Un zhj?w&o{xM5$E5rpC4xI`2IqWfzJkAf(l505%fO$?ex~KG8K~N&=+)ui7_jRm8=Dr# zeK0w;sM+e@fT*qxcc*S~CZ$bY@s7~N2F>tRGNgb_c zZy*c6&|5y+gYkB#?6kCr8ryx8+eH)KxIYXe@_APG$mF1B)ltQ6_HO}iX$Q~ooo*^c^yd!cxt&4#wuAWcFEWGM5fk?i0}VK};d|P?o(p-|F&5F*=_58; z_MJ+1m;vj7hkHJj{Rb{TjF{oQ%7n0RM$xldYs5a0wS}f*I$%XKz6y)&213HT`u#t5 zp*CPkH}QxT@aOM8>s$1NG#hj@RG~YKGAraP!k-ACF2Glid+$GR+FPM;;?Ncu`f@xb zuZ!XzochI|SmaMUHqXAn>KQxSZuC+J2gho2soK8^zI;t z-&PI5<~Bq#J!e>+nFINvI)}-x)r0sE5#GHjSWGC*O5Ai;G$iYfcuy>t$dk_BlSMB+ z)Fo^?({e%=?vj_;Yed@CGRZmWthS|`^Tg3V3lh#|0t9=Uy5yL+8d>t+pq5wnZ6e}; zkBZO7B;tz1;gvnyr^#DN@+GXrVkASNfEvS!20`Ux6U^e{LEbh$r1YZBo}h`$Hp(zr zBvNDOmgmNn$i1Bo$Bx%+6H!v!{*K4@q3oAo-9@L5qPFu?L`S(j*%-=sv?d^vbgF)O ze*bJ4fhWi2ytD#IRkgIu{42Xq?B-9GGXcfq`c5jbc$YF_T#Ge)z_N~HxwebXVDc03 zRp4BiYWXw)5%q|FNj4$Xx6YAemQT{*!*SY46@-~k;BJ||Zt~knB=b^uh@8#+LgefS zBP|Ryh00!~5bxJiH#C~wlGooZ-`|zlMYLx-uj-37ky*NdGV(t1XkofbFWgBLLvQpfno`!&OJ%wPR*hY3e?>H~xffa`+wDVr((Je0hzqJdwowPlXBP(k-``ThSwA zb9Fw_;R?9K#pNxLKS+=$;r{8#O)~i9xq*9scY(Rh(pzaR;>bkVi>4WBpfYi(nnMP^ zNZm&9zTTH>M8f=x%;F_R6wAidY@Q_wxXoRqn9j?9YDOPlx}_h)zYf~hMlTk~^wOQ% z$5d%RwzY4C-Lwdb984rH$qRttKeM`6>N?2Fa41d?h(v>jkGqylCV@D~O?kLK4~f3z zs@bDAikfZ?(Mp(Vqp}K5H6EwEfY;cunh?=IA%Z1pt7jvCx>~hJkZKvqu^MZ>>$3x7 z2){Tl?s6VHjEa3ooV7rnAyOiwcmdf_!~vP(BC5f544uVGkcUE z&rIEzZ=wM}X}i_+VS5%32|H{SCOL_0cHAsUFk3)Aj^~zAq~3yq8@0Euk7S|CC%gB? z`4xcMw&{tLu?4`q#b5a2r*BAVSU`G>j?$m1W)@t-oeowkO3x%e%SGhEkAW2HbV@(W zMepe+!ys72O|Xf$2|P#aEWTMLqLm{Pd$@^g(5hp}WRu;9*!;%fN&ZO`FWA#NpGpH+ zrmOw6)px+Mlqjn!95nDw^MMVhcQRb1#0A-`t?a#{s9-S##y-&G`Xvn0?NS#`D68NA`x$2puw6+BR@FN0UFo=?A%a1|aX zp{0&{Z4Hlnu>9TjZvkkk7Ujq6R)lok^FPYw74fX%u2a4x0IPe-GldDNz~DP^#!rTJ z;{V)v?#~WLVxLg9v(uDE*^Vbg<>=2fMEYFz=o>kWWdlqnXodM;JYlB=tvAr24964! zB#W2wCEsy8SA;iguT(u|1h8a(QM~nrCpJ&BSW%z#$M62ED9JTFz;i_zv8@@NxS#X= z!nOOZ`0-gsipudaY`9lzk(+q|4yMnyJ`^{=XER5cdhwby)y^! z{`(OD$74D$D-wiL#ppxDJo5A43vKwU$a>?`?=$dSmG72O?rD5HPi#Ij{T!kk55JIq;YWjMTeiNjq~4hpc)|9*IAJCr8zP zWoO7@NsIed|NLF?-s0Omt)f zaUDAYskJ842MbAP9JkY?U zqJU?TeZnQj&SOh$qtJ;V4ID3SStw6~W%g;Cbhba1Hx9^XG^L7H(xnrWv6 zW*u3`uw^n`63Gcm+B2iJ6Ar<#Pxp>2Bp-v^&dZl+%xG_wBEXqU?Mm{-uQsF)$Y~JI4 zN86AaQ{~mJehHL?aL$~Ou3ADcZ5Vpvk3@TWUQHm&{k z!7nr(3)Z<4h`s)Kq3?%($jVx#ZAyY3M)`Ez>Zv(|9ZIcC4&^Nacem7)cE}rdJUFi}MJtXo>cuW(BE{P=(AEYj#hxJvt0t5vvvayY z`4#e~?ak)Cw-XzeafpAl{E1{nYi0}F`@sjl9!cgst?04r+V5Jgaun$}AR_NHg1)}} z#9*6L2X_2pdBzH}K>JOaQ!?l+GDzC(rgEfgd7r0)f6@t07G_?d zDZ>oBvM(C!Y@9q~rr`mCuYN&>^9^X1mmi0!UJgq9vk+9H5(nJ(>cncudn5CACeNQBhd~0&(8G}BVqL4F1N$C?;y+@`Q>l&U36hcCjG*NN5G9Mf&R&{BBZ0| zX|#V|KJf9(jO#JCr|@H(1uq19qd$-D#tTnV@|boT3tZ>Y!Rt_+r8P1fY~||C(#yJ| zHN#^^j)htPId&yY4ns3=>=Dh@6zK>O9@4OEM|hzB_^&&yGOGeQvC(Zqk^sLqveRei z^-ys5{`S5Je>D7^$>+Pf9eA3z4Gu8KQR)`9vW0nP&;vu;3xPFfz?g<}qn2$ra8ip2 zrM-9#s0Gzsa~G%F&j#@P2{@n)#5^K0-Bv}=Nu96z@TV})c;U00=PebG5c1Macj5w~ zgyEISB{e{I#^cQUAC99CJIQPJ3XH+&_rtwbA!pDVU#q7t(pm|8=zvjj=w4tb>i1}P zj31>FbxV4m4Uqi;Y4d{PGkHPZ>b(x!3nDpR^c;)bjjEfY-yV{s0xa=o_DeTt0nRr) z`E!F@;L{=vyCn}B8pGcLKGx8JhpbQPg_3@d&yRAc9oasKF8{E4y}BfZGHkEbo$UJ$ zz{w+gEaHpgFfBm8D7-k;U|ECuP-;b_%edn3$@=qE3cA|EtCJ= zt^P@_PnaDjiW5RFdUtONZ`YG1Q6E=_j}H@PDm_@79`}=C6AE1`Ce;)lrS)UIenwDy zeAa1q$T*QZ)Hpq8&`mz_w|)_HyN-yXTl&D~o<&@)ZM-CwwMe!#GEszMS1s-g#qonc!Gee$KjO)A3$`Ja5xH;B0l5OwrAqRt?-md|a_V!S7L36Gv7T zeE7Cp({IQbHq$IkY*Gc=_OzK1g$r@*dxF<$y6yIvY2^>ppo}4TL`y|P<*W+a61E=@ zhqMFUEKNTq&nZY0NpB<(mbaZXk1HUeYLZq<{wR9z?UCne(s(A7?xskIc!vhXEu=3b8ddp zxRprsmFabymdzqHgHt!&b@mdKA%{AtvZu(^e=&jQr;j39{@+LY1T=y7+Rpd9hfR>` zLF(SkA~$e$%;_(6;uEm4(@z zHuxOWq|HUsMlA47$Eg?7qp^d2riRx!!B>@4p66d>P_Jdoy2h*l(h{blAEN(B^4|>4 zSbakUd~#TC=hmVA#G3dRB$XX`T-*)~k-OT`g zMX+gB^BqNUze%HnawX7tJ*R9O#sg0sce@IyRFvWh61{f51=SV<*Gm{l6sWrOH7e{U zn&B)IQrO zkaHQtUCWS-?Q%j~zf)?X>}~&*0l)f-`|E3? zL3gY3JM)rBbYnFPzMdWezx%&klt`fP4t>I|zj(a~{@iSh%h}Hl1Bes3r@xc{7xAVG z+S;{f%~M{(?sgpb&ezI+Hg*&>+K5fQYaIbvZW$Bj7*c@3>Hqe=BLY#fZc*y#j5k2S z-Tuq2sW|k<=_VKb_hA&X?9bSl{Svi6lPPiDXFxgQt`OVNG?d3X!(n7r4w_yv0DG5y zKpT2t+Guwg$TMoX0;pf3OFc(o-6viGl^%v(%iw0DEZX+=?u$?8sjik3Jz#~$J+8IO zRB*$aT}qL=MNi;7*Y%iKJsHR^^63F@?}yZ)SGUOFHl)c8>{7q{MmYY^%6iBu$dePd_HX)w{Dg3`%sf3# zot~rjzR?cae|@pNIo|_b2X{}EnpC4ougn9Q>f;icteZgf zP<9grD7zW?1mraSN* zNm)H6_jiiHyE|4GH{MA?9bO~nTxWVbZGpQ?wghpkO!oGBr9C)=N@o|7@g|yY<6jRn zXT(QE9yWugY&hilj6wCA8PuCq%TaH&2A=JEy&gR|hdwUScKRKhNBln2(I@W?fh$@s zFB?*L5QF2nY=fHJz(x12F+ayVsLReVZM?DsUMxJ(3=#MUn99|}$j*MGZnHA4x$84J znB4lJi}gE-(=t0MC_I5w$C91+rGBA3VBwfbyFV(t#6K5#{41!O3HUdz&4o2|@;;7o zazUR@Non$Jdtu|LzJoKkN6&99KN~}>?1%*4yuiSr44NruM>6ddfqx`PQ zD0YTPWKb_KO6`e|_8aHy2Zz4^tLJ=~i9bis9Z?_mug^ZBUs1*yVuc;R>dCKNOdlJ8 zU}#RuKfVD}JsG8N#k~#uTHYxVY|;a)(jPn}PZXi7BfHl$J|OhpjjBqR{0&qW!lAtJ z_dvtq+L1&`9yd~!OpuqZL}dv=k~#6YpySjhr2CN?D}9=KS|ikg`ahEsTFv!wBVDWzVMz ziVh$%=)S|zq&wirT6Rk?^BZ8`#H3{8l?(i};7P9zN`LpDer_ech^l_-KiJs)5QLR; z__`{lfk){tQ~KFFK~$pW*3IEtNV?%>UGniOAjdj#P}ocZB$QGo7eDku340V0e;c`? zumk#17k}!5D29vnz0JI6=K?2l<-9stk@xv?{hAuc2w?K^uD1uSaF{;|Zn={r2AwH$uD(_O#V&1QKyh*D&x_1+54FlBHqqr$LCn?FX}-F=B;RzEwwo5jkw!75G;`4QPnM`;&PSwYql^v2n^7ePdgUUFv%{{eM=x+&e)6(eH1Ji8s@WBs$u15!m)DhFNY1u+DTJueq zdiM?DQqnHxVbQmQ!smiwwS%9Dhnm4G;>yK@Z}C;0it-floMJgcCu1aGn%`7*d-)dO zBu|_1Bt3dFl?B(83xnV{|dzx}aU3VdEzV>*Xl#e2<-q`Pb zXdOf7{b`17Z?2Hcm7SxX8k9-#H$oK&Iadjr_$sF58>Ix@UqiGK<4KBL`ur^Arvu6M z{?{~EyH4yl*QoM#&lSqK!TK{Yt5E(sW$@?P?2Iz!vPJr0?^?~ao1MSW&O?OsmygEH zLvlpkp~S{S&+p1P`eu%;E9Esuy#=&b6B?CSRIg4=n9eB+*k^u?UKb1DjOst=+mc8D;ybH%)75{*DIhVfK!%na;dEeuHJC zCMRpZU7^XA@>YE66jj1`qAy@vIH$pYoTB3xa|YH#{=moF;P1Yq=%*i9T8Bc&Q^V{E zyWC}o>nANDr~QwUn%QI56;c6l!WDn8zBQ(cU zT$bDlcxWxGE=`_O=^QJfoS#&)1IKy1D{Jh^>XZB2mumiQy0iqCN)s`9oOAVqy5xjq z^#i%^OcLZoN9#X+OH7rN>^&7!My^_3UYknkBO3M<+`J@FPN)H9m zTg8(a91Bm9DRm$7A6vTGz?i%}z6Y{4wsH#U+A2PSvrg zW1D_-^nU>7(qvzIA&wUR`4vXga3bZqa?~P1K?E>gcxj>0MLv$=IY)R65iuLn zotKZVkgc9$q~i`jByDq%kxI0H0~T1H__-#u<9XE%Fr4mrU<&31q6A+DRs9frvj^5sW*`P@{&+ zp$R4rApH4H#(mK^pi^feIioF%JWk!jox8+=_@e#$qfy7vyc&r;9*Y8vy?Qwl%U6Nj zuc=?$<#R-f+uileo&TZh?5vhTr3ZmM{k~Tjelke0__%+{Z6lP@JoaeIs)A7SvsX_T z*&s%o&l%pfXF(o**896OkAU#` zZ|U0wX=L`ho54Hy5K>%jESmOC15s}^wuLUGpq&)XbFW7dxaPf@((6=@?wwhB(pTS$ zoQ6_Py|KCsEc%sbMS0bMrOFnQslFTN$f$U=)M*VC_}CunjAo(sM?W2_R4yUv;yq(a zdkjF==%F{~_FqQo-y1Flv3Y}p6Ah7HCZ2&9!#m8`2aG`RgPq~VG`i?d%C3r{c|D*$ zcyubAvR*$(p~>8O@EE;T6FO$Ed>RGnW|Nyqy5OA|G#nogN1a2@`M#`s0uzp|dxpXR z;JAYPXG`mLq#MH5*c6lpyrdZRdcOMw`b#{YwS4@AN|Swl;?{3yj)Nx9jl&@{pa)UOs~3zH1_8OZ4Lly)kw92@g8dv-4l?k_ zj#WLL1{w>M6nm;(0o^)I{b5IcWJUdzdG}#GFm#$Zm3B1+oTxhDG|Ur=Zi&vYs{FnN zCTMS@N6-X;V;2+(BaSDbV3t+h+7TB-h-@_1pN#@mp$7UIb?Hbjtk?Na^dN=1hG%Xi z{{k5aGRZ3~RPd_jX#LqI+dy;EYmc_WI#4SzuMxEELG{{wXOl-;(W`+MuH7SfCy+Rr*WdDkPs z;yY)4SzJU8H)$Elu4V%b$;thfRI9;pzW4j;rz${;x=D-beo)@ zHs%jH#ZkYyt}u&6sZAMo1oQxAB_6wb*INOdhG)tr%jc-z$?ksEf=(26n?C0!dpEMF z{8}g!QIGDcw96N;R3Kaw`!2HmAvo#I|GO4efWTwBI#UI!!A(2c9zE6)z+Y#+>Pwpq zf|_KiRe0RdynM~%`G*;3;u-zll!i=XVs_9cQ!o@%+@(ov2=)X2S@b4(Z<(X&QK>Q; z<9IZ%V!tr*DH#dr@fR>BOr!J1P44ZISwa#W($=@lf1~12wx-W&Mc|CVv1=cEKLg2c zo;w&0bfH_ewW2p;yHPg{vwsvz5;_{l_|eU!3?yD=G$g;j0`21rUfEPtKxMBF?RT15 z&~tUoaW%IPd}1=L7_aw6VhvX=Nn}4m=f2wEH*}e(n|@l0x;!71E&CK6eVT>lKb%aI zBk!W(WUi-Tyul!bn}OSX{yB;e+$EVnoq)`ZS1yH0M}jm1_tDz-Vc?3He9%&gE26II zJt=XBvcLc1Hq0xX0;c3u)ZVH0AXCTNEyZ+cC@6o>T|v7XaFQYuXMHS{zHth8^CqJH4gE79er3n6@9Bxi(x3A*{Q+-K={RtB$G2$EK_d`# zEc!CKpk47+$>BbdlYDWWKISo~HCQ+=d+9t_RV%ak@!=85^1U7=uWpH0Jk(G06}W(x zcW*zf`|gDBh~Y%{QW(nrxN-l>V^;vh?QH~q`hct;iCy6>C%~_Z9JHcCRUkXocPWH1 z4cJQD@pN?bM0=lJ8`+=d3Mk1^#)=!)!3LKj-|>Jr&`N7~eUwHOToMp?d0O5A-RIOg zU?^k&PF%ZuRekXkD!(04@;K-L`Z%!K8!2RiE-ugLw_iC8dJ9yRC11#)#3PSf`viGW zRnT)98*evo@%a0xW6hT+=cGIBk)qP5a%?*Y>j(huN>$eESBHT0j|iF_?}X6j_I;z@ zcrDO^&$|evepZyMb)eCObszA;YBWT(45E{ioZ|_10IlDS8cv!i**^}JE97J^yyfGUd{L_6N><72(gj=0KC_N?z>1j0xCdqg}pNbwUQ^##lR zWI6x43;COSP*u^Uj#tVQA|)*OKcI`D#+{XxMw<+*qQ?)12NR zG@sa|YP^^k{+TEb+M&7E@f#sutNe4)w2V}|$>Ms{B9b`LICp`XEr)QkDA#UL_(U|z z=c-BYXA|#lob!E8346!xXXf#F^@NaZR+z7fupsx?9n}pNcuR_##0ljjZkY{?I~kikmj0l|16?3uK76w&d!gwXSDWgIlf+;a zjiR2Z4N?8Y{Ft>F<@eWej-_6FOpYt6uvB19^ z1lT9Fm+?|CnY5#GXca4vAUSE&z{!mGDF1Cca?P5oyLwA@smhZiW`#?)hMdT!!*(X; zsLv6W6mts)mn?0^RLD-LTt?D&|bpt)kQ@yRtUmYEI$Zh@Th<__CW)~eZhS1XctboR`p&x8R6r<78~qSim~^A^n-g_Z?Mzi^6pbCKk-#My}jNSKj9w6 zk9Nd|5=?z#kHBria=efjuWq3H64!3a4R5r6!RlV$S4Tbiai{eDVd+0L*yd*D@Ku*` zycIIR(%6%Mt=?B047=F`yWbXd7HjI@WBmc#mJ2rUUUS^vl1rJmfo7U#*H8fd*?#*; z67@Iuvze8)HliD{Jo<3aaJCRa)$jkRMiZcELSU#@gE!>Z)zUT}*9Gl8`XY2Lx54*f zhOYp*L18R7xrn?axuyLq^Iq^~(Z2cO$j)K2Hh4lrdw2`kcM&#N4 zn$j-l5ozj^BHIq#n?pi&c(p@~hJblRn_`&yo^#8wy#WsX7~tl=(*gA@I-{#4+oA4S z#T72=b|@?)WJ?r(#2ysY4^L$;rv3cD1O94VMWlPbZ(j?%@|0TA{y)k% zm9h=wSz4e|=7D|RR_mb7{oS%B;t*VOnsB|_hhUxRha_p$Hu(1OtHg?^h!@Y9kaprH0_ikRd}qegtp* zQng~UBH?Rx6-MPK5@tM#Pw0M*;N$Q|pBz3RI3P;HaMO?CyBXQG7kNVAt>A~Z1#}Q} z6ga--MHxpjyFv>U<@*ICy;b+!M=(4%_3q1J4Bsi1z0^%4;bA||^atBDuzR2PzHI{v zPrkTRmTv+K719onYAWf4+QA^NQ>d7X;TKQ~MH0LOXVn_7qPIJQPb6I(wAD zpBE`uDYQb+*B|OtcOuy9Qu6HDM+!$C-{P^bt%lFlwQ2osA$aY<$s^_nK`Hv)K+#!> zzi0eY6H{3YJd&c*HXKt4?Q4{D1w#=$^-r)_(H2351JkNwl=&EEIDfN3sv34(aCSd9 zRSqv??dH2ljbZOA#$B&ZV>sryIQygw!3zm0!g`$5P{sY;nY-sJ;6C3Y-1MLZw(oU_ zUmC1}LfYz8%MBG!hrv=nFSrc)94YADL0<|ZKAw+rh^mHeO%_G^0hMsVMZaj{W*OXg zUfX^5Knd)VDL)bTs|bz>^PJ)usD$0(=Y3OT&4o~Ypp(i+J_GLX z+E`QE5d(d=@ygvxUT`7Nz>0gS2xkAIVG+{EhllmS&Y3gm@W&yAA(fwz@S)fN2l`Gs z_(*`ED_AfeZXS9`=eIitzBC><=KuW_! zNsla8n)ow+((ENF!cocj3pc??V;%>UXKYLmJw6aqhmmj!!Hu9-rFy7@LQ= zctop;c`NbUy@D0%iwN&l>14Gib0-Eu)u{Nt#^CtX_$zrS5yAh{&Y>)8=QTRxl7oQaRx8OqBcZVBxw_@sf zMt76hW_)PW#9EBI8J_^DzfTP}<0A*DN(|1n;f@!p6~^Z}@Lt>NzI}!5*a7cl=Gkn+ zaa!D?59it_{dfD+idH&sf69L=b$32sw?C^wJ7~M`ve~+x%GD3p`|0a9w0}GB()7=U zORSyv`QDI0Bf4(f`AV;#yQv$?tVwb<7j@$Uh-!UHrx82-w`=;@i$<*QwI}oZWFvm! zEU`XJ;R6WptZ$@cG~ioIyc)jD%~+K9y|MRZGtO>Ha|F)Kcq-4tRwld&BO)>RaaAMs z0LN0emfA2o|5n^{#dcg_rtpEbuMIB-oG!PqZN;avM%J&(wqVY~Vgmmt<0RyHtLwoB zyvR{@mxdy^<<3^O`Zm{r#Wijj)S0*AW8bvZ7)!dbXJ7pp3x{qTC?;vjcCQQXc(}J! z_E0BY__j+zPUs!pe{$r^sn-pd)_|7QD4-5IMf}t9maE2xJVjKqdWvy2vu}~bs{%@Y zU~9pd%0?{YAz6Vb&l}sto;er(nkF6BH(y1 zUyEgR0%AD+khq^w_rtsh<+*v15E^y89mCKP(-$-?SSCC-|Fvubj(a>cG09kmr+=A$ zvy3XhyCS)`M+UQTtgcddWNRE=tWh()KlT7dN8Of|OizF*#<3sml8f-$`=KI*X}LI| z`}k9kM8wbY&5?wke)XTqh|`Am_~ge$Ha?_ z`wW!%4M?M^yjX*;YCd5VGAYDfQ#%G_1LN_<$d$gBN6J`1KRWK>vjiAdv%b*lLwYDf_edAY~&{B_j2IH4Q+VtDfVD6m{^|elgaN=L*m8Gh3 zczdOrU#+wXhI-S#q^)@h*Xx#FikQ5Dy+IxqPn8!!x2Y35D$i6>yvp?5kuPfCj+)?J z>Fd7Gzc$|9?_VO6>GwLk?{@)Y(j1{Vuv7^fEk8@d4pMk-IWHu?uPfrJY$xu9#5g!d z3|RkoT>xKx@|U@wSOu?#rW_un!_Y3n!y)Q%HH@w>*vZOU0}pd~on_U=ur^}oQN!ta zD6^NAdycUI_Kuxq8}6!t35(TLE3uSyzW3Vv9_?CK1)d9NnASsQ%Ylbp-x{DpUNCj{ zvl{3ckjm#igWv=g^Jo6}I{57C#r1^w1~|PL$L8YJ1Wg;w7hKj!c=6R;AM@+A(5z%& zeB2W{g?hemAOx*-6#m=qFYPL}J4eYn6{*_AuvTa+ z@{{MDS}W8cV#PcsTcGB`k$iQ{HmFk46w|KU0ng}q_5JzV0XaRAZhjH&fZ3J;$=_|7 zp_jvZ=j)(n=Bn+Lr??c=35Qk zUZ{gPLU}pXCAF}CYc*ohsuo_!7itoE+Xx+bucr0gZiKJeGltFyH^Mjl>V7K=^|0+z z34_{19qb$b%eHd473%KMVqksI3M=mWx_?$~ft{D5mByVL;Zc)#7yYA@`H7*X-l5O| zS071f_e8bBAt!~(WAtq>%G51qQ?40m4U`5?i8VsATMBvAMHDaNqu{#Em}+>2brNyR zm%u{lwu6ZxMUW@`tm5~o0_a3Hz{wtm;mFshbr?Fm=8D+LH&>sT43^S0W6;LTGn7l zg)$31Kip|-;MI9c!6@()-{_DDJSJArmfNpZW^moys3WTmsvstj6#)12F#Lm9O8@Qa7Or)1HR zXv{s``*UdeC-a~6+NaXgAHVu7QSqAQuxioWDVGe|>%JvCnLjdUCsfUDEwRg?u{=)h z>Hm;S`>=GMqmy$g&3hkZY<61d9)waVS_P2c{Ia(R#g+#EZW8M z4T231vuW+re#P0CH?((R`ENIF%cs5TyTA2Ra{*1Z;4rN|5!R`#P*4NrA5LE{e~d4e z7AM3Zzd$UXmabws`2l`U(riQdtop4ingo0~?*+d@xqNqJ$xo47+SitAzct*TAHCe+ zokwUi+C)^b(7GI2{O0>IIr6!*kodS2LOunwGl^b#lt?k{yl-c2p-nNZ>UgF~NN_H# zsG9X%x)6=F-OTaYXFmAdN`v8xoMr{I2j}|VPp>YbHQy7Tdr?kcn%RX5s((Hd(kw&ej{BGw(E3~Vq|@~aXhUb2(hP1E(snx%YNJm@!TJnY z|J8d^M5842ZhZVwK$Fmjo~qwdMAP^-d3fHZh-UL>uW1zg-`mLW_V{ubXMLkuzI;&u zO+}e2-j5IZt#4`=jt62Ssm;*McqF{eV>h~0Tl zt^>t1&h<9+De1+u=CJEs-fw9%I*WDi`~Zy>JrI&P|CvS$)woo-zq5#T_wnY~2V5nz z1410ZJYVx@mp*PTvOicr^C)^6aRPpa>cd+Li|qPh+RKfZHhXTD(CAUsY1i0GX!R2F zN=o`AG``D9Su;%UXm>Sjgtg1w(pYx+XNM0K&|Dvnzn(c)OndPwyk$J8gtq7L>bI{r zOKDNEns`?8rQ480G)$31`S` zwxoWKHNkd9xfcTm7|3fw>dhGaxiaJ}jCvo2oMc7xR4oX;X2|@Eaq1cJ^-H8)z>#3P z1HnEk#~Lm0*M^!DF5To%S;DCBeQM1oKP?u5%?QY)Ozl@fAP+28R8Y z7LT^_oJ8O0Khm$ODv^WC2ud@3!~Lk-@531P zj+FD&6I|y-`sr)x!u3TwX&Ci3k#;xAzF>K$ERn5Gk#W>{NxL*>BFnN6Sx2}H>xVYi zV*L8C9-~!RBgW1x9T){RlX8BsAuJm-eaC2B^$TO+^|u&1hi5VJ@w~vuvC$3VBTq7) z12Z46e05?mZ2dm!=&&f3PkIHxR_~({w+v!=$-*j(scqdD6Zk~1z66UP)=MfNr(hV&}kE@Hi}60sOH=H7tI=%Xsm41#Ouqi)V8>_@2Nl$47ws_QNs z`94Z*t8xXxaEpDoUGCVNFOoUB-EsS74na7Iebkv)b2#FCl+~@lTL^s`*x)GlQ7aGq z#Pcx_wZwK!Ep&g3%Go=wv)BN(FWS2rA)E7}MpWL)ec2!3j<`uRRPHkVeb^e1PjP{^ z6`=jH1l)dgTY&?rA1T~`?Yvcx8+QR@^`Kh{c7TWZcfCgaoW0VAF(C5JcBJpS;-N9> zZ_8l^ON2>OwI9-R?JPNg>YE~~B2l?5i@;}8e%t0;t}S4l>TLm3pZBHo399dA&fJU2 zJNTb`N9D^+c0WS)9aUem9@Y1x6zCv3nid==M{+Fdw#u`BEY~yJkzR@8y1jUuzPPh4 zNDgR!eF9MTW7%%hpZ(E|Cqn_-DfW{{uP*sU6TutxYhWwjP6uQ^kOpTCiyG=5&~`V&&9A9ELDKV(Nlv2PKQ=N|}MMEzxM`D2Gr zXrgGq5^(9DqdMxRx?)og!X(?P(x`s{^D1YA=}SEF0|2F${rYhmFmn3y^i{xyoaoC) zzrRlKKcpvD@{JYA9ZH&?Q2%E|@8IXyx@!*a9~~dI5>%ecGLVL_HA!a(;c)|Atp8WT zDiO(EFFxYu`7vL@4INjOXi_!g>vj|0;Lg92!6E*i&az z&(t)A_wkYFEmKIA+Ub1->CNbLFSr6Yxz6D#l6{BQK1Ayy`t^!5(o3j%SBfxq1D}(U4?7_g!g)Gu0U-k_M;|HR{w&|?EEeVXi(FNF!riDEiwSRYFEWa9vQF(sE2dvMPdJRbh$1r zmueZq*si|}kF({v;S;1s1;pe1@vD9k`_FrWyYad`wxwY`F?ll18;ZmaB^45Hwmc$u z>=;4IS~9PKuOyCK`9b1{WfG}>yoz8TV_xEoq<+~vDYp?N7%)e$foB-oTXUJjn~EZ$ zAD~a_3my~szD*joQ-os`#%CNPUU@|mJAOtHyZL2EyHrN}hRNdoXBfQW8zU||Zzttp z4E~_a&>La2Q?)1cJ~V<6jJR%ng~&~e{*EyC#aIuczbb+was+dI2(I-e$Z@6_+tZpw z?9S#R6 zTZaC925(!;n3obm2Iqk7He~R!k)6c;9Sq)Oe~#2!IT5_Vkl`@lcK`4nKmLcX330s? z1HlPkxrl-Au(1q>9^(y$oe-?B3_%eiIA@Ii`W0lX9~@d-{*O=pHV`84ky<8H~)WjLLn~yXa7Gw{*+N3&OiwMSnuCH z{`cJf^(Vow_Yy;Iih%|UtYFkvGO&zM{_p+}!jLa9>Rr#1@%S0#Ee!m3&nRZB(+bA( zjbya5X6UsuaD-9L#Mt*VM!R`N{lDk@fl(g7MaJ!6?7JyOdl|<5vp7WR3w{%S5XHC` z=rZ=B%Vko}r$I23vCr2XA+ihncro_Z48HADNaXeqg0-&*ev~C>@S5P#J~G}Cb|R~` z5IL})$Wb4N{Kl7@2adJvcpRS9#2@|eB0T*1NpkM9&k#R*CG`{5Q)T$i04~yA_Y>)F zgo*I-ze@>!?cGlLt9wqyt>h&7PsNBIWMle>`{Uk8_um2SpKVO;L z4+0&Dy+-+GaC_gaY&h;X?X|};tzkcIx4}jY%VvjXv0V3wtkc`}Oe{xPF2nVnzkXx6 zbj5#oT;0^q7>6z%$8o;yuNsbnuKR1@NcB;Qdz9b^_EEK5f54Rhe^4yNJfg*rzYxjW z#vb5!uNxFwh2--Y0l^3@w!FdPaC63Eba*&R#@U^W+iRXvG{^1#3S)j{`kXvpiMmU8 zelx4L!qx`fQ(IP#u#RU39{<#>QQQyhSUk2j5fdKFqJg6`gVs&!m~IF+=5g%x)hLTJVhGc`MzH9YpeG7v>~;z=5+O?nsU+ z%1J}~rH()G6yjeG{zML?3I2RwsORvH*J2zk0*` z75Md@TdVg1nrkIUy@YZ>(bvhRT3|kNmF_Z7&b&fKrQ;hsr&0-XSEwIae@!3|a4;%D z#|O~x@cD&^-$zC$)S&)N8`>t&I_Cae?~Lpj)>|fd2JrVq?gz-;l#$yWs6Ow33n#jt zjZ2sJs{{TVNnl2L)eF@f(K>ZpIQPLB@OGNhaoaT?^Q`d}Vp?ETA%v61O*$hnO@)-2@Cs_6jfsjA~GrK<#qXnb)Iv z91*#60O7bs6h4P;p>sjVKIWite2%7`F1(KH$^5PoiOLg=WycWq!|zZdblV>X)Czd^ zt4;n0H++$`w~y))FZyT(X#d}m9cX;!lg{uz0Ac*qsiUa=P==Hc zLf*n3@6moOn$i8G1E_mQHy)jn($xvK&^}M&o=ZXYs`>AJfb@4#*Rfy8D;L6k&%${F z_BY@3bg&-_ZIQx$iCK8#E2Lj79EJUAWmqY$SN3be`o~)Ld_namBNqWx=%d!RisACv zW=E`lOK&;xPyg91NA-VC?GHofWABacXW1gFu^pGZq;R{s#HY=uo?FZUegxqGV$6V`;G2;D6tS7US#IGOIBu;<0PB427!H^1qPmGCPpdOhQ&5GD9ww%<5 z4wAU-+BbmvJv&VJfY>&o@03RLi+&LOa^4`U=Q~TvC5p+t)6lsAmj}0!IK^uxgyrIq z2#kV@W-&S+C-=|^y&5csE+_rmWAJ%d1}}TS$bVjD+>BBL&&9T!jPKA)^fe1ey&hvdJ%b5<30+0zsnAOFk~oMS zTPkTE&fuw244!zA!7J4nJT!`d{R}%HnT6+X$td6QkB2hk?~MC`K7()GV3Zp%@E_l< z(o*CnXVxHpzE?8s!Sk7fn2v*|d|EBMEMU5ISPxL-Li`v1qTof)z{!@gRE49P5P z|G&Ka5=K27K3v|z7&nw5k2CNx14S76(Tw}=7DhQFopAfD4EZO6m(OT3#$)hpkqbl) zX0)HtBeK(4f?15`4bF(z$!NEbq4(LDl+!N}EN6`C%INpLA1UwuOxDelv94L>r2H!5 zIa0@n99>1uS;$r*Q^5r14--se+|!39$UZWTBjsDl2v$dvef8U$@cQ8V5p4I!LQ?+P zo!CMBAm>uXh3K8%N%m)e06Di-e~29s9Yk*ZP5hCQ4bjVwCG`d_q~4Uh36HZaoa9?% zPcFcIMr4GHvn_;-Zxl?%KfZ~an}E$+xLxj!X^hez(=f&>ugC4xC_yZ1IZznQ3rIeR z#f#Wow4Tg6K-UJ>hw>?5e)+IzA#OiGBYKZA^Kkv2qpxuJud;PGztj;*{D;ocH@N<$ zC&_nR9<9gmAi^jMuCS0t7plRskAuw#qn_)llF(lR6`>_3m^;i+*n0qJF>T&Y2L_|P3* z#4GN0`-6)DUUn!G>*<$8e@1c?`>;R4q?v;fh>tAEj<|vB(C4@Ri^@g)*65-Bqs_Yd zP&w1%@Q^UTnRU;{5a0X5M>~r2wuu{lL%4FNXankp^LN?agMj}{95Y7zrf=Ti>}kNg z@84#le%hJRf)KCYVz+7H5TM8%+YN{xhkWy2jP4J4BC~DrfKuF7o3{b_y?HO04m?gY z%kCoLsga-l?6?cKjXBP3C7|o;o1=)|Wz|(*PX&Hkv!k9L@&0XGeXo}REbMIF!+3E=*MIZ@dB^+EZS^cwYS7yRu>3OmgI}Zi4%cU}o*n zAgC{4|Bo{tkY6C<)fCKY`^=+tj$p69W#6_+=y&U)>RJQnclB1OB?ce|*c?}>c?b6+ zi>EqSMQ}gpo?uLIqu)Y^_Iqw{5PROAXer-wctjz)I6 z6nj|O9q#t=OR&QFE0Z4ieCO&8E{_B;{`g0c^Q&) zbkEk?<rczvT@2++Opm5i0Gq~dGa-G+W=nf?-;v_@6NLOgN>~d} z55Nt(aQ>t7lRWm<^P!&>AiZ>XZf#`m`i#{tk)B_>a5BQw;r#^&&A9{S&^^aQ!H*5e z$%VhZB6RaUisOr9b3FFX=_}+fpnH(fI1hfF=a|GHWeexM+8yg{z7jNm~-Cke+bR|8iZw>HZO;W$-&Q$cz(QN5E0mr6v3p!&PVMsff1&)?yD zn_)KL4JOm%-jZre$K&;^BK-gH0O9$g$yV4-GeyELT8hbiDsN;G>*ukOdy($8}{f@nU;o#>jjaRcN1S!Xt>S70W1TA9p$eksXY?@S@( z{nrQ@E+<&{l<;ozTC%>|FOYV!Du8d0t+{_)y~=t`F3o#(sH9EDQU^>DX1czGvzSwnHy6 z9-s5=23N2@d$dyv^LA}JAw0fH@++**DoegM5N6`6K;xCOEXBNB$!HY&7o`G8+z-wE zAolaKDrc}=oBQsnB7Li)`S|;Wpdty(!%J2qU_Ttl?uq^C0TzL(bvvY?|b#b4bo_(pib}bTx9U@X8h9 zjog$nDj(|jgyXXO&iS<{&RB2J-Hqa^-F&DUs@E#c$8n3b#oG$WGHljH2n)R)HK8~e zm!qwZr(-}9vI>FUfVaEL*rGR zUOR~NnxDvZAsmU`B}NC{7JWNL7}+sW(u?D#!cjG~3m{K_t3B!gxH5Xl88m({Q$q>j zH_PsrZ$Ve+0_0l81fv-fn)7?0cDzjrI}d8dosA0B~Sh4cNZ zvaSG+y}X%?X}*tIe11lAAK1ZBoRc5|{6E)Su6N)>%O6iFY@RNFJhXR{ zZ!g>%&YaQ{85)QCWFK=mb3X9;C!cn?q(a`>xnTWHSeIjVg^gE%zb-6R(&^K#KQ zu(vf2 zf{x#bjj&!*y}geE;CU?kk?McsqLBGm8!7*OEv_anEwF# z!tzPk*8Tm|pUulc%k$`zMV$W{k;O1iOY4;b{%~InFciLZ2F6L!x<#L+Q&C0gLTerA z)Uf2T1>Mj-PQX?wU~eDwa?`fC_NiXVW_S7WZD7xZos$VXVE^2#dsl2D?3V)}RZLKR zefYQ3IeJ1wx?p|-90M6)&`yUd$v0Bo ze*%4H!zatS;oiA=`LnyQE_XZCudW5XpViJP)feD+X@LuNQq5Ynfy%haj^Za`*xGy;JJ-!XUxVy#QDqm+9&cj8o zC{3_aY|-+scVS&4m%RO|0QT?cwRTVhoGsYcgYpcCZWTG+Fn*HEyu(V+i#3-EYKL;$ zVzov3fUmDFP%;7ZjTav^hIMzfwYAv>sL@s?Cj;f@@^s6R07EDCJ0O1{^rD=z=m+>s zy@#3Txx36T@2~)U;fS*?4p3j@cU(RQu;p9s-c7L2PZvG&4fziK$9rpX1C%cf?2}*t z46szXzYOeg^h=v^1o_({A7x~3iH=qx@`t~C7KtJMxl$_oJ@PyLaT~v*`~Q`aw!o$d~J*Kthp3( z7Wu8%Fr9SdKfOMT#3Mh#eo$u_iU)O%R%oDg$rJV!+68vzH11U_gmrvT$X$FL$~~^^ z%nkwMV96Vx0R7H$KS2F!%U_*FcGFXC;yle=?oYu;{%ISANIq{-9*%Hj7+(yE1BrP{CXrmb*ozb40wca{XnjOYQ*r!r_86!`ep>sR zl_QD^a_7?JQN7241zO0SGV$bbB>!GHGav|f`by46Q$W4C9&5Bd8be(?Xnky7xFjOG zSmMZf7Tp+gPKQ!MH%pRE6tn=l-cAZ~M?nNd%grBW3 zeT~bLern);Yqw2d*}^*(V^J&l&Uj-%IhIY1yv6(|jAaJ*d#P+1msf>FVU#r@-wzJB z_~QFq%vpcTTUH(P!0R(eaS>N3+vr~L-Nvw?u4fnl@h%`9>QO52FPRkl{iVg zupqfdwS|+saIq254_mbd_ctcG7VGOWz6Ti&BJZR0Y{+}9r250yZr8pOSU4d*(Qe=FdPJ)FQglErvA@)B|C*MaZsFV6G#=WSL!SC}g5xt*`_hBB~MDO~2 z(vKk@sgFn^^VeTP_T$h-GQTNRGT$c+gztY4A@lh8!Vu4|ZkX_S{=a0M`CgKKM3o6o ze-mbj_2O+v{jdzV-zGdF`{1RD4W7S6=r_#oZ={esLFE}Tu8lE4qaF9K9&=#;?(b|Q zxwprvko^8ZE^A!h_~{(pH}~CDFdvtgBI9@exJlX@k#)XsoEht_xjps-?SHqW_PF0E zeon0S-_6yy-mA(O?#Uz{F zM{;?D7|x4}PP8T<+03He1>x2sXY^3sOv3T=Z6x2m^q~{s8My)ngi8tokD_xkwKC}^ z^5gtTjo1#)<^IN~K1g^1=T|=5I?aj3+f$Wv6UB|sIh~l-M_4?B&&^-T@6pNo^yMQAK{Z4vS>L%eG6i5lb+TdMp}d^)xN0|(0IS=F6&L*x4o3Mr#; zhASuWeB|AJ-ADYnzT5Bzil6`8I--F5a%=fgc(n@iRJPiI{BGV-M>ph$m$_KHc?oev zw5cN%-3P+`H}6Dwt{uZWc#vOzS@~lC@!uvXO=X_juYiPC4jBTUR%8oYFQqW2mHwCG?)%(_xYLt58&>l+6GU7mvZgwc#iUjcZyZ~ zj{?5U4m6zxTw!VbW-;)bGx2hhiGY)*T!-&~ote7yh2jto$7^{`A(>aA?&>Ls|F#7S z!>xe7c*@l1KZN!X8|)2*0UxM&xuA8(c557e3H<$I;vp6R$afo;I=SgWc}(o6ydCso zW}{x|4t!?kohuKLz^a;r4DE_!#{U+qOTzhveQ*&3R??QDduKUO2jo4!_6Kc;DvAAoWF( z*Nft(Q)=x69xZUs5Z`$J$HN@3v=ByFhLr;kFA|AU|RrOFaug1SbmJL&j_qtR( z+A&OZ-BnzD`|==F&41#-u0Oq0caH4!i|=|V)|6Ya96Z1epY*MVA4j2#O+DU3!*dhf z|AbvTzn6M7D}2xEaxbMWMbj|4)k{S-#I4w_1?#$H5C3xD{kxZ}WtA%Kp`J}oIrInh zP)B)nq&4MxDCT3ggu_=r|JH)59(VRq4cW{_Wz*f1l&$KSZOz@(Dq+V1hRog6Xk1pX z&8coG_sQ{5Vf7yBq5QX-mn6HXPy287M(A}@r-RszFVX0tOja#%USZWm%^vPkJEzi3 zHM68_>KX&TAR+B~2<(-9es|CY_JN;`jm$IHN4+AAN(%6Nl#I_b#J&aoc&0;~a|HIy zvK3PY;W-AB$J{yr`)b+M3o$JqZkqT5V= zpx>1?vKNnlzK$iQ4tj4TJN&vO3C^XWZCIfw$O4bDMBm53xll}^o5H+UvpF1;;2cOA zXD;%D^KG(WB%=Y=M`fs>lIbIFtbIvtFM% z`d$#m*E)5P`2-;Mp&iN2fb?@L6NpcGR?)hVziTr7{GtHxPaT)=F~DB^;Kj(F25a~2 zLiYuFV~{Q4^R6u0ee1za<#f-BqadezUaxonu-mh~9p(RTUu#=}{8`+m&*Bu=>nk=Y zhwl4X=MKs|g7WCJAt?dCfU2tr@krkDayb+DnTV{-9&cgY(zyif)j^-*n5^M`;0kC)8=bt3oT?=V$wC@pKhL`isFUFVfhVj0R^Nl zx4Hp3-_>Y9_l`0CfhrVNQYtnEBmE^$z89=BIEn4A-lL28r@V~=&a?S^(8s(a-(6)0*^~O@4(9o(Gi})J8zX}_zN_@u z?6@r9~K;&yNPzNQ6eu>W7h@xr#1+ zFC9PN{7Fc=itNo`vBi8xf@MAK*E~K1udfR0 z9;_E>LHH!SnD9QUdBQ`R%ZQzKqu4P|+kS$4M=tZ1=rw&K{99sG8MbTZelM&iUsH(X z%Ke0Iwknc)!QnP0TyIu!3_rKscgX!=Uq_;@V3CjV8Gm?oGm&-&5@QZ!ae*r)|*VM1Rl725;_>yzPdQCh{*kI7C~Kzp?w}!H)c2)6Sg= zp@3gJy)UDF=BAmj9})=cU`KjVEE`ggf0)~RnkNuYrPs6q^IrD37s$Ul+{hb5{oLKT zTha*dvWYp{JMeE=o@4(ZJ42a_G|)LVUc<(M+R;6k@b}!6CO%Vjpm&^Eyc)IVdYfs1 z#xv)pokRXRT{*fV25@FoLCao1mfcRO$Pa6pZW}{+-}paCcM|~DEWU9P`O)_7A=yt5 zKg1uuIE(CR4OZ6L323Xn>C6CNU~EXX2#i+}ntSd%#E-=x2`BPF_V#Numjb_BE^euP z0_1tV;FRBh+Wo>|S`hC!VoPn&cLqAw?GCwvUYZ}zL=MEYJiDJ>xxlw}3{EUNF$MO< zj{WBcjA=;d>) z?4WnGw@o|%_>JIxD$f(*2ED1@IR@-xQQW7T4RP|o^}Kg$Yx=0Qo7+;0pnt2Uvw{buX~@E=$e|6!&fNZmZW$!uVNUuSQM* z?>`>BZFlVerL~CpFSEhN-dt1=&#@#p-N_hsG8Xkid8w# zcZ2R2wXorxL2T71wd2eg=5#y2!K_#Bw~kWbA^uZfc3%qcgV*yQuwVB}G%t zcTu0xpJlnK0uSX&7)cxMqL^Q26`JqwrgUDeI(=)XlS&l6xH84ElUfjNyeoXVlN!m- zTPdu$aE^4ot+~ACDCl&LoQ2XSv4(i-8g-N;pI;c~8ex`m)x+vDr>36$! zc2Pez_y6r|=%7M3-%~W}ZKGnse@lG3-bP)FUh}nUwv&2Uz2kDjmrg2t;qAYr>K&AH zX{h3^kTy#A$W&zJ`8G=O_f{nj!EUPRq?JT`b`MqkZR7O@xYxLGtUDJA_lOz61EzzY z;du&jtsnW(Nxl0t!PDZ{O}#(brP6N#yyomq&CLCDN@HP@PXq8;p@Wm5qP!i{fZyc@ z`G-3xYk|i@!$m!ms(yZt^fd6P5AG7rVL!Efe8$Y04)*Hjj8>JjQ#mbyM1k=q$NuAoMt+yZINClHmUYfL!U1_aK8xt z%dXe!zkJx=LvE`S^Wg7R#%q`ChI>~>_}b&rz{9!nv^E>Vdy|l%7upqY@A_V7{rwi` zRe1!^S>YUbuME|b1pcXaYsI^5aK55reO|gBhWvh4lgk0%_n*9vdk?{TnU{4nJk{V2 zZ0}$HxC!)CqHozG{{a80XHpX{OsA%zQ|F}NoY!~`Sere8z*As7xGciqGlcTjPkc?9Q9L+sGemeXtp8`}Diy@nFFKV( zqP#g}oA}!Y&`gn=55=J`PtMsOzo*gEH1Z4N!4GE7Q2yY|>Rl@kuii5~PrNuOlP0d?d~xgc2AtRV(ZCvr%9)>f<{&$7y1bf1a#@qtU4$Ncc4MBfN=pU* zJwscSh5)*UEF9>-d7}@VprV-)fA;DntmNY7yx z|2(SSX4SDD&Hv;!iFelkBNVvg5nqqlb z-@^;@BR>NX%zr+O(J_x>F381p=58h5LFDZte<#lF@0^9&$I&$~Kl!bF9=|`|* zeBCu%&MTycd0`}TDwAU{rDyF_lY@d@35ZJt}vYMOunLs=dC7Ph3EHc z{|YQ8o?D9BZ?4>p_eDkRB$i8`Ji~gk#m}%_$q9YDJ{}7k@b|RSZ(8yC9h`cO^O%}X z{Bd6I@RenFAM|mXoJRBBo3H!`VY%#U+%L0jF8)rBdopk@Dqp$sv^3fmLYJ8E`yb=& zvqh*p)0l?uW6pPLc(LBau@ST%PD;7q`%mt%taeoXxZfPxI(ku!1l^h_|t0OHwSxNQJ#`zt1 zXN%mW5&nSp|E_aH^#|-+zoGVm#gDflJ~V?cIu+@D|bLjts4B+vjC=R zXg-?G`9Fg7TgfuX%o*mlUck$`zlESLu|`om@DJSYkEy%&!}$K& zC0DY6-`8;LePRpoTX(TS?R(HKUlUMGccxS33X7gz2Rq(cDXHl~|1kn84|OX+f3?Zi zg}@){J{tCGzoo5bu0XjoEO*_XqC`&3Kq0UUk|h&8*r$rzVq6$Y)j1DN_?4 zGu6R9>Ym|#c{#{q4h6qngYt_KzDgHOb>Y4LM*f;+h=WE8B?}cHk9qa*K*cWLxr<*| z7oz-;bX0n(!znuT-8uc{9nD_KD6@SuIu7!hQEigm;gAQl(wmtEUh@55(5fE6QR@1| zsdGQ0$Eemox~$>@I_3RqO`!h{xTj5*PODYYsh@0rmR(piMuoX_E^v+=rEI1?!LOjf zx>qNTujuZj&JTYd++#jSUGlVEBVIE`S?}!mTR%2TJyKoc{C2pPatR9&^r}HpDrJzVz|<;Rml%i?1jg~?EeG5{3$ZicA}ShX^`wOw|0!G7hUh>Bsof* zaFGw4xH>{j(&R0birXmtZTgoscC=CHk6s;)AM2#@PQP-WRPLpyw9uQ@4)A@jcE41@ zU>g<1wzgau_}P}BuaB9|byCh@;Rzwnd#JPGt=5Jt@E$U>+g4(%jbi^DLXSV*Mx~|b zCyh9CP+^)TAK8yXelzy&=keYi>Whi>+J;5#)B)d{N}Q2x)L3h=vyoXlH7Ye}^PmFw zXW_vx$Ftp3-=j6}FLJa~w^?;WGrxmDWcBT)lMG z)&uf)1K+t_c<7W$X#6&-3CJteOE1fY{a}92@}vRmJIS3^>>Yo5DcffD!$;x1!fU(H zl=DA274o%7xgPWcUmUKFg1n&qo5!Qvg*}w^y&KmSsl#*m$>JOd`{|C_qxD`N;okS7 zU~V%!FPonEhCO24RFux!4Zrw%slo7)&x_gV@ST2JaW{;wJijAwI0wF$Nd0K{Q>%-5 zuXn(WeR~hp6O+410QNH*&z)jQh)y}I*?2erc*_$tt}Dl2-%H*M?+^g~qEhk7A`{L} z9^b(@HaK5p-WFoYaK0946zkN0onf{IpB#Yw>?kVi^&86h2J#n~z<#|yv-T4D``-7r zx}yvrkIB`su1pkohnUfKsZ)?2O^_+`{0!&UE$;U*^xeGG$s0z?V&U9ay1p_2yIego z&dj%g!qzYgM|1e&|_Vw{{wxOA)j9< zhx}Wvj&cvmqaKwM2oC}@`|V-J4fT(v<7lyfRmCr6k=`nYky`Y9f`(&UY!cwGz}}DA zU}xZ-R&iI*lfI?4=QWg@4uNmm0 zH41WR+w1}KUBuPw-#9zJ~4f~Da$Qu>u z=Sc6+xy=+Rf20-PhT_T>IfFLDAHExz3S|Jkh`z*(>Xp)4?;^kc`tU13#5XUu$74Om zL<#RYkR=+foxcINx{B=@%DaATDeORcmFLS0aXgb=Oa*{ElV|$j4xr%qOU7t?!w0hX z_km)$w&K5gm(y90gT^qCUv3$NgK*1gbY9>p_<4`Vo!uPR0J5RqtKh1O$(6ZsvbPKW$B)Q&?mB@Na4emW_J zFk1Zrwkx=r1%EeR|G?@h(tGi85ign-ec|^%Nbm3BXgr=-@TNgjpJ^=Uitwz*9OfBC zC&=GfX{or_DMEKU+RV-WEllR^ly^^7*zXF5fxV`4v zH8_vAKll#jRle`m;{KAqCutzPD;_eKFG=MIVP1C1WEkgDd-$uc{Yetvy74-sW#f5$ zX1f!2{l>`o-&1-@ta zFy9PMk;Ttz-PlUZhidzeu0wh|wySZXbyJLwzJ%J>y*+@x#}v&^#`(bry~#7ETqtJ4 zWyD9OY6L=%{788ie-AT%;pcU!(f66raloy93$)OE&Pl`!|9$wk z%NJ!49}-C{>PPnE$(jsk0Iqv~{oV)ATkNSbiuN^k^d-z|*~a=GqW%2raWMYJJ5FI&IZ)pWHeIoKH#20Y5e!=^8ux8cffB66gh?<`^}nqO7;PkoVD2b z5%9rM_q8`+yu!?wdZk9-Pg}+-?2w%`HMP&c4+sg_+>8Z3Dv`zd*9-jSbi((BkQsPh z>4*K(K=09ifA0H(-pX0q=N_Q9(plQ_9{6GInm=!LOo4y6HY+3m^<1qNTvR}RleTN# zHRwme$K`wg*p)N$xGy9F?rozzTx+5Iu~x0o3!v}1J5eYKu(K|G{v7a=BU4RxZ-5^j zG5%ah13P_GH}JK=ICG{I@5`s`^OZ~C?6DD+OykT-%E!_86MN9A6K|bI~ zb;1%>;60nyPrhW^PNxlRZW$*~BmNfqbCAiWQao_aXl2RJf?k z_EDxbdunu);tug=79RRR zStwRoeS0RVW7OxSik1u@Z<|aUI z{@SgOhkIyta~&s7J5?6gxRLE=8|A?~D#6j&M)~d!7ieaO{Mz2d9SZJUl-bVHY*no7 z)TKDK!Ye zG#^VlW%jq}uMe~zmf@0<&T6O3yVZov54BU9kYg`(7m+dfHCi=@CBJ zMdjaT4k+8(LwRh9Q@ZmG;`nt@Pjvx0wY>jn75e+eB8Rx$1*)CYpXF-~ZJ&d@qVk8g zn}lGWu}8=i?x9m@>Aw%nv(l+g5|ag|zO_?-hWMU_Gj&p5NB%DQXwyTbo}0?s4d+48 zmPP(Le6JvG>7$)B)lS7RrF(|3bWlnKelAgkT~uRYPvobrUP{-*PX2WT><{Cu(x3c0 zC^^HC`eTbbsIQglC5~?HqEx?b*=4HLOVy2!r8ZjwPqcnOF61`r$j+#v^@th>`Hq3UqvY%+O()17{i*l#SOEDt?zE0v<;k$$zj ze>dVmcSa>ou!EjSeARtp@IzvOn|Q=Q?|~KV{u-!PD7*UT3g|0j!oRqI@j_Gz@7aT1 z_htE<5U5Ypb~oP(`e*){9#I0l`E&8(C|rGNsFeEgAbP)EUAr^~>0fe)DgFR@XL>>c zKZ88u!*&bh>oOdF7$P1k7(C{V@&k__z5j#s@7zj}M0Wod@i+jX-FNkVgx$s+HxRxq z?%#m)P82=hL~-fI_g6l+o=*tBXG`6efO*p$+X!70_fobo{X)EAHb@f3W1HL)IG&5_ zy?YosqSMuL?{JTL)T=7vz_S#U5 z|E}g+cOupwzwC?OCvJQwa{%#z_N~hwAiZ-(-rzjaqIi-&qk9(Nyp-5Yo<~T}IrQ`i#nb>(0t^e9`qj{t^v2jN!I-l%*OH9#xv)6v} zMEfp#2z2oEoLM79_}!IdwUNc_gd9;x8b}V3#(=`20u5_z}&YN%Kr!iH=}c* zqg~mC?r}-#kNMAo-U7Mip_jm8(vJ_fZ%6HgPv;RWY;SWF&_Sqh7^miRAFT7g$9{lX7 z(G_?5AP-|_Z*i9e-Ve&Mn;Doven_)*cgralXR-2eRc-J`@Oy1_HQ-0bl1{48roo@S zRMj`RO{ca=1T9tpzwY<=q^mmgC%#I2unF{J6~5KHVWLwec4`w-@OK|3Yt&A?0{^RO zZ0fok^uAoIHaP%#SKbD!{sZw!c-I;(l)gK#guh|FwLtMrD+s1zCUh4bIDs9Nm=+)CN2@gZu+HGyWl1^p66uBe- z@w9#~x7yR7e(KFb``bDEBb0g1XurXgA5_bLbV&=$OY}_9O?^J_L(kWh-wErd>a!`+ zVJ6@$3*%Exs{WvED64KU_UxdF2a7937j;l3?kX`m*LP8NXP@_PJKjsZu|I8Sd>PiE zyH>%WzJpqGz0O-&rGuI{($kgN-AQ$Xxos=y?4kb78Sh)X3H;MO<-R`IPU?YmfB%D~ z4ysk^+PT1zPRjF~LMX2cyk8TsWAP8_r9zBk4E_B&DfTd9`%$edokeIQQeS)52cL zf9Zo`uTA&_3;AeH&~AQY+y?d ze23kI*HmqYLvDA?d^jO*VbWimvIO*0Mu+_zpnSC1sI36bS>nz^=_v2>i#M42 zYZ=^Uj_RL4`~R+OmajaZq1^!MdeD2F+%jSS{io2(m!BwxzqfHpQ%?iA_IdKRjc^W9 z``J6$KyU3fIeIgUzv0f@q0>*&(GNak2r^9A*5C~^Y-&h{dy=@P_SEFx+gP`qe6J!^#Yl4oxnhz2~svB?09 zqy9(!3!3N14*mB?&vB?R59z7x>$(#Q*xGcr7R9fOT*tFWuix_EFw)brKbuD_Aq z>BGx#-lS=GH_mIsv0labkir7blSnU3TI(tr-)YSxj^`G7E_htaN%FgFHIdRduQYBS z?uq(KAJ~U^g#Nj3oS(_Q`Wxq=9-mu*^)h$9!M_&}Wmmls#mm=b-7^2<>dND>dcHqt zQBp!7l_ip7Ns^@+DpA>rsO&9dDI!z~Ws68smJlDi7F(92LbjqTQI@hj$o4!)gpl8v zxxWAW{(8S==G>VxbMMS~&vMV;atvnV$@#&9EDu*=`y1KY7mV#?-B*t*ST6X@KhQ&+w1$|1fZyAyA`gFX=}DJes6-F$2_s!H*b0^iur?> zmoeiC;LInFXWIeCn(8Zc08^JOO2YQiU()*EA?Qc>(z^w%0l%7Sq~LR$Zn_bV@ORnr z-@AQvfO;wihgBi{r=apM-uJPvUNp)D@imRdbIt(1oT%pi0Ql+2Yb#NZyGp;k2A31) zku)U@DCQ%11L(ITSsJHDDxRpp{eV<#%*>hxt(K1YNo*lpbM`?!(`U_8d0uxzI>MhkBnb5@DmE{?M0d z_bR*KzB7eDwYhHeFfrqOsCO@VuRoi4t%rtME|r|4_jDn3o!V&iZ(WE}C-$Q0u^u$m zQO#3O*NdFLR2TURcI73^hrv*ydWdf1=g zcVs!R6UM(4Z(n`|x#NN*c_)iZCd*o3ka1_SJ9`lFK*x}qz z+w}B($S>;+gX;vydB-9>E1O>Al$84OA=v%Qe{nQl_&yIEbH0%W-|G_Q-4R|e|CauK zYW5MVH*H&+d2gZ=_JhMZy#6kR|B9=OGCRQDv#gYixdh*t-V4#dwO}t(GQ_oSLqGi! z6ZOa&`U~Gw%5zruF6TGA;faKJ!?V5_M(aQGXgLq-O;hk)dyTGDRz6!!_+gb~q zK<<5p_XQJ>8#mi_ekp`IR(RJ{f?S5_G}9uGV`krQ1OE>)+CBHQ0@gP;G&EBKV7+m2 zo2|=ju=}pgVP)Gv&SMw*8*%8*O8Ww>e4t+Jv)?X%gM9eAm|ILizG2apB1e$B`SFYY zJCNIHUp0&EH;SqkSB8E!YxJiC+e=p8s5f|A+I?`-vIxK@8!zgt0t{&jI)Lq}o^@?K zw!3eBiFf01`ABBx0W9aI%G}BXXqFJY9D$sl{<;@t5QcLq^_CI7khvN^3rq*NoZ&LJND-Lhx+_W9b-7(F1fbG5` z`#Q27Kgeh0iS0hJ3^u{}Td7LD$K~z_NaV$O1}mEg;q?1~Tgd*9j%i0M);E;b&>qWq zm!2c`(n^6&?4@7jA7U>T={6YR@)&1W!8Ii8AO5B0@2r>Zkn`_NHcQC)jpBRpR#@(* zp`Rc|S2oID%BRa^Wd9@Z-BJBQ)wCRiUb79PXx^Ip>RHs)t(f0AlKaJtVTaxTd1okk0m z7uBnb##mle6O7yKjDPuhC%|W4IltogmHbO%F}mD7O5_{u^2z?r@%+Hc_&uJVqt5;0 z^azpjKWz722VwbfeLiyU3HO=NljOY_{}+A?;`t-q+akbsw}x)C1OD`yPfvk<=kaWJL~?$VBBia_MZ!2<}QgzJimW!`tY_h;EpHih5JBXd$uszA=qy?vcvkrao7iD z=-Bo*%tJp*8P?bZ_Ojk#cimqYUpM{9v1b9h&-rgQ!~y0zdmY8Hm|*;nkl%7_zk46* zMTVJqkgu}+#Z()}cb$CN@Aojyymb}&Z2{w`Sg++PrU{J7zweiGiAM8V)42;))6#|}j&`QbSLOGk_aTS3?l!)` zz{Bia!)fsUoXO?w>JCQ3=&C#oWhXFDzDuG@9PE=cb(^!*!+F!m8|5CX7SN9Vxm#_c z2awU4FTGaRM^VlR!vn9OT?DVS+ls*W&p62wDGBQaO*!s||7k#d-@DyOmhMOA{6Q*ku{$m!tH9 zkyJYT5C7S#b&?K#Tz0(iyiG@&m5cuF5@sOrH*8$jdg;hQmOk}uijK0jR-b)yk&Y^s z8b3|3qa&e$WasgF!|21X;<8e?VKlVoLF>uo4D=)*6Bb12Xs7k(bHCb$5c5)_w^CaN zkZRqx7x%U@P<7nD&43I7g8u~I@9W_%$L+_TD zF|YcMhJJqxX7LWCp}>?81JiICs(kV{`IkElebn)4buytL`t$da_f=`Ahi}CCav2S6 zV)j?~`Iv@^70hBP>;N_2uFK}8q4+aTo4Rw0giXXKe!D z1%~3`r8MOH7%eIUzS2?j;jsCVZY1gcfn)jlZggkEc#!f#8nUZ%3X_8JH14z1IONe# zf}eN)_g^#=ZU5|>YF8Js6$;jW*wlseRdlS;$sXiqwUni(u@@B|ITmv{j)ru`cbM?O zI>%_cS^Uk-G^CzAoOKn}0eqUa-jkIEyQs8SLvI}oeeE(E?egwI(IPoJwBfwAaL%nq z8d8N5!Oenri7#4u)sL8hP|ecs}J2ZX&U$j{KzmdLSbzMoNND7$bG07c=_N) z#Q`{fzuNq~TmbNBv8`uZ4#W35Nl#v~aXYL>DBq1gG6wUb{Ksw&fj664g?Q8eUvivj zQEr8Gh$7ErhZ3NF%um~8#lv?jy``6T3-p7lzMZ*ZFfOdFV#*tWabnS)2e1hR=lq|% zV@ZN_yz3FP?FmrM#VrbqO5puNlh?051pKi2IuG0GKJ=N-LN*=zh|ngw)~EtcYg>Ji zjRW#wYF7JR3H>LbFT_V0_)CU!=eQ`06OLW_>E1B@wEnP4y9VQe*g4)`c${p`jAU+x zarIE^uCO#19~zQlOeP>csQKy8JeG5wDaZRJBUhjBDgOk1Z)e@h3Hdz>lPh6{ak=8? zksU=K&pCVOItR!dRW)yGgY=b0yoUb5^SYWQHhhr2E%uK<2jKBPYKoG8jN5^arXZb7 zAnKAa;5GgdN4y^L;;GTFH{jjmt=gC`<*>T4;s2RKQoqQn4bx(u^+_aYk}?IWXyL?&nlh9_V}A- z%6?Wr-bQQkA0F>o5j|`#(noq)aXt@x5+|`;zWsW7Wgy^8lWHrrGicrPd;I*bO)2EQ zv;?I>A8aoVIf-4zcCd=$*?atarS^UD|Iw;8^%7j)LX~b}S7)7M{$idd_@z-0=X2@M zEb(u0a;ob%w!^}-Z*~~pi%v*mG&@q!g`d~UH2V*S6ZmroPg?mnqaB9>FBJU7yo^Kl zNBbrxDj{>0HhojEc7w5r19Nd~Jic-TZT?{{?F^ zY6y>8@qE4n%kdj6x`nZ3{mm;FQ~nDguIXa2IhNlXJi7sxSNPx+Iq!V-X5bN= z9$u~=ioY+ZiLd#%AIPlkNWtY7eOV*36R_h{iF!Kp&&`36Rx_|JeYYm#=1myK-ot zbHRZ3fX++?>eoO%oZD)91@O*;vO(fluM5Xlb>aT)xa4810boO&LRAwESDz^U3)pe~ zG#l2ptG6i{=X>bMi5ARje}28VFBLFBZHoRD^iE9-tlta#aCh-?*)zE?Zp?dd4)VZ$ zOxWXSj~g&AbZihAO6o!F4~m($^};x0bZ?6YjNkqV!BtT(K8x&}vR?#tV(6FD=wJ9B zf7G@&(E{2*Z!l)D0gTTgHKHg6c_2RaEcuqUPaBv2~D2>bC z2kh5s%l^snr@cs5lBw3rVGyOhxFAsy!9b5v#UgsAhLBTJ(f7EfVYD%DVy}}mK4o8@R7cb6CZAgIY+zib8Tw9-5sR&9MKokfO=&KN{1 z{FZng0=pZ2X-{T5yhpP^ZRtJG9vr`Uaw}zFJbakiKVbuQ^7a9~xqS>26=GJHyqJ!3 z>o%6t6^9UK_FxkykcLk zqHNCkkhfA*ocdDqj~kCI+j~|kn@9mYibw6y3Sv(?ECrM$Y74aQ3n6HMSgv;$4S2%U5yJa z&`jw;#!epjKV5pz;Zli|sVzOot|%~@sj?f1q_|j!-Uj&xUmhoj^`f58lx)AD9z;vH z<@?pO2mB`4JWH4axkHNS4?DV%jfg_Lws|l5d_j2QZQx(yDkw4fUJq(~zn^hjwFmzD zR%Jfp2Ir~*6Hi=b(9mGl?Vhn^ps(T?Q z6F1F#)$2xO0&mhxE(32o)+1b&Nkf;uY2Vci=|Kd#Z0hep`|*~1*e%rGjby9UE9*IXkyulWysb0LR~pL?o(6ss zeQr~coo^4?a9^Th;%g7$&nn*Pxf<3TlGNx13|RL@^tCL&6P@_>-7kMbL*+@Ic3n>D zMzvp7mW9E8Z@ERm-VJbmMWE!>t<~_K*xtjHmp^-V!}<6Y%gdELDF2b?67A=}yN=6- zv_d|E>$T7Bhw-EDLSq5#Q7_W?x$Vb?JFp(3Y(MJu4|pBBc#;Q<54(M~Wb*)@<2z-% zO^FWY_}|#u3d{lj`Y66<4Ep;rn=bn+z~d&T#CK*vzc;ZGSIdKOggdWEn|T1nbw7`T zrZ5g{=&-taw-kmvpqB6Tk@bC_8ns1wHC^0 zyWD$X6yonPk2PaERJoNAgzccZE9;lvz`y@^m|w^1Z2fOJZgd0w_jK!{t$>r^=P#TC zbgbYgF9u}!Ic+x#=s);*2HS-Z-lG$^yn)~){&-(2pC0_-AK=V3JO9&wo4r{+5I)JS z+Ikhjc7Od|VY}?x@nA|B@JQTG1B^TTEdS#4xq@y@~DgnX%^Em=B&jVXB1r25oMf74zA{Dsz_D9!o})e#Uy4wXP-Sj7|OKx^caW z^7(Ro0h`u6I)nM;y|Gd;jGsfxiC?_^d`>+$e3N6FA1?o?N!})Gzg4yVau+_XUTGGPL*N zbn&FJ35><;Gi2W@N`pxr>zT4xKmo@;R(gyic{4|{yk0eq#Xh)sQaN=4^j1Lwxax-$%Rn)t1tLZdtiQ*$kz!^625A*j`BxQ z95qF?gC=!PiGV*Rk$d=ykMLX9AO=bQ?n?PNb`7QcO+=izI=ka&kogP_k3OIA%5Sb4wW8423%b&ZplAI^6y4X;G>zUivej1}Q z<0a8^DDN(5mq^>Yq@8H`^`ZDV{l>)mSWfdF8%Y=3&P?7nm)^ZXoc=qQovZ@~I(3ot z;zg+^$n(`d0*So(vmInUFe3Ane6JiCa%6qCV8(6{?yos>OS&+xo_S5@$2?eOyW=iB z!10}T60v{L-^K39xL(8i*OPHho96u%%ik9?+O7d;Tc|TE4j9!X?2Gjb*k(`4=Ul8t z*6ZD(b}hy7>&N2qP61jCr|Dw7GuzLS^YK6KY}Ci$N#!lSalhvo@{7mgNzketWWD-v zxA|_I{x@g580VkhVEF~>Z6xAdi`Q3Er;lY zP;gO9UJG91>joW5~Lx7u{z%y6*A?m?u~leVPS58!EPNK7e}ZRcF7vHUsv#O(m>5uo8fc$yzn1GWdw_iw zk-yuQ3B1OfW4;ESUq2Y>e-h>kt*?T*jD`Eq)fdekHz8inb@?9UyKsJAGE#ztZvg3z zA3o|2`_1cLt!Y}x(~lIMUt4A2*@tA4(sylF>O*0VFLWOOeysQ0f5pV70TdY|(V$F+ zb6?HhUS8nuM>f+|-e>dske0~CrhgCmkyvH(V!n)iWT5K$`{4C{r1Kw7iNNB1WMZ^@ zb@6N1_tfw6lt}}d8Fpt{qXcNf`em7SCcfHID=6jsJf@K%fVBclG z!S=L5@S~w_RZ0W@X)ThK`esnRo_GA?&ByvsDG%$1s1TSxYRPWTgzs-t({iu&>%C~v zr>;AG9_+sq$Cm!H$d8v7WdEa`N zkN-J?7*5~eKEM7eg?JmmL`-uVk z@N{8@1N2Mt8&AasA)F)^bb7}x=qDS*>K?(m>1e!n@iE}FQoco#LwY@Eydmp@*RvjE zxIS)~ADlxNAH1O>4Ea>tISSbjezteFADUSKyTNN z!*~5)919+}e{g9n^i%uE9dzi=4U<=n(V#!4#ib2+0FRgTY|8%wJX*ZD=pv zcF~6skX{+X?T-2JW;b!J=aBCyBj$G%kbbuLA3ydFG!q;90IuriZlC7RrbocLvGeY@EI7)dvpTub=qh~+K9Tm5z_kZ@(gUXuTFD`^rQKk7=-ojwbZ zaGxG^FNgPu3KCv%<21>?Ig6Eqf2vXUcLX%YlIPwQQoR0MH-%2F6u;klmg3*R29zJW z?uC004|!2?e;4k3`M7Xz%GnokG)vc@T3Wb^nNOEOkG5@WdFY|1J-4 z!mB?n-1E7Tzlr42v4yIqN&~g-Z|FzeudVimO6TUH=4aN2sQH$|Nvi!yOtzBtd=p6d zdtN3&%~PJ%Q}d#f#nk?R^=ryMUe3b3qWlM_dOc*J+Sw$fi|8SBpDNEm=N-{AZIJ@` zu0Gs)K)&B~LMlJ-_xLC`X&3(P)QzZli_sG5{Kp=?Vx7gK20B}??O54%TpWg0P&K6aky<2XmnPZcH# zh&-1bHP4DIE+Oqa^PT$c{x!yvdDo)gzjJt83A8C%h5P&B3{zb^4jo0KStkG$M_bAI z{mN~cq@VnEU6;(auexn{itE`CC|Zceiw(+aNxjUwg~@oa@`MkO+x_qj=?^t?%H+P} z565ni`c)-`kaIU?*$reoVATB=f$OO?W?hW+xn(Ow^ndA2`73nRP$&J9-cGdd$)zbJYwI{ojX=N zhJ8`BuJKvm2e(ERt!M?_dB7z;sRVdzsH0Q*x=G+`o5GK;gmunEyvx$Dovb;@)g%q| zsJDz7Q?m8(I|2Zh%jVZRP`eJe&XL4M4@k`w>m$TDX@vj&vs;n3Ld4D7Mi%{y-% zz9~bLd%Smmq5?s^2cvH20hL8wp>ew^6zYueT4f@)UNLJ z`2D@ecf9!n^p*Y5eO?3f4BQ!MQ4g51o!=L~$GHbTHkJS$bicBA8|WQdLmR>C*H>PA z5BLoFOD)se69?&HPtdtvkUlabvm2kAx^_9^%5LD#N0kBtpG*PY^v$`nV+{D}t6SH9 z0nh#+9PauH<}p1Y_w3_9-^*R;YRjRWk6L#7#6bT1PK|3XL%r5#@P9fE@|H)UB6%Qw z`*&tvd@d>G*mR#5gg^Njmb*i_vg)1@YoLDDrw={H{?T?{^3=-#{IfdTIR^A$sL3m> zgYeNWK08{We!g?DmAw$&&&4+?3+Z0VX71HMJ+5#G58(5ub;AygmVmOfWF>!?7tj3t zEBhJdVR=6H%<(xE?~TJoTcLdgvK(8mUo+cf7j~M#yrK2I=RXn1r`&ImumgNQ5(8X% zg*Y71wowG~bF*X*#^3o^w$Fh(P%dX?e=@$OG}ztOxDIfK)5dMLK)y)x#0NaCR0l1M z;s+GvYtq2u-I#Pr?l-_8tpcMEz{pB3BV|ZuPP@Mvk7N29#@o3;pU)6Q zU4Z?!IvYYD{%(*&>>qeir>0Fcp*zw2Ha}!{A*u@TfZZ}-=@DUaW&(A5J z!tXbK=E&GdK;;+zoyFgo^3C@6hk)_4aLH)E^<@!Em{)J>+!}<()e!fS_wfF#TO`wk zKtRXX@GN6MneU=Ac-*>lLbeQ#=NUblbFn>It8(g}1R(Rso&9)xo!M{A?gZF$^7b8U z-%#(tX^eT=mYp+D-@fBrKk>R#rI4@~9w+B7`VfCoXEjS^@i@&X`(Os^`KM2N4{nF* zl6$Fm9RFJUjuY$0_gs|t&r*M&{Su!eIriO&_*LK*t1-g*O}*kHez&5=S9M@}(33Q^ z67zO?+;ef9o+x2(6}Pw8zGz3B?sco+62>?50P-KDnS9x5TwbV&JXuF9aJ93+=@&P( zOkq6Ipecmw{YF)`mgx2Q`6nE|ep3Gg#>u@iVmN=txr!CozHx=epTS|L-d&e*`tMKu z^%%F_>?O|~c>m=;9M03%xQ4O&?q#x0oDh>p_{L?8Ny59sS47$pf2oc2D&Do6@QxO7 z2U5<4qV?pz*qWRVgvWSUULia~%jq=9N9NycQf@DII6VC(35lU})I(5&;s~?m<=$=H1pSmyHKktx`OrBqLmO5uV6i4Z`S%TufM|mk;d&GkB zzwFvXJ?||>@nrrZlpOzVDjd6TkNd3!elO%g@p%h53hS3rIIu9UfR{qmV*vve;#qj9 zc=!lNI($q7T^BHE;XcV7x2Sl}h4|P799zKc3;8Wun2&@m#KUF}$qx>t5QLw+3C=F) zKYE9%x7$3$@3RW1c~0qhYQC^}F@-5Jl-$<_>iOT@RJc)&dX6QDl8X+c(m!ibX!e9c zy$MR5&Y<%DZbroiF3f{0^r-Ojw-jDTu-onluq!jJvHCSs4yn-rQ0Yyz0#<8l#m*A z9!so_`VKW8Q1`pmT2SA^>4kc24W;CzbU%@N2eMxiy!wNx|I3B_D&d8DT=gue?~K`p z>OWam{Yk%i7!^$Vog1fHDjq+2#9Br${xpjqJU!_WmG48_E+Q`=Y(Vs$QV1pG3D^b_ z`Qri9{LriW9EsmHmqXeK8akBqec`T+H>$^-aA_C)w zi_|@t2cE4ZeyvWa#FKVwi?t@>TlU&NAF&5f%Q4l&O!E}&ZwFZbQaPk z^R7%w`C%+~d0z_;F8^pAOAEGdBYANic;0g0CGSDZ?`a%%r|~+P^q;vj{9l>n)j_h~ zW;DHY3AUdHjDHim*L;i39oO?H(>7O}uVbAy7jB24BkPoK_-@j1;?LCS)oxOr)${%# zY`-rG{3QMtSe<5wUvn0J^}ASa(|HpeY^P%87q7+Zb<5wW#F2J(K1}w*_Qz}^_A7|L zi3hiHxZSZ9yuOvcsd6j+zvjY|l}h-$=+=sgmF~dnBu`dVNdQmE{(5Lu6ZorEK}jgq zUpQ9c7CvVnlq}e}1W-ZGMFI0;6;%tb8}NLFTDlL;cc^fm5L@b>{~0`l#yG&P1$l{Q05D8-U>) zvjuoP@d+b?oHLE6^>f4F{Q1j9-N5&vRRYX}K=0GMBMy>K&Wn6Dk&jTH^_BnSa{;fa zaygNt26`qbw|>Y19F^qN^94LBA^#TFKm6j(unx$tCuv@k1JLiqr;9>>GRvQT!Sh*9 z#J4vR(DYxN-6Oy~x+0-?-lwd$>=xGVg2=miysjF${G>eQeY3Ak4&eDUOZ1U*mJ4=v>nFyP{QhOk zvD5fHzOvUz&;VrLC=#U(DE45kX)hq#kLzpk^Lnnj`!GKojz{N$0sWJ{1Y*5a2UVZn z1^jj`nVh3I>pw^ShiMpK8nu9UZf2WJW`K^n95ok%o+gf&HxC0^ZTw8z3h{Ae^)IC0 zz3dqH`wjcOV%{I1D-ZF~k^XY)00kuTnZ7~%z8&Zx)~lny)s(c;H|;N)5MFtYNfPUQ z{?A+lUhkcA`Yw$1Im&iK9Dhek+1pNHeOIcbp9}|deXsHe$M5d$uElyuFnmq$d6VTm zzS20n;_IQim{&(NX37`<-i}zh1oPARS(zIyfb_fjH@Jd6cj&aW*xz(iLDK3ifE#_M zmn%YgqxhJw0N@?V)fTaUiB68a?*aFu7+=GDT@yxZ=Fj{??D;7rCN+)pA>-+jdT{MxFZkM%1k-Sr*6 zZ`b~{r*Zw<=QnuZ=QSExHsb!GbpQHSoX(>b|KJkf4<5A>xP7;l30R#2Oel)B#raAE z{N07+|F~tZ$K#IL#HSoQo_rmwIgitWEb4(;!2dZ{W!N!tsSlI?rUn-WAgm|<`V%@h ze!_~A?30(DjV9-OYrGBw;`r|2VGpcF&h#Z=9ImK3#)9=pa9eW|hxaoTko|t|tc@%1 z_;<9nn%oa|^*cAQZ>!rCiQP%AS~7^`12m#7@$&*^cL%XNT3vh&$M?y*ka0Z5I&>3G z*Vfd&h|}5L%8_xqa95KTmXkggo%)iLaHM9+Ncp6AM+tb~`R(Wi)=@>{)!$jNV~&Slt}2axr6>3uDvJ={)E{8(|j z4v|}N*Och_!Fw^W%X11lh}@KwJ+a3%lhpcpMnw_PV=Ry2tr9EUNxIK>VInUTSW3bV zuKJVu>ut{<`TGk}`I#-I?E8Ur)cWdCZ#Tl*8O@v5KJZ-`vN_McQauNQb>9aaC+Y}ESp#(&iLcdJ^8_c2~l=|;6wK5tJ^ za<7%B`NRfaDm*+%$q6m2gFjo?AGpdy#g_|H&(|;T*E7ed@^>DkaN|J=!!}a9Hu(e< z-nYQZ<@~6y_a3Ue5@#w5i?F0VN_QzdYe69_4wLxr3wU7x;}_-&E(_tJ1%!{3$iqiN zuwemJ7xppW<0bL%(GdLKb3nRC_`m|fOC#a`kN?xBbwM5u`H|<3F6aZDm4xBrCkT^og4-A5UoPnLFo=5pjSKTA`*dplU_3{C?=o+x z@B7BWyilx{%EvI3dM+i3nn$?tQ}QhVR5~~pBjrt`QmFfcl8;)LZ!|88Cv5rDUA=&l8cb z!xic~y-@g>W^RC^4iQuD4~C#iAZ;9KhdnDs$d$v7Kz zDwFKHR2SKe;c>fK_XgPyt`X)Udj4}7AmgcT&mS_L8|CgK<$kX9?7{N8bEtjD>_lA> zFWE);iS=rw><3GF7Rf)~n9^%tP=M5{ou87|a!x1t>s=Wp>owmSsrl9tSxWDt_o((? zrj$eU(Ok<$%F#Z2_ye{dld-&6*j{re_kYIWBYZ)c*q$d0{cOhT_{9xMFcbhkY)vBL zbXA)l(cAm@FqsFk#&a*n&%X&#O2l$v=n1iZEY7hBIQ;fz*#O3;k(q%w|GTArB;DHf zGqG1G@zl9g*X&Y1ET=B@RvIJcYZ|dfj;r!WJM)SAk@*yV<;5R3-T3qmQlHm0CVqIn zkma*k8S{ymI`&#TpRzssZ}J%6xk9c9%vY8^PA7irUh?#l|K|m}mP%mx`}*RBm=BpD zn-t7HV`R_4Ck%QYW7>~#-&y`)oL*?{xeW7xuiAWe7_ARPSzK!?7yX*aSy{h?nAZ73Cy#< z7bl#{1iTdXrRo`=#G>eJn8z;tmGcG59oz9h0k4yW2r#e5JnQf8`l73VWzrJdn9sRz z8n9zM^WVxi;rH{1X_XFsueQ9KSunDGG&k(u@~glMc)GyG|MFW zn}=StGVuFQ{FJpw2QWrhR0HeT@-uuGzX$8!SL7b>d_T`j{60fZ8;;@k);oW78Rmb* z!#grC|9wV#z=g|8zS~`m^_oy*Bl>pvuTaL}&q7(Ja6KAU>?P;Cn@xX_eZy-8OUb$~ z<98l6em-Hj;%}_KU+}$Hj7N9A{fFz7y(**&W5yLjE?vNjZ(gP2^Cka&EMAZGUz-1P zInIBPal~o7?)<(urIE~6!E-FuSN6d2M*RG0`MQ<39lcaq&tdsUUS;A3X{X{{a!=S; zh4UXApXwK5jms~)RYk|orLia~VpRXL={5fDqSCo|a9C^cM$$hT?%R<0{D^%sId5vW zbbcj%e(JN=T3oN|ySxd$Y2bK@;}ZqGy~6W_B9mvQaQn>L+aASwsx=>&#`zy;zL$&R zAIG$EVSJ`>c^8h~%B*gV%jKmTHR60XKXDJhSTwpg6UX=Ns2j!kJ6yYIisS#}$B}jn z*7$i5$A@S9B>eO~vLNfmZmU^!ar_$Z=roK&&g^7dv076@#ue6c^Q1rJr!1+(={z5T z$hdJahzlqH^cO1@Til)jk4$B7yD>*?y@BITn(G#vjv_GJae zv!_jny}BzVOUB(PI|G7=%uh)@wMN!wU^x%9N+M^h=|aZq!UxYuelgO?ojBe8o-G;I z?R$fW+{=Rb*EoK$Z!;<1d56Pu9Ik%6mbA}b#ml4|O}X1-{EnqF6HHneP0(<$8cENH z&LiQqm4yTaLMS_!7f9VVy=8m{iGOKM@rH)jITH3ue?@T5-Tg$*XU=IP%qPS~^tW3{ z@%q_WYQ2(W=`Ny|#K16-SG1>icV_E<YCZjTEe{E+tfuT-St_+odhs=7r^3vs zb-%hq>R!YN7Rvrt?*2;U(@5E|#(k7MK2S-`3&NID>82@EdcxWT9=(sUcWlq8u=oUZ z4yWiQ^?dCDpWBv3*;B@Ps=Vw{inqrUQ#|3FA(hW=MJl~so0@l6C{TRj-Cim`0Wm6{ zY8^^m?-}(xhYOXyc45BoVj(?cA>U9@>ba&B6#8jW&qrRNFyJSeh9b9@b74A@@uzO*?A+o^NU|XEDd&0sxKK!If z!Z#N9E_8AdR$SoMAKa+$-i7DESd(;cIz|u%b%ImI6z*Bz!9xq_s~6;h7x0@wX!wdG zI{MXm;)S@vF#7Y6sqWfA22y#hd%3B70R2`>j(F7BhvwMEUlyEWpnHP_Y&2#%s>xJW zL7a5tRxTc(jfTLV__x86&j*l}-S(IF-GjK?tbl``w{O|W>?lb zaG!G7QW*uf59EHlJ}XZN_zSxw5LCe1kLK(~*t5V7$1jdw{aOa?XkgxQzHBe}bNF>z zc=ww=q;~1TM%|!3^zPi4rkd;kVzKEzymDVNNd%(Hc zn}*pJKZe4&>0y`j+)te-F%G$fcy^=l_Gy92v|hwyd&Jx&81~V{%@6awfbrT$atZA! z+@p7W$lhPO2VGyD=TX!ldbk?=a*3`q5A5hgkQmD{?J@8_`S^ljbfCg-cwJHchJJz>q3^7-mS=HqM^T|$-%d3x=g4VQ;O-ehoqZ8cg z9$xY2LP#|8YDQug%1kO8E(ZT%DkkT@TWNnqcPgGseOup#29k8nv&VFyF9*}r)`CB; z#N~B4W!zneZu(vE7x)Q1Td*m<>Qfg|)p4EFG3-QH{JwTwq3!5w&AY-?cJ0VqMl5oy zxC=?8YOyV@=t2xVkI`Kbov7I_#!-l~1HEJ#xKa=I!zjM^(6uJK3t5ks+?u}Kg_v*t zS@ET$6J3?#5jDvIf9S8h+&6*WbbqV%zx(fXp{OeRh!)!}v_{~Ja!_U`5*e5rY|igM z*6}+LFHZ+D3ZK%7cY=Io4u#z|=|Zw+f8N>uxD$m)tdn`x(1A45LJiAQI$)pMu=J}- zJK`M=NV${Kj#$}0e@cA^_s}HD`3!#tJh)HU<6k?v({Wk*zw&FsIM2d z{&#Wk=l)^w)_cM0I#7*zsN(X%c6333%eT3y9euy1=ElX>f$q;5@~H@Pp#EL6;Wxp* zd$Z}g!aR`<@Yi~+s2|D^R8C|z+}D8=ndF`?mF_?%%cp72mq7UjdnXP{LOZP&kt~zz zK%1-%zHo$gQ%SdcC+69K)|GP)Zrcv|s;n6*6YD^${FLOhp}fo1W~El(PhL~5YVQ*8 z8=qz9&T7uofnGWJ7kmJHw?=%mI=Q9;m99mHYi@wQ`_R$cRJac^?$fp`6TuEdACcd& zcQyE*Z)!aA5!$83!tlJ*+YY4H8}@jccqdXdGr05{^ez-cod=e8prcxE!cEshz9La? zyy`m;|I``2?;sZ_`X~3UR|ojP-&7i2*nx}<-kmQ7fAvF5-mU+scA|HUr`*%_ccO=* zXDi-313f#>#jT(1K#_0gW^E9!o9YzccD)nb(l*O}9M*~Mub46sn(091b@oT1B|4Fu z*9=Siq3W^V{20{cOjchlT&uk?;h(~F4KYj(0-?UWW1phC2P%R z8*c4FCv|K-tc3olIBr&2{;~@RTdwrm1bV*93Tu1X*@>P$4Y;Tv-Gx5wKib0#erPO~ z-Q3Cq{{A8s)j6d#ccL`@`}>&YI#JuexuxauUFh>;`uzgCE;L>G<;mH|E_9Qn@NL&R z7&m@I-SOH9xQ=5e^i&u6AiL@?+tn^4ntkDD{lhLacv$Y@(WEX^a?UVl82s*dr*F1i zx}S#1*!t`FlzfSe(EQMep@b}NmwJO(vhLqcG7U@QTU&57KA2XnQ z>;E`eb)no{gCi4v;s5HBO^tJD;73Tp?)BnpFK8%S-A3~Deb84a%jzhML##XdQs3^T zp~a-PL z@hp$jNWkmY)K5gfJp^*RzyDkW|3Vz{Kkt2j|Gr(eZv0~P9pvU)wHv`d(e=0%H@jRK z5_~H5>B;~NY4JL~aAE02Dgni5`)6tBGS{`La`->IEi7?%T`~CY*~z~$56Y8yUA+Br z3k?~**rl@O2R!$IJ8pS84GqzQFYNgU`IoM`wdWi7Cwh4D5(DhR$TJJac0j@E>e62D z1Ju7!|Ja%cD1UsBi4pv7zEXJ!i#nA1+|4G+U#T0F{L<2I=mvYDE57Y-Dh=&u@M-VJ zrlH`}Uyo)d!1vX^)UjIv-RR(|K;0Yc-RN+ih@B*q+r4|!U-o$LLzGzUX%6*dWqz_I zaGr)H7MVL{^wE%-M@@cF4YW&Cf8py};9u$8?kjQ7u9|$NNk5<+rd!*(Z-C#YJ8AVz zZ=n5dunPKV+tN^mLtET2a~d)};qXb>m40=*YKDusGH+Q(MG z3Vs7htgnpk=tdbE^?MW;-AJ9Mz1aod`!%yLZ%rCmp`LjK@ecQWH z!q{K-PK_RuKNo?fJQzVoGKZ7;fLn>%{Z z2G(1azqMn9bEe*5{App}uRvv3hdraH2l3nt-@ysq<>=ARRkSMMf30BKg!HwrFWh^u zWYK1jJF-ll$EXMS?wTJJsD*GMe@?JgFDiPolwUj&?z5wJ9yn>*hu)|Cw7dfUna$|_ zKyB{*=!LhG=L0l=7~BkF;r|9uN@YjdKKQTgX`r9_lKXvdPm~@@l4?Ja8ZFXK9qUJe zH5G@9&kUft_Au!=I0qYiRj9sL9Q?hB@H}X#>qC1CPB!fJ=tmZQE1y|_{P0rowmfdw zk2e|g=dgr*-IilVOyHiJA_r#6^0$3xU8HA!6nj64TeS81H_-E{!s3@=4DizxU%B1& zG0d|o{nbKc`cTF82P((Gudc?NN3rO;0rdL9hF9Hn14uTQ>5UTj+prO;j(H|Ci1yA} zs4{_n4jp6rr7o8S(2zvS`?xTuU*qJO7xe?Ew?4n>+WY{z|944d)#*Vr7cKZEmeG%{ z@7c-1vvB}bsW!5mIz51VU5}VIL=K?4IX331!vjc4V)e(hT>a=;w9aszRzG^W>_EVa z%6|0tT4yH9!2u*6o+s|*I)G-Ml;r_!m3jyBq{cw-lRrznz{Yba! zVaPsdXuqTZk8;mJ)O(Hd&c3=qq-|E|de3+W`RcRrCe;n0rR%mm%>=)6b8%X&oo5CS z|1zFqD_#$xHFLsMJTUL*;`Q0)cyb6?qR$x$;D_Wk!@5qPWdPk9VtKw3{L&?zsW?^A zKZw{CsX5Pb4k5+7cZmx3hLHEP#hh8yWP0hx zqMF@9D9=G+;NyV-#2$8RV7KQ0`qtZId3DPm@YM~zZ+;J=e_7Irrp!a=>Z#edtdJqp zZt~_2cN866)otSx-bhEkmsgo=QKh3-(;MrK*3i+#Agi-?lZQ~R4=opdU5t*j_@n%)o#-g^d(^q5d_%~l zxnsi};UUy=@=&%x4(PF3z~#?5Iw}u6ps_NJj`V69#&3V7qm#GBOd@eC zzvV#CQ#!i0q+;7683syM?0&`6K}Q-5X<9`+bj0@Q>UIA03?wM(Ybo=Qjy^hflLrw`DMbP(_m}~}rHP(E;>dt`w!J+tuZLSRTwPT5h%OyIRNLH^} z^O%kbr?0NEou#9^t8Pa)wHe@_a`6Vg^9(e-mHBdT4jq|)*%;ebN=FIj_d5J!WuRow zaoy*d3}jv5eZJ)|1L+DT$Qr`^>v7znd)@{yP;uZ$+4d|3s(*6xugbb%6epAD&2@Yj z5of#Jq9Y%X6c8dvEL42F+-9WgH;Uuq2+Q#<`qnPg1Pxa}` zO{0i)Iip5jdK3-)F6gQV9YK6=`F`~mjiA;Y^z00cQFP-%S<&__qiEd=UX?oG(f@1c zTtk|GqByQjH1bsux}2GY;EEoGwnZstA}t>&mNuuD`I=_aDWV~gB{*l9S%PU+vnAyN zHATagDZ!H0Tk(&$K7a^>YZ$BA=Fs0J~ukbvI$u8XN9Ue2yg1F z?LHY1au1j@Sl1Ec?YhRe0fZEaFAi`*7*2d)=C>kv6X%f3NE$z*U7MnHK5v%v3!)MH zrE(d!8KM2lDgM0*grVE+uSpET7Pe(WK8+7rJ(0#0Q(xT1gFP+u95OVIRQBf(if0ms zLTeFp>ukziP5t5USVXf3`#*wDs!y=wl8%yK0(wLWFhg{;CUY1U#p;4Wr$( zKjVz-Ykv@gt2do&ClEH&h8T4cLaZ)4LF|Lz>tG#$J_J4}_jZ5HM95P{FiR<~Rb)YhS#8`Pg}-I6EN7zv2$O!*8cttT+|)kqKl-zN@HO@l@-?fcO%M!Bwb^4yF- z%6V0@C5nkuI_D)zAxFXpyfnC(%2rpvH(+Ep-@FWR^|nI#(N6X~~ph zR`7IA)ta{gIZ=b+MK(}Ia2*gOkrN8b7L8qa+O8>hM6;?GAY#sVg8h0n6(IlB}C)EFu;H1;he(& diff --git a/previews/PR1624/tutorials/out/solution_000050.vtu b/previews/PR1624/tutorials/out/solution_000050.vtu index ebc13ff0492eb45d426ec93e7a27919ae8fd5e4f..3f7ff613157ce780d8bf4829b0155b1659502814 100644 GIT binary patch delta 12189 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 diff --git a/previews/PR1624/tutorials/out/solution_000060.h5 b/previews/PR1624/tutorials/out/solution_000060.h5 index 548c53b38c3ef5404c004137b64e8a58619a1637..b926298391eac59c17fdd14b5489b5d4cca78ddc 100644 GIT binary patch literal 205696 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

D`c}h4dhNa&rQyTG`{&B^U;M+QeR-YS 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

V@PQY&&+NR=b`AHn5dW6_Az*j) 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 diff --git a/previews/PR1624/tutorials/out/solution_000040.vtu b/previews/PR1624/tutorials/out/solution_000040.vtu index 65d773730788cdb4c32034740a5b6735a06e2610..22e49cf3fc352cee5b96e42dfaf1c17f0c405060 100644 GIT binary patch delta 12169 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 delta 12138 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 diff --git a/previews/PR1624/tutorials/out/solution_000050.h5 b/previews/PR1624/tutorials/out/solution_000050.h5 index 1f7390d04038c0360ec4ea608a5afa0e509d4695..d3221341f8954b182aa4b11af01860fd8ea8f5ea 100644 GIT binary patch literal 205696 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�yWH{TChJM_R!B11)KZ7arV_1M>{Y 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

+-P>=P(_JT-2zXb`I0l*L?$9ilZ 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 z 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�*hVk-|WZJVM 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 literal 205696 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 nQhE+$klXZpx|Qb)2|G49f4Pn7 zpD6xH&$;6>U()l$KW;VEU!Z-Eo;!=P-kd~xr&nVl4g8jYKBY>Q5;VUwf7nS8$JhDI z@e!5}JbShP^&KMPCL?eD`lK1soZ8z9aeNb9CTgI67u$Q0#w&qa&RLYEK=mT*8NA?A zl0wgGrGmZmyuKE}=tnE#LkbpYYeWPMao|~A8?;l4bqfF&mRiHoWFH!wchX%@P6}M9Qe6K8(OaF1C zdA$jq+4Q^e)*+yT``%X`R8K4$X%rtF4)dY&DLNT} zF5Wu>%mDo}azKEN4#2d5{2&FyY|=2Up7J?1&@ITV_CYhCw-m!1;DsIl0h)MFk;+{S z7VpbDw7)&BQ~|!y{B4r-lI#oLez1Q| zaDRLhfjs2N9x&|xsJw|FvBzSo|ihcO%jy$e&Aa_(A&pZJ=g+e~1& zLA@3XOF?flr=1Cw44-q683&nx9m2kR#l34I%Eip{ zTYF}_R&p5lu*jM(#>0c*UCpeci6IKK{8|PRZ^y_03wD0z#1#)6IQ%Gs z-?j5hXuI)i`Y1Ko0-qcD`Tmlb*M-{gl(%VM?8@i6O!>4=c%ub*lF6$nue)%V@)1Yi zSp~?K6k;I7A{tAXc4nl%qP+JjGZ;AR`vp0$z*!{pI+ORfbZ-VN4=l%v33&I=uTS^s z2enIdU9x`r(eeZ9WNAN2;SH1*{A}^-dQrfmzl9r#gEunb&%k7XVEYI^`Dq+TdrKiNSR^TL^8qxy);Yp!>iHXxo!KI4q_mft%qlMZ^XLZ_cG0REic#S{VH zUqo}I@WA=*u=RB|;_vF$SK;X%ypx#M@EXURb|+YSCeTSLp_TiAdQA7!#=L7;goc6~ z@Xj6C3fF+Q{41#`kNUONCJsRNt$sFt9#EN#I;ZncF8Ep21oOA5Yp?kq1zu{Xd;dJ> zH_dLy88i7k5lqr{1tHUsV}J!n6KY-R=hGfv{1O2H>V^YK9*x0q z*}Q9g`p5%|$o++HSmfGVJ~_U6@L%cNdCBVl=e@Knj_2(skHc;s%oyw?z0P?nen5X~ z6nwVMdcY#v&X^}hw*ubw>f7~13(lo`S$7;&;oVzkfZMhwEFz#+?y~GXyc0;PlWf=s z`$yoU$Ad$F>&pjTSnmeBYA7~*(*^LWvUpci8@yjC9hfAg(n~Tg)Neff3gV-|Zwiaj z;r&(i)i+{u`pAXhvdUkry=323sbPNkUXq{XxJUg3DY# zT(*y0UAM4%p{4y}schi;x3ZH|LrGeyG=4 z=O)D>b?Ijp#=^Q$U7c^C0_)P!IeFtlSdYTvCFY(0od0yB$ZI=%|8L60C)pq`x!3jZ zVLQC@lS?g^1L{+@-Kq?}=QDxNo-MdO%HFBfgPr^fe$G}o3wU_e-Bn)hfXm;uR7WO2 zUj3rsk+twWkM^Bt*t-bw%4K=V-zKrh@lPXVX|H>T=aiIlTKL;clVGBbEezot?wah>w_6N`+CUr4%OF3z)lH$fzCY3Tz~jA?S1Nyo}t8ozn{X>Ot2Wq)Te>Nt)a3qn%S4%ftZdcLM-Z5zOI!n?Cd z0nZ2b+;?H9=f*4W9?!dc*Kwy&U+`|*d`XZ$-(J^)<6CCCe=GWRm9LY;aookVJS|wy zbnT@}VjxeR*zp|a|~!XaevATp00{=Iti`D3V4y`|b8j zL%linD`b!+wQr{RKXVN+8aMb`NYVJO(@2Eg$8lZRLUBs&`VT6oufFVA47Tez`Pgwh zk5y(3HK4uQ_@|m-``y7e=)K#_>qf6oU%%`4#;+iMyT#oM$Jrz_#}4HWHeM0ObKO5Q z=r7KT_4*3im~M;LcM@$eX=0q4T%k5A*&xja z)GqaX0FOZb%5f&Yt=rr~O!Y=G*mQn~-vs(S3?}w7{m4mBc@IAZ zfRG;)^`&+ii#>pWv&mJFI=ZeByaed_O|=qTgYwb0b+r8}e(ULX$a`u=_w5SlQ?L-& zWMirujgMD8>ZadK@VGu*$8k!3={i2pbBC_mzebk@aUZ2^;DZT=+jHUkKfSDDgKRG36`G!E3WDBujVEO$kU#G|&oj3P@Q>p7 z^W0Wa*bUV70D-YJKg&cl3X{)JK1Q8?dC0yEF&4np3eqdLqQ^2R;q_H z#Hsh7_gG8+^mwr66Z^5885`Ei-1ep8XTk5Ha-XlQ23&cG{o4Ev^y|2`aTZTA;O4_b z`!nSCRXlRYXdlD{+Sb<5b9;!}v<-15KSBJY_Ox;p$Ojk4>bS!+$v?5bWe$hu(Xy8`9=f*hgdzMs=g{YL#(+8a9`2N$&+`Jy5!rO45IJ$@AseJeSFuRB3su%HIujnQp((Qz+ zd%GbXOBt5$>?R8;jU~Rl?k8 zj%q2p?(R;ad^&pc?Y2(x;+xI6O9y(0WcAj=Wj}gIuvBKES{dNp&ztsC1D?FU<2W~g zbtGK4sJnTfo75X{*?AhmIGx@6Pwa*D`_x6-Pz>?_bzA&y!2Qt)*O-Yb8@ouQ5_}%Q-XcQ=#rgz{@;y zrEFneh&dFu%!T`wSWTI8uCNcHD?$=+f9bJSj~9YjxVerM_L?S%INQKHR9@P4X5 z#5D9|1Nf)xU)xWC{-3g4PxxSeSM*%{tN#Pe@jCrXeE-(p=_u1|0Kc2c*SlaO3Aj=5 zxqE>G_{l75qt{;{FC*=5RoufOJ$Hr`CxgG(`cPI%4*bju-mv#8pueT(pU$ra{_wDY zYaY;{4&Y4bNpzf2-}+8=&{p>Za#+h##(n=hWc6Uu3zs z_e{{ATfJWf$60!Ofj$AcGE`@K8rVJm+0-0A7*{B};g~e&9rNKyP$q z_+T8&L*CUFOH@HGvdL=dJQ&}D`yb3-f*+mctfq$dWxK;?EUs0T1z< zXxtkZis#JF7tVFaPaIVez3B|* zzp#aa8SrlLgxpU+f9@Tq3Im$@!BQay^vZ)OA#o1)F?Um}IM64bcmKfitjMPPCdwn+ z_S@n4`S-fZV`Np7P4KZqjkARcfH}t?|W_ zP8HCg<$fP#QGTP>6^g$ERxhDEYq|@iCCUXdyp1^}0zz=m3X}=AXpK{TzEsjUNqI~|xZgJ$#AKORc z$mjXHY5sVowgCN}lQj3gM!iTEE_$!;GFY?@^^2!w(t9ciwej@+r=y$|iR*Ch>jY(d zzcF@VjSuPth{GQwfcl}Mg0$ZqY3t#`!F$p1FJ2-Y=o=Y_dh>1`;KTJ0@g+AN*YUwG z(rw63(x2q|0caABGsUa31}~gO+!=4FL;XP7z|FZIfj1A(ciai|T~f$F+&{TT3Lp@I z->Gs%RAC%^Fl?a&R1Kyj%D~p`B?(qXH4oPGYCz&Li-i!uo}-PgEtG zR}*_y;=TBgQ}cs7Xy>_g=EUo5a8B{e-Zmfd#phz8I%bB0ogVA5LLd)4rQAc68*rkd z0neJH;D+GeOnjg3!k{n?%WOM(cUH6g+G^h-16)v^7Aa0 zw0!O(QU3RZYp;SGM@?59$sZt}b~!cG@(qv*@$^4S&h*3YG?!k=iRdTZ87af(oCnDK z^lw+ZvIa|UTW75czTc2)ICbqDd?dEIu3Z71<+ zuPaPb?j&mM8FybP(O6@*h`7c94z(hwHZ*brLIK#m!c%4zeNZnpI6l z2N4+e(p+&*2MHcuV*mYRJLD+?idy$~lC;31L#lu$zgHOB9sb-&THel>61EcZ!qkX8sL#0spVOwbtBsK_>}r zk6Wy>yPX^xA84Joxt-|x$k(44>LlA`*XOT^=_aP$qt-QGM~ml|HQ^O)B<07E=cTLL zNal(YyfiGCJ!rwTnLcF(?T=~>D%cQHFD8=92 z`ut)ix%|%WQmF;x-y%D(*J~&PJ=wc()0R*5TEidJu@o_@Mpn* zKmxueda}Y!T@d`v*^q;~5TEWyoc`Sz#&!3vzgC#-!a^*wE8Zz*Hf5Kp#n5NO?%}V(7&=r`%pZ@0gr=Ze|f>X zGNV7DkCPy7klNM1&=CBf!Zp@W1JEzbH|0`+xOtcI&mTQw(Eo-9YxyDWuKV1zA_w}v z^{ho)0BE}GJ{!zmSG4a<#yCAFF+L0P7S~rFzliv!BJE8r<}*fC_|`82-f5qO2EN0J zTA@#V za%^#^hTd)Vu z$zb6T_#p(`FP$ZSQSW-|Z1`m&+*j;hu@h;RT5)v_$mKi>;IHDqebfwtGkE@bZ>=iD zIAHyx{q!Bps$KG`QNRyIgjS>dEzQ+|cs?n0_`JmPy{xu|;CY*qqU?_NUpLVDG|sQ* zCp{gUzrt(x)zID}$EE!cZ#*39x`TMZk$jCrx!N{eiaXC)Mhqga^xS~ruZuh?tI$r< z54);R?rZ8w@ppN+2+iM#Ou&Z~@Vk!*eX4vwyu(M0v6Q zUHW?%DUa9P$X|9^N^yUmwZ%r%Q_qZ{_}W7@=?dbK8A7gmQBO<8)*ET7=@og@`#3#a z9r+Zla}@twS_40a171Ju4#kDeqbDgn@a?oR%5?+ds2!8KzfxTH(Lsdb*HyvAv|g{E z7#-)q_c~Pmrq7GwuqGpGnsAKyOuD2L^X z)E#_~#w@)@ai^x?5bbAWO$^29yqWtb9uDbN`hnwd9#}-<1bg8tUy+ZWewcoT-ATjm zu^m5+El#)|;?Dhmham9#>y}p={NfS{o z$G{;TdAB;hW5^e|Djvc2a*?g41W_LA^fwvT!;J4j@RAX5dMMoxPS^7j6x3-BJwbhhSWv@`tf%6#1S zWoBX%Fb)olS|W=3_Vnk>Q@=od|M0XMh$pYSIarAGN{aa(U_XmhzVuiDAE?%1xCZuj zd}N9s+B4oI{15I=3D&C#nV`3M^1AD3zzZFEv>Wr1C1Wu?*k5*Blzbpikz0FBCxKrW zI%0R>EVOg*?DQTLz@1-zuW;K6o;=m8ki*vdaT?cqimz{Qz4d=&W*;VHbLjN9j(`9XbgI_5u@NR|v zo|U+LTn_!Wm2EyMb^-8dc$HWmw4-0orPUAjgF^-rlcS-XpF$%V&2@19c1mSh)?x4q z7T2qtK(09WQ=t;hF~29%bX4H{`C=h)dkEggMi|td%T(+kK7XH&U4Zt(XS)};H$ooD zKpw&p0GX3lcAUz z_;X6v*Ntui4Vmu8pXb z^h-{5ZX@rv4UfI(Yb8sL+*jUxu#M!0%$>xJXeWWyR?|CwbgNbd zEwE`LOU(}+{Q`EbR+usRWTcDqtlgOR+z9+b?lv~&(GNU(Kr{fyELxm6b?J`|vMBCZ z!AqSk@`+?9H@xj3T^af{3n8EW!%lHYxGemR+Qe_jD50IiHHiP%UeZBc#!tyVce0B@9nO4+8=8t4Jtc3Rj zAC2t0FK%rE{B(ftFT0J%^}iC6(d{I2d6rj=i1d)G8*(WoI&j}zeyx=UaM_a#%j?r% zKc+Pa-tY&!llpRgC&rD9$23IoUL&HYcy$ltFS~n&r`E#0W?RXbx&eM%YqOVE7xWg7 zOR%^Nw0*C=OqB+lw`r3e-GKcgCCWe174rKgd~t@uu>LKDUcH+L{@~I2R1G`0H+Z&L zyWM0i++(@7?K=(aHs*bOVg~ywW5MMqc>l07b940$b=dc<7YusFD1@)z5sq4YXS?aWdY^OP;yvj_22^1i?RezC;}g>+u18d99_+ zS>ShmX|P6Iv7w=JJLZRPP3#iFd}EQ)uI+2Uo-Et-7WjMLPnXW=J_32GxFs*<4`t)$ zYhzxt)b+x_ETC3%B1ZjyMz^}}#60dQrO6-hJhX{bjKVysqx_!%?5C(;*&CGKyO`;K zbTrR_;+N*}D=F^jNnP0033|u#4CuRoit+umsK?HEm4N5*&!>NA{^$A2R^6|_k4BxL ze`jio^GG|6bMvF;vrzBdR26AFZ$Ibs(f9NtX+4981I8ctHiYdxJ(v#{*x)zKy)tng zPfgE#gmy;A#8@Fe^B7S?YO1Za4BM4*d?JYLrPw4>{F3z+u3JGaK64YrN2hAFXkJ(7 z&y-r)Zy;2Ia@KWQim&d(@lm}tl?^lxSDhGEf_n3MFY}<@vk(O;A9p;k4&~u*jzIzv z;wiN$AxPt$;Cc~gzqBT8&oxsGe)tA)*kciz=iUE2?=AA)M-u7$41~U=cC3AS)Hi1u8?QAdWej-Xe#1WU03g{awRR zs~a~EA8jv{zl851nV_-F%vpbLJV zP|hmwAp;#K(EaDtcm#MLYaA57nEBc zx0{6b(pm}fM)>~5S?iMLRq#iym96LTy^hj7Z%14&bwlp2=Rmo7)Wc0furD`N*w*WT zp5UolA@`v?GA?1e2bAaB8GM!k`+Q$c;hpEeZ#=VxUmW~}>}f}S#8<;sisFcedY;c8 zTLF4qSAP!RyQ>3Au1oyj9o*oaZ*$Pj&zDPoyFnf)^geTewjW z;^rL|JQh#Ej?j9~Fx-z%ewR+IgMHe(1_oEIU*QdA(f*UoERZ?{K@D0p|1W zeScRh4RNlbl5T7^oJTq(owtAbLEc?pQ{FI?2fJ@h)qptlTVt+0;;47aTmFm(|K3%6 z+Tm3o+_%X3J}?BmR9UV~GawJ}-K9xa3EmNgXf94X1NVLwdR2;Dklz@~zw4C@;~w4< z{yK-idqkJ;wR4Q&eyS+;eUn8mnX@X9?Hx8qOdf{cHCzI}1N6wgs5&3=+ppy3tk;0= zI_=)Z$(sG-&K)tooX>+~=AP~MK106Z`>w(a0)GG6OYX|fe!!bKA@#Cd10>^(e3ZNy z;GEkDC-+E0JUZrVenbcE!9`rINR>kV>r1qRlhy!9@*Dlp0Qa_+qtl29->C*wX05O=5Ah>HOOqx! z>T{A9I0ed+Dr#7Q1EgTGQU6u(0TLp8w#m+5fRvbh)T-4SAbU4wTt9rbpUk$Jzj!6& z-)RYM|c}(Y!NssUJ6Wy~##g8GM$EvM4U?MU=;^lKD zd5rdxcLyKu;h8=_-c4von!UD-9F@5{Cb*`JoENKcwE{d-XB=ExB-=)MB?AlP0MA_g zcy4_e;Dd2#?mH%c-h`k0^PODUh~8SSG8?ltva&(g@wQ(EluHiZSx7obXa0#fb>cmM-+~KI8bUlZreW1<+D0t4rVGsVX(QS( zgMXvlI>@%*iiNHg-K0XMSiJmB56Qk|%5T}%Mrw+a+gBfj@pY|Ee`MQEf-j1QUg_#2 zF6LRKWx?I>ci!w>uAKxsj=c=r>eo&pjwU`)PVV#2qIZ z4P0Cy5BG4~hH<mR>)-2!_pAGjNJ_6E?P#$|b zt4kN&FNYW&TF|z=o6I+wX=wSOhb;5v=`e(LKNwY~N|=?aB0`%=^~>_Tj&4X(oObyZP_v& z-jg&*+D9(|oTagKx6)3)UE%rnFFu9%?6}W{5(7Wvt(tVw8T^ipevSqD z)qUD;9*2H|^K|A#qle(Hb|y>zb_c(Aq0IO94bYQRpZMk#_(O$lx4#yGU)h-R>Eu6?w4XzJ%RFBzk3l=ud;O|oLI3qj<-lIB^V%n;_i8XM8Nc+_VR#4Q&o8em(Bg?H$do`J@fK~F_5xga0f_jkA?aT)ZLeg^(< z0Xi+$>>}P5RjR&Rf#+E4@G&?19pSSzcUeln>!1CdVhMau&V_Y&?kz40RYn~0()`W{ zo+r<)?wg12;8QkO{t*VbgI>9Y4#>SjH#^|@H~GQ}J3O~?yS5MDxp8W-0ZR(Te{{-( zFg)*c6b$Yy0=ZPA;i(+pHKs`wm4cn_;R>&AfS#1qP!aw;9`>!epw*z4wzA+B{_fXz zn~W#g8L;B31LB{B?;|%OehKObn1uM{;xJnU$DOzOuJ4zh?FRl{@OaK59A#e{UzrwIU`9DBskIS$KX=)_ipm@niJ{w-;!a;K(({ zA)sdh11NrZY+YuKbZV^O0XV_ALwRZ+tXH@!}uN zoq;GH-nsl3wr8%#wG#R9t35(cFKw5#5%R*y#}*;Yej@uFe}COqXQq#QPe#>F)EhC6 z+k(7V+BKSY`f_j_7vg8`ep@}1=l+SZK|TAYimu4dy4#q5{M6SUO%Pw))N6Z#-*bce zi%^u$Xx<2aaRAoi(v@d%eW@33;C_yJ1ryKXyXxZ4#;y3BWUN(=A^p5JT&5J{n&Td| z?3#9KYLAO~WHNpZ!0%KH$1sk)B(J`Jlyb_NwFj+9poQ zLpy}rwhvYUO$-itaRB6Y8xIttoviUE?D2a&QEwSTJM`~2-NW^)t>k(69LV)oex!eY z=w|Mnow!~_kG_gGhjrM<8?_4G|0{%we{2N&@@;Cv@%d105I?p9-*ePl-|`LfGZj&D zJR3ppw>j&;FyvhV)~}1$3*}ZS8aq{h8k)(NdxBm_aOKha;73N!D0fiu5Uv5qk(S%>F1@K-;<@Qsr`5-q=R$e$YqKAl#)Mw-Gd=4)UdOZa3>CNsBKl{Kx z=1X{~3BfzGy@g`A^64Qdft9Y(mGF-LvGPn= z@C&u~o9=%#=_it&oBp_#^pp5!3#wA4!#!X{V7)7x2kdjrzxL^|$(Zf+$_sw|q(q{D zn?I|cESzI#Y&F&g@2=Kg&V+l*`{iF2UV9F4>;2K9XOaD6pP7hw$$@_I(b(R>ctJmr zaaK$iGKDz$`<~z_!o4Il{avZ!k$xh^pRGBMK)cGP-iyxfCmW7GDzfu{zkgD|b>gu? zFZm`~eLvN|pG==nR4=C9PaIf{pABdA!{0YuArl4p4V9|%uTvV^Np4nEpSou|IosBH z!0~biS%36d4GYdoiBq2ol8W2O_ak5CZ<6gGd}|t3q&{vZ2@7xZnnrdItC8o9kDhjt zu0z=ZeJeW1rm_XEPap0e0V=^`+m>~Z6N8((hc0yx9G4s?*&m%X+g6YnJZo@OZC2K{j5 zDxquNI|!GAl6>{LPSP+n)!`VNm&Bh{yqV?V=nD5$6}jsU>A`!j z_t(d*`SPrj)Fhr?RQ9ur%uNnt-;ss*XU>NkV{l%7+|Yhu3+QwG+;cq1yOZ#g-qI@v zT%qv3)#Kak9&$Lf=#dqC@AGd$iqc?RG+P(Vmv-nRTPzPH{hHTBLO!}~lHS-uM0vG7 ziU5u{dwuuvQ?MR;UnNXxw}<=7rU$7`l3nooV+C9YPGrtoT+}oFmt)7bbv#?)kqOOjuf%7sp-zDTDtosX@cgFDVnc23GDc>P}SofjoAK^3{=PpAqf|b$j8c?JMpGfKh?d!~5=taWLlG@SsbrKy({9LCRFX{@ktC#{ zl*YU9epgoL_dKun_xIO%oO{pfzV7S3?!D)E&pr3tB^3*t!N=;3uAq7BbHPwOb*zuN zcSY1(1b<-S9O<2q%li5Grz809;_dOKpxqa<`Sy^TpYx%p27FTQL`P@HX-m&2ruSB< zMgFw{ZJBP?cnS4cI(VuQ>4E3>O~=tZoxd+?FzFMQ@2@pTznzPeTJR23E&8i~{QUHn z-r7y;;cwv~T)dK3!yy5YP zz9U9OC0TCAKLWiJL$`|YAvZsq!$d^VEY^W@34o){0|sEZ>}CKIE?Y{k-y~q708V`b$SQw z2kl*;IC~;!srtrYFClkrK=1xK?6b&9yqQdL#kEV;Q5?yFUNJv6(Db{ayVD_;SIK{S z9(ILNfpOq|$Q8w}TT1Pe(_^xAvgDe?~p6N_xyI5ksBbV!5q`vlaJ4U%HEEo{Y!5cwtHDqw>?xx4Yd6 z&+hDCYn9q(Y{PouYp1tTEcAZ+!#NutKyK5>M|sy0J6W6bhD)0JI+)E2y%+NEANm`w zWIhnIJaSplXUM%+5NF|r{iUO}JJNqgcfjxV-Q+sxbA=xw%JZ>aiEzs@&WGHyL25@s zFJs^Ak%X_VV+T9^d(%mE;Di2I`$f#KPP^m#CCnA`d-A^7dBfr7{6DY2kr~LxCr~gUV}W@!86> zkfUO5-K;0tdztb0Zg%NRabXGc^!6p{6Saa6-(vgbQN{**R-zN;XkgRLQigeMA1m6; zHpg#ly(-BPqpATbfRR5xon|;={%8|JLX3#%Qlp^>KWO_Oflii=el6#P<6rwy}mA0>fQDTUjAr zV_X~Lp0r+HIzFn6Ew4+H)Vu<}m{np6Wwn$5wtCJ*GXQ zjh#8NY>5==D|02Z{$)7iUX>Y3IKe+By7udO=*tI9f7k4RzPxLsFyk5g%lURWhb^Hm zmA%~89D`mp-@12~+eqM)yEav2x*bew)|F=K3am#Wg0Acbu5=C_@T(AhPCH7)o~<6o zW3NKI>nbcd*vq~0c^k2>*zSB!vmNDa-!3~c0DkLNj$0Zf+ws`5Ro1~L<8U6}w_M*% zjDz*+F;C>NPLFwZZ=Ota8%sPqSl8hYkHyM=7xa~Ou;|xg#5V%ZKK`p55d=ApyDdIt z(3cGkg~M~8FHNK0_ZdQ8=BT+T9>#cjrYJSF2IFa+Vd%oA*zYMStM%3f&h4#Ix_Ak4 zV|d#h_G3I|>OSm$3c2dZXOAYLyyer=o(7=2IX<0JLm_uH{Gz@Y${T#qB|Zak(|l^b z;ovgsecU}|4EBSYU(D!}fdsOR^P6Hn}Xe=46g#8}_z1%}f zAt$i$pSBnJ+eNoGjn03MbgMdJ1AX~4=H0D2JU@9LrA z$%v)k-y9WnUk3WkqUBm5^nTv<{br=+oj&-KUx1wWpK+CIz^64;zSRYN=AJmA1@-*! z^yxa9r-yFb>)Ql5tBvop*CKyeSr9H-fFJq`wSJm^oksmuB|V+><BYzziURMI?`N5^rT1f8b!F79R{=fWis3v{)*tnQaw2$?= z?cWvJ2eN*n(nWF-BXsPDcikcyuL^#x>tNZ(;NONsDv|!H-rm$idVjF(kWExx#EK(| z#NU3^IF{WR21pOcjKZ3q?g;K`)Jd8T5ea-1j0E7TYfKm54zq+Wy2DrH_ezh znbyw<#T9eu`Aw%+?j`xExYf~wd&8ymovQwVSKBO(V72 zR~cS+5a{LRnOwb=e`wAjdF4~@8cDv`@?;h1_aNJ%8?=wnoU{~y4{=VV@39Phzr};J zT_iVip4Cix|J_BaPEx;mQ9AC>Hqdd2dzPtyI(nTrn1TM6wdYx|H~Qt^hSP_RVmv)= zGFm(Z`Ay@WHf#ai6`nm$0dis+rbdl`oQJzZMm)x0;KDmn$#~ClH@z`4A$K6QdDmX> zSDISJn1ZfPemmw6#*gILx!k#npBsNm+(G)Cgm)tIAwPFQRG$mVU7WX+uYi3Fhm3hs z33rZr-Q-*Zxy0#ym1HNV(;E?g7QB3ah#U|0yY8_=?nOi1RZqEV1lGy#H4Z+=!Foi^ zMDX$g&b__fdNO0IUkAIju6vCn^nZiz=qvBB?l#x%m3$0)q(bKw>(N-RB*}iWIS__( z@nQvC0(_TOc4_7})aTX-`=uk1KiJ$yakeJ*xqADJ#IRpHGWclYbj)*dcd}F|UR$7g zqU>PILqo#~-{4VWAt>VIt$wh#Pr!DlXw^@>CSXg|+@or7e*gF2 zi@nYZu|GRW_Tc#*>`#PU-I>@WV50|G_g2Dkfmb zNm6UauIOe>H$$^8o#QhzkJQ8WG4Gx{f2-=vd9;fivurlU|BJr2;gNkei?=)ylGiAJ zU&`OVt06ZnX~XnYSeLFy60b4D{!Xj^>U}DX0=D;nmwiq~H(T|DpX!_{V3jrvRWGj# z*ypD`U;cvj=*(7_e_X({91qr;>=H2ZPVKHK9kL>iK3NIal2>{c?PUbaB*N&N z6WVE;yR7>B5&`?Z&?RofN&(AU=`<(BQo!yWXyg@Y3fMZYDKoNhzRpJO?SbdN1nf*g z#3Ik>0#@IC;*g`WfZYL(cN&8Bwmxw9-&r2J$XDB$dxFPgr!5Gdwhg@GgT|j&H?Lc_ zX!sCi_!}Sd7@$zfW4oKKo(?VNu_K8#$qNd2%(HarsRfZdrl=mZ@`w-gZR{U|?s6SyYkp7pUr1o4R~zvgiD&;;XLM|6t;=Co5voVb20k3 zh{vAZzjx#za7zE)m6PUwYGXDf-tYD$@tCM{NID<#+ryKF71;2YcyF#DoYdP>qQHYDh93JA2_*~p|8Ry}q)m#vjZDU8b#B0{=Z)1D*Hz*(0;<1ui z!x^Hxcve;@E$R?LdFNo}nEmq~IT>T7$a@s?R( zI~(3*Ex)>|jjim{j=Kt6wB+4do^47SyHqxN=~&BlrsCh2eq&1qyBy_j<{8<>?v%J+ z+X(!!@X7jpgWtj)F|uNs6~`P2X&OYRFitNW~-Et_&Ra4GgRVl6cqR{;mTHwxw_qulT< zpV#x#P>(1554{`Vw>^FHOIhq+_VuLPm;jvep}jlB2jjl&li9vfs}2@7SS3c^8|#!A zO=4ES?Ll=Oxn?vUN}F`ZV!hGa;Naq_0^Fgw@BJItHH|lqTHk=@$5b!Au?6$PlOwdiAQ03Uw-MjeW1-|Vds9sPBLEaVfZV| zCu2`(O!$R$m`UVgSMpn4lxn|48t)hFix~9)^P}upgA37kAAeN9qTeX@V$jY7F37hy z86EC}d8xV7!CwS+pqQ5FBUWQx4Zov#Y8}ea^S|kM2J>Oks>_pygBmbvmpiDZQ=f7l z>6ahp{`=C2^y@($lUJg=zF~TjV?oE6e)W5V=N;~yEEk2GT$fIw1!%BRV-4Y};Y)hP zlYSgr|2Fz3o0mjOWB0@7J?V{Sem=5vu4SOqvlOzU&)YKFpY&!+ zl*B$-mydeUwT1To$9Tr-6MpH}Zp$G(eD-lFr-$PtJ&(LZe%6mEDkY$rxot-X_k7SX zttWlF?M+(|;U+gX12?iibuF7_Kv=W`N z_BMxKRHSEee#P1WIUIi3=Vi~G_g^HC)S+@`EFR7Ibr=-{bLYx>`X_VyB;ox3I6ss> z+w-I8e*`S|;LeeCD+dmw@+XhF%;Bf&8v?lVVf?Iz+LYcU4i+>l6>hC~&ip>ymcf6J z8p-*sl)gE|#W{HYP>D<5I!bt-N zZdcOxu8o;qM*l_Lq1SsHsG`alM|xkzi8&ljJaDyx^8=4KtoVp<)twugyb13(tuN&K zUq<%lT_*X{v+tQu{f;KQb0fY*yWO5}R*u?U&ac_dfAfEo-}oo4fb#bq2;lr#mhU~i zg6dOTaDelBQNDbRJO3sIdylRX>+Q-qq>9jXvNt8qS9=2K}quT1Wjw zbp9Q7r&On5={HuO1WN3?lCvHKyUw=F)-qxw&Yof=O4EvM|{S89hvvYNRxE)0&f zoThWIT}HB;f0xVDJU!}C>Yd zHk<-Iq)_lnr4ja(q3Q$MfnTDkT8B6xJvL^l{7=k3E}Q+Y)?t3IN&0@o8}m+0*4S}1;M(XXn~Ujo)_RIMUCJSa8|~@`DQY zYbt`jkmmJrEBLq@Z(rU3o=g^V6wr9SazE3Z{Ov{-j!~rX9#^xz!W;D-dUx=}IVd+? z!DLn_)}i4~^`y%t0N?KJ@n|r^KI43AGrKea>rJb8c=c8{Yf(QsEEeT1_xyaK9(ZqA z$Hx(W4qzWrMv(KW1~|B_dgyZaO;oCC4;zU0RZmbj;{dyl#U}eZp}?I7i*t6>!QK)+ zW9xlo@P3&mZPsI+t$lGdZ!_8@Wayj21HgaJA1M16>*gi7%lk55_fO9+{~UpO4`8)7 z2Ln%D+iWzv8|O+=#j+G5$J0626PGff4?-S3c^?J4P3yS!G5V1LR&5{LQVl%y##OL# zp{syd9`st8^_0&d+Ea?w{}nKIlle6nI`E4bz47I9#3`_ltQ;FKU%-alFCTGhfPi%l zv~qgu1wWja-%sO!kIoqHnfUUbfcgB4iQuuTUfw1-4Nk7l+FZ!gAq zjXkP6KB@@V!1`SK2UlRn8T2B(rIZi9-THyFE-y^DlQdff|E2GnSiA_IolB`Y<+4}6 zt~R^O*@O5B`^74&$9?59y{r6!t7rL4+CId8;blHsYQJ^n+-UG&kN$pJ$7eHKqUNvt z!e=_{)`OC6KF-BQZrk^Q&x%G=H@a=-v!ITubt9+p+4iHe|D8}5uzl;5L}X~i`hzzBH;WgaDZGSsy&4HN_+zAZoe0L}AQLRHa@xA39sYSoUKq{5d9WJG z%~=}l%t=K1o2miuNa8oX$$uSep-x}t7Q}OKwEBK6BBGtu7aj3B1wRbCVQ|kH%~V&!`McC1O0E$` zJQlI#-=^_@+Sn?uS&#IABY#wzEL-#*xX(^?(t+zZmkrws_@r_O~&&3&lU|fn(c^t);eFwX`fuLo zwX?Z9SBpy@<}ufh*)z5s$3E85;hTc~Lp?VY=;**-g;zNzVv2D)3ySqEFaX~Eyxha= zsC_#-i5pqg;XJ2=Vd}$@mNr(d_Dr7d(Z){g>ONb4e`;AK8~8m zV;epx{ZhmKiEy}7_8xI5_NCk}7=>|rH~H??A0yk@!lxx?+g`V`M5oCmEe`PS-z12& zh286H@1%ltSZ@Y9@D8;hzD2*9wBrZF>qy&l@Qix{?7|5d$NaFL=ad`yTp#m~{I)}H z3K9Q8blQ5i6__8EhJ4ZtCfqtgyZ;s5cjSEC{h(&p5i*}Fn$zFGMpiyp{}uD`vwu+$ z_Q1IYURu^3uwSP+t7IPlE}Y%j9k(0h9=Nikb2RLW`MamKFT?z(dzL?16!!R&TZ(lL zVV=BHq1sswyQ1oOFEyIagX9tqsUY8Sr$U50@?Y9aN}{;&bq`G>9$=ojHM?*64&c(h zu$;~-z*{$r+x014qH4jU&akNrHhdVLr4N^{NIUuDR@ zIrd%sZIttOOU!ffPZ^Z@<-$hLlf!LCQe5-Q#M1`~k-ydI_}_fgCoH_Bl>Cc^Dm;rJ zd(G+0Wv%0pzv`6zu^pgW4zCw6K>n$q`m3a8_rEw>mkGI##;ud}ecgxaUjl2aH7emuVm865dE2 z(#_RtlG6NJgd4sgS_a{O(&v|L{{!86UtFHb+oJu;k=}RE_TNa#SCtyV`MbQ;m}f|K zMyKHP5cLe$z}RubjEwCqtM z-llLB7f;XJd={=e!8xU!k-I2=wQTG#%J*Lp&7DJASSG}i4g2Ca+$nb(+jhwR_P30q z4u8G4xKoR(a9stS&rgTB5%~>)i#UF$$RrNeetPzV!_5OP0{%g6=m)@7P%BFu=Yo7< z3Bn10FJjj?YT1coq>I8@N9q2E!a@9s4wxZ9?*`~`=|86cE+hZ;3z!>`o}C2P2;L!O zGRG%LsdF^6`T!Sa;mD}9Ts=D8*mLPK&gdK<`B4e-h(wM5xK@S3?c!5HI6L5iV>VoS zutD#+^MTteqzec)*Vq2waC=H_F!y~s7A@m&?TKPPPQJB$0_QJ&YZTxwMF@m(f+aQ6x&6~g z>r0+d|LrY*@3xBMdjj^qrGEb`&55gTq4)<*K2<8JnB-%31YM)&FWfZa z+C^dZ_;yM!+pVrb>FIuMoPSkvZq{AmKW9J1!AJNJtx3WU0`5y2sh$S;CtH(rJi)g& zK5L_Or&#oheLFzC_H8&Oi}XSL$qHomF1OoNq6J>!nSTJSQ^&{`6>9_UC0}dQr}yR? zPpYNy_R%4GYd!d%C5~T7{!f$Ub@Erz%WmqR@%3O$&vP0_AJaUIX#9T8nEIUdVVmU6 zhrR*T_g6hc^()wL@HTz_&NP)6l1uLT=|}t5J4K~Z13-U=A7539_4}#M9?sUlV;@bQ z?RLO^VtCZT4>9n=;C<5bYFiHf^I)gZ+4!El83QDbW4?TP_=ZRv=DABDvkP)@PC5GX znw%)$&VXR{i0+XvduYqbkso$>S;rp8=eHEz3B>b%43nhlQT~Y8o)5|HtMJ7wd^hCJ z%S2rEz`S}e-EKn>WPMN`*hKYa`T&TtnCF~l_(|0YVu=PsXB9BLUf2zHr(ATNtj z_<24^P+Tw*_8jv9zs0J%_)IP!J8|be0o&}E)a3$u?#YC0`}f2D?1IFCC6ln;2tEDe zP~|PGtGmsk^kDydckI)tNa#0nr6dar=q1kr)392U->+%VV1)Wg+FjB1+mH6W_b#&v z^{vXCsyzUD?d@9QK2i8%DYw>q^Cx?;RFj<*)*X-hepVIE62PypM1R>uK2shtZQJTY ze72-XDcm@W&;BXAc%n0b&%FQq(%1sICK;D(<|bhBJ&jtQUjdiSTJj-(0pgOK%DOja z6rcUlk@ktVfFATJlsV7`d)3Z?mj)LASF>|ASCjZm{o28=rv7|pJ?!d{hE&uq|DwPD zKH%}EPvU>UEUsg~`F3S*-3sVsF~jP~2C!Q-)ql!DTxJcoo8nRP`D~zUVb9n` zoHKg4+05=Z&O_MA+hlkGhr~VFF=Q~GMaz!Q8Y{+UY?|)9rf=BS+;}XWUBxOcX`=piwcYWCp|4q4ncDmc~f8V^GCpHOjIi70v zSfhVR?3NgFWexmRBmVvgyV1dt$DgoM-vGa;uWRLU^wIC97zU0*zml){bN*2X>{Onz zV@(FakK)*W+cO__Fz@uw$M#?yHJN9gC9?qi^}TWYO!zOPUb~W6?GArKkLEOcP0V}d zUXGclr{^x!dy1Q|J{%%pr>z1z$`HK^)AMj|L*jqwCcu@(Qg7dE@_@f|*L97z_+L7M zUdeZ0+?vMlT@10Ge0=kQ;C%Q2=4dn}8*N5>xDoSqch2l!x}HD&+!XI%@<;Q7hCau+ zza%y7UpW6~&XgC7d4m0oC2eh$*dP92_TJ_6><(7$GO9Q!ubu5XF@3z)_I9>>koNs3 zHTajD^?m=Nu7jnN1iYKz)WHU?X&14Azx>SAYo|qxg&(89>`k{H?0)^KFMce9AFzJE zMGV$^Rbd$^ul2A_uU~Ai5xDjHIp>{~SFtW%v}c0<3E<5)*2brg;{1Ltf6>kO*<3$Svv6=@bZ$85qc8c9V|lh(=Ri%4mL#I^U+*}_-&^TSatSx zu!0}@FOFef=t9C?gP$0$R|B4$eeDWdm;FcY`FZTWEt_|I0PM0$=4Wb61Rgg!APDn- zeYIuLi6ei$0?!l;4l_l*=KNm@;lSB9TwY(FBn~{8ICb|v;N%kTaXaTWwX^Ss!VYh| z*}+Nz+U~) zvCEX=IhdDZ)psCYH}!y>G2~OiPUY)^4*RTAdmi(8X0eVM`O7VJ+{K-fvvp99UW0sP zv8sz}P+m;e`}fM=b1F1v9mV?LiN4V|@~ine;(HODGj{A7_*EX`=D4iHp;pX~_WfV| z9ii{!?afaS?%sF1I?x5>>|dz2#~*Sge;-B6!t6+UWM`VE zsi8#W=Zaa0TO(ik&CAc;NFRN|dC_^$_}vMYCn5hu{p1X?ul><&k z+Ic_?>GKTT49H%(ZPmpc1$gd*PW!M1v`0wZ(4r*B9oA&pX2?(5QMHTkc3$7&732@x zwQyJ1669MrkC;OE*fiOC0^yLhkavSWAV0`w|6$U*BNUeAECdbuYxN)L|0usnx2c?4 z<}W9ay|{8l;TFO%?g>YH3D?(l$$65#ujyRM`6I_KJ+DSMLtgI1a>BzO+G_S@fvyOD zaE9!7@n7ekBYpl-Udo8_Ew_FjO}IcMwMm-RA>nftT&D5|R37ExTR6*HkRu$h!OR)~ zBoJ4t(BGHrcc&j6oI}*X>7pe)zpnZ*XSa+~xS~aJ18nubQhjw#R$Qn2t%v6TNF%QJ zh4(AzI|Cb@!9a}j0U96GsQl~WeBz0J)VR@(@?DKZIDXB^-JJdQ`(5L`gg<{4P3WV1 zO_)*UgR^oX#Zq4fWpd|Dfc&$WnIPjdAIdSi*7-FJLEQPH6;hE&fL zC%2VRzW?!#N}}t>o581JXuwcwAdsl`BUq#E;{pctIR) zo@y$@_w`JOpLJz~@!|fCQRT{8+fvHWsHuR>sK)_Mu&DRaEke4y6mS&jCl`+9()k;N z>9bmd@-itxJ_yn4Nbc4$n7Khmg$wyb&cb}>E}{HQRpB}$aI$dSQa4VRZ}&yrKM>%{imp+w?$7kB4{E*V0FO=ovu0;yzX8Xfj zId>w%Ir$ievm6c|^B%tm^5GlM%qZ9QGky#BR#W^g(6r~PxpmAwM`1k&jS{w-`DScC zKt64BJ|{O@X$aS^UR@KmbM*;?NkP8bZlV0%S;F<)gEBcTUC-tzS_*o^@C&{i^URKW zNyHb;zh+AOrmbNG)ZgWmGCBFR>o_|!`vRmlDv|uEtfBnogr+u2!!uI`V*&n+;`Tz-h~Ae=Fw~%rvaUn ztjWn2t&QXIC1KFUzw`|utl3(An6%C8=w|FP_p2%qzwaA}E?T`gm&*DjPT9kjX`uQ4? zANXR%C>pOX+)qxT@!i`|pB9DmLqBJ&AwLcS)t+;-pJ$R6x#vqZ?GL5vK;n4#R z0q`HQ@{iKKg7f~J>&PDQa?q%cRG+;!+$yP_nR~^J-corbDw`=?V~*|^DsN=$Ky#XR z^@e60CHu{YFq@m?Z)^H*!`tnkx7qf;nOH|%DxP|KB-T+@ZMOdy&ZU_KXig_T^(&>P zcU8~9cco6cL-Cy-hX1g$g8uIENZXVE{ae*?zn~n{RC#=%BJf0jxR!4e-lJ}~+fX0+ zCL&V%U{Ak?(dHIWl zhE~7@lInKB)NYSw&RI=%E3?br>^6X(n)mtWF38(7c;8)&`c&60pRR)VB5&rKEKq}; zFygk7{-DLM%k7GOx*7Wv7u1Z+95-NHF!|SjZNM2P{xzRIiv8;sH;<%m{D^+_*S*{E z2Ii}#ZGCI8&U@XP?fDJ>Aw* zqZHg+^$GuR)nZXQX{^5rUTkv^1&(qx{}5ddd{uikVfuK;P3ZSZ(89V)B2JJE6V!)qt?BA?jrZ8$T?35ck zY%Ws#U^AP|?qcv0y17Wcwgvn44bwtgH=&-dd}0^d1814+lFZ|w{vV3uY%@^r+;Ia| z8REO8B^qYZe%VARX}^O=Px2FSufqFZNZzVW1bq}3r1Kr$XVD;AH8=?RaQWuhFW13u zFFDHOrV9Muv%-wB-@&eNsM{+j1NyAjJ1!aZoHnc1`004qEnHP{6XACdl$bwlKXBK# zDmL#6`eUOYrhEbXlz-iv{#y~a&aeKJG>x0eb%%#GqF&1{{ijIxAofW{1XKJ&QFr&< zKIktZufm_Jg1)$(P&@+ki`mr5C1~fZOV9skg}l}9!o}y&&zy%3juyjn8-C0kpn`st zBwsx*7XN+kp*IIlV!i19=$MP~VXXU`jJ`iPi1F&*+l`24)#wzB7N<) zsDsUr)2bhrPx!vqYf;}l@S;&i+$_+qB1OfNBq3MQ|3$(T&$XM&E#~|k9%j^C$G%}_ zPvDU)utQAP(r|7xCchhH6dSQ{3dV){!7pF6ZUsdzUKwkSc)TJ=y>bg z0`NsMU%eUynv^nNPae{>(>3f{@q9#b(XAs$54o1Vrw)`iBr9ej(qH-96HfvkfBAb9 z-OGBhwe|;{OZYHxg&5&z`+4(Y$j^07vZQ1k#)p5FAdl=s4Mt6=(~v(Np1^$Y8#CNv zD?s}n^v-pMoXz$H7To02@+o)NAW?ASYk(g()hvLHP&adVpk=~?T!Cohma&ZAm7o%Bhei>(#OjlOYBnevl6 z{|qL*_+DG5nehFcy#-6@JzxKv@gn_|BA-!3cKO~#dS1G-0LVX!$cc17#1vgSd@7@ZRqI_nru#fU1Tn=*QZwD#=caHesCLvL@evrDM zUrzjAzR4o0zt{elWa6d2E$AiMoMFx3+fT)DaFm5T@9_1Pl^m9c+0Tzq@d6%JQ~iENxl`D%vO0NAijRSJGaauR9I0FGF< z1)Fd>M~eZ4P|!|k&lig37G{Dv$?cYHX)r8jn(bGZG#L0h@!gNt@> zIPtr|V-838|5vF;<&P85%_HF=6yd7zd29S<;q#>e4N8mu~v^cytn17@O~BLg+g3k zq^>2n_XEv{{7HxK+rY=3#Bv6__(m*8K?~q*MKmx*D4#ZsDu{JJPp;_a;?{gzkjv$NYQ*qEdeX-Ljt_Vd$ng(F z9&r8XoP#3A|Fpoi2i{Y+M;JHW^+yTM zt&7__mXW;ia^e4-II@?Mw+U3>+GUH$|Abhur&%C&h5%|IlN1 zR2cT8FS5o&xA$W?0{ZFK0`9x6{zJG!@UC^nO;paYAY-ol6#YFTsGiG~DO?gD{d`^K zW?C1mUo^mu=HUzjb5~2GKa1)5L(lgNT|JlRg5NKs$sV#oV@4V6*W8*r{FVf0;KF6N z$QS!7s!{eNx6nf6D7`OyO1%`xI~mTuO66YBc#9tjf2*^1w^4rKjsWgF!t1nCoLymZ z*l>BWr>Lzj;rd1A54bNv{`jjndm;`NfVMK4iC=Xl3O{`rLc*8GmE&Z1X|sN#Li;xy?NQeLB>{ zpW8o+-ECY(?KA3#jY&K5)$Gsz(+0mb`|Kz^(1T$Ye$saxF>rrK->rR0;sm|FHu+KD zd+^({=SO*7%%4=1*Cu`NF+B;292Aweoh^}zoA9K#R;_L`1@u$4}8}`-@gUV ztxBj3wT9d?{;bU7pr#jh&7<|?tT~fwDITzc`le87k6F_j_NamG)rxta25P>}QhgZm zRjZzQ5KhW_b^Uw`>RGSr)*cJI-Ee%Q`b@O*zWG-#oe46WCbhhDWN`+(KAgvZ5@|Kz&x>lx6Vt&uWxPQ@+W*^_8l#zO8~ zb=ezh0pYGxudtycpMJi(cqr=mW0>=eegTos-#48xxlQ}d^f`03@1k>Ju77RQtC0RE+@z1*FMYz@Spn%+)~fQNz$0Mh@O7YDHlJKX zSoU;{%b>?NibqCX=&wu$FO)Xi5`VFJ>P z$rH&pB0~nkeyvbI>DRfanqT+ ztu)Wv87YxR^R21Gs>}4;_~1Ly^nWamKIZOgI282Aj2qW2*3j(u{+w$~G@tn`veq92 z`E0A^m!uD7o=LH$=dFT^pHco7tZ8GmKUe}U^>i1uw?x0L8PV>2KV^w;3e{}J!e z_67>Oi$&||ouT=E?1QR$%Kvsp9f}V9-ZK{lV(5PzKL7&QC7uc642wqX5vBU@G%Emn z5HC^EHHGqz)rkXPAr1+m&Jx|RVRaG7UA}X$u?1EoxLjkxj&n_MuOw?P>3;+W7&s+~k6nG$cD5tO0V!m>6 z)^Vdb`{7;rZmvEh9k@;z@{hDbIQ_lB+KkiN!%K>|diI3w{6YC~_u@F5Ftu(SmmlAQ zWe(CaPU~`bWQ5!d02$mTZVPuJ&^ad!Ienj`t_?s2yM;q8ho9~?M05Cm#z`v!E$V;49FHO2@0Jjkms^^0_00G%i>pU?m?M|3bo>rSKirwf z6N>-KhjE)rZ~Px`^1u4fZUQ~ev7q$T^!)$7=jQ+9nr{o!7la6DP@M3&x^DU) z{KtF3^i#C$fpS*g7xHe?g#2bBA^$uG-52tQsX0N_==VTghhR4N3+TPX&#e*CchsCn zzmHKtw3Fa3@(XEs0$#;SNRufU=|}$84%5&ZiKnQbB-cgDTF`)mMvmUTMqiHg(6GB4 zzx=pxy#0A=!=-N&!*Uk#(;xq@KfUbW_(FSW;dA91IGXf?8VLK^TEhNO(N8bNzUpRS z|H-&n#yvM>iLhVv{zNwNTfYe9XX7>+;$78f0ScV>zjf0~%sRv;Vz#4tXzdWvo_)gp zc#^KOM824}5(!li$2i{Ru9S8OoIZFz-3b>R zVO~G9rIymi4x5OEf?Z{j1~+d>1bT;4dM@H!S_gUL{{!u#xngapKGClwRm-F^%xrx;fjA(fgxXJ2*Y! z`0?a<(qmHTJ7b0R@+N=)5P@$Bz89aATJ;pBZ^^G74S>S#^{+2?#GD|vhYUlXo6 zn(TRlCJScMdA7%wKmVfdiA)L1ruSXy>KjlXzQNCn(1buIu`TPR< zuKoKWf6=<{t;d5`)NT)p2B^~WLA_>*-AM0$(Ds>le<@c{s=v*oA0G*4EE)E)hj7J{ zAfbj6JX*#26-F11U;xw{zYA%Uf@)f+G zdddQ_Be!O?X0}#mY>K>bI%H|1h=h2&0`=R6mns{cNI&WtC&;dqzu4#{~?S=emxH6Mnnn zYxRZbnrVX{QaLtp`(^3*kMC1HQ9DOJS^c64v`Y8DJHnkw+ib=1K~2=GluJMxV|wc8 z`4K)NC(yb)(WbCNhGxc|RvW*fI&zv_HpKeg*j)$QI?Kc9DN zrxU$eG|Y|axmzluhTgBLyI6Q%NK|GIy{96p@-Wr^a@FfC^dB>WHcz4Fc75rcLGM|2 zYVeDCq)TNUc}jS3{kPLo34bdcia$f=koH>-O`ZUHa(YiL^|Qcp%b(Ety~WErlHy@| zj#9x$#5wefPiGNM-L`Xi7SYE3SzJF5&FJ9vU4xt+B~m?pt@iV#ew0_)J(KD?R_DDT z{f8XSR%`mc{@8F_;EZuT;Sp!&*thq_LaHY(=y(OunsCVsqO!& zKicmow}<}2{h20kAb?%c!ISe#k$(Cwgz9x(MLCAPZ&{4v4I01W7ZoN`x@$+bAC;@3 z|L-xSGn4EXs+Zd2Tem3v`0`jF5q#hIa}Vf0d=6_`Lg|+RXLk^dnyKhT^ttiWgVfI0 z{*$Nv!5`D|oyvRZwd@YPSN!Zk&OYt=VN5&K^T>knFvLNxd@cNs@}(~SX|Ssj)8$bKpm z1p2Fg0%yNYagPq5{Ph`GS1Emsm`MTAg7+$bCRk^T_2=g8>u#lKG%jX|zE*?qLXp|>6@3Dg0TsbSNa1A2L>-*%u;qsx2Zgvwt^NI_Q3+w_R=>B*v z;1Z@G(DYomQ6oKh<1J1P*dNN`%2o2fF<9isOcmPeBYS)~{a`z+iqmtJuR=LKXz*Jh zZeMtcOFwRWjHAQ$F6Q*+NDnXWyAPDF-hUEiS+0f4E2ovmKQ`-+d^T?ptceQIWX>?C`zn1OzeO z<_K|+bhI#CzYFRQ>5DE3^J|6)^Ap!Y%_DtAH3(?GD4G%U!%88poB2kFd#+J+kRFOr zLiN49Qn+r2%|mws|2Rk~#no$$ zA`WG>u}p{spDnCTj~uANXTg4I0|RH{T;VLSk9Wh+PNTkOAIpV5ey8j>mur|WE>|et zgx~YPH4&1vtJ_(jWU_TcA>vDkzKc4u9_L;z>~u_pov^Ri^1?j@KKsvSpo&|26B}aa zv*t`^8)NlPPm6DYANld^@*m(gt}sCJ(a|Y<=J8p&`J+@Fo0(s3_q3;({Zx1vR(z?G z-IE>_aqBMp4SwBwUQ~>Ih^`=~(PB+(?8p5}KX$jW#mO3))`lIdEFtaY(ydr8B#$|z zn+AK%UE{B7Z}8aJ#n*pdmT6}Wzn(Lf;&xWjzOTj`_ibk%-eS7H74ZyIUQc=WyN%Vp zv(p$lwVnB@cehsHoZX?j*T1iP(811XfBp2h3-L-PT78 zWrK#dvG?T_C60wntgpk^o#DO|?W)-QFN<(5-iocVp%sX?`6?o|>@V&&k-h3WuC$IN znyAmQ-~E+s)U6q(hq#~atL}=;c5G!I=bdWs$8#xX{-yV%H89=1$I9LPnwU|xgQ-Gd z3sbS3n{#McE1Tq~WpoO0$bIikR}f`wEIQ5i`ba+R_glB1G^M$fJz&b$2X1Xe{20fB z>G>@zWmCV+vmuBdc29f1L^rK3Bim!fZ`$`o;GlE_y|n_|V@iY}A9TxxtrPm}7jc{x8=S z)_FYj!v3-r_C@5+oB0*Z?9s%@y&k6cKBp!*t2NE+${yQ)ZOfbC5A^X+npP`YruDmI zr%DUU$XfqTVA#wm&3BF7ZPLuXZJ!YG331(9X7*>Q>9n$H?Hyx=?`mOBBHd+nxiqt( zJN6g8!~HkX>%85i5%1l%x9;%iNv-V62CHKMM_X8F;YeG5+=uh6G5y_t8i>Qr*N!|j zt(o038ML`KpoMwE-}NLGD6@D2AvJt`e^{2Oy^Em@>%hy0qX z&J)XUPhsvNrB6q}+nO$l?Q3R{Io4Af#s(+n8&q*(q-+-Ivxs@*Dz~r!GD>r9&u?J~E2fN2M?8Bc zn|0P#5YP6te`55++b!(In$NKl6!HHK%(>M&vxT{ScK!5Ua0~le`Jo^d`Hm;oUvnsF zVICiA<*SVmAK(1S!H#7utXXR2F5TD`COB5y6^}Ub$9DQA43lbQBSLTg{$HiJJ%xfk~s4fgQ&W-Y8O z*5l)#O?a>M;RiTs&h`!ZymATpzlzS(cVBQ%q*LvYvClEi2D|V4V}^S)KNj5R94gbs z9?DjiM7(TaJ8F&o{6#;Felg*GH~RNi!ThPUpAc`?@lnib#Fa^tPvYOkIGHAASL$rh z%D$f#(WuF8WxwRLTvGUKOdh>=Hl~ZnG*;<}v-C-@P@y%JI^g}JUugX({cfW` zt`MW$sOPdJ3Zg?7wXukaQL7K!Zev*m*OD6%XJ@u4@6~Hl+>;qMrXv9LR0;}c8fuF; zI>&b!>O5>?^G{gjb&le(iThTrJ%qSAx(DBu%t1X3PK2mj4QylgM*43!jB~?RGA6_y zK>o4|YXdsh;(Yhd@JUgKTewL1*)7eLi0`MP_H)HWoIn0MF=fsG9uth5@_zIz9vd3# z*%6F!A2>}ru4P{}2e34aPmILmgGBgl*=Eq|;Gj|vaPDWh8HVcEI>pZsn{@AHbklTJm%KXP{ z9y8s%bk8fq9dtO6cXA`-e?HQ5;RoUz`K7f%MSFNG>(xK?&4{=7&U@#J_rYyUwO-+l z3*rb}^Ya|{195*uc?CaT0yTD^(OeT6%zeZdnFE6L%X*h?@SD3hHACC ziq$?E6yQHrPChDu^Y}*!jGGp1#CJcxAYX`juNx_9Xo}~w7IaI zz54N8y+R&4+VoU;3gQQR-nL}VWt^MOw!0G9Y>hZlmhJi>tD&#kmx>0Xoky)0bU5K8 z%Dek}v1AU9MLw>|Px^&(?~?PjeeP&ui+@Xr>_&X)r3XT-0u1r|oXLS35WjN8lXqrc zW7^me_Euvm;$#LWwRQJjYGb>`DZNZYe@#-owZj_y(A&V`SH5IB>pQpN)FYgmUwC|Z zSJ0z&mb}+NGy!o3)>UX3X?S+v{|8hKLp^!c6)QS)+L_*c{hW$3h^M3&uYDWm=r=^H z@GG+HV7pWPWIw%z_iu4E-Ua=i)EPZu_1t#mU2V1c;>C8xuQ_Zg{jHtt9P?Wu6!ETj zoom~!Bi`2S{OXYkmw4>^&YhQg{_&XcsvW+$hLE3C81Wk4H@x?fpiq&=j66l0O3Zo8 z(#cWrHR4Zc$UIzObqoDE{ECRQM+dv&lb}2IdI$4Tf4<_b1^mHUCs@&WNP8d4KZ;7g zy@Ds4CJYX2X=f9Xk8FOZ zjPJ_z#(lya?CKan#dpMSGgaM|{&o-S0I4^gPewe0IV*oOGGD}Rm@ck&hTo3+$-{Jw z5zneK>h|`5xgG4NG4Fag#?uY^*zCyyjQ@L8V(SqP{J&bOm3MFAp1|QPvWx$=vj=n3 z)_unLuaLKoclKGrUUPn2*{&4$tF<|*&#lF|JCk z&a<`)#QyoCf87Ux4?~s9HLe4nCjPPUnivGT%$Em)-#^2CYUx2fe+qEt(h=n%`(X!4 z`|-5;9`;}RUaio$g}9?@Wu_|(!@AsD|73bP;u0puEA)@)VyRE+v`rQP*WRu8)cmuZ znUzPJOf#o`T32*<4jVo2RkB%0-LM^go2}evWgJy4n(c zijZ5=Ci?AlA?(E^m3tgsAwELE#VKl^v2HY9`oZTf;wpu_wG=}<`O6lg=eRG%ep_>R zY|K`)V{=aXS+rlfOmAQIUBuUUdidbfH;B)0|6Y^s6Rbn)rq5RcPG9}XIqQ=l>}WT4 z?!USa`{p}_4-Cb*+0lhj{9#sD4{Y0Sr4`I)>tnx2c;Q@U>egIe{pUEJSiCZ7^mxQ0 z(QbTNV~%x+_M?DUU#v5ZKFK|v$!DP}2YR1*iSwM6C#JZI3fRlky??TBu5+g79!1e5 zh)WV2_V66egxO?T2 za{{03>M4@TyMgnt>2m3B;3s|I;FpaXaegv(!HK=mcaVSt+t^7`IS#K z4bQ0w*c$2i_q!bsS4OY5O9pXb+6N48wfV+pCtx>& zUZ$*f5wOlNbH`fc@>xpMqF4Vu^4X9xzt@`TVcn+uH1{#`ZL8PZn&W}^e>YF1E6?Dw zp5sO~!#DBS&ye0tQbj1&X8OuJtoKe${FD;d%x5REZ6_@aMEzrm#4jBYu;Ge%TaOkA zSh~)NO)fVD%u_VH_#oDQyJs%+d+aA*%sbS%J3_#UTEE?PzbjxD7M%)?>JYF?r`~I( zH4B*0|FQSx;aETK->{`9`z|6PM5U57%TTgM_E2`AvXnxW(n7RQDydLeitLeWS<90B zx{!(%6-p>urEs4!m*0IK_kH~Cf1cxcp1;11$+b2JEs74 zjK8nEJ?T4%lAql${GBw3D8W%Kp|2*<+Z+eYTVqh)aCfQakx7&o6gF3S3d-$zc47sz z=kw9n={0;GScaOvOPkpinognB=KcP9@HuJ!-&1e%;ddMKE^Oyn zE<1(lx#1I4E>kFP`1WA#$th&@b~OhxeBb1zR@br(!c!>DM7%6r8Gi5KMN1u>)fA#c zKJI6C+N+O23V4!!{Wj{SP*NhADjR^r9X;IEUYWXH|&3}~-q z)pYkbe1CO#(+Vx> zgDLc7UHONWt|`ROu7=_fKmEqabTyV^SU$eeUpVA$hQ!FKmJPt zwMC(73hA%b+_B4R3T?chl+Nilg`V&K(E2ZO3TaL8%Zx(3tEzI|w3SXFw(SC|zQXrf z+BjQ{mw^A)s&Lkbt(ii%IZ}j9$xk6Y+p}T}3RCD{bgc*@l=~UGEg=Z(kbjq+AM>mu}=sZJ9?cfK|Kon9QIji(`X>)vrL4|G-AvR! zez0Yg?+OFIu_>-RSLi&AR^{iq8MsZOB+nCH6`&t8>f93_C8v>peOKh+UDN2sp{a9* zDbt8Ll6&{&S@<2cPkHmc)M@0n{GD^in`x9-zl=FBavB{QY{}xVh2NQ-o9L=5n?~Zd z>&|Rrm_fr$shi}Qr{VWKdCeA1K)#TR?7oO;RMAuXPxj$7DzFxaugZb^nl-t&ogb%n z@HJFVp`ve5PgDL(p$-s?anVu4LwmF`Y(*c0I8dK29S# zdB5Nmg=xeQsUkWC^ZH}5wYJLHDP+#;x1E_~1_^KD8KM6)jgBw!n(k4VMm8Ct&eh`j?QYG11Jb&pS@U6GYdzA!E;ZT1)a0RJ(S(hDxaI$&O`rChx^ zjnq4)Ief#QpKVpW9WWn$d>r1z4fC?}OW&Qjj45Pu>Lj-X(=`0<<$<1eVE0gVL%2r_ ze1H4wp8XDorcl+w)YOTC@I6~Exrg1%U>>hg+wkk?6v_(K9S@;SBD%lwl%V)Y_}tqW z3+o;5y{{Y>a*Xn)P*088lR}uE#qo4V2-e@`3&jSX)8Knqx%i6LpM$tJC-3h|dDG{H9;FPa;(=&J}z9LHuM?mmQ0Td7eI^%%=jsXSd_Uu7yXF z$XoBJr9=BqL}&BDLf{j;w_cjR&kptlg+s~3vJfw~yQcMj{_zvBE%#7rQ~3$c&zps> zoQBWE(~%2Ex`+;Z&qzn7P5%GC{>MZ|d*gtfi=H*m<*2ud>tT-oCxsF6*dEmA>6qa^ z@()so{=f9`#|YssiB|l7A|vGE9By$$M_v_x78P0P6c_RJF8nQrRGiPiz(6Wku~Z); zeGU9R2mbr;oWRomc$R9xdEa>Md9cxmlN?4;6V&DF;^RTb3!TLG;Ita(=mO!P^&X=4 z|MveFmh7d2r{4ejAFZYT-k;mV+m;OZ|IeTI@QX(9_y5$N*q8t1Pk;FL|2O{p@BOuv zynT+X|L^k^{o8TofBydCf&X~mKOXpx2mY@fP}zq6s7Q4Q<(CjGq45%`FQMlDff`G) z+7c=+q1OMAuCyf2DByokk@S*mwuJmk=(mKmiufN?G`b}7E}`8LhA-jbX8aE-dc9Py z{!;q7C5&FefTjH3OLEJSJiH_uZNdMbqL58A+_aScc`2W1N$w&JqoUnAX?k@_`4_j+ zWG~_XDvFh($rdBHAoO>sKWa<$oL{OZdl^kn)0u`nVl+HN98N`Bmg?ar9iyUF(jh9k z=T6h}SWm;X+i57dR8Ep~kcv|O(%L^y2AGN-V>PfxoSTMhOXXcTXtF~v4aWy)<#NTa z;Z*eJ3a)^P@CpsN*3oeB#73gm z^MNK0*UkvF_$VqTIX%93+MZd#W6L};R8%{;DM`Q_}udO8c7T;5#Au4=cjg_RcoY_UN z<)NVkQi zmv#ClNgr6JN!qnMX+iR{b~O@gT$xPr4`e+g`O$~h!H82)P0mYLl2mkb^8z>o#$~+* zIDm?lJJrFArXo&jn>hu*1iv97U)=J9)b~XQ4=|)(dJapTii~+P*e)TZogcRXHrEL8;`9n0MGuTuVrPeOzKQz{2t`yhdH(bh zRY1SkTP#>+=zMt;^d*83j+ z&;_U87LC(a2E6~(lN+ZmuRQw)<1e_s$N8SyYo)P#CeAx!BVgMJk!f6yplXbf5}^2F z#_BDAW~tp77^`$;nRfwl##P?l3AoyAh@M(%W%8 zzquL>aJ{@LM}OdY8b_O$aQng|8Ou}vPgQ-1#Cqe`dg*cg&W4Me*sdt6+2h**_fRBR zasGk2FzyY2FhWTsQW!?@p?{SNCEpg#$#j%*eH`SjrNc}>6$q2zpA&f#JpY%$QE zA9HLNC%x&KaQfv=9MGt!;5SbLmbo2x%CY>I@=6t>M&LjNP9Ho{(Sfn){tP!xw@w?| zf#p>v6DF|CVtRKI_ESZd)p;zd*S(0q;~=KNErk2mF|zTIJm9*sToJfGn;-VNWBql1 zr>wBvRO$8o*xvSD=~S$@TH^vE9(ODMI0y-9g{gD|c-K@VFk>?4YeYcclv ztb?tZif*xUCt$l$%}hwY*q&z`!0ArX?*uVYmD^!~!~B0fdLN^Z+TXWW|3h*pJ(lSY ziTYs_qrjCOU~Hd&H@06z|E(g%qnAqGV}0Shx2|CHVxA)Fxb#Eo$a;`9b^nOsav>MJ z_u%o>*uZ`a_jkR(4;zds?|zf`7V-5B@$Ue8I*BvsIflgE*kDT{r`Fn#xN)Iqkfghs zN0a$?v(=ZxopY1DB;8nW))cqL@z{yPv5eoGB<`7{9)TU3iZ&)?U-4o&0!Ipw{L!TM_%T3};=b(DAvb~-BBM=c}e z+b;zZ+;_#Miq?%S=xwbnr0Q+{HF4;Hk zYU>jWbQ>f7r85N;PT7CDOX!_UE!8}MWjisd@`{hLB z*K%$I&o0pH<=#l+5!yDe{eiv>ZWiz^2EePZYhnyt;%(4*BIjc_Li(r$4L8H+V|f}k z3#g|}L#ZX6wfh^*E(tSQdI)Y7^ghBY#~8nYX3yo9G?@W*Bb>exW(~%TdNfSGNShby z+-UkEax}eTu!~{64X(8Qo?o(q2WLZi90ovvCFEYhD};yxk6F^sUecdk%7@?te^ey0 z)Zac>ZCGAhO7~qtZsHg!I=PaTuPI1FdUYE9!tRA~kC*(r+ni?S;F8|FI4$4IfQCA2 zXgGiY$`Lg{GMxZ1+rsJDOZ6UHlING~Nm!DVm*gKy?Fuc)f0yztmgI{|_KPo#ThdZL z&n?w&j@=IJbuaOM%0FBXc*IiqvrBq0OXc>jqUpB_(=ZHo7xc@Q^oN()d&Wsi*9)NG z9Xza{r?iB@OMaim(-zXDSJ3=s4$%Y4vzR6WZqlV;HE{s&6e~QSus`jlr85}OPv2xQ-o1 zMMYHXP*^{oKN7vkZ9`B270G5|$3g#>__|F37m?i^I|#;0%Y)%m)Yr*Mbh0;ovp zPdlm4Y$ZME-=Mk$(aX66bP)1mz3@pDc;9+O(tfUV8VnfhUm9=7eyi+jB6z0p7z#cRJwVPuk*m%#hp*quBo#=y&X!-9ET>`d&~oco6Gj(z`ZV5F#M z=K3rQ2o?Fai@|`yyq!M;R{^j;DE7Ex`E!c?SrUPIgBGte561B)Ro~R zN=3V*U`+=mRHA;1#DB{YgD77F8H|Z~okk z%l&HFE`s^ty)L1|J%H`Ef8<~uaw7LbBHq_2&*)ll{{D%&K6Su}`j~iLzyi_X2yH;a zu^%p&f1!XHKa6&+=a>xudFIjUTH9JEr*+As9`kX9ruuPrwQviEsI@wlzv z=QU-uxL-9z4_5Umfq#s*Bo9G;o1mE0*A2iEujIE0f!vgC?U&Av;AHm?+|U%u?3VErMI64ea?5bT_PYO#ZePH9?|yq3~@iWgS6Lw0lYeA@y!s@ zU-YLR!}CsZm!2m#;LmNmi$#F@1UPb%0Hf%dx9H<^oA9+3fT_*NTm1pW`kO!B0(AF# z%Z2Azg4(V67^wH@n;F$sbxf0b@ja zjZcCd`?)10u{>zuso@Ifc6+gC0@96E?aBKM$iH(7U)g4u7mkKr${_1LKKncs`r*=B zCw>g{hwDw+-$QzegV=;D$Wh|MJ$N1VJF?x!>&R;~6t2+V9LgZtj?<0Ls@viIY>ja& z!~R?M&IkfH%(II20epUFY?37Bj@Xs4hfF}Wwp?!pAI?Lkb;}j7Kbi~WC2>FZJG?Q% zae=-~d09WSFa3+V9=BiGtlEqHQXyy2jP*7ylXSxV+@izPmJNDqTFYGW0FP}_E5!Ac z@JI0AbGhmGooi}J&x0-mQP>8 z_K(OK!UhHW<=BEL#zpCmBp$Zco|VP@DzATW8{2F6ag@Zvo3agpSTCu}mh20L$JjgY zxKh_|Jc#WcQ696x`YsRSS7SZP^qb2u@^KWH;Bg#F%p>~Cm@0y>e#rDjUfj;wAA!V9 z@3jUb4(G6nlKrUtmpa)$w3n?TakazCoTLjIbpsQDdl}|AVz0z+IOc)8dKGOSq!-2n z9@f9)Z)1!_0pdI_8q@JwRxdde{^j{V1Yo|KmXQ5MB+QrWOQlRS zy~V?K8FBusL=`zlSq*r@0f~yvMR>x-4d?iZ3R2Em3${U!l`3F+0F-IQM2w0QgE29O z_1Xd38X)D2Awgxezr+s4Qs^$E$JoR61=yuV>xcFkOr)UPAWSpBTwB;i0RNn)-S55l zU_s8#w`k~>OT&jkG|a{3LVo-b zZ^fr+EN7Af3ETsmqvg-?(9nOW+``g*?zS>o`+D;9*iGQ1q(d0j{ z>T&w?lD-MdVk|en>cuG0M6)Ad>3kuzJv93+q|;=+W?DX4^3SEE z`4hNao0Rj|O6z~^51RhoCI1e>trD)+=M$}bv_Wp&&#HzJCK7R#J$`#B;6jO z63$ncreUN9P2YVd&HkGY?MVK!qqKGTXAf=s#xd=Law|?kI0Fn_`xOepy;mk}oo04p z$5IjdM;h;r7{CW-*x!o!pkgZeI>15lZymsnhW+&d?Huu8fS1V3{7ldQ_~`^~{RZB* zCh2hwD+$Ji#}a&{{tP+}=ZwfQBH!S`69eYM?g%0exW6N^R(Bd%uPj#YN&D(=Q%OFz zBF!$-m2o7!@<%!>5V&tW$g@h{R1zOE!`|nDd9kmxwtzV$ai9F;eeY`wY_0vGeJRIF6>C4kP)FcgINn zLfb}CexYm;Rv!52vVIiCx^roU7~dT_4}k#I^X@Fdqh-Dyior75_+CDY)1@P1e_)XK z&Vc1lI`_|D+~H`@OX9ZXx+{2J{4=`;j=+$wWod%*pRc+CD-q7+EWu6~FRWBJhxeP_ zxO1{%)htPfelUOfi z;*1b(m)V!;JKoRcb2ON6`WA*XEnIH7OU7=T&v$i$C2p_&?$_6tN60N}f|D$q-z5c< z@VS+SE1&b@bS;A!gNuN< z=a^j}oABU{w0H|lv38Uz*D}mSAca}2#rl4MZ$H8#m#g9C{xgpuF-)ZRl-w-=TU7@Ox*|p--tWzDmV^nzsYCyDcx;DG29b%j>s~iokt5 z$7KfvC};S*wPn8r+!w4YSZD7DewX;V{s7onlPtYyC)jDMyT2;|+WoEOC4lE;&e}-< zdcZqstJa%=U9yS%zd}HE$P{?u4Ekzs0uO3~zDVWC*Nc#@(fCb72kh*Q>OI;4^2(I& zUHCj5L19l{PCo}<8mmUq5 zfqKGYR$Q?IyuPYc2lM;iksj-uz+Qb*wu-$Vj~tk1!uF{c*HCa=p_<(Y!RPsw*!{=t zA)V`Bc;p9=Ycp1DOaa{8r+Jnb=xO?6>yvS8KtdwoRbq)Yym7pe|ffp{*&{O z=J?z)#dZD;UcbrO+nRBl5%CGt$8o3Sf%|)WJ~B&@|B26ek*5?%{2Ox#uEqU`{e1>D zT6jLmc=8xG;Bp4KWE{`ds?n9=_~)hZ>KfM5=6W%J^;$VT>azfTmdHB933$^&ssP_# zs8z=T5d^zb^x^6m&eKVPXE%YJJ}Hr>4}e@dcG3p>xn=6eDtw-ssV^#)!Z_f_jLW4R zSObI{{I1hY_MMwYGs%9ryj_6oYaxmB!C23KeV`vk)_w5U2=Mb$eR59PT477>r`RV# zZs2sYGi%8>ncVjWq5$*eMAlx6D~;%RF(&*`|BC(eIOh8%9N(oS!}s9!ebm?P!1>)F z<$p0QWW3T{2Pk!H`Z@N;QyX;&tiQ1C@EYvz=t{{qSZ{;R8nU0O_+*j&T6Q{t*f$t% zO7`jUG}xvwS|H*0X%yB#hA|CW4IXn(-dOUrx7uKZNbxILyBf>lYWi z2f`2gfQ>EDOUiCIg3Gaa(s%}kJMBEMJaiwidms%HRw{bgN;`KvRG%gG9=izFdyxL` zssPEq@y3DR=p|l)8ShLYRKkqOM z3#5NIQAF%4ioZbQlCNM6q|;U4gAm;F`~Y_YZhKQe#-(x(?cSPO>M2Pd-0+2z_f4Ul zxA5s1>rVyI@NEvwexLI+`+xVrw1@nR1X}(xMjCGOqTy^U4Snfk;UB;QqJb6yMq-)^ z_yP|XU~MGL&TnsN{r{{_liRP;xkqv?+w2k%pyrPcfFAnm-p!-95Bei&g+^u}&-6FtHBodgZ%X!DM3FRgrN zT`-wPyAq8_e(GIVc2Mu%`?Pb3l=EvMXF{~X=}dEHNxkn4c!_*{EQ4U5tSLAG?)&~! zfMdXa?ytcxxZheaNb28Sl1uVMygUhR(mia6^YwMvNqN7bQ$+8*WCvM?10@w?eHOd1 znPa_mi+{-c4chmbls}Z`N%WcT;0G$O{{8N8V+=TR2qqHnm&0NtpP^us;Hb5|I8Kj` z<0tuR&x;bdruQ3(A1(2AFr#5Ut=Jld(c)W4Azs%?C%3v`dECVc90KPnCIJ!`BW@P; zVfo9qSOXlNpF9hJ1qkE#YJ(s~y_tDGj5TqJa3cWsCK=MZaD3BuJoyUCGNQ&7IG-(7 ziP*oVAcMTOu|m1@Ax?j3C`;n2MyCjg(*=TFf4LG zXBFU>lGY<^XU>LPS$_z=PWswbufc)KKQ}J!fiI8@~(iHXSST+M|#@B5Z4Y0dT5wF)|eLUkWAMV}$(t zAH^l{u-~W6$p{!h{*`wV=>mX9)c-QzbAgq>T9qu&w@Oc8YXaWz_>yoB1>~EWeiPD= zU!Hq!4dx+Psz=SSz5E-w?972DO}Y1fZ2>){t9v~1A$^A05W52K-5(oie827>B*OR_ zczd62<_B+Rf4Q(w^PQ~0$=iv_1=}v2G6bbW-1$keuYPAmX!?n zVe#0LbJ{Q-*9;3AB|yHpyR`Ty1u-)vHXQ|ieZ}C{bS3cR!=)!!5~01ylV?~;d4QM9 zoWK8&748+9Nr58`i-*~}_un3w4N z1Ot@!J0YnjxfjMaoXuyu0~ICeY_dD{vkUFrvUSRmLO~)fH@=(i27S6K3*9@w{`NIl zN{2d7OASY6iuFq*l%RRp&0KfOqs)&3J z=aR^YQiP4}xHvtO||N z3}BzXbMM~P?{KbX9w^@J+>MeYe52k*bR)(Z|4kdryU`Z9$-`l+-SE3shfBUW^q`#U zR+m@u_M#2uhj{zW_oBh{Qw1_td*FO2bg=wMH#)PT{-|Sr58B3FSHYmxhhi%GnMbo< zBhkQq?rpt2DAPw*GX636CG#$e+Ci{`T639B1I`buwv_^Kj@`vD6v6=Wr@vL`Q5BpE zetK4?D40S&IgL_+K&Dy;uhD|}+We{T*&NJk83v}Oo(SGQjH6!4W$#9*A3mvnNrZJ_ zJ5aUwmVy%Y&1@5Eq@ehY7uK65DJaBpa4;nsbLguCE(Mm9`3^L3#qona|q zSZ|$@s}}l!*LPpJbhr;NS-&fq0qpbL`p;DXuu&#F_V7+vw=K;7)S-Wzf|~>Jx%~E> zj4Ss5i==Nv7s5K(V4c5M`Hh0+7}+Vp>mi&vil+ejX{o>d|O}zc6XqlCSy2P^FI|9NQL^39#4R6>7urE+a?R1IL@Qaa^2uU(g-st;G8gd$|s| z51CO=qH#a3ZFSSc=gSGPD6I;x)7L)x3hr0zK8?Hh{Hfsf@Fg4I=|I^XSns>; zUyWNZ&sUt5>;4A%ZR@|gk3;&gy0o!x;1~G~qXC0}nMb~8V*B5DwkczD9Xv0GUkY1TpJMwrM3f{T!0Y!lwQ&98htI9Xb_9IryM+B|CZ1~h z6YN}AxA0^)$Z@wg8nFL5W)FpJ0DL(k?S=a*q`xHq*PlG(PV7FTqfgE|PoLr!w%}f? z?H}P=t!KgyV)?6Epb5t7o^FIEDa!)g0GZL;jOaT@%D7@XcZ=O1eCfl7DSe!ue=k)U zeeK7$1kF72tF9;&t(#xPSA? zPZh8}w}WUU&Tn;pVT1A47kEt*a9@HfssG6J2ZT39xX%&!pPVF-m7L3ny{6LZN&4HZ zG@iai1!x?UXW8|Mq(ASsR>iWmO$y;(@elBYJMg4tN21peRzh&i%Oi9+{X*tLa*jF_ z5JUVBX&g=bW_r7f=sjHbOc3kw?c2+WQTdw%;fZ=1g-O1$qz5VAl>)RD@`p0Oy?_Eo zXna3k4rndN3RcX-j+Qx^-R0cSZAiaAt3yz}ev0JZlU5_>^>>zF8v`sG&{J()NpQzS zHG*BA4iJ0GRG5f-fQxpHVpPl^<$_&T5r566c)>vf=3QwgN#Du=G#F&PG1_yr5q?F& zqeVRb5`XRFS0Vl15jI8AzdblWc)63<8&ZCJEe{#D`DOS42=K3wZ$xjs?|xD)J(LL? z0q3XwANw$}{5(SJ{N?kP%v1I_H_}ela${nb;7D2>o)?3obtIq1&`A!LbFv(QCqBR{ zex(1x`O6zVjAGtfnk-BFEmku}+Pf<0N5F6ldA)pu z!?-74?JH|?9*{iQJcsLHBWnj&XL!AH1(9qc-=9uZd^b%5Wy_V_3x;K5A>?2*Z^PyM_#@+utiwZ2RXB!WKMW#&9P(CfGVeEJRW zO*eCjh_c-Xl{q2y9nZ(xnaPL)cKhqJ~J#_RzZ5Hf@m!&T+q^^bM$z!4S<1Jxa z6yw5w%Xgz@PU(6XRoE}r%ui=PJMYC$s=Nb!UtMB;f=w8Bc2L$tM+60#&>OAJ1Ri-r zOTY{FN8!Zv_$uI22h3O`3Wq2t-JI>O(>MifsC)E@O90;IEwQ=7;t%)fH|P{h1}R98 zN2mEa@H5rLu&)|FdQrOI=Emp1!%o+%tQCj*|3$y_$e(ZE{+|*k*__dh)c$syX0Yi% zE~3r}+J)|%Ht*UG z{IuV|x?yZJU8P>4 ziKN8KHjf)nX1T;&jR{sFYnje+u^Le*y9=B$+d-9z2$gk%pS|*p9*|HFAoe8UT zPAEouiX8mU9jQSFqcr!73)Ulx8zKE17ES2m<lw%bmdT28MikD8HkPPn8P_Hg$?M6aR4bL@N@Kdm>u9r5iE5ij3R| zL-w0KTCedMDTmo}X1`aQZK_qQ47ASgyQj zK^vJ1l-#5`k>feW+4gr76kHZ`RQ(1#mki!u{+PKLmG*w*3h{41Cj*3oPFuc2a@&*j zD^$9W!}|28geeMgQ7q9O{?~x6Oz%6t*RLKGO0Jvv@v{M~?egn&p6Nga%|7;%A{68l zO+Cp5&k=4vuS~4~J}GfO<~`}d2 z+OHH?Pl9VWcimHmbs14nc?;INj_GK@sYWr6C7U`)$d~N1*qIa_BA(%+pqi zH+?Jg%l}+$$7|s6pUdgKO+tLw$I{iq0qB|&77l;l2AJ)TgoPr5S!t z@4NMydIPXWAXX(6kH_AB|9;2;dL3bQz;Y&EU9mgp=|5o%-;C(Rl?MsVPzz^BSv>t#ylf9P`-j6hPH-E=G{%lLl1AOl^eCLW;HrR7MJ;uHS zIc@YtvO@Cgdw!3rKvG0$cXoEO0R@N$nctFa!Z&ZbH1r-%Dp zTh;(d9t&Z^daQR_>G8gr^ey!m-hUaQ!_Qzln-3p4iR%kJUeJd96`QuT2HT+)t0s!; zO~_*bf(Yl?oPC5Rztr1H_$vEhBf_K1x!OrSMffbKpWSzu@Ej9%JM!EjDxg~nmv=h4 zmGB^rToD#*M^H0IEl!ubTE~M?=gtfeMX+mD%K)SB@rKjb&R7-p16Vc-%p?9%Ww#?d zcx6%m5KVZ$%-!}b)>~t_ZZGy%&WCfSaJmNH4ql995p{W? zMY0pgIjc+G${6Q=oc}=TO>(?P{L=r9Rxj7Zd%K8zqjA01?n1?4(tjO0xb6d)ZqFqm zyIip*n0Y`s2j;oF6rRm+(d9FLm6woK>1Q4{E{lK!-hfIKP$oHhGU_L2)D$>)Ac3%fWn6 zs$lFm&X>?%AbfJ&;zA6bZ`V%7kms46@e`@~APa4ZzKrXeEWb|bzp{B3KbA!`H+bWD z-CWGK0hjCepgw}_Od9I6#plgdvGp-{9pu`KwP4v~%rGee@CLhx5niVPesj<8{cq5H zT_Yhtp^x$>VgZ@$er(={;~IbRO1$3Ju3FB8*DuQzr_=bJSoBKMyKF$7k7i~U0UbV% zn6Lmod%A;%2hd`R2*XuCsmtSE{UQGKxryuMLwp;HLM!om)2drv(P2L+-|2V8=jxcF znx$M2Kc+pi5>lYuy{)RHQIMYVNF)@mcV3MdSIlSkW~48uK-?MezkawJcwztP%BfDs z|6KWM(E!@9(&R4IhWsrf$Ls|luIF4o^4pUM-UIo~LLUa@RHZbl}q`sPC<~ta&W(Ww{i(>mPj}{*I!<@az!%F4Ib=gmz8uzSv|6_mrD2 z^GJ@`zx^Z)(DuaOo}2{=x_Q-rE7KO<5Bi%rAtD9$8HpAvay%(0 zM>H=m`d~L2_kKOP3F^5jzky5k5b)&ag0~Ohe(bS(+Q8FU3c9KwZy&ez6$+vTom2_x zMi<+Bi$8Eskdm#WXrDwkdg8k_)7hAU&hPywaHJ^%>7R*|wS#`BM6fP@&q+bw`D->d z|LaE4M*|aBni`OGdbtD7rqt@+%a5*PsOUr|*>j8@9qvKp%Jm-KMLW<>{cMebv|A|r z86Ta%t8&Et!*Zrbs|SgV^|;LS!+j}yS(-&?B@(Ppa@Oy>K<8D}5~2G0jCuRcZ|5-a7EKUAZP1A@(c-1X>_ z`p)cRp9a+L{({M<pZtc=Yu# zT0Wh>_2K1WlwUk~_t^5MXov5QhyNlg(LH9#4L6QeBkjTWJU{N`p%Cx$8>p{~(bws< zYZ(4KMuJYu`xAebBBkT;&+JUgQLOba60Pk)RgRs>wm-Vi(8D;r2lw02sy9uS2e-XM zKLc%s4EHpki8fodWvN~8doVt|4|a7Rw|{psN8MUc{JRv*S?OlP$9%b4Tl57oE$LHv z&eMdVR4Vxt>>Clw{iKhd!4EB*4f4j{Umy`_&YTxU^=Nm9&@TPk&r!ZNLnfnQJ^U`+ zr-s1?^(bBB=|)MOI#lxHVwL9F8u;Ay9aOzokC<&vwSMWULvK@9Qd`99P=!j8px@yd z`2KP8uhyR{PQkpv7_vNu{P2g!m>dc9P%&WW5*2Q$!oQ3B|ye?U#Rlbagy^3X?q}?2Lx%9Bbe^{2XF9ojo{F{MKdS0tfcnR@q z`lRUeIK*48jV6chKs-&4c<9qKM?uv_kF9qAj~%IrthR#la&>qbix%+Z{?}I$@VUHs zL!P__#LJ|J^C=Es@8@*4bQg%TLGe!vq#<4!{#)kd4ZN1i+p}l$ao{V>7k%cT{Z?s- zTOZ+E9?QIe@1iT6Fn)i@RYj%>--~Q;s<93Lbn`t`b`a7nET5k61HJtU zJ}>e9B+MWDZ4T>~FALibGWY$cs2k9K%TB{8Q|OoN@cg|6NOx}ue7Oqnx8eKcJ)p15 z@scGB+8t=tSKkNr+2#4j<9ia<08e{)sDIT97tIooAFK}14+T3L&!&5=fqf-GjlNM6 z(#wmtj|PCAXa40T{Qgu;K*k)l)AV-LCd?=8!@G`P{1y6L5A(@eLR3Y(PiHs^^7{a~ zGI+S){V$)xPzCGVS3A>-_eB|&ZG`WJ+@fEJd3A~2pWS%>{Z_T!TO08A%Z+9Dp6K`& zxjUE#L>IP2>;}CR4s&ljxu6zbR2WUu->^=qg+d~858v$$6 z4-J_^`t`W60?bR?Yfj9G0)D!D2Z$WZ+p)z!Tz?!_R3PRl>oq&bz1;CP-0QI%xKk_$ zqe=6cKUmMFPgo4gg_~;Nf)wt}R71f0(iuL zHQ~X!X`cP~Ig3Tv@N29$HpAVzAw2%`Sv7H7|8IqGGmQJ6)e}BxYh1{M+xNFRN%*OzoGam- zcg3X0{cC+u$WvU8iZ^u|*5g0oNbcz?Ti?jzdQPl=OWNhV_NEW(sUF=*c>9TSn((3# z%yV0rRIDeO^Nfr`H*WyKKk z5nw~MiVW5h5x;dD`>&g=Tz-AB76%@W2d!Lsc%BZg za5mEc%pdeLKM81iLzffRI<0Ut(dIp+etDR^aN0eCy;QUbn5{Tw#Qik~wD_9zNA0WyZhy-tAn z`-jEO72Bz`vWcG=aNypF57vOpRA0VAz{|dr=R&Zq-8N@inu9E%{_6W{D0g2yvZn@Q zrfMeLwIEAe5%c7R`$@J@6^SX3=RAX*I3R!7`SrW-z3BHLJyrbv@rpOzNAn?G8hCRL zb%NeGN;P#C#22;;5mVX_?}V0zo;HK~kV)ygkzEX6ueKD$8}iGBsxDOlK0Z~_a~$+~ z_1z9AL%b}o=aU}cg!k2i{wgH_e;gX#%i0I=L_)Q&R~+KBs{8sReTbK;MJIRLnBe=@ z3#Hzm*I1`2zY5~_*s~9Oub@4SyUWF#p= z0^WEyU-qK_>_^;rcSh!b$EuEJRhhwkL?EaBdKn*BH^N;e>%UWwu%DW0&ld`6%{`dD zUi=k$G`M}*5Zbjt`*K18VcZJ)v;E;Ya>LNyTWMjiF2|M`W^eC9RcpR?@3{oLU(b3p ze?ROSiB~`O!+Qb`w3zC{le^LOHE$WV>GYyK289>8t-4Wlpj%MM1qvG3?rRnvY78{5anj z=OYP!ZO$OB9CT~K$;r_!8~yXUyK8i)04ZMAI+(m68!4UmDR*;k4(y-lS_Y?{q4~WN zopTnCQUCVqm-MAGQB3_ue;xm4s84Xki7dYtD77~^q*kUFd6zzL6v)U&+H{LUs?Q#x zOVi(_MW;&9`tu)^3w`Sl^Gx`|H|ja)aGR~3C_9X>eGr7p?mQG`-PXX#tapj9(%0+aI%N~gx%|S7ge5TcZ3z2xxLTPSwK2j3j zrWUY1A60n&(AM|KLw}Cla#8x1gZ%o-_|SnoR25|2sFDU>A`_pCMpM~1Cn&x1a|-psbL1k! z`~J5}2XYz|v^YNBg-(TT?*E$s`?c4bX zC}!C8!abTWOVX?X#8bwnM;`M)Jl^~H)n?EeZFOt6f^${~?~4rYfXb2Ke2-O-J|f13%L^ z+f#lJcv;(g|4sguH18{j3AdJk2>j=YZK!~wA1wRB|pSq%7o!LF ziQ78A(*rgZ>At)N?W-B5bCp89=ReM7rYgg|+Ojiz_TX0~t6S5f;HTTWte-VP`m^e7 zQ@bJFn(BN%?G1LiK61F>19tNCmC4}GGqWDjjEk-_WPpx?^q5ON0On_r&!U><5dA=nGsBEzJA7hgq;} z^pI;ceqX|7RgeVUS3ijJq~m=!f6K-&yk8$G)_9526WP86;r9;$M&pL@d*@^H502sX z@_LPvuwPieDrDe#Uo>A;#`nUnt#ur5`;|My*W-P-`_Q!)xSrC3e%^S0f5<$MfbEq1 zq#eHrP@DeMU7XIXEoX=I5Bxlrg4@4UuT1z7Lj^zKFAj2>3Ge&u z+>iU0YT!j=xObe3C44MHP@dd({xV3&#CB!ry(I64aK;@V{B@^n%ynE(7Vi!=jCuhF zC$Qe(po6;jemc}Z>J#?2^5cRUoFDe;9(j*6ay#8c%(sVFOGEH|S>;%V6xKVq$xH<6 zaT`<`U<{S(*T&;=vA2FNC*ZMn#&Nj*^h-|$aJsfoiVj;cll!OSLrw!G~3iv$2sgArdV4i0Q z9{W)P{386@?n70OAG^9j9Dn}iSj{;5U0DC+%pt4)LL4cO)_lGic+RQT3EqcLo>G>U z)ChXcTAG&nP)~D~s-x=$STDAndASe|6E<%@I0*4-<^bo;yI_aIc8Pm-a35whv9oy6 z3F53NolyM@#M$9)RbGgTwlZ&bc0!ym`*6RX73$qtcXnAKyicbp-j{v|+V$GqXmlR> z-LOWcjvsiJiYJ5XCL7>8&YC;E!RMKjp72-K?CnBl{$0++ zIjV;0`dTjF1FtCR(-zX*=*F*z-W6+Mo^B1)oU(`KJC!bPFEGP>+*s70EAS?tGy9@U z6MNA7r!5|@nBX4l-r=&OUtMT8@YMIAtZw+-+Ts(I3hn5SWWDNJySVDt{Sv1f?@-X0 z6V%mSQScnpWqfV!g>JO-iOSb|J+&zF!A*gcm*T6_E!@8<>vbWqW7aWK0X=AKK-LZ4 zA8qJu>Goez)(;Rj`g5>3y9O1`$)rf-cB3iQ!p63=ZglRXtjVsm@ch-cMaQ)DAsQ~t z-(9I!gH*i_S-(y0K_y=mf?L7-6*?k#l*-@I>o-`40~fN1xlrInF#JnU=fz za$6xXQ$IqV-=2%CC>K*4Tk??c;wRn!=BMbb<#PdsmO>;P(A<1;djYEI3v1!Y zL0l;kpLVI|B4h76QVyYc=-->`UX%L@knRwD=Ufha>S^7(hVZ-D$d2RQ<*EtbtuNoL zQ{I@1PH*~jDi;-?q`T|`^TLJbQZmJ;NTLA62$wuz-~9wxSm&i_o_UU}<2gni1AkGu z8vU^}S*Po+Zun2WfjGZq#K1Ph2KP|9ES0j7b zz{@AK8qg}I$ah{XT}bFm(4I4aun(!G+lB$}ODd3AM+N?peYaY}2F^dM9p0mX$(`uc z3U|sJyg#9}W4>7dc%+85)qI2iykBQ+BqzWEajijr!{xiJ$g7Th;qIy~1UK~))Fbd* zeQ+ja1)O_=-^S%10Da?`BSUwrn~?4aWSz9K9fi*NS2$)+(D0LOl*>2aeV8LDUA+(= zqPAtnsqJb&Dn|!OcK&KXYb`%=-xr|3?@0J{TgAcm3HUhB2|@h^EMMAZz)pqgR^y+* zUz~ml+v0mAu{E5&kr0=*v39QxhB&^rZ1=&N(61Y8`FSxAFWI}xK1M^F6G>M&gP&VF z2M5oe-U^>H9A2Nc9Nrh1KB8?f#1HQeh*xXh2c8wK-Zz&F_3jh5zR3jf%AjjK~UEm8@ihh!DvQ*~wm|5{V?CLQ_P9P*D*|38_f-p2=QWO`C=i ziX`;c+K-IYY=-$Oa<)~j5&W&1`9J+BkiHcAQ4=;uKcVx{?PMtLn}DSH zHkhx^G|9=MeLC2pVR9VMa$NC%G=y&r?|5bodUN`xcyJ$iaLw5#xX(WEGkSV2$dj+) zgx3Nu9Q`iRdIjp$Be%kl1@sM%Wx<9R>~Gjb=e+~W=9KNj^}NAGf2I3SuY{t&QAv0{ zLrqq57SP!&a&rObRi^%Sn?~Lnv4h(g>`F@Yv1RrU{!3q%0m~7*tbh9-kgdCD_Fy@E zBQ$l9zxYkn@uS^sP2I$R_Ex0uVLRIA;2JFl4?ynk@W~n=y-Rc@>bnJdilMzb=(K2n z_V$v-``x&1&^yMPtpRd~Qu0%5kAaM3Up4}6Rq&QYeXp{c(+5EB{xtX5?|?sU)!i|L z@T<1l3{X$Cy?zq;+40aB;W&s7vq-VS?;V(aUduIx@UqSZ_+TF1!>t#!LV#&rGN+N} zXg#-yMxIfm{ec^?#yYVV%OCEzYZ%v6jHi;UP|xJ7@&}CnyV^Y&TgZc=*?tG@f^8=TBomzVtD8HC&wt{zd>#@m;{}0{vF~&|a(3 z9(^(c`D>tAA+Bq_(QJ;w_iCaMIgIJF#?ya(0sT#B`{s4Xvjo>1zJ+|(&B&Zt3$P=2 zr%D8%m~%uo59sO3s%zPRd_(-jNj|_IbT0W=4o5Y(Iu&q={^Qwa(BFD&%DIux>sH7K zKZECvaosFF0OKWew#WYr@E0AfuvNuuz^7dA%}-;xM+GZ5LH|JHJ{~vFm@d z=V{!;3gbt!nxR7<{H=OV&t|TDuudm*ZORh-N~_%|7TyD$r1pFE=YiC2625urYd!EE z=M%pfj~oOZm3C>%G<-L(F}O&vKp5t~4MimnBzj1K6!*4BI8Ub-y7gS>={a&a&4W;$Afkq$Utr;)sRdK%{aV;4eNVI7HGD8gX}d`IzTnoA-J z_HFEwXY+b^D&YROAlCu$XGCW!lTG#40wSt+dea&DI_kfDt#8_1;naEq~Pz>=S2FQKqK#L7fJF}Vv8S! z?_M?*?u&0NBs739p(CvsB9=w#QD^nkJW#z>@C9mltY@ z_4+}h_rA}FgU#~nz=&LO@^0YcUWYtFf7-mxR1)@MZ}zW!y1klg_$2Jo#FPWyXZY#( z$mSEvoSBB~wgS>HyZIN_p;97x{gWrZOcl9o;#pgGESE4=u43C1SwNnv-d0xGUqqhB zC@PD-E+tY=92AaE0-u!7-LlT8j+_){zZvzbiTpg@uD{6LN%AK3|GI*`OsZok^YMmr zVd}m8Di3Q(WcwRN+BJ=2dh*of;$S%U_b!pE2G$d$#Mg;9hQL0)&ftoDXRFCFqhAji zjbD=RNuyUTf$bz{YS-f=@H=?U)0>*zgn7dLZ6E8|Dw4GE;JvM(FG&7Xv)msS+Q>S4 z&&5B`FUAh~c|MPU`Onv~J8pXw5zUVG_kn%K-r9fkZ)w_yMc);^7jPbshEK@s_jT}7 zwgkVXgZ#5~kN95$d&#)q)>I4qy z8yG*QHE0qG^I`vkohk0K8o1K~=Wzpt}~baDb|YV5#X zzSOsnLwmi+Zr9*>;0pyiVvpf^HnYYfjmLnZ?H71sK~IbRCoO^bof3Cd z7y((xZ^NTRNY^5vl&cK%xZQ2u^+LER2NP$l9{6Djf{UFn|9qVcY!(K+nUwUo$Dl_l z4F{9~X>NyaiGlSpVx!=m0`s2E8t?o$u>U6t?f2up<+*$Mnfn1J*Zvi`0p%=RuCxr- z-8mhmVs}G6VjV&GXm92PTLXnqW*T0>y%prMwD-5;ykD3ux|bjDVsZ8PzktL2RgO8JcRq9C5AH|I zCCj#;UH|;_Ho<4y2`%5dAyf)b2Hlc;-I#pmVkpd9~!R#wC}U0?Bxi( zZXDXnvG=vdu>6afJ9nYXUMsGF_R`TN13pxT{hl8~*%;0(w5W=D8|78$(0(S2${X(i zbjpg{iF#KRnj2AXHhjZhh((5Kfv_zPWJ6U zneB3#y9J=qV;61IqvJ1N#qgE=qQ)pICaUg7Jjt_I!W zTh#GS85aPPudsM$!TatAJ|K>ERp$6!ZEnB|7b14!d;4wrr`ii}|4Oc>?w}X-qS+Yv zgk8PdPY%G0m{k*&fc+0&aUTGD6=gBC4)iXk8MkA*Z&XN#!uNRGCB;n#aNm&u-qV1K zW^HVY&~F`fS0BQBo?LDDhwowK$phZl9)rv;y<-6{Mbi||fnMurZg*VQm0A$JlLO%w zYQC?cf&MzMr`Yls*vssHQS6E^t`m8cc5DPa^;a1;=Rhy*E`3%y_TOF2jyFK>S93}B zF&IBS#R?{i(0?_i!`|IP=q+dY_Qz8k z{EAl@U0oKi&N5n9qXqWz_>}x*)y__mxfnwdr=eV;M}z6EA{c+Vm+iHlj~eJ*yolGMXhU=FfS#rrXL19KYn^wEv7C~ z*3ZW9m#c?_Y*pEE&=mX#$=?pGkT1`dYLjfR=XcIeTuW_(eC=*m)cE!gy6?la(K=A> z)wwp3uzs^CWyOMnyz}%fBpcL93l}?cNYJHz;T!c`gds(rLtLksJRRZky!E$`$hGb6PIM_E`_~_H z+B}d={Pyx^KCJB`g^#@MtK4cP-@KJ93pN##pR)*BHKCPAJ?52jt}i7@>}Lwc&Xtkd45wQTsuYmXO53dwwcRA3jg94sWIKsz*Jqjb ztRQ`X6QP@KmXST{B)-SX6cIbVlzS=1bII2a-O~Qo3WzCVb(E4_5jpy5ibv{ADKW3# zA}BpwNu1acG`eH+h!=*%iNh8IsSqJtqlVRsvUV${Cb@f-_;}CE3jrzg_=zI}vfSzvBV@?6vUp!nRmgXBV>y=g9?r{MfZI z+Y8Q39|)I}1bgZJb1@|i#+Te{A;XJcFQYqUJCmQme(Wc|!mJa(j~z{Q=)kWokncMa z3gh|^pGL>xURl<%8Yd z<~g)&6V&$rr;4sV0lUvGv?BuSOk4g6j^1UuC09LVNj6fQz#T=Cub&HhDNt|E=}+ z!g*g~^OQB(OXda37UU^`pCA9g`@ER0*~5j$uphMZLlOFQg(buP&<-5DP__l<+k%9@ zzICAI`f3%$2TEnvrJ|nx%%U%@tM5?|yn^#QSJ>dS63}xRWTL)LGk)oL0__@KTJr-; zPi$*zHrf^014Hg*pf^W1V1oNzaod`%pdTAnI9`H!L`7L2?c%E~KiJV;_H56k?B}?` zVYt8tc+WY<3{1CSq>!?op-%*_DS|BWE0#LH5%+K+4(+wAkjZ*XKb6R+VEkp-DLTa4 zWvtY`MIOI2b$_hV8%t|kpI8$qq=WG%eJ8gd@-p#I`z&&S8&gq^TFjqDyl-@Z+Ha|Q z*F}97Dii-~C5C@*?WWE*bH9wyQ3iQDUi~AkKTPhAHOBWqwhqy%0B#TCI2Z+(r*YTe z6THVYHEnC~JaUv|A9arUeo=A+?n7w*kkC&Bd{u2Ai1oelxYY~G`D^5+iaOw<)1UTZ zy5FmQD$Pi_9v>LvkEwiYY#_Bh?D?J>XcwEC|>q?c9z0v~|PtFtp!O z{|<)B0Y;x*S%`dX^uzByNkCbFTjBWLYXdwE{)2vL)pX}Cem~rkxI^VWj5C(;dOIPo zlaWSqN54tHdd8Z_ieFHl$oxFzaX_)H{*nRE|6SZ)Uo!^(JjT*uS1uRm4c)z|1Ldre z8{V=N(({yNIfDB!ad#fp+ym6(*>U3SIv7`Xm{gsi9AmdbxI+PVocjIB7xec$l_-mc z{F_cN-*pFmz;<#GZit0-C&s!rX!o7Uk4R^M{9L#pTN`8@Nru zxi#1WFWb5Ih86hb@AJ*%++tz9$w#4^)3JwKQ}w=e7yOf>|6ZAPI|7ej8l68i*-5@Q z^a>t=bUQplXP(OU5Y1DuuNGIrc(2k87J+%>iTm9L%HS6moNp9Seg;1=X^Jrl+5_{E z3+?f@FyEv%rJdded}Tp&&6%qPu>Uc%K`aU8qwJtgtL5K1NKK9s%>kGX68{w4{{ijg zVJmt5H9Ys>#Fm6%Q^eO5lQokYs%zPC2Cm&FNruQWOJ1u}?LL*nUMrXRR8}>d zFJF232Jjc=zToZqjVj5|z-^6(u-~OML_2gMshWt{kC+VZttF}Nd}{KZ0-qWB>UEtT z+Uv2I)UBLa63F{?v(wxQxEFn+fyz5Lw_?>i@M2Rn8P)ajN!VWt{?lI5>h^lFQ0X9% zT2W7!6;;BXJJ%83ibIlJkS_hi$}We52J%{PxQ&jkm3)+raa!ZiKz^2P*Oz!vN3>7* zxU`nl5ig(gyl0KgBxsG_%Tu=P#7#nMb%AgV+081vFf;j*@bScGy$Akc@=M4e*a7&& zpR1msQadB5D ztar+s^<#LG3+u8c^L(mceXp^6Kj#;Co-H%ENe|`)y(cOcxnSO@bZnQy^E9T}ze~(Gn^zLcuSA=w4%t5q%Q>E*ZM z{YP_=Xm2^9Z!l}aKFJ~Z4edRU&WPc2qs=g{RmtoeIRoWOtX(-V3;QZJ-aWFPf$u8} zvJ4e(!FuLqb(3FZ+u&T|H-p;aU@ul4{lF&z_*m9SYz6R_qkERQ(Lwt6=q6YNz&;#L zyKwXdq-Qbs5iV?k`lY;Te2nGD*1ez(@tf5L=ehyMoC=vwgI;o0^5RC&`)o?*{}a;P z`uV!?C*WU3()ub7ApEAiT-Fu92GJ+%c>ht*h9(zJ*e7Wz5Gn}(S&#Md<4+Lp8F0J2 z4`mw-3pS8>!VXk3Lwa2iY913H+k1VE3IIHQ-;x%;Yy6#kMaB%|@6WEVB7f;xv+`*L zgm-nUR78H^aaR})Xu!Ge6EQ9VfVJR+pxylPeEwzwV0Oa~YQ2Pfdu@-rK=gtAMYO}` ze+LQpKzu8m?M__pD4c#Dgm(OxZIm9`-`pPYWVFkh4Bo@l(O`G$TQ(q{5I0V-LmuSx zPj(pNudDTHquti{>agA$Fn9g)5?r5&@@g)|brru$0v2fJ?Yz>WG5_@FmDKs*t0|Tg z-*|fT6ZQT6mETRbk;jC&9gRdiPeWE=l%?JVQ2goHcsa$3hW(Y{LIyZTFtIR%@gn7f zivRa{BXu67eEyXhhQ~_HQTZ4}XI?{nm25&i?-%w-5#uFI@Zx9aCw70RbHe(XY{n?B zk2pr1Z)Qo?RYLi=^F>PbY!jxwlcVizJBs1^|4KZ;a{9WoecS|?{d&+{70@JL)k|zY zt&o}*$TO8biB)0!Cv<&ZVLABvmY+v7FLhas?{7H=OBL#;YNhPK@O-wjG&l}2Q-i5} zo$CP;HYn3J@>C;F>)UdUI*)yUiH;e|!O_Na6>-Sgx(oSM_f!%?mJIX6uhK7$=?)tB&LVuHSz62J%Jvpd^1>zf<9Q4MY|C z?{PT~3_sra{y3iBXE0|^$8zy*?@Ckyj2f#RLOyw|oUPa#aINOQeXKC%lE$w^u>9qTSiUa=;IVnKpE00pHT`6k!iBgLO0`<~c){pLybov*TfW zU-gK(S^?$I;>doA@AJef4q8c=w+wRL-BmY&`P8h;xD4{=k$F940`Yv$EXK@0pX=vT z`dg5*`55(b1>rp%^7qB{&$0qrQyia;ew)8zeG8rnb_qi{Vx;x1szAHUUC816H{U^` z)+K$g20w3ME`0J<3HVXVBX(Ooc}cw9N%b)PEg^qG)W0SMLw%FpIZ6a}l2;+Wbat=n zBIkC#XP2>VCvEn!Ib7pKWTrYj?E4j1w^Y^S+XB4q*!^8k2f1N=EvYo*Y%6?+@h_lF zh!^Hc(%xGEzW{N2aK@ixnT!ac%w3*YTH)ky}^N?#85Rg)ISg|~+JH6)AmrQWz+9eKbq z$6OjxPe#Z8JW0ILL{3c3Xel&R5p~OfysZ*7Wc0XYkR$LJ#(%vL>uDRvDJ@Ofdt;5n zabch(2l$_|woX&_R0F9o&7^r~58wS1Uw+-~-%N%~I2DwaHIiqBdkTssx=4gK!^uBT zes0C;2OM!tBq5x4M0alkabFak?{9A--*xoQqkq5S8{Pa9oh~BO;aE}u_Y|n7ytw`0 zS3N0vn=^myP#Y;8&3m(#z6t*0(K#ZU*hI8koSz+2Ya^OhMNhm==pgmCwid0s&`Ivq zwu{V{H4@GKQ*o!4wUA|pm3O3@x0C)a{+mSJcaT0>H%oo^J}}gBzhcpsCbHv9bqgbD zh5zjFsEyxkCk+DXfsa!=$+@WdzVrsL*U6Hqj6*F%>+8gqcIQ^2obbhLZdK(W=r{9hH%!lT67$s| zA&(+^$&TjYhu3fR5GF~H3!6W75hC$C2*>p|-DdrO{hcJEg(>dI^A55q@NAcDNIS{6 zFSZlq!L(x=4>u6{E#2W}z^7jX=lpn7UPtae>#AAZ z(@fmIWQP~*YbWhOY!~Q%`!L8)I)`gvC*26s% z+}1aDYITyoc6K4lV12D|n~m~yXW%n>N@IIH+TnZ3wv5TkaE@;E`F+V8u-`6N%)9$A z*uC0I+x7t8;%8|M?y03MR0Dsk&_qKQq^V-W&gTfOquk=<*|9S1( zL9%7~cVD9eKRx7ciRMYLDel6-a)<{z_Qo}JF#ux~GA;4T2= z*6RL{*|GulyE6^NjbQ#3IJNAtk1woCIMGCIhJ0kwUq?m2dO*My2Kpl4p(odAH%G(# znfqIByAsHkdK1hTL}0z+de_Z9n725&ZwB1n3hRYq7B#gXmwXJcjb7{|JIBM$WWYSh zzVh`P1MpU>ZvK1Tkbj7|Gz;E;7s|7fJ{`*IE#Yjd3+e7tRDCP~`FtS_wznYO&TiFq zJDAtQucb6*!uSi+&m5Nmy_nrP%W%G=^M2>!2JsIf0{9PuJ@A*Gr451S&8u0Z4nzF* z`#wYYU>^*2Ckl^)UQ<$_LLsRsEM2}t#H2i(5wzBlq8 z<$2F4%rA7G{zr`GH9qT!;ZrQf)`|dHtNgx!=}d;{gkU;8RplYbL*6GiQ1=21wHg*| z1o{3;EftJEG^>z~e2I_7E*SNAwoJT1IbBrmH1fUeDR{=E51`M01b=4@So3I%(mTl8P4Q&!(-tWhE-qO)jqPyIE8Yub&O0sfh#wgx z?Xe#W#^Z%*z*8H{srAW-pKzT#$n|H{9w7Gqj7i3JT_e1KTE}!zyH4dZC;l< zvIDSqp@KTM9(!aX)jv``=1~1X;KLd>%-^wfcs=GPd$)(GM>SI|)z0S)w@~eNn&&cg z|HOs!8CKYTzu#0eyawa)%m$7Vt3aNW)Jwbr#v-ie9X0t3^dpP+<{IKYEvxyV;^&|r zQ>Qv01oIAmlOi2~@blu4>#*O8)sAZ*KWCWx#q9_9b>dSO?guz)a-G5P{#(|V2mPFf z^AF2WkJDd83VHn3122!VK>69&cN-`P!T1W#Id=wl_>EJBcdr7k9vV=LKLX$NC~1_h zW!lzBw5F#IU4r>|e$S-`(=xE0V8Iv32=z>wbFG&J|Guj*IKKh*DV<|hS)PD&t3Q2I zZ3mRj9Vx=|6ZbwIKKB&bV}>cVoyQLLZ}fO9Vxd0%@BdggLj4@BCtb(+P+OCi!3O3} z>-0IJeo<)GXKju~5Y81-&l~`Hv<*^&*P#3ZRR<0RL3(>tUB85aKOmKLS!kfJldS%h z823H0i~I>n`djd`ofKEC%Z%AxPnvwI&co4U>&FQ9k5580V&*3 zuzuW1uM`XAx$~;ypq)0@31N*1S+JuVRYsW)0iE}-%#?M2KL+Nbo)i3WvwVITu%ES= zR}Vdg_VoT>5;hFyX>w)Nf81^AB;~3x66)Y-2izCxxkk#lo$L%&6G=|(Aa{K(iyyNCo_KbxYHADYn=q`n5tab`SIFvB zRB|WTW}JD*8tzw^Tg`OOQ6Kol^0u{m;6CHkoiyiq&%yYm<6!5{g!lb3qV)>wUwWwd zh~#E;5{JBh&U6A@M17w5OA+ip|2$@(t@ONy&~VwtynotDiqB?fRs8HF6)P1@RwcoH z*|w0yCr~fh>2D4U{czvKv@gw;Cp{!eX6w7jsUFf@5#`PxRu-_;5b>dsF-J zo=k&1dvvwj2JT4?tU9}R4Zf!weUj*33+4aOx}$*;-b-j-U#*A>jLRgm=>rqJWPRz> zN=v6c;?%TODLcN8Xk>CfSkBo;B#4XirRZK#l_z~<>_-pTN4QQ2nDmk<#aJ&1pI&17 zyM2I(tC#E+;}Fp+=plwG=X-MDp5xPVM{Dw;yUEJmm3hfU-DG^`ABXrk_-IAKRbv> zy6>=}csCJzl;v>saTl>L8|=ur4CD8-iPl}XU*)X3l8rGFoNrifyez2+*6%9!=H`LF zyngvx`uwcL< z1LqPuPT90yQ0ySI=T9fDJ<(3iw695)+6ebA&z0(I8t)+C8~nUHRztnFR{dn??I3Fg zU-lKscarm$hRXz|I?3MD&*ONHd7A6^kvEm#hpP&=35|gtX{2^l3f5%|1F}4HZD3xy zFC_JOC#)k`OfBlK0p7tAQbh;z!G^UOFIXU6a=*{G1I(9cQtoN9;1^%gIU4vD%9Fcu z=ut1+b7wmKqiPvD@T+f!Bwx9~{7)k@Hv|1}Y}tZPKpotdH=|N02m4C1EAH;!V-4#m zH~R`N0I$uQWfSj%^vq4uyjx%%rZ1{dIS2VYjNc=l2>d$baIfY%oY!Aycs+&rlZ7wa zs2S#W@7vQ0iLj0<;bW5h0pgh)cZl8q9xoJf+5R`otBu~(RcgT3*Sl<6^>IC%Z*^39 za2DRn$hU>weV`XK9i9`WH$Q6*`Wsc1wRVD@3ZGiT8OY~3&1dBh$YlM|_O^+i5dVpB>@D(;U5!lM z%utWA6jcomkgXZUBX|J$bD#de{o4ZqKSwnHZAl$f&>!C{vo2h`d(QhyFa; zcbD^HiO4tp4rq0ue<66(BLMAsw1b=y^7h|?TRM<0ml=hY$pg*{%H=%(y-41^7ii}l zRCY?Do}2O&>U;lTGkM0?i_xPD?!T6e+BjG69zTZso z$G5%o6kpT-VOWnmbbgc52*%q_$x`=u)eR=(WB%hW+&AF+b4pJ=g5?;PD5B2qRVgM= zJkK$Fn&M@_rDq>w{EnGI>VH6&tSqK5y;w#TPfX{k)_WF2nL0yusvPyB^N7zkf%^o= z(e_IWvG<=n#aEO3z5P(mwe3BCsD4^p3h^xorg*L3#XvQbd7kfSM*Meuj^dHmWVcG7 zyzS(EYCT)Tu$JQCC)NUehVb1NVL2VJ^}7v)i9c&8-u zJeZThy})`=-Yo|J__bq6-!@)(Dg6C53b&37QswOFO@|10UngG5BHlC%rM^40qHhdG z`S-I;ctHmyJuH} z!vuEhHwPt~mRnP}_8lFCTpZ^qv_IQU`6q2we3Z<-8;S+bt$1g!gz#4|ly_7v{h#HH z)vW}Si|13aupj(1QJz6r`*hMultXP6`_aGf*i>>9!=t`@+lZKOK9V{QQedd_24&Ci z@4<+?D{`rQ67h&o>b=V+?vuvwV{%&S5bvg_4IzQy|8R(ud)Q0)z=}pmlIBtb)UznkvV@vn@F#1syhLa2EXDlBaHKqkD7n=Biql6QqUBqte047D=tDos`&3;L&NFL7Qur}GrYf=n%h6gjdKcxFjb1j08*it}qkm$1 zhKs6)mvLz?hDYAce24n-GS+%nj#-N&YTqTU=Cx8kl=G~w@Hu;!w?xeEpYnqEZ#nhW z++ZK{I)iqEfW2tl6>{M`g#R)BUFePR?|&F%fPQAY_FV&bp4DJAuQ}MmA8%xQIU!zr zY%lzH81@TxO7L0$h6i6##&wUZCkIxm0>%ow`he{=a*=%u^*Dd?%j3Gs{-PE&oX-!o z3ou|gJ$XgGV|!-qSV4UkG?%ln9Q{|0Wzx)8uRMAl_7#x-%BQE9n^_?J9~U00fnDNK z%xm}q=S^Z6{`FJ>U$(opuIV%I=~3EJ$!@T(HXEciw!;2oYpHCxCX_qU; zxY5ZK;5QXb-;V*kkHSBGazpy+i@z7pjz#R9T_XkQ--*%^(u4Fr_313&ekeoEM_IHR z&Mezyw}Zam+rV>K;79ErS*?_f_J63dEfK;~z4q?Hb2K~n#e~sLvT6@Zra?Y^90KJP zpr6FU*=SV@-*ZS#=&}aEdoS}7tAh3L_2*qKE5C+&9_W?BB(8T7QTG783$QOCa!gEJ z2hZcocaai5A7QFm&5vHbi&b-fvnKKt-Xg*fUn%j4~Qs$^~j&< zY*S<4{|yO91&czvvkqK}umS!Tbanr79ACp3e+4I@{o;-}4X{Ev2NjobdckuoG$$ST zp`H^qCAaYZmpe2MZ3C1K%IRK#?O6LZ&>r5CN>qP4AN0rN>b-62 zA>J?J=utT+=O>lZ96te5Sh>gY0G)4Z?cNIMUC6T>xC{BvZ+n?u3FR!-(-lM>vGbs^ zhd$IR*E-2$0Oa4tlBRI|rPAUX6XQOpmz|YmC&cS*w)R;G=LcL4JQZqVg#GOkbQgCC z!#pA#yn+ezcbm%`Q-k-e+jNTW6|6gR+dqiI`y&HePPg^KdtiMzYtatneB&1|@ekTp z;Fj;{BM@&Bd|P}o^q8+DY~QwZAIt3q6H zFJODzb!Hs@m$Ei};)e9zSmsP!g!jPpWKSfnt2RHK=aq-&g}1NBG3J5szv?;DG2r)R z3B|P=z;8M3GWhuyw95g;;5a4V%Y4QU{~iQB{_*$hWp)GLf5URoOweB8Uh_W^pkDv} zm@htn{_fo{O|uuCGj{B+x&h_bygj~o9^Q*%v2;Eol)ql~PMZWgSNd_BRt(;cZpV*5 z{80Wy*2{ObA^haIklmx8m;d<@6Ye8t2fbSJ9_n#@oxAEd#BX0`99ahOztjJAo`mNN z6#F*U02bX)_Ujjb^%$Gm|0;p!&ji%7xI+EPj|3Z|AFxbl(?T5RJ>F{jMg#h>=4NJ| zU6AfYrgMijLHurUmS>8PU;o`@E0qDYB4rQaI=UY{->@R2GbKOJ6$|0h$7^!%ecn)v zwF>}jay#bW1mU;hJUf3u`eXc2+@cUJy58>aNx;OcUwmSK!)Ey}@tkXefyN!YhwkuG z|3{A@{K#AF3?4w&L)yG60bNc7hqpjKkZfeu3kH3@oiyql5WYTOStZWjYHQ>&XkYKW-S!3T zuCBaDDbCYo8?EGVz4ky}J}g9oU9HcL$M0dP?Uv~x55LXfvWWKS#UrcDxGoO*c9aXgu{s{cb?zkyRI1k0Vw$7G4|YDea&dzotv>g~dEHd)6sVth>SpOYAG_HjfR z?Yys~eF@6r8n=I-f3aBnkh&kOVf8dK#RJqGsQct3ZqRMO`e>S&7@!^WC;rs`EDz}9 zb>Z_G_hZ*$yj26oHN?+B=?2KhwP!a6BOdJufCXmoD?+tJFuwF*aTnqr(Sdx7hvUZP zD9;tgy+^&hatFOot~TnTc$Xqust$%{G#vki$S|V_gc#~`-&GQEyvK{;=PO6II-u-- zM{plvQ^-z=hn;YN&u~GGDEUJ1_Wc?BX(-?16sLH5QEm>E&Q)1eAiB`+wU&4ye}iQw z%5UYaQsprJ@|@!LcE6gpWB6*_Ix78$-D%W%dGhy@>oMHGKY59d3d3i|Aanm(LE*-a zT)?nlJ==eX;?Ju5&}<;*!D(nj`k1BtgZFxVR5@u{A5-BX5(N}qG|Zs%quG(5gPlCm zOY!fOcA8ZB-E~b={GXC#6e<*dr}XXvTSfgf7ng8B4uV1c)edwNaQx2>3iYA&Q67fY zN8I^tNq!5hiSmiV&^&;$!1fUvf%Q^)7EAbga7n+UaEZ4TK&ddkA8La*4XuMnkM01V zlKzt4F#^2{Od#HAG}zff?g{20+UJFHgej1q^o#rSQ-H zc_I>G98jdjfJnH9Bz6e+|NRA*Plum3JlI z1QqXUl0@Y*@dn%*h(B*sLyZr9CwD4*cdHJC4Fj|k=A7-M@a~BYs^5Bt)ltv&{xYS) zS1QBfkj_`}SSq~w6)z>rm*m~W@SGr8YX9!h{N`OaZ$v7%Qup-u@XZC_JRbS$&?VH% zSi#JVIH?`F6LD6oFbDB)qcn9t(L%VFq|iv>pxKbN4k+7Ro<6;HPrY^{OeA&o8O^z z`%vFZ;xQl2k1~9^hj2bE9J8Vo23)&imnr%Mp6>53pb<^YW#DGvK%buZnew zLcb_1ZSpqS2fr`_-c^7!Hw?Qm-Ak>OnW)G9`7xDm{@F?%od2%|2E9R^A^rRyRX^v= zw;!T@6x&=O>R(s*RgHE_FyhYw&fgnK*eHLj%`AyJcgK9v;0x++*y^2dNpE74w62e%BNU)Ly;sD|e!XD?{!;5mDNi^2lN z5Khl=yBzJv+#6O+d{6XA?6!vhd-J+g&@S%oJQs%L)lNy;it-SvQ8@b94L2FZu>JD{ zXyW4mSr0h1)&l=gvuXOV2z>VZ?#@Gjz&mqP{>|WbJ@wPZW?P{iqpV_|9if~+)c#tx8=UhX}o2e^45 zKpc5jmS6v!{UHCy>FK0_d>BlH*K@)9sJ&a!fa`@auI`F`P_GT0zCLNdS9}iSzmSIf zS=lDGjR0@jl$F3Q2IX#IztDi~yl3a2=sd*JSl9FQ0WMhYbKVd6Y&uA@TO8u))wXAU z!u+`e%+dfYyu4|B0AEi&Pewi>u=8(KE9k#}^2Hz<(BnhlRZa+>9>}CQ%2lb{BZI2?qu{e66Dhl#%Tep~P1agDy;kgG;znskz+FXE< ze>y3Dc+l&QQYYvQ-+Nmb2B`b*(3xC7UtYF$G01<1#p5+ffI8uS=Z---c`gUt^#Pez zNikx1UoMF<{nsCU$|2^_=1Q|bIPdi&e-1zmVNoA*)Sr-dMIM+Jy@!1{yqCq7Yie;_ z`9@w|SuDISOY?z8xUTTT4lJ*^wO4X6)R$)~eAo>r$scnY$MIZoLn@Z9 zBAw?-4B(UPf!;Xp>9(i7dI8TXTvl6!_0;wCTY>XO5a;p-Um?8WJstfrkUK=gEO31J z-gzUo9?-DnrQ2G-J)xS^{V=-0Pqf`YE?|0PgXM6zqR*@W`G5XYbn+4O8v%nnv9}=e z=6uTd4)v)Q>+LxT^~*WqueBHI!?Qw$Y=HO|;(zUSLB8|#2jp?wHVA*8I|%8`e_rj` z1@h#&W!Coq|JvR2l!fr&n-Bk<1w65Do(0=Y_2&~?d{60{;<7ye>l4iyzF$jja(oX zTf{}b1e|VN--Uen(5pBGe6K8OdU26}ZZhW1Nr2wVMI{vg8@ijUu)nm(x~JoO(px(| zXbV_-*~(TFkS6}s9SOiKL0>X3-tYMr>OW)(r=IO)208zp0sLqU)~lux<8hvi^Ip1t zPi}S0JDiWEpJw(L0Pa#Vj?xAkd-IF3Q^p#v=y4u1TCGut^ITk+Mn4VWo}>G4+zQX_ zWx)IdA1*tD^Wp5rPs>p6vFpJ2PQbK3s<#L(==F>**QT9=||I#$-tvhbvhx5DT zq+A=ubE%7hA%^gV-Y19!$F&=={$U;8vM|11?8-L`k66wQ3#Z_x@1JhNcnbB`@4ULhax6 z^{hTd@f-8MRD=_v~*QRxuDcSgzN!l^MKX>+HvVq7-j^;067-CZbbOH zkHUow03cT&Z3espr9f1sUqUCO@gT=Q>mu4gZ4ncJjUtXgZ$PYmy_D}81d!_y05$)Y zC;xxG8mkZC=p`Vs|Bu)@C{x=ffZoviP!2)>T>d{^_#c6cQQ;QDx8A2gkl1bqi=!F2pdi`B4wtS5e_FXqWO;{ohZ`Ke?or zwr{Cj`u~Ev4$trSdXVy0L}Cl!0eG*Tuc+}(=X1*%jY`F=gNAFe( z1q7ZqWdaGqeh-(iE#exTXH>c$@|XVS7qQ}sL&avU;-c?xcAMdZtJp>Xu& zl0Pmwd6Y`;o}vsi2=X%c>;ur_4ipFQ^i?(rX{?s&p>*UWrLUz<`xfWPwo4Mv5od$< z8>1a~Wp`E!?M(fa51-I((tiE63)6Y`^apfp;6sxasPsz>Y5Gz2&q$`$cXoEsQ{ji` zfj&UEeDY>${^Nf-L(Oxm{$x`AgHGxURj*y8;5UF?ScNz>KdQZMrRE*6^SV#5JdP`A9^_Ogo9<2f97^GPz=M_TyD0YzQ$XY9F*<#d0>Ws za{#k>+K58e3AMhI>9MmJ+k5>$+wEzV^w?VZAw#yTS}`O_KgHeEx&NGA>-Nj1agcgZ4CZ-Lo9@&*)YPFkt&+gg)d$z9Bh4 zL)|C5+_YW~{Y@X9y(1XTmw#sumRCUMyDIXqP06?PupO++Iqzr!7A&LHM!R1hb+`xZ z@Ru0g7g&$2zI9Gm9?cL9s=xnj2>ikT<-8)zuoroiikX`S@}sNQJG$5adp_p+pntdR z%(*Zum%2Woz9ScVWHD_Ga@XRxJ%DJ7f-4c1(#5VwLwKm$1@0I1t8b90*9DJ%( zf#vh8jlF^OJt&sEpaFP6O9_6s3-=nuOXgubqpBVCKa70FJA1MGb>YSp*k1nQ@hMo3 zZ8X*MSZ_x~7cSHnlv_uwFB+#y*&$EOZEN}ka)qAnug{|n1z;Yg!We>pe-D0BU$9fK{uj)b` z?$!FK8RIRK*7{*NH`H9G?m3jWcY?z68#3}STxme;2jbB&C73XPw-kjLVE%y$F?tx@ zts=4sWv8i=CK&&Dg6$RZ(q~aqW_*B?yA1NMos@>=6?_4i-&s6Dlu&TKh3{Rl!!-!o z;aHTkf*xRJ|L`dC=H07K!GUC`M{boZwp-iPUAGWjhPS98pFKGHgBpifoGe=dO?9^LjCIM(n`&LaC@U!(9$*q8T1Mlrc0K2Y7mta4O zij%#J?agu6S{r%rl)&>VI6lt)d18#|>&SeA1ytat9&eRq+p93IniY}GEs__X|C6Uh@mQk)4j@pFZ|vwN%qP{T ztmO{! z^n#Z=XJdMcX4kdw`5OZRE2w-oob1DJ`RHlNZg5K*|HAMi4-MEb-BS|bTk&~cRpq}J zzIHbaSazsyfVLUpqYDdc82^3wMas@Oi>>;Ndg7aGsCjF<|3xscaG#g7g&elmcE-QU zQJ-E;G6wbHOA~!Do~Qqv2jZt!aaR#{U1$4<@xOI-sd>Lva3>G}7{_fjSh@ zUD_9Dj(A4t|Ky>g(qDe1fqHIKawVn5GzZJ3p#RHtiMMw)A#sCwPFRRS^&Pt?Jbj~J z3DZCw;^}@Y@vkAPCEjMYYN@==7VoI^vN@Od5m!1iJLrF1x5QU8k&b|T`~UbhWq55M zC%*&$WQ5zx5Pe~H2XW#gbThz+R_Km^zi%(4vm$6I9i|^Z3m}}E)11N`6HCuUz$}m9 z-fyAWfNbGQ`Zjv-x$@@qawtZjbuq;H@G) z*tDeg&2vd!Nw|v34ZATNas;Om(JJ&*{ zx5y+XO|_8o3olvztZyQswS9?E@LiLDBe^JB%o-Cd9`o6Si^o56O{+;!Zvoc#?s_pRFF z^jIHRTb|;^!`4f94cg9aKG#LArTZRsP3a~i@A%~XRU>40h|P&V<{hDTU$E9ocugM8 zC|-HU-9seSD`ecLhx52=4IMPzju5E_y6JMC-V(31e0g=guZhoad5G1r9%9AYW7r_v zMXVjVguGlnl6kvO2gauZ#81tBeM)8@F}PUEnc&|?#-1A9yL{mtS)}7(>)1L%76VhS zv1h#}2Y*Ut3O?^8MVfA@qs^}g&+-7XLva4N-rO;|UGg>Ie{RkZO501Cf95c+uIMGp z=ELVK)4NHDO{ekK&~BpjP;SptIQK2K{9VQn{8y&IU+a$N&mO{($*dTE6yDnxhx$!$ zzv()ChvG-K;D0c}L-t8&FNw)=t7zYuYEo*h5@odr_h5W0TnNy3O(HDKv{YkShz@V> zg~J0i#J_^ZiTOYcDe$T=G2*Wzbvt7Q_cXmH)sC#h4DS7iw@(i%noJ{KcOU$FfPigs zH;im8DTnWv0tD|~XeYYiHmW^Gb1ST0TzR(XbV|j~O*{+*jFoT?82^#Ee}%+$`o7!x zvXd1-8P7g7jx<#GnGbe~zsMupk4E;Xe<~yP;`{64;GXpoo?T(fMrug4z?x6z;6Hqq z7VPWznX1X|10Em0Iad;aW7k9l#!KKnKvpf9{7Pb+nizh!s*>=G#^vQ{Rl)zbz6)5b zt0bPs`wlWZD<$GA8@_C8s31)r1Hb>iQBDLbi}G)_l#xjPCb!(aQewGM`sy3`5;!zw z-~L;_gltwxk{-7yA{$sI{%!OvCco(Si!6LBCdM}yS3F)`L{vU;nbV5o5!#r%_g{Sq z$rZgz`!=N(lbP@&+981=vhA^Kbi&I5GNqO=k(g8p-*3g1KOD*>I{jpNh!gH}PfRo6 zG|eKek;Mzq;aTK^kCSTC=`tc1D=BQcGM}i>?|g9DI}_G}|Fqs}$RxD-o#qY!S%mpA zIXCyD1pa$`{nWc}`Q)O|`qP!6S>&*8Q{j}>Q(|w%$1v94QHMAAm2R5_35 z6Nk^{9tvNdk;ht>XdD@ylG7uZeHWdc!hhXUg0+SU;D0UVLpMb8$gLAqW9K(LBit1w z@%u*Mp7_H_0egcpNjTe-^2m`a^09s9vA{?siOT$sqU(;w>igqLRI;fgeKS*$kuCQe zo2ZbHol!#BGowgUb}1_&BYS7N=VnLt-mA!}tP~l)=lAFH$8%nvd+)jDe#U#e5ZIy3 zgYcCwRqusdxW`^}#M~{1J<*Clm@`v8hPt1Iau{#KV@AgHQoNy! zyc(DD;OzL_ri|`vxNnL}j`3zdhSLpxx6;$0+r>XKTekTyp35?hzcddXxksh(K`|S; zWfbZQkAHxcFS#Tgw$osw_2SmDPY!(dUwY%EnH*@;$KxO#Lek6Ua!eWUE`;>lRs0(I zMNo%Znt`e*8|wGCEB-akfsYYC|GWD+FiOwdfy^%#w(T5|6pPD;O7AV%7PT^9vS37V zzG?;}6E1I;;?97**3#EzY0&SMptoW|3N#ih z4G}SU4=;3E|9k&A8SV`Yym2Z_gP)I;mG?bLfsC0SvIfW!;nv!%P?N|vu*A~Qeo-$R z{wvP9#doC$+BR8vhVT`^j={J8(tCUIb(E@!#!cC6LYaoygLe3|JI$LF(td3@F0#Vd!;b2BaKi znvU;{zayN}7^`W;8yFZJD-@|Hh2jpX5 zi$J8JhI}|A-#@ylRvZBN1uhkaYzsj~rGE3(v1bH%kz^zm|BU#zch^5cycD*~Zcg0{ zD1)1#{Hl5ntKbW#Y0JgapCFk|@1*k2T6pcA&+GoXCGgnB=7!JYN0`*m^OXEY1uXII zVE#?g6U=B&61F*73su=fX6`%W!udo_mN@%-_{?%OSVpJ>mPfpV6H=dh(4KRRm zMR`H833`lV#_88I!@_@RA6uwuA>T3ED^}^XkiODdf=Yno3;WAHjmx`viTJ|4|#p)xlv$%27I>43fUQb9R1I9z3m>u&HQQ3h#%g zZTz9cVVwHlz(V;acqpSoCb*{=eyy>hwfNHlwNIUOEg|`S+^}0U*;(j<2e3qA&#G>C zLHg*@?xkk9RqCK}U$X_4#Gj;L&TKbsW-IwecB-JGm|^gKH!_D(6;0y;~n7vnF4AAvp*cxH-+h(lG4*-9;HJGzxF` zawv+D=BM9oTvK#9&<_t!bAQP`Jp>2PE^Xc12sG{N`EOrx460e!eBHc1NSa4ErnHp} z!iezR7rVa(;rS<*I&JC);kXA~-^SBHxE{Ty&O$c?Z!?xN?K~KQ539qI`Wl8HZGzs~ zPSp_H99wI@5;X+lr|j|yyoRCvbV1sQonhG1*(N%hGy*e97%UHukHAKHd;2>hBhWqI zwfQ|#oOwl_@XXvON#BxQuWoG&+V8}6MC6XcKNRs5_}VyJ&%D53ATAAS}XnT-BD=tc1vPya}?_N4c}C(9fbz%lRYo)j6%(V)Z6o$<8WE%;7sh33Fv9% zV&QUX5{6A5M7^66a65}XyDwt`-uz+ZA;UQZc~Wyrk}RiS(Ya6G15>AW72;eDTIsqp;_^W;E6LQ8*TK zGfj|g1pbQsVAo_b1X&XM$}YSegt}Cl;*_})kOtbvb{S4UiiTsHbZX;pTtb@w??&MX z>h5rn;t@FUP3F`VDb5$<(#rHVr{L!gS_*tYlW=$Z!OOMvaaa^1HXpz^4pT}**SW;{ z;PjCVr}OH4kbk~VnqiJq*D@Ax6m^hr)EZN&w2>s;l{dbvr{((L>txwipRj&t(e2%G z`a>U-(#Xv@4LNhpZgK!#HzLYzf9r<_JKjZe(Tu}P z;>~*i#$biE;#*qF5$H>ObM_GFeTxrNkzeEAy3|OHmj}PVu_Nt#)}(U*3p`VuN%BKU5-%w9+UtbE0TKq^x4yuR;|=FH zNax7WVQf(2K_5KGf6F(4G(UACUw!fhRp<27nqY2F? zCM~TNSe0XS^5;lxLe>URb4q7(>`vSNi$@eLU?IF2A z69Kp9XtG1K5WMX~Wl@D!!vURBHXgiHFu#FO=xaZM$JlSWa;;axt7Cu9_;yynqkUiH znS;xr@uic!r)J9F3tgrfDTylhyS?Dg7EL)kRe1xLYk{@(ANcnZmKTao>bT}K$q2Okh4D%e8<#y64;73D?H{yHc z(8!+Uc!zQ+6cYHJM&C~IZ6YsOuJJ5^IX$pB)4gXo(` z;aCK>Z?nYY*%iW?E+x@R(M6DYvvj5RY!Q^t5P2#7q!89xRMOY56p_wRfl2Z0Lbx?` z%PWs64^lq*^^VGsl+PdS$nz=9f_>9An2=8v96u3UrL~>~2gK&K)5T)pOXJOy{_eLV z-K)Ky27QU})_(4}FwrC^I`^SMC^s20CzFexJa>n9Xx>N9(9A`^$i;fj77uuYV)_S} zSqRBDd4%><|0}q6y|qv4R1plINszTwDk141eal){&4&u+CeNNUWWj*4Oi6v0Y*-U? z)|Q&C2)fxRTXpB>Lu!uUuCyoFFuQHC`Z>&oR#fC~)?9MnBjGWj101CNaLC!oy)*;1 zc#AZxoyml;o==O^-)6xvhY&00@=VCR{aY>GG8r0(q#xE{O(F3z#r0zjr9m6vbL!Ot zsjxi9ZCC718gv+S_O2#gLK;Dhf|&R?NV$C8M^f}1yyMCU+bfcx`j6v2a;B-!sxV3_ z)jb=&i`5pU8OGBl}-UC)E%=M_=rN-o?#_r+iENG|+i86wgCDjP2A(43^z&w+FS zVlQR{a-c%q)hDbvx$wh}1^*-8^Wj&cM8o8jOqep|QLRLJ4w3u!l>i^fKdj}BzZ}We zHPrhzPu!h6$aGfVKxkeXoDm$7)iKI|!<3wX?Il@IJCfsv3F-dD?Vxg}rcB7%&#!Ax zk^+xev1MCjrNNL;+oKInKR}_^>b5RyS&)6^Ym@4oY-l*X(PAo^0qflCJ`CP2CiS5m z&zC$dfDGPC-y1?dz=x~vOLP{pq2Cv=+v6nvuv=jA}glTo)m|1N;fY4@-!>0+qX^=e$BxD=lD zzVuj`vjQgW@vQ1xA+0;W|L6j#&rwBX`BCC8NoUmW>MH??M#yS+W%PbiBm88kz{r21 z1|GLMkb+Ttf^nj!nCFv}GD&z|s@;7x%ANUBH>~KE?q>U9QGtttQZQHL$P9!hb!f^@Y3D(BD0NV_;5=*A%=wCd$Hf<{G78< zW`fSx|IOh{nNDN(83FS;nMTD!{+)SgGA@)ehqkQAu&JYkbB%_HHA9~a94y0|WN35h z6|a{k)jSJ6MaG&wCDYY2Cgec2UK4gKwaZkcN=E5L!sRL9`kIVGM}$YWyJbQuELpqU zh#IyJ_36d7>oTjwuKy&C)W}e}e=MNTt(5t&X(+I16D#xU6V=h%qq8!8pShI+txsTE zH{!k*+V0f67I9YJPu!D9k?fUwEliF-=lxHx8n9yjxVg^`|B=8;mppQBc^<}u?$w;p zD_XB9zS#Y|_a#TAqJ0m}W4;}bb zBQZxN$>+(62bVq4861(sZ7Z(4t1Wqy6nKhD(9M4=wO z8>g@`tD-824P`uxZF0me?=5!!M6v76Uo$+im!mep))*U89oW!$V1dVg)pIpvP8i2k z(`&gx@%YpOW*U(ZYb+t3eRIgu3O~VD|5#zm4)fpGKSC+vi=S@hzE!~c77I3(UZ%^s zi&wW;#2S2b#9VkX7%~$c;&B)0#k>B6VdsxC(sI`)W2qE#trH<1aPZ7VEzB+zTTqLl zIv9|JhcB8+f1|0!?1BHq4)rnII`Ubq)t7keT!=)Y<-u4yW%GEt+>dwIRP7ckxDW}+I4!(_igyXKK1x-@16g6c?3}mFyy}nyDoEx|(khb#!(;1ry~`nb=`Sxio+u9#9W3~1TJEEpZADE? z+2_D5WxMC&Ui>KiWnyrEnFI*a_-jw>Xri$xJHtbhk5Sg!!%Tvig2=z}`qHCE7eQI~ zsMGsYArugW-QAZu3#?CGdH6>A0q8VuEE={J28T-=!Y)Q$M6A5|%{mA8fE|j{=Jx`cI-?Wf4~Jt$9RS^^?X6$B8NdS9>ljw@MKsArz0D5=0XX~? zyB4p5#_7bu=i^flDrGyFbuA2(Qw3`zr?LkQ$Z3;N4 zNK1r(G$7A%RPu6|JNTq+$}p85j<&9Cir+{~0~3Ui^8#}UVq47%-iRzm61lZ)!zaQ} zv4Hw_1KK>mm0{~p7FCL<=-(0{dg;jBPj%S!L>Gutc|CFcVkVL(9SZcLtO8Cp%(JnT zW5_;O8q7TY3QV61(VoM80Qa8B!(PJ_Up-nEieIxdo`7w>(_!-iL~4N|lUEN6@0(V@Js)92i*W`|u9+0*_Zmt|q1| zqi?5__iT8YP%5wAX(zWiz~*de1!We )TN$FODeN|H0&N%Rjg;^zNxP=g-oIGlQm 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 H>@fTf+||f> diff --git a/previews/PR1624/tutorials/out/solution_000070.h5 b/previews/PR1624/tutorials/out/solution_000070.h5 index 9ed041a1a9d8031ae21ab4c2a8a1fdf6a152902a..30b44e01f6248d5722367efe2da672ab36139268 100644 GIT binary patch literal 11976 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 VW2Z^^&$8)sWE8a5DL0>n{sUa;Ja_;A literal 11976 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 delta 12223 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�YvSnaOeRZi4^pBZ; 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 K>1|UyH1r?Fs0AJX literal 11976 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 UmblijdO*Ldlt}NG;-jJe0MvN>7XSbN diff --git a/previews/PR1624/tutorials/out/solution_000080.vtu b/previews/PR1624/tutorials/out/solution_000080.vtu index 53ebbd93839391114e47ced14ea9579ac623fa9e..695c447ec9707c2d9eed7e79a389bf86f38b077c 100644 GIT binary patch delta 12218 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 IPm{b#9b|{LApigX delta 12280 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 diff --git a/previews/PR1624/tutorials/out/solution_000090.h5 b/previews/PR1624/tutorials/out/solution_000090.h5 index 49f84a2abf1f62596e76efe76f0aab8b99aabfb8..268bac75d1d68bfc86eb55f5cb186d9a4a4390a7 100644 GIT binary patch literal 11976 zcmeHtc|4Wf*Y{@O)7ItY6ywB* z4?8=?jPd;Xy6}fS|EX90%~_xq)(_5qVVK8L^LUl<_ZJ3C1S8f&=J`DH_E$3fX1LDF znVIV75S#`33plU#Z}|T_0(v@HCPWDK&BuX#9_#1pXP*33YsB|o!VAp*1}@ZVI_qyE z3w9S_D!&*^7%R32W5*c09Nj$qFdp#hw`=$xuKX_^F2eA6Jx&k=J*UF~cK&YOUVa!q z4~8v+#f7W1-P_a0*U8V%&ECUFC&0tWS7$+Voi^;bus{3n{e8SWf*qY){?>zqV1e;J z_1Nb9K5)d&_wOBN{^jZKKY!|RE$BIUIC(mG`TxD{{PhOejlT>qVe{wpbnN~r6{MKjti#}ml*>(M|?f$Ya3noCs z+27663FBRf{z#7+7p6uBHy5_wU)jSZC_9T5^cUjG^jqK2|3B64;F-F>@+1NM87Ge4 zaU%Bh^LO(3+r(J@-t5;Q*nWF5?+(#7i4OzAZ^q;=3d0tVX}+)i-H8ZM7UIl+jEs!G z46x7JV`7*O0G3X~?vD@OJev^ycK)N&B250*8q+UJM19*q{D=}IGW**n4D)sM{=MuyI8vXx=Ra&TMYT_Xl}sp?ASbU8Niq0g8Al+7`|wh^h^uTSFb9S z+Jxb26dmO4K;Ey~4cBhP@G!3ZY%c+WHQwli-oo&-qdf;jN-#Xo;)F)ST?{{_7~tT3 zAH#Rw=|YK*F}#C`y2`l%!&Q7&oRqD^aDf%4WsRyaoJs1?sunXo%tTGR$k1hJrRIIoZz9kOlw7=@g8PqJwgVc^T*kyNK|9 zF*@>98L4vLMn`W#jL)BOrlZp}&4C$*Xh^BQ)=bTVhGIufDGT}1P~rtl%G{BLCU>W# zya0^N+E6m%OhdGMt$JCITeVVxi|j;0r6og1&xeMbRm0wPex#xPsx(ReW*XAWuTgNj z5B|wk(d#R~e*5kZt~_+)F|B;x!-I|*3TC@L$J3FUx#;y~S2}7fn?3BSNk^MWx7IoF zVYrVg>vPE;bd)intg`n79TiGk+TQ(*j`a4vEEm(j@Nj0GD6wD+-*mS8$-&bY-Vnx& znFV1uUx9?TnH7dxGxs_@FT!xv`mY5?av*MeTENHkJq%FE`W90<)RXWPcfXd=1Q5s zGYl`M&faXhgjo>}?#R9KMl<;e~OLO1V%c)63#S&NR`HPmRs0oKYIu5Gz-) z_ACt@2zwcv2>G&7JTYYKLPNC`8U^pbFZ!VJTs+iq+sw3MU<`(zsma-8DTm=Aw$Vp< zUFhgwbe_)7Y#I`#f8V(Y>cleQxW-I04IQukxTZdthI|W*o8ur}?*@lAxxsmchn`&D zaUAYJj~GMMVhraUy?5J6kdEYBrgM`0!5_VIS8p7pAqmF{mJgq3=wWWe=(eSF#B%*} zPcX!>aaEJJJmlki!0DHkIi`Z!P>1nu-Gb0p_?WMn zc|qPA!+Xox;xW8@=Xg42E*%MErHHnA(NKB1hj=j`9oeS(i_Pj|xIK-hUZfPm>&NGc zx}c7($fSt$f*-rTJ(>-J^L_Qo3V7oS^?Asl{PICMTJIv`B?x&{D6;4mH=rY)uc3V% z&aj@i;&c?$iHpIdn-#Es$dbhHSU|CwJz>h=7yGQ;+QauiE}7H5#1F&WqvS2kSfSqx za=GtUg8SO5xViKa4YB2JnxnzJXP=s8ya09NwR2+WP3UimvbhCBz8;$}kA#DtWm@4} z*afIZcdiF7)iFFjw9A(qN=Hw27SR^9(NNh2OXFJ*_d4z?E^bgy;dA13HZE|k7pmMJ zqcMC5*O*Wn+{7ILKIq{Z``~!Tp zI6=R;e`!u782Z6F*;O_@i5SkP(SG9X1`K!IljyXU4a1jin+nl}yi9r>8xLcoBYBh3 z%6>Ta)1tNf-5E4=qi|DY#v3}~z>QDwLcCu7Eb)tk^Xf?PQsuHRyz2hS>xPhDbvEm^ zBIpkj#x-r>n=$;vE&teu;P0%l%r4vGG<2!4)HV?ObL}~)BqodDvSRN(8r*?*?(F6a z2k1w=W3~Mcp^i*hw&(5vn!{WqBH=2Af7uXJ{{Y^ZP`~W;ALulcdRje@&y$8;`8r1k zt?UZYinH{@TcCEv^u z-kHj>a3y#TQhbCqO+!Cle)Eb=67=J-!tS{y=%+V!eCNo6zVp{N`hW8K!rXL`n8e|O z|N8sqAJ&CAl!t)}eki!v!H*HY1M3Foe-6Q<@~@h!(#3y!^^eR|>;9+aD#rPE{onp2 z+`RRr;6NvFP_AVx-h5uz;~11=KkToe;=>4r q`TKRXg!!Kh|FAdz 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 Wd!Y`ur?$&A?14Jt_Oa-Pxcvv*Lk1WC literal 11976 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 H$lHGaP+}F} diff --git a/previews/PR1624/tutorials/out/solution_000090.vtu b/previews/PR1624/tutorials/out/solution_000090.vtu index eca7fdbae6268acc852fc864ea7c29b3f5789602..5b971ac051575b4de2c99721d4345fbb17682acc 100644 GIT binary patch delta 12223 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 N{trH1^UIUZN*$0iy-ffB delta 12235 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 diff --git a/previews/PR1624/tutorials/out/solution_000100.h5 b/previews/PR1624/tutorials/out/solution_000100.h5 index b9ee84c65e52bbc1aca3eb550c5fe597ec764567..fce83c79f2ceb2cd8de20f1e7fe0670bcce96800 100644 GIT binary patch literal 11976 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 literal 11976 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 diff --git a/previews/PR1624/tutorials/out/solution_000100.vtu b/previews/PR1624/tutorials/out/solution_000100.vtu index 491a18ac86fdeeae3fb3362d5657663c45f6b1be..f42b25b20ec156292cbc4484a369993016987330 100644 GIT binary patch delta 12281 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 delta 12283 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 VWn@HQbYVUUJTF#MOGasIWj=}{vgQB) diff --git a/previews/PR1624/tutorials/out/solution_000110.h5 b/previews/PR1624/tutorials/out/solution_000110.h5 index 5008d307e667678c02a4b1fa2d2124188e920f35..0af43f74303a2f4bbd591ec6eeb702e3fde99f57 100644 GIT binary patch literal 11976 zcmeHtX&{yB*Y}M?l87QjC@BqQ4bpWdLP|o?WXjGwPnkoRN(d>HC{8I6LP%sNnJOoe zsD!;Yd+&(M+51^{an5<)=e+Op;W^L$!~6dChyAK zb7S)`{-2L?U#!_r-R57MIeJcRG5f$ai;=Th(bt+}^S2SqB@3MYX~#7i zx4E~a``-sX?`NdHzW%gZIA=$4Bsr0sJ^$Wzw!J}j>rV$9*zA6tNFKK4p1!W6pZi?` z!nyq(a`y0a_d4n6% zVFD89kK<8Zh$*um%(>;u&05z6Th5?4`?>sb{Ia+9{J&b)(aCD-n&Qx(d0Ox*PsF+& zo+Q`5Js9U-i~ZaL*RM!s!y)D-@nK{8#TfZXVb~mU%+A%n+YzD4N$eSrot^!s1MXRW z9Bi`*z^)Lv`{T1@mQ5&6#(yU9V(Wg&IDUE}>e~|XN0caWvcF=&Fn3#*KRoFC@$^qT z%=Mjtz%Ot3|K^mahPfyR(VYJ5>t(jf{xo94{$=@{ebxO}`IYz?+<(q5F)rqI=B@D0 zO|n08@z*EWFQFG(tuUOH6L+i80>eiayrm|dz;G#ViFJ2@mS~J}P&tX=Y#pkhV}Smh z%6V=i47WPh9&*VV!!wq9oEZlDtrMZrWyKhtwZk>`!6OWB5bOMwT7cnt9A&H4=3scI z`L-&qEDXP3M|IZ9#Bg-I{k+gk3~vkO+v}Br;XA}s9iCmm@abM3y$5+1KD9=OR~B$h z<3)Y0LJU7f`Bb;B62tkXtcROxFg(=jL8S(}l z&zQB35(P2*hzYZ_M;gN;+a(Tf*^1$kPn^F|H8I?RG^owC2g4^E>{s8=#&AUe)YV~( z;Z2?qj<`LB$8XhMKJ0_xq{52Rjl3)*muhrMWFre{ig0?U9b}<*d5e{g>$1>=9ge<* zVl1?3xk5$kcP2_y>EfOoXCkN6c~-P#EEKA36RNPCg^E36%*0MJ(Feuick|9M(e6`U zn(C66sM_ws;XVFLq;}7>_oFovSvNd9&#+^nsruaoY3@w4X7Q(URklpjnb;|H$d8G% z3x0UG7c$Yese>mk+=O-5GCumoGEo5!?fnGM+u}?v|6nkYO_E@6hb0SnNNah>#j()w zs0@Q%ptqM~9*$6FAqLONzQjou($>9Ov%Q9e;`F69qa{&naFqlNuMrXCJOUyJ^z~x z6UF3Yl0HEm*Qe-ZaK}Kuz0XJ~hCYxMnLgA|gyA+LrlzlyAy2RTgiW9xH&kZ1^*b<; zNJihf%s?he=_ogzxWPp2?NS*&v@K-wh3* z57%!Bxtb02Q25;>A`Z@5EYzdrHRP>rELrr9JJhBA!{G1G2g|JtyyX|L(0W=M>D_z` zf1AF(tPboQH=Q{`wZ`x_nG!MyaPE@K`)++O4-SXK@MimB_>*Pn6vh@7dd2OTBMg2z z%6YVUp${-=QP~$VP*)i>Dx1Lm($+-J7C@3@>mjLN41d<-;!TGAXeqiUr^1}kv86xg z&&P0<`{rT~a|}QIiYF|4hJ|Xb(tfl^P6K>++}i;?rnFww5$}a%pJt|Ez6xTUDjGT% ze*NP4Wh*mS$hlqh$F)=@YI76PYl>zfsWYVaPad<7+I}7GHt6dhAAXH5kiVA|;X3j# z=O-ohFWLg!}orUJ{+DuMB{ckb+c+IYZiB=xid%+s= zcS^>sr1UJj_bL{Z`DJ1FfrXln#xG;Ia^`~Zm(UN9Rekg;FfX2R)=IvE_{?nchD-XG zNQQT3zzOJwz}I|=mO(6Ztnlds7tBYkw^gyH;C%gFzoYe8!MvHdC~t5T&ShRY)fMWd zWyml0t2c&!5{NpN0rkPdvvcAZ^tYRWv6u{Ep{eG?4h+u!%8}pRNtyho>&stX+5hPC z+`TD{xQW9D|M~sr*ZjGAC_mdm_@Q8D2|q?W%oVA#KZoF^@~^sAU0L-js(<8OrT9N} zuVSCg*Z=7+8GoNoB^)l+KR^Gve9FuG_wq^HQRnWduJCN|%iTZx{rCA&h~%7I=kMjp zakD=g{^4l;?e59Z)- zAj;=>7{P-Lp%=gJX1fP=qH)*1d;|Wt>)ikj;2&TYD18OAd4QDK4nQ(iinoBC$w;4x z9{4YEj^w`!^!lk5Rw>XaKFOkA!S2DHaV!M%w_H3~oCH{}x^kxy@b@WRkXZ-F|GSJ$ zJmA_!QRy16lh)a1&kabL${el(bf51L*bZ26a_#p#&{ORUuWSbNj@7=c2skW6bx{Z0 z)4w)70{qX&#AV-tIG)KEVK%_8!4V$?P=Px?Aqy~H*Zoxx$bZnDkjp_oq`cL-1L$*( zn|6ADJZLPppdRuv=p^uV3#=QQMv8p{7-3@=;S6Y~$7J&dJ@t+cr?SCb`bbns3DD8? zpK_Fd<`E*Lgae(XSRy|S=hG*MbrJhZ;?%8|0o)%WsT2!n=_PPz6=3g}OqtLOoKxr0 zcnPp)p4Uw=fp`+-HKP#7YmIu6hajG}SQfVy&?6O(5}BY^^-w~`B^rVKs|9QH zQvfff+G?|bTu(UWhXwf2(%=l)47B?xZZZS(SB@X|kcK>X$j249K^++iJD*3O$K(y` zd;@4=ohdE>^4wIdpra7CT{<<@9r$mIUAD!5e!)ApV};;ng?}tx4ET-wtnld(=zV6J z8lD9DDOJyD2IRT**!>!ahduZ)FCF-kpN@3(KwV3Dt=T^x>c4yIilS!Vx9oWznGSeI zfBO?-K#41d+&{p2-V*bqiT%n;tjPHa^oP=c>#pFhcIl4wCxHGQcks>x;0WtWeG>4m z4M$&F0QjoMg|`#dmv-H?Oa$zUx=)mGg5HZmYpYKK9V4<&WD?|@v3tB`Kwr4|n}!$Q zma7TQ{19KoF>*9fU+eY`<{AQ?cp;w62Xcv?=PykNe|!fN{Q*a{qTl#~TvU@TlM4Pq zSH2MOhx`)kxiTbugbuNdgO2K}x8K%G-ruDyVX#mtvW0R44N zdl>>&j+DjagZ_5$@NJn8U(aS6b)t_?Nw(g93;ZNzc?~<@`196SVorQoIAVPjg}(gW0ZnvtRb{H1HXZO=kpdB5D0_yK%z zUNfmGz|&6Yslp(yl3KaM1^kS)N1@N1G>ZS6LkhKsrK#FI^ZXb z%2b5|{jsBsgQy?zdXH7Az-N2y#61eg87dK|19&ndEIkzT$ffqIV4$5UVyB4xe)r$j zQU~ijs=sig4(#n%%O`4p-_|M3?7$}nk!g5`KqH*D`{CtxxIw?|Ms#r(=mO52Rh!EWWF z9FK?Kr={nMj}+K_t(V3!wJ;j{O{f z9S#x7mq4FBC?YikxRi0SSRU+x%LFKI0i`s~r58gUJfh;{>p{+x-mu01&@Jls(QOc) zX(Nkq9sKkzdCB|exlmbY1#_*EqbX1oFK3LRw6{qxpO_w-`<9N zI17z)4}u?^7rjEeKwjt;W*ZL39?0A~ACT92{>h7g-*R1Ak3-%Z62(L+VBeRQZk#6k zoe)1kJqrG}4hQv?zCnek)Su?f`B1foF8;RzdKcD-(j#<%dhjk z0s3B!b*{v`v1AWC=LQ%~ZqiH#e{07b2d6;KMxQZh1$G;_f6sdW`gsCt%Qgco5U^u! z66ik*Rz6Pj<)sKI8=?=Mg`KQ-2l~FK4P6-UYjixHJ;eQ#>Mh*~blAy{vG+hPytsQw zH{kM4Bt)EppxVT#O$6SP>^23xRnkjR)M5RJrA^7~u%Fxrem&y7ZV(`sA_;nGmE;uS zJ|GdGq({tUKKc45w*V!j(-!T8_@CZ1R`&rtCF=dxePG9)-838q@+m2vkrzO3TNa$= z2&lLHOWhsdC#vynH2^%UT%=0Oo2FINqxm4$ugxzc-ZM7yE`B%x>y36BlX?IRj`67Y z0KZ#*TN^RwJ1=Q=Ed^9+>>2$8I4xgx+643p8zgfqfz}DQe|8nn z_oU7Hmjdm`T~tSgIHnU6G7bQJXoRai2IM^+r56)`UNri?XEDenbKi(n18tZ?PuvXh z!(Kd}i8@@T`FxU?S9TJrw-*5p%4U0Hg5Klwbl1CpW-^t9QK0{|=7dNx_^HiWKJf+c zT;|$k#C%KC(XS-(tX0x%!DWu~K_`xmu*e*cPEdw7`gP+jj>lrrz7bknVkpLSS zzcdl|6H%!(F+?2NOQyL}fi^Zv=(+-SXTI+&=LXE*NC~nA)Xr>;d=Kls;51od0kq?~ z2o7V=_mpieC+cH=f z6^kMI=krQR;8);3ektTlyeFTe-B%yqA_u5s z7G1pw_!AZnoQS!_3dm3+^0N2Q!ggX_DZl2C9|0_{$>0A0Fy7Twl{i<&?F%N~0qx8y z=kx^fk zlmWexgLFf{PhS5b;rT%0I#OK5a2^XX0zT9M&D`#=>;l+Hwx4Px`kK+6{(`6v@e>8# z5y+R_y4Q9BQ0H6nma8C-#viji1bLM%wT!q&^IJPEBlr7wi zAjmDgS@aS2HrZRbMqu< z1h9*?Gs+hQTBtR9rzX%0!H}5{z}mMk3P!X`BIQG8lz$cBc}HVC=) zd(qHxS<^)RFd9p1UiEc!lxj5v~Y z^T!6z1_57mVsZd^ynhy@u$6|A7E~7;xJg4%zDjN5Jv3CDc(j3PLO~jaxc$sE3i@~` z;Q9Iq3i8rnCNF1D&?GvpZXQlSODo@>UN1{QHmjGv8rVQV!B@ArxcgBMX#11j~P;pDd?iIa#h&xEz?{g9vUFsFnzj~OAWVp|^^(&ImS8Li=pA%%%kdE_S z6QLk$e+ze;wNxY#a`IbzG!+TdR&)l)Qqg9&{Ak7t3KG66H=GvJkMy7Oj5^HgM`}Y- z&+5FXNM}adOs|HD4z-ND(;4qa_{W`k^=oP9%0{(}bFMVhteev((Kmo-U#*anOI}DwTVIWi?Byu(X@GYn}%lOZ``i-Fu?S*ATC^YoDh*urGs2?%wj7t~3p`b3G z`okgBWRy_UxSMWIM%PGX)G~KE`c3fcdpjB(rJiN}mKM%{-#a{XNl6B3I$`o^yA14~ zIiQyoLPbZ%m+=;5lhJ{?qncq*F9%(?D2`AUIm2Vx*P!n(c8#xx_tKGpw2z+yiGe<+ zZlXxbGEh!?4PKQ#fP9w3Cy}5Y1z+B06ixIYjSGpLwTsAzt5BTN5bDF#sLi`O0 z#kzgbmxhiQ^6q*E{Td&AC);8R12qpE9(c48&M$DiOzUGZDp-9q&uXv_tqxELm}Ua) z|C<=4je=z3mpP`vIe!>W%h$33KR)`rj$2`0K7!qTV{~K^yp(!vcRyOcOHF2%BpF?t zEZbythKyuA3SM0BqN2TAK^LrV_M`SsMaALJhcEf*hpOk(k^k$OqcK6y$9L*K4_eSs zwCM(I1zjp~7Jm>~+S3RB|75K-??LD{0kcEq70}TwyBtGvWO>AAH}xAoDGH5)}BvVwwM@CaF^K_B(B3cplsq#)V`S*3|%1L#UTRZ|V> zcoTcTP3?0u)E58yJ)Z@1v^uHv@!N4a3c1>z9v#O({h@-{13WO_F2xooI?|Bhx>Mbh zOZ^D@rrz>s4;8KQ2_@-59ZrRr=3YB7fG*wSp}n0RK&dT8m&~?7U0XCglsnEq%q0(b z+wB-=f4ic3;7U5;u70VPuRDM`H=7M@>!l*9sh*qMUMfm%a?W)2+*H)#!u`8h=gPC`{*LMyezmuDcs-RD< zhK{7XA@`x)n#`|0)Dr#O`J^y1R%)KFZv9F#CEWfPxAi46xI9$Y|4Pg}mj6jI^ht(q1G{ zk!!j`s!jzBF?R9n6?b8v@XMUpp#Kft3ruTNP!UP4y}*u_jMm+&a!C3>My6u=kex&F1rYt)O0Ws3AowU|w9Tj;$y`K1X$|Z; zfm~!%Um`uybI)*r+U_(j@}#@xyg~lK8?NLM5fB$P|?#Q=>vu zroA_N?}##H?|0qB^E~Ig&pGdh_j&&x&iU^T`**MLTGzVPTKBby)78}GVLSERqc{#XXohV=q^oX7}sv=<8(d7v$ymYrg^@ zoZGLNhp(THzrCNokE6pL(1Kn5HQvA4A9i;8ZO{1^d&2WZC#7G@{bgNtOo+&{pR>Co z#xIHfI3C3Xm?9IxoLj!~Q0wY2+Zi-xKbK#&-}VlE|5xi5G}4YW&B^G`Jk9@|Ct_V+ zKS!^>Js6MQi~ZUJ=kG{n!y)D-@nK>4%^3YfVb~n9&Cb=o+YzD4PV5f09bN0caWvcF@(Fdrw+KRoFE@$^qT z%=Mii|8H;j|K^mahPfyR(VYJ5>t(jf{xo92{$=@{ebxO}`IY_rwU;Z<&aYt|-Ou8!BE&x9?+kvv}vX%zGGa#8$Cg- zvflQDGatiaohcq#c^IyCsqK_d7KXnITe!gcA5XUMZo^^oB zn@$^WKEUwZjUC8`BOoVYsWFQruuOhSNMpraBri zJS1`T{S-kAw=!px_ex{)MFxV6}O-V z;!Lz*$>!>$?+lcq)WtP9&OjlV^X#a?Oq8y3Bx3V+CMxkuJS2XUfx6{OKg>JHK!%5V zn(I>;sMY!7KJ8!zGPvp0_sM~QoEz_+qB}DXPou`YD?SY5u;}y2Cr%7BkkTn-c8q~c z@BQ@kdB8y9Q%3d)Sqv1-lKUwriGl8OQ`;wiM#<*qf6^JqI#n>N!TW0d--ra^T4-442!Mw}lt#;c9F+WfA1@Q>S1|0`R59 zdWBRsVtCF_$-;$B82<8=K%B%m3~x(~6?h5fJ;dLf?{osg_p@GCtcASWxHT?{2K#QQ zkM8+#7_NS9?NTqO7sI}yp8N(3PkvW*TnOrF!H(w}= z#~r_dyG-Qy)=l0{iHXKmX2^eIVIuAUYf05h7~VKv|9#GFsK@a!`4*@*_s%I-9jLwAWzK;Z^z&~w8yLF)t-eq{W36PS%BfX zCANVI;3sZNQ}htj^-bCf-Qz|W-fq1}LL`QXEYdESsMIi!`X2kht{?^q4{AMi?Fa)U z6y`a8hCE87>*sPMVz_*JZh9&7!A8+(v&Iq(KQy|3|4T&-zxMK&h&j}wVokpHfGYzv z$5?V@0zEQTkId8>3oKU>(eU7vo4;RTXEe%MxG_yv*1Tw^f| z*Wa;Y_!{iv_UR3_{4NaixUKB_w>}0k&NiSf!cx^O$5fZ{Y~vH?JUXHDhUF*L|3%*x+v1cj$u+c7_3)<}=ZH>U+lz z98gc$Yb)x({;=$c0~7}gf0HLEa}Lg3oKfK25A(nzJdx*C5Qbk7&L-2hFi|y^U!e&2 z>8aw@>VrPukQQ54Cj={6U{iwG!$d6?sXyBw&VzA0F6OX~N%`d{r!^Q}EU{KZMGwP0Pk-uP z6o=vWT3J1npFmx*tXom~4Cc?4I}&jb7#?NogqmPZ{m_tXF)n4Ik*4noe15R+cZ<{y z?O>u46|c@IonWF((T^pH`Jw-CyO^#}44-Ea+okjz;uWEdUMjGLc?dIAba7`{;b5ZSesN#QD**#Ns^z9d?~w7F@|hWgB_ix;R#T4396_<;M^EP55xp__{I^HJp38F_X+du{WYPso<}}d@$of zG6U`Maggde&qV#<&ZTAGFM_@GOb*nkb0D`*8{mN{t(W!iUf3i2d1e~st0>l~q^^tM z>8DQ#FUw`3z&7Qd8JP^!?k%L>9M3??Cmh==A2N~r9$l{Y(ARqd`P6$Le`(dxx|?9m zf0Nw9y9LfUr}IR$KjicK{>=OvaBi$|8zUUDnP?%;k;w_D|CPp{GMqaYXzkuz2@a4y zdl~Pt@+b`Ns^+aYmXF~E3pDSKpT}^8y!qoVpdU^=>8D+QdGUz-*@_PkpQ}^RNLfDv ziSg_Vv4VaGc(qX8Hk65M9z2@hg!!oQ?n%;NINzXGAE^ECK0G^fdXwQrc>m1Hrg%Z! zG!7rT^ECj&NBHAT=0bfe;NCg$82USEv#GcYVxsAmlnxBeKk>k|4^rm;>H6~5SN1>p zJa=!pLfpjRga7*e^NVBd9?HkE0DdSq+rp0#Uu${F?9U;%sr;+%RTq~3j_Mz|SIPfR z-K$t<^YwrFOUB>lQvrvI^{>yrE}xrZ{(Jc(?x=J3R4;fo{O#@^{{H)XZH{H1UFYxR zipjG-8~)*F{_XDH8TfYw{+)sUcQQbJ&nvi{Z5TZ&Z`5W^3?U6wqg?#k5Nb;3ka{^j zg!pr7k`7M|p%T@?!cB}Jw3Ea^UBEJo)Hv*N*jb0s4bSUw(t!8rmgdqwhtSBS{g30A zL#UYTZVWdzjH=#hu-pVYvE)lV-+({mbt8lg_(rV!KhwA|DiW;xJT1JlI5g53k{aV#A4dU5z3Zv(8cU;VuZ^b|UyYgzz`q^hpB}q&uL1Hxcjte%1=bC|;+XUrF!qRXj0d2xK7%C~^tN|=JbVl6B@e`vl>vRK z;d7w^(40b!>Cr%6moM8i4d+7=#JY(6C9vx?$N=gku24tE;km$|lV?1oD?Ay=lV`&s!{?OABb0n)@jX(0g8|J>~$kyPJPQ1Yqjz zQpqN;6V`|_Nd+{#yUxrR^!$pH9=!*&P=7b$0{DS_;z1GMsx6i^W3X<-oA)UuVBa)< zl|edSNT!nx3&_<(5`Wr&A0u`4@QpzG9Ofd?L0@#-(pMVtV81E(o;TEyr-;WX1bRPt zB0FCL9&pH$kOX;ardFs0#JxM4lIa8dE>q8KiJ<@dgZIG);71}jX<;Jxz3^r8=lh^n z$1*iC3G_>fzWWTwD;uzaT8M`)>>&>g_+LIB=<0>K7V}@VhXd-rXY10E7T~|tZja3d zylt?((iCw01v8(Iu%5f*JZWOT8j?#3zXJWKeDIPN_^V#5vepXdZ^=g2Cjf_;Jq@YA zPaBEPm=D<7>&eqe#OI|ZEDH8j-BuOspjTnG`sq=iQ$%-*PJ)~zN!x!0^cS>zQ}+in zyLirn58|sjNQx)wi*47?9b-VNI*D5gK`zq!{DnE#KVP_4J{XWiJN|Vr$X9C8WHP~D z*s?m&V93wM6IxSE;3rq4@p1<6U8SrSHG_S|!XSqwfD&U)Htv8`rOkJGzz>$VPsbSdM70AR50 zQGa8=SECil#h|Yu5xp%B;`_Yuh$_*?mMdBd-U0s(qpFq_aQb;`5-}&b7mPYw1i5kK zkrh#ZO2y1>Ucl*ezdbsDA>Ae4h9RyNDV{uHJynV!?>fM?%Hb76d{1VO&vo!4Eqe9| zAJA;d<$6RtN*ERyEe0GN{Qi0aptj+n-e%BSe(SuU9nkk~?7c1pSX`jGaTTD%b#v85 zi0hH@#%30v)3l$~YyqUn>`@@{M&HX*$_{9`V)tD)&|7yt+(ilSBw`;R<_5QJZIuwn zJ1lHXDb z=je)iF#*3>QA(219sWEr5*q~&*uu_`v9va9yxx7bwzpD$3_7| zc9!+}1NKeK91jAF6h0>01$Mh-HI6HRe$L>rtNMWIk8;!1fzQ7>z$psy%F~l2`4jkS zc@9ZE0nBvI&J+RpfYdSpPw?}@N8<`{{)P7w_7M4Pey0BO5YTUreWuI+o_qH0VmE%2LL2VJ*<-te&p8HAnA(a5oDKu0Et4S9gxgGi-CzQ8}L zk}^!-9g{MrERf5Zv)c*gWzG$9ZnpN9Ibi2f z`z@82*NyB0Q$&54mzV{sgWd}ra}|7Y2suV~@HfGEd+b|soeT6^F2|R4fu1_cIUzaV zTdfK+nyo_75m_)}c?XzIuG5Q;CUmN10%C<@z5t-)^j z{X*Zn;OAX$PoNao(Q0*eN{kJmxWytis^Bl}{H>%G;Pd8(OA`6xF17tpY*IplRbc%YdiL^ z0lsmKQ9KL!V?&}+!+;`m`_fHd7g@nieh0Wp{bY72 z#An>Zq+bF*p9OCB?F7`3t{o-np5mzSkhq^{_IB=X1^YMpnfKU1{`gy&5HaUMd!N6{ zfqb|MjdKlwAFaARAvKVfct<)#15Sl7c5wh=4jlHU0ekOwwpv2o+)~6vt6|@1i#JRY z{til5Q7pj!`jODSGFZ>7KfZY(_{*p~TK^5!5f6PWAxP{;i~XZ6=u$4q?@33rnFn2 z8&J9v2@&TYxntt6EP*#ybngef?a~72s<1vL+?>V=`>BcH(?Dukh}I`0KJvRRcj!iBj;YAM6BfHIGDsoGQgVS_ibMaM%?$ zK;!K__1A%acE`f4hJY4|CCbFSd9j>gQ4DgEXT=YQ_l)Pf(;uy1z42~S$6i3agWO7i zz$Y1Odr!>y&u2Be76U4_jhy)in9j4I`!S%bp@=(iuLxFD{`eGVs-_<$2=J7htDF@0 zIk&atei*E?NT9i`3TVsi`!;U_`6}a3CmW!X!rh;T07g7-DK>>Xy2Mahp1}T`)XT?t zfPdUpK+_fUEjf69^?ku2HSv7lXSjUgKL*&kRQtzg!0AmDN6kU6sBuN1EzsH_1yRI3 z?y|J?z+#|Hxk~Cu5C><<=G?tNTaR)!B!c|AZ~5tSK=b}+?_C7)Wp`eSKLy&Nke0F$ z)Fcgic*0?wzTxb`%r$UJ<$V@Q-ci!y9t3J;2|vt~8tI|6%;NmMZZ3 zlEf2<{-G};AO8ycvKK-D#Cx(T{f;d0KFw8NQz7!?#`-L14CLE*M-LP4nSi4k!i)gd z-u}Q()Wzltd_Khe=xyw&1frfEMLau0-0PPaxpdD1)Z;%XivgZ1(;Ok{FGqEJiyWZh zq4=k=!2fA;+ntzOlOee~h`gxWU(iO(E16f^n??a^YK!-L1U&2IrA(Zw|MvNlAAok{ zk#nzve4Ki7^%D`7fC@*nBH;0=buong0c#%;kq4!=8D;b~9Oq;J@HR zfB6u|Ex+0H6Zf{YSMQ9=0|xPC3oQg3W_`2O5BxPfTPQ)Ci?qz7XgQ!;N?~UOVdv3R zP27v@yX#L9eRQaS{6r7@mK#t6BY|I4Za@S7$PN8_siIHY3;Nk^ zzV|#Sh_BAHwc#?zrJsIo#KF(-Jx=qV5mfZ?{XSi$B^4db|H>s|PDO7erlp3DP|=0; zLS6&@RJ3y4{uI7QDpJ_~+%PbKicYC&ymm{XA{*7In3&U4l)q|ERh~EwF*Yl14x*)L}B^vLA09jf{XXTAlk@&b3@7ZLFB}i zrdK=$G=C7XnjAz{?T_O&Z>6Hx`A_fd&7#8pDHYz2_fpY=6pKcRIT>v+#$9GI$f(mS zda zQ8IE4w(&W#nu3JG?Z2Igr=Ug8syjp0QIMQ>aXh^a;=Lg^awTy9?Rd`p!*$*OQXZCi zTpvI|nln0w^lK?d`_1SF-SGjW^=YSm!)iG14LfpAdQs6My~2LU{y|jbAozalz#z&A zHBi@!q9WNtuWpQv3?f}Ir%q|LK@`k)z^}l25M`H{l1oof(KND@?D3|d%M2c|_;WPG z%jH?)%SS_Z54R`o52K>B7Oz>(Lmg(U-BZ@ZMnek158cj;(vWgaB#KI;Beu=WlST9C z$V#d(_@E~h`B4pCr^gSVA|;Uv?Yb0HoU<$I=_4|#Z{N$Vzleq|x|=NYh@!#0bjhvz z8g#__YUa_=I64|0T*N1Io2WYl9obKV$h_gxd+8Ahs#K4PR<9u=jXb%Dc1*T{&n9j8nTfNJm%_1M?W%U z$f@}*1J4|%Un$nIqoUA210J`nbW{*1*nMma`aEngB|~EXEmzwiqqc&C z5+^HU?M{%8yzjlb1b?V6&d>yhtN~Q;xui52`ml|UX7-eWhMZs3S|o*@itI!v+9e{>LyR-f`*5KBd(SB8f4 z!f2??^M_o`SvtCL=h>re{ZwSfLgtUHhWg+Zvb_R*)YmHVLb-{IM%S-Xm^e6y?w+A& z?tnU$W(~>GIY~vWXWrfnoKHimQ(GUt8>gYri*4EQ$#g`G5WF?WO-C(flkUm8QIXo3 z!`YMx86tprh!chHP8qT1V(;LX$oH2K2F6UUa5?AJqN$NyA$(e?NWx z?0>e3f+`%mUrt++&;ymnyZuy1NIE+G=d~XcbhNE#pppUS^R!=!?EoGAF4ijc=@cD_ zI|_a2gmanh%?VoTMMs9q^Af1g|GV1xr`4+|$X>4Po-+^lx%tF3^&<&+i5Eu=eH}mw z_m13J3g=N_&B0>_^;$>?FIfunBKc{IgB|qKnlCvW3XlhrntUzI@j=wP>vAW9myAjq zS#^(dlF-X)F*`jc3hLRfSTs2`h(s;SJ{Uv&>XsQX-od;JVwkse7=>ma_5$*0c1yItau6vbvu4>t9sURYND6}h diff --git a/previews/PR1624/tutorials/out/solution_000110.vtu b/previews/PR1624/tutorials/out/solution_000110.vtu index 5c45f21acfcbabda055fb32a4b78ec353f34fe86..ee861fe3bc5852ff9844f1fa077a79427e0ff671 100644 GIT binary patch delta 12270 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 z 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 diff --git a/previews/PR1624/tutorials/out/solution_000120.vtu b/previews/PR1624/tutorials/out/solution_000120.vtu index 458210b30d560b8a660617fd982a9bd7df0cd1ce..8e5883e18e3a5d15667fff733ca75374bd35a8b7 100644 GIT binary patch delta 12291 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 delta 12272 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 a7$vdtPkI5A@<+`R?t3PNiKJ?!cmD&9cf>jX diff --git a/previews/PR1624/tutorials/out/solution_000130.h5 b/previews/PR1624/tutorials/out/solution_000130.h5 index 3a5244f511d1f565c0f7d69819da633f976ce2ff..52856d72a9c4ca3bd3984004ba217683959ff703 100644 GIT binary patch literal 11976 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 atkl!sdpC#%n(i**cnJA6tYa9#z55>~7!#-f literal 11976 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 diff --git a/previews/PR1624/tutorials/out/solution_000130.vtu b/previews/PR1624/tutorials/out/solution_000130.vtu index 4710cae87c3d5415f7ae814e07c3dc137b566d6d..a5a6db8c760c27a8dcb6793278a2a61c1815aac8 100644 GIT binary patch delta 12226 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 z

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 z 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 QA!3vP*@IfKo-X6?KZHC&+yDRo diff --git a/previews/PR1624/tutorials/out/solution_000060.vtu b/previews/PR1624/tutorials/out/solution_000060.vtu index 8b7fa15aacc06086097d49e59ff1e4c669fd8a5b..8c98f272b6f674ce70415c78c1b33b1bfc4bbe50 100644 GIT binary patch delta 12218 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 ~+B(;{L1FXx*r&4)8TA=? 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 literal 11976 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�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 diff --git a/previews/PR1624/tutorials/out/solution_000150.h5 b/previews/PR1624/tutorials/out/solution_000150.h5 index c5dbf29fbb7116cc7359617424ac5c86d6b7b17c..c9fd4475977e8555eaca3eaefc1de01c25375b9f 100644 GIT binary patch literal 11976 zcmeHsX&{yByZ2*OhNLp3K`1JeDO2vpkWxfM(SRaD<|&1QGS3y!B!!}qs9lr_nW89> z6cuYNthLN!$Xe%mioN$a?|#qu@ZabE;eEFc>$iT_bYJ&%U-z&odYirh-+Zz881cu= zjj>|_Kflg>FlYa2Fwa-<9x`~VT+%ugZGv>Q$>9kb8dX@U*mgvxE{B6aQw>*=86Tu|M26Q z&D+M`&ik(uXaAY$ua7_cc;@^ZTpipT++N^g*U#I*-WaT4mVeIo&;Cc8U4Qv={mGw*EbpZ9bGSc^%YiK>>g?<6 z=723+iGE)mWgbkK32Dv^-*Bv{p^AqcpYxxqFWWDFd*A=oyO*K+P1QXa{ZXfRzv@Jc z>*MR-`Iifm`fD)wWWl(8Wip!%ac&ZSEG)kSBR?62%^}xgo=LLwXCe<*YDBvk6FH1s%TbqSqUThT z&v;^BJ;J*;thQ&ML!9s9!tEG{*>}@m8}!Fj^ZkVh-V9`WKTZD$^ucWdzLQ^|KMa}e zT%th?B>8OBGVkLIv|dU1$usDW7-a2!+lzsA8eiJa3G4iN&CVG`CkFB#={d9QwH@bV}M7##vnDc)aT&10C#m^I}JyTc)lxN%AAnRpCWvprd63w3x?y-0RC z3B$K{-FvRE5yO|Rk!hIEhT#fWlHF7Q0~LPTI+O`@5;2Q~UqI@Qsw|-=zR+MbI4;FRaj6`K#9*BTCHzUp4>8dD((TJW z-)Ep>97}WdvtxLLvmA%{V+?n;4~lBZ#PGy5+96A5Of=-X)c#d31F@z!-_OlpAbDJW znJAn)o{f3*eUOj1g5Q`Ije-2+Xd8HyF`PEq?=S@Gkwm?WefPoed--P6_YO>CtaY{Y zbtLmw&+d`h+~#Bkr}$Nc_~r^}Wd<3-R%G7krE6^Oe>RE0+#_RH}Y zh0vQ2PtuI}ja<(_=6VGpCYP8<>AOo_vH_eE_Nqo0oKwg9%Fb+gj^RJ}9u}lRKeQ$x z-c4|>wR@Uao*iPKrhE>WL^w~`Xyg0MT^MLyUgq^w z5%ftyG#(G8tyCuRAJt+g!alBYlDN4R)}^vEV7q<@ zhDY*NW}Gg^@PP#7(GYaN^;{G{I9aK5l-x9Q4PL%uJ^g2F_Y zh{=>ZHv#MX(6)oGBZi5N49Ji=pq`vICYCQ=V)%pUXI%XkFg$4BnnHgL6P+%<$a)UW zwZMZ}EBztf!u^9K<>weE$alB99`sGzw)tXX(8t@vJKxDgF;P&{VYRI%G5n=0XI>DT z|C@CZmRdqzE;#f}IQR$LbMZ|Hg|HuOU;Gv}1@YwLbXOdLK90Jc6;kU5=S8m5t}0$tO)b{aah#vVH1Ww3>G)!gY_t?S)nt%l8JVV$7VEnKp)o}FldK!_Rn|p|K|6( zcT*KSq3P6nkcW4#7+1-}P?2u;N!%f6Kc{@qg=G z#X4KB|J%Q0{B=E*aClh%{QLLSbHkc{t)9dib?%+&3ExeBh5MU7|GHiqqc~>A`D?v$ z((KQMzd4(K!u?Z$e=6`#1^(Zu!0T&^T@q&okcmXu-9v1HsGCk6KFBeMTw8{$egl4T z%`WUD>mXt|Bef_38$|SlhDSTW-t9xc){D~vD0aW{1GA|C6d4sy&H(++TK<>oehi?R z;I4)9Kz~szl4}cN08O`785l4J(0ICui3!+I*$SnE0lN)^L{Ea;P)Sp|h=}jk(eMK7 zR~#q_*#qOe`Nl5o1Mvm7YPNer+?m6rByO-P*14%<40uFJHTpQjr7H zC&-J^UJMNbk6ixZv=z%BdMe3OF$5&rMw7}we|oFEk_zyi8maXPfXMm+n;O`Eb%~0x z1?)T0lh*=vb!y&bevrpl?{-al;H8T!+dl(dkn0T&1)LC-OO*uw-5sZ*%D^vU_0s#Q zfDGo6N0ER!cbJS?Kx~7_v-N-v8@0OKAzyDJhbC|EleZN6zzK1>xlRnf1N}DRk=Jhk zo$ux(?E@_KtjgO3*tU1FU<@#2Y)7&Y*l#^CajOa9Y~T9oKp)88P8Tp}z?pWn!Wp1% zc1yD-=CME9@OmYndugZNQ;=6`p1VZEC*QP?9S8fYBp)j-;GOh>>iv)pK43i~3OwY* zyu0pTUw6C9Q3tq$R95|KKyNP|u0tSScl7aZuYmh`#@Jqfb=_+b-qJcTfDV&Zr7=MM z?#{aRED-<9pvx{Th})*sv1=UsQjZyFC4=1Si4Cd%e*0*O{W7qBHN52BG{_tByv>t< ze?GG7V;d1aZKN3ov@Tk4NDb_>(t->=03V)E&D#W+YZ@%P0Mv>ItR)5Xy{oB`y8+L?*yKX&g9^*K8+?Ed{HZ6O0Cs{`R0?9c)X8!+x5)(chknk@vo@sm31S^+!wjy@L$xihPQ;}XCdAv)nXf@N_J6pDEy%Ra{($V13Q<51JA2lx9?IEC5|C&fI8( zc!$4UF;N2EapmyDUEl*zRvU=@$Fg1V{6&bDDj^Zm0lYJzrI^c8>xQ#^eNfHfknB@e;grXb_vBH$;UUdx++IF&Jn51s(|jnBoNG(bzG5K}JJqs29W{2zS(S-43<{uC{4xEEgYO#{AJ4~?@0X(JN zrb6tyy`^XC*nzJTIohQMT+KVNauslwOEk7}z?bgsPdKz}}9$d~9B|0r<^ z2iW;1tn$1L*xK`su@2<;&Ad3GUjp_Wa#{-^@z6MZm_qIs7B-&u(VQDL5X?VnV80Ch{-T@^vD5wOZ880;)>40{v##|OU%%>jHp zNhMVRicMUr-3#dQxOy!ypD9lX(^%kPZ{xXTA)lgs9zORV-jWeYB+-BL&8ohq!Ol_W zg%iT0pMb^i@3??q7~o z@%4HT-z{T5Z5zn9uL_7I`cx}@{6RU)bGq$^G%;@d8%bSayfk@|4lCGqx=Ls1fnMtM zc@=SxKaMwM7=XW|yo%g1(0|#*&UpaP+WgTy9zcT(yQeXr=e)@~ZU*sE*%dWf;J!2n zD*tvK^fIIK+>}9Iyw2>7Dx5ETDtzChCt=@QyMjx>IETL4!G9Yz*4p`2+&+QiIZM27DTY+cTd0uLTI7m9_wk6#6Ii&R;Q(*j=QnHf{ z#C@jA^DGDQUwA@m-+ADi(^X1sfYTAJ>z_g#^*c_BgyFryTQSkT3*^d?TTQaTfAAbP z`(fZIcO>;zf&WVb!MK&c?Ui0USPS~o*WLSwbE8)Lvm0?=afF)|c(D(ng+d3y=j?CEi5~ zg04qYgIuch*#yz&w{qT>%YeMtHS_)i@Gmzyuh#)@nqh950sc0qnq?AjAjYAdI1jY_ zFONKe@nU1ulNEtGzAIPZhdhNXKF4)|-_RrOE7E{0jSoxxK|h|L+DY`E)yNLC1F*np zq`wdFfv!{=Cm?E)^C#AM&l}zAkHN41Y52{nfQf~gEb?K4 zhc0K%5Wp$$^alfcq7zmXM*&?G^)evf%ery+Hdpu}%Sn zk7A&{U%CqA>;SED(-(MwK7T4H<2l4RGI~{*$V2Nz%!nSK>*gkp1%TCQx9W&{Vn)P+ zgILE>)hUB|;3wR~+U$Tc92yFW2;NokR1M;}FwTq<_rgV)o+re;$aD-b?BZK>pQNbTS(F#ycUBy}*T11>}iyG*mcnr2=sNJvm}TJPCjPH^h78 ztvT0mRlvd*c7f3#mnq}^Lac8>I?62vu8>3P;stcQSyoph03VLm z^%3`E#pa|!;$4GWukaA}(w*WB2dsb#3q9_r1^#01V^J#9BaSbeHU(Vbn@ev2=oOUn zbcy?%YxT1cL8wdQ=}zZ<(C>8}kbDbRHNtO5+%H0%9r47v?s}Z@hUg1bmX}|N`<`Oh zxTO>1!OEG@F936YL?{ybpec9MSq%87cKdo4upghfI!N5x{icBh)*x5!UUsqufzw_x*2g~UG752U(f19rY2&_4i}t z75tl5Bn1w_dW3g7o+1IN#Kr9(?nmhjiB5LFHAal@5$}W`jb|yu`L&a+){dBu$GA%+ z@h&;ArH;o7^bTn**4qKM@py!oK_1TK)9vE0f8JPI3h81lCI%3I_Mev|pf z!&E_j!*l%y;vQ76*3otVeDlunEAh^6ed=v+46sISMdU`XzxP~HggAfiT^H!=2KkPA z)b2vKhivwSf3gR8rRmeDaKJ^?52Dinx3*MEt$}!nW4e;_fnT_kbM7LHr?K)=^FcrX z4bJ<-K0eAkm=+52{MI^rU>W4QNVQ%sALO5tx40*R+*q4KjQG8}hfzLA>>qKLx>v;f z1KXX>Z2b1n=bL;M`Ucs`;MGrs_&YyJ>@N=KINL=GfiKB0I=v#YbjmusRuG zx3*1r$dl142_ws_)nv5VB2^k+Nk-hKj1`z-WMuLo-~+yxjO0fLk5y&#!hNl_(!{wJ z>6Q4t(GciGJdUB(S1Wta+I_asa*;hKSe@l$kx36ycR|rRS$hyYlp7N)q@Ze_W!bC| z6x7vfkLSFmp<1l)9Pecs{6Cdo{&Ad!bYe{BFA$?4)m`B#^1?K9d`u%jL6C-~_4J;N ze59f#qfK|!e5uIt=GKiVYpBRL+dkepmX5HU4R1~WQn`B~H;2&CVJ|byqBuH=7cR(b zJWEGo5jWzY6*63LEsm zDrm@xW5@OPz%P5{+D5fe5u?L7dg(wP+Od1_nq!%LNb>tT+Ye)X$m)^+9$`X7y0pfJ zGfKTEV46p8VQw$V<981eo!5s-zVDAOywr=Bk(wR9IrgCB>^eq(DFqphZWTSxMnPe( zN}s;lNkJj$P5t`$6hxV?-(})NMs2=BGGY&4T~5g6{t$)wt>x}s`<0BuJFBwXG|0#- z(zmd?n}ptKrE;`?A)$SKISvnpNr>~JNS2~78I5ox#w_fDKJg|yCqSPVvTWM8d<7X@ z9lsx0zL1QndGq+cK;P)bB_k>;86E%V{V-zz8JXvQa}DYvA+P9&QU;lXLOj|Y=)yS0 zit21*G!hyRsK2TV{WGbdR$UW9K|gL#^b$!PlX{HW>6WOV51aD)U$4~pG^kMgbTL-Q;;S}D>r zv@ItTiVV9hoG~{WkSMP6XOh!tvGE)(&D9A@qxq70b z2MyoIR$!N=qW-LPDr@O9^lE9~QP&hY+S|1@^sW^h8R#dComosrnwMgIzrnmyP*vmt zeKPVW^Cr7$QxIdrDXlYRz3BS8dg>Mu6)if;$$!O*j)tW8y(LZPh%SW0t2JqouAQjqa9KmFQ4 zGUBsX<>o^rp=CT(>2-kn&a!D(E~22jT6dqxr}QED!tE|6gXt*zZ6GRpPeu3ZO9s8< zdr)+IE#IkKWE5QTqPk;)`YZ#o(9bMF#V0Tm zGFq?w!;=(BLH)HZCw4~nqL$=_#)up$B0s5iy~0LEQ4&jo+(YST{3xv=j;ywvKi zEg>Vhq~y$*K@!rO?B7fpA)!0D#u*Q)$;kIM&sD{nJ*Y*SkAp((L(~IHMjTUV$ZNFZ z{F&W!#F0|=#5stLt`%2(JbR0RmX?v0q^zKz9S)^j7q!SpIO%50BB)na(PAU9?_^Zz zcg#Fi3f3>_;${aUDtc~w-Ff634J{m>v{?xI#KBN5%EXY0J`d%{o{a26MJGF+s8{r$ z&eFPWiBdA6Zj--jKp~;gy%JBhvQv+lrpyGQ4*In*W7 zQG^X;ZPYQ?FW>jxUfoI75Su| z*@MdM%UqdnM;Rz5!G*S zV|*DIowbV$l!5btmS$5g{*sKWqy$6NU_F>6df%_aP>^>MI-3#IgC^`>Rg?_(A?^da zi{>4sqgT2q0bfqi5TmdC)R~$dgxPs4IIT@a(!pv1L9iYku3K+BGa@63@e*Wv%ymioN$aXP@`|@b35j;hg{auzu@zP4{(Q_jL~{W~+gbAfF^3MtpdA zF-}bQ=g+w>*6gQ2;g@8N&*|-Ef3VGB^eh&z|N6m(iDQILd{!1jq5+IKH$LyL@x8s=k2^X!|7`|y#e(2}`ti)> zeJIf0_wN(u{F&*muRs0x=lq=9ojja8{r}!~c6)=Z`p*Cy*z9~gocvr4`5*Uo`Z-?_ zP|nTQ+SAY9H{h^;fUlFI8CbzA|C;Y#{g1f1|MKVgi$4)r!A0fgaDN$>3tLFk+27T} z30trd{jogC{FpKe(wrN<=~!!X9X}^N=Ra3pj$i(c{{N|WA5*Va)iVYCS*Llw>O_p| z=kMhGw+oZ@YcTj`!+3sWGMf%@ZW13hwqJs=pA5t1kYn~-{ks_vrd-6F0omEve+J;4 zjmN<@TLA1LQM*4rBC}$`xK||GNdQ~>Q^)Z$64BrGP(PwYiIx486NdS^c>NJ!>mR@V zi63+O&SJr@X!!pYl<0=JEC|({{p|HJyUYG``WM!B_Nx1@>bvr1a{p(2iQ{5!W`Udk zxs&YATKx6btw}BZE6z-0VR&+$;ZY{C>rAOi@L(c(R>Lm6aDJjE+zMovuhDd)%G3gAnM59)o%VWKlb4`U^>ndn?UmCr1LiEjDQtZpYU zQEk<|QOy`8x{$oR_Cz=nO&_QYGd{&cujJj;LxP!TG|uDEF{$?vHDCB3yl?=O|}VSAs=^IWS12SxlLTl*HB=gdyCkn z-b%7iLY3Hu4L2}6PGS0<;$;k1FEekBjKc73Gm(;gXD~drijj8!a8bDqXGu7Q2i{9t zO$x;DZ_CU(+w3s>QTAH0h$V*mnyMu`H)8n3Fsn;_br^1JmT+Y2Qw;BE>8`4Hj^TB- z<=vl}Fg(+1#jC;>7``cTYuPuD8#TU2oOy}iLN{)NUv0(kk_Y_fPR3*S!lE8pOFD)> zXx&}YbQQyw6h0R#$;9xtBc+dr{V{x8j-kB57{kqtI<9X}#qdIb>;}O8|jDha;DS_?7!EbjaE*fiAV_gq!?U>5RKs4C#)W}%7O8+r?R znW)lDB_wSg3k|)Mzj&xq@4q)Vb4S|v;w28&>y#V?k`F7Wg_dl=?0b12M>(|Pkn;^SkLO> zkqCkHtXj3q_c#-&Dk)b!hW-dcdp&>iVIqIC%lo-uo!i&!m{D|LqS&D?)V<(;vg^5U zFpP7G{}AgF*l+Nx6gqf;iJsc>_LnbWA+^1`(_ejKA;r&|!zf2F+#wgM@+-#h1Y3vb zoedZs^7TvL5?F_<)r+@0fqv!+pO!U)am4GKkM})*zV3eEJF$y}vR+6hzn8%9r5#^8 zM9yNkUa0yqt!fNE6#BK$8rDy3m_z*?thd+*m%u)MCVDoK+V>@ui4wi^9A>^S(H$PS z#a?$<$fawa*<!|;lWbap$a(?YwQ zMf!PN<780NCaHUvbc%;j`^6SkQzN?1$ z^eyb8Rl9YJ)7P^Qr?sa>63hb^-jqkuT74Z;)Q}iiH$L8&kS>V|e{e z*3SKKuFUIQ`hJGkC*6xx%VFN1KeUZxLOd)~-L!~N2FSl##(hL_867ly$3 zZ>F2L#0L6uokQ>9lRucKIH5JM1oq>;>WAUe5N}Jo-U|gKb|HwgTP zhLe2@=7By(GK$BLIfS@A)EODEhR{%kxw$#mQ8`Lv76X!v#3W9Ee5;bCY$@=efbQmM zuwQbZJajjVQ`5^S>j&{gjWxS`A@2C$3KB2a{jOV}WCmz2qZ)G@FjP#4vlrrIg&x&C z23%HPXGT2u_lp~5nL)g9;pVTmARh(K+iN-jEuW?}uK;_G>eb7VKtI4pA~}O!PcCV- zH^}d&SC5PWk6vDV#+GduJ(6arm;esi#gM8%pJ42$qyoIZL1x27K;69;In=?v-z_@U z4zT0MK;b*Et5x^43V=MQ)NPuMz_Uedx;_HN$x}~;0ggz>r%8jqUiazfD)7r%z2vSc z;5XKy-=hGvZn2n+fKwaIA8!CGZ_(=agnXS$omzdtPuxcGJvYSp%yVM&4d`{v#$LVx zbibXSybtiMcU_?+V8@-R%G#zT8&B!Hhe zG4Hk~*w_8m=d25SnM_X8OF$nVejW#qZ#-J|@C9%W?^wHwu&y@N5%1ckhL9U+RXP*o zt+&>{WrO$;!)}&Z5Vt|A+j0{8l8>2crGPxV@(`*8e(h+g<1(;s99?whJIGrLeRn1U z|9Hf*vjfm8eXI=!++MoEK^^Q<(?g8j1D~E!EmQ++usFGRKCI7VEe>M9bS<4j|w&12QHPGbIl#bXLIM+H412} zx`!?d`ga`XY$%}bSxuAP1$eGn&5hUxO*YSS1p$i!X{RayxjN<*^nhQ5pY$-{XDg$3 zv;gd1bSyct1#o|3qZ`rJ5nj#4hXDsHGVnWqwRWbCW?(NQ(LGM&DSn9jlppYz3~zcf z)U~HVM!Xa3K1Nh-*8)5&252r z`#xVaR|4L9_3+ef;4{&-n~42~ZBx8(3F4(lNyT;p?@4@jk2nwBW{V5U0A5IRzD4ZE zhdhoMD*z3r`3E-wR*AcpKLC5X;>=D_;HMv5E1V+g9((xU36SS~yyr~^v`{J+p#dH$ zlfK*uxbyvvQ$$~cu4?nt1V7ehG57btkB~m@a086>%daQKJ!Epf=OFOs3+i7H^-NlO z-ISEASAw14VTz47V5CNe z3bF6@SDbs!30z71XrDfCHQ%JCtAHQ5Oy{TpEH6s6{Q>Bm*>;K8FL&1EhmyfAMeD)N zF^I3r+8;IqJdwTm%5tz1+3`5Z2XIaK{ojascW%Z{C;G)LdMSkq z?0gefd0z*7Gw_DF9^_gDh4Dnc1n+ZjSqB`otxhM99;hi)21uJ9@1+F#>5m-DY=|qh z$@{h-%Y+u=x08ybES6Rhs-Cq3xV6# z7=9)CfCG;aSOQ${DIP+Dd8&1NP#pl&tLSo91i5<9szWEi&Ng?{m&pJ8$?C9tz?a`> zq^E%5Q`Z{z06Le|uOsF&?k!~z2R!_B0L2*Q%s$@*wuYq~8b^eeg#%*{dtw)S^QGuk(4))#dvN`&oU-t5X z%2JS5CYUjez+Xl|MSdCR`z<-S4*=Tk{QV9;pl+u9qgc>$7YIyRLA*>(#VzmPzBCM} z>Ae8@4de4XltF)Gz11yMI9~)+1bbz_!M%I!DlP-#IDEE;|27;(6ZdzW`wU1MPjMFq zKeN|U=Vbtos#)dj1gsU<=W!GCM|4Kx+JR@=dtYvcI5M)yzuCZjpG(@%nF`|zRFYkE zA?`Ch{>S-{KmQ4>eHVa#pRQBt0Q?czzTpwX(Y@s&x)|OoD{7~@EJ3auWo(`Y{(a|p zIS&KBd`nt?75FzBiNvo2?x9qDe;w#!u6qs==SI!aj~>K*H4$!6?87;X=8GK&R{(kP zx_PfO08Iq%Nlt*iD?uxZ9XKWB>LEVh+u~}MJq6qxEOwNb?+BONH(RL7$oyWVhrlOX zqcU1xe$keT>au`q;|)PafJ@zGS8D;j|KkaroSn?^Rhqj+O@%fuNsERP7=9&u(lx+74Lb zGWKN<@QI#G2REQet9&4_&IexUT`vPa+M|eqEWo4^O*RFHJG@(MJr($xLoY8T0wycQ zihcrnn{V7o#JPU9d*L*3&hnr3ERF}HUvnNN?z^*##!PAff0TxNCCw%ztbf2w=A z$P@RRz?1j&OCTO!+UMd(h!b29DNLLXaVfzqL4Z3H>lTrr&Slm^_Hy8NPor4p3Gi(} zCBMf)ec$wz$lC)Rxsfs72lOS=$(c_ej?;M7Vj>UC>ew-TKo{*+ulaz@={KJf_XLN8 z7ZhbmBZxU$VqL12E-!not0sNY8=B zWSEE7V4|EX*abBC1f+w!&tKwO4DgM&LZzv|7p4g-5a;Nb#lb5#0-wJ-Uy_KoBv9xT z@m^`$$#Yy4@Lsija16*-SMh!#);B2w-KYV+HlN-n0C?b5z_v+1wa5AlU(hphY_CcI zmP|e$B<{&t?c@^TU8C=Qm7lnmZrnIoM5%)R!>c?XuP?wl9J+5Csf6#qM`ZZwnn2-r^zex0SClKqpr!4ao(HC-T&ps3P zJ;S8Mum|L4l(S>10gHY_DiZtP^^I{?N#K(@T^roM{_9NEFmZ1WSp*mF1-U{0vQrHp z4{xKG{>+C{Uo-&x%JkovzW~%8;9S@Yc9j!84#c_z@4Q?>>@$O4nnxbs$G1ZU2LMz3 zJwrc3+}0Jz!Naf~j{VN3Nr1xf@!N^}k-9O-#UA*UF|#|wJ0W1p<5c4Ovf^m8C+6cb z>GqU(m)ILV=l217wJ|svuAI-teBd2j%wa>No+udE@++nChrv8QwT~WH2KmlYZPG6S`Cy8nX9~#8b+{ynzgPD%YleyaBj)z} z1u_5KT`uQ0ft*8{lDU^eLc8`u=!+0@~5(;Yf zTb9QjNkJdm9r65^bX0(qoENx4M-o;dMaOYEGK{t0n=eU6+LjS23XAC|VPZ?-MiDw1 z(AR%F)=5LnrfRp<{b|Ukz<6`&8XD5hb4=J9$3Pus&96=X*6|KRX@@e9p^uejX*>fR zUtFBsa*lz+^~!8prNU5*O(aEWIX+6qL1&w}0JdGE(TN z%kkJkMn|LkOZxjss9!6MtLqa9oes!%dN4{t(wD?@6c>}x1Xoh*f<6*5_9eR}LZ6th zscl}qf{daj??%-uAfwj;g+ia8Zm}y+yt5A%i588WUN;B$Ln` zua5hAFpi<32FC=QgeHZXvXr5JL^ajx8$u~a>E>SU{%9&nD7Ur#EtiHYU$!Nru`^KD zWxKfHUj$0@gxQktykE(Gm?RZEal~8Ax~%hra%ibGSY}!I~}=- zg8UVg>!-R0&~$FzMow88dXlqVWgUZ#f|djybx&m=)xLFMw{00n!ytL$>_P_OxE$x- z3-i8+>Z0Zwkdb?pFWFs(f~Gf});eoNMOWW6(F{p6#7N~9y6VF~GcrQH(&h}rD~pZn zJ3vP!=Myi;J)@zUr?@kAL!HV+GS=PrPC}y36dW@;A)feX#Ro$wlDCU5tg)h_qOl`~ zGNBHt@8WgZ_S4~AXfM!|Fo2qAw z7*e4km%T0Z%ggAfQK~U~hcyG`<+wasH#~?6rFHIEBn+V1XVM0&ObSwHG<_2Y`!{OW zi@X3>f2MG$Q%DLKJt^`{IDeChXqxxOXzLm1=-S`63zgE*i#2Tuj}BAOtroA6Z6Xw; z|6Pc2?I0QPTd(r)qmhsTe_h6Nz=P*Fw%CYLP?6T{#|o)~NWWy8+o_YVk6s6(s<$+B zzo~rKM*;dfp;7R(B^d>mSJ!uskkHBR2`xiCBvfsJ$!H3YQT5FChPQDPw8cRAp!qr) zoKqh*DZ@TYt{QorznzBEM?)1}-=Lsq{*mxVF*3?MKkh3A^LX8s9})#PX}~rl2mQ>aMJJzskWtr=*sIc!n|1`ZaosZot0x z^-*uSwup?@C8uQ148y+o_C=dCMnbo5m}TCtC!@gM__GuX1`vh>xhOQ)zXukLIj2EC zj+b9JyNiKFQmQIlL!kcm>N?Neq#%(h(xTKA6tv5!g6EPJoSVr7v7%6~p3;S;l3&S) zE%4aRI2kHBo_tB$$&`j3nO%1sJ5NUw6W^dB0Qz8TD*cxNSrsA^IMvN@Gq65>osox^XQPO{*xhaF7R)$^O2>)3EQJT)5`+ zJcWT04^h@dA7db;uX}RYLg~m?L(uEd5EUJ3Pc@Wfl9Bea?VZX{$J0eyT_28iM7q#W1gGlhe zuF`pj8K_JzHR#hRsKa2_>9Y+3h{xV*{uv!IQaY(F90Kcc(%m@su_+l1I6Hj4#zjVF z^KTWmC6bX1=QRti@B#F~{JQ{En2rvYs4cn@1m`}F@Azc&Aj)<%X-{7c{quu)k9UZK z7Tc7&jl+5b7v62rf%|crX;6-!C>d=y{^N{y1O;h_@AXe!OG7RbrJ4=UhpsbqDy2JU c$lf6^iBw2IZ(r9AjKlr6W2FF1C?(<4gdfE diff --git a/previews/PR1624/tutorials/out/solution_000150.vtu b/previews/PR1624/tutorials/out/solution_000150.vtu index 9cf3ee47e6801df818d1a15861fb4804beed6f31..aeae276bd45a5a9961717b73b83f9013cf6e1553 100644 GIT binary patch delta 12224 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 O_x}OwLG;j*ze*h|Er06( delta 12305 zcmZ{qMOd5xv!w$B2p%lB1cFQBE+Ig0cY*{67Tlc=x8UyXF2UWM#vK|6ZjDIO5(MQ!oMiP%z(@HpYKhbp1 z$I0S^2cg5B7hzVwo$!5SIH0VA;SQE>ljM}VvqH=?C_xt?i0nJA*x$AK zwRjN{XS_nc8SVmL;(=;W>%dJVEi$sICrFiRs_xIaQ_3ALWwyG3WP>LghEZWFs_QB2 z=K7ehwAH@#);)AvaHSkf&aYPt)uj%z0dF|Rb#>)7aA%0q&DQ5pqE2cn@ny|6qQItb z{$W#@6qmkEJxlzO4Un;rCL4_IlDPIj8Eort98(R(lLIVrgjq7a*GGT>hQR{!u37&Yw#Gpo5IIYlToW(5^7a8HaY>%ci3+c&g1AT5=iZ; z=aKZEckGjGL^|-|=*CX9Rine6f3;NpV5QQ6)(CO9kziww>I|21NdyQt1aWX;Gbm!H zj*NVh&=5Iey4RN|7mT)Z8W$VjZgxBTQrR-MasyyIL$xb>)J7E~I$$~iL%m_rvLmz_ z+|(QfO&Z{$PjS)y6;|ctA5lC;JwO_v(%*H(izE@Kvg6=JpTOAs){xh&_sDV2kHXxj zAZ+#%y^G&J(5UXG(l3kpeW8P7#gZ56L+2MJuGCa(E*{a>qLKs3eoMO8i}T6EOf#Mm zB0za@Jq_iicF;Yh(+Jdl3@QWnYX}FGJEL(x`}PJcC&F#U4PrspGCw&wO-l{Rbi)+Qp2|c`9p+@7eC<_ zQs@7?QMt9|T6YTLo#A*FXLM9L|MPIo4)BdS4vY@_fc|onCK@X3oaLdrt0A%YNxqV- zG4%QzLSnfWBW-T;H^TTMl}Lk1nxT>1>|vMkAYxp@iNw_XH^Z7GK6{>0DvsWuPmeNR zMTv_r{=5aW5t3TFv-fUY8QCRMoI=+pobHk&c75b^LQv7-6dv-0xl>L%#Wg zf3&=ww5K7a!*Fmy1*W@-w@HqNCDF65%gu0e!N>c)b~6=2l8Br;bstwhK4781%9y-J zjr5ACO2adD2b_)4d)?Cy5jN)tVkF8`(RDKVg-E3_CcZw`Q!}Q&nU^USc3R4t7J)?0 zyz|O1jm&qS@wClw2_MH080C5Jb$DJPlMzDK*Sh%QOmI=jq279WNYMsKsq!Hs=l1=v zi-elmPZTOF{!d`dBkEb+pFno@yO)@R2vY|H(1}YkjRbtP4ce_!qd!*L_iq>zoDw{L zTco=}VKx_GJ60_D+CMY`p6$4>_d9V{vohSAjBD74#|r6iS8-s zB5U{^bouMqBKo<3M<6qO`bGFixmyWRQqvNf?JV`_Gx%i1$d45fU#JcmbM) zJxw?0`z?x;V`3VrdceA9G%ABTEYf0y2g#q6v|jNOQ>fQXcd4%?0ov`hj^J<8=&-vh zD<(!btXrn^gANmhWFel1V7M1>G(b8H$43{R9{N1EO`6{^)_wMI=E^dK7@llx;hH@M z>&AF~E4za4@avE4i0c!f!{+#I@He_Gx8P~

ryG=))ppKj6(9N1M=t?xVMy%aMAI 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 KcS~zik^cb>d#X?X diff --git a/previews/PR1624/tutorials/out/solution_000160.h5 b/previews/PR1624/tutorials/out/solution_000160.h5 index 999089de3621c868579f5458ad21e4f3a78f1b69..39bdb861d50f9538072832d5d914d23f14ba7b02 100644 GIT binary patch literal 11976 zcmeHrX&{yB*Y|CfWT=!O85)$Kfd(P#MkLZmI#H&`oH0rvQivoVhSV((|¯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 V^O!D>EZnWmfQ46gHZpMz{x^;FG4lWb diff --git a/previews/PR1624/tutorials/out/solution_000160.vtu b/previews/PR1624/tutorials/out/solution_000160.vtu index 69c8d73079c61c5b89b2ee6f4288eb88b59bbab4..d8601e4cb9ede5c590dbabe73915d6030f1446bc 100644 GIT binary patch delta 12314 zcmZ{qRacw=vu2Y(aCevB4#C|*Ah^4`yW5-K5+u00ySqEVCAhmgG|)6X-^^L(%$kd- zn|l61?PssLPX4%){IRYW<`WNBA}TC%;sOjW3@<;&f3n#pPOe5**cChgK>6^0#ybmF z%SR}6f;bybN;kebK7NQLP={4TmYYUXld7O3Jl{l|K$>c_`xHZSG=M^lz5!yNhA5GAujyIjo zYF^jLWTxmV5`3WzO#LJFL2<=9N@tlibM9%GsU-#tTO9rg2Q!5#jDEgvD}tsDG4d=9^AQvNSq1@;!>rjx;ZxmK{bD{wkfLBTGpd(&pI-&EPh>WmFx8^h9n*k#T zp_+ss!#BPF%@>^_&dLir-ZCIu_}X=NkZr4r^E#zX?ApTZB6hJ5zT zpYc}S?TK6eI8n|gMZT6I7#wEdm0THmn@%@*4-0v`Z!0mYZCY~>qn#7fj1Z8d&PN-yNuPLv3I3f=_=u5 zbpoVYrDDADc57CD-Z-+)K)b8^XRkg|)vriZdG5Z70U`b3#_=D4l zUJqf$dw%Vu8=m`mI{1oi8u)~3 z(NYe|h}ZW`m)w|BVmR>kT<-T^D0FpJ>()QxBh)X)Rgx~a;2Ny$>rT_UN;9Nc(W zQi>Z)aM4tzQ?VZ-Ao{+#iS)>5&+Kh(Vhn!Nsp6B<+wWyr5=M1;JNf4!9hAa6fY1>|q$06Vf>a zU~DaC<4zvzH`>-^SK|{#0CJUxl8?&<$q{X$T^!Xt$Rpk={oXVj9d#ap)@l^*{adK3 zRpUY*HplKyqpVg1GK|Tkzi@IQ3gdB@=#ss0{Ifzxj_z>30jfx6H{tVJgW>MSciqR$m2gW3E~|G-r4XA{ajpfpVcTpUUabD0=! zW?M+`d)ogj3SJ5x=8h-{(O|FC^Rff}Zkfq8UlA_9$G=6l zr%du4YQW+9%lAjJ*6Ee>rYGx~7xSmv$P27D?ca}aQfW4J((KkE+m5X06)`ipK^dh*%_x-+) zM&TM2Y)!#bF^^X+4(2yi34kfs=pmgjsE<#~2HSi*AOufEOzXzLx1PhmP^jrvJc^y+lMTDfrz3feI} z?10Q=WU63rOhx;>zcM~sA?W7N?A@o6hkf@^368~NfcABa&T4e`sKOHMK%QouF$LRp z2pmY?7pDA}#0xgBk1ZWnnjk`+ouO-%+nd5D?XjHD>qdDp()MByPX5?>GTHaxZcGb+ zmaaJrRcmcIYm<3=Y1552&ton6l0(vaD+oUjPUmo?f4s9GaNN&g>a7^bhWx-m4%=>k znEOk_OLkt58*7FeI_oDaHHjZCsU=VajtSPnj*5|LMkzZ!h&sT4V=9Rv%Ap8^IHtNS z#B!|6v9U|zyTx|M0KF}r;A@yNCzk+A*St)=Ql;;(kj2@V`%kY7?bg)3A8yy#wSKUU zez;|NZ}T%wf{|`NKE5O6^B#jm?cB~Mi+X3!h_z&2oU_dgdJY{P%JvO;{@jwuLe>*= zEc{|$b0CYB!?PHjX-3Y-rEbtf?t)$W)^vfewNPc9dZd-cG;N=Zxg;Gx`{EDel!to| zq?a~`P0Eo^7*>X`!)fI*M9NsQvq#%0TuHuRap@L~+z2h*?ESJteJz--N}i8cFG0eu zN3Blll<=Vp2M%NB*QG5BL?12vyYnO74K90wLD(LQro;Dcs?_R>L$wZSc<^7fgsB%{ z`6H46JI(m8m*#~$Z~j-XSP!7lOmH@;I#P0=%k--0XzR_918ocKRhFdAM|4fG!ZS9M z$x++f4e@_H}#^=Kav zs@BNgl}lLS#FPl^TI;rE?_A#|U}^GVlx~C|zKj_0bNp44!_M`qU`l-T2p zr?Hx!G*I9L`v?Sx8^R2OZpzGLv}U;(sQG$2|dfFH06@!sk0*miOu54+%7Ni%`3=Fo^4RDb9Lp6 z?w{pC-&MR)ERJ4c9a^%D(VrHn44EcILi{;f_;u~~ zAO!BQm))i+EH~RMS>WTVZgAUH%7=^Syv{N!*1OmGpZc^o&J@)pGE#K(7J7`!G9hIB*fQ%F#BM&D_EzU*&zjP#*Q4wiJVT^7b$ zN&hzc-MYuu>ITFX3*GI@mi!4Id=*yeV0wGCL~Gy~`zw=ebpwDltPDT?S3UXg6ZOBs zfA4do|LH9$K0@cNu;W1S_=}Al&7Pr=v)7$ zS8hZ`U`ePyc_dNQu5G^okB~_r&U^j)Nug$Z{`5I!+TiAv$+AedgnWk%lk08$#NSZ$ z%0wOsJPUFRGgtYqo^SbMW}iEjJZsL(bIs-9Ew1)qyzrH#Ch8QvKHy<%2aBftJ~>WN zBTr5Hy=Hjy3uEXIb6yGO*QQ`E3*+#t8&hwKFM9V_n%@c2ir(!dU~7O1eIN)uP0kzb zYV%rFqBXOVpV&bfleJ*^^Oh%dG{cB}LJr>g5f!{WF}wdpGV3J5RSUszpm=7+CPa`1W_E5 zOA$wlV)~mF6fiTW@qL|=9BRuW4)Qm#zxC!h5Dq2QV-a^kY#!k_X|Fk1a{8>KtH6*b zssw4eH5>!D2R1Hq#a6rFu~JQhGetF0^~0+ib=KX6+OXXLfW0*Zxekf$o^~9{r4po=JiMi(` z8tp(J4qm5L44ws%jAO_sb!%_q)60tlDcfOmnBpruHamrzkr}3S&PArIKQkj_k7zF< z`^WA{KYtkV;gQ8$AeF3+&upg5j6k&NJFfY2;0L$qcUqI6=iL33;6RBMEZ1JymoMCO zn$;)(&)J%Ap+9QZ_4ezhE`A?T6GWGZ`M*DRdzLdsU(p#oXL~Ub=pA03 z!FD4vDc2GCtLLS%!{m^wOoQRVNb1gI;Y8hgNO@tXF3eGpPspM(mUO5BSBg~yeSu{- z0~UtZI}3&7O|~ zj^tzFR}zF>J8`|e54MAB6wS^?)ORi=Lnq@RV^7-&rcuspdy^?AfzO}6LdX>JuCg-Y ztK>tBGMA9Xy}ao^LsiSayhhC99j zBE1+L(qOIKoD!FDm3AJ1(pD=++|4|2CIdH=^uC=JA|FL+{;SbXp^~C@T*(gyM(4Dwo9bUGIx>^KSFmd`X;0&9W5|KL z%{FhU_qD+Xi>?m*j6TT*8pqDQ7+gVsT-}uHJd2Oh=w>87;~wtWr)ZsZxvwJ$P474> zh_o|MHs;e|OvR5joM#)K1{>-NcSa^=AF*jdVBfaRK^CNjG16=3)cNgELErf8C9osc z@N`#Z2;Dc6RQt3iRq@^&gf&B{vEPlHJdu*9HLXe2=P0= zuen^%DrSaM@(!{}F}73xKUV=?{T+c6Gi9nhkV__!&EPh>L3SmvFVFNwQENP;k@!`h zEcV&S@>_7L4w=)Eat{j}!D?Sko*IP%(~8FS=@D$lQmBsG&v(iC%SsHdw0&4Q7?iiQ zbh=NX3cV07E{>Wj*0n~IyOjkXW1!SHp?U_w%HE@R$>v)c)?IVjv}No9Qi$2f3%*77 ztVqN~u- z=56wP3t3Rt+>X#A+p+s8g~CmN+5;=R^6Tbd8`(4H;_03B0}$OFuc-&zNND`9pgiGY zEX@}?=5v{%BW!qy8yPZm&I46kYMl5TPq!!i%u!+dY$V2p+{jQ7-d?({gJ}GCTaugv z@4>6EW*soqZ|lfir#G#UBj*F{lD533tdkL3(IYqju|64owtYs_a_`?_yXo`))P0|? zR_q=-PHCs9DuU#Aiz@@b^x`zMs{mWsCTY4KI&~D!)z3Jmq#G(ugqOSB6Y-_C=trcU z=G$|cBQ{#de2r4mzp0GAZ`ED{O4VD_~GRF7Ke{Yqv6sH1^#67dsjH;Lu9u2oJHk6HfO*K9+r%O9C8+TBGT<_An5Gb}Vn$Xft6sWqaQ?AS zPz>fh1t>jO?p=exbtkT$OPRLy-!?AQ&_v{lv^@`edWdm!x05!)=-e2_MsS>->HZF- zWYG*d@{79e!$E)-#Yu_l&I9s0bq|=|ys6e8D-_#j>+GfxE}ayq^k-hK?J%Yf(<%N3 ziX8b+7yGv;HyX}!(3>QJ~{S%XjGIhAm zpZEOpzrQu6Ft6`lJxulajHoCDOIXJ!OHaB!Ku|YhUC*uoCI;liV6V+uIO;iIl3qL) z_3ogmw_5Z7E~m;$?E(GXeGe2AxZ&v!mAsjj>3P$cZMgkGkM8ZiN3%@-Sk7$=7N&#( z`GgMb@b^CQ2Dy9@fj%==cLO|sjg$i6Hn;g7!>MrC+`6~TnfNa6=43IRrczL4)wO6g zb)BdO1N*pl=YSR92RFGAf18@@aNL=+9KMzmPPf`W#Qfl!{Y0TVJ`CU8zLX*H3Q+79 zkwws?taJwGXXt$9)2OL`c^+HLd*&&C4zisN5*k47nh_JdD(#6rGwf9h6zrCab?Y9k z$?FNYhh#q(wYl>qo?+^Zn1Aga^^6fN4DZKtYjnz2@4a69KCHIU!_UMt_FY<%c8{Y5 zn;rk#@lLuwvm|lT!^}LN!ZH3NNr~^vv}|hqrz8?SkF8JdtXCi7${dAlHijgDYe$Yc z=W3F-g0F?IC*-!+`g~O|orQYBtlQtVP;n6cdhO{`hrSDlNJ1_m11MhLQKtCkdX*R% zUj+|Wp=WK_cK<&>2LBHrlm2f&*2NyZoD2Iqg+&=sCX;_6zS#VbXH6vsP$q=nQQIL{ z(5dR$Bep81xL!BoXr;)?P_MEYAUb&4UpsB}_T;8>S{+UDyB%d|9o}jft&R}-? z^NkV`vB?R;P_|~FDS-3|%*wzF&kw&$eh>%j_eBXBYNX$r{qA5ws+JbxHP~KLsWTE~ z6~fz(Yt;p`M&BHW689zmz7fJ6s*-#4QaL7$uz#!#t|`WapeYK&Kag{boMJZwdPo4tW0E z@+)?tm3N#fr}Qst`Aj^BPkM?-JjL*J>Vb9zS6jUa?-db34fP&6ZOKMqPbV{TwtPxD z4gM~2nOcc4GyO$S1^?WS088uQxA)~fu3u+=K(DO*lgYbNbmLxQKkkccrvL8pnR`Ez z+Sqpz4!p)48UJg*8Rud>i5h9EVT8b6dK20sz&&!(W?qv0iw}-6HTea@$nEz-a@R!8k33j8aY=uM4n}GC!TH3c18vA+`>8`_xBLOVRiQ=^p;qcsU zn{B3qo#kBvoe;tkZx;!71Q$_s>E05^f$juRKolRpg)|fJZ%33_S}PqHMTftK=A-Xc zB5qdiV6MMhH8%OQcxOuDpE$ncg5Ga6{nIJJZc~aEa#j20532Fty>SYv=YMIn+-Al- z#vGmI@YbpCre8lkiTjd~B; zw$yILOD=&m$_GW`C@1ktk zf>B&2rN+V1^|e(iL5eOXsT{*STS43Z&cFM5QN|j0*1CN-2>Yjqn`#1Vl*$dkp;WYp zwtfHtMGtB%f^UnhxYn2`1d9T1Gd>kNIb~dpba3-|sIE}(I{c`w`j)j~K$oe|KjeJQ zBT%b_+HQkJ0AM?xiy_nZ?8_U9uCU;#N`h8EjXGX*ZMA%U)g1IQBPy>%=T*mnI6SDL zW*%|&<|a;+D-IH%(aO`UGlG@$hwv!yPk2C+ph?$6G@C@Jfmu0M$VPXqIbJK$LB=cJ zxAVQ88f(MGY|JzIYVM&=44?1JhOHT1-*BqSP!{weX=Fib&Vf2bq-$jWVI_xqDA?!L z;tf*7SDZkXgt}IHIHFh66)$+Bk+e>^+kZf2^VPfhygD<5N)$XosY(RmxHf1m+yaO$ z8XwEV(I2_h!t*!Dj4x+BufMOnWMn-S+*hZX=sn{45LajJDTnxf6Aq%oYLe9yQabK5 z%xGT05CW{O)(|cf)klOx;6#BszbIk&Q1!JUf`~$)g+-fBXR#sa5cq&J%YwJSn{`P` z6Ye9ql1D`n*wPr7Dw;mN5p&Ximq2-&v}SmDU{8}wgsSj(rTQHIwQKhLwpf57w{qf> z0obcGolv>rMmLIa@50XCxC%uCuu=YY`*tbv)&ScnZ5C1qV(ZSryZtMq2z7j*~EZD*WSGviY7w&5$44LHWVDxAAc z+L5L(w#x?`+ZiXao}6+gn0$nyyOLI=^u2$X$!69ql~0l1{?5KKy$$7Cv4R}G$PBgf z;*}RlKzz0RD-d0BZqB({#A1y-*8dJn^XKzEA$jL4w=fVrVDr8A00=IVDc(rPvjSR+ zy0_xFn3rw*=r{_{l%YQFwlPgMHD#F!`E>ZVZvEyG?0rR#f!`cABPW}tXL|435;zND z)hpH|sC+lxpm2uSibW5G%LN8>!C3jp>xo?g5_ryaFM+n7UD-dPEBhr?1uxA^Qe9KG zk9jMOFA!&p;s?Dd0aA~A5JR_8=Bt6a<&fD~F2Ci5>_Fb(*rP*q-pu<;*5;?Xpr2ns zUwuV|O}~X%cPn(Mse2_rJA{j0dFFb!#2z7%uToh5hLcxv`xmvmOC=?W`XR2FSWSJ% zRx4fD>`Ir81w{x4EccUrtq)gEMOU<z%zcc5d27UGGXP;}3 zUfX!cMM2_S$km(_-7@7X?dLPoZBFnM?5#^^8?)MTj;YgS{tWudUPmon=4v!?z^+R6|7ot zm1)yfV9V9R8#|R-+IF~C+uJy{abQ~-pO?IX^9al0bvr%4iTDHtUN;!7ocv|vF}L6y zGaGQkl=ML*@pBnW*xG*mXTfF-igyz9PjN<}pk*O^UD4jZ1vpylYSOo7Fv?PnJ!$W3LV+G%o367UVH_Ur+ru6@ zf8r}&FP)ynw^Vv#Q}1Ne1m79r-gT@FQGqg6A5>l0FL_=T;D-v>3xu_`#-MjetuU+8 zt~Stt9^yRYg{zbqU9?d(VZ;4;lqsS0uy49kr9A0f>!^B5!+1=NLfp~2Nn3m2Nqo=nuT8dmM+owa zl>wAv9n=+yAScP zBwE7IgyUIuQOL3PO?f{lamms!WET*EvH3_R5ttp`jmspFHn7pI@*4qundWm04<1!{S~s0- z;ckYI-~t#4_1D&#d@zLTs*Uhy$e~Du1G`nKCaDR=bK-6#YP6bnJ zQy1>fiV74^(B*2a`vwo-jg?b2113kK z`?(4mahqFEG<#V&c{!~pvUPXaEc$j<;`pjhiBQOhd;<;GruvLrX@~27{I+deR-}rJ ztmjs;@ICkDV7|{y?#6G3!04*KT>D$FR?XaH$%tI6`iNo}8=8BO_ZyX;4!TClWBLgh z75`tbt^o7Mi?-(2q$yDUp!@8tCW%K@_$~Ewp*F0r_X}UO>Zf(jV6q7xEIz5fu|M7h zC|mr^q+M{})9C`;k9E;PwGtT3v-!B5JXUGIZU{H4^{4J!@Y46HrFrKhw5c1N0e6_; zV-?ZJe>3@;%3PaXInksS%(V!uT5AV8af&xBv-kf~lvP?SPq^Y}cSkH#5A3x; znqHR7ag*l1;PD6cE9N3r@?ptZxAo_BNr$OKuO2Ug0)*ssg~^hKZe~d!T4Nb*2i?Ir zn+}me0$L0wT9ifUX|JbO_zh?Hg zjn?fWyY~R#77u~{O|5(yx*_+v#d&Dl zBot0KUiyB^W;|D_%6fl55UttY*J=Z;Ls+hAjLn+feE`PP#O?lSFEZdkgq<+qiy8n(ti(;$8b1M3nj4OuX1e`sc!+w=s7jfzOIpOiT06-ZjF| z*AJ+Lw!GEng7iYGWM5f8=%LrC9*s)^f3`1E^k%Ij_alwt3PiI(YK{th2Zi_A3;J$Fq#P`+%NnGe)_9k4WPe94ApJ$IWZG0}D!gp2cnL=zu$3 zd2HbmKW1+YL%V?HQs^isC3mD|TnH;0>Pu7?D!r}rsvCtBs-z<&+A!{KUZc4<1Wf10 zo9CAsFa3B9xX;q)EFiG(5?Z_bL^#>obSCK>3>#Zg^X6-TCWus8yO?^sy9BYVK7d8v zoqBc91KraHT7SCdv-Sx394H!S2N3G<#1^y57U(t1`<}s z%1i-{!Bn$)%NEp6aTCu0f$NzOjZRy6+Q{Eg>EHJADOgIx|!`;76R@alA^;Fx~Z znb(NW&a8dwr7rk5ik9_0%O||WkNRH{TPOAFwlM!(E{iQ4(Z4MddHX~+$J1WX@ypNm; zQBSVr&B|3(Gutyv^sf2w#Rei4{W}@CU0c!!h_i!^N4|7+V{KbS^1)ruBXRQcUBE75 zXfcncsdo}_HiHp$e<3k9V75l*7E#7|-Pslvj(qLhntG#Zdhizo$F*%=fMCJ3|F&q`h!O$E^)^>L;rI?H0*Ak}4;xGO7D0`-4(LjK9n#g>F^CK_U zW5M;61C1>SxOjI>3x9k1qq$Y27;ID&@P>faUthJpL*ucp$@#L|=%W`ZXwTvg&yG#KVl>Lnp9njy>9V zovaVz(*gpV@>!#YElU0IP$TE&@z`DFsEN?#{q%Yg{pX$9few_pnWH@Zi8nMgYvmrk zWlar~VB=n44rFQoVM4!S%7!w0f^FlxFp`Z^&}=&Pk;ab(>NbMrfM&!NTFb7Pyc49a zGCNPs<s7t~NR#|<}$P1J9WFQw{Re1dg?NTFh(94$(M_4Ex zh?`{C!%r#Y1nZY6o=Dv5558!IeN~5la)L4 zrsUZn=@J8&i&L2sgSdGh`L^1v4;Qg*%eLAA8Uwezj;K@J-;Y+V?M`#Q-6;ia(H{z$ z9^};6X%Jf)A9)m>qpnIfEc159Q{FF##Jie2Ss}vRrF1r3n^CCzp4Kg(3R9dK@^g|2 ztPtU5JYM>O^aPd)!jcW)3$BSB4Cz#0LTf}yAG!vP3{yq2OHEE2zYZikB)&>XHOEaV z^fL24aqY%y4Ba`;kf13MpXTaNGN(mr6duA6kPvn}XNi0ni91TmAV;>jnZMg7)I$37 z+4I3M0cHj)%!Ht2}%^llnjzq_~cJ??K_#gA;B@qVhTEp<68c)PEV z5V~?(96r(oIkrfrJz*+1$QW71W)UgpaE4^}lUwuEa0t~@OYv&RI@R9Rcf$BCOz%0* zkqi;MWj)8z^jEpM8Kb{A`=?%RS2vw?T+*uDwj}%@g00q& zlnz3&)#C7uF`hny6}v2pxmnGlr>f7Nesi;2^ZW83aPso#O?gv^GLOG!&b@%(4?{iB zK}QJZI{n&TdtIj;@8Y=%yv@5;UW2GTJQ+@so+@sgOEkkP655Ar?8YNshsBI-yXCi( zfA@t2o?Ems*pqb;Ez9v;l<_(4>oy!qzy8&CqVY(f1JNOC6M?Z;r*u(K6h*t1lz~*K z#m)FfO*J2R41pSTN)PojiJq4Punxd+S!(^jikBp2Hv97+wN}A3On`cs*A6b4YlDF~ zC29r|2d`#Hlcn^TkL=>s5lZ+^`X2d=DS7xMOqV2<#TWx!n zzpYFeqp1?&WeQ~DPBc$)Pt8A^6UH|$B;U+9WqpAQ1fn^IfIvM2bj6P3QU{OC@A=m> z-k#H@f^LxwRbA8nZ8Lb=GT73)F<#CIWg^dXi;?B+%j^-BT-%Q+1M398o NG}Yz4+t^!({4WIztStZl delta 12271 zcmVzUS0kEY50yi*|4FoKc(*rjHI504i4FqEXG&r+z1lSgTg$w`y00000 zc$^hic|4WNAD)CrNhez&97$AExQbgdLPXh$knChBk|mXdWG#{PB5sK~i3;~{E8@yh z2PsP%ZI-em(RE4Y{e6Fb&1c?o=AG|6^E}V@d8cJ-Bi0sE%zL=?LgO8Z6SLp9`QM|s zM|FAed>O?~eR+bpB@~x`Cu?ok!J)WB^rrcWn-pJY7!DkObxGH6N@ZQA*m&Ve<(8`y zE3{Y-od1*JpKal!JHVKbHg?{B3q~r;oIo(@kDA#G zdNBA{S&+HA8H1Z!v(|3WV(>`)1wlgv21`ZVvaJz=->>h~5ffmryXv5f_8gq|Z?lWs z35o?r0wRn1DIVH3FZ1IC#dV^;G-hikt}w)+CkiPZx7_e_*BV6DwO9 zXurkai+0YtqvII-Eqjc+W*>uJDV*7ydjgTi13EhUoDdnZX)Oc`kp}{bncW$Pc$#0Cv$%*zKmYnZ$z(*X%{rv?q#?qoY&Q9 z&2-0AMDEE={`2l&=b1L8P!kM%OYC5syO_obm=lev^8% z%BBjD;ygWni=qld+HTA%R>55KlI9w|M~DpRIaKsEA`+fjb-(l}BDv+KcrI;-jF?u9 z+qOg96^eUmV4fDu4*SSMM6Eu4>IwYs(ahN1;3t6l7xC}Z;iou?+p-C(SCI8xIG>l~ckEwKh1?uebr z4+k7?^LrQp^{(}EEH4j(6oTvE52aalUFU1YhhcidO zH#S|!#n+R;AG*xWD~D0M*Rp=qRzHe8Pk-^U0ln^V2hOtqimgVmW_qi(3 z@>TV1M5em3rJex~Uzti=jDvHjx~cVLxl=5mQ=+GK4t!)$^fRqyif?~sk(hN1{-7z~ zcrcH_)!ZSIE)hg9b*=r~1d(Iy^YwKRz>B-OR~qQ(h(t+om(sH|-fzPjhuaA8a z1^jm8^1rt9q$8$C>Ns#8KRS zxzqB*8;Ya7lDNJ58T|fvTH1<#&kUCPu+QFc2O=?s>*|6cL0_Zum16f0+2qDt6$U+h zSJHJD0R7$d_dFF0=Q+cT|4Zo-#igDTZdLI9iMb-_@G}$}v`hFM>7w{$!BmCTK?Yl= zg=hNxVz3=YUWEa_GrKADyAb%&^N4x_SEzgH_jmDjc*a#rK+R{3m1!uHgT zc7ng!i);2TfqiCwlqMR$Grv+Cx~+4WH0bo?AF(%&fPPit{Aybue>9}^zfuC;@XsfguTw;1 zJjHkY+XUcwh6m?&xW|cyC4~vV?-RL=jQTl5{x&!}d4DB;BITwZTIZl{-}$5aPhX>0 zq@i?!4)poK1c%fO;0sdY8qa;bC^l2SvG@q+qASr}pak;Iv(2HYZ+}wU6t#S}KJdxg zWumRNjlpZpq&uq>5HaFR9}BiaL_PD}A$h2yE#n23R|@Bv)2T=?XE1lT&HDZj#iz5k z<>zLBZpC7MM@NB2p87vE9sq97*@hEr(8;0=A}9}ZVG#HH^qt=rY<7Ik?%{0)3+cLz z?UF!*N_}0b5BVU#^IG%*@VR(tKlOMx7vHguddiS5{36#nZ(Gmcx3kK;dkqwC^_g3f z5kWEQ*S+TFfZtost2c5^flfw*1$80kxU)t^bd(r>T)4K?d~*TpmnJwY$3i5@FwiF( z{FLvCvG`HIPj``uVzB`tMdkemMyD9;sQB_?i8J^P6)_z6K=G1$e^sg`QrzFu;gAXV zMJHW~c?$R?beXT1ctEjeO!p$`wG4jR+$3oMeW=k;ec55aO{V7a>JYdmfkgMVH;^l0 zP34w<>w`WoANj(k2X&ZQWYJK_OCPy!)gmax*Sb|$(s>k{Uh2pg2K-Vr+hu;hd93iO z7Oi@UKW$yORu*vES?w;dy#sPrBq!oH_-RDtgAhLOr!RTm?kIzQ*9BQ|eu7TLZ8(9h z$}sK@?A&>s!K(|sr8Gnse1ZMmyfg>;TdzTXxx)YRW{FLm1n4JF&aUEC2k7!fR&+U> zKio1%tT`T$Y(?wXrH~iW1nYWSL67~-t|E%yQyj*7aalOrmq==cpBm&ed%H8m`LK`l zN>&o&P*K^*K3&MiGQlzY4BXEqv-dR_fTP5o#=QuBzbGwba|duLPn~7+ASX5@_-Jc? z!F$6Sug@uhuZ#tX+(eMGByIiFHlIX9DaR{n0Q3+nrlGSVp21lX+WPIlyB(6wnj0g* zZ#@sNqkN!`4$jodLZ0sm78s6mgnsVwZ@sk`)TjSQB^L6^_K6?8@#To@NMAA;2Ri+{ z(RZ0V_?dBs@1y+Vh%BwKZ#X6i`n}A5J=Wz7dK&++vAq%aeBAuO2H^AR>~%Ap|IhPI zVZQO8pLP$IWJePQe_v{zZZ8bENuf071njeMf|I)i>Q@QitTum!$WQG(Hh1qLVkcwq z{G&S}=?6cx)Xp;4OS`bU19&~9S7aHJM)6Z)>oosE6#p#Zs+vPzOq$8-o&;Ziuw;it z7H|Z`LTm-ys6jm(2 zrJ!dGZQ%oB@ZA&ft2G34)Bj)FKoxw){3|Fwn|hdHyDOr*xbS^rc6ewc*&6)MHu(=> z$REXxywE(z!`pRVJ0$?mf=rSoOiW>9^$J?EfgjugV<#^7{Ttc7=-WmNzOr3jPUbSj z{{wNcWTunRCm4V33IG5A0001ZoE?^VJk{wJ$D_2UY)#p-M5u_dq|n9Sr=})~Hrfkg z$yE_^Q+8zuk)o(%os#TEvP3Gnl1LG`xT5G?Cn@yCB(YJxVPM@{p>X1-y@q<_W^ zA<(L5WMajvVaB?tglWzUk8$y-^~i@GJO;aswl?~e9nL`7e2z?!CUV!2od`gmxz`r0>(&@WBu9jg7T>jUdZpcU_c#-KOVvg9i|A z=YW5HS}gYMAG={>i1S^Z;oVtA_dKK`Uk2GHzA$|R_V05Rnr?*b{KayJ{ZFM83Sc0G8`W<;I*#cD^*wnKg@F|Y9>sIq-e;%uBp^RK>N@An&}Yo6F=j(nD7vypAMzuQyIHR&KlJ1Tr4e5;h3(9S%$|I_nDT!` zTR)}896Xb;qplFNO7^))jFVD)b_sFhPu}2vgM0KAzn7au`4(C-oeRB*;x}h0$j$lb zK0RRCso&+y5x+m4&;KW6TXAMI<;(JM=_+;bv4Q;~%Gcmb--c(P=Wu4i56XA3cxwjY zRV|(@o2Ggx(VV9Lb629ns{y=J>E(asMCYIOTUG^T2vcG@LgiUlUuwYpJs}uF9wBJgKg{Jcm8IQjC}_tbInTH$5LUSlO&|HOXB zpLee9gxqs1UYqK;A+gk00C9gdj@|v@0C}oL^|T4rldi3}VGnu1sqGe(kQe3Mx*r2s z{qTNA>Mwnh^WC<9vK37}-=H58SGJ(1^YG4LlnTzbCWH?V5fgqQEn{=PK^4R zRe>)@3_ki}{YTu32wg5B8>Zs!6p($V9NJXjd2TUY_Ums)-79o37nzM%l^Kjr9Ohxl*i zS(vVa|C$tSfmY~8XWxHIdPjMC=Sh1Lc)@oSBMQ7R?eSKO`u@~e)7`KuZWg_@9vrA` zc6S2LJr3T*4~BNfHZDZmX8vPy7?hV^nsX)Lr_Qpyt&4SKrqr9+l*bRM3m$+8cHWsS z;MK=kd#O&%+uTy}H->(Z z1c$o~ynS=GaV_@U*Lwau{YR&QCV3WEX&b6%LHV@Y_#DkI_Y_5cUGSn))Mf|LcSOd& zp?luq^<5PHX5)bkc3@~_aYX^>)2FPXiuM17E_o+IHkqkQYy-R6qV1xg?;bzxT1Ug&lyp?gdY6k9;~D7)52^cMBkf?4h~pZ`iXxtULM zXU?vhG-sY3%BrM#e)Q5^MGASN93R$J_v?IN8W|!5kM&JE7wfGy=yYN%VS2Q;Uhqe2u&t6`$ zQi0}7{niE}nlld%Cp@$QPhFk0AroBwdNzyZ)F;ms?v#JwJ6`(_P<@84Vpij-`bCT0$GJ>!NZ`EVtxqqL8;ZZHmn6t zT@49eN%hgKbG!!Y9`hyt)dB;)v>4JpAODWc@5lE{W_p&;d1ghY=xKoe+kK(yPrBE( zUG}B0YckYvQKxy=#{a?j%e9XgM&sx9Svy+_FhMXDPI7d>Tg zBUe>0g60P2ow*b4S#;@4Ru@<#lWhMA?CiMBr28m)t?EvFg_ERH{uXR4Wv~xW-?UIx zqW*s;uBpZeq;rbsO76va9J^&r9_mO;u`-$ode+X1OTu}U7+#A=z`A*A*-rXDXRf(^ zrSI)AyS}3l{4>Jz3H4{C!a1>rzEnd&5SsbtJNkaudATQTCN za;BbHfx%IA?v0oW%8@OCexO?3y-V~S(wTow(0vboGY6h%2-s5au>TqS)0kRe-{2=4 z+Q^zka=R?o1nYbKUBhYKDctLlraBw)R(9b*KXYW@qAToDZeuZ5|Uh+hhtx=6~XvT*Ix;N3fa61^bVCNGt=Bk@s|E3Er9!Fh}-iF!0$?G&Xa%C zHw>B{{+jQr)kSN;bY}F~B?hSvJlVRWKmT>zYI2``{-if9O9y=q3Hwi5${9N_x}WGcDmh-v(wXuC$HC`cQuREqZUp=WN&g2F{4z z^*RatYnJwA>U*!9@*1fQ=bmmWas#*Qf1bIC`b9))2KA$vwBcl`#}_)=`VM~*w_1J; zg5A%Qn((XizuL!bY#^H+4jj6Qb^WvB{=e=a`AGUYaJz4o&T;6I19-jEFW=c1Fy@0R zx?Ij#!QX{>_CEEk(z=y`RChCe1xu9S7m*R(PVZ3LfP!9q*zH~K5qSl9*POphr5X3K zSbXo%G3vvm`~Ap2pnKej-hB+x;Zffy&;Abx78x{?(I*&x01E&B00000c$^)Vc|6wJ z6UXh*&6XAv5ebncSxP;YbPGv^7J4jERLIgo%9ez(lckhANa z!KV`pNLcTG8v_>K_9|!14KZr3C^Q}dz4d*o2f**!VnU-ap109vR15R9wZ|p+IffZ| z!93Q-AfH=rr>#3X#HeQ(m`y@%PNxh$7h55Cn%*GmJxnW;DifV*nymh1$D zre8Pr!2Vlg>{>(cSVd5e0^&Vui!}LXdWfMIz~=aW5^-8m=fhYtLyRYEUPo1-f8Td! zO980Lv)^|g;=0&|OUPq=rgI;5sld+fVmg*MHgnqW`T=yl~jD;_ki1jx4R)5aYR|nkpI|@z6jWNC`mr} zFg3&wIqd%Y>ckME;ez>=48&0mzNE~D_#EQ_E&142G0#G43&isf<`gLed-F{9^JBi` zM`l?G*jS|Ks{_9UaT}Ogh_{S?_ES7$gJj!(m@4==k~&(N0Kd*3i^9x7%kv}Ry;F34 zk?-g{2PLNlo+3_0(cv-;_>axjSLOoGiwtjwgP!|%Dd!IOQ)s9@%7;9dRC6+N5vNmp zOzaxjv9nfg#kt&Y8joBA&iWn?G=^WfxoUF;&Ch3-`UEo5UW~`VKGeX2BLu8|>T7R* z481@&UuQP)1o z8*+ZY(yOPz=c_hWXM&1jeo0h^X*&AH4#F;FN+h}ja_D)fyN7YEebEnEB%tSiHCr)w z6Mh%V^miB{&cUn>XMf0*%a4{`g1wE;7cnO2TVa2C9vnPyQJ0Bv{!`k`rI2lte|SxR z61P+)Td{6+PQ4^H$gejfS(YIV%kX&pZt#AnO%vs-{&h~OBgU)zZ(21_KiPcheizuh zBDj+7@!5aOTU$W0{H#?bpe!4IN8vlHvzzX-F7kJJw#S6-ZLqZVUCe8$a57klbG8{UYNNhpF;VdhxB~N~Q#(fX(>a*<+enf>#&`|Y z?WveY)(64N9}SY?prpK7IptaV#Kg9BnBS@%phM@reTVDxG${Z0T9P{A?0Iv~L>a7l zWt2zp0_?tyS%TdIQKHmG9l|5(DW6UWaXNZ*UPl+abEo=gO8)qN0SqXdm!iDb?Q!{W z5{zH7!s!-xOY=eaCvbh+hws#XQ{9VX6G2UGF3$qcr!zN51PpVy#4bd2b=pIoxc!Kl zQZ87Towsuj$P@ZGU?rH5c}0Ty->PL+F4s{7gt;JL7y7wqu8`@J{nqM;GctEeQ)NKr893_R+A5Nf-24hJ0pajd+ehzPw%IunYJ! zt#b?YyI@w>6Y8HVb8aP3`fm1L*IWQS>vt8q1>|WVWo~}R{2ozay>yT2cqgdtWWKvT zrTRA6a-o~*dt~*C1geWm(Z7SJukcI;2d@S#^Px09btXQ6Ic@JU%*Up@2(MFo0P>AUiHwfYb2+rV%Bh8bk0UeaH5kIo!D(M#{9 z>|yR$+GmDfV;}XOP`%C1mV$gE+QyXsM+aY&X+r+@K&>n7TQca2CA|x7JGa(S-2Sqz zPcxK%w-(i0;u_NsUFs8`Cz2MN0cAM&ZWVy+?B`cf{oXm;(fu8ELbXq3LcqO!&qPN+ z-+~9*9BBQ5H`*dVj=++~#-R9un@XV=-+9;lWi0lQ&s8LQ0sIwQu(yNqrRXK5iu_1u z8*ps^?PU7~=b)FK^j}i}yTHu@{05MpzY$)4NBeNoR?K72x`d)b=)1bIXwTkXsJGO+ zM<&;S`(8-&W`o*kiCj|{ANVy{(+0mg?93F+!TBbQ5aIvlBRAC!0)3LFzvN>)d6ViI0r=G_eV&o7@O(7bWm-h%=j1FL(LU^KW8DQ`yKp?-l-+M=KY1BP|oTkCs0lP zz6-5iKy5+N391V{#jE!~O}V*zdcQ1x@~e@hbLZ~b8C8Szev;6i3Wxl#%Ra>qGNV?8 zm-ZE}aisk|>{Y$xji@dc8#NS!LGQxW{_<7D>?64GhJy|;9djowa#;!wbDfG#c4OV4T&+E_e<2Ur);Qcr*NPTwHR&eYX z;uyBu8qxdC&VywgPkkU>B4i7H)%jG8I_+2EmAGyr)^Sr&-JHJf-mFIZ$MpTXAg)FC zZ%+2D(0Zc#Kqc+JTgj>;73}18)}TJpp8i;w>iX?TrMB(RyVglPt%W?eXzM**tn>N1 zwVsb@pK{;28X)s3jd#)h9>zD$c*8#Tp-Nr`)|=g&qF0A?T9rna+R;58V0-<^0PK!E z#b<``=~Q9AM*0u2ws_bG{eO?j^)ZvtCm4UN3;+NC0001ZoE4XOSWRmi#x+PJLnNgr z8Z@aSH0VyskOnzTGNclvge3EjLJ3idN;8KjN=ij^ii{~0A4fK+z1CiPtwpmm`QG!_ zy7qPL{XXk?-uwPN_nthtr<)0-a3Z~`Kp~F8+j`G5uUHCKTG`Ob6BHyl?;idz1*w0@ z+8<^1Q}A#wd3s?F1^MY7lUMGfkXvZr_V0EI&5vFvcyFbkKlyn7V}A-w&~M)qNMWVB zVDzaa6z)2OUYb6W0%sWc`Xb~MvJZu=G`1wp z%h-6GMzEG^hR#76Pu+F1W7pGYkovmM(vHR#YmX8wV;TWA-H$fUps_v7f6O)s8o!SC zTpjvC`jW}5Zn;b0h)*U{cZkBYRjTU@mWx5jba!uQV(?^~UD)lD3|?k+MfrbtGgzRP zP+q;1fq!$!e3SVMrl*wqkJ4cf|0`B?whDuKU9azdNigsgUr2U*Cqk)7vy*g`2nTbg z&Tg3`g3--aB_9PWd;;Dt?cBoRt$Rs$)hrh3#medYXcj?I1Clo6sW!YjOnNd4BNxTP zsv0Z|e9X!v4Ouwlg-Bqc!v>!n8{$uK@Sb1n6nKk+VbR0VGqoI!KfbcK ztcgRdB1bE~;t-fB<)ELzA^5JHo4}mIzJ!>aQ-gUFY)emjXUapb_W{`MOL_?GYX&simxQ91rakHERardAt;?w;M&CwQE0U&W+)* zJu$$O3nAarla3iY%On5&Rn^szJQ8D@=j9*ZA=lzrTXdQSC%Zpn%_SZW4tsUAp5xKx zFi|xwj7OML+&sZ*9?gHLtE^M!^2qE`84gzF;dpP?^%O%MmG8es#%$qXQn=f@ioEaG zVLDiI-|yN-)s)0W6lSzDPi$N{?31ig;pGv9jvi6cH>}H z^UF2&TT@2=)yprB;D27#1nbE>Q21TArgb$80h|BAU ziufkN5~atna^`;`?6A#`bG$(#F!X2TCgO|oo=dNf&8A_P@8q$%u3g5SfsOS8l@b5LvOjjowJ-bFP?zN$DCt#1uyFLn;M>3K}E>l?B-X-?3r=U{3 z(f9QP3dfZfwH@jaLi|C)EsOZMWNGos3F9dI7;pNsbr*kyLchmHRmk(WqsPwr(G*gX z$DUREE<}RfzgCiCDI^3sPrG!0!jrgx#cSu$c-eoiI$l|Xk&NQGZdwdhb&JZ?&BeGK zvaLhXmWAQVk*rix4o9m?k9Bo%=w5L>_lGQnc$4vNHmyQ5+>9zPBX#2ClB*-aD7ZU1 zNgAlr_$PmtbIg$vVQoyI!iYSB#2+h9>FbHHBSk*xj5UjIvWx#{&F5g^U6GK~$)V0P z*>s5LUP|dirv>S&eCtToCZQ0w6*qR?F`#fUqE?Xql)|m_5E-9r8ZD7yJq_-PP~#n5 z82o|3K)Pl^&afD=eMX_G<2ZahF(%)X_;mm6pPzr-w(^+tq z{L@9w&!7g@^;=MIX`lA4o}(bBh?q!mG(K+AnbV-oAn5l@OTkt#s+J5t7o@SUca%Ng zMEp8Zcw@Yj3y-GHzxCY`c_cXRf4OxtsWU+5B~PT#n|bF~7MYLijq<7(V+#9BXULg! zP%wYHcgeg>UWBI)JlkxyF>t=>@G1DM7`8@k{9g)$69uzZYRm9Y?P_!tpXAYfuP$iI zLE5Ojiv;t!ou{92 zcwxKc$QHt*th70bBEp*pRk_APi5$M0-WZC|Vi9%G@Y}e43Zu;P_kJXM>rDMZTOEJ0 zr(BpfB`)`f?l)DO|Di5|tlq}!m{MNkJX?Et*u+9SSiu4li2(DC&?!wvxBoGiGExHjqUu7Qh1|qWx-NK5f%jd z?K!&Sp5FYLzGEhbmaE|_^cBTO8hs~l*)JMC z*R~(h4xzA3#J4yQzB!f8eEyc`MqRf>?;@!)-t2m|Jh|^z?HvXmNxeq5q9kV%!pTv7 z;rEq9=wB7@@r3v-_ksTe@ggy%vjGi@R zTBZ##i1EJL`JU{ffxHcGB+2}=4<%oo_f-sG?sAv50}MXMpUSk>5MfHyl!xz0ekwmN zn|KZEeWE3fHeq_3vaRlh6Zw0a_rdM zBnQU&y($coqrl%S5|1ajt?_JZm2?#iZ_NV1TTKROp1H^(dN9=dy!vG{kHsfm#1#GH zpjH(1+~Ng``=ftevRW&}nDXXqTzqPXtO4suVE3QaBNiG(Qr=j@A= zX%t2@jIP!b-yHFZ81N%|$l%?~(`uIFzGuFk*0qG_xoK%}7U8yB?1xAlk~el-SvqG; zFN?y@rKv{#Vubn4JzhfUEL^vDVyG1j-<{7^#gcryNcn%A#9YE(^BJBl0#gcsEyrS4 zk$v}7zb)V)(f6A&-)}DMEPRjr7=3L9kKi6#m9z^yZts%IE79a(oxnX|x(QdlHa13+ ze)a|hEgB>_v-xav^(dmd?IzZRmD4F;cvt#%azCNA#=jH~QrO%S*I+b7gk#Aunr9dW zKb^FLn;(C$FiB6a`;T7+?sa`$q)wEaMsd$H9&Xg?P(?DglWRX`M-G$RYh-CBqbow# z+dfOXQVKfqytJ?6trk+pDX}jxfTeNx9J@*NErScs^4``}usBr_ z@|XE69?Am8l~YL_rJ9f*zT|$a)qe}e?qbmppfZ1;L-I@0yV1HDB-gjk2o|b%P;eL( zm-8PFW*eSOx=7|WqNb|0VISFJ2dd|ag*2|ow@-Ud`q5hA;qKaT~6Vm%v4 z4s1C5TTN~{;g9y7RXv11Mj758d6Ikn54pVlD+(YWJTF0TaAj^}Wn@HQbYVUUJTF#M JOGasIWj??F+d%*T diff --git a/previews/PR1624/tutorials/out/solution_000170.h5 b/previews/PR1624/tutorials/out/solution_000170.h5 index 9f62715281e9600b419cb2e5b1ef58a8b64e59e9..2f669fc4463f6d619145929db39c6f6872e088c8 100644 GIT binary patch literal 11976 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 J=lql1N*x#r+O7Zq delta 12212 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 C&zKni diff --git a/previews/PR1624/tutorials/out/solution_000180.h5 b/previews/PR1624/tutorials/out/solution_000180.h5 index d0c761172e1e2cfdfed32392c5fcc8a05a5686ab..e183831266be7ceb8cb78fe61729255be0852d12 100644 GIT binary patch literal 11976 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 diff --git a/previews/PR1624/tutorials/out/solution_000180.vtu b/previews/PR1624/tutorials/out/solution_000180.vtu index 3cf228769f1ccbfc4fe7bc7c88232aa93cc219a7..0a66edf2dc9153ef1fff4e35af6087daf6a913e2 100644 GIT binary patch delta 12317 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 - - - + + + - - + + - - - - - - - - + + + + + + + + diff --git a/previews/PR1624/tutorials/p4est_from_gmsh/index.html b/previews/PR1624/tutorials/p4est_from_gmsh/index.html new file mode 100644 index 00000000000..3f6807813d9 --- /dev/null +++ b/previews/PR1624/tutorials/p4est_from_gmsh/index.html @@ -0,0 +1,366 @@ + +17 P4est mesh from gmsh · Trixi.jl diff --git a/previews/PR1624/tutorials/parabolic_terms/bed141da.svg b/previews/PR1624/tutorials/parabolic_terms/cda863ac.svg similarity index 93% rename from previews/PR1624/tutorials/parabolic_terms/bed141da.svg rename to previews/PR1624/tutorials/parabolic_terms/cda863ac.svg index fe087a3b2b4..9efbf291417 100644 --- a/previews/PR1624/tutorials/parabolic_terms/bed141da.svg +++ b/previews/PR1624/tutorials/parabolic_terms/cda863ac.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/parabolic_terms/index.html b/previews/PR1624/tutorials/parabolic_terms/index.html index f2c342ca627..526f2f24b8c 100644 --- a/previews/PR1624/tutorials/parabolic_terms/index.html +++ b/previews/PR1624/tutorials/parabolic_terms/index.html @@ -1,5 +1,5 @@ -10 Parabolic terms · Trixi.jl

10: Parabolic terms

Experimental support for parabolic diffusion terms is available in Trixi.jl. This demo illustrates parabolic terms for the advection-diffusion equation.

using OrdinaryDiffEq
+12 Parabolic terms · Trixi.jl

12: Parabolic terms

Experimental support for parabolic diffusion terms is available in Trixi.jl. This demo illustrates parabolic terms for the advection-diffusion equation.

using OrdinaryDiffEq
 using Trixi

Splitting a system into hyperbolic and parabolic parts.

For a mixed hyperbolic-parabolic system, we represent the hyperbolic and parabolic parts of the system separately. We first define the hyperbolic (advection) part of the advection-diffusion equation.

advection_velocity = (1.5, 1.0)
 equations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);

Next, we define the parabolic diffusion term. The constructor requires knowledge of equations_hyperbolic to be passed in because the LaplaceDiffusion2D applies diffusion to every variable of the hyperbolic system.

diffusivity = 5.0e-2
 equations_parabolic = LaplaceDiffusion2D(diffusivity, equations_hyperbolic);

Boundary conditions

As with the equations, we define boundary conditions separately for the hyperbolic and parabolic part of the system. For this example, we impose inflow BCs for the hyperbolic system (no condition is imposed on the outflow), and we impose Dirichlet boundary conditions for the parabolic equations. Both BoundaryConditionDirichlet and BoundaryConditionNeumann are defined for LaplaceDiffusion2D.

The hyperbolic and parabolic boundary conditions are assumed to be consistent with each other.

boundary_condition_zero_dirichlet = BoundaryConditionDirichlet((x, t, equations) -> SVector(0.0))
@@ -106,7 +106,7 @@
 │ ═══════════════════════                                                                          │
 │ #threads: ……………………………………………………… 1                                                                │
 └──────────────────────────────────────────────────────────────────────────────────────────────────┘

We can now visualize the solution, which develops a boundary layer at the outflow boundaries.

using Plots
-plot(sol)
Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+plot(sol)
Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
 versioninfo()
 
 using Pkg
@@ -126,6 +126,6 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
  [1dea7af3] OrdinaryDiffEq v6.66.0
-  [91a5bcdd] Plots v1.39.0
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`
-Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

+ [91a5bcdd] Plots v1.39.0 + [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl` +Info Packages marked with have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/scalar_linear_advection_1d/7bbbc1a1.svg b/previews/PR1624/tutorials/scalar_linear_advection_1d/1b78a1fd.svg similarity index 79% rename from previews/PR1624/tutorials/scalar_linear_advection_1d/7bbbc1a1.svg rename to previews/PR1624/tutorials/scalar_linear_advection_1d/1b78a1fd.svg index dc703fcb89b..395bc76f8c7 100644 --- a/previews/PR1624/tutorials/scalar_linear_advection_1d/7bbbc1a1.svg +++ b/previews/PR1624/tutorials/scalar_linear_advection_1d/1b78a1fd.svg @@ -1,54 +1,54 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1624/tutorials/scalar_linear_advection_1d/00c0ec1b.svg b/previews/PR1624/tutorials/scalar_linear_advection_1d/51a3929a.svg similarity index 83% rename from previews/PR1624/tutorials/scalar_linear_advection_1d/00c0ec1b.svg rename to previews/PR1624/tutorials/scalar_linear_advection_1d/51a3929a.svg index 5519e6e2122..94ad9baba74 100644 --- a/previews/PR1624/tutorials/scalar_linear_advection_1d/00c0ec1b.svg +++ b/previews/PR1624/tutorials/scalar_linear_advection_1d/51a3929a.svg @@ -1,46 +1,46 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1624/tutorials/scalar_linear_advection_1d/4c20d287.svg b/previews/PR1624/tutorials/scalar_linear_advection_1d/5dbf4fa6.svg similarity index 82% rename from previews/PR1624/tutorials/scalar_linear_advection_1d/4c20d287.svg rename to previews/PR1624/tutorials/scalar_linear_advection_1d/5dbf4fa6.svg index 74c98df500c..ed2c1603d60 100644 --- a/previews/PR1624/tutorials/scalar_linear_advection_1d/4c20d287.svg +++ b/previews/PR1624/tutorials/scalar_linear_advection_1d/5dbf4fa6.svg @@ -1,46 +1,46 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1624/tutorials/scalar_linear_advection_1d/0cdc6371.svg b/previews/PR1624/tutorials/scalar_linear_advection_1d/bdf59697.svg similarity index 85% rename from previews/PR1624/tutorials/scalar_linear_advection_1d/0cdc6371.svg rename to previews/PR1624/tutorials/scalar_linear_advection_1d/bdf59697.svg index 65eafbad348..562e1131663 100644 --- a/previews/PR1624/tutorials/scalar_linear_advection_1d/0cdc6371.svg +++ b/previews/PR1624/tutorials/scalar_linear_advection_1d/bdf59697.svg @@ -1,48 +1,48 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1624/tutorials/scalar_linear_advection_1d/6c8c5e59.svg b/previews/PR1624/tutorials/scalar_linear_advection_1d/e8522b82.svg similarity index 85% rename from previews/PR1624/tutorials/scalar_linear_advection_1d/6c8c5e59.svg rename to previews/PR1624/tutorials/scalar_linear_advection_1d/e8522b82.svg index 0caf9d85a5f..235823e5f44 100644 --- a/previews/PR1624/tutorials/scalar_linear_advection_1d/6c8c5e59.svg +++ b/previews/PR1624/tutorials/scalar_linear_advection_1d/e8522b82.svg @@ -1,48 +1,48 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1624/tutorials/scalar_linear_advection_1d/b9ccf219.svg b/previews/PR1624/tutorials/scalar_linear_advection_1d/fe5b2ffe.svg similarity index 83% rename from previews/PR1624/tutorials/scalar_linear_advection_1d/b9ccf219.svg rename to previews/PR1624/tutorials/scalar_linear_advection_1d/fe5b2ffe.svg index 375aa167e92..e89f8bcb3ef 100644 --- a/previews/PR1624/tutorials/scalar_linear_advection_1d/b9ccf219.svg +++ b/previews/PR1624/tutorials/scalar_linear_advection_1d/fe5b2ffe.svg @@ -1,46 +1,46 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1624/tutorials/scalar_linear_advection_1d/index.html b/previews/PR1624/tutorials/scalar_linear_advection_1d/index.html index 40f80440575..c2f40d04726 100644 --- a/previews/PR1624/tutorials/scalar_linear_advection_1d/index.html +++ b/previews/PR1624/tutorials/scalar_linear_advection_1d/index.html @@ -1,5 +1,5 @@ -1 Introduction to DG methods · Trixi.jl

17: P4est mesh from gmsh

Trixi.jl supports numerical approximations from structured and unstructured quadrilateral meshes with the P4estMesh mesh type.

The purpose of this tutorial is to demonstrate how to use the P4estMesh functionality of Trixi.jl for existing meshes with straight-sided (bilinear) elements/cells. This begins by running and visualizing an available unstructured quadrilateral mesh example. Then, the tutorial will cover how to use existing meshes generated by gmsh or any other meshing software that can export to the Abaqus input .inp format.

Running the simulation of a near-field flow around an airfoil

Trixi.jl supports solving hyperbolic-parabolic problems on several mesh types. A somewhat complex example that employs the P4estMesh is the near-field simulation of a Mach 2 flow around the NACA6412 airfoil.

using Trixi
+trixi_include(joinpath(examples_dir(), "p4est_2d_dgsem", "elixir_euler_NACA6412airfoil_mach2.jl"), tspan=(0.0, 0.5))
[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.

Conveniently, we use the Plots package to have a first look at the results:

using Plots
+pd = PlotData2D(sol)
+plot(pd["rho"])
+plot!(getmesh(pd))

Creating a mesh using gmsh

The creation of an unstructured quadrilateral mesh using gmsh is driven by a geometry file. There are plenty of possibilities for the user, see the documentation and tutorials.

To begin, we provide a complete geometry file for the NACA6412 airfoil bounded by a rectangular box. After this we give a breakdown of the most important parts required for successful mesh generation that can later be used by the p4est library and Trixi.jl. We emphasize that this near-field mesh should only be used for instructive purposes and not for actual production runs.

The associated NACA6412.geo file is given below:

 // GMSH geometry script for a NACA 6412 airfoil with 11 degree angle of attack
+ // in a box (near-field mesh).
+ // see https://github.com/cfsengineering/GMSH-Airfoil-2D
+ // for software to generate gmsh `.geo` geometry files for NACA airfoils.
+
+ // outer bounding box
+ Point(1) = {-1.25, -0.5, 0, 1.0};
+ Point(2) = {1.25, -0.5, 0, 1.0};
+ Point(3) = {1.25, 0.5, 0, 1.0};
+ Point(4) = {-1.25, 0.5, 0, 1.0};
+
+ // lines of the bounding box
+ Line(1) = {1, 2};
+ Line(2) = {2, 3};
+ Line(3) = {3, 4};
+ Line(4) = {4, 1};
+ // outer box
+ Line Loop(8) = {1, 2, 3, 4};
+
+ // Settings
+ // This value gives the global element size factor (lower -> finer mesh)
+ Mesh.CharacteristicLengthFactor = 1.0 * 2^(-3);
+ // Insist on quads instead of default triangles
+ Mesh.RecombineAll = 1;
+ // Violet instead of green base color for better visibility
+ Mesh.ColorCarousel = 0;
+
+ // points of the airfoil contour
+ // Format: {x, y, z, DesiredCellSize}. See the documentation: https://gmsh.info/doc/texinfo/gmsh.html#Points
+ // These concrete points are generated using the tool from https://github.com/cfsengineering/GMSH-Airfoil-2D
+ Point(5) = {-0.4900332889206208, 0.09933466539753061, 0, 0.125};
+ Point(6) = {-0.4900274857651495, 0.1021542752054094, 0, 0.125};
+ Point(7) = {-0.4894921489729144, 0.1049830248247787, 0, 0.125};
+ Point(8) = {-0.4884253336670712, 0.1078191282319664, 0, 0.125};
+ Point(9) = {-0.4868257975566199, 0.1106599068424483, 0, 0.125};
+ Point(10) = {-0.4846930063965668, 0.1135018003016681, 0, 0.125};
+ Point(11) = {-0.4820271400142729, 0.1163403835785654, 0, 0.125};
+ Point(12) = {-0.4788290988083472, 0.1191703902233889, 0, 0.125};
+ Point(13) = {-0.4751005105908123, 0.1219857416089041, 0, 0.125};
+ Point(14) = {-0.4708437376101668, 0.1247795819332056, 0, 0.125};
+ Point(15) = {-0.4660618835629463, 0.1275443187232316, 0, 0.125};
+ Point(16) = {-0.4607588003749649, 0.1302716685409717, 0, 0.125};
+ Point(17) = {-0.4549390945110529, 0.132952707559475, 0, 0.125};
+ Point(18) = {-0.448608132554204, 0.1355779266432996, 0, 0.125};
+ Point(19) = {-0.4417720457819508, 0.138137290538182, 0, 0.125};
+ Point(20) = {-0.4344377334597768, 0.140620300747629, 0, 0.125};
+ Point(21) = {-0.4266128645686593, 0.1430160616500159, 0, 0.125};
+ Point(22) = {-0.4183058776865576, 0.1453133493887722, 0, 0.125};
+ Point(23) = {-0.4095259787518715, 0.147500683050503, 0, 0.125};
+ Point(24) = {-0.4002831364505879, 0.1495663976315875, 0, 0.125};
+ Point(25) = {-0.3905880749878933, 0.1514987182830453, 0, 0.125};
+ Point(26) = {-0.3804522640292948, 0.1532858353164163, 0, 0.125};
+ Point(27) = {-0.3698879056254708, 0.1549159794501833, 0, 0.125};
+ Point(28) = {-0.3589079179688306, 0.1563774967770029, 0, 0.125};
+ Point(29) = {-0.3475259158676376, 0.1576589229368209, 0, 0.125};
+ Point(30) = {-0.3357561878650377, 0.158749055989923, 0, 0.125};
+ Point(31) = {-0.3236136699747923, 0.1596370274972017, 0, 0.125};
+ Point(32) = {-0.3111139160522804, 0.1603123713324616, 0, 0.125};
+ Point(33) = {-0.298273064867608, 0.160765089773461, 0, 0.125};
+ Point(34) = {-0.2851078039966239, 0.1609857164445887, 0, 0.125};
+ Point(35) = {-0.2716353306943914, 0.160965375714529, 0, 0.125};
+ Point(36) = {-0.2578733099632437, 0.1606958381868515, 0, 0.125};
+ Point(37) = {-0.2438398300730194, 0.1601695719599709, 0, 0.125};
+ Point(38) = {-0.2295533558334121, 0.1593797893750759, 0, 0.125};
+ Point(39) = {-0.2150326799566391, 0.1583204890160489, 0, 0.125};
+ Point(40) = {-0.2002968728818922, 0.1569864927736143, 0, 0.125};
+ Point(41) = {-0.18536523146042, 0.1553734778363979, 0, 0.125};
+ Point(42) = {-0.1702572269208345, 0.1534780035235666, 0, 0.125};
+ Point(43) = {-0.1549924525477129, 0.1512975329264932, 0, 0.125};
+ Point(44) = {-0.1395905715122586, 0.1488304493795921, 0, 0.125};
+ Point(45) = {-0.1240712652914332, 0.1460760678321895, 0, 0.125};
+ Point(46) = {-0.1084541831014299, 0.1430346412430583, 0, 0.125};
+ Point(47) = {-0.09275889275279087, 0.1397073621660917, 0, 0.125};
+ Point(48) = {-0.07700483330818747, 0.1360963597385416, 0, 0.125};
+ Point(49) = {-0.06151286635366404, 0.1323050298149023, 0, 0.125};
+ Point(50) = {-0.04602933219022032, 0.1283521764905442, 0, 0.125};
+ Point(51) = {-0.03051345534800332, 0.1242331665904082, 0, 0.125};
+ Point(52) = {-0.01498163190522334, 0.1199540932779839, 0, 0.125};
+ Point(53) = {0.0005498526140696458, 0.1155214539466913, 0, 0.125};
+ Point(54) = {0.01606484191716884, 0.1109421303284033, 0, 0.125};
+ Point(55) = {0.03154732664394777, 0.106223368423828, 0, 0.125};
+ Point(56) = {0.0469814611314705, 0.1013727584299359, 0, 0.125};
+ Point(57) = {0.06235157928986135, 0.09639821481480275, 0, 0.125};
+ Point(58) = {0.07764220964363855, 0.09130795666388933, 0, 0.125};
+ Point(59) = {0.09283808959671735, 0.08611048839446452, 0, 0.125};
+ Point(60) = {0.1079241789809607, 0.08081458090718853, 0, 0.125};
+ Point(61) = {0.1228856729475325, 0.07542925321638272, 0, 0.125};
+ Point(62) = {0.1377080142575372, 0.06996375457378261, 0, 0.125};
+ Point(63) = {0.1523769050236616, 0.06442754707512513, 0, 0.125};
+ Point(64) = {0.1668783179480157, 0.05883028871526293, 0, 0.125};
+ Point(65) = {0.1811985070933818, 0.05318181683604975, 0, 0.125};
+ Point(66) = {0.1953240182159306, 0.04749213189240609, 0, 0.125};
+ Point(67) = {0.2092416986775084, 0.04177138144606024, 0, 0.125};
+ Point(68) = {0.2229387069452062, 0.03602984428372727, 0, 0.125};
+ Point(69) = {0.2364025216754475, 0.03027791454712048, 0, 0.125};
+ Point(70) = {0.2496209503696738, 0.02452608575629232, 0, 0.125};
+ Point(71) = {0.2625821375791982, 0.01878493460541621, 0, 0.125};
+ Point(72) = {0.2752745726282818, 0.01306510441121807, 0, 0.125};
+ Point(73) = {0.28768709681727, 0.007377288098728577, 0, 0.125};
+ Point(74) = {0.2998089100619555, 0.001732210616722449, 0, 0.125};
+ Point(75) = {0.3116295769214332, -0.003859389314124759, 0, 0.125};
+ Point(76) = {0.3231390319647309, -0.009386778203927332, 0, 0.125};
+ Point(77) = {0.3343275844265582, -0.01483924761490708, 0, 0.125};
+ Point(78) = {0.3451859221046181, -0.02020613485126957, 0, 0.125};
+ Point(79) = {0.3557051144551212, -0.02547684454806881, 0, 0.125};
+ Point(80) = {0.3658766148492779, -0.03064087116872238, 0, 0.125};
+ Point(81) = {0.3756922619615632, -0.0356878223992288, 0, 0.125};
+ Point(82) = {0.3851442802702071, -0.0406074434050937, 0, 0.125};
+ Point(83) = {0.394225279661484, -0.04538964189492445, 0, 0.125};
+ Point(84) = {0.4029282541416501, -0.05002451391298904, 0, 0.125};
+ Point(85) = {0.4112465796735204, -0.05450237026215737, 0, 0.125};
+ Point(86) = {0.4191740111683733, -0.05881376343890812, 0, 0.125};
+ Point(87) = {0.4267046786777481, -0.06294951494382847, 0, 0.125};
+ Point(88) = {0.4338330828434404, -0.06690074281456823, 0, 0.125};
+ Point(89) = {0.4405540896772232, -0.07065888921378868, 0, 0.125};
+ Point(90) = {0.4468629247542237, -0.07421574789251445, 0, 0.125};
+ Point(91) = {0.4527551669150955, -0.0775634913396257, 0, 0.125};
+ Point(92) = {0.4582267415819197, -0.08069469742118066, 0, 0.125};
+ Point(93) = {0.4632739138007936, -0.08360237530891265, 0, 0.125};
+ Point(94) = {0.4678932811302005, -0.08627999049569551, 0, 0.125};
+ Point(95) = {0.4720817664982195, -0.08872148869699745, 0, 0.125};
+ Point(96) = {0.4758366111533843, -0.09092131844134463, 0, 0.125};
+ Point(97) = {0.4791553678333992, -0.09287445215953141, 0, 0.125};
+ Point(98) = {0.4820358942729613, -0.09457640559161551, 0, 0.125};
+ Point(99) = {0.4844763471666588, -0.09602325534252773, 0, 0.125};
+ Point(100) = {0.4864751766953637, -0.09721165443119822, 0, 0.125};
+ Point(101) = {0.4880311217148797, -0.09813884569428721, 0, 0.125};
+ Point(102) = {0.4891432056939881, -0.09880267292366274, 0, 0.125};
+ Point(103) = {0.4898107334756874, -0.09920158963645126, 0, 0.125};
+ Point(104) = {0.4900332889206208, -0.09933466539753058, 0, 0.125};
+ Point(105) = {0.4897824225031319, -0.09926905587549506, 0, 0.125};
+ Point(106) = {0.4890301110661922, -0.09907236506934192, 0, 0.125};
+ Point(107) = {0.4877772173496635, -0.09874500608402761, 0, 0.125};
+ Point(108) = {0.48602517690576, -0.09828766683852558, 0, 0.125};
+ Point(109) = {0.4837759946062035, -0.09770130916007558, 0, 0.125};
+ Point(110) = {0.4810322398085871, -0.09698716747297723, 0, 0.125};
+ Point(111) = {0.4777970402368822, -0.09614674703990023, 0, 0.125};
+ Point(112) = {0.4740740746447117, -0.09518182170326678, 0, 0.125};
+ Point(113) = {0.4698675643422793, -0.09409443106501386, 0, 0.125};
+ Point(114) = {0.4651822636784212, -0.09288687703518478, 0, 0.125};
+ Point(115) = {0.460023449577924, -0.09156171967354482, 0, 0.125};
+ Point(116) = {0.4543969102408585, -0.09012177224394632, 0, 0.125};
+ Point(117) = {0.4483089331151018, -0.08857009539864649, 0, 0.125};
+ Point(118) = {0.4417662922553667, -0.08690999040934186, 0, 0.125};
+ Point(119) = {0.4347762351819332, -0.0851449913634191, 0, 0.125};
+ Point(120) = {0.4273464693498908, -0.08327885624791403, 0, 0.125};
+ Point(121) = {0.419485148335155, -0.08131555684993674, 0, 0.125};
+ Point(122) = {0.411200857836944, -0.07925926741086739, 0, 0.125};
+ Point(123) = {0.4025026015879757, -0.07711435198240155, 0, 0.125};
+ Point(124) = {0.3933997872536054, -0.07488535044544484, 0, 0.125};
+ Point(125) = {0.3839022123897198, -0.07257696316779733, 0, 0.125};
+ Point(126) = {0.3740200505167618, -0.07019403429336624, 0, 0.125};
+ Point(127) = {0.3637638373540689, -0.06774153367408606, 0, 0.125};
+ Point(128) = {0.3531444572451353, -0.06522453747557577, 0, 0.125};
+ Point(129) = {0.3421731297908021, -0.06264820750853495, 0, 0.125};
+ Point(130) = {0.3308613966940724, -0.06001776935966011, 0, 0.125};
+ Point(131) = {0.3192211088076166, -0.05733848941811218, 0, 0.125};
+ Point(132) = {0.3072644133633567, -0.05461565091590426, 0, 0.125};
+ Point(133) = {0.2950037413531683, -0.05185452912263369, 0, 0.125};
+ Point(134) = {0.2824517950208982, -0.04906036585632723, 0, 0.125};
+ Point(135) = {0.2696215354188702, -0.04623834349241404, 0, 0.125};
+ Point(136) = {0.2565261699769623, -0.04339355867155523, 0, 0.125};
+ Point(137) = {0.2431791400293651, -0.04053099592384862, 0, 0.125};
+ Point(138) = {0.2295941082432855, -0.03765550144139543, 0, 0.125};
+ Point(139) = {0.2157849458952252, -0.03477175724299444, 0, 0.125};
+ Point(140) = {0.2017657199439165, -0.03188425598348005, 0, 0.125};
+ Point(141) = {0.187550679854507, -0.02899727666564914, 0, 0.125};
+ Point(142) = {0.1731542441359161, -0.02611486151457043, 0, 0.125};
+ Point(143) = {0.1585909865622793, -0.02324079427214604, 0, 0.125};
+ Point(144) = {0.1438756220597465, -0.02037858016395433, 0, 0.125};
+ Point(145) = {0.129022992251319, -0.0175314277805827, 0, 0.125};
+ Point(146) = {0.1140480506645569, -0.01470223310184333, 0, 0.125};
+ Point(147) = {0.09896584761949168, -0.01189356587453844, 0, 0.125};
+ Point(148) = {0.08379151482656089, -0.009107658532933174, 0, 0.125};
+ Point(149) = {0.06854024973648176, -0.006346397826038436, 0, 0.125};
+ Point(150) = {0.05322729969528361, -0.003611319287478529, 0, 0.125};
+ Point(151) = {0.03786794596792287, -0.00090360465249055, 0, 0.125};
+ Point(152) = {0.0224774877026287, 0.00177591770710904, 0, 0.125};
+ Point(153) = {0.007071225915134205, 0.004426769294862437, 0, 0.125};
+ Point(154) = {-0.00833555242305456, 0.007048814950562587, 0, 0.125};
+ Point(155) = {-0.02372759010533726, 0.009642253300220296, 0, 0.125};
+ Point(156) = {-0.03908967513210498, 0.01220760427359278, 0, 0.125};
+ Point(157) = {-0.05440665578848514, 0.01474569380579989, 0, 0.125};
+ Point(158) = {-0.06966345527617318, 0.01725763587663899, 0, 0.125};
+ Point(159) = {-0.08484508582421563, 0.01974481207672138, 0, 0.125};
+ Point(160) = {-0.09987987792382108, 0.02219618763023203, 0, 0.125};
+ Point(161) = {-0.1145078729404739, 0.02450371976411331, 0, 0.125};
+ Point(162) = {-0.1290321771824579, 0.0267015185742735, 0, 0.125};
+ Point(163) = {-0.143440065923266, 0.02879471001709845, 0, 0.125};
+ Point(164) = {-0.1577189448447794, 0.03078883518202784, 0, 0.125};
+ Point(165) = {-0.1718563428491159, 0.03268980457290044, 0, 0.125};
+ Point(166) = {-0.1858399037768357, 0.03450385196323842, 0, 0.125};
+ Point(167) = {-0.1996573773370766, 0.03623748825421298, 0, 0.125};
+ Point(168) = {-0.2132966095779342, 0.03789745574015834, 0, 0.125};
+ Point(169) = {-0.2267455332406906, 0.0394906831577609, 0, 0.125};
+ Point(170) = {-0.2399921583489679, 0.04102424186233269, 0, 0.125};
+ Point(171) = {-0.2530245633834605, 0.04250530343879837, 0, 0.125};
+ Point(172) = {-0.2658308873846617, 0.04394109901707172, 0, 0.125};
+ Point(173) = {-0.2783993233102972, 0.04533888052223981, 0, 0.125};
+ Point(174) = {-0.2907181129514687, 0.04670588405019788, 0, 0.125};
+ Point(175) = {-0.3027755436824813, 0.0480492955198111, 0, 0.125};
+ Point(176) = {-0.3145599472847223, 0.04937621871394801, 0, 0.125};
+ Point(177) = {-0.3260597010456697, 0.05069364578437131, 0, 0.125};
+ Point(178) = {-0.337263231291058, 0.05200843025992359, 0, 0.125};
+ Point(179) = {-0.3481590194623916, 0.05332726256406103, 0, 0.125};
+ Point(180) = {-0.3587356108043638, 0.05465664801682354, 0, 0.125};
+ Point(181) = {-0.3689816256782782, 0.0560028872679817, 0, 0.125};
+ Point(182) = {-0.3788857734692287, 0.05737205908247899, 0, 0.125};
+ Point(183) = {-0.3884368690074614, 0.05877000537646382, 0, 0.125};
+ Point(184) = {-0.3976238513788748, 0.06020231838219783, 0, 0.125};
+ Point(185) = {-0.40643580495675, 0.06167432980291591, 0, 0.125};
+ Point(186) = {-0.4148619824472646, 0.06319110180426264, 0, 0.125};
+ Point(187) = {-0.4228918297057104, 0.06475741967717524, 0, 0.125};
+ Point(188) = {-0.43051501204915, 0.06637778599795482, 0, 0.125};
+ Point(189) = {-0.4377214417649294, 0.06805641610468524, 0, 0.125};
+ Point(190) = {-0.4445013064933708, 0.06979723470503821, 0, 0.125};
+ Point(191) = {-0.4508450981473512, 0.07160387342876083, 0, 0.125};
+ Point(192) = {-0.4567436420215075, 0.073479669138689, 0, 0.125};
+ Point(193) = {-0.4621881257395756, 0.07542766281688272, 0, 0.125};
+ Point(194) = {-0.4671701276898881, 0.07745059884734995, 0, 0.125};
+ Point(195) = {-0.471681644606229, 0.07955092452372269, 0, 0.125};
+ Point(196) = {-0.4757151179639407, 0.0817307896190848, 0, 0.125};
+ Point(197) = {-0.4792634588791559, 0.0839920458658267, 0, 0.125};
+ Point(198) = {-0.4823200712220043, 0.08633624620581726, 0, 0.125};
+ Point(199) = {-0.4848788726822436, 0.08876464368523246, 0, 0.125};
+ Point(200) = {-0.4869343135575803, 0.09127818988394577, 0, 0.125};
+ Point(201) = {-0.4884813930704814, 0.09387753278635144, 0, 0.125};
+ Point(202) = {-0.4895156730580155, 0.09656301401871749, 0, 0.125};
+
+ // splines of the airfoil
+ Spline(5) = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104};
+ Spline(6) = {104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,5};
+
+ // airfoil
+ Line Loop(9) = {5, 6};
+ // complete domain
+ Plane Surface(1) = {8, 9};
+
+ // labeling of the boundary parts
+ Physical Line(1) = {4};      // inflow
+ Physical Line(2) = {2};      // outflow
+ Physical Line(3) = {1, 3};   // airfoil
+ Physical Line(4) = {5, 6};   // upper/lower wall
+ Physical Surface(1) = {10};

From which we can construct a mesh like this: mesh_screenshot

The first four points define the bounding box = (near-field) domain:

  // outer bounding box
+Point(1) = {-1.25, -0.5, 0, 1.0};
+Point(2) = {1.25, -0.5, 0, 1.0};
+Point(3) = {1.25, 0.5, 0, 1.0};
+Point(4) = {-1.25, 0.5, 0, 1.0};

which is constructed from connecting the points in lines:

// outer box
+Line(1) = {1, 2};
+Line(2) = {2, 3};
+Line(3) = {3, 4};
+Line(4) = {4, 1};
+// outer box
+Line Loop(8) = {1, 2, 3, 4};

This is followed by a couple (in principle optional) settings where the most important one is

// Insist on quads instead of default triangles
+Mesh.RecombineAll = 1;

which forces gmsh to generate quadrilateral elements instead of the default triangles. This is strictly required to be able to use the mesh later with p4est, which supports only straight-sided quads, i.e., C2D4, CPS4, S4 in 2D and C3D in 3D. See for more details the (short) documentation on the interaction of p4est with .inp files. In principle, it should also be possible to use the recombine function of gmsh to convert the triangles to quads, but this is observed to be less robust than enforcing quads from the beginning.

Then the airfoil is defined by a set of points:

// points of the airfoil contour
+ Point(5) = {-0.4900332889206208, 0.09933466539753061, 0, 0.125};
+ Point(6) = {-0.4900274857651495, 0.1021542752054094, 0, 0.125};
+ ...

which are connected by splines for the upper and lower part of the airfoil:

// splines of the airfoil
+ Spline(5) = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+              ...
+              96,97,98,99,100,101,102,103,104};
+ Spline(6) = {104,105,106,107,108,109,110,111,112,113,114,115,
+              ...
+              200,201,202,5};

which are then connected to form a single line loop for easy physical group assignment:

// airfoil
+ Line Loop(9) = {5, 6};

At the end of the file the physical groups are defined:

// labeling of the boundary parts
+ Physical Line(1) = {4};      // Inflow. Label in Abaqus .inp file: PhysicalLine1
+ Physical Line(2) = {2};      // Outflow. Label in Abaqus .inp file: PhysicalLine2
+ Physical Line(3) = {1, 3};   // Upper and lower wall/farfield/... Label in Abaqus .inp file: PhysicalLine3
+ Physical Line(4) = {5, 6};   // Airfoil. Label in Abaqus .inp file: PhysicalLine4

which are crucial for the correct assignment of boundary conditions in Trixi.jl. In particular, it is the responsibility of a user to keep track on the physical boundary names between the mesh generation and assignment of boundary condition functions in an elixir.

After opening this file in gmsh, meshing the geometry and exporting to Abaqus .inp format, we can have a look at the input file:

*Heading
+ <something depending on gmsh>
+*NODE
+1, -1.25, -0.5, 0
+2, 1.25, -0.5, 0
+3, 1.25, 0.5, 0
+4, -1.25, 0.5, 0
+...
+******* E L E M E N T S *************
+*ELEMENT, type=T3D2, ELSET=Line1
+1, 1, 7
+...
+*ELEMENT, type=CPS4, ELSET=Surface1
+191, 272, 46, 263, 807
+...
+*NSET,NSET=PhysicalLine1
+1, 4, 52, 53, 54, 55, 56, 57, 58,
+*NSET,NSET=PhysicalLine2
+2, 3, 26, 27, 28, 29, 30, 31, 32,
+*NSET,NSET=PhysicalLine3
+1, 2, 3, 4, 7, 8, 9, 10, 11, 12,
+13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+23, 24, 25, 33, 34, 35, 36, 37, 38, 39,
+40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+50, 51,
+*NSET,NSET=PhysicalLine4
+5, 6, 59, 60, 61, 62, 63, 64, 65, 66,
+67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
+97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
+107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
+117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
+127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
+137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
+147, 148, 149, 150, 151, 152, 153, 154, 155, 156,
+157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
+167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
+177, 178, 179, 180, 181, 182, 183, 184, 185, 186,
+187, 188, 189, 190,

First, the coordinates of the nodes are listed, followed by the elements. Note that gmsh exports also line elements of type T3D2 which are ignored by p4est. The relevant elements in 2D which form the gridcells are of type CPS4 which are defined by their four corner nodes. This is followed by the nodesets encoded via *NSET which are used to assign boundary conditions in Trixi.jl. Trixi.jl parses the .inp file and assigns the edges (in 2D, surfaces in 3D) of elements to the corresponding boundary condition based on the supplied boundary_symbols that have to be supplied to the P4estMesh constructor:

# boundary symbols
+boundary_symbols = [:PhysicalLine1, :PhysicalLine2, :PhysicalLine3, :PhysicalLine4]
+mesh = P4estMesh{2}(mesh_file, polydeg = polydeg, boundary_symbols = boundary_symbols)

The same boundary symbols have then also be supplied to the semidiscretization alongside the corresponding physical boundary conditions:

# Supersonic inflow boundary condition.
+# Calculate the boundary flux entirely from the external solution state, i.e., set
+# external solution state values for everything entering the domain.
+@inline function boundary_condition_supersonic_inflow(u_inner,
+                                                      normal_direction::AbstractVector,
+                                                      x, t, surface_flux_function,
+                                                      equations::CompressibleEulerEquations2D)
+    u_boundary = initial_condition_mach2_flow(x, t, equations)
+    flux = Trixi.flux(u_boundary, normal_direction, equations)
+
+    return flux
+end
+
+# Supersonic outflow boundary condition.
+# Calculate the boundary flux entirely from the internal solution state. Analogous to supersonic inflow
+# except all the solution state values are set from the internal solution as everything leaves the domain
+@inline function boundary_condition_supersonic_outflow(u_inner,
+                                                       normal_direction::AbstractVector, x,
+                                                       t,
+                                                       surface_flux_function,
+                                                       equations::CompressibleEulerEquations2D)
+flux = Trixi.flux(u_inner, normal_direction, equations)
+
+boundary_conditions = Dict(:PhysicalLine1 => boundary_condition_supersonic_inflow, # Left boundary
+                           :PhysicalLine2 => boundary_condition_supersonic_outflow, # Right boundary
+                           :PhysicalLine3 => boundary_condition_supersonic_outflow, # Top and bottom boundary
+                           :PhysicalLine4 => boundary_condition_slip_wall) # Airfoil
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
+                                    boundary_conditions = boundary_conditions)

Note that you have to supply the boundary_symbols keyword to the P4estMesh constructor to select the boundaries from the available nodesets in the .inp file. If the boundary_symbols keyword is not supplied, all boundaries will be assigned to the default set :all.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots", "Download"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.4
+Commit 8e5136fa297 (2023-11-14 08:46 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 4 × AMD EPYC 7763 64-Core Processor
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, znver3)
+  Threads: 1 on 4 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+ [1dea7af3] OrdinaryDiffEq v6.66.0
+ [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl`
+Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

1: Introduction to DG methods

This tutorial is about how to set up a simple way to approximate the solution of a hyperbolic partial differential equation. First, we will implement a basic and naive algorithm. Then, we will use predefined features from Trixi.jl to show how you can use Trixi.jl on your own.

We will implement the scalar linear advection equation in 1D with the advection velocity $1$.

\[u_t + u_x = 0,\; \text{for} \;t\in \mathbb{R}^+, x\in\Omega=[-1,1]\]

We define the domain $\Omega$ by setting the boundaries.

coordinates_min = -1.0 # minimum coordinate
+3 Introduction to DG methods · Trixi.jl

3: Introduction to DG methods

This tutorial is about how to set up a simple way to approximate the solution of a hyperbolic partial differential equation. First, we will implement a basic and naive algorithm. Then, we will use predefined features from Trixi.jl to show how you can use Trixi.jl on your own.

We will implement the scalar linear advection equation in 1D with the advection velocity $1$.

\[u_t + u_x = 0,\; \text{for} \;t\in \mathbb{R}^+, x\in\Omega=[-1,1]\]

We define the domain $\Omega$ by setting the boundaries.

coordinates_min = -1.0 # minimum coordinate
 coordinates_max = 1.0  # maximum coordinate
1.0

We assume periodic boundaries and the following initial condition.

initial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)
initial_condition_sine_wave (generic function with 1 method)

The discontinuous Galerkin collocation spectral element method (DGSEM)

i. Discretization of the physical domain

To improve precision we want to approximate the solution on small parts of the physical domain. So, we split the domain $\Omega=[-1, 1]$ into elements $Q_l$ of length $dx$.

n_elements = 16 # number of elements
 
 dx = (coordinates_max - coordinates_min) / n_elements # length of one element
0.125

To make the calculation more efficient and storing less information, we transform each element $Q_l$ with center point $x_l$ to a reference element $E=[-1, 1]$

\[Q_l=\Big[x_l-\frac{dx}{2}, x_l+\frac{dx}{2}\Big] \underset{x(\xi)}{\overset{\xi(x)}{\rightleftarrows}} [-1, 1].\]

So, for every element the transformation from the reference domain to the physical domain is defined by

\[x(\xi) = x_l + \frac{dx}{2} \xi,\; \xi\in[-1, 1]\]

Therefore,

\[\begin{align*} @@ -39,7 +39,7 @@ 0.945837 0.759744 0.610228 1.49706 1.43849 1.31317 1.14018 0.859825 0.686826 0.561506 1.47995 1.38977 1.24026 1.05416 0.808658 0.646447 0.53806 1.46194 1.35355 1.19134 1.0

To have a look at the initial sinus curve, we plot it.

using Plots
-plot(vec(x), vec(u0), label="initial condition", legend=:topleft)
Example block output

iii. Variational formulation

After defining the equation and initial condition, we want to implement an algorithm to approximate the solution.

From now on, we only write $u$ instead of $u^{Q_l}$ for simplicity, but consider that all the following calculation only concern one element. Multiplying the new equation with the smooth Lagrange polynomials $\{l_i\}_{i=0}^N$ (test functions) and integrating over the reference element $E=[-1,1]$, we get the variational formulation of our transformed partial differential equation for $i=0,...,N$:

\[\begin{align*} +plot(vec(x), vec(u0), label="initial condition", legend=:topleft)

Example block output

iii. Variational formulation

After defining the equation and initial condition, we want to implement an algorithm to approximate the solution.

From now on, we only write $u$ instead of $u^{Q_l}$ for simplicity, but consider that all the following calculation only concern one element. Multiplying the new equation with the smooth Lagrange polynomials $\{l_i\}_{i=0}^N$ (test functions) and integrating over the reference element $E=[-1,1]$, we get the variational formulation of our transformed partial differential equation for $i=0,...,N$:

\[\begin{align*} \int_{-1}^1 \Big( \frac{dx}{2} \dot{u}(\xi, t) + u'(\xi, t) \Big) l_i(\xi)d\xi &= \underbrace{\frac{dx}{2} \int_{-1}^1 \dot{u}(\xi, t) l_i(\xi)d\xi}_{\text{Term I}} + \underbrace{\int_{-1}^1 u'(\xi, t) l_i(\xi)d\xi}_{\text{Term II}} = 0 \end{align*}\]

We deal with the two terms separately. We write $\int_{-1, N}^1 \;\cdot\; d\xi$ for the approximation of the integral using numerical quadrature with $N+1$ basis points. We use the Gauss-Lobatto nodes again. The numerical scalar product $\langle\cdot, \cdot\rangle_N$ is defined by $\langle f, g\rangle_N := \int_{-1, N}^1 f(\xi) g(\xi) d\xi$.

Term I:

In the following calculation we approximate the integral numerically with quadrature on the Gauss-Lobatto nodes $\{\xi_i\}_{i=0}^N$ and then use the Kronecker property of the Lagrange polynomials. This approach of using the same nodes for the interpolation and quadrature is called collocation.

\[\begin{align*} @@ -74,7 +74,7 @@ -0.5 1.54508 -4.04508 3.0

To show why this matrix is called the derivative matrix, we go back to our example $f(x)=x^3$. We calculate the derivation of $f$ at the Gauss-Lobatto nodes $\{\xi_k\}_{k=0}^N$ with $N=8$.

\[f'|_{x=\xi_k} = \Big( \sum_{j=0}^8 f(\xi_j) l_j(x) \Big)'|_{x=\xi_k} = \sum_{j=0}^8 f(\xi_j) l_j'(\xi_k) = \sum_{j=0}^8 f(\xi_j) D_{kj}\]

for $k=0,...,N$ and therefore, $\underline{f}' = D \underline{f}$.

basis_N8 = LobattoLegendreBasis(8)
 plot(vec(x), x -> 3 * x^2, label="f'", lw=2)
-scatter!(basis_N8.nodes, basis_N8.derivative_matrix * basis_N8.nodes.^3, label="Df", lw=3)
Example block output

Combining the volume term for every $i=0,...,N$ results in

\[\int_{-1}^1 u \underline{l'} d\xi = - D^T M \underline{u}(t)\]

Putting all parts together we get the following equation for the element $Q_l$

\[\frac{dx}{2} M \underline{\dot{u}}(t) = - B \underline{u}^*(t) + D^T M \underline{u}(t)\]

or equivalent

\[\underline{\dot{u}}^{Q_l}(t) = \frac{2}{dx} \Big[ - M^{-1} B \underline{u}^{{Q_l}^*}(t) + M^{-1} D^T M \underline{u}^{Q_l}(t)\Big].\]

This is called the weak form of the DGSEM.

Note: For every element $Q_l$ we get a system of $N+1$ ordinary differential equations to calculate $N+1$ coefficients. Since the numerical flux $u^*$ is depending on extern values at the interfaces, the equation systems of adjacent elements are weakly linked.

iv. Numerical flux

As mentioned above, we still have to handle the problem of different values at the same point at the interfaces. This happens with the ideas of the numerical flux $f^*(u)=u^*$. The role of $f^*$ might seem minor in this simple example, but is important for more complicated problems. There are two values at the same spatial coordinate. Let's say we are looking at the interface between the elements $Q_l$ and $Q_{l+1}$, while both elements got $N+1$ nodes as defined before. We call the first value of the right element $u_R=u_0^{Q_{l+1}}$ and the last one of the left element $u_L=u_N^{Q_l}$. So, for the value of the numerical flux on that interface the following holds

\[u^* = u^*(u_L, u_R).\]

These values are interpreted as start values of a so-called Riemann problem. There are many different (approximate) Riemann solvers available and useful for different problems. We will use the local Lax-Friedrichs flux.

surface_flux = flux_lax_friedrichs
FluxLaxFriedrichs(max_abs_speed_naive)

The only missing ingredient is the flux calculation at the boundaries $-1$ and $+1$.

\[u^{{Q_{first}}^*}\big|_{-1} = u^{{Q_{first}}^*}\big|_{-1}(u^{bound}(-1), u_R) +scatter!(basis_N8.nodes, basis_N8.derivative_matrix * basis_N8.nodes.^3, label="Df", lw=3)Example block output

Combining the volume term for every $i=0,...,N$ results in

\[\int_{-1}^1 u \underline{l'} d\xi = - D^T M \underline{u}(t)\]

Putting all parts together we get the following equation for the element $Q_l$

\[\frac{dx}{2} M \underline{\dot{u}}(t) = - B \underline{u}^*(t) + D^T M \underline{u}(t)\]

or equivalent

\[\underline{\dot{u}}^{Q_l}(t) = \frac{2}{dx} \Big[ - M^{-1} B \underline{u}^{{Q_l}^*}(t) + M^{-1} D^T M \underline{u}^{Q_l}(t)\Big].\]

This is called the weak form of the DGSEM.

Note: For every element $Q_l$ we get a system of $N+1$ ordinary differential equations to calculate $N+1$ coefficients. Since the numerical flux $u^*$ is depending on extern values at the interfaces, the equation systems of adjacent elements are weakly linked.

iv. Numerical flux

As mentioned above, we still have to handle the problem of different values at the same point at the interfaces. This happens with the ideas of the numerical flux $f^*(u)=u^*$. The role of $f^*$ might seem minor in this simple example, but is important for more complicated problems. There are two values at the same spatial coordinate. Let's say we are looking at the interface between the elements $Q_l$ and $Q_{l+1}$, while both elements got $N+1$ nodes as defined before. We call the first value of the right element $u_R=u_0^{Q_{l+1}}$ and the last one of the left element $u_L=u_N^{Q_l}$. So, for the value of the numerical flux on that interface the following holds

\[u^* = u^*(u_L, u_R).\]

These values are interpreted as start values of a so-called Riemann problem. There are many different (approximate) Riemann solvers available and useful for different problems. We will use the local Lax-Friedrichs flux.

surface_flux = flux_lax_friedrichs
FluxLaxFriedrichs(max_abs_speed_naive)

The only missing ingredient is the flux calculation at the boundaries $-1$ and $+1$.

\[u^{{Q_{first}}^*}\big|_{-1} = u^{{Q_{first}}^*}\big|_{-1}(u^{bound}(-1), u_R) \quad\text{and}\quad u^{{Q_{last}}^*}\big|^1 = u^{{Q_{last}}^*}\big|^1(u_L, u^{bound}(1))\]

The boundaries are periodic, which means that the last value of the last element $u^{Q_{last}}_N$ is used as $u_L$ at the first interface and accordingly for the other boundary.

Now, we implement a function, that calculates $\underline{\dot{u}}^{Q_l}$ for the given matrices, $\underline{u}$ and $\underline{u}^*$.

function rhs!(du, u, x, t)
     # Reset du and flux matrix
@@ -121,7 +121,7 @@
 
 sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)
 
-plot(vec(x), vec(sol.u[end]), label="solution at t=$(tspan[2])", legend=:topleft, lw=3)
Example block output

Alternative Implementation based on Trixi.jl

Now, we implement the same example. But this time, we directly use the functionality that Trixi.jl provides.

using Trixi, OrdinaryDiffEq, Plots

First, define the equation with a advection_velocity of 1.

advection_velocity = 1.0
+plot(vec(x), vec(sol.u[end]), label="solution at t=$(tspan[2])", legend=:topleft, lw=3)
Example block output

Alternative Implementation based on Trixi.jl

Now, we implement the same example. But this time, we directly use the functionality that Trixi.jl provides.

using Trixi, OrdinaryDiffEq, Plots

First, define the equation with a advection_velocity of 1.

advection_velocity = 1.0
 equations = LinearScalarAdvectionEquation1D(advection_velocity)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
 │ LinearScalarAdvectionEquation1D                                                                  │
 │ ═══════════════════════════════                                                                  │
@@ -164,7 +164,7 @@
 └──────────────────────────────────────────────────────────────────────────────────────────────────┘

Again, combining all definitions and the function that calculates the right-hand side, we define the ODE and solve it until t=2 with OrdinaryDiffEq's solve function and the Runge-Kutta method RDPK3SpFSAL49().

tspan = (0.0, 2.0)
 ode_trixi  = semidiscretize(semi, tspan)
 
-sol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);

We add a plot of the new approximated solution to the one calculated before.

plot!(sol_trixi, label="solution at t=$(tspan[2]) with Trixi.jl", legend=:topleft, linestyle=:dash, lw=2)
Example block output

Summary of the code

To sum up, here is the complete code that we used.

Raw implementation

# basis: Legendre-Gauss-Lobatto
+sol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);

We add a plot of the new approximated solution to the one calculated before.

plot!(sol_trixi, label="solution at t=$(tspan[2]) with Trixi.jl", legend=:topleft, linestyle=:dash, lw=2)
Example block output

Summary of the code

To sum up, here is the complete code that we used.

Raw implementation

# basis: Legendre-Gauss-Lobatto
 using Trixi, LinearAlgebra, OrdinaryDiffEq, Plots
 polydeg = 3 #= polynomial degree =#
 basis = LobattoLegendreBasis(polydeg)
@@ -244,7 +244,7 @@
 # solve
 sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)
 
-plot(vec(x), vec(sol.u[end]), label="solution at t=$(tspan[2])", legend=:topleft, lw=3)
Example block output

Alternative Implementation based on Trixi.jl

using Trixi, OrdinaryDiffEq, Plots
+plot(vec(x), vec(sol.u[end]), label="solution at t=$(tspan[2])", legend=:topleft, lw=3)
Example block output

Alternative Implementation based on Trixi.jl

using Trixi, OrdinaryDiffEq, Plots
 
 # equation with a advection_velocity of `1`.
 advection_velocity = 1.0
@@ -270,7 +270,7 @@
 ode_trixi  = semidiscretize(semi, tspan)
 sol_trixi  = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);
 
-plot!(sol_trixi, label="solution at t=$(tspan[2]) with Trixi.jl", legend=:topleft, linestyle=:dash, lw=2)
Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+plot!(sol_trixi, label="solution at t=$(tspan[2]) with Trixi.jl", legend=:topleft, linestyle=:dash, lw=2)
Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
 versioninfo()
 
 using Pkg
@@ -290,6 +290,6 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
  [1dea7af3] OrdinaryDiffEq v6.66.0
-  [91a5bcdd] Plots v1.39.0
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`
-Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

+ [91a5bcdd] Plots v1.39.0 + [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl` +Info Packages marked with have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/shock_capturing/d2d35149.svg b/previews/PR1624/tutorials/shock_capturing/8985776c.svg similarity index 96% rename from previews/PR1624/tutorials/shock_capturing/d2d35149.svg rename to previews/PR1624/tutorials/shock_capturing/8985776c.svg index 263072bbf2e..58a680a8e2d 100644 --- a/previews/PR1624/tutorials/shock_capturing/d2d35149.svg +++ b/previews/PR1624/tutorials/shock_capturing/8985776c.svg @@ -1,45 +1,45 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/shock_capturing/index.html b/previews/PR1624/tutorials/shock_capturing/index.html index e9a63de5400..e4e99b9c0ff 100644 --- a/previews/PR1624/tutorials/shock_capturing/index.html +++ b/previews/PR1624/tutorials/shock_capturing/index.html @@ -1,5 +1,5 @@ -3 Shock capturing with flux differencing and stage limiter · Trixi.jl

3: Shock capturing with flux differencing and stage limiter

This tutorial contains a short summary of the idea of shock capturing for DGSEM with flux differencing and its implementation in Trixi.jl. In the second part, an implementation of a positivity preserving limiter is added to the simulation.

Shock capturing with flux differencing

The following rough explanation is on a very basic level. More information about an entropy stable shock-capturing strategy for DGSEM discretizations of advection dominated problems, such as the compressible Euler equations or the compressible Navier-Stokes equations, can be found in Hennemann et al. (2021). In Rueda-Ramírez et al. (2021) you find the extension to the systems with non-conservative terms, such as the compressible magnetohydrodynamics (MHD) equations.

The strategy for a shock-capturing method presented by Hennemann et al. is based on a hybrid blending of a high-order DG method with a low-order variant. The low-order subcell finite volume (FV) method is created directly with the Legendre-Gauss-Lobatto (LGL) nodes already used for the high-order DGSEM. Then, the final method is a convex combination with regulating indicator $\alpha$ of these two methods.

Since the surface integral is equal for both the DG and the subcell FV method, only the volume integral divides between the two methods.

This strategy for the volume integral is implemented in Trixi.jl under the name of VolumeIntegralShockCapturingHG with the three parameters of the indicator and the volume fluxes for the DG and the subcell FV method.

Note, that the DG method is based on the flux differencing formulation. Hence, you have to use a two-point flux, such as flux_ranocha, flux_shima_etal, flux_chandrashekar or flux_kennedy_gruber, for the DG volume flux. We would recommend to use the entropy conserving flux flux_ranocha by Ranocha (2018) for the compressible Euler equations.

volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;
+5 Shock capturing with flux differencing and stage limiter · Trixi.jl

5: Shock capturing with flux differencing and stage limiter

This tutorial contains a short summary of the idea of shock capturing for DGSEM with flux differencing and its implementation in Trixi.jl. In the second part, an implementation of a positivity preserving limiter is added to the simulation.

Shock capturing with flux differencing

The following rough explanation is on a very basic level. More information about an entropy stable shock-capturing strategy for DGSEM discretizations of advection dominated problems, such as the compressible Euler equations or the compressible Navier-Stokes equations, can be found in Hennemann et al. (2021). In Rueda-Ramírez et al. (2021) you find the extension to the systems with non-conservative terms, such as the compressible magnetohydrodynamics (MHD) equations.

The strategy for a shock-capturing method presented by Hennemann et al. is based on a hybrid blending of a high-order DG method with a low-order variant. The low-order subcell finite volume (FV) method is created directly with the Legendre-Gauss-Lobatto (LGL) nodes already used for the high-order DGSEM. Then, the final method is a convex combination with regulating indicator $\alpha$ of these two methods.

Since the surface integral is equal for both the DG and the subcell FV method, only the volume integral divides between the two methods.

This strategy for the volume integral is implemented in Trixi.jl under the name of VolumeIntegralShockCapturingHG with the three parameters of the indicator and the volume fluxes for the DG and the subcell FV method.

Note, that the DG method is based on the flux differencing formulation. Hence, you have to use a two-point flux, such as flux_ranocha, flux_shima_etal, flux_chandrashekar or flux_kennedy_gruber, for the DG volume flux. We would recommend to use the entropy conserving flux flux_ranocha by Ranocha (2018) for the compressible Euler equations.

volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;
                                                  volume_flux_dg=volume_flux_dg,
                                                  volume_flux_fv=volume_flux_fv)

We now focus on a choice of the shock capturing indicator indicator_sc. A possible indicator is $\alpha_{HG}$ presented by Hennemann et al. (p.10), which depends on the current approximation with modal coefficients $\{m_j\}_{j=0}^N$ of a given variable.

The indicator is calculated for every DG element by itself. First, we calculate a smooth $\alpha$ by

\[\alpha = \frac{1}{1+\exp(-\frac{-s}{\mathbb{T}}(\mathbb{E}-\mathbb{T}))}\]

with the total energy $\mathbb{E}=\max\big(\frac{m_N^2}{\sum_{j=0}^N m_j^2}, \frac{m_{N-1}^2}{\sum_{j=0}^{N-1} m_j^2}\big)$, threshold $\mathbb{T}= 0.5 * 10^{-1.8*(N+1)^{1/4}}$ and parameter $s=ln\big(\frac{1-0.0001}{0.0001}\big)\approx 9.21024$.

For computational efficiency, $\alpha_{min}$ is introduced and used for

\[\tilde{\alpha} = \begin{cases} 0, & \text{if } \alpha<\alpha_{min}\\ @@ -89,7 +89,7 @@ save_everystep=false, callback=callbacks); using Plots -plot(sol)

Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+plot(sol)
Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
 versioninfo()
 
 using Pkg
@@ -109,6 +109,6 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
  [1dea7af3] OrdinaryDiffEq v6.66.0
-  [91a5bcdd] Plots v1.39.0
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`
-Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

+ [91a5bcdd] Plots v1.39.0 + [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl` +Info Packages marked with have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/structured_mesh_mapping/300da432.svg b/previews/PR1624/tutorials/structured_mesh_mapping/300da432.svg deleted file mode 100644 index 50461ad1e3d..00000000000 --- a/previews/PR1624/tutorials/structured_mesh_mapping/300da432.svg +++ /dev/null @@ -1,9477 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/previews/PR1624/tutorials/structured_mesh_mapping/fb53b05b.svg b/previews/PR1624/tutorials/structured_mesh_mapping/5839e9cb.svg similarity index 96% rename from previews/PR1624/tutorials/structured_mesh_mapping/fb53b05b.svg rename to previews/PR1624/tutorials/structured_mesh_mapping/5839e9cb.svg index d3897a6f48b..a028867a0ce 100644 --- a/previews/PR1624/tutorials/structured_mesh_mapping/fb53b05b.svg +++ b/previews/PR1624/tutorials/structured_mesh_mapping/5839e9cb.svg @@ -1,47 +1,47 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/structured_mesh_mapping/60cf2592.svg b/previews/PR1624/tutorials/structured_mesh_mapping/60cf2592.svg new file mode 100644 index 00000000000..f9a3925bd3e --- /dev/null +++ b/previews/PR1624/tutorials/structured_mesh_mapping/60cf2592.svg @@ -0,0 +1,9749 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1624/tutorials/structured_mesh_mapping/e3dbbc35.svg b/previews/PR1624/tutorials/structured_mesh_mapping/d7d4dc96.svg similarity index 86% rename from previews/PR1624/tutorials/structured_mesh_mapping/e3dbbc35.svg rename to previews/PR1624/tutorials/structured_mesh_mapping/d7d4dc96.svg index eaa982d072d..6c407982aaf 100644 --- a/previews/PR1624/tutorials/structured_mesh_mapping/e3dbbc35.svg +++ b/previews/PR1624/tutorials/structured_mesh_mapping/d7d4dc96.svg @@ -1,47 +1,47 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + diff --git a/previews/PR1624/tutorials/structured_mesh_mapping/index.html b/previews/PR1624/tutorials/structured_mesh_mapping/index.html index b846b47dc9d..0ee943f6a8e 100644 --- a/previews/PR1624/tutorials/structured_mesh_mapping/index.html +++ b/previews/PR1624/tutorials/structured_mesh_mapping/index.html @@ -1,5 +1,5 @@ -13 Structured mesh with curvilinear mapping · Trixi.jl

13: Structured mesh with curvilinear mapping

Here, we want to introduce another mesh type of Trixi.jl. More precisely, this tutorial is about the curved mesh type StructuredMesh supporting curved meshes.

Creating a curved mesh

There are two basic options to define a curved StructuredMesh in Trixi.jl. You can implement curves for the domain boundaries, or alternatively, set up directly the complete transformation mapping. We now present one short example each.

Mesh defined by domain boundary curves

Both examples are based on a semdiscretization of the 2D compressible Euler equations.

using OrdinaryDiffEq
+15 Structured mesh with curvilinear mapping · Trixi.jl

15: Structured mesh with curvilinear mapping

Here, we want to introduce another mesh type of Trixi.jl. More precisely, this tutorial is about the curved mesh type StructuredMesh supporting curved meshes.

Creating a curved mesh

There are two basic options to define a curved StructuredMesh in Trixi.jl. You can implement curves for the domain boundaries, or alternatively, set up directly the complete transformation mapping. We now present one short example each.

Mesh defined by domain boundary curves

Both examples are based on a semdiscretization of the 2D compressible Euler equations.

using OrdinaryDiffEq
 using Trixi
 
 equations = CompressibleEulerEquations2D(1.4)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
@@ -20,7 +20,7 @@
 
   return prim2cons(SVector(rho, v1, v2, p), equations)
 end
-initial_condition = initial_condition_pressure_perturbation
initial_condition_pressure_perturbation (generic function with 1 method)

Initialize every boundary as a boundary_condition_slip_wall.

boundary_conditions = boundary_condition_slip_wall
boundary_condition_slip_wall (generic function with 13 methods)

The approximation setup is an entropy-stable split-form DG method with polydeg=4. We are using the two fluxes flux_ranocha and flux_lax_friedrichs.

solver = DGSEM(polydeg=4, surface_flux=flux_lax_friedrichs,
+initial_condition = initial_condition_pressure_perturbation
initial_condition_pressure_perturbation (generic function with 1 method)

Initialize every boundary as a boundary_condition_slip_wall.

boundary_conditions = boundary_condition_slip_wall
boundary_condition_slip_wall (generic function with 11 methods)

The approximation setup is an entropy-stable split-form DG method with polydeg=4. We are using the two fluxes flux_ranocha and flux_lax_friedrichs.

solver = DGSEM(polydeg=4, surface_flux=flux_lax_friedrichs,
                volume_integral=VolumeIntegralFluxDifferencing(flux_ranocha))
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
 │ DG{Float64}                                                                                      │
 │ ═══════════                                                                                      │
@@ -66,9 +66,9 @@
             save_everystep=false, callback=callbacks);
 
 using Plots
-plot(sol)
Example block output
pd = PlotData2D(sol)
+plot(sol)
Example block output
pd = PlotData2D(sol)
 plot(pd["p"])
-plot!(getmesh(pd))
Example block output

Mesh directly defined by the transformation mapping

As mentioned before, you can also define the domain for a StructuredMesh by directly setting up a transformation mapping. Here, we want to present a nice mapping, which is often used to test free-stream preservation. Exact free-stream preservation is a crucial property of any numerical method on curvilinear grids. The mapping is a reduced 2D version of the mapping described in Rueda-Ramírez et al. (2021), p.18.

using OrdinaryDiffEq
+plot!(getmesh(pd))
Example block output

Mesh directly defined by the transformation mapping

As mentioned before, you can also define the domain for a StructuredMesh by directly setting up a transformation mapping. Here, we want to present a nice mapping, which is often used to test free-stream preservation. Exact free-stream preservation is a crucial property of any numerical method on curvilinear grids. The mapping is a reduced 2D version of the mapping described in Rueda-Ramírez et al. (2021), p.18.

using OrdinaryDiffEq
 using Trixi
 
 equations = CompressibleEulerEquations2D(1.4)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
@@ -122,11 +122,11 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                  0                run time:       7.42000000e-07 s
+ #timesteps:                  0                run time:       1.06200000e-06 s
  Δt:             1.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
  sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:         NaN s
                                                PID:                   Inf s
- #DOFs per field:          4096                alloc'd memory:       2990.021 MiB
+ #DOFs per field:          4096                alloc'd memory:       3243.510 MiB
  #elements:                 256
 
  Variable:       rho              rho_v1           rho_v2           rho_e
@@ -139,34 +139,34 @@
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                250                run time:       2.13871747e-01 s
+ #timesteps:                250                run time:       2.09140174e-01 s
  Δt:             2.33008558e-03                └── GC time:    0.00000000e+00 s (0.000%)
- sim. time:      5.82521395e-01 (58.252%)      time/DOF/rhs!:  3.74963116e-08 s
-                                               PID:            4.16031667e-08 s
- #DOFs per field:          4096                alloc'd memory:       2990.293 MiB
+ sim. time:      5.82521395e-01 (58.252%)      time/DOF/rhs!:  3.66958115e-08 s
+                                               PID:            4.06839751e-08 s
+ #DOFs per field:          4096                alloc'd memory:       3243.782 MiB
  #elements:                 256
 
  Variable:       rho              rho_v1           rho_v2           rho_e
- L2 error:       2.31290602e-15   1.94893683e-14   2.21188565e-14   1.44472757e-14
- Linf error:     2.25375274e-14   2.07972528e-13   2.75501844e-13   2.25597319e-13
- ∑∂S/∂U ⋅ Uₜ :  -1.82954114e-17
+ L2 error:       2.26960092e-15   1.94552593e-14   2.21395377e-14   1.44688368e-14
+ Linf error:     2.25375274e-14   2.07819872e-13   2.77139423e-13   2.25597319e-13
+ ∑∂S/∂U ⋅ Uₜ :   3.42148696e-17
 ────────────────────────────────────────────────────────────────────────────────────────────────────
 
 
 ────────────────────────────────────────────────────────────────────────────────────────────────────
  Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
 ────────────────────────────────────────────────────────────────────────────────────────────────────
- #timesteps:                430                run time:       3.68036600e-01 s
+ #timesteps:                430                run time:       3.59835263e-01 s
  Δt:             3.93286656e-04                └── GC time:    0.00000000e+00 s (0.000%)
- sim. time:      1.00000000e+00 (100.000%)     time/DOF/rhs!:  3.74650359e-08 s
-                                               PID:            4.16202650e-08 s
- #DOFs per field:          4096                alloc'd memory:       2990.371 MiB
+ sim. time:      1.00000000e+00 (100.000%)     time/DOF/rhs!:  3.67055019e-08 s
+                                               PID:            4.06938265e-08 s
+ #DOFs per field:          4096                alloc'd memory:       3243.860 MiB
  #elements:                 256
 
  Variable:       rho              rho_v1           rho_v2           rho_e
- L2 error:       3.20962510e-15   2.14179782e-14   2.83584627e-14   1.56066183e-14
- Linf error:     2.53130850e-14   2.26790808e-13   3.36897177e-13   2.34479103e-13
- ∑∂S/∂U ⋅ Uₜ :  -7.51023760e-17
+ L2 error:       3.15789939e-15   2.14412441e-14   2.85317041e-14   1.56627094e-14
+ Linf error:     2.46469511e-14   2.28150832e-13   3.36675132e-13   2.36255460e-13
+ ∑∂S/∂U ⋅ Uₜ :   7.31182305e-18
 ────────────────────────────────────────────────────────────────────────────────────────────────────

Now, we want to verify the free-stream preservation property and plot the mesh. For the verification, we calculate the absolute difference of the first conservation variable density u[1] and 1.0. To plot this error and the mesh, we are using the visualization feature ScalarPlotData2D, explained in visualization.

error_density = let u = Trixi.wrap_array(sol.u[end], semi)
   abs.(u[1, :, :, :] .- 1.0) # density, x, y, elements
 end
@@ -174,7 +174,7 @@
 
 using Plots
 plot(pd, title="Error in density")
-plot!(getmesh(pd))
Example block output

We observe that the errors in the variable density are at the level of machine accuracy. Moreover, the plot shows the mesh structure resulting from our transformation mapping.

Of course, you can also use other mappings as for instance shifts by $(x, y)$

mapping(xi, eta) = SVector(xi + x, eta + y)

or rotations with a rotation matrix $T$

mapping(xi, eta) = T * SVector(xi, eta).

For more curved mesh mappings, please have a look at some elixirs for StructuredMesh. For another curved mesh type, there is a tutorial about Trixi.jl's unstructured mesh type [UnstructuredMesh2D] and its use of the High-Order Hex-Quad Mesh (HOHQMesh) generator, created and developed by David Kopriva.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+plot!(getmesh(pd))
Example block output

We observe that the errors in the variable density are at the level of machine accuracy. Moreover, the plot shows the mesh structure resulting from our transformation mapping.

Of course, you can also use other mappings as for instance shifts by $(x, y)$

mapping(xi, eta) = SVector(xi + x, eta + y)

or rotations with a rotation matrix $T$

mapping(xi, eta) = T * SVector(xi, eta).

For more curved mesh mappings, please have a look at some elixirs for StructuredMesh. For another curved mesh type, there is a tutorial about Trixi.jl's unstructured mesh type [UnstructuredMesh2D] and its use of the High-Order Hex-Quad Mesh (HOHQMesh) generator, created and developed by David Kopriva.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
 versioninfo()
 
 using Pkg
@@ -194,6 +194,6 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
  [1dea7af3] OrdinaryDiffEq v6.66.0
-  [91a5bcdd] Plots v1.39.0
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`
-Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

+ [91a5bcdd] Plots v1.39.0 + [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl` +Info Packages marked with have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/time_stepping/index.html b/previews/PR1624/tutorials/time_stepping/index.html index 13cc19f0c66..e3bba0947e3 100644 --- a/previews/PR1624/tutorials/time_stepping/index.html +++ b/previews/PR1624/tutorials/time_stepping/index.html @@ -1,5 +1,5 @@ -15 Explicit time stepping · Trixi.jl

15: Explicit time stepping

For the time integration, Trixi.jl uses the package OrdinaryDiffEq.jl from the SciML ecosystem. The interface to this package is the solve(...) function. It always requires an ODE problem and a time integration algorithm as input parameters.

solve(ode, alg; kwargs...)

In Trixi.jl, the ODE problem is created by semidiscretize(semi, tspan) for a semidiscretization semi and the time span tspan. In particular, semidiscretize returns an ODEProblem used by OrdinaryDiffEq.jl.

OrdinaryDiffEq.jl provides many integration algorithms, which are summarized in the documentation. Particularly interesting for Trixi.jl are their strong stability preserving (SSP) methods and low-storage methods. There are some differences regarding the choice of the used time step.

Error-based adaptive step sizes

First, we treat time integration algorithms with adaptive step sizes, such as SSPRK43. It is used in some elixirs, like elixir_euler_colliding_flow.jl or elixir_euler_astro_jet_amr.jl.

Other error-based adaptive integration algorithms are for instance RDPK3SpFSAL35, RDPK3Sp35, RDPK3SpFSAL49, RDPK3Sp49, RDPK3SpFSAL510, RDPK3Sp510.

They already contain an error-based adaptive step size control and heuristics to guess a starting step size. If this heuristic fails in your case, you can specify an appropriately small initial step size as keyword argument dt=... of solve.

If you run Trixi in parallel with MPI you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to enable MPI aware error-based adaptive step size control. These keyword arguments are also included in ode_default_options.

CFL-based step size control

The SciML ecosystem also provides time integration algorithms without adaptive time stepping on their own, such as CarpenterKennedy2N54. Moreover, you also can deactivate the automatic adaptivity of adaptive integration algorithms by passing adaptive=false in the solve function.

These algorithms require another way of setting the step size. You have to pass dt=... in the solve function. Without other settings, the simulation uses this fixed time step.

For hyperbolic PDEs, it is natural to use an adaptive CFL-based step size control. Here, the time step is proportional to a ratio of the local measure of mesh spacing $\Delta x_i$ for an element i and the maximum (local) wave speed $\lambda_{\max}$ related to the largest-magnitude eigenvalue of the flux Jacobian of the hyperbolic system.

\[\Delta t_n = \text{CFL} * \min_i \frac{\Delta x_i}{\lambda_{\max}(u_i^n)}\]

We compute $\Delta x_i$ by scaling the element size by a factor of $1/(N+1)$, cf. Gassner and Kopriva (2011), Section 5.

Trixi.jl provides such a CFL-based step size control. It is implemented as the callback StepsizeCallback.

stepsize_callback = StepsizeCallback(; cfl=1.0)

A suitable CFL number depends on many parameters such as the chosen grid, the integration algorithm and the polynomial degree of the spatial DG discretization. So, the optimal number for an example is mostly determined experimentally.

You can add this CFL-based step size control to your simulation like any other callback.

callbacks = CallbackSet(stepsize_callback)
+18 Explicit time stepping · Trixi.jl

18: Explicit time stepping

For the time integration, Trixi.jl uses the package OrdinaryDiffEq.jl from the SciML ecosystem. The interface to this package is the solve(...) function. It always requires an ODE problem and a time integration algorithm as input parameters.

solve(ode, alg; kwargs...)

In Trixi.jl, the ODE problem is created by semidiscretize(semi, tspan) for a semidiscretization semi and the time span tspan. In particular, semidiscretize returns an ODEProblem used by OrdinaryDiffEq.jl.

OrdinaryDiffEq.jl provides many integration algorithms, which are summarized in the documentation. Particularly interesting for Trixi.jl are their strong stability preserving (SSP) methods and low-storage methods. There are some differences regarding the choice of the used time step.

Error-based adaptive step sizes

First, we treat time integration algorithms with adaptive step sizes, such as SSPRK43. It is used in some elixirs, like elixir_euler_colliding_flow.jl or elixir_euler_astro_jet_amr.jl.

Other error-based adaptive integration algorithms are for instance RDPK3SpFSAL35, RDPK3Sp35, RDPK3SpFSAL49, RDPK3Sp49, RDPK3SpFSAL510, RDPK3Sp510.

They already contain an error-based adaptive step size control and heuristics to guess a starting step size. If this heuristic fails in your case, you can specify an appropriately small initial step size as keyword argument dt=... of solve.

If you run Trixi in parallel with MPI you need to pass internalnorm=ode_norm and you should pass unstable_check=ode_unstable_check to enable MPI aware error-based adaptive step size control. These keyword arguments are also included in ode_default_options.

CFL-based step size control

The SciML ecosystem also provides time integration algorithms without adaptive time stepping on their own, such as CarpenterKennedy2N54. Moreover, you also can deactivate the automatic adaptivity of adaptive integration algorithms by passing adaptive=false in the solve function.

These algorithms require another way of setting the step size. You have to pass dt=... in the solve function. Without other settings, the simulation uses this fixed time step.

For hyperbolic PDEs, it is natural to use an adaptive CFL-based step size control. Here, the time step is proportional to a ratio of the local measure of mesh spacing $\Delta x_i$ for an element i and the maximum (local) wave speed $\lambda_{\max}$ related to the largest-magnitude eigenvalue of the flux Jacobian of the hyperbolic system.

\[\Delta t_n = \text{CFL} * \min_i \frac{\Delta x_i}{\lambda_{\max}(u_i^n)}\]

We compute $\Delta x_i$ by scaling the element size by a factor of $1/(N+1)$, cf. Gassner and Kopriva (2011), Section 5.

Trixi.jl provides such a CFL-based step size control. It is implemented as the callback StepsizeCallback.

stepsize_callback = StepsizeCallback(; cfl=1.0)

A suitable CFL number depends on many parameters such as the chosen grid, the integration algorithm and the polynomial degree of the spatial DG discretization. So, the optimal number for an example is mostly determined experimentally.

You can add this CFL-based step size control to your simulation like any other callback.

callbacks = CallbackSet(stepsize_callback)
 alg = CarpenterKennedy2N54(williamson_condition=false)
 solve(ode, alg;
       dt=1.0 # solve needs some value here but it will be overwritten by the stepsize_callback
@@ -23,5 +23,5 @@
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
  [1dea7af3] OrdinaryDiffEq v6.66.0
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`
-Info Packages marked with  have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

+ [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl` +Info Packages marked with have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/tutorials/upwind_fdsbp/index.html b/previews/PR1624/tutorials/upwind_fdsbp/index.html index 1f1539b787c..4d99993c6e3 100644 --- a/previews/PR1624/tutorials/upwind_fdsbp/index.html +++ b/previews/PR1624/tutorials/upwind_fdsbp/index.html @@ -1,5 +1,5 @@ -7 Upwind FD SBP schemes · Trixi.jl

7: Upwind FD SBP schemes

General tensor product SBP methods are supported via the DGMulti solver in a reasonably complete way, see the previous tutorial. Nevertheless, there is also experimental support for SBP methods with other solver and mesh types.

The first step is to set up an SBP operator. A classical (central) SBP operator can be created as follows.

using Trixi
+9 Upwind FD SBP schemes · Trixi.jl

9: Upwind FD SBP schemes

General tensor product SBP methods are supported via the DGMulti solver in a reasonably complete way, see the previous tutorial. Nevertheless, there is also experimental support for SBP methods with other solver and mesh types.

The first step is to set up an SBP operator. A classical (central) SBP operator can be created as follows.

using Trixi
 D_SBP = derivative_operator(SummationByPartsOperators.MattssonNordström2004(),
                             derivative_order=1, accuracy_order=2,
                             xmin=0.0, xmax=1.0, N=11)
SBP first-derivative operator of order 2 on a grid in [0.0, 1.0] using 11 nodes 
@@ -61,5 +61,5 @@
 Environment:
   JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
 Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
-  [9f78cca6] SummationByPartsOperators v0.5.52
-  [a7f1ee26] Trixi v0.6.6-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

+ [9f78cca6] SummationByPartsOperators v0.5.53 + [a7f1ee26] Trixi v0.7.1-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1624/visualization/index.html b/previews/PR1624/visualization/index.html index 1ab7b347a17..fdf79268dea 100644 --- a/previews/PR1624/visualization/index.html +++ b/previews/PR1624/visualization/index.html @@ -1,5 +1,5 @@ -Visualization · Trixi.jl

Visualization

There are two possible approaches to visualize results from Trixi.jl: either directly from the REPL using Plots.jl or with ParaView/VisIt by postprocessing Trixi.jl's output files with Trixi2Vtk.

Plots.jl [experimental]

By far the easiest and most convenient plotting approach is to use the powerful Plots.jl package to directly visualize Trixi.jl's results from the REPL. In the following, you will find more information on a number of topics for how to use Plots.jl together with Trixi.jl:

  1. Getting started
  2. Customizing plot results via a PlotData2D object
  3. Plotting a 3D solution as a 2D plot
  4. Creating a 1D plot
  5. Plotting a 2D or 3D solutions as a 1D plot
  6. Visualizing results during a simulation
Note

Plotting via Plots.jl is still considered an experimental feature and might change in any future releases.

Getting started

After running a simulation with Trixi.jl in the REPL, load the Plots package with

julia> using Plots

To visualize the solution, execute

julia> plot(sol)

Here we assume that sol holds the return value of the solve(...) method (with type SciMLBase.ODESolution), which is the default variable name when you use one of the example elixirs. This will generate a grid layout with one subplot for each solution variable, convenient for getting an overview of the current solution:

plot-sol

You can save the resulting file as a PNG image file by calling savefig(...) with an output file name that ends in .png, e.g.,

julia> savefig("solution-overview.png")

In Trixi.jl, two plot types are available: 2D heatmap plots and 1D line plots. If you use plot(sol), Trixi.jl will automatically choose the plot type that fits the dimensions of the sol input: 2D/3D data will be visualized as a heatmap, 1D data as a line plot. For more fine-grained control over what to plot, you can create such an object yourself, which can either be a PlotData2D or a PlotData1D object. For further details on both of these see below:

Customizing plot results via a PlotData2D object

For more fine-grained control over what to plot, first create a PlotData2D object by executing

julia> pd = PlotData2D(sol)
+Visualization · Trixi.jl

Visualization

There are two possible approaches to visualize results from Trixi.jl: either directly from the REPL using Plots.jl or with ParaView/VisIt by postprocessing Trixi.jl's output files with Trixi2Vtk.

Plots.jl [experimental]

By far the easiest and most convenient plotting approach is to use the powerful Plots.jl package to directly visualize Trixi.jl's results from the REPL. In the following, you will find more information on a number of topics for how to use Plots.jl together with Trixi.jl:

  1. Getting started
  2. Customizing plot results via a PlotData2D object
  3. Plotting a 3D solution as a 2D plot
  4. Creating a 1D plot
  5. Plotting a 2D or 3D solutions as a 1D plot
  6. Visualizing results during a simulation
Note

Plotting via Plots.jl is still considered an experimental feature and might change in any future releases.

Getting started

After running a simulation with Trixi.jl in the REPL, load the Plots package with

julia> using Plots

To visualize the solution, execute

julia> plot(sol)

Here we assume that sol holds the return value of the solve(...) method (with type SciMLBase.ODESolution), which is the default variable name when you use one of the example elixirs. This will generate a grid layout with one subplot for each solution variable, convenient for getting an overview of the current solution:

plot-sol

You can save the resulting file as a PNG image file by calling savefig(...) with an output file name that ends in .png, e.g.,

julia> savefig("solution-overview.png")

In Trixi.jl, two plot types are available: 2D heatmap plots and 1D line plots. If you use plot(sol), Trixi.jl will automatically choose the plot type that fits the dimensions of the sol input: 2D/3D data will be visualized as a heatmap, 1D data as a line plot. For more fine-grained control over what to plot, you can create such an object yourself, which can either be a PlotData2D or a PlotData1D object. For further details on both of these see below:

Customizing plot results via a PlotData2D object

For more fine-grained control over what to plot, first create a PlotData2D object by executing

julia> pd = PlotData2D(sol)
 julia> pd = PlotData2D(u, semi)

where u is an array containing the solution and semi is the semidiscretization. For example, if PlotData2D(sol.u[2], semi) is specified, this will create a PlotData2D instance from the 2nd saved time-step. If PlotData2D(sol(0.5), semi) is specified, it will construct a PlotData2D instance using OrdinaryDiffEq.jl's interpolation to evaluate the solution at time t=0.5.

This takes the results generated by Trixi.jl and stores them in a data format that can be understood by the Plots package, and pd holds all data relevant for plotting sol. You can pass variable names as strings to pd using a dictionary-like syntax, e.g.,

julia> plot(pd["rho"])

This will create a single 2D heatmap plot of the variable rho:

plot-rho

The default plot type and style can be overridden by passing any additional arguments that are understood by the Plots package. For example, to change the color scheme and add names to the axes, modify the previous command to

julia> plot(pd["rho"], seriescolor = :heat, xguide="x", yguide="y")

to yield

plot-rho-modified

For more details on the various format options for plot, please consult the Plots documentation.

In addition, you can plot the mesh lines on top of the solution variables by calling the getmesh(...) function on the PlotData2D object

julia> plot!(getmesh(pd)) # here we use `plot!` with an `!` to add to the previous plot

which modifies the previous plot to

plot-rho-modified-mesh

By default, PlotData2D will convert the conserved variables to primitive variables, but this can be changed by passing an appropriate conversion function in the solution_variables keyword argument, similar to the behavior of the SaveSolutionCallback:

julia> pd = PlotData2D(sol; solution_variables=cons2cons) # Plot conservative variables

There are several other keyword arguments that influence how the solution data is processed for visualization with the Plots package. A detailed explanation can be found in the docstring of the PlotData2D constructor.

Another way to change the appearance of a plot is to convert the solution to a uniformly refined mesh before plotting. This can be helpful, e.g., when trying different settings for a simulation with adaptive mesh refinement, where one would like to ignore the mesh changes when comparing solutions. This is achieved with adapt_to_mesh_level, which uses the mesh adaptation routines to adapt the solution to a uniform grid. For example, the AMR solution from above could be preprocessed with

julia> pd = PlotData2D(adapt_to_mesh_level(sol, 4)...)

When plotted together with the mesh, this will yield the following visualization:

plot-rho-uniform-mesh

Plotting a user-defined scalar field

To plot a scalar quantity, one can call plot(ScalarPlotData2D(u, semi)), where u is an array of nodal values of the scalar field to plot. The layout of u should match the layout of the x and y nodal coordinates of the respective solver. For example, after running trixi_include(joinpath("examples", "unstructured_2d_dgsem", "elixir_euler_wall_bc.jl")), the following can be used to plot the function f(x, y) = x * y:

x = view(semi.cache.elements.node_coordinates, 1, :, :, :)
 y = view(semi.cache.elements.node_coordinates, 2, :, :, :)
 plot(ScalarPlotData2D(x .* y, semi))

This produces the following plot:

scalar-plotting-example

This routine can be used to visualize scalar quantities which depend on the solution, such as the norm of a velocity vector or two-dimensional vorticity. For example, we can visualize vorticity for a compressible version of the Brown-Minion vortex problem:

julia> using Trixi, Plots
@@ -88,4 +88,4 @@
   -->
   

Trixi2Vtk

Trixi2Vtk converts Trixi.jl's .h5 output files to VTK files, which can be read by ParaView, VisIt, and other visualization tools. It automatically interpolates solution data from the original quadrature node locations to equidistant visualization nodes at a higher resolution, to make up for the loss of accuracy from going from a high-order polynomial representation to a piecewise constant representation in VTK.

In the Julia REPL, first load the package Trixi2Vtk

julia> using Trixi2Vtk

To process an HDF5 file generated by Trixi.jl, execute

julia> trixi2vtk(joinpath("out", "solution_000000.h5"), output_directory="out")

This will create two unstructured VTK files in the out subdirectory that can be opened with ParaView or VisIt: solution_000000.vtu contains the discontinuous Galerkin solution data while solution_000000_celldata.vtu holds any cell-based values such as the current AMR indicator or the cell refinement level.

"solution_000000_scalar_mesh"

This allows you to generate VTK files for solution, restart and mesh files. By default, Trixi2Vtk generates .vtu (unstructured VTK) files for both cell/element data (e.g., cell ids, element ids) and node data (e.g., solution variables). This format visualizes each cell with the same number of nodes, independent of its size. Alternatively, you can provide format=:vti as a keyword argument to trixi2vtk, which causes Trixi2Vtk to generate .vti (image data VTK) files for the solution files, while still using .vtu files for cell-/element-based data. In .vti files, a uniform resolution is used throughout the entire domain, resulting in different number of visualization nodes for each element. This can be advantageous to create publication-quality images, but increases the file size.

If you want to convert multiple solution/restart files at once, you can just supply multiple input files as the positional arguments to trixi2vtk, e.g.,

julia> trixi2vtk("out/solution_000000.h5", "out/solution_000040.h5")

You may also use file globbing to select a range of files based on filename patterns, e.g.,

julia> trixi2vtk("out/solution_*.h5")

to convert all solution files in the out/ directory or

julia> trixi2vtk("out/restart_00[0-9]000.h5")

to convert every one-thousandth restart file (out/restart_000000.h5, out/restart_001000.h5 etc.).

When multiple solution/restart files are provided, Trixi2Vtk will also generate a .pvd file, which allows ParaView to read all .vtu/.vti files at once and which uses the time attribute in solution/restart files to inform ParaView about the solution time. A comprehensive list of all possible arguments for trixi2vtk can be found in the Trixi2Vtk.jl API.

Further information regarding the development of Trixi2Vtk can be found in the development section.

Makie.jl [experimental]

In addition to Plots.jl support, Trixi.jl includes visualization utilities through Makie.jl. Trixi.jl provides Makie-based visualization options both for heatmap-type plots (similar to the Plots.jl recipes) as well as for interactive surface plots. Support is currently limited to the UnstructuredMesh2D type.

Note

Plotting via Makie.jl is still considered an experimental feature and might change in any future releases.

A Makie plot can be created as follows: after running a simulation with Trixi.jl in the REPL, load a Makie backend (for example, GLMakie or CairoMakie).

julia> using GLMakie

To visualize the solution and mesh with a heatmap-type plot, simply run

julia> plot(sol)
Note

Both Makie.jl and Plots.jl export plot, so if you load both libraries, you will have to specify which plot function to call via Plots.plot or Makie.plot.

As with Plots.jl recipes, one can view individual solution components by creating a PlotData2D object and indexing into it with the desired variable name

julia> pd = PlotData2D(sol)
 julia> plot(pd["rho"])

Unlike the Plots.jl recipe, mesh plotting is controlled using the keyword argument plot_mesh = false, e.g.,

julia> plot(sol; plot_mesh=false)

The plot command also returns figure and axis handles, which can be used to edit plot titles or labels:

julia> fig, axes = plot(sol)
-julia> axes[1,1].title = "New title for subplot (1,1)"

Trixi.jl also supports interactive surface plots using iplot. After executing

julia> trixi_include(joinpath("examples", "unstructured_2d_dgsem", "elixir_euler_wall_bc.jl"))

we can run

julia> iplot(sol)

This will open up an interactive visualization window:

makie-example

The plot can be rotated (click and hold), zoomed in and out (scroll up and down), and panned (hold right click and drag). Two toggle buttons control whether mesh lines are visible on top of and below the solution.

Both plot and iplot use colormap = :inferno by default. A different colormap can be selected by providing an appropriate keyword argument. For example, plot(sol, colormap=:blues) and iplot(sol, colormap=:blues) produce the following figures:

makie-plot-example makie-iplot-example

+julia> axes[1,1].title = "New title for subplot (1,1)"

Trixi.jl also supports interactive surface plots using iplot. After executing

julia> trixi_include(joinpath("examples", "unstructured_2d_dgsem", "elixir_euler_wall_bc.jl"))

we can run

julia> iplot(sol)

This will open up an interactive visualization window:

makie-example

The plot can be rotated (click and hold), zoomed in and out (scroll up and down), and panned (hold right click and drag). Two toggle buttons control whether mesh lines are visible on top of and below the solution.

Both plot and iplot use colormap = :inferno by default. A different colormap can be selected by providing an appropriate keyword argument. For example, plot(sol, colormap=:blues) and iplot(sol, colormap=:blues) produce the following figures:

makie-plot-example makie-iplot-example