From d08f18c8684c364eaa8a245192caa0dc3cde8c51 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Mon, 30 Oct 2023 07:41:04 +0000 Subject: [PATCH] build based on b70fabc --- previews/PR1693/.documenter-siteinfo.json | 1 + previews/PR1693/assets/documenter.js | 889 ++ previews/PR1693/assets/favicon.ico | Bin 0 -> 15406 bytes .../assets/solution_000040_scalar_resized.png | Bin 0 -> 94699 bytes .../PR1693/assets/themes/documenter-dark.css | 7 + .../PR1693/assets/themes/documenter-light.css | 9 + previews/PR1693/assets/themeswap.js | 84 + previews/PR1693/assets/trixi.drawio | 1 + previews/PR1693/assets/warner.js | 52 + previews/PR1693/authors/index.html | 2 + previews/PR1693/callbacks/index.html | 15 + previews/PR1693/code_of_conduct/index.html | 2 + previews/PR1693/contributing/index.html | 38 + previews/PR1693/conventions/index.html | 2 + previews/PR1693/development/index.html | 42 + previews/PR1693/github-git/index.html | 44 + previews/PR1693/index.html | 97 + previews/PR1693/license/index.html | 2 + .../PR1693/meshes/dgmulti_mesh/index.html | 8 + previews/PR1693/meshes/p4est_mesh/index.html | 136 + .../PR1693/meshes/structured_mesh/index.html | 2 + previews/PR1693/meshes/tree_mesh/index.html | 2 + .../meshes/unstructured_quad_mesh/index.html | 79 + previews/PR1693/overview/index.html | 2 + previews/PR1693/parallelization/index.html | 36 + previews/PR1693/performance/index.html | 55 + previews/PR1693/reference-trixi/index.html | 573 + .../PR1693/reference-trixi2vtk/index.html | 6 + previews/PR1693/restart/index.html | 6 + previews/PR1693/search_index.js | 3 + previews/PR1693/siteinfo.js | 1 + previews/PR1693/styleguide/index.html | 2 + previews/PR1693/testing/index.html | 6 + previews/PR1693/time_integration/index.html | 2 + previews/PR1693/troubleshooting/index.html | 47 + .../PR1693/tutorials/DGMulti_1/3d495c42.svg | 4921 +++++++++ .../PR1693/tutorials/DGMulti_1/6024307b.svg | 4816 +++++++++ .../PR1693/tutorials/DGMulti_1/9849c477.svg | 8384 +++++++++++++++ .../PR1693/tutorials/DGMulti_1/9b757e60.svg | 6315 +++++++++++ .../PR1693/tutorials/DGMulti_1/d975fe8c.svg | 5566 ++++++++++ .../PR1693/tutorials/DGMulti_1/e3e6993d.svg | 6306 +++++++++++ .../PR1693/tutorials/DGMulti_1/index.html | 308 + .../PR1693/tutorials/DGMulti_2/index.html | 36 + .../tutorials/DGSEM_FluxDiff/8bec16c8.svg | 4089 +++++++ .../tutorials/DGSEM_FluxDiff/b9afdef1.svg | 2845 +++++ .../tutorials/DGSEM_FluxDiff/index.html | 166 + .../adaptive_mesh_refinement/513b4dc2.svg | 1518 +++ .../adaptive_mesh_refinement/index.html | 91 + .../adding_new_parabolic_terms/a8346e89.svg | 756 ++ .../adding_new_parabolic_terms/index.html | 94 + .../adding_new_scalar_equations/018f0bc9.svg | 44 + .../adding_new_scalar_equations/049e0dba.svg | 43 + .../adding_new_scalar_equations/3b8bfadd.svg | 47 + .../adding_new_scalar_equations/528e5942.svg | 43 + .../adding_new_scalar_equations/ed13c2c1.svg | 43 + .../adding_new_scalar_equations/index.html | 205 + .../4831ede8.svg | 80 + .../index.html | 243 + .../custom_semidiscretization/1050cedc.svg | 46 + .../custom_semidiscretization/12540b46.svg | 48 + .../custom_semidiscretization/4c98d83d.svg | 50 + .../custom_semidiscretization/feae645f.svg | 50 + .../custom_semidiscretization/fef3e580.svg | 50 + .../custom_semidiscretization/index.html | 597 ++ .../differentiable_programming/1e80339b.svg | 1077 ++ .../differentiable_programming/45b4b354.svg | 46 + .../differentiable_programming/5e4a7a2d.svg | 1582 +++ .../differentiable_programming/6cf2fe25.svg | 809 ++ .../differentiable_programming/71b488ae.svg | 46 + .../differentiable_programming/7c43661a.svg | 307 + .../differentiable_programming/8639c03d.svg | 2100 ++++ .../differentiable_programming/f909d430.svg | 815 ++ .../differentiable_programming/index.html | 209 + .../tutorials/hohqmesh_tutorial/index.html | 305 + .../PR1693/tutorials/introduction/index.html | 2 + .../non_periodic_boundaries/0ecc56bf.svg | 50 + .../non_periodic_boundaries/c37303c4.gif | Bin 0 -> 1128612 bytes .../non_periodic_boundaries/index.html | 89 + .../tutorials/notebooks/DGMulti_1.ipynb | 478 + .../tutorials/notebooks/DGMulti_2.ipynb | 157 + .../tutorials/notebooks/DGSEM_FluxDiff.ipynb | 525 + .../notebooks/adaptive_mesh_refinement.ipynb | 410 + .../adding_new_parabolic_terms.ipynb | 309 + .../adding_new_scalar_equations.ipynb | 451 + .../adding_nonconservative_equation.ipynb | 455 + .../notebooks/custom_semidiscretization.ipynb | 673 ++ .../differentiable_programming.ipynb | 956 ++ .../notebooks/hohqmesh_tutorial.ipynb | 1034 ++ .../notebooks/non_periodic_boundaries.ipynb | 346 + .../tutorials/notebooks/parabolic_terms.ipynb | 264 + .../scalar_linear_advection_1d.ipynb | 976 ++ .../tutorials/notebooks/shock_capturing.ipynb | 503 + .../notebooks/structured_mesh_mapping.ipynb | 451 + .../tutorials/notebooks/time_stepping.ipynb | 195 + .../tutorials/notebooks/upwind_fdsbp.ipynb | 219 + .../out/ice_cream_curved_sides.control | 65 + .../tutorials/out/ice_cream_curved_sides.mesh | 1778 ++++ .../tutorials/out/ice_cream_curved_sides.tec | 474 + .../tutorials/out/ice_cream_curved_sides.txt | 222 + .../out/ice_cream_straight_sides.control | 57 + .../out/ice_cream_straight_sides.mesh | 1722 +++ .../out/ice_cream_straight_sides.tec | 550 + .../out/ice_cream_straight_sides.txt | 258 + previews/PR1693/tutorials/out/mesh.h5 | Bin 0 -> 1136 bytes .../PR1693/tutorials/out/restart_000050.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/restart_000100.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/restart_000150.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/restart_000180.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000.pvd | 24 + .../PR1693/tutorials/out/solution_000000.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000000.vtu | Bin 0 -> 12687 bytes .../out/solution_000000_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000010.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000010.vtu | Bin 0 -> 18966 bytes .../out/solution_000010_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000020.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000020.vtu | Bin 0 -> 19000 bytes .../out/solution_000020_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000030.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000030.vtu | Bin 0 -> 19045 bytes .../out/solution_000030_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000040.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000040.vtu | Bin 0 -> 19091 bytes .../out/solution_000040_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000050.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000050.vtu | Bin 0 -> 19110 bytes .../out/solution_000050_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000060.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000060.vtu | Bin 0 -> 19131 bytes .../out/solution_000060_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000065.h5 | Bin 0 -> 205696 bytes .../PR1693/tutorials/out/solution_000070.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000070.vtu | Bin 0 -> 19148 bytes .../out/solution_000070_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000080.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000080.vtu | Bin 0 -> 19171 bytes .../out/solution_000080_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000090.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000090.vtu | Bin 0 -> 19175 bytes .../out/solution_000090_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000100.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000100.vtu | Bin 0 -> 19213 bytes .../out/solution_000100_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000110.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000110.vtu | Bin 0 -> 19188 bytes .../out/solution_000110_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000120.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000120.vtu | Bin 0 -> 19147 bytes .../out/solution_000120_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000130.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000130.vtu | Bin 0 -> 19172 bytes .../out/solution_000130_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000140.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000140.vtu | Bin 0 -> 19171 bytes .../out/solution_000140_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000150.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000150.vtu | Bin 0 -> 19176 bytes .../out/solution_000150_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000160.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000160.vtu | Bin 0 -> 19165 bytes .../out/solution_000160_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000170.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000170.vtu | Bin 0 -> 19202 bytes .../out/solution_000170_celldata.vtu | Bin 0 -> 6739 bytes .../PR1693/tutorials/out/solution_000180.h5 | Bin 0 -> 11976 bytes .../PR1693/tutorials/out/solution_000180.vtu | Bin 0 -> 19180 bytes .../out/solution_000180_celldata.vtu | Bin 0 -> 6739 bytes .../tutorials/out/solution_000_celldata.pvd | 24 + .../tutorials/parabolic_terms/f848ac8c.svg | 731 ++ .../tutorials/parabolic_terms/index.html | 130 + .../scalar_linear_advection_1d/1583df04.svg | 54 + .../scalar_linear_advection_1d/1b24f61e.svg | 46 + .../scalar_linear_advection_1d/79ffa393.svg | 48 + .../scalar_linear_advection_1d/9a1666e7.svg | 46 + .../scalar_linear_advection_1d/a25b2fa9.svg | 46 + .../scalar_linear_advection_1d/f04cc793.svg | 48 + .../scalar_linear_advection_1d/index.html | 294 + .../tutorials/shock_capturing/784b2b3f.svg | 4419 ++++++++ .../tutorials/shock_capturing/index.html | 113 + .../structured_mesh_mapping/867345ad.svg | 3800 +++++++ .../structured_mesh_mapping/b29bce5f.svg | 9475 +++++++++++++++++ .../structured_mesh_mapping/e29b320e.svg | 5575 ++++++++++ .../structured_mesh_mapping/index.html | 198 + .../PR1693/tutorials/time_stepping/index.html | 26 + .../PR1693/tutorials/upwind_fdsbp/index.html | 65 + previews/PR1693/visualization/index.html | 91 + 186 files changed, 96271 insertions(+) create mode 100644 previews/PR1693/.documenter-siteinfo.json create mode 100644 previews/PR1693/assets/documenter.js create mode 100644 previews/PR1693/assets/favicon.ico create mode 100644 previews/PR1693/assets/solution_000040_scalar_resized.png create mode 100644 previews/PR1693/assets/themes/documenter-dark.css create mode 100644 previews/PR1693/assets/themes/documenter-light.css create mode 100644 previews/PR1693/assets/themeswap.js create mode 100644 previews/PR1693/assets/trixi.drawio create mode 100644 previews/PR1693/assets/warner.js create mode 100644 previews/PR1693/authors/index.html create mode 100644 previews/PR1693/callbacks/index.html create mode 100644 previews/PR1693/code_of_conduct/index.html create mode 100644 previews/PR1693/contributing/index.html create mode 100644 previews/PR1693/conventions/index.html create mode 100644 previews/PR1693/development/index.html create mode 100644 previews/PR1693/github-git/index.html create mode 100644 previews/PR1693/index.html create mode 100644 previews/PR1693/license/index.html create mode 100644 previews/PR1693/meshes/dgmulti_mesh/index.html create mode 100644 previews/PR1693/meshes/p4est_mesh/index.html create mode 100644 previews/PR1693/meshes/structured_mesh/index.html create mode 100644 previews/PR1693/meshes/tree_mesh/index.html create mode 100644 previews/PR1693/meshes/unstructured_quad_mesh/index.html create mode 100644 previews/PR1693/overview/index.html create mode 100644 previews/PR1693/parallelization/index.html create mode 100644 previews/PR1693/performance/index.html create mode 100644 previews/PR1693/reference-trixi/index.html create mode 100644 previews/PR1693/reference-trixi2vtk/index.html create mode 100644 previews/PR1693/restart/index.html create mode 100644 previews/PR1693/search_index.js create mode 100644 previews/PR1693/siteinfo.js create mode 100644 previews/PR1693/styleguide/index.html create mode 100644 previews/PR1693/testing/index.html create mode 100644 previews/PR1693/time_integration/index.html create mode 100644 previews/PR1693/troubleshooting/index.html create mode 100644 previews/PR1693/tutorials/DGMulti_1/3d495c42.svg create mode 100644 previews/PR1693/tutorials/DGMulti_1/6024307b.svg create mode 100644 previews/PR1693/tutorials/DGMulti_1/9849c477.svg create mode 100644 previews/PR1693/tutorials/DGMulti_1/9b757e60.svg create mode 100644 previews/PR1693/tutorials/DGMulti_1/d975fe8c.svg create mode 100644 previews/PR1693/tutorials/DGMulti_1/e3e6993d.svg create mode 100644 previews/PR1693/tutorials/DGMulti_1/index.html create mode 100644 previews/PR1693/tutorials/DGMulti_2/index.html create mode 100644 previews/PR1693/tutorials/DGSEM_FluxDiff/8bec16c8.svg create mode 100644 previews/PR1693/tutorials/DGSEM_FluxDiff/b9afdef1.svg create mode 100644 previews/PR1693/tutorials/DGSEM_FluxDiff/index.html create mode 100644 previews/PR1693/tutorials/adaptive_mesh_refinement/513b4dc2.svg create mode 100644 previews/PR1693/tutorials/adaptive_mesh_refinement/index.html create mode 100644 previews/PR1693/tutorials/adding_new_parabolic_terms/a8346e89.svg create mode 100644 previews/PR1693/tutorials/adding_new_parabolic_terms/index.html create mode 100644 previews/PR1693/tutorials/adding_new_scalar_equations/018f0bc9.svg create mode 100644 previews/PR1693/tutorials/adding_new_scalar_equations/049e0dba.svg create mode 100644 previews/PR1693/tutorials/adding_new_scalar_equations/3b8bfadd.svg create mode 100644 previews/PR1693/tutorials/adding_new_scalar_equations/528e5942.svg create mode 100644 previews/PR1693/tutorials/adding_new_scalar_equations/ed13c2c1.svg create mode 100644 previews/PR1693/tutorials/adding_new_scalar_equations/index.html create mode 100644 previews/PR1693/tutorials/adding_nonconservative_equation/4831ede8.svg create mode 100644 previews/PR1693/tutorials/adding_nonconservative_equation/index.html create mode 100644 previews/PR1693/tutorials/custom_semidiscretization/1050cedc.svg create mode 100644 previews/PR1693/tutorials/custom_semidiscretization/12540b46.svg create mode 100644 previews/PR1693/tutorials/custom_semidiscretization/4c98d83d.svg create mode 100644 previews/PR1693/tutorials/custom_semidiscretization/feae645f.svg create mode 100644 previews/PR1693/tutorials/custom_semidiscretization/fef3e580.svg create mode 100644 previews/PR1693/tutorials/custom_semidiscretization/index.html create mode 100644 previews/PR1693/tutorials/differentiable_programming/1e80339b.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/45b4b354.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/5e4a7a2d.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/6cf2fe25.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/71b488ae.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/7c43661a.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/8639c03d.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/f909d430.svg create mode 100644 previews/PR1693/tutorials/differentiable_programming/index.html create mode 100644 previews/PR1693/tutorials/hohqmesh_tutorial/index.html create mode 100644 previews/PR1693/tutorials/introduction/index.html create mode 100644 previews/PR1693/tutorials/non_periodic_boundaries/0ecc56bf.svg create mode 100644 previews/PR1693/tutorials/non_periodic_boundaries/c37303c4.gif create mode 100644 previews/PR1693/tutorials/non_periodic_boundaries/index.html create mode 100644 previews/PR1693/tutorials/notebooks/DGMulti_1.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/DGMulti_2.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/DGSEM_FluxDiff.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/adaptive_mesh_refinement.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/adding_new_parabolic_terms.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/adding_new_scalar_equations.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/adding_nonconservative_equation.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/custom_semidiscretization.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/differentiable_programming.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/hohqmesh_tutorial.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/non_periodic_boundaries.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/parabolic_terms.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/scalar_linear_advection_1d.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/shock_capturing.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/structured_mesh_mapping.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/time_stepping.ipynb create mode 100644 previews/PR1693/tutorials/notebooks/upwind_fdsbp.ipynb create mode 100644 previews/PR1693/tutorials/out/ice_cream_curved_sides.control create mode 100644 previews/PR1693/tutorials/out/ice_cream_curved_sides.mesh create mode 100644 previews/PR1693/tutorials/out/ice_cream_curved_sides.tec create mode 100644 previews/PR1693/tutorials/out/ice_cream_curved_sides.txt create mode 100644 previews/PR1693/tutorials/out/ice_cream_straight_sides.control create mode 100644 previews/PR1693/tutorials/out/ice_cream_straight_sides.mesh create mode 100644 previews/PR1693/tutorials/out/ice_cream_straight_sides.tec create mode 100644 previews/PR1693/tutorials/out/ice_cream_straight_sides.txt create mode 100644 previews/PR1693/tutorials/out/mesh.h5 create mode 100644 previews/PR1693/tutorials/out/restart_000050.h5 create mode 100644 previews/PR1693/tutorials/out/restart_000100.h5 create mode 100644 previews/PR1693/tutorials/out/restart_000150.h5 create mode 100644 previews/PR1693/tutorials/out/restart_000180.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000.pvd create mode 100644 previews/PR1693/tutorials/out/solution_000000.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000000.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000000_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000010.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000010.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000010_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000020.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000020.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000020_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000030.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000030.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000030_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000040.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000040.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000040_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000050.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000050.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000050_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000060.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000060.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000060_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000065.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000070.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000070.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000070_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000080.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000080.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000080_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000090.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000090.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000090_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000100.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000100.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000100_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000110.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000110.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000110_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000120.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000120.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000120_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000130.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000130.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000130_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000140.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000140.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000140_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000150.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000150.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000150_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000160.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000160.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000160_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000170.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000170.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000170_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000180.h5 create mode 100644 previews/PR1693/tutorials/out/solution_000180.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000180_celldata.vtu create mode 100644 previews/PR1693/tutorials/out/solution_000_celldata.pvd create mode 100644 previews/PR1693/tutorials/parabolic_terms/f848ac8c.svg create mode 100644 previews/PR1693/tutorials/parabolic_terms/index.html create mode 100644 previews/PR1693/tutorials/scalar_linear_advection_1d/1583df04.svg create mode 100644 previews/PR1693/tutorials/scalar_linear_advection_1d/1b24f61e.svg create mode 100644 previews/PR1693/tutorials/scalar_linear_advection_1d/79ffa393.svg create mode 100644 previews/PR1693/tutorials/scalar_linear_advection_1d/9a1666e7.svg create mode 100644 previews/PR1693/tutorials/scalar_linear_advection_1d/a25b2fa9.svg create mode 100644 previews/PR1693/tutorials/scalar_linear_advection_1d/f04cc793.svg create mode 100644 previews/PR1693/tutorials/scalar_linear_advection_1d/index.html create mode 100644 previews/PR1693/tutorials/shock_capturing/784b2b3f.svg create mode 100644 previews/PR1693/tutorials/shock_capturing/index.html create mode 100644 previews/PR1693/tutorials/structured_mesh_mapping/867345ad.svg create mode 100644 previews/PR1693/tutorials/structured_mesh_mapping/b29bce5f.svg create mode 100644 previews/PR1693/tutorials/structured_mesh_mapping/e29b320e.svg create mode 100644 previews/PR1693/tutorials/structured_mesh_mapping/index.html create mode 100644 previews/PR1693/tutorials/time_stepping/index.html create mode 100644 previews/PR1693/tutorials/upwind_fdsbp/index.html create mode 100644 previews/PR1693/visualization/index.html diff --git a/previews/PR1693/.documenter-siteinfo.json b/previews/PR1693/.documenter-siteinfo.json new file mode 100644 index 00000000000..c38d3e7d90c --- /dev/null +++ b/previews/PR1693/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.9.3","generation_timestamp":"2023-10-30T07:40:03","documenter_version":"1.1.2"}} \ No newline at end of file diff --git a/previews/PR1693/assets/documenter.js b/previews/PR1693/assets/documenter.js new file mode 100644 index 00000000000..f5311607bf5 --- /dev/null +++ b/previews/PR1693/assets/documenter.js @@ -0,0 +1,889 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
Type something to get started!
+ `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
`; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
${count} result(s)
`; + + search_result_container = ` +
+ ${modal_filters} + ${search_divider} + ${result_count} +
+ ${search_results} +
+
+ `; + } else { + search_result_container = ` +
+ ${modal_filters} + ${search_divider} +
0 result(s)
+
+
No result found!
+ `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
+ Filters: + ${str} +
+ `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
`; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
+
${result.title}
+
${result.category}
+
+

+ ${display_result} +

+
+ ${display_link} +
+
+ ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let search_modal_header = ` + +`; + +let initial_search_body = ` +
Type something to get started!
+`; + +let search_modal_footer = ` + +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
Type something to get started!
+ `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/previews/PR1693/assets/favicon.ico b/previews/PR1693/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..be7e49a9c80a73367beb61669233f572ce97c2a2 GIT binary patch literal 15406 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 UeY0mdNKupipZ>3bf2@K30B`TKH2?qr literal 0 HcmV?d00001 diff --git a/previews/PR1693/assets/solution_000040_scalar_resized.png b/previews/PR1693/assets/solution_000040_scalar_resized.png new file mode 100644 index 0000000000000000000000000000000000000000..e002208c46a98255909e1c7f2a46d6cc4d23c690 GIT binary patch literal 94699 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 X*Z*EY6QBbNtpFn@r7T$sJ-z)8BBdcc literal 0 HcmV?d00001 diff --git a/previews/PR1693/assets/themes/documenter-dark.css b/previews/PR1693/assets/themes/documenter-dark.css new file mode 100644 index 00000000000..ec054ecc189 --- /dev/null +++ b/previews/PR1693/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/previews/PR1693/assets/themes/documenter-light.css b/previews/PR1693/assets/themes/documenter-light.css new file mode 100644 index 00000000000..1262ec5063f --- /dev/null +++ b/previews/PR1693/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/previews/PR1693/assets/themeswap.js b/previews/PR1693/assets/themeswap.js new file mode 100644 index 00000000000..9f5eebe6aa2 --- /dev/null +++ b/previews/PR1693/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/previews/PR1693/assets/trixi.drawio b/previews/PR1693/assets/trixi.drawio new file mode 100644 index 00000000000..f13fe4a96ce --- /dev/null +++ b/previews/PR1693/assets/trixi.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/previews/PR1693/assets/warner.js b/previews/PR1693/assets/warner.js new file mode 100644 index 00000000000..3f6f5d0083a --- /dev/null +++ b/previews/PR1693/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/previews/PR1693/authors/index.html b/previews/PR1693/authors/index.html new file mode 100644 index 00000000000..33be091bcf5 --- /dev/null +++ b/previews/PR1693/authors/index.html @@ -0,0 +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
diff --git a/previews/PR1693/callbacks/index.html b/previews/PR1693/callbacks/index.html new file mode 100644 index 00000000000..396296b53ea --- /dev/null +++ b/previews/PR1693/callbacks/index.html @@ -0,0 +1,15 @@ + +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
+-1.0 0.5

you can create a time series callback with

using DelimitedFiles: readdlm
+time_series = TimeSeriesCallback(semi, readdlm("points.dat"))

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

julia> using Trixi, Plots
+
+julia> trixi_include(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_acoustics_gaussian_source.jl"))
+
+julia> pd1 = PlotData1D(time_series, 1)
+
+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.

diff --git a/previews/PR1693/code_of_conduct/index.html b/previews/PR1693/code_of_conduct/index.html new file mode 100644 index 00000000000..b7fc4b86c34 --- /dev/null +++ b/previews/PR1693/code_of_conduct/index.html @@ -0,0 +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.

diff --git a/previews/PR1693/contributing/index.html b/previews/PR1693/contributing/index.html new file mode 100644 index 00000000000..003a6e09327 --- /dev/null +++ b/previews/PR1693/contributing/index.html @@ -0,0 +1,38 @@ + +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.
+1 Letterman Drive
+Suite D4700
+San Francisco, CA, 94129
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+
+Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+(a) The contribution was created in whole or in part by me and I
+    have the right to submit it under the open source license
+    indicated in the file; or
+
+(b) The contribution is based upon previous work that, to the best
+    of my knowledge, is covered under an appropriate open source
+    license and I have the right under that license to submit that
+    work with modifications, whether created in whole or in part
+    by me, under the same open source license (unless I am
+    permitted to submit under a different license), as indicated
+    in the file; or
+
+(c) The contribution was provided directly to me by some other
+    person who certified (a), (b) or (c) and I have not modified
+    it.
+
+(d) I understand and agree that this project and the contribution
+    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.
diff --git a/previews/PR1693/conventions/index.html b/previews/PR1693/conventions/index.html new file mode 100644 index 00000000000..322557108fb --- /dev/null +++ b/previews/PR1693/conventions/index.html @@ -0,0 +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.
diff --git a/previews/PR1693/development/index.html b/previews/PR1693/development/index.html new file mode 100644 index 00000000000..d523ec61173 --- /dev/null +++ b/previews/PR1693/development/index.html @@ -0,0 +1,42 @@ + +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
    +
    +  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.
    +
    +  Examples
    +  ≡≡≡≡≡≡≡≡≡≡
    +
    +  julia> trixi_include(@__MODULE__, default_example(), tspan=(0.0, 0.1))
    +  [...]
    +
    +  julia> sol.t[end]
    +  0.1
  • You can copy and paste REPL history including julia> prompts into the REPL.

  • Use tab completion in the REPL, both for names of functions/types/variables and for function arguments.

    julia> flux_ranocha( # and TAB
    +flux_ranocha(u_ll, u_rr, orientation::Integer, equations::CompressibleEulerEquations1D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_1d.jl:390
    +flux_ranocha(u_ll, u_rr, orientation::Integer, equations::CompressibleEulerEquations2D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_2d.jl:839
    +[...]
  • Use methodswith to discover methods associated to a given type etc.

    julia> methodswith(CompressibleEulerEquations2D)
    +[1] initial_condition_convergence_test(x, t, equations::CompressibleEulerEquations2D) in Trixi at ~/.julia/dev/Trixi/src/equations/compressible_euler_2d.jl:51
    +[...]
  • Use @which (or @edit) for method calls.

    julia> @which trixi_include(default_example())
    +trixi_include(elixir::AbstractString; kwargs...) in Trixi at ~/.julia/dev/Trixi/src/auxiliary/special_elixirs.jl:36
  • Use apropos to search through the documentation and docstrings.

    julia> apropos("MHD")
    +Trixi.IdealGlmMhdEquations3D
    +Trixi.IdealGlmMhdMulticomponentEquations2D
    +Trixi.calc_fast_wavespeed_roe
    +Trixi.IdealGlmMhdEquations1D
    +Trixi.initial_condition_constant
    +Trixi.flux_nonconservative_powell
    +Trixi.GlmSpeedCallback
    +Trixi.flux_derigs_etal
    +Trixi.flux_hindenlang_gassner
    +Trixi.initial_condition_convergence_test
    +Trixi.min_max_speed_naive
    +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
diff --git a/previews/PR1693/github-git/index.html b/previews/PR1693/github-git/index.html new file mode 100644 index 00000000000..e8187ad5646 --- /dev/null +++ b/previews/PR1693/github-git/index.html @@ -0,0 +1,44 @@ + +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
+# create a new branch for a cool new feature, bug fix, ...
+git checkout -b YOUR_BRANCH_NAME
+# do some work and push it to your fork
+git push -u myfork
+# go to https://github.com/trixi-framework/Trixi.jl/pull
+# and create a PR from your new branch
Why using pull requests?

Immediately 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.

Make changes

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.

Avoid committing unwanted files

When 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.

Keep your branch in sync with main

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:

  1. 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.
  2. Execute git fetch to get the latest changes from the repository.
  3. Make sure you are in the correct branch by checking the output of git status or by running git checkout yourbranch.
  4. Merge 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.

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.

Prepare for review

If you feel like your branch is ready to be merged to main, prepare it for review. That is, you should

  • merge the current main to your branch
  • run tests if available, but at least ensure that you did not accidentally change the results for one of the existing example elixirs
  • properly comment your code
  • delete 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)
  • remove debug statements
  • add a elixir_xxx.jl that uses your feature (only relevant for new features)
  • make sure your code formatting adheres to the Style guide
  • describe changes in NEWS.md if appropriate

After you are confident that your branch is cleaned up properly, commit all changes and push them to the repository.

Get reviewed

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.

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.

Merge branch

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).

Update your working copy

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:

  1. Update your clone by running git fetch.
  2. Check out main using git checkout main.
  3. Delete merged branch locally with git branch -d yourbranch.
  4. Remove local references to deleted remote branch by executing git remote prune origin.

You can now proceed with your next changes by starting again at the top.

Using Git

Resources for learning Git

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):

Tips and tricks

This is an unordered collection of different tips and tricks that can be helpful while working with Git. As usual, your mileage might vary.

Undo last commit

If you made a mistake in your last commit, e.g., by committing an unwanted file, you can undo the latest commit by running

git reset HEAD~

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.

Remove large file from repository

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.

Large files

You should never try to fix this yourself, as it potentially disrupts/destroys the work of others!

Based on the instructions found here and here, the following steps need to be taken (as documented for GitLab in issue #33):

  1. Tell everyone to commit and push their changes to the repository.

  2. Fix the branch in which the file was committed by removing it and committing the removal. This is especially important on main.

  3. Perform the following steps to clean up the Git repository:

    cd /tmp
    +
    +# Download bfg-1.13.0.jar from https://rtyley.github.io/bfg-repo-cleaner/
    +
    +# Get fresh clone of repo (so you can throw it away in case there is a problem)
    +git clone --mirror git@github.com:trixi-framework/Trixi.jl.git
    +
    +# Clean up repo of all files larger than 10M
    +java -jar bfg-1.13.0.jar --strip-blobs-bigger-than 10M Trixi.jl.git
    +
    +# Enter repo
    +cd Trixi.jl.git
    +
    +# Clean up reflog and force aggressive garbage collection
    +git reflog expire --expire=now --all && git gc --prune=now --aggressive
    +
    +# Push changes
    +git push
    +
    +# Delete clone
    +rm -rf Trixi.jl.git
  4. Tell everyone to clean up their local working copies by performing the following steps (also do this yourself):

    # Enter repo
    +cd Trixi.jl
    +
    +# Get current changes
    +git fetch
    +
    +# Check out the fixed branch
    +git checkout branchname
    +
    +# IMPORTANT: Do a rebase instead of a pull!
    +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.

diff --git a/previews/PR1693/index.html b/previews/PR1693/index.html new file mode 100644 index 00000000000..b52f9c2165d --- /dev/null +++ b/previews/PR1693/index.html @@ -0,0 +1,97 @@ + +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 hyperbolic 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
    • 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
  • 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
+mkdir run
+cd run
+julia --project=. -e 'using Pkg; Pkg.develop(PackageSpec(path=".."))'

If you installed Trixi.jl this way, you always have to start Julia with the --project flag set to your run directory, e.g.,

julia --project=.

if already inside the run directory.

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.

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:

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

Note that the postprocessing tools Trixi2Vtk.jl and Plots.jl are optional and can be omitted.

Example: Installing Trixi.jl as a package

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).

Usage

In the Julia REPL, first load the package Trixi.jl

julia> using Trixi

Then start a simulation by executing

julia> trixi_include(default_example())

Please be patient since Julia will compile the code just before running it. To visualize the results, load the package Plots

julia> using Plots

and generate a heatmap plot of the results with

julia> plot(sol) # No trailing semicolon, otherwise no plot is shown

This will open a new window with a 2D visualization of the final solution:

image

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(...).

Example: Running a simulation with Trixi.jl

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.

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.

Performing a convergence analysis

To automatically determine the experimental order of convergence (EOC) for a given setup, execute

julia> convergence_test(default_example(), 4)

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:

[...]
+l2
+scalar
+error     EOC
+9.14e-06  -
+5.69e-07  4.01
+3.55e-08  4.00
+2.22e-09  4.00
+
+mean      4.00
+--------------------------------------------------------------------------------
+linf
+scalar
+error     EOC
+6.44e-05  -
+4.11e-06  3.97
+2.58e-07  3.99
+1.62e-08  4.00
+
+mean      3.99
+--------------------------------------------------------------------------------

An example with multiple variables looks like this:

julia> convergence_test(joinpath(examples_dir(), "tree_2d_dgsem", "elixir_euler_source_terms.jl"), 3)
[...]
+l2
+rho                 rho_v1              rho_v2              rho_e
+error     EOC       error     EOC       error     EOC       error     EOC
+9.32e-07  -         1.42e-06  -         1.42e-06  -         4.82e-06  -
+7.03e-08  3.73      9.53e-08  3.90      9.53e-08  3.90      3.30e-07  3.87
+4.65e-09  3.92      6.09e-09  3.97      6.09e-09  3.97      2.12e-08  3.96
+
+mean      3.82      mean      3.93      mean      3.93      mean      3.91
+--------------------------------------------------------------------------------
+linf
+rho                 rho_v1              rho_v2              rho_e
+error     EOC       error     EOC       error     EOC       error     EOC
+9.58e-06  -         1.17e-05  -         1.17e-05  -         4.89e-05  -
+6.23e-07  3.94      7.48e-07  3.97      7.48e-07  3.97      3.22e-06  3.92
+4.05e-08  3.94      4.97e-08  3.91      4.97e-08  3.91      2.10e-07  3.94
+
+mean      3.94      mean      3.94      mean      3.94      mean      3.93
+--------------------------------------------------------------------------------

Showcase of advanced features

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.

Referencing

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:

@article{ranocha2022adaptive,
+  title={Adaptive numerical simulations with {T}rixi.jl:
+         {A} case study of {J}ulia for scientific computing},
+  author={Ranocha, Hendrik and Schlottke-Lakemper, Michael and Winters, Andrew Ross
+          and Faulhaber, Erik and Chan, Jesse and Gassner, Gregor},
+  journal={Proceedings of the JuliaCon Conferences},
+  volume={1},
+  number={1},
+  pages={77},
+  year={2022},
+  doi={10.21105/jcon.00077},
+  eprint={2108.06476},
+  eprinttype={arXiv},
+  eprintclass={cs.MS}
+}
+
+@article{schlottkelakemper2021purely,
+  title={A purely hyperbolic discontinuous {G}alerkin approach for
+         self-gravitating gas dynamics},
+  author={Schlottke-Lakemper, Michael and Winters, Andrew R and
+          Ranocha, Hendrik and Gassner, Gregor J},
+  journal={Journal of Computational Physics},
+  pages={110467},
+  year={2021},
+  month={06},
+  volume={442},
+  publisher={Elsevier},
+  doi={10.1016/j.jcp.2021.110467},
+  eprint={2008.10593},
+  eprinttype={arXiv},
+  eprintclass={math.NA}
+}

In addition, you can also refer to Trixi.jl directly as

@misc{schlottkelakemper2020trixi,
+  title={{T}rixi.jl: {A}daptive high-order numerical simulations
+         of hyperbolic {PDE}s in {J}ulia},
+  author={Schlottke-Lakemper, Michael and Gassner, Gregor J and
+          Ranocha, Hendrik and Winters, Andrew R and Chan, Jesse},
+  year={2021},
+  month={09},
+  howpublished={\url{https://github.com/trixi-framework/Trixi.jl}},
+  doi={10.5281/zenodo.3996439}
+}

Authors

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.

License and contributing

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.

Acknowledgments

funding-logo

This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) under Germany's Excellence Strategy EXC 2044-390685587, Mathematics Münster: Dynamics-Geometry-Structure.

This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) through the research unit FOR 5409 "Structure-Preserving Numerical Methods for Bulk- and Interface Coupling of Heterogeneous Models (SNuBIC)" (project number 463312734).

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 under awards DMS-1719818 and DMS-1943186.

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

diff --git a/previews/PR1693/license/index.html b/previews/PR1693/license/index.html new file mode 100644 index 00000000000..0a9e2ce1108 --- /dev/null +++ b/previews/PR1693/license/index.html @@ -0,0 +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.

diff --git a/previews/PR1693/meshes/dgmulti_mesh/index.html b/previews/PR1693/meshes/dgmulti_mesh/index.html new file mode 100644 index 00000000000..2e0a1155bf6 --- /dev/null +++ b/previews/PR1693/meshes/dgmulti_mesh/index.html @@ -0,0 +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](@ref) 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.

diff --git a/previews/PR1693/meshes/p4est_mesh/index.html b/previews/PR1693/meshes/p4est_mesh/index.html new file mode 100644 index 00000000000..be824bd70b4 --- /dev/null +++ b/previews/PR1693/meshes/p4est_mesh/index.html @@ -0,0 +1,136 @@ + +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
+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
+**  0 0 1 1
+**   1.000000000000000   1.000000000000000   0.0
+**   1.024948365654583   0.934461926834452   0.0
+**   1.116583018200151   0.777350964621867   0.0
+**   1.295753434047077   0.606254343587194   0.0
+**   1.537500000000000   0.462500000000000   0.0
+**   1.768263070247418   0.329729152118310   0.0
+**   1.920916981799849   0.185149035378133   0.0
+**   1.986035130050921   0.054554577460044   0.0
+**   2.000000000000000                 0.0   0.0
+**                 0.0                 0.0   0.0
+**   0.035513826946206   0.105291711848750   0.0
+**   0.148591270347399   0.317731556850611   0.0
+**   0.340010713990041   0.452219430075470   0.0
+**   0.575000000000000   0.462500000000000   0.0
+**   0.788022294598950   0.483764065630034   0.0
+**   0.926408729652601   0.644768443149389   0.0
+**   0.986453164464803   0.883724792445746   0.0
+**   1.000000000000000   1.000000000000000   0.0
+**  4 2 6 3
+**  0 0 0 1
+**   2.000000000000000                 0.0   0.0
+**   1.986035130050921   0.054554577460044   0.0
+**   1.920916981799849   0.185149035378133   0.0
+**   1.768263070247418   0.329729152118310   0.0
+**   1.537500000000000   0.462500000000000   0.0
+**   1.295753434047077   0.606254343587194   0.0
+**   1.116583018200151   0.777350964621867   0.0
+**   1.024948365654583   0.934461926834452   0.0
+**   1.000000000000000   1.000000000000000   0.0
+**  7 2 4 1
+**  0 0 0 0

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.

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.

**  Bezier --- Slant ---
+**  --- Right --- Top
+**  Bottom --- Right ---

For completeness, we provide the entire Abaqus mesh file for the example mesh in the figure above:

*Heading
+ File created by HOHQMesh
+*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
+*ELEMENT, type=CPS4, ELSET=Surface1
+1, 5, 1, 4, 3
+2, 4, 2, 6, 3
+3, 7, 2, 4, 1
+** ***** HOHQMesh boundary information ***** **
+** mesh polynomial degree = 8
+**  5 1 4 3
+**  0 0 1 1
+**   1.000000000000000   1.000000000000000   0.0
+**   1.024948365654583   0.934461926834452   0.0
+**   1.116583018200151   0.777350964621867   0.0
+**   1.295753434047077   0.606254343587194   0.0
+**   1.537500000000000   0.462500000000000   0.0
+**   1.768263070247418   0.329729152118310   0.0
+**   1.920916981799849   0.185149035378133   0.0
+**   1.986035130050921   0.054554577460044   0.0
+**   2.000000000000000                 0.0   0.0
+**                 0.0                 0.0   0.0
+**   0.035513826946206   0.105291711848750   0.0
+**   0.148591270347399   0.317731556850611   0.0
+**   0.340010713990041   0.452219430075470   0.0
+**   0.575000000000000   0.462500000000000   0.0
+**   0.788022294598950   0.483764065630034   0.0
+**   0.926408729652601   0.644768443149389   0.0
+**   0.986453164464803   0.883724792445746   0.0
+**   1.000000000000000   1.000000000000000   0.0
+**  4 2 6 3
+**  0 0 0 1
+**   2.000000000000000                 0.0   0.0
+**   1.986035130050921   0.054554577460044   0.0
+**   1.920916981799849   0.185149035378133   0.0
+**   1.768263070247418   0.329729152118310   0.0
+**   1.537500000000000   0.462500000000000   0.0
+**   1.295753434047077   0.606254343587194   0.0
+**   1.116583018200151   0.777350964621867   0.0
+**   1.024948365654583   0.934461926834452   0.0
+**   1.000000000000000   1.000000000000000   0.0
+**  7 2 4 1
+**  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} +\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) + + \mathbf{x}_4(1-\xi)(1+\eta)(1-\zeta) \\ + & \qquad\; + \mathbf{x}_5(1-\xi)(1-\eta)(1+\zeta) + + \mathbf{x}_6(1+\xi)(1-\eta)(1+\zeta) \\ + & \qquad\; + \mathbf{x}_7(1+\xi)(1+\eta)(1+\zeta) + + \mathbf{x}_8(1-\xi)(1+\eta)(1+\zeta)\quad]. +\end{aligned}\]

Next, we create a transfinite mapping function, $\mathbf{X}(\boldsymbol{\xi})$, 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 $\boldsymbol{\xi}$ as follows

\[ \begin{aligned} + \Gamma_1(\xi, \zeta), \quad && \quad \Gamma_3(\xi, \eta), \quad && \quad \Gamma_4(\eta, \zeta),\\[0.1cm] + \Gamma_2(\xi, \zeta), \quad && \quad \Gamma_5(\xi, \eta), \quad && \quad \Gamma_6(\eta, \zeta). + \end{aligned}\]

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

\[\begin{aligned} + \boldsymbol\Sigma(\boldsymbol{\xi}) &= \frac{1}{2}[\quad\,(1-\xi)\Gamma_6(\eta,\zeta) + (1+\xi)\Gamma_4(\eta,\zeta) \\[-0.15cm] + &\qquad\;+ (1-\eta)\Gamma_1(\xi,\zeta) + (1+\eta)\Gamma_2(\xi,\zeta) \\%[-0.15cm] + &\qquad\; +(1-\zeta)\Gamma_3(\xi,\eta) + (1+\zeta)\Gamma_5(\xi,\eta)\quad]. +\end{aligned}\]

Unfortunately, the linear interpolations $\boldsymbol\Sigma(\boldsymbol{\xi})$ no longer match at the faces, e.g., evaluating at $\eta = -1$ we have

\[\boldsymbol\Sigma(\xi,-1,\zeta) = \Gamma_1(\xi,\zeta) + \frac{1}{2}[\;(1-\xi)\Gamma_6(-1,\zeta) + (1+\xi)\Gamma_4(-1,\zeta) + +(1-\zeta)\Gamma_3(\xi,-1) + (1+\zeta)\Gamma_5(\xi,-1)\;],\]

which is the desired face $\Gamma_1(\xi,\zeta)$ plus four edge error terms. Analogous edge error terms occur at the other faces evaluating $\boldsymbol\Sigma(\boldsymbol{\xi})$ 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

\[\left(\frac{1-\eta}{2}\right) \bigg[ \frac{1}{2} [ \; (1-\xi)\Gamma_6(-1,\zeta) + (1+\xi)\Gamma_4(-1,\zeta)+(1-\zeta)\Gamma_3(\xi,-1) + + (1+\zeta)\Gamma_5(\xi,-1)\;] \bigg].\]

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

\[ \begin{aligned} + \texttt{edge}_{1} &= \Gamma_1(\xi, -1), \quad && \quad \texttt{edge}_{5} = \Gamma_2(\xi, -1), \quad & \quad \texttt{edge}_{9} &= \Gamma_6(\eta, -1),\\[0.1cm] + \texttt{edge}_{2} &= \Gamma_1(1, \zeta), \quad && \quad\texttt{edge}_{6} = \Gamma_2(1, \zeta), \quad & \quad \texttt{edge}_{10} &= \Gamma_4(\eta, -1),\\[0.1cm] + \texttt{edge}_{3} &= \Gamma_1(\xi, 1), \quad && \quad \texttt{edge}_{7} = \Gamma_2(\xi, 1), \quad & \quad \texttt{edge}_{11} &= \Gamma_4(\eta, 1),\\[0.1cm] + \texttt{edge}_{4} &= \Gamma_1(-1, \zeta), \quad && \quad \texttt{edge}_{8} = \Gamma_2(-1, \zeta), \quad & \quad \texttt{edge}_{12} &= \Gamma_6(\eta, 1). + \end{aligned}\]

With this notation for the edge terms (and after some algebraic manipulation) we write the complete edge correction term, $\mathcal{C}_{\texttt{edge}}(\boldsymbol{\xi})$, as

\[\begin{aligned} +\mathcal{C}_{\texttt{edge}}(\boldsymbol{\xi}) &= \frac{1}{4}[\quad\, (1-\eta)(1-\zeta)\texttt{edge}_{1}\\[-0.15cm] + & \qquad\; + (1+\xi)(1-\eta)\texttt{edge}_{2} \\ + & \qquad\; + (1-\eta)(1+\zeta)\texttt{edge}_{3} \\ + & \qquad\; + (1-\xi)(1-\eta)\texttt{edge}_{4} \\ + & \qquad\; + (1+\eta)(1-\zeta)\texttt{edge}_{5} \\ + & \qquad\; + (1+\xi)(1+\eta)\texttt{edge}_{6} \\ + & \qquad\; + (1+\eta)(1+\zeta)\texttt{edge}_{7} \\ + & \qquad\; + (1-\xi)(1+\eta)\texttt{edge}_{8} \\ + & \qquad\; + (1-\xi)(1-\zeta)\texttt{edge}_{9} \\ + & \qquad\; + (1+\xi)(1-\zeta)\texttt{edge}_{10} \\ + & \qquad\; + (1+\xi)(1+\zeta)\texttt{edge}_{11} \\ + & \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}).\]

diff --git a/previews/PR1693/meshes/structured_mesh/index.html b/previews/PR1693/meshes/structured_mesh/index.html new file mode 100644 index 00000000000..6470b49035e --- /dev/null +++ b/previews/PR1693/meshes/structured_mesh/index.html @@ -0,0 +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.

diff --git a/previews/PR1693/meshes/tree_mesh/index.html b/previews/PR1693/meshes/tree_mesh/index.html new file mode 100644 index 00000000000..984076b083e --- /dev/null +++ b/previews/PR1693/meshes/tree_mesh/index.html @@ -0,0 +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.

diff --git a/previews/PR1693/meshes/unstructured_quad_mesh/index.html b/previews/PR1693/meshes/unstructured_quad_mesh/index.html new file mode 100644 index 00000000000..583217585ff --- /dev/null +++ b/previews/PR1693/meshes/unstructured_quad_mesh/index.html @@ -0,0 +1,79 @@ + +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
+ 2.0    0.0
+ 0.0    0.0
+ 3.0    1.0
+ 3.0    -1.0

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.

List of neighbor connectivity

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.

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.

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.

Three examples: One along a physical boundary and two along interior surfaces.

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:

    2    7    3    0    1    0

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:

    2    4    3    2    2    -1

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:

    1    4    1    3    2    3

We collect the complete neighbor information for the example mesh above:

    2    4    3    2    2    -1
+    3    5    1    0    4    0
+    1    5    1    0    1    0
+    1    4    1    3    2    3
+    2    6    2    0    2    0
+    1    7    3    0    4    0
+    3    6    2    0    3    0
+    2    7    3    0    1    0
+    3    4    2    1    4    -3

List of elements

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

    5    1    4    3

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.

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.

As an example, the complete information for element 1 in the example mesh would be

    5    1    4    3
+    0    0    1    1
+ 1.000000000000000   1.000000000000000
+ 1.024948365654583   0.934461926834452
+ 1.116583018200151   0.777350964621867
+ 1.295753434047077   0.606254343587194
+ 1.537500000000000   0.462500000000000
+ 1.768263070247418   0.329729152118310
+ 1.920916981799849   0.185149035378133
+ 1.986035130050921   0.054554577460044
+ 2.000000000000000                 0.0
+               0.0                 0.0
+ 0.035513826946206   0.105291711848750
+ 0.148591270347399   0.317731556850611
+ 0.340010713990041   0.452219430075470
+ 0.575000000000000   0.462500000000000
+ 0.788022294598950   0.483764065630034
+ 0.926408729652601   0.644768443149389
+ 0.986453164464803   0.883724792445746
+ 1.000000000000000   1.000000000000000
+ Slant --- --- Bezier

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.

We collect the complete set of element information for the example mesh

    5    1    4    3
+    0    0    1    1
+ 1.000000000000000   1.000000000000000
+ 1.024948365654583   0.934461926834452
+ 1.116583018200151   0.777350964621867
+ 1.295753434047077   0.606254343587194
+ 1.537500000000000   0.462500000000000
+ 1.768263070247418   0.329729152118310
+ 1.920916981799849   0.185149035378133
+ 1.986035130050921   0.054554577460044
+ 2.000000000000000                 0.0
+               0.0                 0.0
+ 0.035513826946206   0.105291711848750
+ 0.148591270347399   0.317731556850611
+ 0.340010713990041   0.452219430075470
+ 0.575000000000000   0.462500000000000
+ 0.788022294598950   0.483764065630034
+ 0.926408729652601   0.644768443149389
+ 0.986453164464803   0.883724792445746
+ 1.000000000000000   1.000000000000000
+ Slant --- --- Bezier
+    4    2    6    3
+    0    0    0    1
+ 2.000000000000000                 0.0
+ 1.986035130050921   0.054554577460044
+ 1.920916981799849   0.185149035378133
+ 1.768263070247418   0.329729152118310
+ 1.537500000000000   0.462500000000000
+ 1.295753434047077   0.606254343587194
+ 1.116583018200151   0.777350964621867
+ 1.024948365654583   0.934461926834452
+ 1.000000000000000   1.000000000000000
+ --- Right Top ---
+    7    2    4    1
+    0    0    0    0
+ Right --- --- Bottom

Trixi.jl on an unstructured quadrilateral mesh

We provide an example simulation on an unstructured quadrilateral mesh by executing

julia> trixi_include(default_example_unstructured())

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.

+
diff --git a/previews/PR1693/overview/index.html b/previews/PR1693/overview/index.html new file mode 100644 index 00000000000..b41f77021f4 --- /dev/null +++ b/previews/PR1693/overview/index.html @@ -0,0 +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 termsᵇe.g., CompressibleNavierStokesDiffusion2D

ᵃ: quad = quadrilateral, hex = hexahedron ᵇ: Parabolic terms do not currently support adaptivity.

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/PR1693/parallelization/index.html b/previews/PR1693/parallelization/index.html new file mode 100644 index 00000000000..a93e1fc9a67 --- /dev/null +++ b/previews/PR1693/parallelization/index.html @@ -0,0 +1,36 @@ + +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 and t8code libraries need to be compiled with the same MPI installation. Therefore, you also need to use system-provided p4est and t8code installations (for notes on how to install p4est and t8code see e.g. here and here, use the configure option --enable-mpi). Note that t8code already comes with a p4est installation, so it suffices to install t8code. In addition, 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. In total, in your active Julia project you should have a LocalPreferences.toml file with sections [MPIPreferences], [T8code] and [P4est] 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"
+libhdf5_hl = "/usr/lib/x86_64-linux-gnu/hdf5/openmpi/libhdf5_hl.so"
+
+[MPIPreferences]
+__clear__ = ["preloads_env_switch"]
+_format = "1.0"
+abi = "OpenMPI"
+binary = "system"
+cclibs = []
+libmpi = "/lib/x86_64-linux-gnu/libmpi.so"
+mpiexec = "mpiexec"
+preloads = []
+
+[P4est]
+libp4est = "/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so"
+libsc = "/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so"
+
+[T8code]
+libp4est = "/home/mschlott/hackathon/libtrixi/t8code/install/lib/libp4est.so"
+libsc = "/home/mschlott/hackathon/libtrixi/t8code/install/lib/libsc.so"
+libt8 = "/home/mschlott/hackathon/libtrixi/t8code/install/lib/libt8.so"

Usage

To start Trixi.jl in parallel with MPI, there are three options:

  1. Run from the REPL with mpiexec(): You can start a parallel execution directly from the REPL by executing

    julia> using MPI
    +
    +julia> mpiexec() do cmd
    +         run(`$cmd -n 3 $(Base.julia_cmd()) --threads=1 --project=@. -e 'using Trixi; trixi_include(default_example())'`)
    +       end

    The 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=@..

  2. Run 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

    julia> using MPI
    +
    +julia> MPI.install_mpiexecjl(destdir="/somewhere/in/your/PATH")

    Then, to execute Trixi.jl in parallel, execute the following command from your command line:

    mpiexecjl -n 3 julia --threads=1 --project=@. -e 'using Trixi; trixi_include(default_example())'
  3. Run 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

    curl https://raw.githubusercontent.com/Azrael3000/tmpi/master/tmpi -o /somewhere/in/your/PATH/tmpi

    Finally, you can start and control multiple Julia REPLs simultaneously by running

    tmpi 3 julia --threads=1 --project=@.

    This 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

    ln -s ~/.julia/bin/mpiexecjl /somewhere/in/your/path/mpirun

    (assuming default installations).

Hybrid parallelism

It 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.

Performance

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).

Using error-based step size control with MPI

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.

Using parallel input and output

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

julia> using Preferences, UUIDs
+julia> set_preferences!(
+           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.

diff --git a/previews/PR1693/performance/index.html b/previews/PR1693/performance/index.html new file mode 100644 index 00000000000..ab48bb3b271 --- /dev/null +++ b/previews/PR1693/performance/index.html @@ -0,0 +1,55 @@ + +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 https://github.com/trixi-framework/Trixi.jl/pull/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")
    +
    +julia> du_test = copy(sol.u[end]); u_test = copy(sol.u[end]);
    +
    +julia> @benchmark Trixi.rhs!(
    +          $(du_test),
    +          $(u_test),
    +          $(semi),
    +          $(sol.t[end]))
    +BenchmarkTools.Trial:
    + memory estimate:  10.48 KiB
    + allocs estimate:  67
    + --------------
    + minimum time:     4.510 ms (0.00% GC)
    + median time:      4.646 ms (0.00% GC)
    + mean time:        4.699 ms (0.00% GC)
    + maximum time:     7.183 ms (0.00% GC)
    + --------------
    + samples:          1065
    + evals/sample:     1
    +
    +shell> git checkout 222241ff54f8a4ca9876cc1fc25ae262416a4ea0
    +
    +julia> trixi_include("examples/2d/elixir_euler_sedov_blast_wave.jl")
    +
    +julia> @benchmark Trixi.rhs!(
    +          $(du_test),
    +          $(u_test),
    +          $(semi),
    +          $(sol.t[end]))
    +BenchmarkTools.Trial:
    + memory estimate:  10.36 KiB
    + allocs estimate:  67
    + --------------
    + minimum time:     4.500 ms (0.00% GC)
    + median time:      4.635 ms (0.00% GC)
    + mean time:        4.676 ms (0.00% GC)
    + 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
+
+julia> results = benchmarkpkg(Trixi, BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`))
+
+julia> export_markdown(pkgdir(Trixi, "benchmark", "single_benchmark.md"), results)

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.

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

julia> using PkgBenchmark, Trixi
+
+julia> results = judge(Trixi,
+             BenchmarkConfig(juliacmd=`$(Base.julia_cmd()) --check-bounds=no --threads=1`), # target
+             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.

diff --git a/previews/PR1693/reference-trixi/index.html b/previews/PR1693/reference-trixi/index.html new file mode 100644 index 00000000000..2843d9c0e4c --- /dev/null +++ b/previews/PR1693/reference-trixi/index.html @@ -0,0 +1,573 @@ + +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)];
+            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} + \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} + + \nabla\cdot (\bar{\rho} \mathbf{v'} + \bar{\mathbf{v}} \tilde{p}') &= 0. +\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,
+                       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,).

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
+# boundary direction will match the positive y direction of the other boundary
+BoundaryConditionCoupled(2, (:begin, :i), Float64)
+
+# Connect the same two boundaries oppositely oriented
+BoundaryConditionCoupled(2, (:begin, :i_backwards), Float64)
+
+# 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.

Experimental feature

This is an experimental feature and may change in future releases.

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} ++ +\frac{\partial}{\partial x} +\begin{pmatrix} +\rho v_1 \\ \rho v_1^2 + p \\ (\rho e +p) v_1 +\end{pmatrix} += +\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} +\begin{pmatrix} +\rho \\ \rho v_1 \\ \rho v_2 \\ \rho e +\end{pmatrix} ++ +\frac{\partial}{\partial x} +\begin{pmatrix} + \rho v_1 \\ \rho v_1^2 + p \\ \rho v_1 v_2 \\ (\rho e +p) v_1 +\end{pmatrix} ++ +\frac{\partial}{\partial y} +\begin{pmatrix} +\rho v_2 \\ \rho v_1 v_2 \\ \rho v_2^2 + p \\ (\rho e +p) v_2 +\end{pmatrix} += +\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} +\begin{pmatrix} +\rho \\ \rho v_1 \\ \rho v_2 \\ \rho v_3 \\ \rho e +\end{pmatrix} ++ +\frac{\partial}{\partial x} +\begin{pmatrix} + \rho v_1 \\ \rho v_1^2 + p \\ \rho v_1 v_2 \\ \rho v_1 v_3 \\ ( \rho e +p) v_1 +\end{pmatrix} ++ +\frac{\partial}{\partial y} +\begin{pmatrix} +\rho v_2 \\ \rho v_1 v_2 \\ \rho v_2^2 + p \\ \rho v_1 v_3 \\ ( \rho e +p) v_2 +\end{pmatrix} ++ +\frac{\partial}{\partial z} +\begin{pmatrix} +\rho v_3 \\ \rho v_1 v_3 \\ \rho v_2 v_3 \\ \rho v_3^2 + p \\ ( \rho e +p) v_3 +\end{pmatrix} += +\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.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} ++ +\frac{\partial}{\partial x} +\begin{pmatrix} +\rho v_1^2 + p \\ (\rho e +p) v_1 \\ \rho_1 v_1 \\ \rho_2 v_1 \\ \vdots \\ \rho_{n} v_1 +\end{pmatrix} + += +\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} +\begin{pmatrix} +\rho v_1 \\ \rho v_2 \\ \rho e \\ \rho_1 \\ \rho_2 \\ \vdots \\ \rho_{n} +\end{pmatrix} ++ +\frac{\partial}{\partial x} +\begin{pmatrix} +\rho 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 +\end{pmatrix} ++ +\frac{\partial}{\partial y} +\begin{pmatrix} +\rho 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 +\end{pmatrix} += +\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,
+                                    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 +\end{pmatrix} ++ +\frac{\partial}{\partial x} +\begin{pmatrix} + \rho v \\ \rho v^2 + p \\ (\rho e + p) v +\end{pmatrix} += +\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}\]

Experimental code

This code is experimental and may be changed or removed in any future release.

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 +\end{pmatrix} ++ +\nabla \cdot +\begin{pmatrix} + \rho \mathbf{v} \\ \rho \mathbf{v}\mathbf{v}^T + p \underline{I} \\ (\rho e + p) \mathbf{v} +\end{pmatrix} += +\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}\]

Experimental code

This code is experimental and may be changed or removed in any future release.

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 +\end{pmatrix} ++ +\nabla \cdot +\begin{pmatrix} + \rho \mathbf{v} \\ \rho \mathbf{v}\mathbf{v}^T + p \underline{I} \\ (\rho e + p) \mathbf{v} +\end{pmatrix} += +\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}\]

Experimental code

This code is experimental and may be changed or removed in any future release.

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;
+                             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;
+        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,
+          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;
+            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;
+            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;
+            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,
+        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.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
Experimental code

This code is experimental and may be changed or removed in any future release.

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,
+                          variable)
+IndicatorHennemannGassner(semi::AbstractSemidiscretization;
+                          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)
+
+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.IndicatorNeuralNetworkType
IndicatorNeuralNetwork

Artificial neural network based indicator used for shock-capturing or AMR. Depending on the indicator_type, different input values and corresponding trained networks are used.

indicator_type = NeuralNetworkPerssonPeraire()

  • Input: The energies in lower modes as well as nnodes(dg).

indicator_type = NeuralNetworkRayHesthaven()

  • 1d Input: Cell average of the cell and its neighboring cells as well as the interface values.

  • 2d Input: Linear modal values of the cell and its neighboring cells.

  • Ray, Hesthaven (2018) "An artificial neural network as a troubled-cell indicator" doi:10.1016/j.jcp.2018.04.029

  • Ray, Hesthaven (2019) "Detecting troubled-cells on two-dimensional unstructured grids using a neural network" doi:10.1016/j.jcp.2019.07.043

indicator_type = CNN (Only in 2d)

  • Based on convolutional neural network.
  • 2d Input: Interpolation of the nodal values of the indicator.variable to the 4x4 LGL nodes.

If alpha_continuous == true the continuous network output for troubled cells (alpha > 0.5) is considered. If the cells are good (alpha < 0.5), alpha is set to 0. If alpha_continuous == false, the blending factor is set to alpha = 0 for good cells and alpha = 1 for troubled cells.

Experimental implementation

This is an experimental feature and may change in future releases.

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,
+                           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
    +     ┌───┼───┐          │
    +     │       │          │
    +  10 ┼   6   ┼ 15        ──── x
    +     │       │         ╱
    +     └───┼───┘        ╱
    +  20    12     26    z
  • plane at z = 0:
      14     3     7        y
    +     ┌───┼───┐          │
    +     │       │          │
    +   2 ┼  27   ┼ 1         ──── x
    +     │       │         ╱
    +     └───┼───┘        ╱
    +   8     4     13    z
  • plane at z = +1:
      25    11     19       y
    +     ┌───┼───┐          │
    +     │       │          │
    +  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 +\begin{pmatrix} + \rho' \\ v_1' \\ v_2' \\ p' +\end{pmatrix} ++ +\partial_x +\begin{pmatrix} + \bar{\rho} v_1' + \bar{v_1} \rho ' \\ \bar{v_1} v_1' + \frac{p'}{\bar{\rho}} \\ \bar{v_1} v_2' \\ \bar{v_1} p' + c^2 \bar{\rho} v_1' +\end{pmatrix} ++ +\partial_y +\begin{pmatrix} + \bar{\rho} v_2' + \bar{v_2} \rho ' \\ \bar{v_2} v_1' \\ \bar{v_2} v_2' + \frac{p'}{\bar{\rho}} \\ \bar{v_2} p' + c^2 \bar{\rho} v_2' +\end{pmatrix} += +\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.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;
+                 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.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} ++ +\frac{\partial}{\partial x} +\begin{pmatrix} + \rho v_1 \\ \rho v_1^2 + \kappa\rho^\gamma \\ \rho v_1 v_2 +\end{pmatrix} ++ +\frac{\partial}{\partial y} +\begin{pmatrix} +\rho v_2 \\ \rho v_1 v_2 \\ \rho v_2^2 + \kappa\rho^\gamma +\end{pmatrix} += +\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,
+                      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,
+                       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;
+                             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} + \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} + \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} + \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;
+                  positivity_variables_cons = [],
+                  positivity_correction_factor = 0.1)

Subcell invariant domain preserving (IDP) limiting used with VolumeIntegralSubcellLimiting including:

  • positivity limiting for conservative variables (positivity_variables_cons)

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;
+                   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,
+                        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.

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
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];
+           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
+
+julia> trixi_include(default_example())
+[...]
+
+julia> pd = PlotData2D(sol)
+PlotData2D(...)
+
+julia> plot(pd) # To plot all available variables
+
+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.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
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_fjordholm_etalMethod
flux_es_fjordholm_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_fjordholm_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables.

Further details are available in the paper:

  • Ulrik Skre Fjordholm (2012)

Energy conservative and stable schemes for the two-layer shallow water equations. DOI: 10.1142/9789814417099_0039 It should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.

source
Trixi.flux_es_fjordholm_etalMethod
flux_es_fjordholm_etal(u_ll, u_rr, orientation,
+                       equations::ShallowWaterTwoLayerEquations1D)

Entropy stable surface flux for the two-layer shallow water equations. Uses the entropy conservative flux_fjordholm_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables.

Further details are available in the paper:

It should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.

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_fjordholm_etalMethod
flux_fjordholm_etal(u_ll, u_rr, orientation,
+                    equations::ShallowWaterTwoLayerEquations1D)

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 Mishra 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 the application to two layers is shown in the paper:

It should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.

source
Trixi.flux_fjordholm_etalMethod
flux_fjordholm_etal(u_ll, u_rr, orientation,
+                    equations::ShallowWaterTwoLayerEquations2D)

Total energy conservative (mathematical entropy for two-layer 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 Mishra 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 the application to two layers is shown in the paper:

It should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.

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_hlleMethod
flux_hlle(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.flux_hlleMethod
flux_hlle(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.flux_hlleMethod
flux_hlle(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.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::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_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_fjordholm_etalMethod
flux_nonconservative_fjordholm_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 two-point surface flux discretizing the nonconservative (source) term that contains the gradients of the bottom topography and an additional term that couples the momentum of both layers ShallowWaterTwoLayerEquations2D.

Further details are available in the paper:

It should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.

source
Trixi.flux_nonconservative_fjordholm_etalMethod
flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,
+                                    equations::ShallowWaterTwoLayerEquations2D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric two-point surface flux discretizing the nonconservative (source) term that contains the gradients of the bottom topography and an additional term that couples the momentum of both layers ShallowWaterTwoLayerEquations2D.

Further details are available in the paper:

It should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.

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::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_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_nonconservative_wintermeyer_etalMethod
flux_nonconservative_wintermeyer_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 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 slightly modified version to account for the additional source term compared to the standard SWE described in the paper.

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::ShallowWaterTwoLayerEquations2D)
Experimental code

This numerical flux is experimental and may change in any future release.

Non-symmetric 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 slightly modified version to account for the additional source term compared to the standard SWE described in the paper.

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 as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_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)

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 as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_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, 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_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.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;
+            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))
+                 = (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_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.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.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.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;
+          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,
+                          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::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::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::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::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::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::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::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::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
+    = (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
diff --git a/previews/PR1693/reference-trixi2vtk/index.html b/previews/PR1693/reference-trixi2vtk/index.html new file mode 100644 index 00000000000..988ae13701e --- /dev/null +++ b/previews/PR1693/reference-trixi2vtk/index.html @@ -0,0 +1,6 @@ + +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
diff --git a/previews/PR1693/restart/index.html b/previews/PR1693/restart/index.html new file mode 100644 index 00000000000..c717e58a04f --- /dev/null +++ b/previews/PR1693/restart/index.html @@ -0,0 +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,
+                                   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.

diff --git a/previews/PR1693/search_index.js b/previews/PR1693/search_index.js new file mode 100644 index 00000000000..0b06da21ede --- /dev/null +++ b/previews/PR1693/search_index.js @@ -0,0 +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":"struct ConstantAnisotropicDiffusion2D{E, T} <: Trixi.AbstractEquationsParabolic{2, 1}\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 and t8code libraries need to be compiled with the same MPI installation. Therefore, you also need to use system-provided p4est and t8code installations (for notes on how to install p4est and t8code see e.g. here and here, use the configure option --enable-mpi). Note that t8code already comes with a p4est installation, so it suffices to install t8code. In addition, 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. In total, in your active Julia project you should have a LocalPreferences.toml file with sections [MPIPreferences], [T8code] and [P4est] 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[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/#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 ᵇ: Parabolic terms do not currently support adaptivity. ","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 hyperbolic 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\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\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":"(Image: funding-logo)","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) under Germany's Excellence Strategy EXC 2044-390685587, Mathematics Münster: Dynamics-Geometry-Structure.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This project has benefited from funding by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) through the research unit FOR 5409 \"Structure-Preserving Numerical Methods for Bulk- and Interface Coupling of Heterogeneous Models (SNuBIC)\" (project number 463312734).","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 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 through the project grant \"Adaptive earth system modeling with significantly reduced computation time for exascale supercomputers (ADAPTEX)\" (funding id: 16ME0668K).","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 https://github.com/trixi-framework/Trixi.jl/pull/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](@ref) 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(meshIO, dg, 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 download the raw notebooks from GitHub 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_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\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\nwarning: Experimental feature\nThis is an experimental feature and may change in future releases.\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.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\nwarning: Experimental code\nThis code is experimental and may be changed or removed in any future release.\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\nwarning: Experimental code\nThis code is experimental and may be changed or removed in any future release.\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\nwarning: Experimental code\nThis code is experimental and may be changed or removed in any future release.\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":"warning: Experimental code\nThis code is experimental and may be changed or removed in any future release.\n\nGradientVariablesPrimitive 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.IndicatorNeuralNetwork","page":"Trixi.jl","title":"Trixi.IndicatorNeuralNetwork","text":"IndicatorNeuralNetwork\n\nArtificial neural network based indicator used for shock-capturing or AMR. Depending on the indicator_type, different input values and corresponding trained networks are used.\n\nindicator_type = NeuralNetworkPerssonPeraire()\n\nInput: The energies in lower modes as well as nnodes(dg).\n\nindicator_type = NeuralNetworkRayHesthaven()\n\n1d Input: Cell average of the cell and its neighboring cells as well as the interface values.\n2d Input: Linear modal values of the cell and its neighboring cells.\nRay, Hesthaven (2018) \"An artificial neural network as a troubled-cell indicator\" doi:10.1016/j.jcp.2018.04.029\nRay, Hesthaven (2019) \"Detecting troubled-cells on two-dimensional unstructured grids using a neural network\" doi:10.1016/j.jcp.2019.07.043\n\nindicator_type = CNN (Only in 2d)\n\nBased on convolutional neural network.\n2d Input: Interpolation of the nodal values of the indicator.variable to the 4x4 LGL nodes.\n\nIf alpha_continuous == true the continuous network output for troubled cells (alpha > 0.5) is considered. If the cells are good (alpha < 0.5), alpha is set to 0. If alpha_continuous == false, the blending factor is set to alpha = 0 for good cells and alpha = 1 for troubled cells.\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.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.NeuralNetworkCNN","page":"Trixi.jl","title":"Trixi.NeuralNetworkCNN","text":"NeuralNetworkCNN\n\nIndicator type for creating an IndicatorNeuralNetwork indicator.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nSee also: IndicatorNeuralNetwork\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NeuralNetworkPerssonPeraire","page":"Trixi.jl","title":"Trixi.NeuralNetworkPerssonPeraire","text":"NeuralNetworkPerssonPeraire\n\nIndicator type for creating an IndicatorNeuralNetwork indicator.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nSee also: IndicatorNeuralNetwork\n\n\n\n\n\n","category":"type"},{"location":"reference-trixi/#Trixi.NeuralNetworkRayHesthaven","page":"Trixi.jl","title":"Trixi.NeuralNetworkRayHesthaven","text":"NeuralNetworkRayHesthaven\n\nIndicator type for creating an IndicatorNeuralNetwork indicator.\n\nwarning: Experimental implementation\nThis is an experimental feature and may change in future releases.\n\nSee also: IndicatorNeuralNetwork\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.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 positivity_variables_cons = [],\n positivity_correction_factor = 0.1)\n\nSubcell invariant domain preserving (IDP) limiting used with VolumeIntegralSubcellLimiting including:\n\npositivity limiting for conservative variables (positivity_variables_cons)\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\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/#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_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, 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_fjordholm_etal-Tuple{Any, Any, Any, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_es_fjordholm_etal","text":"flux_es_fjordholm_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_fjordholm_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables.\n\nFurther details are available in the paper:\n\nUlrik Skre Fjordholm (2012)\n\nEnergy conservative and stable schemes for the two-layer shallow water equations. DOI: 10.1142/9789814417099_0039 It should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_es_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_es_fjordholm_etal","text":"flux_es_fjordholm_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterTwoLayerEquations1D)\n\nEntropy stable surface flux for the two-layer shallow water equations. Uses the entropy conservative flux_fjordholm_etal and adds a Lax-Friedrichs type dissipation dependent on the jump of entropy variables.\n\nFurther details are available in the paper:\n\nUlrik Skre Fjordholm (2012) Energy conservative and stable schemes for the two-layer shallow water equations. DOI: 10.1142/9789814417099_0039\n\nIt should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.\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_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_fjordholm_etal","text":"flux_fjordholm_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterTwoLayerEquations1D)\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 Mishra 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 the application to two layers is shown in the paper:\n\nUlrik Skre Fjordholm (2012) Energy conservative and stable schemes for the two-layer shallow water equations. DOI: 10.1142/9789814417099_0039\n\nIt should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_fjordholm_etal","text":"flux_fjordholm_etal(u_ll, u_rr, orientation,\n equations::ShallowWaterTwoLayerEquations2D)\n\nTotal energy conservative (mathematical entropy for two-layer 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 Mishra 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 the application to two layers is shown in the paper:\n\nUlrik Skre Fjordholm (2012) Energy conservative and stable schemes for the two-layer shallow water equations. DOI: 10.1142/9789814417099_0039\n\nIt should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.\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, 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, 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_hlle-Tuple{Any, Any, Integer, CompressibleEulerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_hlle","text":"flux_hlle(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.flux_hlle-Tuple{Any, Any, Integer, CompressibleEulerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_hlle","text":"flux_hlle(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.flux_hlle-Tuple{Any, Any, Integer, CompressibleEulerEquations3D}","page":"Trixi.jl","title":"Trixi.flux_hlle","text":"flux_hlle(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.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, ShallowWaterEquationsQuasi1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_chan_etal","text":"flux_nonconservative_chan_etal(u_ll, u_rr, orientation::Integer,\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_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_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_fjordholm_etal","text":"flux_nonconservative_fjordholm_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 two-point surface flux discretizing the nonconservative (source) term that contains the gradients of the bottom topography and an additional term that couples the momentum of both layers ShallowWaterTwoLayerEquations2D.\n\nFurther details are available in the paper:\n\nUlrik Skre Fjordholm (2012) Energy conservative and stable schemes for the two-layer shallow water equations. DOI: 10.1142/9789814417099_0039\n\nIt should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.\n\n\n\n\n\n","category":"method"},{"location":"reference-trixi/#Trixi.flux_nonconservative_fjordholm_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_fjordholm_etal","text":"flux_nonconservative_fjordholm_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterTwoLayerEquations2D)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric two-point surface flux discretizing the nonconservative (source) term that contains the gradients of the bottom topography and an additional term that couples the momentum of both layers ShallowWaterTwoLayerEquations2D.\n\nFurther details are available in the paper:\n\nUlrik Skre Fjordholm (2012) Energy conservative and stable schemes for the two-layer shallow water equations. DOI: 10.1142/9789814417099_0039\n\nIt should be noted that the equations are ordered differently and the designation of the upper and lower layer has been changed which leads to a slightly different formulation.\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_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_nonconservative_wintermeyer_etal-Tuple{Any, Any, Integer, ShallowWaterTwoLayerEquations1D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_wintermeyer_etal","text":"flux_nonconservative_wintermeyer_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 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 slightly modified version to account for the additional source term compared to the standard SWE described in the paper.\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, ShallowWaterTwoLayerEquations2D}","page":"Trixi.jl","title":"Trixi.flux_nonconservative_wintermeyer_etal","text":"flux_nonconservative_wintermeyer_etal(u_ll, u_rr, orientation::Integer,\n equations::ShallowWaterTwoLayerEquations2D)\n\nwarning: Experimental code\nThis numerical flux is experimental and may change in any future release.\n\nNon-symmetric 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 slightly modified version to account for the additional source term compared to the standard SWE described in the paper.\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 as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_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)\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 as a volume_flux. The surface_flux should still use, e.g., flux_fjordholm_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, 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_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, 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_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.min_max_speed_naive-Tuple{Any, Any, Integer, IdealGlmMhdEquations1D}","page":"Trixi.jl","title":"Trixi.min_max_speed_naive","text":"min_max_speed_naive(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_naive-Tuple{Any, Any, Integer, IdealGlmMhdEquations2D}","page":"Trixi.jl","title":"Trixi.min_max_speed_naive","text":"min_max_speed_naive(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_naive-Tuple{Any, Any, Integer, IdealGlmMhdEquations3D}","page":"Trixi.jl","title":"Trixi.min_max_speed_naive","text":"min_max_speed_naive(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.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.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, 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\", \"ext\", \"src\", \"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"}] +} diff --git a/previews/PR1693/siteinfo.js b/previews/PR1693/siteinfo.js new file mode 100644 index 00000000000..b5ca2990475 --- /dev/null +++ b/previews/PR1693/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "previews/PR1693"; diff --git a/previews/PR1693/styleguide/index.html b/previews/PR1693/styleguide/index.html new file mode 100644 index 00000000000..6ebcf244d24 --- /dev/null +++ b/previews/PR1693/styleguide/index.html @@ -0,0 +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", "ext", "src", "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/PR1693/testing/index.html b/previews/PR1693/testing/index.html new file mode 100644 index 00000000000..92553a5a11d --- /dev/null +++ b/previews/PR1693/testing/index.html @@ -0,0 +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
+       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%.

diff --git a/previews/PR1693/time_integration/index.html b/previews/PR1693/time_integration/index.html new file mode 100644 index 00000000000..f7c0f8c87d3 --- /dev/null +++ b/previews/PR1693/time_integration/index.html @@ -0,0 +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.

diff --git a/previews/PR1693/troubleshooting/index.html b/previews/PR1693/troubleshooting/index.html new file mode 100644 index 00000000000..4b30c6cc262 --- /dev/null +++ b/previews/PR1693/troubleshooting/index.html @@ -0,0 +1,47 @@ + +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:
+ ├─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
+ ├─restricted by compatibility requirements with DiffEqCallbacks [459566f4] to versions: 0.18.0-0.18.8
+ │ └─DiffEqCallbacks [459566f4] log:
+ │   ├─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
+ │   ├─restricted by compatibility requirements with Trixi [a7f1ee26] to versions: [2.14.0-2.14.1, 2.15.0]
+ │   │ └─Trixi [a7f1ee26] log:
+ │   │   ├─possible versions are: [0.1.0-0.1.2, 0.2.0-0.2.6, 0.3.0-0.3.6] or uninstalled
+ │   │   └─restricted to versions 0.3.6 by an explicit requirement, leaving only versions 0.3.6
+ │   └─restricted by compatibility requirements with StaticArrays [90137ffa] to versions: 2.15.0 or uninstalled, leaving only versions: 2.15.0
+ │     └─StaticArrays [90137ffa] log:
+ │       ├─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
+ │       └─restricted by compatibility requirements with Trixi [a7f1ee26] to versions: 1.0.0-1.0.1
+ │         └─Trixi [a7f1ee26] log: see above
+ └─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
+   └─JLD2 [033835bb] log:
+     ├─possible versions are: [0.1.0-0.1.14, 0.2.0-0.2.4, 0.3.0-0.3.1] or uninstalled
+     └─restricted by compatibility requirements with BinaryBuilder [12aac903] to versions: 0.1.0-0.1.14
+       └─BinaryBuilder [12aac903] log:
+         ├─possible versions are: [0.1.0-0.1.2, 0.1.4, 0.2.0-0.2.6] or uninstalled
+         └─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]

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:

  • 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.
  • Remove the offending package. Running
    julia> import Pkg; Pkg.rm("BinaryBuilder"); Pkg.update(); Pkg.status()
    in the REPL will remove BinaryBuilder and (hopefully) update Trixi.jl to the latest version.
  • Report 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.
  • Instead 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 😉).

There are many questions marks and weird symbols in the output of Trixi.jl

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.

This problems affects users of Mac OS particularly often. At the time of writing, installing JuliaMono is as simple as

$ brew tap homebrew/cask-fonts
+$ brew install --cask font-juliamono

There are no timing results of the initial mesh creation

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.

using Trixi
+
+begin
+  Trixi.reset_timer!(Trixi.timer())
+
+  equations = LinearScalarAdvectionEquation2D(0.2, -0.7)
+  mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), n_cells_max=10^5, initial_refinement_level=5)
+  solver = DGSEM(3)
+  semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, solver)
+
+  Trixi.print_timer(Trixi.timer())
+end

MPI ranks are assigned zero cells in P4estMesh even though there are enough cells

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.

Installing and updating everything takes a lot of time

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.

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.

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.

using Preferences, UUIDs
+let uuid = UUID("1dea7af3-3e70-54e6-95c3-0bf5283fa5ed")
+  set_preferences!(uuid, "PrecompileAutoSpecialize" => false)
+  set_preferences!(uuid, "PrecompileAutoSwitch" => false)
+  set_preferences!(uuid, "PrecompileDefaultSpecialize" => true)
+  set_preferences!(uuid, "PrecompileFunctionWrapperSpecialize" => false)
+  set_preferences!(uuid, "PrecompileLowStorage" => true)
+  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.

diff --git a/previews/PR1693/tutorials/DGMulti_1/3d495c42.svg b/previews/PR1693/tutorials/DGMulti_1/3d495c42.svg new file mode 100644 index 00000000000..f4761fa1ac0 --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_1/3d495c42.svg @@ -0,0 +1,4921 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGMulti_1/6024307b.svg b/previews/PR1693/tutorials/DGMulti_1/6024307b.svg new file mode 100644 index 00000000000..149c97a3515 --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_1/6024307b.svg @@ -0,0 +1,4816 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGMulti_1/9849c477.svg b/previews/PR1693/tutorials/DGMulti_1/9849c477.svg new file mode 100644 index 00000000000..35908227319 --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_1/9849c477.svg @@ -0,0 +1,8384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGMulti_1/9b757e60.svg b/previews/PR1693/tutorials/DGMulti_1/9b757e60.svg new file mode 100644 index 00000000000..2cb37e402bd --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_1/9b757e60.svg @@ -0,0 +1,6315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGMulti_1/d975fe8c.svg b/previews/PR1693/tutorials/DGMulti_1/d975fe8c.svg new file mode 100644 index 00000000000..4b81f372d99 --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_1/d975fe8c.svg @@ -0,0 +1,5566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGMulti_1/e3e6993d.svg b/previews/PR1693/tutorials/DGMulti_1/e3e6993d.svg new file mode 100644 index 00000000000..e6b11acaae3 --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_1/e3e6993d.svg @@ -0,0 +1,6306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGMulti_1/index.html b/previews/PR1693/tutorials/DGMulti_1/index.html new file mode 100644 index 00000000000..63b8e1e361a --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_1/index.html @@ -0,0 +1,308 @@ + +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
+
+equations = CompressibleEulerEquations2D(1.4)
+
+initial_condition = initial_condition_weak_blast_wave
initial_condition_weak_blast_wave (generic function with 13 methods)

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().

dg = DGMulti(polydeg = 3,
+             element_type = Quad(),
+             approximation_type = SBP(),
+             surface_flux = flux_lax_friedrichs,
+             volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))
+
+cells_per_dimension = (32, 32)
+mesh = DGMultiMesh(dg,
+                   cells_per_dimension, # initial_refinement_level = 5
+                   coordinates_min=(-2.0, -2.0),
+                   coordinates_max=( 2.0,  2.0),
+                   periodicity=true)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,
+                                    boundary_conditions=boundary_condition_periodic)
+tspan = (0.0, 0.4)
+ode = semidiscretize(semi, tspan)
+
+alive_callback = AliveCallback(alive_interval=10)
+analysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))
+callbacks = CallbackSet(analysis_callback, alive_callback);

Run the simulation with the same time integration algorithm as before.

sol = solve(ode, RDPK3SpFSAL49(), abstol=1.0e-6, reltol=1.0e-6,
+            callback=callbacks, save_everystep=false);

+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       2.40000000e-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:       2500.867 MiB
+ #elements:                1024
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
+ Linf error:     0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
+ ∑∂S/∂U ⋅ Uₜ :  -2.41863883e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+#timesteps:     10 │ Δt: 8.2897e-03 │ sim. time: 5.6681e-02 (14.170%)  │ run time: 2.4610e-01 s
+#timesteps:     20 │ Δt: 1.2210e-02 │ sim. time: 1.6420e-01 (41.051%)  │ run time: 4.8383e-01 s
+#timesteps:     30 │ Δt: 1.3848e-02 │ sim. time: 2.9639e-01 (74.098%)  │ run time: 7.2187e-01 s
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 38                run time:       9.18198967e-01 s
+ Δt:             5.50651515e-03                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  1.46947607e-07 s
+                                               PID:            1.61576778e-07 s
+ #DOFs per field:         16384                alloc'd memory:       2505.729 MiB
+ #elements:                1024
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       6.13961930e-02   4.96492880e-02   4.96459232e-02   2.24580528e-01
+ Linf error:     2.63830830e-01   2.47653912e-01   2.47503933e-01   9.30036610e-01
+ ∑∂S/∂U ⋅ Uₜ :  -2.24450891e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+Trixi.jl simulation finished.  Final time: 0.4  Time steps: 38 (accepted), 38 (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
+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(),
+             approximation_type = GaussSBP(),
+             surface_flux = flux_lax_friedrichs,
+             volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))
+
+cells_per_dimension = (32, 32)
+mesh = DGMultiMesh(dg,
+             cells_per_dimension, # initial_refinement_level = 5
+             coordinates_min=(-2.0, -2.0),
+             coordinates_max=( 2.0,  2.0),
+             periodicity=true)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,
+                              boundary_conditions=boundary_condition_periodic)
+tspan = (0.0, 0.4)
+ode = semidiscretize(semi, tspan)
+
+alive_callback = AliveCallback(alive_interval=10)
+analysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))
+callbacks = CallbackSet(analysis_callback, alive_callback);
+
+sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,
+            ode_default_options()..., callback=callbacks);

+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       3.30000000e-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:       2475.990 MiB
+ #elements:                1024
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       3.85192317e-16   1.11612674e-17   1.12132619e-17   9.02783286e-16
+ Linf error:     1.11022302e-15   1.94289029e-16   2.22044605e-16   3.10862447e-15
+ ∑∂S/∂U ⋅ Uₜ :  -1.01164379e-01
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+#timesteps:     10 │ Δt: 5.0548e-03 │ sim. time: 3.3436e-02 (8.359%)   │ run time: 7.8661e-01 s
+#timesteps:     20 │ Δt: 8.8313e-03 │ sim. time: 1.0601e-01 (26.503%)  │ run time: 1.5407e+00 s
+#timesteps:     30 │ Δt: 1.0521e-02 │ sim. time: 2.0438e-01 (51.094%)  │ run time: 2.3013e+00 s
+#timesteps:     40 │ Δt: 1.1006e-02 │ sim. time: 3.1245e-01 (78.113%)  │ run time: 3.0644e+00 s
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 48                run time:       3.69532458e+00 s
+ Δt:             1.00192333e-02                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  4.90830787e-07 s
+                                               PID:            5.16972855e-07 s
+ #DOFs per field:         16384                alloc'd memory:       2478.360 MiB
+ #elements:                1024
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       6.10354479e-02   4.94109888e-02   4.94109888e-02   2.23252171e-01
+ Linf error:     2.58968601e-01   2.43227118e-01   2.43227118e-01   9.39282114e-01
+ ∑∂S/∂U ⋅ Uₜ :  -2.32263587e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+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
+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(),
+             approximation_type = SBP(),
+             surface_flux = flux_lax_friedrichs,
+             volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))
+
+cells_per_dimension = (32, 32)
+mesh = DGMultiMesh(dg,
+                   cells_per_dimension, # initial_refinement_level = 5
+                   coordinates_min=(-2.0, -2.0),
+                   coordinates_max=( 2.0,  2.0),
+                   periodicity=true)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,
+                                    boundary_conditions=boundary_condition_periodic)
+tspan = (0.0, 0.4)
+ode = semidiscretize(semi, tspan)
+
+alive_callback = AliveCallback(alive_interval=10)
+analysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))
+callbacks = CallbackSet(analysis_callback, alive_callback);
+
+sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,
+            ode_default_options()..., callback=callbacks);

+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       2.30000000e-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:       2513.793 MiB
+ #elements:                2048
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
+ Linf error:     0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
+ ∑∂S/∂U ⋅ Uₜ :  -6.20288935e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+#timesteps:     10 │ Δt: 6.5307e-03 │ sim. time: 4.4324e-02 (11.081%)  │ run time: 1.2699e+00 s
+#timesteps:     20 │ Δt: 1.0419e-02 │ sim. time: 1.3413e-01 (33.533%)  │ run time: 2.5235e+00 s
+#timesteps:     30 │ Δt: 1.2042e-02 │ sim. time: 2.4861e-01 (62.152%)  │ run time: 3.7992e+00 s
+#timesteps:     40 │ Δt: 1.2624e-02 │ sim. time: 3.7245e-01 (93.113%)  │ run time: 5.0895e+00 s
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 43                run time:       5.49404367e+00 s
+ Δt:             2.19030700e-03                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  4.40121789e-07 s
+                                               PID:            4.57143626e-07 s
+ #DOFs per field:         30720                alloc'd memory:       2522.705 MiB
+ #elements:                2048
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       6.07364412e-02   4.91988609e-02   4.91963681e-02   2.22168460e-01
+ Linf error:     2.68903929e-01   2.45685699e-01   2.45819523e-01   9.33718963e-01
+ ∑∂S/∂U ⋅ Uₜ :  -1.96215242e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+Trixi.jl simulation finished.  Final time: 0.4  Time steps: 43 (accepted), 43 (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)
+initial_condition = initial_condition_convergence_test
+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))
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DG{Float64}                                                                                      │
+│ ═══════════                                                                                      │
+│ basis: ……………………………………………………………… RefElemData{N=3, Polynomial, Tri}.                               │
+│ mortar: …………………………………………………………… nothing                                                          │
+│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
+│ │ surface flux: ……………………………………… FluxLaxFriedrichs(max_abs_speed_naive)                           │
+│ volume integral: …………………………………… VolumeIntegralFluxDifferencing                                   │
+│ │ volume flux: ………………………………………… flux_ranocha                                                     │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

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.

meshIO = StartUpDG.triangulate_domain(StartUpDG.RectangularDomainWithHole());

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.

mesh = DGMultiMesh(meshIO, dg, Dict(:outer_boundary=>1, :inner_boundary=>2))
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DGMultiMesh{2, Trixi.Affine},                                                                    │
+│ ══════════════════════════════                                                                   │
+│ number of elements: …………………………… 598                                                              │
+│ number of boundaries: ……………………… 2                                                                │
+│ │ nfaces on outer_boundary: ……… 52                                                               │
+│ │ nfaces on inner_boundary: ……… 4                                                                │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
boundary_condition_convergence_test = BoundaryConditionDirichlet(initial_condition)
+boundary_conditions = (; :outer_boundary => boundary_condition_convergence_test,
+                         :inner_boundary => boundary_condition_convergence_test)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,
+                                    source_terms = source_terms,
+                                    boundary_conditions = boundary_conditions)
+
+tspan = (0.0, 0.2)
+ode = semidiscretize(semi, tspan)
+
+alive_callback = AliveCallback(alive_interval=20)
+analysis_callback = AnalysisCallback(semi, interval=200, uEltype=real(dg))
+callbacks = CallbackSet(alive_callback, analysis_callback);
+
+sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),
+            dt = 0.5 * estimate_dt(mesh, dg), save_everystep=false, callback=callbacks);

+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       1.90000000e-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:       2619.782 MiB
+ #elements:                 598
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       3.93036845e-07   3.93036845e-07   3.93036845e-07   1.55064245e-06
+ Linf error:     4.47141181e-06   4.47141181e-06   4.47141181e-06   1.47933676e-05
+ ∑∂S/∂U ⋅ Uₜ :  -1.23444983e-02
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+#timesteps:     20 │ Δt: 1.4925e-03 │ sim. time: 2.9849e-02 (14.925%)  │ run time: 8.7123e-01 s
+#timesteps:     40 │ Δt: 1.4925e-03 │ sim. time: 5.9698e-02 (29.849%)  │ run time: 1.7213e+00 s
+#timesteps:     60 │ Δt: 1.4925e-03 │ sim. time: 8.9547e-02 (44.774%)  │ run time: 2.5786e+00 s
+#timesteps:     80 │ Δt: 1.4925e-03 │ sim. time: 1.1940e-01 (59.698%)  │ run time: 3.4237e+00 s
+#timesteps:    100 │ Δt: 1.4925e-03 │ sim. time: 1.4925e-01 (74.623%)  │ run time: 4.2626e+00 s
+#timesteps:    120 │ Δt: 1.4925e-03 │ sim. time: 1.7909e-01 (89.547%)  │ run time: 5.1055e+00 s
+────────────────────────────────────────────────────────────────────────────────────────────────────
+Trixi.jl simulation finished.  Final time: 0.2  Time steps: 135 (accepted), 135 (total)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGMulti(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                135                run time:       5.73724374e+00 s
+ Δt:             1.14223386e-05                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      2.00000000e-01 (100.000%)     time/DOF/rhs!:  1.40470206e-06 s
+                                               PID:            1.41699182e-06 s
+ #DOFs per field:          5980                alloc'd memory:       2620.254 MiB
+ #elements:                 598
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       4.43758204e-06   3.71131543e-06   4.42671638e-06   9.85291883e-06
+ Linf error:     6.10809368e-05   4.53698746e-05   6.62331342e-05   1.25625347e-04
+ ∑∂S/∂U ⋅ Uₜ :  -1.03046341e-02
+────────────────────────────────────────────────────────────────────────────────────────────────────
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
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "StartUpDG", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [472ebc20] StartUpDG v0.17.7
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/DGMulti_2/index.html b/previews/PR1693/tutorials/DGMulti_2/index.html new file mode 100644 index 00000000000..71131c94f5e --- /dev/null +++ b/previews/PR1693/tutorials/DGMulti_2/index.html @@ -0,0 +1,36 @@ + +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
+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) 
+  Summation by parts operators for finite difference approximations of second 
+    derivatives. 
+  Journal of Computational Physics 199, pp. 503-540.

Here, the arguments xmin and xmax do not matter beyond setting the real type used for the operator - they just set a reference element and are rescaled on the physical elements. The parameter N determines the number of finite difference nodes. Then, D can be used as approximation_type like SBP() in a multi-block fashion. In multiple dimensions, such a 1D SBP operator will be used in a tensor product fashion, i.e., in each coordinate direction. In particular, you can use them only on 1D, 2D Quad(), and 3D Hex() elements.

You can also use fully periodic single-block FD methods by creating a periodic SBP operator. For example, a fully periodic FD operator can be constructed as

D = periodic_derivative_operator(derivative_order=1, accuracy_order=2,
+                                 xmin=0.0, xmax=1.0, N=11)
Periodic first-derivative operator of order 2 on a grid in [0.0, 1.0] using 11 nodes, 
+stencils with 1 nodes to the left, 1 nodes to the right, and coefficients of Fornberg (1998) 
+  Calculation of Weights in Finite Difference Formulas. 
+  SIAM Rev. 40.3, pp. 685-691.

An example using such an FD method is implemented in elixir_euler_fdsbp_periodic.jl. For all parameters and other calling options, please have a look in the documentation of SummationByPartsOperators.jl.

Another possible method is for instance a continuous Galerkin (CGSEM) method. You can use such a method with polynomial degree of 3 (N=4 Legendre Lobatto nodes on [0, 1]) coupled continuously on a uniform mesh with Nx=10 elements by setting approximation_type to

using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly
+D = couple_continuously(legendre_derivative_operator(xmin=0.0, xmax=1.0, N=4),
+                        UniformPeriodicMesh1D(xmin=-1.0, xmax=1.0, Nx=10))
First derivative operator {T=Float64} on 4 Lobatto Legendre nodes in [0.0, 1.0]
+coupled continuously on SummationByPartsOperators.UniformPeriodicMesh1D{Float64} with 10 cells in (-1.0, 1.0)

To choose a discontinuous coupling (DGSEM), use couple_discontinuously() instead of couple_continuously().

For more information and other SBP operators, see the documentations of StartUpDG.jl and SummationByPartsOperators.jl.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "StartUpDG", "SummationByPartsOperators"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [472ebc20] StartUpDG v0.17.7
+  [9f78cca6] SummationByPartsOperators v0.5.51
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/DGSEM_FluxDiff/8bec16c8.svg b/previews/PR1693/tutorials/DGSEM_FluxDiff/8bec16c8.svg new file mode 100644 index 00000000000..0d168595a01 --- /dev/null +++ b/previews/PR1693/tutorials/DGSEM_FluxDiff/8bec16c8.svg @@ -0,0 +1,4089 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGSEM_FluxDiff/b9afdef1.svg b/previews/PR1693/tutorials/DGSEM_FluxDiff/b9afdef1.svg new file mode 100644 index 00000000000..791124bcadc --- /dev/null +++ b/previews/PR1693/tutorials/DGSEM_FluxDiff/b9afdef1.svg @@ -0,0 +1,2845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/DGSEM_FluxDiff/index.html b/previews/PR1693/tutorials/DGSEM_FluxDiff/index.html new file mode 100644 index 00000000000..7496d30dd25 --- /dev/null +++ b/previews/PR1693/tutorials/DGSEM_FluxDiff/index.html @@ -0,0 +1,166 @@ + +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*} +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] +&= - M^{-1} B (\underline{f}^* - \underline{f}) - D \underline{f} +\end{align*}\]

More information about the equivalence you can find in Kopriva, Gassner (2010).

DGSEM with flux differencing

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

\[(D \underline{f})_i = \sum_j D_{i,j} \underline{f}_j += 2\sum_j \frac{1}{2} D_{i,j} (\underline{f}_j + \underline{f}_i) +\eqqcolon 2\sum_j D_{i,j} f_\text{central}(u_i, u_j),\]

we replace $D \underline{f}$ in the strong form by $2D \underline{f}_{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)).

\[\begin{align*} +J \underline{\dot{u}}(t) &= - M^{-1} B (\underline{f}^* - \underline{f}) - 2D \underline{f}_{vol}(u^-, u^+)\\[5pt] +&= - M^{-1} B (\underline{f}^* - \underline{f}_{vol}(\underline{u}, \underline{u})) - 2D \underline{f}_{vol}(u^-, u^+)\\[5pt] +&= - M^{-1} B \underline{f}_{surface}^* - (2D - M^{-1} B) \underline{f}_{vol}\\[5pt] +&= - M^{-1} B \underline{f}_{surface}^* - D_{split} \underline{f}_{vol} +\end{align*}\]

This formulation is in a weak form type formulation and can be implemented by using the derivative split matrix $D_{split}=(2D-M^{-1}B)$ 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.

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.

Implementation in Trixi.jl

Now, we have a look at the implementation of DGSEM with flux differencing with Trixi.jl.

using OrdinaryDiffEq, Trixi

We implement a simulation for the compressible Euler equations in 2D

\[\partial_t \begin{pmatrix} \rho \\ \rho v_1 \\ \rho v_2 \\ \rho e \end{pmatrix} ++ \partial_x \begin{pmatrix} \rho v_1 \\ \rho v_1^2 + p \\ \rho v_1 v_2 \\ (\rho e +p) v_1 \end{pmatrix} ++ \partial_y \begin{pmatrix} \rho v_2 \\ \rho v_1 v_2 \\ \rho v_2^2 + p \\ (\rho e +p) v_2 \end{pmatrix} += \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \end{pmatrix}\]

for an ideal gas with ratio of specific heats $\gamma=1.4$. Here, $\rho$ is the density, $v_1$, $v_2$ the velocities, $e$ the specific total energy and

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

the pressure.

gamma = 1.4
+equations = CompressibleEulerEquations2D(gamma)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ CompressibleEulerEquations2D                                                                     │
+│ ════════════════════════════                                                                     │
+│ #variables: ………………………………………………… 4                                                                │
+│ │ variable 1: …………………………………………… rho                                                              │
+│ │ variable 2: …………………………………………… rho_v1                                                           │
+│ │ variable 3: …………………………………………… rho_v2                                                           │
+│ │ variable 4: …………………………………………… rho_e                                                            │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

As our initial condition we will use a weak blast wave from Hennemann, Gassner (2020). The primitive variables are defined by

\[\begin{pmatrix} \rho \\ v_1 \\ v_2 \\ p \end{pmatrix} += \begin{pmatrix} 1.0 \\ 0.0 \\ 0.0 \\ 1.0 \end{pmatrix} \text{if } \|x\|_2 > 0.5,\; +\text{and } \begin{pmatrix} \rho \\ v_1 \\ v_2 \\ p \end{pmatrix} += \begin{pmatrix} 1.1691 \\ 0.1882 * \cos(\phi) \\ 0.1882 * \sin(\phi) \\ 1.245 \end{pmatrix} \text{else}\]

with $\phi = \tan^{-1}(\frac{x_2}{x_1})$.

This initial condition is implemented in Trixi.jl under the name initial_condition_weak_blast_wave.

initial_condition = initial_condition_weak_blast_wave
initial_condition_weak_blast_wave (generic function with 13 methods)

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.

We will confirm the entropy conservation property numerically.

volume_flux = flux_ranocha # = f_vol
+solver = DGSEM(polydeg=3, surface_flux=volume_flux,
+               volume_integral=VolumeIntegralFluxDifferencing(volume_flux))
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DG{Float64}                                                                                      │
+│ ═══════════                                                                                      │
+│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
+│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
+│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
+│ │ surface flux: ……………………………………… flux_ranocha                                                     │
+│ volume integral: …………………………………… VolumeIntegralFluxDifferencing                                   │
+│ │ volume flux: ………………………………………… flux_ranocha                                                     │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

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.

coordinates_min = (-2.0, -2.0)
+coordinates_max = ( 2.0,  2.0)
+mesh = TreeMesh(coordinates_min, coordinates_max,
+                initial_refinement_level=5,
+                n_cells_max=10_000,
+                periodicity=true)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
+                                    boundary_conditions=boundary_condition_periodic)
+
+# ODE solvers
+tspan = (0.0, 0.4)
+ode = semidiscretize(semi, tspan);

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.

analysis_callback = AnalysisCallback(semi, interval=100);

We now run the simulation using flux_ranocha for both surface and volume flux.

sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,
+            ode_default_options()..., callback=analysis_callback);

+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       1.60000000e-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:       2572.485 MiB
+ #elements:                1024
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       6.25621384e-03   5.88786362e-03   5.81457821e-03   2.34267393e-02
+ Linf error:     1.06470791e-01   2.46283676e-01   1.37585923e-01   3.98685775e-01
+ ∑∂S/∂U ⋅ Uₜ :   2.63255193e-19
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 61                run time:       1.28193466e+00 s
+ Δt:             2.65388338e-06                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  1.28475490e-07 s
+                                               PID:            1.41010342e-07 s
+ #DOFs per field:         16384                alloc'd memory:       2574.213 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
+────────────────────────────────────────────────────────────────────────────────────────────────────

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
+
+gamma = 1.4
+equations = CompressibleEulerEquations2D(gamma)
+
+initial_condition = initial_condition_weak_blast_wave
+
+volume_flux = flux_ranocha # = f_vol
+solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs,
+               volume_integral=VolumeIntegralFluxDifferencing(volume_flux))
+
+coordinates_min = (-2.0, -2.0)
+coordinates_max = ( 2.0,  2.0)
+mesh = TreeMesh(coordinates_min, coordinates_max,
+                initial_refinement_level=5,
+                n_cells_max=10_000,
+                periodicity=true)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
+                                    boundary_conditions=boundary_condition_periodic)
+
+# ODE solvers
+tspan = (0.0, 0.4)
+ode = semidiscretize(semi, tspan);
+
+analysis_callback = AnalysisCallback(semi, interval=100);

We now run the simulation using the volume flux flux_ranocha and surface flux flux_lax_friedrichs.

sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,
+            ode_default_options()..., callback=analysis_callback);

+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       8.00000000e-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:       2658.333 MiB
+ #elements:                1024
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       6.25621384e-03   5.88786362e-03   5.81457821e-03   2.34267393e-02
+ Linf error:     1.06470791e-01   2.46283676e-01   1.37585923e-01   3.98685775e-01
+ ∑∂S/∂U ⋅ Uₜ :   1.75163767e-19
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 37                run time:       7.36751836e-01 s
+ Δt:             9.70561500e-03                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      4.00000000e-01 (100.000%)     time/DOF/rhs!:  1.20057403e-07 s
+                                               PID:            1.32612844e-07 s
+ #DOFs per field:         16384                alloc'd memory:       2660.059 MiB
+ #elements:                1024
+
+ Variable:       rho              rho_v1           rho_v2           rho_e
+ L2 error:       6.13073745e-02   4.96545958e-02   4.96554717e-02   2.24251907e-01
+ 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
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/adaptive_mesh_refinement/513b4dc2.svg b/previews/PR1693/tutorials/adaptive_mesh_refinement/513b4dc2.svg new file mode 100644 index 00000000000..ae4bf04b505 --- /dev/null +++ b/previews/PR1693/tutorials/adaptive_mesh_refinement/513b4dc2.svg @@ -0,0 +1,1518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adaptive_mesh_refinement/index.html b/previews/PR1693/tutorials/adaptive_mesh_refinement/index.html new file mode 100644 index 00000000000..731f630ed04 --- /dev/null +++ b/previews/PR1693/tutorials/adaptive_mesh_refinement/index.html @@ -0,0 +1,91 @@ + +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,
+                                          alpha_max=0.5,
+                                          alpha_min=0.001,
+                                          alpha_smooth=true,
+                                          variable=variable)

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.

amr_indicator = IndicatorMax(semi, variable=variable)

Controllers

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.

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.

amr_controller = ControllerThreeLevel(semi, amr_indicator;
+                                      base_level=4,
+                                      med_level=5, med_threshold=0.1,
+                                      max_level=6, max_threshold=0.6)

You can also set med_level=0 to use the current level as target, see the docstring of ControllerThreeLevel.

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.

amr_controller = ControllerThreeLevelCombined(semi, indicator_primary, indicator_secondary;
+                                              base_level=2,
+                                              med_level=6, med_threshold=0.0003,
+                                              max_level=8, max_threshold=0.003,
+                                              max_threshold_secondary=0.3)

This controller is for instance used in elixir_euler_astro_jet_amr.jl.

Callback

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.

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.

amr_callback = AMRCallback(semi, amr_controller,
+                           interval=5,
+                           adapt_initial_condition=true,
+                           adapt_initial_condition_only_refine=true)

Exemplary simulation

Here, we want to implement a simple AMR simulation of the 2D linear advection equation for a Gaussian pulse.

using OrdinaryDiffEq
+using Trixi
+
+advection_velocity = (0.2, -0.7)
+equations = LinearScalarAdvectionEquation2D(advection_velocity)
+
+initial_condition = initial_condition_gauss
+solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)
+
+coordinates_min = (-5.0, -5.0)
+coordinates_max = ( 5.0,  5.0)
+mesh = TreeMesh(coordinates_min, coordinates_max,
+                initial_refinement_level=4,
+                n_cells_max=30_000)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)
+
+
+tspan = (0.0, 10.0)
+ode = semidiscretize(semi, tspan);

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.

amr_indicator = IndicatorMax(semi, variable=first)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ IndicatorMax                                                                                     │
+│ ════════════                                                                                     │
+│ indicator variable: …………………………… first                                                            │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

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.

amr_controller = ControllerThreeLevel(semi, amr_indicator,
+                                      base_level=4,
+                                      med_level=5, med_threshold=0.1,
+                                      max_level=6, max_threshold=0.6)
+
+amr_callback = AMRCallback(semi, amr_controller,
+                           interval=5,
+                           adapt_initial_condition=true,
+                           adapt_initial_condition_only_refine=true)
+
+stepsize_callback = StepsizeCallback(cfl=0.9)
+
+callbacks = CallbackSet(amr_callback, stepsize_callback);

Running the simulation.

sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),
+            dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
+            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.

+

Source: Trixi.jl's YouTube channel Trixi Framework

The next example is a numerical simulation of an ideal MHD rotor on an unstructured AMR mesh. The used mesh type is a P4estMesh.

+

Source: Trixi.jl's YouTube channel Trixi Framework

For more information, please have a look at the respective links.

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/adding_new_parabolic_terms/a8346e89.svg b/previews/PR1693/tutorials/adding_new_parabolic_terms/a8346e89.svg new file mode 100644 index 00000000000..679a4ef01d5 --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_parabolic_terms/a8346e89.svg @@ -0,0 +1,756 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adding_new_parabolic_terms/index.html b/previews/PR1693/tutorials/adding_new_parabolic_terms/index.html new file mode 100644 index 00000000000..7d7c149239d --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_parabolic_terms/index.html @@ -0,0 +1,94 @@ + +11 Adding new parabolic terms · Trixi.jl

11: Adding new parabolic terms

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.

using OrdinaryDiffEq
+using Trixi
+
+
+advection_velocity = (1.0, 1.0)
+equations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);

Define a new parabolic equation type

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).

struct ConstantAnisotropicDiffusion2D{E, T} <: Trixi.AbstractEquationsParabolic{2, 1}
+  diffusivity::T
+  equations_hyperbolic::E
+end
+
+varnames(variable_mapping, equations_parabolic::ConstantAnisotropicDiffusion2D) =
+  varnames(variable_mapping, equations_parabolic.equations_hyperbolic)
varnames (generic function with 1 method)

Next, we define the viscous flux function. We assume that the mixed hyperbolic-parabolic system is of the form

\[\partial_t u(t,x) + \partial_x (f_1(u) - g_1(u, \nabla u)) + + \partial_y (f_2(u) - g_2(u, \nabla u)) = 0\]

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.

Here, we specialize the flux to our new parabolic equation type ConstantAnisotropicDiffusion2D.

function Trixi.flux(u, gradients, orientation::Integer, equations_parabolic::ConstantAnisotropicDiffusion2D)
+  @unpack diffusivity = equations_parabolic
+  dudx, dudy = gradients
+  if orientation == 1
+    return SVector(diffusivity[1, 1] * dudx + diffusivity[1, 2] * dudy)
+  else # if orientation == 2
+    return SVector(diffusivity[2, 1] * dudx + diffusivity[2, 2] * dudy)
+  end
+end

Defining boundary conditions

Trixi.jl's implementation of parabolic terms discretizes both the gradient and divergence using weak formulation. In other words, we discretize the system

\[\begin{aligned} +\bm{q} &= \nabla u \\ +\bm{\sigma} &= \begin{pmatrix} g_1(u, \bm{q}) \\ g_2(u, \bm{q}) \end{pmatrix} \\ +\text{viscous contribution } &= \nabla \cdot \bm{\sigma} +\end{aligned}\]

Boundary data must be specified for all spatial derivatives, e.g., for both the gradient equation $\bm{q} = \nabla u$ and the divergence of the viscous flux $\nabla \cdot \bm{\sigma}$. We account for this by introducing internal Gradient and Divergence types which are used to dispatch on each type of boundary condition.

As an example, let us introduce a Dirichlet boundary condition with constant boundary data.

struct BoundaryConditionConstantDirichlet{T <: Real}
+  boundary_value::T
+end

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.

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.

@inline function (boundary_condition::BoundaryConditionConstantDirichlet)(flux_inner, u_inner, normal::AbstractVector,
+                                                                          x, t, operator_type::Trixi.Gradient,
+                                                                          equations_parabolic::ConstantAnisotropicDiffusion2D)
+  return boundary_condition.boundary_value
+end

While the gradient acts on the solution u, the divergence acts on the viscous flux $\bm{\sigma}$. Thus, we have to supply boundary data for the Divergence operator that corresponds to $\bm{\sigma}$. However, we've already imposed boundary data on u for a Dirichlet boundary condition, and imposing boundary data for $\bm{\sigma}$ might overconstrain our problem.

Thus, for the Divergence boundary data under a Dirichlet boundary condition, we simply return flux_inner, which is boundary data for $\bm{\sigma}$ computed using the "inner" or interior solution. This way, we supply boundary data for the divergence operation without imposing any additional conditions.

@inline function (boundary_condition::BoundaryConditionConstantDirichlet)(flux_inner, u_inner, normal::AbstractVector,
+                                                                          x, t, operator_type::Trixi.Divergence,
+                                                                          equations_parabolic::ConstantAnisotropicDiffusion2D)
+  return flux_inner
+end

A note on the choice of gradient variables

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.

Putting things together

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.

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.

using Trixi: SMatrix
+diffusivity = 5.0e-2 * SMatrix{2, 2}([2 -1; -1 2])
+equations_parabolic = ConstantAnisotropicDiffusion2D(diffusivity, equations_hyperbolic);
+
+boundary_conditions_hyperbolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1.0)),
+                                    y_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(2.0)),
+                                    y_pos = boundary_condition_do_nothing,
+                                    x_pos = boundary_condition_do_nothing)
+
+boundary_conditions_parabolic = (; x_neg = BoundaryConditionConstantDirichlet(1.0),
+                                   y_neg = BoundaryConditionConstantDirichlet(2.0),
+                                   y_pos = BoundaryConditionConstantDirichlet(0.0),
+                                   x_pos = BoundaryConditionConstantDirichlet(0.0));
+
+solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)
+coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))
+coordinates_max = ( 1.0,  1.0) # maximum coordinates (max(x), max(y))
+mesh = TreeMesh(coordinates_min, coordinates_max,
+                initial_refinement_level=4,
+                periodicity=false, n_cells_max=30_000) # set maximum capacity of tree data structure
+
+initial_condition = (x, t, equations) -> SVector(0.0)
+
+semi = SemidiscretizationHyperbolicParabolic(mesh,
+                                             (equations_hyperbolic, equations_parabolic),
+                                             initial_condition, solver;
+                                             boundary_conditions=(boundary_conditions_hyperbolic,
+                                                                  boundary_conditions_parabolic))
+
+tspan = (0.0, 2.0)
+ode = semidiscretize(semi, tspan)
+callbacks = CallbackSet(SummaryCallback())
+time_int_tol = 1.0e-6
+sol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,
+            ode_default_options()..., callback=callbacks);
+
+using Plots
+plot(sol)
Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/adding_new_scalar_equations/018f0bc9.svg b/previews/PR1693/tutorials/adding_new_scalar_equations/018f0bc9.svg new file mode 100644 index 00000000000..d391bce58a4 --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_scalar_equations/018f0bc9.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adding_new_scalar_equations/049e0dba.svg b/previews/PR1693/tutorials/adding_new_scalar_equations/049e0dba.svg new file mode 100644 index 00000000000..684b2a44477 --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_scalar_equations/049e0dba.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adding_new_scalar_equations/3b8bfadd.svg b/previews/PR1693/tutorials/adding_new_scalar_equations/3b8bfadd.svg new file mode 100644 index 00000000000..1b21d23b5b4 --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_scalar_equations/3b8bfadd.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adding_new_scalar_equations/528e5942.svg b/previews/PR1693/tutorials/adding_new_scalar_equations/528e5942.svg new file mode 100644 index 00000000000..f25cd2b8ac8 --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_scalar_equations/528e5942.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adding_new_scalar_equations/ed13c2c1.svg b/previews/PR1693/tutorials/adding_new_scalar_equations/ed13c2c1.svg new file mode 100644 index 00000000000..fa309d76973 --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_scalar_equations/ed13c2c1.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adding_new_scalar_equations/index.html b/previews/PR1693/tutorials/adding_new_scalar_equations/index.html new file mode 100644 index 00000000000..90a246b2ae4 --- /dev/null +++ b/previews/PR1693/tutorials/adding_new_scalar_equations/index.html @@ -0,0 +1,205 @@ + +8 Adding a new scalar conservation law · Trixi.jl

8: Adding a new scalar conservation law

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

\[\partial_t u(t,x) + \partial_x u(t,x)^3 = 0\]

in a periodic domain in one space dimension. In Trixi.jl, such a mathematical model is encoded as a subtype of Trixi.AbstractEquations.

Basic setup

using Trixi
+
+struct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,
+                                                1 #= number of primary variables, i.e. scalar =#};
+end

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.

Next, we define the physical flux f(u) = u^3 using the calling structure used in Trixi.jl.

Trixi.flux(u, orientation, equation::CubicEquation) = u.^3
+Trixi.varnames(_, ::CubicEquation) = ("scalar",)

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.

That's already enough to run a simple simulation with a standard DGSEM discretization using the non-dissipative central flux at interfaces.

using OrdinaryDiffEq
+
+# Create a simulation setup
+equation = CubicEquation()
+
+initial_condition_sine(x, t, equation::CubicEquation) = SVector(sinpi(x[1]))
+
+mesh = TreeMesh(-1.0, 1.0, # min/max coordinates
+                initial_refinement_level=4,
+                n_cells_max=10^4)
+
+solver = DGSEM(3 #= polynomial degree =#, flux_central)
+
+semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ SemidiscretizationHyperbolic                                                                     │
+│ ════════════════════════════                                                                     │
+│ #spatial dimensions: ………………………… 1                                                                │
+│ mesh: ………………………………………………………………… TreeMesh{1, Trixi.SerialTree{1}} with length 31                  │
+│ equations: …………………………………………………… CubicEquation                                                    │
+│ initial condition: ……………………………… initial_condition_sine                                           │
+│ boundary conditions: ………………………… Trixi.BoundaryConditionPeriodic                                  │
+│ source terms: …………………………………………… nothing                                                          │
+│ solver: …………………………………………………………… DG                                                               │
+│ total #DOFs per field: …………………… 64                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

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.

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.

# Create ODE problem with given time span
+tspan = (0.0, 0.09)
+ode = semidiscretize(semi, tspan)
+
+summary_callback = SummaryCallback()
+callbacks = CallbackSet(summary_callback)
+
+# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks
+sol = solve(ode, SSPRK43();
+            ode_default_options()..., callback=callbacks);

+████████╗██████╗ ██╗██╗  ██╗██╗
+╚══██╔══╝██╔══██╗██║╚██╗██╔╝██║
+   ██║   ██████╔╝██║ ╚███╔╝ ██║
+   ██║   ██╔══██╗██║ ██╔██╗ ██║
+   ██║   ██║  ██║██║██╔╝ ██╗██║
+   ╚═╝   ╚═╝  ╚═╝╚═╝╚═╝  ╚═╝╚═╝
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ SemidiscretizationHyperbolic                                                                     │
+│ ════════════════════════════                                                                     │
+│ #spatial dimensions: ………………………… 1                                                                │
+│ mesh: ………………………………………………………………… TreeMesh{1, Trixi.SerialTree{1}} with length 31                  │
+│ equations: …………………………………………………… CubicEquation                                                    │
+│ initial condition: ……………………………… initial_condition_sine                                           │
+│ boundary conditions: ………………………… Trixi.BoundaryConditionPeriodic                                  │
+│ source terms: …………………………………………… nothing                                                          │
+│ solver: …………………………………………………………… DG                                                               │
+│ total #DOFs per field: …………………… 64                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TreeMesh{1, Trixi.SerialTree{1}}                                                                 │
+│ ════════════════════════════════                                                                 │
+│ center: …………………………………………………………… [0.0]                                                            │
+│ length: …………………………………………………………… 2.0                                                              │
+│ periodicity: ……………………………………………… (true,)                                                          │
+│ current #cells: ……………………………………… 31                                                               │
+│ #leaf-cells: ……………………………………………… 16                                                               │
+│ maximum #cells: ……………………………………… 10000                                                            │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ CubicEquation                                                                                    │
+│ ═════════════                                                                                    │
+│ #variables: ………………………………………………… 1                                                                │
+│ │ variable 1: …………………………………………… scalar                                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DG{Float64}                                                                                      │
+│ ═══════════                                                                                      │
+│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
+│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
+│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
+│ │ surface flux: ……………………………………… flux_central                                                     │
+│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Time integration                                                                                 │
+│ ════════════════                                                                                 │
+│ Start time: ………………………………………………… 0.0                                                              │
+│ Final time: ………………………………………………… 0.09                                                             │
+│ time integrator: …………………………………… SSPRK43                                                          │
+│ adaptive: ……………………………………………………… true                                                             │
+│ abstol: …………………………………………………………… 1.0e-6                                                           │
+│ reltol: …………………………………………………………… 0.001                                                            │
+│ controller: ………………………………………………… PIController{Rational{Int64}}(7//30, 2//15)                      │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Environment information                                                                          │
+│ ═══════════════════════                                                                          │
+│ #threads: ……………………………………………………… 1                                                                │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

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.

using Plots
+plot(sol)
Example block output

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.

Advanced setup

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.

@inline Trixi.flux_godunov(u_ll, u_rr, orientation, equation::CubicEquation) = flux(u_ll, orientation, equation)

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.

# A new setup with dissipation
+semi = remake(semi, solver=DGSEM(3, flux_godunov))
+ode = semidiscretize(semi, tspan)
+sol = solve(ode, SSPRK43(); ode_default_options()...)
+plot!(sol)
Example block output

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).

# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)
+semi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))
+ode = semidiscretize(semi, (0.0, 0.5) #= tspan =#)
+sol = solve(ode, SSPRK43(); ode_default_options()...)
+plot(sol)
Example block output

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

@inline function Trixi.flux_ec(u_ll, u_rr, orientation, equation::CubicEquation)
+  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))
+end

and use a VolumeIntegralFluxDifferencing instead of the standard VolumeIntegralWeakForm in the DGSEM.

# Let's use a provably entropy-dissipative semidiscretization
+semi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))
+ode = semidiscretize(semi, (0.0, 0.5))
+sol = solve(ode, SSPRK43(); ode_default_options()...);
+plot(sol)
Example block output

Possible next steps could be

  • to define Trixi.max_abs_speeds(u, equations::CubicEquation) = 3 * u[1]^2 to use CFL-based time step control via a StepsizeCallback
  • to define quantities of interest like Trixi.entropy(u, equations::CubicEquation) = u[1]^2 and integrate them in a simulation using the AnalysisCallback
  • to experiment with shock-capturing volume integrals VolumeIntegralShockCapturingHG and adaptive mesh refinement AMRCallback

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.

Summary of the code

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.

# Define new physics
+module CubicConservationLaw
+
+using Trixi
+
+struct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,
+                                                1 #= number of primary variables, i.e. scalar =#}
+end
+
+@inline Trixi.flux(u, orientation, equation::CubicEquation) = u.^3
+Trixi.varnames(_, ::CubicEquation) = ("scalar",)
+
+@inline Trixi.flux_godunov(u_ll, u_rr, orientation, equation::CubicEquation) = flux(u_ll, orientation, equation)
+@inline function Trixi.flux_ec(u_ll, u_rr, orientation, equation::CubicEquation)
+  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))
+end
+
+end # module
+
+
+# Create a simulation setup
+import .CubicConservationLaw
+using Trixi
+using OrdinaryDiffEq
+using Plots
+
+equation = CubicConservationLaw.CubicEquation()
+
+initial_condition_sine(x, t, equation::CubicConservationLaw.CubicEquation) = SVector(sinpi(x[1]))
+
+mesh = TreeMesh(-1.0, 1.0, # min/max coordinates
+                initial_refinement_level=4,
+                n_cells_max=10^4)
+
+solver = DGSEM(3 #= polynomial degree =#, flux_central)
+
+semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)
+
+# Create ODE problem with given time span
+tspan = (0.0, 0.1)
+ode = semidiscretize(semi, tspan)
+
+# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks
+sol = solve(ode, SSPRK43(); ode_default_options()...)
+plot(sol)
+
+
+# A new setup with dissipation
+semi = remake(semi, solver=DGSEM(3, flux_godunov))
+ode = semidiscretize(semi, tspan)
+sol = solve(ode, SSPRK43(); ode_default_options()...)
+plot!(sol)
+
+
+# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)
+semi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))
+ode = semidiscretize(semi, (0.0, 0.5))
+sol = solve(ode, SSPRK43(); ode_default_options()...)
+plot(sol)
+
+
+# Let's use a provably entropy-dissipative semidiscretization
+semi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))
+ode = semidiscretize(semi, (0.0, 0.5))
+sol = solve(ode, SSPRK43(); ode_default_options()...)
+plot(sol)
Example block output

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/adding_nonconservative_equation/4831ede8.svg b/previews/PR1693/tutorials/adding_nonconservative_equation/4831ede8.svg new file mode 100644 index 00000000000..f1aea5af0cc --- /dev/null +++ b/previews/PR1693/tutorials/adding_nonconservative_equation/4831ede8.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/adding_nonconservative_equation/index.html b/previews/PR1693/tutorials/adding_nonconservative_equation/index.html new file mode 100644 index 00000000000..b6b04eb3058 --- /dev/null +++ b/previews/PR1693/tutorials/adding_nonconservative_equation/index.html @@ -0,0 +1,243 @@ + +9 Adding a non-conservative equation · Trixi.jl

9: Adding a non-conservative equation

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

\[\left\{ +\begin{aligned}&\partial_t u(t,x) + a(x) \partial_x u(t,x) = 0 \\ +&u(0,x)=\sin(x) \\ +&u(t,-\pi)=u(t,\pi) +\end{aligned} +\right.\]

where $a(x) = 2 + \cos(x)$. The analytic solution is

\[u(t,x)=-\sin \left(2 \tan ^{-1}\left(\sqrt{3} \tan \left(\frac{\sqrt{3} t}{2}-\tan ^{-1}\left(\frac{1}{\sqrt{3}}\tan \left(\frac{x}{2}\right)\right)\right)\right)\right)\]

In Trixi.jl, such a mathematical model is encoded as a subtype of Trixi.AbstractEquations.

Basic setup

Since there is no native support for variable coefficients, we need to transform the PDE to the following system:

\[\left\{ +\begin{aligned}&\partial_t \begin{pmatrix}u(t,x)\\a(t,x) \end{pmatrix} +\begin{pmatrix} a(t,x) \partial_x u(t,x) \\ 0 \end{pmatrix} = 0 \\ +&u(0,x)=\sin(x) \\ +&a(0,x)=2+\cos(x) \\ +&u(t,-\pi)=u(t,\pi) +\end{aligned} +\right.\]

# Define new physics
+using Trixi
+using Trixi: AbstractEquations, get_node_vars
+import Trixi: varnames, default_analysis_integrals, flux, max_abs_speed_naive,
+              have_nonconservative_terms
+
+# Since there is no native support for variable coefficients, we use two
+# variables: one for the basic unknown `u` and another one for the coefficient `a`
+struct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,
+                                                                   2 #= two variables (u,a) =#}
+end
+
+varnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = ("scalar", "advection_velocity")
+
+default_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()
+
+
+# The conservative part of the flux is zero
+flux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)
+
+# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation
+function max_abs_speed_naive(u_ll, u_rr, orientation::Integer, ::NonconservativeLinearAdvectionEquation)
+    _, advection_velocity_ll = u_ll
+    _, advection_velocity_rr = u_rr
+
+    return max(abs(advection_velocity_ll), abs(advection_velocity_rr))
+end
+
+
+# We use nonconservative terms
+have_nonconservative_terms(::NonconservativeLinearAdvectionEquation) = Trixi.True()
+
+# This "nonconservative numerical flux" implements the nonconservative terms.
+# In general, nonconservative terms can be written in the form
+#   g(u) ∂ₓ h(u)
+# Thus, a discrete difference approximation of this nonconservative term needs
+# - `u mine`:  the value of `u` at the current position (for g(u))
+# - `u_other`: the values of `u` in a neighborhood of the current position (for ∂ₓ h(u))
+function flux_nonconservative(u_mine, u_other, orientation,
+                              equations::NonconservativeLinearAdvectionEquation)
+    _, advection_velocity = u_mine
+    scalar, _             = u_other
+
+    return SVector(advection_velocity * scalar, zero(scalar))
+end
flux_nonconservative (generic function with 1 method)

The implementation of nonconservative terms uses a single "nonconservative flux" function flux_nonconservative. It will basically be applied in a loop of the form

du_m(D, u) = sum(D[m, l] * flux_nonconservative(u[m], u[l], 1, equations)) # orientation 1: x

where D is the derivative matrix and u contains the nodal solution values.

Now, we can run a simple simulation using a DGSEM discretization.

# Create a simulation setup
+using Trixi
+using OrdinaryDiffEq
+
+equation = NonconservativeLinearAdvectionEquation()
+
+# You can derive the exact solution for this setup using the method of
+# characteristics
+function initial_condition_sine(x, t, equation::NonconservativeLinearAdvectionEquation)
+    x0 = -2 * atan(sqrt(3) * tan(sqrt(3) / 2 * t - atan(tan(x[1] / 2) / sqrt(3))))
+    scalar = sin(x0)
+    advection_velocity = 2 + cos(x[1])
+    SVector(scalar, advection_velocity)
+end
+
+# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries
+mesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates
+                initial_refinement_level=4, n_cells_max=10^4)
+
+# Create a DGSEM solver with polynomials of degree `polydeg`
+# Remember to pass a tuple of the form `(conservative_flux, nonconservative_flux)`
+# as `surface_flux` and `volume_flux` when working with nonconservative terms
+volume_flux  = (flux_central, flux_nonconservative)
+surface_flux = (flux_lax_friedrichs, flux_nonconservative)
+solver = DGSEM(polydeg=3, surface_flux=surface_flux,
+               volume_integral=VolumeIntegralFluxDifferencing(volume_flux))
+
+# Setup the spatial semidiscretization containing all ingredients
+semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)
+
+# Create an ODE problem with given time span
+tspan = (0.0, 1.0)
+ode = semidiscretize(semi, tspan)
+
+# Set up some standard callbacks summarizing the simulation setup and computing
+# errors of the numerical solution
+summary_callback = SummaryCallback()
+analysis_callback = AnalysisCallback(semi, interval=50)
+callbacks = CallbackSet(summary_callback, analysis_callback)
+
+# OrdinaryDiffEq's `solve` method evolves the solution in time and executes
+# the passed callbacks
+sol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,
+            save_everystep=false, callback=callbacks)
+
+# Print the timer summary
+summary_callback()
+
+# Plot the numerical solution at the final time
+using Plots: plot
+plot(sol)
Example block output

You see a plot of the final solution.

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.

error_1 = analysis_callback(sol).l2 |> first
0.00029609575838969394

Next, we increase the grid resolution by one refinement level and run the simulation again.

mesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates
+                initial_refinement_level=5, n_cells_max=10^4)
+
+semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)
+
+tspan = (0.0, 1.0)
+ode = semidiscretize(semi, tspan);
+
+summary_callback = SummaryCallback()
+analysis_callback = AnalysisCallback(semi, interval=50)
+callbacks = CallbackSet(summary_callback, analysis_callback);
+
+sol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,
+            save_everystep=false, callback=callbacks);
+summary_callback()
+
+error_2 = analysis_callback(sol).l2 |> first
1.8602128505981686e-5
error_1 / error_2
15.917305285493626

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).

Summary of the code

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.

Define new physics

module NonconservativeLinearAdvection
+
+using Trixi
+using Trixi: AbstractEquations, get_node_vars
+import Trixi: varnames, default_analysis_integrals, flux, max_abs_speed_naive,
+              have_nonconservative_terms
+
+# Since there is not yet native support for variable coefficients, we use two
+# variables: one for the basic unknown `u` and another one for the coefficient `a`
+struct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,
+                                                                   2 #= two variables (u,a) =#}
+end
+
+varnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = ("scalar", "advection_velocity")
+
+default_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()
+
+
+# The conservative part of the flux is zero
+flux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)
+
+# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation
+function max_abs_speed_naive(u_ll, u_rr, orientation::Integer, ::NonconservativeLinearAdvectionEquation)
+    _, advection_velocity_ll = u_ll
+    _, advection_velocity_rr = u_rr
+
+    return max(abs(advection_velocity_ll), abs(advection_velocity_rr))
+end
+
+
+# We use nonconservative terms
+have_nonconservative_terms(::NonconservativeLinearAdvectionEquation) = Trixi.True()
+
+# This "nonconservative numerical flux" implements the nonconservative terms.
+# In general, nonconservative terms can be written in the form
+#   g(u) ∂ₓ h(u)
+# Thus, a discrete difference approximation of this nonconservative term needs
+# - `u mine`:  the value of `u` at the current position (for g(u))
+# - `u_other`: the values of `u` in a neighborhood of the current position (for ∂ₓ h(u))
+function flux_nonconservative(u_mine, u_other, orientation,
+                              equations::NonconservativeLinearAdvectionEquation)
+    _, advection_velocity = u_mine
+    scalar, _            = u_other
+
+    return SVector(advection_velocity * scalar, zero(scalar))
+end
+
+end # module
+
+
+
+# Create a simulation setup
+import .NonconservativeLinearAdvection
+using Trixi
+using OrdinaryDiffEq
+
+equation = NonconservativeLinearAdvection.NonconservativeLinearAdvectionEquation()
+
+# You can derive the exact solution for this setup using the method of
+# characteristics
+function initial_condition_sine(x, t, equation::NonconservativeLinearAdvection.NonconservativeLinearAdvectionEquation)
+    x0 = -2 * atan(sqrt(3) * tan(sqrt(3) / 2 * t - atan(tan(x[1] / 2) / sqrt(3))))
+    scalar = sin(x0)
+    advection_velocity = 2 + cos(x[1])
+    SVector(scalar, advection_velocity)
+end
+
+# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries
+mesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates
+                initial_refinement_level=4, n_cells_max=10^4)
+
+# Create a DGSEM solver with polynomials of degree `polydeg`
+# Remember to pass a tuple of the form `(conservative_flux, nonconservative_flux)`
+# as `surface_flux` and `volume_flux` when working with nonconservative terms
+volume_flux  = (flux_central, NonconservativeLinearAdvection.flux_nonconservative)
+surface_flux = (flux_lax_friedrichs, NonconservativeLinearAdvection.flux_nonconservative)
+solver = DGSEM(polydeg=3, surface_flux=surface_flux,
+               volume_integral=VolumeIntegralFluxDifferencing(volume_flux))
+
+# Setup the spatial semidiscretization containing all ingredients
+semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)
+
+# Create an ODE problem with given time span
+tspan = (0.0, 1.0)
+ode = semidiscretize(semi, tspan);
+
+# Set up some standard callbacks summarizing the simulation setup and computing
+# errors of the numerical solution
+summary_callback = SummaryCallback()
+analysis_callback = AnalysisCallback(semi, interval=50)
+callbacks = CallbackSet(summary_callback, analysis_callback);
+
+# OrdinaryDiffEq's `solve` method evolves the solution in time and executes
+# the passed callbacks
+sol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,
+            save_everystep=false);
+
+# Plot the numerical solution at the final time
+using Plots: plot
+plot(sol);

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/custom_semidiscretization/1050cedc.svg b/previews/PR1693/tutorials/custom_semidiscretization/1050cedc.svg new file mode 100644 index 00000000000..5fdebbd1f04 --- /dev/null +++ b/previews/PR1693/tutorials/custom_semidiscretization/1050cedc.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/custom_semidiscretization/12540b46.svg b/previews/PR1693/tutorials/custom_semidiscretization/12540b46.svg new file mode 100644 index 00000000000..2c8bdd9e3fd --- /dev/null +++ b/previews/PR1693/tutorials/custom_semidiscretization/12540b46.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/custom_semidiscretization/4c98d83d.svg b/previews/PR1693/tutorials/custom_semidiscretization/4c98d83d.svg new file mode 100644 index 00000000000..4279bcdc29c --- /dev/null +++ b/previews/PR1693/tutorials/custom_semidiscretization/4c98d83d.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/custom_semidiscretization/feae645f.svg b/previews/PR1693/tutorials/custom_semidiscretization/feae645f.svg new file mode 100644 index 00000000000..5dbb8b5420f --- /dev/null +++ b/previews/PR1693/tutorials/custom_semidiscretization/feae645f.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/custom_semidiscretization/fef3e580.svg b/previews/PR1693/tutorials/custom_semidiscretization/fef3e580.svg new file mode 100644 index 00000000000..1862c66d80a --- /dev/null +++ b/previews/PR1693/tutorials/custom_semidiscretization/fef3e580.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/custom_semidiscretization/index.html b/previews/PR1693/tutorials/custom_semidiscretization/index.html new file mode 100644 index 00000000000..203744b36e9 --- /dev/null +++ b/previews/PR1693/tutorials/custom_semidiscretization/index.html @@ -0,0 +1,597 @@ + +17 Custom semidiscretizations · Trixi.jl

17: Custom semidiscretizations

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.

Overview of the right-hand side evaluation

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.

Standard Trixi.jl setup

In this tutorial, we will consider the linear advection equation with source term

\[\partial_t u(t,x) + \partial_x u(t,x) = -\exp(-t) \sin\bigl(\pi (x - t) \bigr)\]

with periodic boundary conditions in the domain [-1, 1] as a model problem. The initial condition is

\[u(0,x) = \sin(\pi x).\]

The source term results in some damping and the analytical solution

\[u(t,x) = \exp(-t) \sin\bigl(\pi (x - t) \bigr).\]

First, we discretize this equation using the standard functionality of Trixi.jl.

using Trixi, OrdinaryDiffEq, Plots

The linear scalar advection equation is already implemented in Trixi.jl as LinearScalarAdvectionEquation1D. We construct it with an advection velocity 1.0.

equations = LinearScalarAdvectionEquation1D(1.0)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ LinearScalarAdvectionEquation1D                                                                  │
+│ ═══════════════════════════════                                                                  │
+│ #variables: ………………………………………………… 1                                                                │
+│ │ variable 1: …………………………………………… scalar                                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

Next, we use a standard DGSEM solver.

solver = DGSEM(polydeg = 3)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DG{Float64}                                                                                      │
+│ ═══════════                                                                                      │
+│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
+│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
+│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
+│ │ surface flux: ……………………………………… flux_central                                                     │
+│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

We create a simple TreeMesh in 1D.

coordinates_min = (-1.0,)
+coordinates_max = (+1.0,)
+mesh = TreeMesh(coordinates_min, coordinates_max;
+                initial_refinement_level = 4,
+                n_cells_max = 10^4,
+                periodicity = true)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TreeMesh{1, Trixi.SerialTree{1}}                                                                 │
+│ ════════════════════════════════                                                                 │
+│ center: …………………………………………………………… [0.0]                                                            │
+│ length: …………………………………………………………… 2.0                                                              │
+│ periodicity: ……………………………………………… (true,)                                                          │
+│ current #cells: ……………………………………… 31                                                               │
+│ #leaf-cells: ……………………………………………… 16                                                               │
+│ maximum #cells: ……………………………………… 10000                                                            │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

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.

function initial_condition(x, t, equations)
+    return SVector(exp(-t) * sinpi(x[1] - t))
+end
+
+function source_terms_standard(u, x, t, equations)
+    return -initial_condition(x, t, equations)
+end
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition,
+                                    solver;
+                                    source_terms = source_terms_standard)
┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ SemidiscretizationHyperbolic                                                                     │
+│ ════════════════════════════                                                                     │
+│ #spatial dimensions: ………………………… 1                                                                │
+│ mesh: ………………………………………………………………… TreeMesh{1, Trixi.SerialTree{1}} with length 31                  │
+│ equations: …………………………………………………… LinearScalarAdvectionEquation1D                                  │
+│ initial condition: ……………………………… initial_condition                                                │
+│ boundary conditions: ………………………… Trixi.BoundaryConditionPeriodic                                  │
+│ source terms: …………………………………………… source_terms_standard                                            │
+│ solver: …………………………………………………………… DG                                                               │
+│ total #DOFs per field: …………………… 64                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘

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.

tspan = (0.0, 3.0)
+ode = semidiscretize(semi, tspan)
+
+sol = solve(ode, RDPK3SpFSAL49(); ode_default_options()...)
+
+plot(sol; label = "numerical sol.", legend = :topright)
Example block output

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.

let
+   x = range(-1.0, 1.0; length = 200)
+   plot!(x, first.(initial_condition.(x, sol.t[end], equations)),
+         label = "analytical sol.", linestyle = :dash, legend = :topright)
+end
Example block output

We can also add the initial condition to the plot.

plot!(sol.u[1], semi, label = "u0", linestyle = :dot, legend = :topleft)
Example block output

You can of course also use some callbacks provided by Trixi.jl as usual.

summary_callback = SummaryCallback()
+analysis_interval = 100
+analysis_callback = AnalysisCallback(semi; interval = analysis_interval)
+alive_callback = AliveCallback(; analysis_interval)
+callbacks = CallbackSet(summary_callback,
+                        analysis_callback,
+                        alive_callback)
+
+sol = solve(ode, RDPK3SpFSAL49();
+            ode_default_options()..., callback = callbacks)
+summary_callback()

+████████╗██████╗ ██╗██╗  ██╗██╗
+╚══██╔══╝██╔══██╗██║╚██╗██╔╝██║
+   ██║   ██████╔╝██║ ╚███╔╝ ██║
+   ██║   ██╔══██╗██║ ██╔██╗ ██║
+   ██║   ██║  ██║██║██╔╝ ██╗██║
+   ╚═╝   ╚═╝  ╚═╝╚═╝╚═╝  ╚═╝╚═╝
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ SemidiscretizationHyperbolic                                                                     │
+│ ════════════════════════════                                                                     │
+│ #spatial dimensions: ………………………… 1                                                                │
+│ mesh: ………………………………………………………………… TreeMesh{1, Trixi.SerialTree{1}} with length 31                  │
+│ equations: …………………………………………………… LinearScalarAdvectionEquation1D                                  │
+│ initial condition: ……………………………… initial_condition                                                │
+│ boundary conditions: ………………………… Trixi.BoundaryConditionPeriodic                                  │
+│ source terms: …………………………………………… source_terms_standard                                            │
+│ solver: …………………………………………………………… DG                                                               │
+│ total #DOFs per field: …………………… 64                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TreeMesh{1, Trixi.SerialTree{1}}                                                                 │
+│ ════════════════════════════════                                                                 │
+│ center: …………………………………………………………… [0.0]                                                            │
+│ length: …………………………………………………………… 2.0                                                              │
+│ periodicity: ……………………………………………… (true,)                                                          │
+│ current #cells: ……………………………………… 31                                                               │
+│ #leaf-cells: ……………………………………………… 16                                                               │
+│ maximum #cells: ……………………………………… 10000                                                            │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ LinearScalarAdvectionEquation1D                                                                  │
+│ ═══════════════════════════════                                                                  │
+│ #variables: ………………………………………………… 1                                                                │
+│ │ variable 1: …………………………………………… scalar                                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DG{Float64}                                                                                      │
+│ ═══════════                                                                                      │
+│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
+│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
+│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
+│ │ surface flux: ……………………………………… flux_central                                                     │
+│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ AnalysisCallback                                                                                 │
+│ ════════════════                                                                                 │
+│ interval: ……………………………………………………… 100                                                              │
+│ analyzer: ……………………………………………………… LobattoLegendreAnalyzer{Float64}(polydeg=6)                      │
+│ │ error 1: …………………………………………………… l2_error                                                         │
+│ │ error 2: …………………………………………………… linf_error                                                       │
+│ │ integral 1: …………………………………………… entropy_timederivative                                           │
+│ save analysis to file: …………………… no                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ AliveCallback                                                                                    │
+│ ═════════════                                                                                    │
+│ interval: ……………………………………………………… 10                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Time integration                                                                                 │
+│ ════════════════                                                                                 │
+│ Start time: ………………………………………………… 0.0                                                              │
+│ Final time: ………………………………………………… 3.0                                                              │
+│ time integrator: …………………………………… RDPK3SpFSAL49                                                    │
+│ adaptive: ……………………………………………………… true                                                             │
+│ abstol: …………………………………………………………… 1.0e-6                                                           │
+│ reltol: …………………………………………………………… 0.001                                                            │
+│ controller: ………………………………………………… PIDController(beta=[0.38, -0.18,…iter=default_dt_factor_limiter) │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Environment information                                                                          │
+│ ═══════════════════════                                                                          │
+│ #threads: ……………………………………………………… 1                                                                │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'LinearScalarAdvectionEquation1D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       9.00000000e-07 s
+ Δt:             0.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:  5.82821940e-08 s
+                                               PID:                   Inf s
+ #DOFs per field:            64                alloc'd memory:       2802.395 MiB
+ #elements:                  16
+
+ Variable:       scalar
+ L2 error:       5.57368408e-06
+ Linf error:     1.21294882e-05
+ ∑∂S/∂U ⋅ Uₜ :  -5.00000000e-01
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+#timesteps:     10 │ Δt: 9.9686e-02 │ sim. time: 3.4078e-01 (11.359%)  │ run time: 3.6593e-04 s
+#timesteps:     20 │ Δt: 8.5503e-02 │ sim. time: 1.2059e+00 (40.198%)  │ run time: 7.6456e-04 s
+#timesteps:     30 │ Δt: 6.9464e-02 │ sim. time: 1.9556e+00 (65.188%)  │ run time: 1.1219e-03 s
+#timesteps:     40 │ Δt: 8.5031e-02 │ sim. time: 2.7005e+00 (90.016%)  │ run time: 1.4774e-03 s
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'LinearScalarAdvectionEquation1D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 45                run time:       1.99564600e-03 s
+ Δt:             4.31148548e-02                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      3.00000000e+00 (100.000%)     time/DOF/rhs!:  5.57568780e-08 s
+                                               PID:            6.23809203e-08 s
+ #DOFs per field:            64                alloc'd memory:       2802.436 MiB
+ #elements:                  16
+
+ Variable:       scalar
+ L2 error:       3.33421293e-05
+ Linf error:     1.31835569e-04
+ ∑∂S/∂U ⋅ Uₜ :  -1.23948350e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+Trixi.jl simulation finished.  Final time: 3.0  Time steps: 45 (accepted), 46 (total)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ ────────────────────────────────────────────────────────────────────────────────
+            Trixi.jl                    Time                    Allocations
+                               ───────────────────────   ────────────────────────
+       Tot / % measured:           2.97ms /  68.4%           97.9KiB /  48.2%
+
+ Section               ncalls     time    %tot     avg     alloc    %tot      avg
+ ────────────────────────────────────────────────────────────────────────────────
+ rhs!                     417   1.43ms   70.3%  3.43μs   6.61KiB   14.0%    16.2B
+   source terms           417    631μs   31.0%  1.51μs     0.00B    0.0%    0.00B
+   ~rhs!~                 417    430μs   21.1%  1.03μs   6.61KiB   14.0%    16.2B
+   volume integral        417    164μs    8.0%   392ns     0.00B    0.0%    0.00B
+   interface flux         417   65.8μs    3.2%   158ns     0.00B    0.0%    0.00B
+   prolong2interfaces     417   37.7μs    1.9%  90.4ns     0.00B    0.0%    0.00B
+   surface integral       417   28.7μs    1.4%  68.8ns     0.00B    0.0%    0.00B
+   Jacobian               417   22.7μs    1.1%  54.4ns     0.00B    0.0%    0.00B
+   reset ∂u/∂t            417   18.6μs    0.9%  44.6ns     0.00B    0.0%    0.00B
+   prolong2boundaries     417   18.1μs    0.9%  43.4ns     0.00B    0.0%    0.00B
+   boundary flux          417   14.2μs    0.7%  34.1ns     0.00B    0.0%    0.00B
+ analyze solution           2    603μs   29.7%   302μs   40.6KiB   86.0%  20.3KiB
+ ────────────────────────────────────────────────────────────────────────────────

Using a custom ODE right-hand side function

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.

const GLOBAL_TIME = Ref(0.0)
+
+function source_terms_custom(u, x, t, equations)
+    t = GLOBAL_TIME[]
+    return -initial_condition(x, t, equations)
+end
source_terms_custom (generic function with 1 method)

Next, we create our own RHS function to update the global time of the simulation before calling the RHS function from Trixi.jl.

function rhs_source_custom!(du_ode, u_ode, semi, t)
+    GLOBAL_TIME[] = t
+    Trixi.rhs!(du_ode, u_ode, semi, t)
+end
rhs_source_custom! (generic function with 1 method)

Next, we create an ODEProblem manually copying over the data from the one we got from semidiscretize earlier.

ode_source_custom = ODEProblem(rhs_source_custom!,
+                               ode.u0,
+                               ode.tspan,
+                               ode.p #= semi =#)
+sol_source_custom = solve(ode_source_custom, RDPK3SpFSAL49();
+                          ode_default_options()...)
+
+plot(sol_source_custom; label = "numerical sol.")
+let
+    x = range(-1.0, 1.0; length = 200)
+    plot!(x, first.(initial_condition.(x, sol_source_custom.t[end], equations)),
+          label = "analytical sol.", linestyle = :dash, legend = :topleft)
+end
+plot!(sol_source_custom.u[1], semi, label = "u0", linestyle = :dot, legend = :topleft)
Example block output

This also works with callbacks as usual.

summary_callback = SummaryCallback()
+analysis_interval = 100
+analysis_callback = AnalysisCallback(semi; interval = analysis_interval)
+alive_callback = AliveCallback(; analysis_interval)
+callbacks = CallbackSet(summary_callback,
+                        analysis_callback,
+                        alive_callback)
+
+sol = solve(ode_source_custom, RDPK3SpFSAL49();
+            ode_default_options()..., callback = callbacks)
+summary_callback()

+████████╗██████╗ ██╗██╗  ██╗██╗
+╚══██╔══╝██╔══██╗██║╚██╗██╔╝██║
+   ██║   ██████╔╝██║ ╚███╔╝ ██║
+   ██║   ██╔══██╗██║ ██╔██╗ ██║
+   ██║   ██║  ██║██║██╔╝ ██╗██║
+   ╚═╝   ╚═╝  ╚═╝╚═╝╚═╝  ╚═╝╚═╝
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ SemidiscretizationHyperbolic                                                                     │
+│ ════════════════════════════                                                                     │
+│ #spatial dimensions: ………………………… 1                                                                │
+│ mesh: ………………………………………………………………… TreeMesh{1, Trixi.SerialTree{1}} with length 31                  │
+│ equations: …………………………………………………… LinearScalarAdvectionEquation1D                                  │
+│ initial condition: ……………………………… initial_condition                                                │
+│ boundary conditions: ………………………… Trixi.BoundaryConditionPeriodic                                  │
+│ source terms: …………………………………………… source_terms_standard                                            │
+│ solver: …………………………………………………………… DG                                                               │
+│ total #DOFs per field: …………………… 64                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TreeMesh{1, Trixi.SerialTree{1}}                                                                 │
+│ ════════════════════════════════                                                                 │
+│ center: …………………………………………………………… [0.0]                                                            │
+│ length: …………………………………………………………… 2.0                                                              │
+│ periodicity: ……………………………………………… (true,)                                                          │
+│ current #cells: ……………………………………… 31                                                               │
+│ #leaf-cells: ……………………………………………… 16                                                               │
+│ maximum #cells: ……………………………………… 10000                                                            │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ LinearScalarAdvectionEquation1D                                                                  │
+│ ═══════════════════════════════                                                                  │
+│ #variables: ………………………………………………… 1                                                                │
+│ │ variable 1: …………………………………………… scalar                                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DG{Float64}                                                                                      │
+│ ═══════════                                                                                      │
+│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
+│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
+│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
+│ │ surface flux: ……………………………………… flux_central                                                     │
+│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ AnalysisCallback                                                                                 │
+│ ════════════════                                                                                 │
+│ interval: ……………………………………………………… 100                                                              │
+│ analyzer: ……………………………………………………… LobattoLegendreAnalyzer{Float64}(polydeg=6)                      │
+│ │ error 1: …………………………………………………… l2_error                                                         │
+│ │ error 2: …………………………………………………… linf_error                                                       │
+│ │ integral 1: …………………………………………… entropy_timederivative                                           │
+│ save analysis to file: …………………… no                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ AliveCallback                                                                                    │
+│ ═════════════                                                                                    │
+│ interval: ……………………………………………………… 10                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Time integration                                                                                 │
+│ ════════════════                                                                                 │
+│ Start time: ………………………………………………… 0.0                                                              │
+│ Final time: ………………………………………………… 3.0                                                              │
+│ time integrator: …………………………………… RDPK3SpFSAL49                                                    │
+│ adaptive: ……………………………………………………… true                                                             │
+│ abstol: …………………………………………………………… 1.0e-6                                                           │
+│ reltol: …………………………………………………………… 0.001                                                            │
+│ controller: ………………………………………………… PIDController(beta=[0.38, -0.18,…iter=default_dt_factor_limiter) │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Environment information                                                                          │
+│ ═══════════════════════                                                                          │
+│ #threads: ……………………………………………………… 1                                                                │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'LinearScalarAdvectionEquation1D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       9.00000000e-07 s
+ Δt:             0.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:  5.74681003e-08 s
+                                               PID:                   Inf s
+ #DOFs per field:            64                alloc'd memory:       2711.838 MiB
+ #elements:                  16
+
+ Variable:       scalar
+ L2 error:       5.57368408e-06
+ Linf error:     1.21294882e-05
+ ∑∂S/∂U ⋅ Uₜ :  -5.00000000e-01
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+#timesteps:     10 │ Δt: 9.9686e-02 │ sim. time: 3.4078e-01 (11.359%)  │ run time: 3.7902e-04 s
+#timesteps:     20 │ Δt: 8.5503e-02 │ sim. time: 1.2059e+00 (40.198%)  │ run time: 7.8304e-04 s
+#timesteps:     30 │ Δt: 6.9464e-02 │ sim. time: 1.9556e+00 (65.188%)  │ run time: 1.1414e-03 s
+#timesteps:     40 │ Δt: 8.5031e-02 │ sim. time: 2.7005e+00 (90.016%)  │ run time: 1.5222e-03 s
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'LinearScalarAdvectionEquation1D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 45                run time:       2.05560900e-03 s
+ Δt:             4.31148548e-02                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      3.00000000e+00 (100.000%)     time/DOF/rhs!:  5.73110795e-08 s
+                                               PID:            6.41895609e-08 s
+ #DOFs per field:            64                alloc'd memory:       2711.879 MiB
+ #elements:                  16
+
+ Variable:       scalar
+ L2 error:       3.33421293e-05
+ Linf error:     1.31835569e-04
+ ∑∂S/∂U ⋅ Uₜ :  -1.23948350e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+Trixi.jl simulation finished.  Final time: 3.0  Time steps: 45 (accepted), 46 (total)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ ────────────────────────────────────────────────────────────────────────────────
+            Trixi.jl                    Time                    Allocations
+                               ───────────────────────   ────────────────────────
+       Tot / % measured:           3.01ms /  69.2%           98.1KiB /  48.1%
+
+ Section               ncalls     time    %tot     avg     alloc    %tot      avg
+ ────────────────────────────────────────────────────────────────────────────────
+ rhs!                     417   1.47ms   70.6%  3.52μs   6.61KiB   14.0%    16.2B
+   source terms           417    641μs   30.8%  1.54μs     0.00B    0.0%    0.00B
+   ~rhs!~                 417    444μs   21.3%  1.07μs   6.61KiB   14.0%    16.2B
+   volume integral        417    179μs    8.6%   430ns     0.00B    0.0%    0.00B
+   interface flux         417   62.6μs    3.0%   150ns     0.00B    0.0%    0.00B
+   prolong2interfaces     417   36.9μs    1.8%  88.5ns     0.00B    0.0%    0.00B
+   surface integral       417   29.5μs    1.4%  70.7ns     0.00B    0.0%    0.00B
+   Jacobian               417   23.2μs    1.1%  55.6ns     0.00B    0.0%    0.00B
+   prolong2boundaries     417   20.0μs    1.0%  48.0ns     0.00B    0.0%    0.00B
+   reset ∂u/∂t            417   18.9μs    0.9%  45.3ns     0.00B    0.0%    0.00B
+   boundary flux          417   13.5μs    0.6%  32.4ns     0.00B    0.0%    0.00B
+ analyze solution           2    612μs   29.4%   306μs   40.6KiB   86.0%  20.3KiB
+ ────────────────────────────────────────────────────────────────────────────────

Setting up a custom semidiscretization

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.

struct CustomSemidiscretization{Semi, T} <: Trixi.AbstractSemidiscretization
+    semi::Semi
+    t::T
+end
+
+semi_custom = CustomSemidiscretization(semi, Ref(0.0))
Main.CustomSemidiscretization{SemidiscretizationHyperbolic{TreeMesh{1, Trixi.SerialTree{1}}, LinearScalarAdvectionEquation1D{Float64}, typeof(Main.initial_condition), Trixi.BoundaryConditionPeriodic, typeof(Main.source_terms_standard), DGSEM{LobattoLegendreBasis{Float64, 4, SVector{4, Float64}, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}}, Trixi.LobattoLegendreMortarL2{Float64, 4, Matrix{Float64}, Matrix{Float64}}, SurfaceIntegralWeakForm{typeof(flux_central)}, VolumeIntegralWeakForm}, NamedTuple{(:elements, :interfaces, :boundaries), Tuple{Trixi.ElementContainer1D{Float64, Float64}, Trixi.InterfaceContainer1D{Float64}, Trixi.BoundaryContainer1D{Float64, Float64}}}}, Base.RefValue{Float64}}(SemidiscretizationHyperbolic(TreeMesh{1, Trixi.SerialTree{1}} with length 31, LinearScalarAdvectionEquation1D with one variable, initial_condition, boundary_condition_periodic, source_terms_standard, DG{Float64}(LobattoLegendreBasis{Float64}(polydeg=3), LobattoLegendreMortarL2{Float64}(polydeg=3), SurfaceIntegralWeakForm{typeof(flux_central)}(Trixi.flux_central), VolumeIntegralWeakForm()), cache(elements interfaces boundaries)), Base.RefValue{Float64}(0.0))

To get pretty printing in the REPL, you can consider specializing

  • Base.show(io::IO, parameters::CustomSemidiscretization)
  • Base.show(io::IO, ::MIME"text/plain", parameters::CustomSemidiscretization)

for your custom semidiscretiation.

Next, we create our own source terms that use the global time stored in the custom semidiscretiation.

source_terms_custom_semi = let semi_custom = semi_custom
+    function source_terms_custom_semi(u, x, t, equations)
+        t = semi_custom.t[]
+        return -initial_condition(x, t, equations)
+    end
+end
source_terms_custom_semi (generic function with 1 method)

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!.

function rhs_semi_custom!(du_ode, u_ode, semi_custom, t)
+    semi_custom.t[] = t
+    Trixi.rhs!(du_ode, u_ode, semi_custom.semi, t)
+end
rhs_semi_custom! (generic function with 1 method)

Finally, we set up an ODEProblem and solve it numerically.

ode_semi_custom = ODEProblem(rhs_semi_custom!,
+                             ode.u0,
+                             ode.tspan,
+                             semi_custom)
+sol_semi_custom = solve(ode_semi_custom, RDPK3SpFSAL49();
+                        ode_default_options()...)
retcode: Success
+Interpolation: 1st order linear
+t: 2-element Vector{Float64}:
+ 0.0
+ 3.0
+u: 2-element Vector{Vector{Float64}}:
+ [-3.487868498008632e-16, -0.1083263689449018, -0.2803509724255764, -0.38268343236508945, -0.3826834323650901, -0.48051200262449845, -0.6263474196321541, -0.7071067811865472, -0.7071067811865478, -0.7795440397566659  …  0.7795440397566659, 0.7071067811865478, 0.7071067811865472, 0.6263474196321541, 0.48051200262449845, 0.3826834323650901, 0.38268343236508945, 0.2803509724255764, 0.1083263689449018, 3.487868498008632e-16]
+ [0.00039320882668261985, 0.005593037571101643, 0.014211415234637079, 0.019097988726944525, 0.01932495108774102, 0.02399181705537257, 0.03128895202056526, 0.0351157802915657, 0.03531125107864154, 0.03873867502331451  …  -0.03840107811685022, -0.034871915240701996, -0.03475449432652092, -0.030829250470936792, -0.02350420904170509, -0.018777711432434757, -0.01859676365228886, -0.013658085806813441, -0.005028839697000977, 0.00017159954909493918]

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.

Base.ndims(semi::CustomSemidiscretization) = ndims(semi.semi)
+function Trixi.mesh_equations_solver_cache(semi::CustomSemidiscretization)
+    Trixi.mesh_equations_solver_cache(semi.semi)
+end

Now, we can plot the numerical solution as usual.

plot(sol_semi_custom; label = "numerical sol.")
+let
+    x = range(-1.0, 1.0; length = 200)
+    plot!(x, first.(initial_condition.(x, sol_semi_custom.t[end], equations)),
+          label = "analytical sol.", linestyle = :dash, legend = :topleft)
+end
+plot!(sol_semi_custom.u[1], semi, label = "u0", linestyle = :dot, legend = :topleft)
Example block output

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.

function Base.getproperty(semi::CustomSemidiscretization, s::Symbol)
+    if s === :performance_counter
+        wrapped_semi = getfield(semi, :semi)
+        wrapped_semi.performance_counter
+    else
+        getfield(semi, s)
+    end
+end

Moreover, the AnalysisCallback also performs some error calculations. We also need to forward them to the wrapped semidiscretization.

function Trixi.calc_error_norms(func, u, t, analyzer,
+                                semi::CustomSemidiscretization,
+                                cache_analysis)
+    Trixi.calc_error_norms(func, u, t, analyzer,
+                           semi.semi,
+                           cache_analysis)
+end

Now, we can work with the callbacks used before as usual.

summary_callback = SummaryCallback()
+analysis_interval = 100
+analysis_callback = AnalysisCallback(semi_custom;
+                                     interval = analysis_interval)
+alive_callback = AliveCallback(; analysis_interval)
+callbacks = CallbackSet(summary_callback,
+                        analysis_callback,
+                        alive_callback)
+
+sol = solve(ode_semi_custom, RDPK3SpFSAL49();
+            ode_default_options()..., callback = callbacks)
+summary_callback()

+████████╗██████╗ ██╗██╗  ██╗██╗
+╚══██╔══╝██╔══██╗██║╚██╗██╔╝██║
+   ██║   ██████╔╝██║ ╚███╔╝ ██║
+   ██║   ██╔══██╗██║ ██╔██╗ ██║
+   ██║   ██║  ██║██║██╔╝ ██╗██║
+   ╚═╝   ╚═╝  ╚═╝╚═╝╚═╝  ╚═╝╚═╝
+
+Main.CustomSemidiscretization{SemidiscretizationHyperbolic{TreeMesh{1, Trixi.SerialTree{1}}, LinearScalarAdvectionEquation1D{Float64}, typeof(Main.initial_condition), Trixi.BoundaryConditionPeriodic, typeof(Main.source_terms_standard), DG{LobattoLegendreBasis{Float64, 4, StaticArraysCore.SArray{Tuple{4}, Float64, 1, 4}, Array{Float64, 2}, Array{Float64, 2}, Array{Float64, 2}}, Trixi.LobattoLegendreMortarL2{Float64, 4, Array{Float64, 2}, Array{Float64, 2}}, SurfaceIntegralWeakForm{typeof(flux_central)}, VolumeIntegralWeakForm}, NamedTuple{(:elements, :interfaces, :boundaries), Tuple{Trixi.ElementContainer1D{Float64, Float64}, Trixi.InterfaceContainer1D{Float64}, Trixi.BoundaryContainer1D{Float64, Float64}}}}, Base.RefValue{Float64}}(SemidiscretizationHyperbolic(TreeMesh{1, Trixi.SerialTree{1}} with length 31, LinearScalarAdvectionEquation1D with one variable, initial_condition, boundary_condition_periodic, source_terms_standard, DG{Float64}(LobattoLegendreBasis{Float64}(polydeg=3), LobattoLegendreMortarL2{Float64}(polydeg=3), SurfaceIntegralWeakForm{typeof(flux_central)}(Trixi.flux_central), VolumeIntegralWeakForm()), cache(elements interfaces boundaries)), Base.RefValue{Float64}(3.0))
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ TreeMesh{1, Trixi.SerialTree{1}}                                                                 │
+│ ════════════════════════════════                                                                 │
+│ center: …………………………………………………………… [0.0]                                                            │
+│ length: …………………………………………………………… 2.0                                                              │
+│ periodicity: ……………………………………………… (true,)                                                          │
+│ current #cells: ……………………………………… 31                                                               │
+│ #leaf-cells: ……………………………………………… 16                                                               │
+│ maximum #cells: ……………………………………… 10000                                                            │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ LinearScalarAdvectionEquation1D                                                                  │
+│ ═══════════════════════════════                                                                  │
+│ #variables: ………………………………………………… 1                                                                │
+│ │ variable 1: …………………………………………… scalar                                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ DG{Float64}                                                                                      │
+│ ═══════════                                                                                      │
+│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
+│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
+│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
+│ │ surface flux: ……………………………………… flux_central                                                     │
+│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ AnalysisCallback                                                                                 │
+│ ════════════════                                                                                 │
+│ interval: ……………………………………………………… 100                                                              │
+│ analyzer: ……………………………………………………… LobattoLegendreAnalyzer{Float64}(polydeg=6)                      │
+│ │ error 1: …………………………………………………… l2_error                                                         │
+│ │ error 2: …………………………………………………… linf_error                                                       │
+│ │ integral 1: …………………………………………… entropy_timederivative                                           │
+│ save analysis to file: …………………… no                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ AliveCallback                                                                                    │
+│ ═════════════                                                                                    │
+│ interval: ……………………………………………………… 10                                                               │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Time integration                                                                                 │
+│ ════════════════                                                                                 │
+│ Start time: ………………………………………………… 0.0                                                              │
+│ Final time: ………………………………………………… 3.0                                                              │
+│ time integrator: …………………………………… RDPK3SpFSAL49                                                    │
+│ adaptive: ……………………………………………………… true                                                             │
+│ abstol: …………………………………………………………… 1.0e-6                                                           │
+│ reltol: …………………………………………………………… 0.001                                                            │
+│ controller: ………………………………………………… PIDController(beta=[0.38, -0.18,…iter=default_dt_factor_limiter) │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ Environment information                                                                          │
+│ ═══════════════════════                                                                          │
+│ #threads: ……………………………………………………… 1                                                                │
+└──────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'LinearScalarAdvectionEquation1D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                  0                run time:       8.00000000e-07 s
+ Δt:             0.00000000e+00                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      0.00000000e+00 (0.000%)       time/DOF/rhs!:  5.58346219e-08 s
+                                               PID:                   Inf s
+ #DOFs per field:            64                alloc'd memory:       2769.917 MiB
+ #elements:                  16
+
+ Variable:       scalar
+ L2 error:       5.57368408e-06
+ Linf error:     1.21294882e-05
+ ∑∂S/∂U ⋅ Uₜ :  -5.00000000e-01
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+#timesteps:     10 │ Δt: 9.9686e-02 │ sim. time: 3.4078e-01 (11.359%)  │ run time: 3.8383e-04 s
+#timesteps:     20 │ Δt: 8.5503e-02 │ sim. time: 1.2059e+00 (40.198%)  │ run time: 7.8346e-04 s
+#timesteps:     30 │ Δt: 6.9464e-02 │ sim. time: 1.9556e+00 (65.188%)  │ run time: 1.1371e-03 s
+#timesteps:     40 │ Δt: 8.5031e-02 │ sim. time: 2.7005e+00 (90.016%)  │ run time: 1.5024e-03 s
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ Simulation running 'LinearScalarAdvectionEquation1D' with DGSEM(polydeg=3)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+ #timesteps:                 45                run time:       9.45660400e-03 s
+ Δt:             4.31148548e-02                └── GC time:    0.00000000e+00 s (0.000%)
+ sim. time:      3.00000000e+00 (100.000%)     time/DOF/rhs!:  5.66990505e-08 s
+                                               PID:            6.32616157e-08 s
+ #DOFs per field:            64                alloc'd memory:       2770.246 MiB
+ #elements:                  16
+
+ Variable:       scalar
+ L2 error:       3.33421293e-05
+ Linf error:     1.31835569e-04
+ ∑∂S/∂U ⋅ Uₜ :  -1.23948350e-03
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+────────────────────────────────────────────────────────────────────────────────────────────────────
+Trixi.jl simulation finished.  Final time: 3.0  Time steps: 45 (accepted), 46 (total)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ ────────────────────────────────────────────────────────────────────────────────
+            Trixi.jl                    Time                    Allocations
+                               ───────────────────────   ────────────────────────
+       Tot / % measured:           10.4ms /  91.1%            391KiB /  87.3%
+
+ Section               ncalls     time    %tot     avg     alloc    %tot      avg
+ ────────────────────────────────────────────────────────────────────────────────
+ analyze solution           2   8.04ms   84.7%  4.02ms    335KiB   98.1%   167KiB
+ rhs!                     417   1.45ms   15.3%  3.47μs   6.61KiB    1.9%    16.2B
+   source terms           417    647μs    6.8%  1.55μs     0.00B    0.0%    0.00B
+   ~rhs!~                 417    418μs    4.4%  1.00μs   6.61KiB    1.9%    16.2B
+   volume integral        417    169μs    1.8%   406ns     0.00B    0.0%    0.00B
+   interface flux         417   68.1μs    0.7%   163ns     0.00B    0.0%    0.00B
+   prolong2interfaces     417   43.2μs    0.5%   104ns     0.00B    0.0%    0.00B
+   surface integral       417   28.1μs    0.3%  67.4ns     0.00B    0.0%    0.00B
+   Jacobian               417   23.1μs    0.2%  55.4ns     0.00B    0.0%    0.00B
+   reset ∂u/∂t            417   20.6μs    0.2%  49.4ns     0.00B    0.0%    0.00B
+   prolong2boundaries     417   16.8μs    0.2%  40.3ns     0.00B    0.0%    0.00B
+   boundary flux          417   15.2μs    0.2%  36.5ns     0.00B    0.0%    0.00B
+ ────────────────────────────────────────────────────────────────────────────────

For even more advanced usage of custom semidiscretizations, you may look at the source code of the ones contained in Trixi.jl, e.g.,

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/differentiable_programming/1e80339b.svg b/previews/PR1693/tutorials/differentiable_programming/1e80339b.svg new file mode 100644 index 00000000000..40eff51c3ad --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/1e80339b.svg @@ -0,0 +1,1077 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/45b4b354.svg b/previews/PR1693/tutorials/differentiable_programming/45b4b354.svg new file mode 100644 index 00000000000..36cee7868fa --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/45b4b354.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/5e4a7a2d.svg b/previews/PR1693/tutorials/differentiable_programming/5e4a7a2d.svg new file mode 100644 index 00000000000..5866ff8a1ed --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/5e4a7a2d.svg @@ -0,0 +1,1582 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/6cf2fe25.svg b/previews/PR1693/tutorials/differentiable_programming/6cf2fe25.svg new file mode 100644 index 00000000000..ac53b9c377a --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/6cf2fe25.svg @@ -0,0 +1,809 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/71b488ae.svg b/previews/PR1693/tutorials/differentiable_programming/71b488ae.svg new file mode 100644 index 00000000000..55383e60fe0 --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/71b488ae.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/7c43661a.svg b/previews/PR1693/tutorials/differentiable_programming/7c43661a.svg new file mode 100644 index 00000000000..16f4fed5cb5 --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/7c43661a.svg @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/8639c03d.svg b/previews/PR1693/tutorials/differentiable_programming/8639c03d.svg new file mode 100644 index 00000000000..e9b1abeda97 --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/8639c03d.svg @@ -0,0 +1,2100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/f909d430.svg b/previews/PR1693/tutorials/differentiable_programming/f909d430.svg new file mode 100644 index 00000000000..24f2f324761 --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/f909d430.svg @@ -0,0 +1,815 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/differentiable_programming/index.html b/previews/PR1693/tutorials/differentiable_programming/index.html new file mode 100644 index 00000000000..eaa8b04094c --- /dev/null +++ b/previews/PR1693/tutorials/differentiable_programming/index.html @@ -0,0 +1,209 @@ + +16 Differentiable programming · Trixi.jl

16: Differentiable programming

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.

In the following, we will walk through some examples demonstrating how to differentiate through Trixi.jl.

Forward mode automatic differentiation

Trixi.jl integrates well with ForwardDiff.jl for forward mode AD.

Computing the Jacobian

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.

using Trixi, LinearAlgebra, Plots
+
+equations = CompressibleEulerEquations2D(1.4)
+
+solver = DGSEM(3, flux_central)
+mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)
+
+J = jacobian_ad_forward(semi);
+size(J)
(1024, 1024)

Next, we compute the eigenvalues of the Jacobian.

λ = eigvals(J)
+scatter(real.(λ), imag.(λ), label="central flux")
Example block output

As you can see here, the maximal real part is close to zero.

relative_maximum = maximum(real, λ) / maximum(abs, λ)
5.363931261250053e-10

Interestingly, if we add dissipation by switching to the flux_lax_friedrichs at the interfaces, the maximal real part of the eigenvalues increases.

solver = DGSEM(3, flux_lax_friedrichs)
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)
+
+J = jacobian_ad_forward(semi)
+λ = eigvals(J)
+
+scatter!(real.(λ), imag.(λ), label="Lax-Friedrichs flux")
Example block output

Although the maximal real part is still somewhat small, it's larger than for the purely central discretization.

relative_maximum = maximum(real, λ) / maximum(abs, λ)
2.078152025726539e-5

However, we should be careful when using this analysis, since the eigenvectors are not necessarily well-conditioned.

λ, V = eigen(J)
+condition_number = cond(V)
1.6378606512008032e6

In one space dimension, the situation is a bit different.

equations = CompressibleEulerEquations1D(1.4)
+
+solver = DGSEM(3, flux_central)
+mesh = TreeMesh((-1.0,), (1.0,), initial_refinement_level=6, n_cells_max=10^5)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)
+
+J = jacobian_ad_forward(semi)
+
+λ = eigvals(J)
+
+scatter(real.(λ), imag.(λ), label="central flux")
Example block output

Here, the maximal real part is basically zero to machine accuracy.

relative_maximum = maximum(real, λ) / maximum(abs, λ)
4.590384437371228e-16

Moreover, the eigenvectors are not as ill-conditioned as in 2D.

λ, V = eigen(J)
+condition_number = cond(V)
253.7112316032919

If we add dissipation, the maximal real part is still approximately zero.

solver = DGSEM(3, flux_lax_friedrichs)
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)
+
+J = jacobian_ad_forward(semi)
+λ = eigvals(J)
+
+scatter!(real.(λ), imag.(λ), label="Lax-Friedrichs flux")
Example block output

As you can see from the plot generated above, the maximal real part is still basically zero to machine precision.

relative_maximum = maximum(real, λ) / maximum(abs, λ)
5.183646920030433e-17

Let's check the condition number of the eigenvectors.

λ, V = eigen(J)
+
+condition_number = cond(V)
90353.75290021878

Note that the condition number of the eigenvector matrix increases but is still smaller than for the example in 2D.

Computing other derivatives

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

First, we create a semidiscretization of the compressible Euler equations.

using Trixi, LinearAlgebra, ForwardDiff
+
+equations = CompressibleEulerEquations2D(1.4)
+
+"""
+    initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)
+
+The classical isentropic vortex test case of
+- Chi-Wang Shu (1997)
+  Essentially Non-Oscillatory and Weighted Essentially Non-Oscillatory
+  Schemes for Hyperbolic Conservation Laws
+  [NASA/CR-97-206253](https://ntrs.nasa.gov/citations/19980007543)
+"""
+function initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)
+  inicenter = SVector(0.0, 0.0) # initial center of the vortex
+  iniamplitude = 5.0            # size and strength of the vortex
+
+  rho = 1.0  # base flow
+  v1 = 1.0
+  v2 = 1.0
+  vel = SVector(v1, v2)
+  p = 25.0
+
+  rt = p / rho                      # ideal gas equation
+  t_loc = 0.0
+
+  cent = inicenter + vel*t_loc      # shift advection of center to handle periodic BC, but only for v1 = v2 = 1.0
+  cent = x - cent                   # distance to center point
+  cent = SVector(-cent[2], cent[1])
+
+  r2 = cent[1]^2 + cent[2]^2
+  du = iniamplitude / (2*π) * exp(0.5 * (1 - r2)) # vel. perturbation
+  dtemp = -(equations.gamma - 1) / (2 * equations.gamma * rt) * du^2 # isentropic
+
+  rho = rho * (1 + dtemp)^(1 / (equations.gamma - 1))
+  vel = vel + du * cent
+  v1, v2 = vel
+  p = p * (1 + dtemp)^(equations.gamma / (equations.gamma - 1))
+
+  prim = SVector(rho, v1, v2, p)
+  return prim2cons(prim, equations)
+end
+
+mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)
+
+solver = DGSEM(3, flux_lax_friedrichs, VolumeIntegralFluxDifferencing(flux_ranocha))
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_isentropic_vortex, solver)
+
+u0_ode = Trixi.compute_coefficients(0.0, semi)
+size(u0_ode)
(1024,)

Next, we compute the Jacobian using ForwardDiff.jacobian.

J = ForwardDiff.jacobian((du_ode, γ) -> begin
+    equations_inner = CompressibleEulerEquations2D(first(γ))
+    semi_inner = Trixi.remake(semi, equations=equations_inner, uEltype=eltype(γ))
+    Trixi.rhs!(du_ode, u0_ode, semi_inner, 0.0)
+end, similar(u0_ode), [1.4]); # γ needs to be an `AbstractArray`
+
+round.(extrema(J), sigdigits=2)
(-220.0, 220.0)

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.

Note that the ideal gas constant does not influence the semidiscrete rate of change of the density, as demonstrated by

norm(J[1:4:end])
0.0

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.

Differentiating through a complete simulation

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.

using Trixi, OrdinaryDiffEq, ForwardDiff, Plots
+
+function energy_at_final_time(k) # k is the wave number of the initial condition
+    equations = LinearScalarAdvectionEquation2D(1.0, -0.3)
+    mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)
+    solver = DGSEM(3, flux_lax_friedrichs)
+    initial_condition = (x, t, equation) -> begin
+            x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)
+            return SVector(sinpi(k * sum(x_trans)))
+    end
+    semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
+                                               uEltype=typeof(k))
+    ode = semidiscretize(semi, (0.0, 1.0))
+    sol = solve(ode, BS3(), save_everystep=false)
+    Trixi.integrate(energy_total, sol.u[end], semi)
+end
+
+k_values = range(0.9, 1.1, length=101)
+
+plot(k_values, energy_at_final_time.(k_values), label="Energy")
Example block output

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.

We can compute the discrete derivative of the energy at the final time with respect to the wave number k as follows.

round(ForwardDiff.derivative(energy_at_final_time, 1.0), sigdigits=2)
1.4e-5

This is rather small and we can treat it as zero in comparison to the value of this derivative at other wave numbers k.

dk_values = ForwardDiff.derivative.((energy_at_final_time,), k_values);
+
+plot(k_values, dk_values, label="Derivative")
Example block output

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.

second_derivative = round(ForwardDiff.derivative(
+        k -> Trixi.ForwardDiff.derivative(energy_at_final_time, k), 1.0),
+      sigdigits=2)
-0.9

Having seen this application, let's break down what happens step by step.

function energy_at_final_time(k) # k is the wave number of the initial condition
+    equations = LinearScalarAdvectionEquation2D(1.0, -0.3)
+    mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)
+    solver = DGSEM(3, flux_lax_friedrichs)
+    initial_condition = (x, t, equation) -> begin
+        x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)
+        return SVector(sinpi(k * sum(x_trans)))
+    end
+    semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
+                                               uEltype=typeof(k))
+    ode = semidiscretize(semi, (0.0, 1.0))
+    sol = solve(ode, BS3(), save_everystep=false)
+    Trixi.integrate(energy_total, sol.u[end], semi)
+end
+
+k = 1.0
+round(ForwardDiff.derivative(energy_at_final_time, k), sigdigits=2)
1.4e-5

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.

The first step in this example creates some basic ingredients of our simulation.

equations = LinearScalarAdvectionEquation2D(1.0, -0.3)
+mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=3, n_cells_max=10^4)
+solver = DGSEM(3, flux_lax_friedrichs);

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).

Next, we define the initial condition

initial_condition = (x, t, equation) -> begin
+    x_trans = Trixi.x_trans_periodic_2d(x - equation.advection_velocity * t)
+    return SVector(sinpi(k * sum(x_trans)))
+end;

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.

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

semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
+                                    uEltype=typeof(k));

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

ode = semidiscretize(semi, (0.0, 1.0))
+sol = solve(ode, BS3(), save_everystep=false)
+round(Trixi.integrate(energy_total, sol.u[end], semi), sigdigits=5)
0.24986

do not need any modifications since they are sufficiently generic (and enough effort has been spend to allow general types inside these calls).

Propagating errors using Measurements.jl

Error bars by Randall Munroe "Error bars" by Randall Munroe, linked from https://xkcd.com/2110

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.

using Trixi, OrdinaryDiffEq, Measurements, Plots, LaTeXStrings
+
+equations = LinearScalarAdvectionEquation1D(1.0 ± 0.1)
+
+mesh = TreeMesh((-1.0,), (1.0,), n_cells_max=10^5, initial_refinement_level=5)
+
+solver = DGSEM(3)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test,
+                                    solver, uEltype=Measurement{Float64})
+
+ode = semidiscretize(semi, (0.0, 1.5))
+
+sol = solve(ode, BS3(), save_everystep=false);
+
+plot(sol)
Example block output

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.

All this is possible due to allowing generic types and having good abstractions in Julia that allow packages to work together seamlessly.

Finite difference approximations

Trixi.jl provides the convenience function jacobian_fd to approximate the Jacobian via central finite differences.

using Trixi, LinearAlgebra
+
+equations = CompressibleEulerEquations2D(1.4)
+
+solver = DGSEM(3, flux_central)
+
+mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)
+
+J_fd = jacobian_fd(semi)
+
+J_ad = jacobian_ad_forward(semi)
+
+relative_difference = norm(J_fd - J_ad) / size(J_fd, 1)
5.750018477545811e-7

This discrepancy is of the expected order of magnitude for central finite difference approximations.

Linear systems

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

\[\partial_t u(t) = A u(t) + b,\]

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,

using Trixi, LinearAlgebra, Plots
+
+equations = LinearScalarAdvectionEquation2D(1.0, -0.3)
+
+solver = DGSEM(3, flux_lax_friedrichs)
+
+mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)
+
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, solver)
+
+A, b = linear_structure(semi)
+
+size(A), size(b)
((256, 256), (256,))

Next, we compute the eigenvalues of the linear operator.

λ = eigvals(Matrix(A))
+
+scatter(real.(λ), imag.(λ))
Example block output

As you can see here, the maximal real part is close to machine precision.

λ = eigvals(Matrix(A))
+relative_maximum = maximum(real, λ) / maximum(abs, λ)
3.44417312410318e-17

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots", "ForwardDiff"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [f6369f11] ForwardDiff v0.10.36
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/hohqmesh_tutorial/index.html b/previews/PR1693/tutorials/hohqmesh_tutorial/index.html new file mode 100644 index 00000000000..d91169c41c8 --- /dev/null +++ b/previews/PR1693/tutorials/hohqmesh_tutorial/index.html @@ -0,0 +1,305 @@ + +14 Unstructured meshes with HOHQMesh.jl · Trixi.jl

14: Unstructured meshes with HOHQMesh.jl

Trixi.jl supports numerical approximations on unstructured quadrilateral meshes with the UnstructuredMesh2D mesh type.

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.

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.

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

import Pkg; Pkg.add("HOHQMesh")

Now we are ready to generate an unstructured quadrilateral mesh that can be used by Trixi.jl.

Running and visualizing an unstructured simulation

Trixi.jl supports solving hyperbolic problems on several mesh types. There is a default example for this mesh type that can be executed by

using Trixi
+trixi_include(default_example_unstructured())
[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.

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.

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.

To convert the HDF5-formatted .h5 output file(s) from Trixi.jl into VTK format execute the following

using Trixi2Vtk
+trixi2vtk("out/solution_000180.h5", output_directory="out")

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

trixi2vtk("out/solution_000180.h5", output_directory="out", nvisnodes=12)

By default trixi2vtk sets nvisnodes to be the same as the number of nodes specified in the elixir file used to run the simulation.

Finally, if you want to convert all the solution files to VTK execute

trixi2vtk("out/solution_000*.h5", output_directory="out", nvisnodes=12)

then it is possible to open the .pvd file with ParaView and create a video of the simulation.

Creating a mesh using HOHQMesh

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.

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.

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.

mesh_boundary_cartoon

The associated ice_cream_straight_sides.control file is created below.

open("out/ice_cream_straight_sides.control", "w") do io
+  println(io, raw"""
+\begin{CONTROL_INPUT}
+    \begin{RUN_PARAMETERS}
+        mesh file name   = ice_cream_straight_sides.mesh
+        plot file name   = ice_cream_straight_sides.tec
+        stats file name  = none
+        mesh file format = ISM-v2
+        polynomial order = 4
+        plot file format = skeleton
+    \end{RUN_PARAMETERS}
+
+    \begin{BACKGROUND_GRID}
+        x0 = [-8.0, -8.0, 0.0]
+        dx = [1.0, 1.0, 0.0]
+        N  = [16,16,1]
+    \end{BACKGROUND_GRID}
+
+    \begin{SPRING_SMOOTHER}
+        smoothing            = ON
+        smoothing type       = LinearAndCrossBarSpring
+        number of iterations = 25
+    \end{SPRING_SMOOTHER}
+
+\end{CONTROL_INPUT}
+
+\begin{MODEL}
+
+    \begin{INNER_BOUNDARIES}
+
+        \begin{CHAIN}
+            name = IceCreamCone
+            \begin{END_POINTS_LINE}
+                name = LeftSlant
+                xStart = [-2.0, 1.0, 0.0]
+                xEnd   = [ 0.0, -3.0, 0.0]
+            \end{END_POINTS_LINE}
+
+            \begin{END_POINTS_LINE}
+                name = RightSlant
+                xStart = [ 0.0, -3.0, 0.0]
+                xEnd   = [ 2.0, 1.0, 0.0]
+            \end{END_POINTS_LINE}
+
+            \begin{CIRCULAR_ARC}
+                name        = IceCream
+                units       = degrees
+                center      = [ 0.0, 1.0, 0.0]
+                radius      = 2.0
+                start angle = 0.0
+                end angle   = 180.0
+            \end{CIRCULAR_ARC}
+        \end{CHAIN}
+
+    \end{INNER_BOUNDARIES}
+
+\end{MODEL}
+\end{FILE}
+""")
+end

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.

The first block of information in RUN_PARAMETERS is

\begin{RUN_PARAMETERS}
+   mesh file name   = ice_cream_straight_sides.mesh
+   plot file name   = ice_cream_straight_sides.tec
+   stats file name  = none
+   mesh file format = ISM-v2
+   polynomial order = 4
+   plot file format = skeleton
+\end{RUN_PARAMETERS}

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.

The second block of information in BACKGROUND_GRID is

\begin{BACKGROUND_GRID}
+  x0 = [-8.0, -8.0, 0.0]
+  dx = [1.0, 1.0, 0.0]
+  N  = [16,16,1]
+\end{BACKGROUND_GRID}

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 $16\times 16$ element square mesh on $[-8,8]^2$. Further, this sets up four outer boundaries of the domain that are given the default names: Top, Left, Bottom, Right.

The third block of information in SPRING_SMOOTHER is

\begin{SPRING_SMOOTHER}
+   smoothing            = ON
+   smoothing type       = LinearAndCrossBarSpring
+   number of iterations = 25
+\end{SPRING_SMOOTHER}

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).

After the CONTROL_INPUT environment block comes the MODEL environment block. It is here where the user prescribes curved boundary information with either:

  • An OUTER_BOUNDARY (covered in the next section of this tutorial).
  • One or more INNER_BOUNDARIES.

There are several options to describe the boundary curve data to HOHQMesh like splines or parametric curves.

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.

\begin{INNER_BOUNDARIES}
+
+   \begin{CHAIN}
+   name = IceCreamCone
+   \begin{END_POINTS_LINE}
+      name = LeftSlant
+      xStart = [-2.0, 1.0, 0.0]
+      xEnd   = [ 0.0, -3.0, 0.0]
+   \end{END_POINTS_LINE}
+
+   \begin{END_POINTS_LINE}
+      name = RightSlant
+      xStart = [ 0.0, -3.0, 0.0]
+      xEnd   = [ 2.0, 1.0, 0.0]
+   \end{END_POINTS_LINE}
+
+   \begin{CIRCULAR_ARC}
+      name        = IceCream
+      units       = degrees
+      center      = [ 0.0, 1.0, 0.0]
+      radius      = 2.0
+      start angle = 0.0
+      end angle   = 180.0
+   \end{CIRCULAR_ARC}
+   \end{CHAIN}
+
+\end{INNER_BOUNDARIES}

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.

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.

using HOHQMesh
+control_file = joinpath("out", "ice_cream_straight_sides.control")
+output = generate_mesh(control_file);

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.

mesh_straight_sides

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.

Example simulation on ice_cream_straight_sides.mesh

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.

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.

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

  • Freestream boundary conditions on the four box edges.
  • Free slip wall boundary condition on the interior curved boundaries.

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

# create the unstructured mesh from your mesh file
+using Trixi
+mesh_file = joinpath("out", "ice_cream_straight_sides.mesh")
+mesh = UnstructuredMesh2D(mesh_file);

The complete elixir file for this simulation example is given below.

using OrdinaryDiffEq, Trixi
+
+equations = CompressibleEulerEquations2D(1.4) # set gas gamma = 1.4
+
+# freestream flow state with Ma_inf = 0.3
+@inline function uniform_flow_state(x, t, equations::CompressibleEulerEquations2D)
+
+  # set the freestream flow parameters
+  rho_freestream = 1.0
+  u_freestream = 0.3
+  p_freestream = inv(equations.gamma)
+
+  theta = 0.0 # zero angle of attack
+  si, co = sincos(theta)
+  v1 = u_freestream * co
+  v2 = u_freestream * si
+
+  prim = SVector(rho_freestream, v1, v2, p_freestream)
+  return prim2cons(prim, equations)
+end
+
+# initial condition
+initial_condition = uniform_flow_state
+
+# boundary condition types
+boundary_condition_uniform_flow = BoundaryConditionDirichlet(uniform_flow_state)
+
+# boundary condition dictionary
+boundary_conditions = Dict( :Bottom     => boundary_condition_uniform_flow,
+                            :Top        => boundary_condition_uniform_flow,
+                            :Right      => boundary_condition_uniform_flow,
+                            :Left       => boundary_condition_uniform_flow,
+                            :LeftSlant  => boundary_condition_slip_wall,
+                            :RightSlant => boundary_condition_slip_wall,
+                            :IceCream   => boundary_condition_slip_wall );
+
+# DGSEM solver.
+#    1) polydeg must be >= the polynomial order set in the HOHQMesh control file to guarantee
+#       freestream preservation. As a extra task try setting polydeg=3
+#    2) VolumeIntegralFluxDifferencing with central volume flux is activated
+#       for dealiasing
+volume_flux = flux_ranocha
+solver = DGSEM(polydeg=4, surface_flux=flux_hll,
+               volume_integral=VolumeIntegralFluxDifferencing(volume_flux))
+
+# create the unstructured mesh from your mesh file
+mesh_file = joinpath("out", "ice_cream_straight_sides.mesh")
+mesh = UnstructuredMesh2D(mesh_file)
+
+# Create semidiscretization with all spatial discretization-related components
+semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
+                                    boundary_conditions=boundary_conditions)
+
+# Create ODE problem from semidiscretization with time span from 0.0 to 2.0
+tspan = (0.0, 2.0)
+ode = semidiscretize(semi, tspan)
+
+
+# Create the callbacks to output solution files and adapt the time step
+summary_callback = SummaryCallback()
+save_solution = SaveSolutionCallback(interval=10,
+                                     save_initial_solution=true,
+                                     save_final_solution=true)
+stepsize_callback = StepsizeCallback(cfl=1.0)
+
+callbacks = CallbackSet(summary_callback, save_solution, stepsize_callback)
+
+# Evolve ODE problem in time using `solve` from OrdinaryDiffEq
+sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),
+            dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
+            save_everystep=false, callback=callbacks);
+# print the timer summary
+summary_callback()

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.

simulation_straight_sides

Making a mesh with a curved outer boundary

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.

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.

open("out/ice_cream_curved_sides.control", "w") do io
+  println(io, raw"""
+\begin{CONTROL_INPUT}
+    \begin{RUN_PARAMETERS}
+        mesh file name   = ice_cream_curved_sides.mesh
+        plot file name   = ice_cream_curved_sides.tec
+        stats file name  = none
+        mesh file format = ISM-v2
+        polynomial order = 4
+        plot file format = skeleton
+    \end{RUN_PARAMETERS}
+
+    \begin{BACKGROUND_GRID}
+        background grid size = [1.0, 1.0, 0.0]
+    \end{BACKGROUND_GRID}
+
+    \begin{SPRING_SMOOTHER}
+        smoothing            = ON
+        smoothing type       = LinearAndCrossBarSpring
+        number of iterations = 25
+    \end{SPRING_SMOOTHER}
+
+\end{CONTROL_INPUT}
+
+\begin{MODEL}
+
+    \begin{OUTER_BOUNDARY}
+        \begin{PARAMETRIC_EQUATION_CURVE}
+            name = OuterCircle
+            xEqn = x(t) = 8.0*sin(2.0*pi*t)
+            yEqn = y(t) = 8.0*cos(2.0*pi*t)
+            zEqn = z(t) = 0.0
+        \end{PARAMETRIC_EQUATION_CURVE}
+
+    \end{OUTER_BOUNDARY}
+
+    \begin{INNER_BOUNDARIES}
+
+        \begin{CHAIN}
+            name = IceCreamCone
+            \begin{END_POINTS_LINE}
+                name = LeftSlant
+                xStart = [-2.0, 1.0, 0.0]
+                xEnd   = [ 0.0, -3.0, 0.0]
+            \end{END_POINTS_LINE}
+
+            \begin{END_POINTS_LINE}
+                name = RightSlant
+                xStart = [ 0.0, -3.0, 0.0]
+                xEnd   = [ 2.0, 1.0, 0.0]
+            \end{END_POINTS_LINE}
+
+            \begin{CIRCULAR_ARC}
+                name        = IceCream
+                units       = degrees
+                center      = [ 0.0, 1.0, 0.0]
+                radius      = 2.0
+                start angle = 0.0
+                end angle   = 180.0
+            \end{CIRCULAR_ARC}
+        \end{CHAIN}
+
+    \end{INNER_BOUNDARIES}
+
+\end{MODEL}
+\end{FILE}
+""")
+end

The first alteration is that we have altered the second block of information BACKGROUND_GRID within the CONTROL_INPUT to be

\begin{BACKGROUND_GRID}
+   background grid size = [1.0, 1.0, 0.0]
+\end{BACKGROUND_GRID}

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.

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.

   \begin{OUTER_BOUNDARY}
+
+      \begin{PARAMETRIC_EQUATION_CURVE}
+         name = OuterCircle
+         xEqn = x(t) = 8.0*sin(2.0*pi*t)
+         yEqn = y(t) = 8.0*cos(2.0*pi*t)
+         zEqn = z(t) = 0.0
+      \end{PARAMETRIC_EQUATION_CURVE}
+
+   \end{OUTER_BOUNDARY}

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.

Again, we create the .mesh and .tec files with HOHQMesh.jl's function generate_mesh

control_file = joinpath("out", "ice_cream_curved_sides.control")
+output = generate_mesh(control_file);

The files are placed in the out folder.

The resulting mesh generated by HOHQMesh.jl is given in the following figure.

mesh_curved_sides

Running Trixi.jl on ice_cream_curved_sides.mesh

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.

# boundary condition dictionary
+boundary_conditions = Dict( :OuterCircle => boundary_condition_uniform_flow,
+                            :LeftSlant   => boundary_condition_slip_wall,
+                            :RightSlant  => boundary_condition_slip_wall,
+                            :IceCream    => boundary_condition_slip_wall );

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.

# create the unstructured mesh from your mesh file
+mesh_file = joinpath("out", "ice_cream_curved_sides.mesh")
+mesh = UnstructuredMesh2D(mesh_file);

We can then post-process the solution file at the final time on the new mesh with Trixi2Vtk and visualize with ParaView.

simulation_curved_sides

Setting up a simulation with AMR via P4estMesh

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).

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.

using HOHQMesh
+control_file = joinpath("out", "ice_cream_straight_sides.control")
+output = generate_mesh(control_file);

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.

using Trixi
+mesh_file = joinpath("out", "ice_cream_straight_sides.inp")
+mesh = P4estMesh{2}(mesh_file)

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.

amr_indicator = IndicatorLöhner(semi, variable=density)
+
+amr_controller = ControllerThreeLevel(semi, amr_indicator,
+                                      base_level=0,
+                                      med_level =1, med_threshold=0.05,
+                                      max_level =3, max_threshold=0.1)
+
+amr_callback = AMRCallback(semi, amr_controller,
+                           interval=5,
+                           adapt_initial_condition=true,
+                           adapt_initial_condition_only_refine=true)
+
+callbacks = CallbackSet(..., amr_callback)

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.

simulation_straight_sides_p4est_amr

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots", "Trixi2Vtk", "HOHQMesh"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [e4f4c7b8] HOHQMesh v0.2.1
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`
+  [bc1476a1] Trixi2Vtk v0.3.11

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/introduction/index.html b/previews/PR1693/tutorials/introduction/index.html new file mode 100644 index 00000000000..62a97b7adfe --- /dev/null +++ b/previews/PR1693/tutorials/introduction/index.html @@ -0,0 +1,2 @@ + +Introduction · Trixi.jl

Tutorials for Trixi.jl

The tutorial section for Trixi.jl also contains interactive step-by-step explanations via Binder.

Right now, you are using the classic documentation. The corresponding interactive notebooks can be opened in Binder and viewed in nbviewer via the icons and in the respective tutorial. You can download the raw notebooks from GitHub via .

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.

There are tutorials for the following topics:

1 Introduction to DG methods

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.

2 DGSEM with flux differencing

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.

3 Shock capturing with flux differencing and stage limiter

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.

4 Non-periodic boundary conditions

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.

5 DG schemes via DGMulti solver

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.

6 Other SBP schemes (FD, CGSEM) via DGMulti solver

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.

7 Upwind FD SBP schemes

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.

8 Adding a new scalar conservation law

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.

9 Adding a non-conservative equation

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.

10 Parabolic terms

This tutorial describes how parabolic terms are implemented in Trixi.jl, e.g., to solve the advection-diffusion equation.

11 Adding new parabolic terms

This tutorial describes how new parabolic terms can be implemented using Trixi.jl.

12 Adaptive mesh refinement

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.

13 Structured mesh with curvilinear mapping

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.

14 Unstructured meshes with HOHQMesh.jl

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.

15 Explicit time stepping

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.

16 Differentiable programming

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.

17 Custom semidiscretization

This tutorial describes the semidiscretiations of Trixi.jl and explains how to extend them for custom tasks.

Examples in Trixi.jl

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).


This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/non_periodic_boundaries/0ecc56bf.svg b/previews/PR1693/tutorials/non_periodic_boundaries/0ecc56bf.svg new file mode 100644 index 00000000000..5925cc13671 --- /dev/null +++ b/previews/PR1693/tutorials/non_periodic_boundaries/0ecc56bf.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/non_periodic_boundaries/c37303c4.gif b/previews/PR1693/tutorials/non_periodic_boundaries/c37303c4.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c121500fe81f66a540d4a5ea57b697f768fbb1d GIT binary patch literal 1128612 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

s7b{zN=s=@K)MYXjnw;cZ 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

~n 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

`fAL)QN3c2Nyt@fak&ChJ;0H+RIK4)st zldb-@k!s3SD_l!~&%!US8#g_>v=jA=tg3kHBR!OFL7HHyQpYp z&71D!tC+4`2EmvIsklF5k75Cjo7>oeDpW&kN|HcNJQowh=T! z3_3Rz(Bpszsfssiv>or;e!F1A>8U7YeS0iv*Z$AxRjM+wxB>3|XSqU*;TIcZAB%3O zS)4gkLo_=5iK4HF3|mPc?Xb4yD~c<{713|)Gp&(Y<}NE#t3p4&eQ_&1`jtRHDSRsV z5-`C0+z}o?ipC*t$nIhX9-_SV^_z+iTng$uknt|e(58BVc5%k$>dV-3_ag?x5bG7+ z^&NRJ0z8?muRrv0Cam-BmqfYHL!6n6bNM0|`|mTUPoHR--6DHKt22j`!Lp1s%34@* zTIDH*r&|2tftgIzwzGd1TmO==j38>cT)KDK@2Oy!j`UhfG+9(zdw;g!1Da;Gc=Z)% zf_;F+KEC+E{sN`2@pO!hAc2w2wpibbC1)S^N-|l&nGes%)}Hd_$=+C54%i}=T3q7( z4f85P6v-h`rMm(@)iS#2?W8}i11dYj!D>TIU*^q}WDO-#EIMKl&s)>4% zN=fAKZYiZ-3~&hWoDoA+O$60i$JrP`=je%+F>@in8NeVx-{N_|MUiQke%2kAsmm8gOkv$tclpB+k0bzfn=h zfP3(2R7O~o1r-Vb*1!1=^=HmFgrhUl8@FLrt-V)PGPI(klKRs%qvYO0h{(o+Uwv^t z)OfdvgIlec2fiu%UO6b0fv<}3X!InIp+k-E`G=O%>vOURcPK>}iC#I@h!7P6qDPGs zifKuk42)QCT3(j2*qC_7NTKbOw*@+Jmw)a|r_d#vL$zfHkHsTjsTm6~a+!40lgW*b z`K&#Waw{~jW5wgDG{#!ecfbGXnS!*p((vvgQIGGnW(1{|9eN%O9xL-mnaSK+AFeX# zq3?ny#<7t#1ek3es85-RIe5Zp&?!jxH}n_ zQVo2)jG?3l#WYzZbLZR!$)e-2PM=>KS1)mY|0@0ndV_#;d`pyjEjjJz4#}SktgKs3 zkrnYaoCVPEnH;Pm2kp5O8^(tV3ph4_hYJf8FcZNQ>Vt&)VoPBbham$@^D8e6o)Y)0 z9K~0GPb)9Q7HxkadfgZ@2knT@-`ib)~(i~qZ~=-ul-0ZHUcg9)9XIW#j^iNNiZxVBvlbS;yNUu_oFr<(juCP z3D{%%o+NUSDO4@MciR%ic_Pdy*T#ahfx#G>fdaOntOTGCePrvOMadn{ ztRH?AJUdxGI#HK_Yv?vqu!jn~TjIb^`JA$bn~n8eiwzkQ8RLxllO`cEEFlAWWAvMl z#=EE|4;pjM#D{1!ZEvh!^=~?HedDk7rTT2S$m2hn+zk~()tjx!&@8RKBu+Pdu(@jf zbpGq+U@}xqDy_ZFu$4K}SfO-yu*JVNrQ=77QdUamn^0Jw_|CPpEl$pWMjr}n1-CKX zzqiJiD7XWKV?rl44pdIPX`I=H%bshSdl`IcvT@pkc092C!4F8p?aZS$jfrju;*a*_ zD7k>8Gtb}n!yJ@;S;wdWl*i5f;NEd_B#vfyAvH?sVpIF7Ms(4e_Fr)u^rgcQIeyjF zk?2P!CZ)6Rm7$8$*y#sc@X={^wayKu5gGxVaucnn=1%z=8@UW{8J;TZ}_UJ|;L`8MWcUFcs7DQQAiZzaOOvd)? zi74dsqhS&v_QQuo}bbS2w_H8*G z9f9a@0mytFm?aOUX|%w-gR27Yr65qnoJbb5UimQ$YXb?X!PV03LmK}$`7cS{zP_=V z0bYu43DUh3zGQxT{l>=7mD5An#4GX_J1Z~T>?9gMxwit*bP8z6B>wc{&V*s9l!3i* zKqDL8-6WKk49N1@diMg#ib9II#lbJLWS5d21oD){uvFc)z28E~%=||}BkK$zm4i+t zY=HlYUVdx;&KX&!5KW;*Z2x6@8v2KPy^5BX9y?1VTFxIr<+iq}YC!@9_`&1qiYD@r zU7PC7jk6HQYUu{yRZbETmC(NXr7)RWX7ke@p38Ke=jzR(l&NBhwIW(fjD*<*v4--* zxgI|RL6%)27jJQnjbQ0^{C*=oO+u?s%0k){BC8O2v^qU0tR!5YtD4Xj6Q;WzbNf88fuSSzfltP|I+lmm;h%O_u@f3lO6Xw-j7C<4Pa#25x!EF$$jP>MA z9l)35`Hnm93%B!dfXbD?Qm^%Dk{pomOc0PM$I ze}({3WXz5@Rw=B0Yy+Ep7>{LSgeb}6$oU?CL7C+R0XT?dIf3=yrl$}#Kau9r7qDWQ zvt<|dHwEog*t*5Ch*Jsd!IdC*R!^>cT)!!{UME4iW{^67YDQi-K>%d@A057-xx{`O zJ^AJB-^5Sl=bDhk8z^=&!uRZfXKP>VlycQlN>q~BC;vrZ82p36(CVM2-rZqk1u#YQ zi*WrSx+5lnQ`WRyGB{lcOF`__S(Ca!BQ^%OIr{f$3Z^{O{J99c+8m1#OiCa{NH#zL zNtY(ND)L-Z5)`(g$gh#^Wt(d=aU@Ge^&K={BViN{@E*WzGIwpCh2l{#G?2fHmp}r? zFt1;o8jf8Us?Huh~)?{&V8rRX6`HB>ooR!aM!GJNFLl>%yvCx0AJ0ylCs z0@lnBJn^lB<(In?^xy8URxAxMuvD&`3;}F0@93iFTT!oe3j;i=xw825*Y3{?>(9F_ znm7J$#0B47p+|zZdsW6h0&qRt_h$E=ho-dMb`J#mEedeV5q*>DkRPv6_1d(lU`tzQ zJ0jPHU#)ny=!N+K)dz;=irV*nUYb@}zT;kZaTiQnm{lWzLzG8opr*RY!aN_vO*QvH z@kc*m()P3Tv}<)Pziz?u;tG9*P{Z$#cYm**cQQ#0H(yq*`%Xzxex47YjNbR+!PRTe zh9IUM#ZDA4upf}X8YTxT0lU>~T}JQfho_o~M&i6zHs=u>v)kf;P4ez_cL_8AS&&2>WzEMV%}n%L z<-L`0WE>AT7L%8<>E^;YfrXlw()CEB@zZwz-xS6zlE8wARMD=BUmkBsI(;x(e%(Ad zho=tUY>oo62n1-f7&c?X1L!LQa)5vZmSeM_SaqNb$aY9LOm0%^UJCeBnE0Cqy{Ki7~yusf47^4l=OU9SLM*+>V3~&3a_f+ z)VHWYA8F z5qpp7f@AXGcFNBxCyk9GnY716q&JHwWu4AE8w_WYWj#s}+m+ucHdc4wY`Sy*(EZ}< zb)XXLdWezo_((EQhqm|Lw!SFS(!zu!q{_qVp2 zpRV}U(`4Ts=yGFzcIaC#H?KX|&+gIu`uw-Pfm`jN(KjAF`SGovC(^;luzS29w=ytk z-*K|^#^aYJD}(&Jj)+FPzuvg749(r@i0Z%b*N3>3VS&hn7#J1$T(NR-(f&f*ga2BP z(2(A|dh3MQozo-`yWt(pd z?j$bRAVuuC@Pq>wdEi~jXhbj90M6+x8Op{d<}=7qv}E%hB+Co1H zpPru(CGdmtA$Fv<+{s-Rfy#>eE6@ z46!5;^8xI!;5?k{V#TatcdwcSQ}oKf!_D@YNN!5Ia?l~*W_s9m6AMzdk5}uAf$kXN zad3{X(Zl&fIgjdTe(J%MYqQZf3*nLWb4j@&q;qQKomuDKD4>%6qMS55Riz*tZaw_4 zYkVc~GSW_Yi^=Xj(NrqD14!Fc%WHQ{ zcjs&j2G{=zzwp`I|L$xn-F)Rs5uB@RUJKcc=s9rgw?%0v@$Uar1^aEd$-J5s#z5!;P$1rBj-jf$0x$&Lw2H zgK%epQGZb6Lv(soNi3DhG-wL;b28~;fDxH~n`IF5OBs=6WOyfUi(gPW4V{WhLasX` z=Vf|LtoQ^<#*~s7SNxDcK0#q@)~auiid0s<8Z-+bK4L>drQlV?$N-<1XMQ1gBV27v zVk}6|(#`qeWCE8hz&YoQV<4BA9V&&>Saj~2#qAmhJ|iP+Tte1~3FkSRoa1EOa!vQ* zev`eR(`m4);u{(a8qXn&XbXGESqyI7hj>1~m!1c+a9uJG7%kwf?khz?tI=EVLy2E)Szo0+-d+=Z+iVx@fGzO zu%?v!g*`>(vM!;sM0-Zw;@7g%KK|sT?B_nE>^*)mZb#3_x`j5NwRpM1Q|XQBRVNnk zlHAyK*;6ytZcmY-j-;fg^?{1~@@d&!@O7pEAJpE3LAb@NY6QFb9UlLo z`OiLLtM0iG+PUjw5r+)XA6cSx5A$Kw!Zc7$bU24{=iJ0`5I>wha5-?qX24V~?d6CM ziJpU#W)k`gSNJVY6s1@rzE>1pNsQOUnDamaTtk2(1|~*J?ks{|tKEXun@8!({d1q; zJQ)HMArO2DP~HIWM8i(^x}8Jk#R|^v9je<(1F3SLjeCCVG>RVJCN)l6XNu<0Q7Z6C z0}1U3HF&zCRo=j>x}ZH1lSvmE=jVLj5KUzOz56N=8jUC28})kKQ)06#(b~T$#BmP( zgK<+aT!j#v8TSc_qg38omuAII6IJNK7algPjTD;LHsi`7hq9W_ulnwsYW{5qo#K~p z_U2IBz;U;hv-5>#T3SYHP6jTvM8Y+rrRFY^T_yT0{qyD%QQ)t>*2{*_Yi!%)QnDk| zI_4e}>)4uE(e_}W;C4$}WlGE4H!&`+3-7zf>`=$ISG1QHKp~TjPqHKU#vNfRCHnpy z4@$_q#*RA`c@D2T5*siX)PtXJ(S73wiA&3k0iGu+3O<(Aq61$0H9u(ylo zxt^m==vf?Za(EQ+tD?iLwfFP@<49}ovU$OF*}lIupju9%FHB|d`;eZU5~t+HRY^+MLLPwYaTU~T|nh1O{dW@|!= zjI5GJ7I#+)D&q$cf;@+n!G){~u69HEU2UITd(GlmI@v?bt*4T4!>}gPpHtHFHg+B+ zCMt(@OURzQfy=G&;N8SaMi;NxZKgtHlOEgts8kvKmsI~K;$6zx zPpktXbOt*1`X&8J#Af;Se?k%9*ae@mq-R4IKHNiK*u}$+52Mph0*OJq%Q) z!F2I2xVvXOAHIG%^)5PSLY#CW#f z>kibCg68!hp}PTO`X!Aug+<*`r1Yup{ueaY6k=bGjC_ibga%&@UH#hu-T3pWTr{|| z|AN&T@jV0lG~azydh|^N(O%2D0=5?20C$;<+4|xxr;jb)O$1x6mZS!c{_Fy`l_#oq zPE$kN%^*GZE`JxqYt2A4HRM7Cw`7ZuERYw|rp(r@&MwxQ2^_kLE~bnvGHJJY9SV$nN=%e$bo)P?6DR)1jN`vTAmSaGQ8)j( zl7xGuK+tXfdn9By`<5LHfiOch{=+%Zcp$qSjL|G31NG+!*Npe}c6!umYvWLh&)MRc zEM)az%@_g(0Kl+Si+@8Pas#b5QdwB8u)@E$CM^HqoM6IR6EQ{V^nY$m81R_LgYs06 zLbp@etq!so6W;))N-FLvz^2HK{3is0>_-82(RZYAEf4PA0_osctAijVCTd^+hCoDw z#>*bl7q0yi0>l1?VMDG`iO5p{)^wr$a&Ff5 zEj|Mzo+;|-L5fuL2x{pZMMF-NuL7XRkZc_F zo-)x}1;H$d4X}Q3o^9~pw8l;pdy?`U#eP9Kj1gFATw;rP%WiR1+P6g*$G<_jtIGg3 z4wKfO;gG1dIB0toZs|PbE^e&KLPg4oY{>wY_B0^WkmjHkhATyUTcy9B0FI3Y0L{#< zF(G5Yw%ZoRQS3&_Q)3JM?(G1FTKBF`evXa`8S(*aFG}--5o!VsB^dxFD6=7kG)(|{ z`jT=-_Fl7vfvo;JiyyoK0Jm?MLLu}CEuU7Frm(HVgd@0F%oF7q(jbD)+h@@&%m#`O z5}K9cZ?*t{)Q6XC+Yj6j>lIw=fQtO2K~>d7V!Nne;|;nBZ!Fe=D=y3E4)B~QlRYeNLa6ba+`_Oak%s8 z_eP*pS6TySeh*;!1Dyb6^a`o~qUbX$&(2&GI{S1$ceU)Q4M;3gg;c;Y_I0z5skI11 zh)}At@VAbXN?lCWneuY<;uI8ug zJrtfTTV!Nm>HMqK;-)Z#Wr7j|c^lLoraanW%Zibcgm5VS?&DsmXC*?p4O^ z7AHxt)cg-1#cnF%xS8ngjYK@xEjiY_#1f>XHFq_+0%Q^~tGD8P!14HubW-LYI)Mp>A5 z(NaLdyMI9-h?HO4!_qo0a!zfgn!w%iuQIoXK!)vVd<6e1QZ% z&`z)b5plrgNu~8M3i9@!D9)L-J!>&-+S8Z{1Kjyw0}m5ZkgEL z@U$T$I9aS-|q^P6rarKcmlOCq#y{vaP;=x}N+jO4d_GfyP*xR=qm%cGK{{ImK z@=a$Kb>DH;*wp~V(2$+ZHy3;*lyHc-5&T9j6Xa5aqIhG5oU(d{JN~uIjmYGUL zDFA+x6rqezeJ?T1EFoU9a?#}si3$eMeydbxv=M82gx-x)xkL9Fd^PHke5|ZmEV(8$ zS%R+c)|ZlSv1-%SfO0R>D&WP+v2!(fl)duG zNba1$F}3%?f#IgHMWNPseMFgCd@X9xs9)fF1g)R>XlwWW6tU+b18#=N=_yeZPy6AyabXj#v1x=WA+kzg^C6(ot{HlikuZ-TYkqowge|bKy$Q&5< zZAb5Pt-kN`E=3~B;QRHYMCGF{tJf9xd>lNtOZmH~rC{<1E9zpklFwl(9Ql0Ia~=`& zTlai?&oJAIJ&!s?ylip3DMxtj@+vrQey{k>OFc}D*vZu2lwFF*H-@R-RVbU+KdZez zy}|#RUp9{lB)*fm0J;x|ohZZ!SG&uAUcBI(DOxfZ@5Ccaw=>(4*rQzR_Q zWhGA#A4&somEjiu&>`2fY3YQ|OKG1;P`qwj7CIe1XR0@)!i0$;EhNi{x(1}cp4CD+ zN-vY;BY`{2$gs3d)LIH?^flNM6X(+-q{YjKQ6n8@r^aNsQr87Zm8v8;|5$xjgkwyq zPY<%1nTgGC_2Q@GIZ>;j*kp3}FxIW8kElo&&MV6>S#<55#UAEoBRh#FW!!w~nEg?a zMGg46%$%YIG>a6~4U04>Zn839soIHgm*g`}xf634Be;Y~HPYp|2&+Ya^~xVSp0mT{ zWTyk z!D*9Von(-lJ8|?kFsLUEiIK@hm_7rVJ6( z=l+@+zSH3J*Ex5eE%=kN$0K7)+x8?H09l)ysk2L^7hbSsfik(MGW(c{qFGedL(gUz zu;6utH%pXE!iNvigI||$_rxCw@a&#N)qbz^O%amih{#g|;MA+-wR^V|PLG}<{jGSH zi^sAm8nX3#GmzaM8DbBwL9E-9D!i_o3o!V_z=qgVgBDdoX|A<2#I^5qpD~f!gOw+2 z1Ev_Tp&|;B%D?>8>pg^p?Ue6Uq10&c_X6P|u22ODucZdTyoba*mc^)nc@H)d4_6`J zg2zACD}KuYX#wzZMXkmVV}oL?()DZ&x$_!vCFL(f4NM#qX#|&E4}E;|Cz`AE+4rgP$IIsvakP7{gU;4(u@=F9* z(?AddLw_`=aKwB~8WBqkQ9l~0oH8rFd#HK(l#%|l%Kx&ifmb$8@ly@pat9ostm|UZ zmhiVI#LVKv&9JS_zxhd;t0Sp+?5o#0Uv!9xlb*+hG5**uFLFe%u4yZ2XWWdLWlfQ; zLakk@B&u!eel?PRI&7ODIYBiS-=u&D(RrCRLp4%d=DG2`(R*USk-;{2%w<@pJ-VbGl9%W5mJ>g zK7JMQH`-QZu$zau$i^h)$|x9@ii+t{((Z}6-xnxSC?i2D!b29;By;ary9o3)PE(ZHyoMDvNmbdU(UOATLta zBq1Ig9iAYxi!(4sx1T8Tjeh2Y?|1!*4U|KtH58H$Im+2ItPnzA$4?CWj3Tf)PENXJ~9(LGJklKK7+x1Qm zL74Qr@PKjZyGM@}j95I1`Mng9@F+6#XW{$30J#P&Y}>Wl6`}7wN`89sBDM=zfXP$8 zpqd~aM!Tx^^O7WVX)*39r3A5UGS0^v6*YX}J218mmF~#tK_Z46gW7EOS^tJmgp1uE zTn-@#p-r#(9t`!Uj96_N_}MZh-csO5E|Z0>+60dy7(@@P@jaTzYW2<{DnSt%y(X4p z7SLIR9au5(-w@lS2McqsCl?2ibL&4kB?rb=_DZF|ZrR`oKn7*B+_%SY(%@~fIdeE( zD^r#?vin9Aab;>X5H)JrBkcmlCBzn+O{KQ6slW{w!gJB;LGOyXi)DEtN2xrgnX7MD^N0w-wQmi%k1@ zs>lGx6CUntT2H^_IM;dl6ALNZ1)0767l?v9z-ae`1~OD)y& zqR}*jzu@ZSpI$3FNqBoMaN0HCF{ybGuJ_WB1P)r_;YF<2AoZ-s89uyf14_~W2RT&K zlF;9jd*O%fp87$A^U@z?z5ks@3I87xmH*&T*z-Ex-^Fj6_Sv1aICUM=CAe|_?maeo zQ)SKi%jSQzM$VkSR)jJ~(`LdIujI)8y+`99-0e3LJ<%%@!z!>(UV{?`8z5&Y`P(W@ zW|DV@m$0W#2*q4*9MJ**;oP@PO@9r?e0ifVNv0f09sqUc?f6Fl33(RC5GwYBwSo;O z&UQs6rxo%0E}qFcP%Do(DbTFi0;K66#(Fq<+-jzj$D4ttVgOG$Wn1dvtbI2332U}VxC@=AO2*l5*qH6_6s7&+2oBN0+HonbcQ|Y^2S8`>^h$B^%vzP;z#V&wU6xA z=gXhoHaRde@ayO5j^CD4-_N{gMA?J0l)1r~JK7mmdUW8Pl|`l|_E-2#(Y#ITlgYY-zZU@3BXM<&3^I4t7oSvzUi*! zEc~7#iU$hVOGGMgr*_8*bDbrAK=<+>lp@8(qCn>PSO!@KB?K6AtZe}f{&}qy>ctr* z@CtWGItXgt4uDPzP0#YbqW`o;es$Xw`U!g%79dq*dBQboAP#{CMkz{{nMxpVMCiGw z5J*=fY_DVkymD+vxDX&Gd?=SPsjGk9oTRgEB?N3={(eUpXp*FWh{NHM_UZt~6R;KP zA_VQI+LmYWitD?O&kz%{B-k109XQAIZ4Eg(CYh>Mh$y4W41mJ&Fs)Lg%J)rkglUyn zIqx|(%4dYFg1y$l-wtfyik|iu+i?K+JoZ)e^!jsvq6Yp!R-!RnC$L?n$4XdzBLlJd z({JPhK!$>$2we^h`aESCDSwZag@G9jzXo-_8CXZ3*-gTc_M1BZ^tUNMpfJ7T&~K&Z9`O#*n+y@2{4ac>mKHs_4Z2~lPGB>nuz&?KD>$ZNZ)b_9$yyF5 zi-=_LLoyUFYNT2n5Mb&C_VBDoCOd=#2)Q~G9wf=KmJp~A21;#X0eW)Tn$&`;!pMF~ zorm}Z@DAB-@u$045?MZi(dUxUTg;N1kc4X+a9~9iJ79?ubIkFDo`}Wz1y`NS4aM>{ zgalS~(#4c&gul7soelq_Ta4;dB2?H|MlfkuaR0C>1Gk#?<$Pk`6CR*%#CrFRjUrHN zqpd{VNz}<>d&aaDn%D^uezDN^iDXrI0DP9G{XN>m5H4AyiuG*pjS)~h3CQt3L8;&27{wozo%7CF;bRIx z4>xW#y(la%V=jNlH%RW0XR2zCva<86C8kj9WluxFy1brXH1F#fsy(b$2r&qfJL8aS zDtJCw-9*uCsPf~!F_M*SO5LBomLO2V-`9dpr$qb?`1 zBwx;!bZb(cQ@-M*RE)we{;Kne90>cBj59H8Xeh|k}teCD%d^htgFWh z`I!nQDv-h0$1~%nCOOmJ@x2nGm%^UGzZ3IyK)hFz_p%U+^?1yQ9?{O%w$vYa@oqd< zVomGzuD_H~mE+%!a?`SN*YO@~n?ZiYUmv28EzigU-=^L2+D#96z7+d-Mm1PBvW1A+ zC>9geH$6v`&8&U96CWuvP1g&~N=9$m^RphikSoMNzSWp05lPTmv0JefIz^G~qlYDX ztem}#e7Xmt|0F8-J@aG6olH}%B+6FsYq1Po+EBVsFhxW?OFyyZv^D~|GZJr9A2=<% z%fU3*b`;m>;`3(P$k$n~mz#p}Pn}u6Yc_oWd^q<8DXnwi=L3_MRz?l6qWnE)XtUlFBETh@w#%k5m3>vLme_RHSmRM~5 zO~WDtm!r&{KR7+kx>$=^jy9c3PFR~Dm%-`^zRg@0QIX@bmZ9AWfp1@0Sxe#EmzV*m z%zY|B!mogv&Pk_^3&Z8_v+3G!WJhWWPhWDlU4qyk6F;XUA_*ksdnf&zh+Si+Ah%(n z0A~}}%}I;zBokpB#zQzc0i3N?H^bc#-AwH`2=ft}P__*x6de~}MbsiY2c(LM@LVF=Iy%On$?wzx-c&d3WuKo;W(FLAs0f%x zqyrB_F)^94EZqeE3~j->faU)plWi1PqnZ#}LWRaNI{TQ4P)LDHlHyW2CPTXdLRG{B z#!bXo7$&wfIoAy!8JV&p0P}ddY_d#*ymTOZY-(&`&K*xPvJMfYg$3>K6{7`0D?y%1 z&iA8Fou4BM+hm5MY5$oc;pZ4hWyIrLYGzS+?A)Sgm?x2iD=lFULgpN!x4QboMMr&d zK4nIBnM=m+eUS0q88J(NU&mLgh1gi9Q@`an(odrlk&cb0%WBfJql4#a31nuTPgADL zT+q-!vhjGr@;Lj{LfTj+yQ~H)J&<)prZ6T=`xZH>DqZ_G103*osfofm`Uj@;pVAm- zh|xsU*R!-8m-2RG$%gTQ*qCrpN=mFsR!WIqvCNqS$v`%cW0NKOOE)uVPgLtl5v(4l zG%QYu2HzTa{#C|gN(NGyI8W6gtA{Sya|PeO22pH1=SI=DadhtoS*c%r4a@V&$*IX- z3pWgw%uS;T>8@j{`ColXGVZ5)WF8C7aBmeE5 z2sgajy*?xic#V`(O^w}5qKL4juaK1eOeKr`u)>5&z&Ycm@m@PR|15d-k%Y?D`8XD> z8qPx&W3ew}aVc;fLi$H*gewHMM!sUirrGCyl#6|RcX&#(cun}4UADE``XJQa^Y&^R*idL)Ag8pCJ zz2{d`{r|7Iv(q8K2BZW5Lk%cO5$R}xD2OefR9jGb(NLt9gc^G2RRlyj7^D|9AOb3C zumFlB*uajJV##dp`+H`c^E)%YwdT>Rng1XUvtOV0bzN>W^j`kI4bO8LBuN#{IkP6o zEpF!wcR^+fpz+(h*o%1^cez>&O9-n(!?;LM9>^eKqiB`BG&D{Y0ly%-@v)V#s*@|> z8@k!1orTb=GqbJh+>&4E=srrRWHBm(^l&8<(c4@?q4r_b@NzWHA+Mn*`fY~eI6MAE z!opBq;*I(eswkP!kR(heI#P-<-4dLKa&z4hw@eoo-e94Iz=qPs1{3JjLSw^1LzQ;Z ziZN8+*R+yKOkp-Q!JPA>#tZA=lzCH!U2|;fYU!j;Yt~0R`>>^hEc!NFD)gP{`+m4b2a*{9Czz;wj?7QGr%ZuPZJ$r zux6MNqU~UH>MyhQ&=jIMEl%D)I5xrO$iw#S-YKg7ry9)CG%^COEHr7C%T+`aY@7`! zsmAXkcBlz6h^u}b2GKIFa200dVe!{nwu$<^_REqp??iVder9)CXEaFyDSLKziXA#> zKP&x-(FL}P69q|*qMgq6`0p-E9E3lHXgGHj#JV!+i`Y&4wO(t1O1%m+TjF0pWW%-C znd4zLqCuxK#6qC$iV-rfxj0rd==eWP3ord%xa?8FYw)k?4dHBwGKczU;MTQqt9sb5 zci^p#CZs!x9@*doVAMG_QPDDAQrn`2 z0qQP?@8qR@d13eE;xoJl4cp7s`9zoK7ga_L8nQ6&*GH68i%Pj%+EOhhBLupxL^033 z8Qda?wQFqo;2crocgc_?p4NEDWOqsG+sj7!IN(iSDK@;$?+UzBXwX`2M|J;fYN~d^ zKaGlWo-9Z`#6I{iU0?=%;2`e$@JiZ6-ix-CZn zQ69dOu4M&4{?~x=W3qHWlx_^n&SZ}&_*L>im3Qqeeiv@7FJeK%pncYo=}4?Yme%#4 z9SW$P4XuS*BZjHOEIM-5b$Dwy2nAfUQM~f(5r;^+th+R_<8j*+SycJEi!;I3TnC3^ z@51=Ywe`_54|+LY%62}mExj@s1baQiEE+6+m7I=|34&0kT1HBQ)o7(Xr(;z`R4Bs; zbFYH14$wYaCV(65gz(+a1x||V(E6pLJ>b*b+tB#@fdMz>jY(QVB^oc z&i5C#go7T3FZMa19XR9SK^`epH@9W@Q5h9+#!wawykp$i;Dk1+;u51}@?b9R@PyHQ z311#K-s@@fQX&=tcV%`CS42OJk@>)f@5pZMiS~d4rktuYU&9PvU_v|EdK8{h88?m; z+@eigI}%NOgYb+ZUB%c+{}hz`ROE}W^d9k1qC7Mh!xwTT3K^i$Vl?3r)NCZFS_ps>|FJ)naU=8iGDeq13MqT@IU5rP?7J0^p+MW{M8N z?`hG})N6(JKq{afVKaF7_fONaD`{rj!%WUS!pq73rE^kq=ikoBe+U~*T7rW97{?5W z6Fj4&;h5L_KB0LwzyU&m1O_B@aV#`DNwfZ+hOGZ$HVJ<*n?9NphGl%v9(*OqRNE+G z$Rr`G6L=I;zA?xAAWjcL1TH4hHekBAxv8Q`(f|fMCk3Fjq}Jd8dtRL#(4-%VL0kzv zcQpIeU)F{$qP zxJU7s$#G<%A~SCwP#%uLbOB7WUE$aM?V3znn-rRB@9VOb~;IG%5Am;;HBH0`wwA5*{sFCX*lyql>*LeTc`upXh|$~oR4i!C}}Nn&ZbQWKuU`f>5`H&_(&lD z9yiH%17Z&DQ6HazjiVI^we|LAaY%~QbgVsTmAOw;bu!~@MRFfcE z$32V53z?X`>!opB^@lE3N#zO&C2aFewcIy0Sfg3-- zmSqje2espVUZQJ?B-yza*=9dZPv#9Yrz*&IYpi3Bl3vpjQbr6VRTPsdb|t=|#87pm zl5XT3CEA|!q6r}f?k*BQA7WDwpyN(%-CaHgGwuG{&TPGfEHR#QG>m+-R8jiz97QPozqWm*R_sF}Ur$3BNz%K(-v@8R}@~3e=4arf{ z{S#paRdF)%NX^h8vG~DSrR&g+b^93b1ILLgURknccVQcQM1nFVt!P{55E^@swH6Zh z=l!xzBP7iY*-YA-f26VOl4hC_n@7bxsxsD$x?py4M>9IiF54Xhq&C)`&He~`NPUiv zIVl}eGvH)qX5Nukp`h~W%`Q_4ctl0}vMu|dRPF7KzJF{J3A74NB~~KZXEC+7w5c=t zpo$RpfuDAl@1Cgl{=}_aO6%mxm~&^eT9ph;3@V9bLzHo*vft~pyB3lOeuVxq;x}td zXYN9!R;wf#_&O=Y!i2b$kdc7gMWuGee!PVn2O>6(A0mbMF3m zf{R1?#&GycIjb-*!g(n85GP?)6T7&z8cq{@3XklCQe&m-_X`@B*_-!$Tv|{?UKF-1 zM}Op@^ZW-ae&W6jKD#F#Jzy~%YhVrG9DTGOE6#ISMn#c-l%tYJ^4mV`#xyhD`zUYK+VAfkQPcY}y1RD&hjHMp zhOp8w^zj$TU4z{CBg%o+RS&D=3<4JHS=Fg0W84(fdA7MNbDjTtT2Ub=+GNk3VsRVBA$86R@9<(@i^b^ah{@H=F@nb?e7u_M@Y`w5D z8n$-yo*JCNsHUAc75~cjPu$(9bSog)`XH#StOF2Gy zaOyR%0Hj`)W$rJex{;WNv9L2~>?6sMk`&*!CeVT&`&c2hvOfEhKCW8p_^Zz+*L4rqFP?yGiW9w&3wGjO#y?~~B}beD-|GA7AnMforTYnXN<_Djwn!)asPxE6YE-GK@*fDRBj9X#NM;H0L$_>A zVR&Ym9^SE167k>!QIJ-TcMP-Aj3WeX>8f9&Ws{CM@g`5F4!$ zt%2>J0De9U8^k{Y-&L@n%7;Q%d?iVwnIbyGscc(sMb1^;8NOcutgrOu8F_o63)U4i6G>!GY|rG=twFF-cis#dR5Vj z)zNgUk6z8%_2|9OKMM)B=I=tXSfl$kM!LPmaQ!(X;+(#j6Fnt2zEDo84)0C_iKKua z2*+mP>-bm)1_)n?P$3Mf3g0at1ie0Yt{OV}oTc8IQhmDI`Qf?A=Y&mD*dRTO2Di9` zP6%5$B(4>2HeSZvr_w$ zkwO-Z*4Hp=1L+9rId*YKm4-qE)~C;@r3x(Qdg2+s#)zi+YBRG~x2CI0%C}ORIx+Pv zeogt#^%va2O>LSw6bz0=HRpwgjW;y2r^&E6C-H5w-BJK^SIau-qH()sF006|uVtSx zR6~b#l40=I|0bu_$@S3p(b7jv!N|!o&+I}qW};r0g>d0ktX|7}y0nii>w|)NunSlx ze?bAew!-g%=zMX+c-yL-up_$}}Y#MTH5O*#f+Z=?PV~hR_G9`lktK4h-jVw+S zl14aTQXdx?1rB)G($QOZDyRHPxDO-X^`b=p&X2Tf_;8DgFU~AtsutUmg*Re97DxTt zbkA!Xh|^eTYKpn$KyWMq5v(?=0f z0<9sKTBA3PpC+3eGxjZErm zXpZQvAVbl`jdu6?)5}g)ie`QE5Ax+)jvR|Cz%{O5dwUh)jzu*PL$PjxD{EECzt1$r zV>*OroF&c98%{)imJjc9q~mEzrsU}h{GYK;AY*U@VSr^!1hgK{myI)pX^N#uM( z^EW5NBW4?DAF(~U86U&>0%J52S6#wE^T7-L{%zw?Ib`PW?e0dazLq)66~YFnfd*bO zZ;m}KCPU#J$P`zpy0WVx#GH0{uLb0$hj}65wUc!1axS%oer>+V@X?|#;r#(FOPmPw zKTz-`FLue8LypX#&t_X4q4+`lt(E+-RiT-;3T-5=+VC;1G~=*xC%=e7hCcAX1E%BW zypVD4y&E2)F7k2-dy@}F*YDhz{I`{z%oSVJ*LQO=5!2_DrrUVnCnXzV|s0=6hrXq0b*Tln^ z304{6z=8)y5iGa3eOVE3l*4(vkFa}j;@ZURM-_5+A(RpG>=#Ap4>Yt6%l5+3Nl#h#_5 zZu{Ud@SL^P?99`h3CRDA=864pr8R{{mW>(|U{Js3Ti*4;^hs`9t*CSl4*8o~5kc?SWY*YiIm7b~sZ z6s8VJ_~zcx#SyL&cS!6g^W7C+}IUBKQb8!ov}?xkb`5R~6A!9vvDEmDWw zG|WSe=WNnjffvpyZxJLuolo%#9PAn`3;vhtYJ*|6vniPzq?(w9?}A8c@oskp+!U@a$)LJ zIk*?%t$B%NQUH0q?HoOry?9Sy0JLU`upu9S)gbRakA-;dhR!|ix1yCE@%SM~Yi}01t0eug+ z!Rf&gpfpiJWEsGf(!$V|%lwiU0*}=WHPSl^w5jrL-tib^? zWi^thc`bkaqvzY~~_FePwdhksadOUh>xbt*|^Zur<77%t5e+vL1h{vwqfbCH4*0Ne|DA z#RPY~$HQe6$}wt<%IMzr$IS_isgbw!bK^4akP-k2H>Wbl{}C6-I}PPJQ_39>Cl#LS7t6kpUg|doV>8T=d=i53@`j zzff_lwNYFT;NurcT3lc5ly-p#YTHpwLnbWEY@Mkc7!pyV_iB#zaZgJwPyXParou#f z#4g6jjmm}3MOQN&8`^4wU_;5Sykdfv(IJ^8_B)>ODn67+sNas$EN zfqtvFkmfZ>l;Q8#2L+x8G<2(RwI0KhB;~BJ3Fr^Kq3RvIIiyE^vNiQ8gDJ#bZ zEgw7AEx9M@bv}9!N1&+fgZ%m_T}tHTk=FTQ|D!PQ5=-seWWaytUViJwH+Fme2k?R3 z%%g{%ySroqPP__B0%Y%v{^$z6ln%WtnJtyPhF?%Qnd3@SdiGST<~$>n(KBnqZX0fV zc*2tb&pAutYihO(fni_Gr}Mb1OURFval)ULPCrr!7VV6bXPC*uGsYvEw`WMVJbaG5 zV5e7dOU)X~xL!IyPXqfNP%*=@@eJeGCk6gx-0(Fe#7ahpTnQ2OmICv! zzi0{Y<8h^6uSTyfD2aPN7V`y41nost81&pVi7=7#PyjsSGXX7TNs&L?dEE+wIQ8-8 zUfW!!M_rv4?@PhZ$N zJ{YrMq&Uk1aKbkHwT(akEbt=lq zu0tpCz2aU<_;8Ua?7-hCsjh|oKjFtlPFhcj4}AJkGZTl(#e@TCq}~+gWS`p{1i>Uk zULIA?_D9X7dKxEd_d0GNqkH6i`gSJP+oT~U#pC5p=h`M6kx5H|GTo=buP-?E?G)8v zgw`&n9Cu11bG<^Vr7f{E4fIcnasGPc-shepDbz^>$GB&Mk@AicgcM3 zB6FS`vXtV}AbnZQiTlYxpS6LAX=rCnqGS<*=GSl44IyBo|MQ7gOMHVb*@MW9T&t6)PeruI7TG2 zFN7;(iog=ppMayqD+#cW)RFAN=2WCVH~{x@bRd)?6BEm*yADL$L!Z&1h$3xMO8>%L zWy!0-r9zdoj2kIqCRsTONl5+r{I@=Rnn*6Av0yz!YHX-@q%1Fot6pVUJ&ZnImV}(d z{V8q|hUYd5ns6mV(nHS0)o3f*rk?Z+kd?{oZ{|BUwu-cLc`KFKwG6F?MA$8lrW<-- z*IsIJo=B@lV#WO?GqzE~^rI*+D0;Rj5^0a#yV4qJ428>|f9ZF+)IPhatSteXpg}44 zs1Ww%HS4S0g|_+NCA$kdT@Zi9L)5B}1-yixCeVjBVW;#6uxn$sBxT+?>|fCa{$)m~ zyL*H&R_Z5q?T91KINY;G!jsgV!Pzcr4h?ac5j_|wfAj#q?Zs5-9fi{&fLMr-gF?-w zg}D@-tOr%AP{P&pKBsh6ssx54CJuGNS{6U~st6m7ayhYtl3JN6VgPh3MTwLl!ZYc0GxQED^ld!33{872Paq{71b z?!T9Fl#*EUVE3Ep#-=TGZZZ;1u~LSb@S)yKJ^N4G0kEB5F&-1J8b>W5(t6`d=fd?% zlN@uC-R5I+8$xcFLz~!rSw;T4$9o<*Gl@ViuiSsHUR$rQh?oLoCi{7wug|%5qmxLw zF#0YkX)U|?5$gVIey0MsU>>#SP(;38FuU|JEMz@6a7D5HBHtO77K7`<8V}g^&%CuM zp3|s`sLmG@LJ$5HGNLRnSwprqgJ`*W= zYnLtA*BZOT)d(Mqn-~l19rN#rOq*}>X&Frx>Ofph;Zj*lbl-T~P4G~8+t;vbHBqri znd4z4h$OR6P(OI@ukq{7V7RMX%5~mX5y!)erG`sMq5T)WkPE_o-SFLY`r@ABj_m;p z>;0{WU{KLbG=jsO4axG$9=5m%lSc-et0pX;EWq!2MO>VR7_n;nR57#4gPURg-(@Ab=fN^{_$U4At%C*XCEQc|uV&eV|8}QYbYPzNd-7t-Im`1Ey|wb?)y6q<*7P6yU(=r+Zu0#4f9^D5 zc_Q34K`CG!qB$rlnA+)=da)L+UKDM&k;Am<`O#eS5CEzU*u|ffMIpD;Dwv2fA9f(5 z)_APgCQ$&~2oBz9+MWy$(ohjjdiKmC5!md)X8l}%g(@?8DGdzW*@O}otnb}`U@C?# z>~UYr5Nwe`I5gln=&NcM0ePJ3rKsy}`oJ2Gp#vD3EM9NOyQjZty2qZPu%`^u-#rn# zCfX<|54h0Dfc7`BgQ@P!^YJsnTN&D%bvXdTB24&6oBKW!c-Sue%Lcz{#G1K@!WBUmQ^LCDzHb5!}J$o8q z9L<3{wYBw6DdrDIPpPj<8}3q8eMl62_Qn{=s=NECXwq;diIBuH_!ObV z2Nb1}GVrPRB-RGJy*n+R=sC{cAG)Ss2Tb=Qfxz#^0wwAJ6qIJQvCNjXVWstSO?K$i zE^kW&(>9IL`U`iTvK_5>R&Ni zwmwysqv!*nOeCOC#k()@`1{oY3WQ=%0L?+?N>@CMUIauy_jjabwUP7@1*F}7&9a^w zsg$R7FDS=SwE5ZycC~{c&_d^I?cm$TdrJ0f-LM9K;B_~|3tIiC3IL4zGa`WWOy+(kYtn$2%YB~l{I&#u zQBH9MC=|mtjxMRQEj^bdAA{F7)&j~l%0}@B6BT|LU1{V6^@G&?6|1|~o9C?B-`i0{ zGWDc*PbW|SbHkfAApr2XX~!n&YW4i{ZTA5^%4ctYnUGemF}J$<-W+~Px+viq4fJd; z8=$1u;q4cDhNEe7kapsIR9;SUp|<%N9JB7WS|{uM4XLLglNRD?5-bxCSXHnkgZ#uF zk&B6F`?Gb=Q(7P1x)3+qdkiQ+0FpEBRSx#MP}g^Jc*IkxUmNxr3SJ-qhN|T|hzAJA zuVVCMMhU!~)7=X)W+H%G>nB6^{ zjRQn}RcUTRH)bGLo>PWRAP+qXaKxo-gW_l8Z>14shy)P7nB)c%)YqSN@Bl`ix3UUU zL~ox+>Z6gw6Bb?^+ks2oa9LObab^PXWq=wN@syK=cUX_M#Vwk|z z$H%4hdGxKyyKZ;SofGxLGjjxEJ03;m#?cSDD{t1~;32DY%r3MDCPApd_UIrbp3|VB zOdx~>mE*B%*cD*1NO;t`<0dY^8V1gz@MJY07{bkMPj9fjbD&M9-u7XbN@1oN0Cy+H zUS9101o&#u9)mKS%y_;r$^1&xxQVObIPfb(H@)9_5K17}nbgR9U7Vq`x#!YmIHcz$ zXbt&x{C#a1%YV;fCUgJ)u+#jnX4$`t(5+9gi$l+Vn5*(r%cJ|g!wpsW8Q$0B5#=&k z0=j~P6ouEDFdEwnn&E2tjghRli6%b7#NXq$EqN*;n-20YET6Gtgnx}+tqSOBUdmrEy1Nq!pk<}j*01C86OeGFLha6jy_F42 zyIu*uy6~UDhcjt@r5HJo?c_x|ip( zH~RE#D(Un-<&BBdlGXbmcH5z?S<<>8YN#5m@68u_U)xmxN~b>u>#ZlfIAVVHW`6^v zFwv5{w}7eKZ)Ef{Aj^NSrBu|1-Q9U;%+DD+dh-L0wXxeWPS&Gd~dFnDkp;)+W1QevM96 zK<-IpvoZTPTvj$1o8Y)S_+s2@Y~syJ&;4A%OPikEm6K3Pk(xiYkZpGDSOFnYTJb5- zr)TPlWj%>x?-SKgy+p!-!7#YnX{pMMnL%MH9mfRfEIkzian)2iab!U;`dLZPX+D(ii_K)>cOLE4*$$gbG zL!Sz_y^uCN2gW`9o$XD7UZb*cj2DR^4q}p=*wr58^TmNcZ+NUTGuQxvB_Vq;Rv}V^<}ui8sT0Kw zcIxyp;$T|p<3IKUtYzy|(%^gf*mFHzi8OSMA^9gAxtEzxW=vki9NYa)8>Ubc*gv{lE%b@|v2f$HMVn7f4t{J7;laUYq#N*}J z1y}=NOYCX42G_RZA8VQ|HA)RFMrF zCsq;SHYsy7CG)TJgqGYIq3Vvyy6{8dt`_9L2=m)Q=GriA#f2=G1A1Cj$WwGdINVxrblfdUtNkH#Y9*Wi_gnpEQ!ZL zo=dE4JTYDq;o9pTa$NM=xO4b8=r8Z>U0M{8rsDu%qaPkU2@g%%*NXvSxK1De(4 z1=D94KfGgCiqD#oeHd|>X*!(@Fv(Nx8xO>odU@ls6L(~gB0UOSUBX>Jm7e2Fo5;a8 zo^0479O)h+1?cFVOhu=pV=6YyN2hgp!9szTF2^Qpl5Ul94nwFS-(#on>{(%>@=p$i zNb*|l3JLFXIcb&Uuy`iMlw62&CCXw{=py#`IMq6_L6S%rfM-E~1B7v>#KRB{i~hHu zQ}RC*bk;QGfYo9PoN5Hb0#(G6SF5kS^(&9kw2zzb#%gG7z!x-A+cdtf};Rf$R{c1p1t%c^|`j|;}WF>`d_JxcoTdR zR6SHB2H}r}+{JD7WyO|c65ce0;ZAALvo5A{#)r`?z0#iaFjiW@B{PTSM@>U^`}{SL z&AjGoW})N930?gyqh@4xei7d*v$*66lZgr7WsM!xo8wwI?uVUbk&UDMA|O(vk+H)OpOcDxEJ50>-aRD z_UtV&6>3Ajv1fJUP+dKR<9D$N4X4ZKnI0)RzxlBN&WYOng-8_<$LnDa7dqf;9oPEP zTfay&l{CRi(bf7co$xLprAyy8HvrqcPqgEc5tO(Pc>>#QbF<(LTW825Yz62RaudEp z#4J4Qe&e2AZkLXvvbxua{y)X}$9SS);;MLia5fY63 z91+1^>YQH4C2~9CjJ<8kd;fmOn_YGIL;F0gxE)RnT#&^1~QnRh3;^pSz}S ztDSGPSw$|H6aF$)2X3}o9M08sz~42#2DayKEN!hG1*2z;B2#b=549fE6gk)%?Pnh1 z{FpNqKAf4#diStZS#i)Qwd2fuTNM_6Hnq%marC=i0u?E&4oj@>WjD7S zH3}~*SL-Z6T=O5hdt>lest%Qxo%Y@ozG9LAMkZEOFQtx^Wa_XfaK%Vj3%s#^glajf;oXHrW)lT0rZ_R|npka#qH_RcD9mO+3I(K(^P(Qe{WYC;aQMistLA zjYn_9u#OA{_5AAauDJC`5zr-%4;e$g6E_=7+QZF94}`qIo|>;Z{Bi49D{x9aJfhCx}@cu z*M~rvi2z+tTm@=gYstT{7M18P&FV&mbNKszss4sg*MEiI6)GfZoQWeRh-*MM+4G(( z60$hvp44yE&zckE;i_k0m9F;vFH5R06txg@|ApP;9x+Kz!h>4xSR(J9W9wO65U)WQ zUOT5b#6ieEesFXnMBg~IAva2f_rNFc!ARNzzoJnY(zT!`o*6EP;LLku5Dyej!%WsF zY_fuGX|_r|qN8-^_Y;&PxoH@(VB}}G<{tnr31J(4&4|rume3IHf|&D$_0wU}99 zDXj_qb;dYAm*v<>O9K2(8X|>rxADo;L#hOu1}bUchbR(oG3im2=vfX%hS$M9GrM-~ z%F<2oIxg065fp_GJJuuj(y=Bt9>-(X<%uZ(e;5)Ai&iB~cm69BmGR#%ME`-JY!{F9 z0AsH;TE<$6d*bmwEk&#Ls1FAYWVf1|?0>k)Pe==Xe7&Ro&RI&LS*C22^U!fb1R1H9gGoL%bn*ZOfErZtZnJ(XvgFy630{TJVMyMDG{%ceVz6a= zj^BHDo{1Dy-sAH8JP;}(b?w0NMhv+2T^5?j^V{x80M@{C6bk4;zN&`5tM}JzLIL!c zcTPhOU^;5>_q;8DAV=I+-=(*x0D#s4{$~W`^otkc`5WdVOg?|f&M|)7EdBP;y=GCN z%!=a5dhdr6QflZ6j%Q+6rHM37Eqc>y%Nykw0qTi-oyX|A80vw+C9T^`1 zYwY*e%ymWR#oeX|w&5+xx~#8vbkp=|CMZu`RB_s?^55b3BBGZHZN&ogY|09q1UTS+=c9m+8hAOX0-z_FaL~#3)jm7f5f8vt zTZ5(ym>8gsB>a-z<%xiGzAR+lb~F{$+5VK;Dt~`?r~anUJ%Ie0q}{+8La6Ou(adcC zKhbChT+~p%4G?DX`T3}80OgFcSJRuiU9$NzC5VPE_HYD`$ix@pUf6<2C;?bEP%Av{ z`?pV&=+&sVU4#JW{liT0j{|dPy*aBf*@AkjwJbWCkz3FQuld=%INy%fjb z?{7FBihec3xp2d%fp0-=8>t)t0!s4r^dTNnT2;LYv-N!-OAo{X3IL*rFk%Z>(Dh)` z8-hPN!1%l!1$YQHeB)!@?uHtVVfY^?JtzisTeb@DeOr$L94Z1r^VCOBuC1JD)JF3+ zB|D(yJNgo}Z*F$N9+w@QYo#3A{d);ziN^PyNATL2YlJpncMvR19$2gy!TNsuwd33K zOr+O0iY=D(*>4kuK7D8-P<6YrwA~((L_k*IR3YP5?hHP#<3AV`6lxJ@C{1FFo2;x+ zvj&b-eap#4ssGGzxGd#xSnHJ1WmNS3?9?Gc;g(ImziqYLM0-i!x&=-aG5-{u|C+1? zSS18l280vdIO~TIA`f72;2!R^Erz$hMFR+lZ`rxg>wh1mX5)BYKnfnfQIt=;K?8<7 zi-OEl@J7{|@0zyMt0b>uNAnbcPBQc{GRIO-F55iwl5_WruCHjd%Z!e!q&o^gzt?90 zJXxl`r4?!Oz+;M$By%0kLk{FTIwW+;GwR;r36Ejq1Ob>B zYmz;VCwtpUY)JCUx-9@8fi{r1Gx25JaR5-9xtF8y!GUxJs(m0x9zSjnq=Yx&5vAtX zh4c%#N--~&RJEblfO>T9!VX;{6%3|VZP)A#c+Az$jfcBRZu&!VxL5K3Pao(VN03Z{ z(sUK+z)MAVO(F@IVILACNdOOR`?RhKVo|!k?Gbl6SVpR?qr9z7DH2Npw(8|jCx((_pX^c<&YYnhHrq((4Iy2Y zmj!G&B8i*?R%q$)>!()fl&k{0(eYV*2R#Vj33iM~QG##|iuqCBnlnQ1EcMejfQk8X zB-PcmzAMXjqS1W5CTYE59TXQcqH1#F9VN*)%X|F3Qau}`!T3Ct@DeGPOCQl(^y5U; z4oemYl;8Xrk{IzikomnN#mjiWwKL&+N0r$BEA63w7NQGrOE;hWSzWpUh;y0PJpyp; zG7qAmNL!tC;>$?f*+@W<9M%QIsOJ}Fx++wW4g=~1@b7i^$8lq{!1Ldh^F z2oV5}Qi$wJ{+g;40D;=11i2-qoT?p-3BmdrZf|gq=(NOsE=7o`oJnO1?&kQxSFq%n zq4oC(kB89|IWiZq{@2i&;~$aItf!mLhVR}JkE#LBYE_^8S)C>|Le0#m+o(U}j#_Jr ztS_*#fin5od;H5BxZ^yfmwP0SKUE{>G^8}1*gXM6s3N(f&YgaNY{J6vskYYdtyx3T z+s@U1L%`P7rMxb3$I2R^J9ThHbhOcatK8dAm$@p`EM|-J1}LOSqk{HbgQUeq(*EVDtLL zH^|c#MBVh~*2HW*C$lfy0@}-q zt{XY?b%Xs|WiqW((D?1UNR`@$UE4CsWiCf_oxS#!lk>|ptm?}Rn>f<$_=u->tTLnw zpL`uRjd{NL)A#HUuu6jQDY*4f4)Tital^3qtMAw(>`<;B&^WE`vWkOUS2QwLdY#G^@psX+*WWNTG zp2ym~*nR8k!pb=jD*MWQ^_e7U%r~7SdibhyfVU)pxEQ=+Iw%NWAbTaHJWxJM@sk~= zUr#e%h04O012W@rN^+=s-YmHY*}Y7h{&Y|oC!U1!Ln6X(CR8OkW_WSJ(fdJ;5N?k; zRa7f+bA$9<2r=iJ0Ec&ExGb}hUH;+NeFsmkb4kh%mVLY!lVYt+9#7gEAsYnW?Dm+n z!Qw{Sw;7Hu?s${XQxa3%=0({A%&D3OuAb%|YJSQng|(lpM2mZW4OF*uen z30If&QnY6>SaPSlb1?*5Lcv9LmX@0mIf-GyRO%7Yp}75mlglptQ8R(HV_=?3q>{6k z3?pkKLKdzfy<&%BmogvATf$;tFE;1`DiMCsIQ<4J=NFrt{v5Le1O&_Ge!ysQ~tVLg5COc|5BC}JL z^J4-2m3Tw)A>HLb;do$Lh^!G%;Id1btyh>(Y=U$rs4%0gujh~%87G${ytE;AKDJAP zT1H16!Ur%KrD3J=Hs@mRISC^ue_u~AIG53*L51g@bG<>PbFSSb#b4zucTy5uri0*& zRe@a5h7yE0K16B+-ON5zot9)h9rQr}@QV)>)QHJciRE2CA(d2;xl=oeQk3nQ(KmW% z=X7MBDOB25+WjEpLTS0TO4${S5NB70Qn47Vq+)+Ua5?Uj)Ir=8`NNjQhLY(_qZrMn(Or?49ufc>W7^Y=ZN{?D<{>&h>-7%sUS8D z{ho1n!3lB2$Y07M<9f0m5g_2wS=W223hv?xOMI(M%f@%?`LGC@LuoN7Wp~m%8SUbg ze9v*Ma&Kz+Ewo(Py}#c#zC6)|H|mTaiANMsID2H4o+R4KG;2BsJ8Z1p;^7M-*y-B| z5$xU)?(%EzR*5Y@=k5KVeQxL1R@d6u1vvJfU$s5_aq&FzGx%ra@JGJbvA5zk;RFf? zad;8`QcqeWr0$sAU#)LC6SH>_B+>vP9SPs_Fhv;AdJWM)LrN2x{RoxbkE9B@NZrK- z4G7Fr0RL`Ij7CX1lyBCk!IjKeZJ6zCtWf|_ZpFf@8@}E=ABvZr9|s|8QHfpmZ`I7M~3_4*tWe+ph;8Kn|+DBN0nivO0=i%hh`H25OBSk)Z! zyXh2$iP_D+_CpW)3Lyr?FHhrm1y5I8N2=p{lh2&$xuCjuE>w|tsph(`<@L~!41?Zl zM%KXw1$n*$xmfF96i+tl_7ynF1d~JDF35K4-18RMm&(_yxRG(1stk z#r{$KTLW+9UB!y^uV*@?3HO5I)`2qcC^_rim|IGs@ZN+qWcvEzmOW zHoj#dLIEx|{{9iH`zmuWRAHKux>gzZhD%q?y?xdaS_9ns3zzbz3p5mTla|pl7as4Q ztg4u?#xZ#)RAJ7MgzPKgjO9$Hm<^OmO@Ppp>yomYu$GXE$aQ2q;?rXLLOpPB~7=(H$qxYVphCD@DXPEL~9zQYa80^#e|UpW-8X zlMai!+E{5h3D|D`Zej7;E-UpWjzmv#D9L`Z`ym&Tr_wzThYNMG$=MN-`?IHYDbToz zt+U*dOa>CE_rJOIbi97RcfO&{;;Z;2YzpXYh|JsO6~mkZbl>#mdx4wGd#&h~JJvEr#sQg*(@;1cVOUAO-e3O28yWnuqIK^$=ZP zQwFY8MFbDw{IDK4RVn*J2$n(pP*%!R-@pwMNI-jpvw`X%Fg#$e1@1r1-z*U8LVCWp zse$oGPKL7NY1I+z^}@$z&nRS5kl$2Tz9uYhgQ1scGVmaB!Q00g>4Jz2Aff{clpNH(;gqX@))c;BghXQJ%U6%9A+q@$bHB8xO0J1 z&|zPc_LY%=Uhv1{Nc1nQIogQ?_2Z9@jautLci6*E6>ZKf3}(0tB=vxLDrEHd<6LjQ zE~Oi1ji8@nT_sVYap|RViohHTd>T5gsaoP{)Nd6;5@ROR^`LPEDD5}_2F2`Pj5Pl0 z9fpNZ52cgb(ANBn`$qm&GsMnx?E!f4ScK}En(Y7eM2R-6d3nKXg%^%&5z6PPTTTMH;IRbr{ZIq!gQ&D0vYoN zR>_L(z!ZwvPh0!qAW1*o{dzyGgL=}@gh*(AWSk5QCR-D{58{E1#G7aBpU%JCNzhB*AcXV!=juxyH9UrQU- zN0rm3de$NUwtD*(;F^qSE&hPZ!QCNYGi%3g1^frMhC;k@SiP&3u}SHnm=qptukk;S}?35$3_mZh=A?cTrY#|{^Tj&n3sFtFQyFj*G+b%bwmu-%_ z=LD-zx3Ws2GL004uyKl~0UM{{MBV6)ThQIne#h2xSno-#0I~B{wtF2Q7R5fCf`#r* z2o(yXs@U`e1*{bY$I-S4t4OK&IQ?qxZmDKBwJDLo6U5I++Q?LYpPo zk?=ZA=ik~X^&3+=^-$F5UfX1Vik`mK8z~LUg1-UaSCf3)p0{Z_X|(mIc{cm!mdF~~ z8GtGzx!(+q8!FE|@%wc0;V8WeXQhV1YY|?^2!Jn_!Qf$DZ{WQlY}qT)$2tPW_Z-%fz@jNCg&YV{sNjB5eSZR`fAm@7BCpK172~ zaqr_Z>G3$40^z_70B$Q4IhK;Ua9KuDjHp}T>h!1P_m`6o0;KtpO(_UKx1#EdM5(f| z3=7!7Kc>FG6aof1(8PS}Y6JyM*F&&%h4$vx)Ey;3s1vA&4I;{H0xXtHKhDhpL_ZBB zhb<3c-FdElr^&>Tx6IZ}JUr-g@ca zUn@NIp%pvMf(X8?Zib0C)lrL%+w?B!eG^phm)&Mng5Ci|1%gT{x0beW8-qfL61`7r zY)30|Z9GKX?iJ5cZRWNwIy3QJD$fvz>9{E2eZY3QO-6@GdRjhxWP2!ieGmuoaVY}{XhZS6R|FOp<--nOBf1Z>GvW$w>r%=Eq zl`WNZ>2h{)t`|l-q7`;zB8xU@e9uelC&1;eq324EnWBxK2M7-Cu`ymM3fk~2$O%|e zRm8qPe=1F|7rV!x12lwq<97?MDE0S4Y2+Ph6dGw9>gt!xZy{pR68T&(ms;@C&9 zK}LRlbA{$$M^yU^s%P$7aI+)Hm}0Fd?AVOnP#W+qI7@j=6=)OstOuCaK*d!BpJ|qq zQka|3oqB1H*D?tR+So8L$7@xM9Srn8B$WLSy{I;!9%o9tIMLb7Hv0T<^7!L}SU*4W zyJB1_0S>5o-Y?h$LzslslN$3 zo7#4J=he>}t?tjL_!4ffCx*s%Zqj^0x=x1#b)xaWPRprFPS-2^)`dRc9wHF{=?q zv(fjCyOo1I(W2Gs)R8$~rjDwa+fsyIKdI85&6gstY8_%_Qh&+3<0Y;ij_#2x^!%Oc z@T$}mtNU~{m3YII>l)}j+ngwi0BTMkL+GDB72^CAN= zD2TNk2+b3PEJ$O2ABm$41j37;)X-Q#tE4ph^oH)hmP1IdOK~uvlE{m<`Q%h41ogi< z-ImC|B*%-15BcmV0sm?rYWB`hVv zCmMTdhQ?^%UrF&Bebp9uh*P6UYF%;nzXjb};2c#7lWyvwJ36>=?2NCA zPOv1(#+l9XpBwSRNEPbOmYBZm~R(j$R! ze6)6QM2l(Mf!u6CX=FiOyk1r81M#<@gOp^mB_{+Bi}qDp*^@zDa)JY;hu?yBKnbg= za=6o8Fo~gp4_edli~5sRT|`oe;p=N>Hp0KKxCHw^|b3Occ3HMy#tYh#4Xo3eK00 z1g2AX<8}!L#=_Nfk%J8voE&otk`lB<-YqBzT|utjVvyG~w{6+Mg?cI}H#2|k*up@V z?^t0>&V|41BFq?UQ}N=3*5o3=0Lhxl@%Alzmhb(^H`wo$RLj@GXK1ew5$c`j%x6pJ zJ*(&&KFN@Zk3Dz#hd%Ul%f6|4f^zr1gpPe;1|I$hC5dn^;y2Q^NrLkDn=SY!B*dtbx_wEskZ`R zB_9_gLjALPv_^nbs6khdfgk~Pwh8OUy84I5gT;sy#1sNCv*a&2OpcqBi?yp zw_w6YeosbFufNd5yU?lZLu3U&7()*qM-tqNeKl z18=XNbh~BqrbPXyn!l*t`E8*{>6QR-me*B0db^=x*-5zkXBW9B?{-vJV_SYBLn42n zG;`@y@v&964_TI+yPTi!`o=wfwXnBMNX~WUu_Lo%&0AmH_6#pTX2o8WP?pMX+TzQa zug(uPXfVEA9}e6}ZEONIG)BfD?y(*3 z%@3!-@q54X!cJO3EAiQMe>ILU>Ekgqd;YoaI%(Pv(G#y+CMsC93Vu#976wR2=X>R+ zvWPz&Rw)U=pi|Zoc{Q(qD;Lhb4+(d%ED^0byT-jiJ+hMYy0zm+uKHxc(#zJpghnGn zsDPhHHH4a2Amq$y`I>QKJafSnz1=^{%Mzp2=f7u5yIo$p`dHvsy~K;=6~w)H?wGT>Bs%6N;@&$(k65R}`YmUbJKvShjEYAC8IAX$!TU-0w9e`~FXLh(FQT&DvvnY8S@d)danR4gRf+u3` z-J>^sC0T}6X`weUHV=`~u#@nSxn2%xO0-mXX1+=^RbQtNHL&1=GrSYFfCy%e54?%I z{ZJ(i^g%iM4~`R+)1lm{+}>XC>%o-|)z;7oubN+2Gu>e}wFOC+&}O&XZ)i5746HST zT&T@e2UzOUy&JDQ9PvV^P7bwHV5L=ub8)w|j}8kEQr~Nb#kJwJ=8?gK?gKVYVs1v= z9^uIsJ@GVxL=6PT_en7~NoxQhD{27l26qeBG z|LXqUC5pK6U`o1S|{3TJ?6fzLEDjCs^RLu2R%gjvI$UbAhc zxI#jSF*$AoO~Sx3d&cI&^8>AtaHJ-474kk!ienvZE}T{Rpt=a*9`Fsd%2pta}Q4rM%j+A4VvuCcN)#X`wB!K>+M;yDUh0zz@wvq8UQ zOA345sWBuXm?$_hlbQzPA@E18WQEtD%fuD95}m+dd6 z1WWMK)Y>wdX$FzH^B&!C;sc%WV}DbDW^evo^&)7=Gre2aBDe&XP$QvH`jXTqGL?tA zm`k{Xm!>f8>%=bnDO}L_cqeyk_(Uv|pSTOz0OWb@nVt+pioZo@wHbpZPXAkm-Kw>F#Yj=UJynK{d?5#lKYafDge_r+ z%-gvs@Ce`lchQu)GaUen`^fpV1#Xoz17J2wQ5&dWy8$No2d83*W^;Vn5=x|^2jXRS z?EL8+KfPXVU-mxWu2weJ0rNsLl~y{NBQj01DOK36r*)2DLx8A*v@Iy6bkK){Aqh}6) zZaz)fkUXaJ_SvXXt*^U?sb~Q@)Abppoc1>=Xh+E50(Q_)N<4bm?L|4y{td$hF}(%m z1^t$NbG>{99vJU+55i7KeiLNOk3mlO( zP0v6+UIt=Feu)GkO!@ZVDNp(%Su z$WUd};ZHIfb>Q+<;z<;xn-;ypLgdEMi1(&P8C6u!e^~@wunhw!W3;;{#)*3OZ#PiD zY{C#}H#~AEM97dXzc&GB4ALHNl(4;e6$1beZgs1^^zCYL5}ikW`!-7}9i%g^ABdNe z1XhtvTaf})Qz|{z_^S`yFNKw1yWzeoT%uwMYiY5lhJNRdLug#UOUik@5|eWXp;E>+ z6E~@+l)P>L%X0WK73$#og=Qfk9?DGtZ%fl2gTG|hsR)+s1-c@NS~57Zu(=126Qw{a zvt$n~1;|O5hQ0Vbvr|FZJ@B!@I==}xIP9<}=;$4gdwoDPY~=V4W`x9$`6d6o@2}MG z@uq&BSns`}L1gJY-Uf{K8USUzs@8%h16`6jHaqb^Pe>^DUjTk3W5L7lTM&@^J{)Gnag zTrXDZflS|^bDavh_G z*K<-l_9fFps#qG^T8smA?Pt+)s5JLwP?!iTrBS{Wpi8cr0LwYsVYZ!36bG#`%$ZMR zIy*jKw>K=;@hD3>^Jp@D?Mck{0ZLoYq>Ef$CG>%Xn7>b}Y^`a0%}d%a`P8m|ZF^~s zv)!6jBydNsTNz+Fi1V=cl}epkJ+8a!i4JO+UbOu#-5%oCw;$lO0*KS4+peQq_SJoE zBS8RDAvVAnT4trXu-;;p1r-)8+)U%stAV{+efrm1LJTRbbd+Tx7Q2QsqNOEoBEv1D ztP%Idseo%_R&fn)nn70G0`h6~ZZGm$D3Z%Lh+qiS2hXKUf7QGorr13Pskz$mzJ(N{ zQngKMGJx()Za58YY_YxmMw!h@~`3XJ%OB z0iw1$4WYo}5G|Nkf8k~`u+}|rpq%95E|dbZU}4xMojG@O;wpZ^Ax5KMd>pH_1{Tcl zkveuq9ViBr1ZE*wFisHax^I{o=AS8lyv2C$2TCvyS+-M1No_%0)+Y}= ze*uNK$m?F%kcHUfeEaHzryY7lskDP-9C|muEBATRUHT!RSivet&gP~78U7Q#Z#>6T zImDDKmV2P)LA5>qsdf*3frFlF{IX5u7D?aKM=jp|GD_JMJPvfYE>dF^D60O~kCSAT zsuCHqcj8P=hu2QX+F_jU$Z7QodoN)wm&dvy^s$|;gH`OzgHyX5O3P8jlr)r$Yi#g* z_~n@6wkwF5bYs7n(Y@!UDFM{Ew(flNIrf5uc6Ta)J8o&S)gE0~8t7z2P*I1_r|U;> z3gqU={iky_rm?Vgam@}pxX3$BdUVH8_Tz!q(iR57H&M-xTqi}h?v`lMH=|mov0aO* zE86`OP|DBh-)8A;;~z;mXs4(ySljvOWfi;&)h{I;-zTrL;bcMJYNAix;O(xd&-s=Q z6qG_2<0=B<3vOIy{9v}~*2KS-nQMFX=8dantYAK8(NTuvU{$fT7~#3Ir$?K1d+6}f zatjuHM@H=Cp$6lNEB!UWali1fsZ*r#vr(^XJeHeso_=YFh=lFG%adatf}1@ZVqw5< zJUQc>{m|4$MAw51MDgkRB(@@Ve?tVU20JrxXWoSzIqR7&zrCCGCG*XI&7QkqN4D?7 zoNrmb=PQH}<=)e^`QH9&ONKlPUVyr$n1*uw_+7N9M+~2f`mnYvNa2vms{SfkSCaVb z6zOiTjA`t2{$G)c+*tIQKF>_pRQ7IXjHc^#j#xKdt$OOx?;q12*GrH|QMJ1cyqnYg zJ)8S;!+@`l{Au;tJ)70zq_ZvPz5| zvN?d_K_}d^h)Rq=dE6o8JVfuS7@O|n0^FhA0S z%yG|R?_A=@b*lUP3}eT4Ajk^YAhz%flaHN$sUa}G$p zkaSF*pIY_gjEQ1cQXV&ET?s$9w@)P%-wK|KIR4C-$>od zGQ(mXqKuL6drn(Cp9MFNY@QWF$`>Q)$Ceh|=9Wpf!rU{mFEod_-9L}m_1f*5exb~m z8`r-O^+qp>g4C>X`?gH-?JgG20Rv%t_g1tSFF10T54Ut)=4Zj(As4E9%n_W@^!c!1 zzS?r&=$NJ%E7~IXloEvfp%1?rtt5Q&Zz7s`P!1gZ?;W3$&V#iPq!2xIrs^2k095w^yJ}0Ma3H$PO#luV3c%0TbQe#D!;h* zlu>h@J6(!;`DUr*jop?|@#_@JWBKkrv3pYGll}9NS*f1B0=>7HtFtiv%skBz!3lk+ zyOF3AaWDfcJ0X$au8!CBzlG$a8GO%nA1Djfr8|Y^=z3-&J+CYE+)8t7+?$%Hw_K>= z)QBuC3VflL&d*V;j;k4KM5-fqj%PV4V^6J0he6^-kMQ2ANc3wx4=N6uEN@S}AYsXs z;`w1Mp`W_`5#8ugCqJ8KBwb3%m<9BUk@RCu?6+57*PO7F;VzBJ6WozM%J(^Z zM0zaUy|hHOy29DxPL#y8{o)r~X+gtVuDqFb7Si>0bMLXA?ssiYrZ4Mef744teoB|{ z3w}?&_c*j=33Kf3%cSMrmeqCX2QPEnIowN2cg1fT>2H!hl;TmADefHH`G^!GBBi!5 zwJid4NQxcQIlICTx;~PW@uMUl?-n6nh^(u4+j}N77lHP=w_k$0pDXVnj6K1Xcj0m1 z`;BR4oYA`*t9@FYX=PW|CwR&NX28A0?)p{9?H{3z?(g7vxsDwwKm`2Vl+y0n27Vfi zU8w}_NopU9%?xp}4eBjD)R$nT*U8j6G2h(DSOdiYZ9gkR-{^HYI~HwM35uGy5q@WL z2&-Moz2zjiJ3B*rF0~<>Ix|iNr$w5-@Wau6HW>WKJ7)-m zHSl>}8<4(j<0G0btfEWnyUYw8TwX8KSbDH|M}$28fpG{Y%&#|VJrqQ3xv5y9&g$W< zKh^Z})SY*|)Wn-@kzwVYeSO4(8wz`yf8NQaK72^*lh=tp@;A&TNj^SgpDnP}Cz)DDM%1Ns!(Q@QTwTJcE0>Y*#$hbRb^_A<0 z#vw}8eS3Y?jKRR0tA;7v0~hi`;q7$&+F{Lf`2rTGWE61UZ}5Q25L{zBn*O9n5ft8j z5}*oi_9E2-13!F95;~3SRK4jfIRXZe%%&ei{~7^ZpZG@kXT)M2gpWEGB_M5%*13VF zB*(Z>BQlZ^Zr;am?|WYbgTH%6SF0E5q>PbV_25dE&t1O{b>o86acPreZI7tc9H}y+ ziO-8NQ=N~3j+`?Sj5Vo_J#m|8`6V;SL|!qUZ2lz!+a)auMG5e~Z^~p}(fBnZq!-lx z@TW|1Dg(ieoN9I{f)xc1ohH?1NKw{7XVa(eoP?Fq6oAhy)P%o5MDv^0Ky1uLDqAVd?YxhMiraa;K8x7M~8hL5b}$47j^mI1^Mr zY*8V~WlKCm^&dkpcOET5RB4TVwwmAg$K57-VRsY=R1+&QFhINp&pglz`IkDN1t|nW z_Ifk%=s#p4VpKu6`o*-o&=h$_R`@@7+@@Y16m5LW0CCzwdb9njF14w|$D6?qN%4sD9g-TxQ~y(T!W=P(U=?>4HvV zIGcz7m`ucjAcA*44*Z8qHw6(#Yl+unD*9>5x2p)&5UP&m^&}B zMp77s0b=+`)b>z-jc%Nj>NhpD+rDl$NxdyrVjE~wT0$ofd8}k=h87i2$IaI{8C-f| z!q~7LU~D$%2xU{Qr)q2YK0K_x@W-%NdCv|hLZos?S@us z@}|ExM!ioh#mx&X@b4XjAqTDiLL=mD4R)P4GIh_;c10|Ix_zGo zRrCDOpAZ7@!@C9Es*#XA^tJ#|NQWLO3JsMpxVa1OTv4qEc9w>lH8f6W^%j{zxaobi zhIEFH6u=W}h^)2v^E>)|leLdYJ?%cv1+W2^GbxljdExFK{?)Q)^%`X-h6_WCy`LZh zRcXzS-ou)=vARnc0YtfNfAB<&;9$)!rzP=w4Gu|*s*zAC?EsPXWy`sggbvZf?;Ars zu7EIp&G*pfT>zPjtJ#)?W4D@mhJX0A7{@W@&E27|<2@Fno;kY5n84;ybcQ!DVh96j zWq7dgPBj2@pY_J35ZF}Abi6;Awc;pD6ju7!T)W7pz<{C*N<#wR^H=KOY2e-9yTGAL z@Ig0a$=4Y>Z9 zbkFCFx)^E&jwrHsQrk0-N=bbd-MpC7t76wF_b)Zkx^4Rbz-X@R)DAhb*hr^M(Ev@M zQwGrNpSJnKDn`22P{Ti;CEPw=Yda!XR}G~j9QPmHH`fYG16ru8q*SSnh6k>jRWBLD z`Dz5=Jii;EGc_KE7Gp}DC11q6Hz~knE3tP0Z15TTk!+>AmP=WBHovdZ3@OM!sZ0}- zStzF+jcq_h(79uB+zl!0ZpW`>iWeXxa?&Sz?I=FFkk`FYCr=E-MXp-+taR_uikES_ z`VMT@pCbx!zSW#}&w$pZ4xIzM>b;+z^K`iF#rO`!Zzd(<2!uRO>pyODzHio}eFm+hCj@O-v1kFG5YcUyeMy4q%~wb2 zHpUs>q-UO8id)&r+q_~c6S@7}L2>Uxbe>5XBbKK1oN@4Vmu@gzlDUcO@7bMhb`xf? zCd-p@h>3DrAz}s{CRY93_>MJ7^0bca z+1`kQrk?d0L-sfW=^Q6t;rK}K`oZTVru?& zlJrgC@k)k_sxEJH%SW5>Q(djNJ1dD-S22#oDn>e0;Sd&5H?%!r|Cp5G6K&gnAhrx47f?^0E&d@zCtGxUF+#fBTz_G-!Vbf*DKbK9BCp-EB)b)H zb~7Db`15XyT9aIiwN!0AZ5?jq{_aRgqRiR+C8HHUJ0p`azfu=U7`(WtCwi17<1K#L zdvX4vk&-4-c6-FDdQ@QX_PI$vT->CkZd>%b=}~4%IJ%;4v8Je5+HCZ6{J#E#Hr;?> z`NkW0sO_O$4TO(=^rMQK_Ds^X68!dCExh*gc!6T0Y6A=K68n6=%qo+nA_!hn5>WEk?(Xo$NT ztO&1y?{3iEO~u*gNx#xTmQhc0U?Uulz1`2BQ%BH+>|Y&0mhcj6Z)w}JgZGiidHnbT zI0sG^@lE26<(Hge-Ox`)60#Jn_iD=-KeupE=&45N^Ylh|cvqSyne@$$qsN8E%oCTA zbi{SqLCh2U)5qbXpZQXJg&U$Q@zn0ngp4H(&y(1nl`i|qi6wceM2k@4q)2O43T*l2 z2~S=QRfIRwjhB*Nb%I0Ysqo-RbZCm_b%G%)S@Wj$G=!L=r4hI;hyC`v>O_alaXp_A zjC#BVA zbm-aMYfPW7^IamxhXkdS`NqFeK*>0I7`#f~+sGQ{@;LPLuk2*c!SpJ-6YPe#S$D)U zw=51_LYE)fe-SjMV3QiXJqK}Sc^>;M5{BT!X&&qN%zLUl_3|z40#S;QI9c+~_RoAK zM}b@~N?4~vULXfNzJ(F7B~yWolfyAwp~ri7^y9;%WBju*w3RM+wMjyIL6%A?3A07(z*PV`FwDy{J42A* za#nz(RC{%@*&MvT=K)^bE$z1~P!j9iq8qHU93~HCC4^;PCwre`qVkou7M`w(h~O?S6ibFb!W%ks+2s!U9dmgoW_ zLh#WRFZ|XmPn5i0nPI{yB^)1=c%=ADSZ>hym=%`Aq_8p#LUQG@m#1w>jY7(f+g_fZ zON>|Wk>SUd-9YnJ3M#ACR}Dpv@)*9s!NWhTxrOY9v+9)T~~V9SF{RrKQOK$ zsCYWnxPA9k{yIz$|7u^y)pt!q4+wFPjc58ppJCE+p1^~!J0O%Ue7pmW{4>!G4|@5* zLuc~>k}{TPjUlZ1Bf_(W;YvXroSLnCTW2VgRkpsaJzuwSRSutfu^{wvwR_l#@1)<; zBr#tSE;C4r8Q^Xawr>TFME#)Vw})yLEERsk6$xH#5Cd%nVYoDjJA@)|hFEd58fjAK)R65Jk#TIIK1i8dVBm#O ztTb{cUUjSntSi_v-XI%x%g&%QHoW0x0U~+q7ANRZh%!0oyXQKO^oYf>Z?8*{t_2B; z$6tmuA}EbT&Dz^j%8=4k=U?&bw|Z_YXtFRU2|RlHs&!>avZwS4pl~9rxH+rd>EgB5 zP1{ncAVO90+tA~=h|51b7MB}oggdM^m-^2a54qRmrZ$xMd+KHt-|mh0*jZKkwmDAx z_73QC>r`_*GOIyko_<~8LiUB4&XK0ZvBcosjBd9(N0sip_~B=hS8!Arc+uVb)u|wR zG(SW-wHK$x@5+CspuC0>2!tND7Y061CSPNLJ*y(1uJaN^wJA%E=OAe@v<2S4mJ${} zZ`A&v*9Mxv<)d4Rif6Qm=QxPAThnd2Dr8v8xd!fK3D2ypYDzhJDUY3HQP6@bzc=)w zt-d-tVHF&lU9^7}_QE#gT_EGZ?j3oGl03VFvIuP!1Ya6RO|#CqM;uuY}09+&x0G1_(g$XT7z^B zM@pL6R!Gj&X69t5kbOj@K9Nn%DXH@_g}S>_u7=u#NTW90NxA6;rXTBsGaN%!>oQKw zZ~cRhbhs1QJ+4R|p6|Hn)eD!tHmpzX#CMl0NrkpaX)`3|3HF^oDXDqa?h*}PPVkmf z0%stp(J*ATr^UDG`tvs_?YbAVcg2l)-9;jLnw8?W|BM^(QkUJ*_w-BIg7QO8+Zd)7 zJ7j=lI@bR|g{)fJ-=fm@^JfY;lSpvB1*#)ISc{5auHLO*B2>`}H_()teu67P2#_*; zqF?JF(yv&AFhSt_=yQaKq<8ya??C(Pz_vL{PYr^h-~n=~P*EH;2+ojpI1WrkbQ=9) z&sDV=yjLpmdOW8KeSasU|Kf7$!Z#R|f<-V*+MIpIKsy9%#tm<^f&BP!4u-bbq8@kE zVNI1VZ|~^d%E#uBigApG<%%hzicehBqugAEIi)Z>evzd*5>kpcV?SBj9^ZChBs}V| z8E-I9k=$`)FxKb^f+?ZRAHC}^s(g3U_U=$(L}cXTNY0dltzUR_y07~R@Z9aOb2bl| zs!D{=O2Q+_fLmafjI_f`G6DBD)CfenvKqxNsd7% zf#|E#A8jhNdHu8*e|r{oX{xtf7x^eE-uw#Mp8A(e|2P8H-qD_YKU8SO@6wh!2G)^w z05OJSatP((YN=-#N0DxKWIuF)JByx6L@UnGZi;PYLws=Z#c{9^MwI8e!cd4W8_Di6<&n?i*^OU0|Cq{;w-!$)2;b$f|8jy9xS)VZzci! z1{0LdFhS{p$Xm->gP8rF2ufLu@P8&K+s|&dKry%2{$fHvGSWvHw(V(a(Bu}z9RBwG zZMTg_@$BFh(zGjZ7+{UjmYgZVb>zzGmj&@Nr}ofS84u^sOuXXTXwcUkB!v?M2KH!2 z?felyHeRNj)+oQLYx|FfVK8{kWshqERCNU@phD(w6e>%a7LRu&yrBKmqX<(FS_pPI z_yVG71$2rH-qtF8E8j|TT2NpYB8QdOvejR0?av+NF_WoTR0?f1((b+x!Fm^)rb&c^ z@92FNuWM)nxQZfM3k|JDClKb9;<;o)>#`YAd=Lysikbz_yXVt23QZ}kIqnv!WjqK;03%QvRmWbPXsbTFdgDsJR$bIV{0Z3 zpY2J10nmglJcA8~fDs`eR74KT1FC8;OL?p)@Ub0;JTslN1(eqW5P`XkXaIN@vhY^0 zGjD-*49n0hfH2G@+7KYT?@|ZQzz2V`lu4g|{fnh^?tf@4QmcE49_;|w!Y9W&_`_Bg z@tQnyRie;g#{-LjaNjw}d8C34j)fen8#&S9b341LL75`zOOl0FF_NFF`qZa;^uW~SY!QCW$U9%+K+(#Xix@9O{D3d ztMCaj$axY0MU%e(N}`cMb%weQkOVpM99?;9P;7JQvoZr#t@o|QT{S&dXufB6Zxp{U zVBc#_w!qA@u~u3U+ww#o>TMw}t!W@2fNMjh0@>;YKqSbu1$F>hW*<I7E(&^A2ni5E* zv@0jEHv3-f!qkN#LDbxN8fpj}{B?f|UmCZLnJ;$&PeEu9*kq7d%}FbFy5y&Q>0PP8 z`k~LoONNfR8t24VuD5@T?N?18O35)OJd03d(P^lWg;E#Rs&&2v&lW36pJ~)CL+N4FJ zbL9XE_M7984Y?jI(Sp*|V6v@#Q?$te(Fa#ZcG)jM(=bRfPi%8v zCe0#Yz0`|z7iyU-dsTN@!AbmV$0u?w3#HpGt=(z0cw3Zy_4FmDsW%>rO`{L51~>Fh zeF$G{o|e28+U4~0bHU=BIhSkjZ~N1Qrp3GS>DMA(IsNth|21xMxtA$*Bd^Q(<(do2 zeSX_+6pZw}G;_m>)mRIU%+u(^)8xU2*sDp!-vZKYP%|hAcOl+gz$U`mU}qUnG4f7z zu%iY}dOB7wn@)=Pd0*|fpwnQ5bUbmAuAKVeW90{F9M-f|_A9l!^7jnUbTf_6gIgDE zE)VP~h)sawllj2o>na$aE3M-8;3yrcLA+x+=>ug|G_@V7Sua0mLh@Cc zZ%j-~0z?gDQ@3M7dL6(xVSV@EU96%zUos|OcFc!IzxpWfsc-o~ti4~?_F~CoLS*dI z*(jKhtg_qwI0H+`$b6ur0JH#>ZF&17pw0EEGV?tHFaBMq#aL_`qt0ZM0PGMk9=GX2;3zk56xI; z1qc={9-qP_3i@yS@Ih`F`fuF5`9D;D;P-uIpJ8z9OR5nv)(@`I8B9*0*N?B5Koj%v~{eJK3y6?yL=lj0@hVz&?=ly!Wp08)Y zXQe0MykiYM>6kM3GGX_PPs}==v8yG%|Cor-?cVx(OnyNxe{EH=_rMp%OsGiE2M0%- zsPgRh#+&{}V}w>c`fKdrEWgbB??|_z&DTYrr#6T% zg;(#sUA|2F^sH5+_a!ulbv9aaoPbVBTrMU8XRN$D+QJ=$qYa#Ha5FtN zZ_@V0MC*2X`WA-;FMCgp&J0>oJs8)^@Tkx`9 zj`T4MIM){|pdX-5_P5K19WaUO{os`w6IbAg@$QS`>Eub42CKn{dza%865+|l@puWI zu4)&30C)GY@zZJ-O9qBH2`V|`CBWOaHasBIRB18+lM*s*Wu~@_yJQk~O&GR=_Jhb9 zZCWB$CD_*_3Hs`GiB76*iQ%1(nO*h@ru(4P;0E&+f*-sR38*)H5M&tzcpGyb<#b;rFn&Do z6Nz$>ni5Yj;{D(?N`|r6S*Kroz%7|j+^H!P0w9^O-oTScL&C8f-%N;w0r{bmXh|Ud@EqGS~eUgxu;WQMR9hk}x2{^8a%@ zmtD-+&`)W75Yb{2YrCEcv4tnwC`!VyQ^zB+RxWHa^VsCP0oRyBYF6{P{i!}NEZKtV zCgB_(yeio>4(xgEizB&Gu@^>gH`rMe@hVJ2jKljWQT4Vw1LwrGDbcmIxT!0J7gOR_ zG~HiZMLdh5C~ZOytzhe25meR*=)W*`9#`f<5f?^g&pTk`5FByW?fL>RSJO0NOHTB` z^N4OlzjU~ek0+xdYHM#mEZ{BVF3cUo&8yvk z^J0i%7hXEwsoU|WBg1sGE~u>~I0exs+5j)X z@o_e7#QMK*+y95=ZNx0%ZgPW+dgCCzt{9if!iGZU-?&CsWwa*?6Uv4n!T%Wb?_9q} z73LjPZZ_Q0EXIpB+5;GBH=oD@*Vdci`rLvHe9n8v(|eTu4o)#ISp8~-nsZP)FOq?$ zoB$mjau1R@vx~8=#VCmSgcjB!f5P=yNJ}Q_Zw$z24SI-yC~RBM6N&-#p%{?b){f zh@YnNG~Xhsf3L!9Fi^@d04RaL8A zQ?`#;ZW%A9Mb&F+Zwo_n?x4*;$Z+dJ?|{11hmVwctJZ#XtUnC?W>!_;nGGy^jcC>E z>?!@(>*>O5T-JUppG%uFX2#?`7MM)z7+@aU@(7>mL`Zb*>w9!WtE(ukQ##>+%5$9+g^+qpd!IQqY|m6a#H-rUGhJLV zxq*h_2fZ*#PMCPly`8!`wq_ALv^Q-lVe3I3`waYOR*blD@lgdxo#>mtQ$O|3!>)T-8>D=ClS$voyF=uM6ki;N@3B-D_`ox#ZUICOU?Y+hjl6^ot6~?HU z(iw{qtpj>`mS{F@A~*$1nEEQ%Z<8@x_O%bQvJU#Q{_^ zdBxx#<`SRyap#o`VQ6TGB^5VuQ5V!E44j!1&0y8i6ekLrI079et{3FTnvcL$CLc$8 z(Fv@Sxs=4jh>M+(z2Z}@ij&@R6X(q{iwhFHc7x=rYh0qAXL`h}&%XLLlwGwq`A|p3 zwMRXI^Z16}eT}mNmt(wqX=C>jrx8<+7IeVj>6)Iz>4FkWv*PV2m!9Fzvv7SLiQ>Fb zMIqc~^fdXcW0Z zc~aDzGIxRNGt4vIvjhcY;=pppsArZPxfP_#%o!nlwluzLZ#hVU@I4pn|rb zRQPA7>oYr@9Pe6q@#s@uIv;&}w)Mk!lovFQHnAcw_Y-%*c*#deXubB1=c)I)OH2G; zJuGLRzep!aAIoAzy^bSR;UvKBcqO6erR8Mqm5U=-bO@E$JN7wmg=gg2$g5|eTPuM4 zYQdy^^ZbpvB(D}a>~-~O<8#?|=i%E8Z=>jUnjKfv7x2&l4X0qTmyYQ8HvWeSYnW60el`Xg7#aBf|v=tznfYsK9(hdtGtD zbe9n`_KN3`dFcNc_*MV6f#3fF^m)PH<`c-E5xZW%bXVYP`1s!4q3ibV!p|0JH_HC* z`$K_Wvx|`h%!5ydAE+6Ln1IiY#(V*jVTcptxEyLO2!kK-P&JW*q7oQ#m;CGqtyK|= zb~8Cno)v(@c`l#n6%mKk7T6F0*1^5Xnf+`l|j?O6#NF}tMwnW z|M)n0kJDqtVw7978aGXE3DbJ^o#B8TiH3Xs=8$1vL%19)!cP}ORid?N;h~iw}2YiaLQYTH$aK()1eUI>q4T5c? znjF|Cnx3oxj~qQ~m7=RcS0~|?#`J#>NlX)jG%xKq{0u-!fa@=JlT5~edHt@DBjkU0 z@0KT{;R1)qk%C^t580Q`8%seTX!lt10q+yJBoX3wZhiz8$wa>`8xYEGkTQ(a_x&?= zfrv8~L|le>sE|2fy9VR~09}P805dFQ!C)sf=sIwKY$v~82zfQ9Jkw2%jNNAn(V*2+ zW29?n_FsME<*yP#vI!YjIMQ2~ri_)M8UND@rjp<%g}f8?0}4)gq&DRUg25s|nO2F> z0h(cn77Uob1_aTn{^de@Vy+eZ zE!FMscF=e48rWm@uR;>BD$_^OK!R^cmww06ub^QqH|!h{ zixgInFoYkZd+k3D!J$CqK?)}V$f9k(kaeyXBMHNlJ3n%m@-Zx-p|r&HF0)7N*MU`z z%kH6fLWTcRA^Ba!4=q~{#-rwByEHijvBvsCNE$4X?ZH-kY6D;yhW{u$3O^6fs;`~8 z#QAr>?I3d_SzSI~`Z{nnKLe4>mQrQH-rFedEML5+OMYtihDhH7YnyWcw9w2G*U=6j z@E8+{7m!Af>7Vrd80Pe{ww@qo&epMe&!zbZ%4Q~8#m5a#&U7D7B>h|m0K_RnSSb9e z&0DDRX?UqQ$%o$XXJ;x$30#FW_m9uj#aic*GN1Xda!@O$SU)&NqV<(j0Iav7L`sQ( zKJ;=2@+DyypqQiqqlq%4V6Zk3eUf2`|GESUX~N{AcUHfI0Vtziy*CoN9}BgwE3a_^ zyYGy_9bQ9`O-`n@z!u2X^tg;#LBiM~^YKwEX$-0El7<7%}_=fSVu%Xp8AzH1*@% z60snZ0|4^+;o2;!Yz`uaE0t^rFU|OtH-9dsg$xXtw8fd<5s%@zkn%> zkqAZ=W)L(=r~#8ma1?I>;T?!5G1EsKh=0Tt!EM}QEUJ8jj@gYOY=MXu@M0R8t9&0$ z!yXW!W7D4{2(%1Z-5WdfvOOv-TSC+rc=uJI!5(`Zd*Gmcy2Q~_8wND|gOm>O13lsR zm`1+Y0}e`^Pue5Gc#~ZsS2?`6;v>S6?K)7>`%>ck1r)CS>zn+l{jmM#eMVxvhqKwt zG<*7IOWSb$b>G36*E>I3ng2f+N_*h872}ouq?6MzXtDoGeRSsi-9#f3eKfB%lhYBp z1I%Y)BimFn2lKjauODFJxm^sT{b1Z>_a#M(s>2ZFw7B3qq8-~(Re$j>ej zTn4NpJ>Llz7!WOFO5lhpR|cd-!VilVIGA7nenAt2?!JqMuXUHe&1tBrI!;$_kp)yI z9b3Kv!wK~ji`6AvKXSh_?C`9l#W9SE7Znq0y$_qa_c z?F{TvME>Gk_HkJSRa#P-x_Cu4CA8?wzL|*V;?eZ4&Ae#+o0Dn}Ib7PfO)Gd|_M06I z!wrU=kx3T1CY|q%G0sOS&V2hs+Sw<=^dGBe=n45mTbkCFRWu;+RNt6O7~W?HCJk(4 zpX+?`&W!u50s2@`?ASBP|@n_iYbZ1)=?Te`kxp_*nl~-a~x# z4!2AblBNW*f66o-_nz0?R%p^^_Wo0OwO0a1c}>f**g(-ebZrE)ANBK94Bf zcW*Y0*nRluc8sO$;c@>E8Ln}dVePf)ucveZit39Y-ymZb^0Ao~N@3h^NLE zh=N#Uk+Z}|?gc+baU0q%Y>))#E){EGL5+OhlM-v~@gvfr5ZZU=%ZXsGpDd*yh^~iy zmC@?47TVNnhknpR=keMn9K^SI?5xAT|40^P1^%?4PYS$~QyR>Cb0u2PCes?)9H#~?j%N_BAofo=62~#%rmb~9A5^?tI!-eJ zvSxqK6mfRpvJmtFPc(LnX-ki*anPtqJ0i><1$cQxS@_b>S+NeoEr>$p+|_VTKNrVa zn6Q@`UZTaxjgb~E)a1n;Uwp6Q@cF#v3Yu$w?mItth-R4PWZtXjtn_|C1t4JcxPP&R zU5j%zQxkM-alEz_B|G7hs#yRZ;jYt6vF+w`Vo!RiG=(xn`JLu{m&ZM9=L7B^@f4j; z?S~ey4(7G`hw~DW-f4m#wsTZEv#M9@UDZ?DP(|PTiy&e!*1wSM59iCaBMSP>iUOO= zr0=pIbm0{!6MQf$U!^2NOzRraC#z%JR8rV3TlOYT`9U1n}2b;#C_84 z;7eOmexOLGW% zMaC9GQ`SoD4rR_o*l3F%l|`mnWuCDXwwm@jCh5eTG|?s7%lTJLxco>`KeY zit<>CpKaBu8UE}K2?&=fRp^A8llksq`~g5!>vZ+t zxChk7-nOcM0hMJCQ3vJ?je7(z5a+jDh~vmoEr+$%jCMKjHw8KCR*&ecz4M{=*DViQ zB)1GHGf)gLaSI!ZtZUC~Pyie1bF0;B>xn)UqZw4Fx>l)mY zO4|+v?aZl?|7t#E7zj%`I&vM?QOxz^l}Dz)p3Bb*}hVhiuJ56_ANQ69sM>YzqU)7x2(LD_8L5p0&i^C1P0URnJ z{B39ue&*?t*4eF&+R+Cun#D0(9x1TB$XO%S_x#d^ob;{yWc=`uf&}V;e+FVCoF7_G zbK)%9O)bR^?3wepzLm=4VC)$lftRET;mTF>M|V$_B*xM=*t5tF;sLJ0FT5}{pYbo{ z_5zU9`B_lnLv_|s2NtHF=e*dku{roYHkoA`2B_lN2X(=CYi1!O-HD8N+>Rd#2P(p8hj8Rq=^O zfmXmRQj&IZ`sEN`Zt+m*rQ$o+rZzioH~oHIr#n;lXw*_6tWamVUH5rm^z^to7*LE- zH}BgSgh!joNuQYNG@n5@Avnz=VIZbUY%W<5Y*`O_!k%dEshNuz<}(K}Ut5_w%@0iv zC;JBt+Zu+yO$0w__I0a+mf-WRkLCu&Ua#qb?M#<##Wx<)lik96zoFl%_`F^scX#G2 z_lQTv()>gFYQF2P?|ZLvgz(eb5vk+_u|Kaevlrmc`J|#NeT4a?Hfs)qxRjgDi+C}= zw?VO==gZC8Yw|Z$k1i_9AQ~0I;hpnoIg66lD}>EMuV;-JG`!&?_FSuKl413naO_tI z#i~+XZQWW(7Jtvl>tRHD6W{5(TK}Gli~Gp+y*fMZE?!@-eTO?8@^akp!%qH({YOD& z-c6=3azk+aRN6aJ;hbc%sO#5bm|R=gmt&xD)HOv?o$JAy_)Oe+D{TA z+~IVXFKco8^_r0+2eefXUi>!moWv~E&5~7u+P_M9%hOVf@;r}gna6Le^Zc5}7g90i zAk0;HjQ_O2`QKyj=C438;lqc31kjMiM;e#;hl(7D6By+-?@KiQzxfpE|NEHme`9ai zvAbF1{dXN+3nWSTufJ(=7}%1?uksK+lCtOKe{93~8ga7fC{4hru-ayU6N^u5Z1&*| zS?^~Je3Bn`Yfw|9J8!2eVa4g)Z<&U`C|o2vbBuZWMF18Fl=62%8c@9T9%lE!M$`Y* z3yk{9-fBSXZ75qAq^=@qvH$qBC}UX{3%l&xVFZAVU79fgM8-~}mw#ywEsp3bbU;9# zwy-}wP#(Y`sewb&#QeAb*a7PDmP!2Af4AYx)U*A*diSLka2y!FF|YPITHq-Ad)cbJ z@TerF@DhnRL6U>bcR0wBL7L2sR)C0jkO6QNqUO!_Ol04}0=SNw|8B$0AER#bl7!&D zElvT2=7-4Yu!R2-g5E7SivE3wOPWSDNHkd6HR!wyPpsxAz~-aD;H8YKwm>pc`M59K zToOPLKV%k?WP$li(iZ}isc{1bqdA!V5uu@hp>OjLd#gF8SI>(Cq+#M2=_G$(zE1$b zMd;H@At+mMb8x@o4npvF1&nK%rj-YLN7& zRuK>uTTVlP2p}xZb+xAY&tL4e6QXX#YuTFQykLg|36h<>|7t;1-TqoZ5y0{CF1)NV zFh8mPp;{G|2>WCqbxdqc0|f+0HJ6v_HGoV7h1g~!kV(@@4S9tV*e7&>OU5cw{$I|v z9MXVp8J#OQV=@eJwr@$9|H;{o3H(pa_D4&)gTB9Vvqv1n*#a5b2jgBR3j@?4Q}$&T zsY;6dJqZriSrlYA2Su6zvf1){dWHbW=&{b`r+cJdd{Xjxux=feBFvt2`ML;!HK+Gf z2r__Lt!b#}Tga#T=)WWpmkb+Z`6Ej1X8nnH`InVj!C2@401k#=yskJ0>&{!*c$LjVS zJ1;nvh=beTsh>3a6AlLsJ?TLLNtL|`Py_B>d9V%rlMr{YT7c9_+ZQGFZs?D~t4}<_ zPP5i~j@=5n-r1ja?7*ToCh~JO;aQyZhGw`%j6MWrQIT!LSD)o##GoXgmp^jj%?6hwMP=GZg^Ux2SlARg|is51`vH;j;KL5!nNZR=nJ|qh6M-Uv$v{ z3>#%N0G$3i&zdk62+Xizw2XR+_8xx=`g;^1Zr)5p5D9e8JXX-368#$^#)QSybJw$- z`j%0}{0`~UlD&QXr{pgGhtJb__C=%{9$;TyHVR!X!vZe)QUN3J<}snLwaGKnUR149 zChzu}VM%a&s^TXAaHVS=6K-cb5?4s`e~|L@wOSLWCVn3FPwr_c^%Jc~kY<$$!hqs_ zJREvRgD0JZ+n4%pwI5P1ZnFcPdk@%Dcx7B`zN|aOWM>@RCXj|M!V|HADYwS}3FMV& z6`X}yOZkf9_I7>qhiQRd+jX_vn7~b;u3%~`aR!OYX@)0{OT`nzN5|=Ax zxbG#AylZHYd{*NvUz@0jZlUR`oZ5{$F6MQ%69cbW+JDqj6YK1kOefl>e>C_F*Ewzu zOg!HC(MaREL&2C$c8UFD#F*c?C_Fg%OzUS8J@L+E8MCPY+n;x{hwoffADns~@bmw5 z8ql4d=rH#6LQJ^Oxne++-l={-VS$y3-y2R0#ls~y zoIhQX`ZfOycZv|H?P4G%y{6D#-igAvgbK&(^y(&*#A=&JAS@Y1Nh)UhZyzp&2LKpe z^JB@{=Lp=NtyQnAoJ}N5GDQ(VQtEBwP*WGtyU7uTD0owH*wIn8h)mnloIPemAqkk#8Q}^yE}!^}H4t2bxja=`*=Ozo*S%#>6lfxWjk@kl;e8Y? zx0^FsDca2IUA^+?K>LfL53$AJge8kjOO_Ef+#(a11p0N2SN=I87Djio%y}jv*mtPm zOFQvIKCm}@`;7D{`ij$_&za^vAUo}MnabhL{m%n3LK80-W?w7}s`C>}nuGyy^k)tG_RvscZ*lp^4J#EzoH$wH}Ys2=P zd;Cq{4^~iy)z<&WA`we1``{F`fg>*zAFpu2lZ+QiHwdWQFF}OmYG!kq(v$tJ;d2*k z&+RWK{itR4y?3(Z(={lLZ}_FMm*rw`Plf3)OI9`KKCX$t% z5U+OTTJ>zzwUpU@p`R9!uTRx;xU8e@{ZaeyPtk5N!6{;Fb&+e*+K}5jE}&6F5;5E| zQFaVW7=!QM0|jRv-5(Mq4`1AIW2Z=zGr7kaU}BwL?Ac#!O5^#;3!L>zjZr_T0WYR6 zaZNIx?FV~jj-&MX^y~s))8@7z%>8=~Q%o0SKuGkt8AdVF|kR!H7^ zDAWpQinfdILe*DB(4f2w4A1C^WD{`utS~5L+5+Jv89WFEF0&2yWFAPcw%cXJB2=(3CVIOJ zZkhq748b;i3t3A9U1-osh}}0Z9^T0#snt)5?ZPig;HxA&MwT3QhiXfSprc#M-i8HaVg6hh!=%a1Pp1ng_fz z=n9@Z*1mK{Po7bsB(0y40R;EY8 z6K#P+t|dV_-B&;p#MRj9jneC~G7wHFU76{;{wY=Wy~T4f96d26#wnHhsg|x{LOH3< z$K81eF~!IIm0fMkRMXr9>1Sj?3r1SSeWEtiJ=`^DMkE>T#95V{{j4{A`&N?1N-C`r zj?+o=S(qU0rIVdPugY7t$y}Aqg35CF zmcco$1ywcl9$Bz-zUX92DlaQ_$R_2oOfihXBSFi``eEYjY879KQ)Q*+9!Yhf6@^LX zi&8UvD*UxsNiSqU>SXwyRly<#;^6d&cs_hzZ=pE>r@m^1uC+=oN0qb|;N1{;MQbsP#S>s{BbkFf5m%;n*T>4#+QZd`SX=5Z?On&H2!Ef|wQQ|tQFeJXUGFVU zfti>$?nP%@(K9F}?f4w8&4FM+RZ^8g)Af^aR?R~2<06F!iJ}eHTt{9^FdJ(ff0si- zIaAc8@Y=Su-hq^}n^r~>-cfQOM8Z4gTC3s;bKSC3m8+nzRJXm7e^pSw7#CR)e!8{_ z9?D_jR^!-oooZWK)enh8s~jaNV%x3xvZ}7^Nczs#rD=fyVAi&OfhM3G% zebd$Ne%I4h_6XTV(ySL32yO(3iyT-Wpm&+${&-q$w zYo9IO6iYeM{9uCvvNdRfm_`yeI<#5ajC+v65eEUl6a-ZJ6J$cQzc?2P1~PG7Hfy28 zqyKK^5l|^tk=pZD{sCKIAl!Qo{BPPvZxy71K6b5Qysb3t9K=Yg1feb9d=;kMwX&1v zmYj{`0?(gyp3gLn*X@6^Jqr-+3qsqFXb*XWogG}e7!^RqwNSV=>H7+Z{CC{JJ0D}~ z-8~Pt*Y9XSjiZu7rmCOm_~v3;}x;8{UaP~bnkUO1gD#&2E_n@Ivwv~sQ|=aiZ$$r#Q3deA%87vOI{2eu z7&Xhfz4~lED^?r`2A(SzUzx*?5Ec4D>_;4%f<<(PyiY!Nbbju&J5o7&6Rq89@Z^hK^nmu_2K>76bPW zUX8vQIe3a|6yD^2?nKnp3KZOCoEQ|oA<1{>h}Xx}@viIM~P6lc2lpwKPhLhJveFRq2H3ov#wxW zL?`D@te+#>DXu?%j&}|je`nyg3*v<0>wCl3rtou)61djd*M%?Z>pfn-%7#fRzL|K+ z_nG#_$#){7_D$?CUp81e<(x0bdJX3uRcJy?a^2K>JJ0zVyjwfJM;%1{ndQGeR$%8{ zIr3)v(Za9bHy{1?@&cU}>6BEK8^XKO=)1 z+}*gB`F}S_{kr8JnUvQXwJhN2t2+Po@inm)(1X4g<ri~ zr#S(!?Y35|#y1V3xyh*3>xVwGunJUoxbo+3*Qe!2xTC0W)nZI8h+ih~K|1YJ)+LMe zT$rASvcuOe>o^w{@*f7k3)yxc0X73O1vc}a7Sa30vrFQGoYXn5c>I*8|7UUV?thyI z{_mu)n$V{<&T^xW0l3GnXz+qc#(_%%`6upG4(DkcZ{e7)rxXI|UIzu1h~q}a23UMI zomg&gC9EevHnv2$h0fDn1pucc*tsV0thz*Og7|X$K&6>wj_W4vNY@<1;f1gX_|F`zDxPB@KjJA|3~2e3jf;U$e7@sJB)Y8k~Shs6g@7H#{Wm< za;d&7-{1T#MwH}oLC44l_{Q6P405)@m}#CU5SJPuN(yW1M&r$j{_0dZYaTG9D!7+;K2V;#gNhJ(=pw7xnY7^griAnbjX zp?{KON5{doEWrKCxN`{r@~}ARs2uW^kK8V$?Ly{AX*Jn1r&0kA`kYGd?-KvC3c_o*jZio4{_k! z@JW9U8r~{HINVe-D@IZQ1KGV&zRUQjODtK86wS=gpELb{Y}2I;-=OdlB91FapHLb7 zymvGv>=14AS$mfHm!KOt$HcA!1w0#?`lV&{aUFkZk7hr@zt<+qW2L}&!}}P9gWUT! z7k{ykq9JkmFT$WnKITUUDlg#uZI=y{n+d^{A0|UM=E_BZpGLxfCzO6Q1e&Nc9F(}L zXy}YQ$%L7xq-^|N6vB~cV-`{p_RVNg2#m?U?+_0fPowT!>R01t()Oa(qcjrw-zveB zNS@Dca^UwO*a&j7j>+;~FEI>ok)<2;$pD67U=2DvvBoj7!EG!8=FL*6v;GiaiDKR@Kn$T=aj^wtY4G%T^4^*3i5@ zL;?^cA0v?Vp|Dr^m>&!xZnwH*LbIP?KlR5vl8{OFaV^-@E}P{70Mz~ z#SktK0nG<`k&_R0ea*V@3A1PZ0R7-zax$l39;xzcxHO6evoq~e>W~5t9WUSWT*_om z{Mr7{>dyorfr9bO%lC^wDZV4$g!iQ%pmXLM2cIDH0o^pi3-IrSns@f;p#|80T_-XU ze#RIOc~|Xvr<^b{zi{wYXmZpT;^-1R=4jzfdJISTz8BeOPFY(p?87B70+*|aq88Z2 zYa;P_enED1q3*W$B45&cgvMyhi`?mrN{!)~Q@#T)3wJiENL;n#Xw$J$u^-hY=Cu}C z17nq1KWfN{wdbl#$7^kW)LQ?4%@)DziN1Az56>lvFyjZd(J%H4RS378?hyu1tPUP(ZWs-?*pQlF8j3w)z1NgxcWqQgfu)`;#Zk*C;diKmYLeHKQPjTz{McGRk zmAQQ+<;wDmjxBQL@+q({&o8rwr2*sID$}zjmx19U+cSG_k=|+Q{kV}$3_VQ! zRu^It${F(KJ1gM~Or1Z#WrH3n!8bg1!BY}hO2121NOU!o`C+xe(BHrIP2TYwQ?yWR z^-VJY)v?RPtH$!K4c}?i@1yOz+hA7WONp_6(O$Lw@;JJ=Der>j;@Fcvvel>OaTjLZ z--u##CZ^TDd{R=v@p$S-d5y#8UgiPB@)p-_d8o(rHv)aqBowvy5yCm|SK{qO1CiPK ztiwN#p>zGzk1n*v@e$jOKDm1ww^s7yLYNk!x$VW9T;-Usr+Y$tnQ9^PzMqJ{1fvRm zXFxGv;_mJ>yz9C=p9>v{zxeZp1zW@?Wge5{^-*yD4W`jS$~tkli$_Re`CjkBMD+RZ zM?OpfPi2?)PF?sMjw&Sa?Jo1ewLhJ0bZ4T~gchQQ{?zm86SO@4oR5Xii#Be>XsP`n z*QfDt?M+k~YupV*8!q|mze#WBj4`yyO>)9V?^vpd6P!EN7P)e$`prX*nQ=>x6#h^! z!W+d_IFC;F6f5A8t1T*H&+3imeYEFaYLhkE=I*W^GD80e_6rly=L`6anSOHACRYu{ zJG(O@XHD2{NqxUR+y%b8|7m=vFJ}mh(i!tPH+kkw8PYoQ)0;5b&YP#F`HYw!KeNxo z-f9hTsnh68y?=kN-Q41H--18vqo)AQ_dJkf&7}QV`voE0p@$7UGEP5+^}y48#Xn7b zjcu34U08pKHCGM~M(IJ(BN7vlyb$7>5q`1KnsWj>{9S%`>9+R|x1-V4B~|{G71(jW*BfTC8MJ4m%_ryT2N?+G4k=_>nQ(GcxR2mfu&OlhOvGr|!v@bw<5{6T^ zw(4Q>oE8ScT&&~RebKxm5BB#Mh#$Ik%jz3F7OMRTlDH!>Vh<$6 zIVCb&I`Yn@&iYd>UQ$4f2KcBq^mb2}k_hScS=7w=D4FcA(EGO($RQd69x}9eFO*&p z0TG7M6I?dBeTjBvO9axQO7vL`ZibI;iDWS1Yqms;u+|r<6C$=mHs`(WTgN&tTh$3+ zspZZtv%A^ZA;{Cb>y72(6n;=xCZzx$~~~c*-IpOT@v*~Bni<+wO^eI zBk`=VMUt+lM5&>!S(1{k9zW{|dckBt8^7zxBiy_!Pqppj=C*`&M5M{K$R;)wA%VKn zmIMP+G*Nm`vGX)80|Da{tI1HCyp}A1VmPNk!&nGxh95D(VOylVIQY0I5VM|Ur~!(J zq%jYNNmpl>_H$7+K_`m;P0hn2*yvii3gxA!0=2GUs)x;jZtf-ijWG7A;;GF$LN}w$GCfcnMr)SB?tl19j>&-@ZVhsDw zTTk9@J|EGJ$%n0H+_FxFPA=8ixmP4221EgKR*)M??>8BK>EOBhm03&;u#^qvx}y@C zjLw-&TrJQ%zkUw_q$Bie;wD!Lj+^A=ZbvxL3zEMk56k8qyXhU!M~5-FxWP?#DA2vynP8d8*}c_ zR<@)TWc@90s_^7x6)kHX9w+21xTd2_&j)0pWwbJ`Ecgq{f!3nsr=&~xwo9&za7!o$ z-4_KeuaqT^l$gYwRTqZuF6SZ^cx1?Fl#Eh&Ti5lQ*Wh9R%fA@%Mjqj?bT#Brpx-z% za2uU#sTWY;A`5oVVQKzFRyi3C+r3X^7l2#x^dOXo*0+)E60vqs?0rqI5H!1M`R6G zl%#doDXOkY3lz1jyP{H9D+d;mVK;K}5c)N?_o?6gEsZl__7uD1(8Y0r7*3j%g69-P9&a=h;&yu)rI^7j}h`+ClgLd>(+2H>w^BECPw#w*wF-)LxGgRhtp*Fif2_Ix? zVj*>|BK}#2D}eBGcK5l?+_!WO<>$R`zb6kFdS7Dx{$ZHjliI77KPEU0@JV&^K<7>C z*1t8rc&kQ;NiG!rtCSTaAS|JUKN9De4^I4iKs@AP_HK)Qcy`(b{tRgFmjfq6OQgoQ z`>8Zv5WP8x2_@j_==e`!4ezyT5&FeGt5n4!?MGJI&T4`IRC;9{IFwu0KhRdI?JQtY zNZb**@~d6yYMpcDLvFW{j+q7!Q+`G;zDBE~JFvbqw|uO&gDa&poBVK}=EDq*M~uMK z#9EgtO&l)qkGk1*Lcf%&%_6;M9FMVI%bpKL_s2iReU(R?s7y|&T-);)QBrz&xEJGj->j2cP`@RrIc|xYO>*h+PMubGSU7iL)2-*m-dDhq}cI^QSzxHCPTG;gO&| z654%ixmuzwSJ?Keb4va(Dkwjh_rbxSP8hS6qrGx?ri-A{E=VYq6VInV(^3s*AMS8gj%tGXgeo(9SF#GW+%F%I;%~0eb3_4LX8Qiw7I9II zu@CA(bkdxLl2WaoIfw&~WSHV-BP@X4O6|l|w8y$6f;{l-+E6P0$t=~r-a)%qvlBV( z59nb*;9<69Mx6Fx+I9(>omkR z^_(M7-vfI% zby?ioFZNIN^F9K

#VU95U-o?6eWJ2%kURBdrP1Fpl`N9r!bo(UgwixuK}XVgm}n zg9x@t$dq3+RCu+}c`2<6DsJih)Bjv&?%A8APP?+GW1qXClzXkVMEZfK6LX_qbh?|e z=-N4(rK<=U zxwCFm-cIePxHWw6?R3(fG+N?`XSdCJTs{xYE}iyRors>ZFb{AGD7b?2dlvP3(l@cP zsYCICb$j;k@eJbCG;?0rfxM!EsYDGGVRMy${W$+;d zufpo@4*i{gL!ryIT~UulNUFe2br+)jZ6FTFqDL;2vGrjtO~rQLtn(DC3z^HUBfA^*YW)m;0dj+je?DX0(3!}Z?*nO|UDEQ>7X}SvP z=SF~^ATH2g{_Kblv^9t-_cyEICs4;?KfN`Z$d7K+Snv}JbctJ_9}}y-zu?OgXu*2M zko9@^b^NKvqD?C_JismaG+3hYZf`_{zFkwzp((R(<5#aQ{)vK5KKM|3EJ}rq3c^43 z%fl(HEZjM^6n`D10^X#{0KY-Z&cm}SHjX{5sRF}7V=M%jUGVVFi4b}IMR#UTyugm< zn8E9_-|q^PLccvkY=rCaEl*s49n6N7`YdN&4bEo)G^GN3+!cXUJN|ZvSc1eOmFPE{ zpU%R@2>iGdHcH(C;A6masEZZcQTUCMVxa}OGhBS7FY-v1(i<(ls;PdA@2o0)d`$?f`Y{?}s} zPPo@&L)UB~&M}gaFKW?_fDHY{p}LS9yP~b`Mx&m43-4pE9e>jC;9x8)AW2A7Lvgem zuKnkt!PZz?!hch~lKeTk=l|lqI#sNrW>1vnkcbzqX}Ac~GPE4H?s>u?s=ofpU&vRX zI_T5gg*Ta+5k4SHZd1ewkiTqI_-~Lekxi0l{%d>XCkP9`lHb^+ppU`<1z1489N7a& z>T_187Gp=j?g+iM(&(ytUm85+Yzt^3Nf6&VZYY;y=?&Rl^Pkboc`qUv5Z=2g_TTYd zq~t$%uQq58<92Z_VzQIiz`VT#EfJn=*2%x&8!bcmtV*O+`J`?c5lUi3uKvUFn#XzE zTU@%q4(h&W8`)ZTf%Ff{yM`iK0*Sa}GvFJ)h-yAY@W&)6R5Q7ryqTpxSx_UZ+XF)~ z*>03PsHj*hmnU&@KV)`AR{djkJ%n2N{1Dist3lR3Ek(;f*!*}$sudCYPk1+9lZtxW z!a0xThu~cSduuyYVBGj>D)t?en+Ei5S1xf3E<_~%gXngn8o!Nf;Z5y2;Vq~#snbHM z2LL>T=mJxsXUV{aBkju;1vnDAa&8Vl7bn@D9Ko3>LZ zT>})ps&vX-1@$*KeL&j*jr^uWnvsWpa@K#$@Le^2&Jy3w{&?=`d?YXo5EFX@)Z9*y zqqIcy9-$RIoxU&x3i`#5uD;%j0O%C)b^TjFqvwGtVS$prcrEMH!GbQzPi3plOXHbZ zNa1b2f+9PBI@|#PFAE@pmFF~mN(?KP(TnqLU#LR`Lkw`f`ws!3JZqvs@l4QrFPTiI zl{C@}U11AOgYQKWg(6z>K4O^nzsfWu^?TBQR-%%N;Tv>|8GSdA1nA6J%D=!Ixx`zo zm;hS1A&g2%Ipa#~W>Cppoo;}k0%3}m&l{;8-D)>vKyM9LY%}Dn0BBNk3UvCxIkT0~ zl-o#}#jN9-wPGuij_?)v7YhAI%okG9WeNpeGHa%l$S}jrWg)}7!(O=xg@@D;^U^7l zSXN;|uoAUcuIDM7Rj8zBna9SRpb&Mh0$B=xpD@Orl`lI2b#uEF={l~x>Bkg9E`4t0f-SSr`nC=ESVl5c%t^EccHw zOII(e+SKoN863ONx_U(`yZ)g6{-^&pg?)}00&BQADehXY!JRMJW}!c7zgvX_%~$as zq*fvM=rn}1T>@%rf{4Fs^*-=aM&WrU1stC%O%UgWJ6|~`%c3XY#41rIKVG={AUst} zor?CEF^f?p_sPhEX%VL4S0UkxNwXbncT}X@>^q)l!JE0Cuj{tMw0f~!)K{sVN*&}0 znDI=e!`k6$cxka!)Mi+kuwv3fCH|epmx+i#-?Lm$l$r-x_-&|y)lwzGJmMtEspMP2ZIAuTL6YWsx(FO| z`|n?Pf;HsP=VY%1K@nic#QW50RkD7DdtflFQ#6O?TAmv%-D$78o;!wO{{rAYU}@24 z;Cm;ue;hA{bgld0iqL0$Nqfk3*EHnmyYB3hArv4{w_f~+6$obg)XvFv9Dc%oQ43S$ zP%3IkEUk8a6yWmKLT{uFFdlyJR8S-VQD^vr#I%R`-9UGEStZ%=uLyV)aEFdOs1kIT zk$nd3z2bS)v;WwmD3Q*36`q~9KQ~G4c7oOYa$W1po^@8JAimOc;NMLlE>`T=*p|ID z(fP=E7u}+buK39ctLPi@mAPuhqw}gEWjhxqv8nJL-hv*8D-A2Ce1mlB_`u)7U11=O z66pc(QCnFiG1l80I+S-fJxk8_c6#DwN3+xi_0 z^#$0q1~=5$boUZwwY}D$(E{1*<$QOm^s{Y?nM8chJ8h9aYSo@(l^6Sz&*I9z*pe+# zU9!)lrf4H<2Y$)Y>rbWd6kaEk4&TNV$&h`XOQuRsU*wNQTxJezGxUED)J%=6D3$#l znAVI7`h4at=iD0;(P)(6pYiG2BoUy^3sg_|Roh**X7->;IheNjMgS@LsBdG7G}Za- z6T(@KQbA>ho`<_TohQaIOdOpRu%$}}^|BeQYpAgtoZ+Jln)nHg%J`o@MON8oKC6In zl_)^sob4=D2QX+!<>6m*XiueChnwjTc}3Uc8#?)K6wzRn=p&U*4bW6MCqcGO(wP(T zTO7Dx8D)7TqDk4nUkq+t6kBZ>Loruwg(jSucLkwiI(~{IqN!vhs>^-jhFPq-N}^_f zlUrJ>(3%KDI)?sm++YMky|ie3Cy(MlNH;qzoVrqrA}I+38G?sZ4(+*{3iWtISNLZT zX)p#qpH|S$W?r?4qy|CsdhhN7mM7#@5yZ%N9y(Q6H-&Bp7H@$_^$CXqJh3l#CFiXj zJM0Q~b4^B!LQ%@;%r%;=YqG622Dg?7u9-E2rCgMty%mR*i_vUvBGSY&Y)8>bs);^a zA3T(`af3;|UV@&dE~$cx7AgASW)MbOB%zT+rw4fbse2Esmq>>6VWi+^n8 zV1T5jE5;QA*@#Z~J$5!COhAHeMG{NMRt5i#0J?ew$zd&kgCEfuw^TuNF?FC$GPN$Z zApuh`kqej0Y5y+L%8EoThG(oLKDUGUyEqO8V7h$$Op6^8pJQM~f9qSUTB`Cv8`_Sqv-c=Xl=tD2LyeqqboJp3p2{!zd%aFWWW&^Htojp$hv$Jip;f^n2A~ zMJffBC1;F(iBtf&mkmKL5}o^9q?eZT`?6%Y745nzbgIDniyaJ{3ODziH(#XPUckDP z2raV;JfidEDt&fZ6}T9I-xh2Qd@-wQiH5(%Oyg@x{|y} zfzswuH7N4pWF%WFN3u~DjT{Wd(OQ$oUrNLyu1IeB7k^L%<rCTPTuSgbFmSWN`o*gJr3riV(QT8_M%%SLFHEm2s zi6_G!!He?6TW7-ny!>K0Vzy+nUebh>oMr?%lc+z6g=V5FCtYDWbr;~H3}`gveRO4d z?Rh{FSb#8bSOveiGBgdZ*IWtr!jKp3Nxc>L!f?^nOIn7dI~pV{NO9WhY3LHB?aizw zEoFi$DJC%?8l+_1AU=&2Z^`wGopVX<{#7vAMXt5a;o^Kj(Hs-fWkbK1fC>AZt;IpJ z0!JWA_$0H$pi&A|ChAx1KtxT`ui7S*9cn1D)h-DSDtK`MSzF9R++?0~56g+PzjYrG zK&tszZ-0aU|FSjU69iFQM3jPBEp;9OIpZAC?IE{uAOps^&rp-A9KrhezA1?wwEg*v z!IWg2DJ?4+ydW%0+%z-Q6q?$^&1jkm5{A?pP$y<5)&AZ7LvSzj@elS(t=I38 zj+t;UF#+J05BNC%SHVIDM8P{n|54T2p^ngaFl}hwYpe(wD}ar1hag)H65?a^SKtx{ zptZf5Qf)E92{(ySw-yI)Dh}P0z2<96zSvrFMa|>l6QiAqVFDE#By=U3Y_U;s0JcjK z6Q;#u!-nHofRZONfP;aSsFp00R3{I=s~0oX8* z$H%iVfrhE}#4TN|AR1k+-Op@DC_7~#yy91B{zIgC{T{Wg;>P; zvD<}(G0nExcpoHZ*5rHGZ3}35e(nJxuXKK^Ub1VlrTAoZ&jGt5 zi??2ywA+4Re*N{}Lrce_i}#8$Z8_E*ReZ-ox0j7wyZ3eJ0UTBb*GpK-Y}M$3J7+Yw zG+f%6ZnN#IM&JrBO|vshzy&VQ9d)5W5P8?CbLh9o5mIWK5!koTDXIZJoXG#NJ*GXN z>!S&XsP6XGd)5giuqp4bPrc|20q48$k{75tz< zj{l}fH*SBMsKgvEWlR?U;ff&AFJ zjrk{&VjgRM!E;SP6;IxeQ^wq3?KwNx5F7sr$A$se+TkJ8$Hn#6qeJUygxU;%DswK4^3>)$b zo;-X?c~iuK+d!5Xyc#&xv5;cDJc1U_9HG}(ZH{kU5<32Sr~d^QDdd?zLdmt6r%sxW zo7)2_4@BES;~ku5$2OnYlH;+DmG7${f+wFF$(;Az6j`)>{$luK#gW(-KguHF?gu4c z0vF{^seqaW6FaVo{a%TUeGJ;7lP>m6WN+5WZJy4Dx(YTEsEqzYMMA=XkIO=yKt)Xv zmk}GzxhqY5GI7r@%w(&uo12dIZi?gbLi9;T;K$siKjE;#2g7WkUh{|P>oS0Wc-hU} zRdpdVeg{uE932e0iPx{J94UJm1EdfA5J~Yw*lnGADH|h&B3r~*-{bcY6 zQqdv!+j2K~mF!Sup^KS0q7QqH)@6$>05eM5!OO>9DOK?Yuz+vQ*fH?-3GX5qKo&w=aHIwSqmeKYs8l@+t$=hY+yPkO<@WAK{Hwp^>e13|bTU7@ z9J+tw^+S=Js7gnUiYyyKaP9sb!G%LL-XJ?!0YIXgyU3&rlk9j-A`Q7Vo^=4Wd_3?e zoDFkB+<*~DNW9FplYMa6L+#C9-U_0GEo6yb-ehed^FA0*rFZ}c!TpE89YGBNTb}Ye zPaHhMi$X=|fJMac_uoTcfKTOp{TJT6rbuF^$$NlDl}j_&ynPgK!>k@Kg1PEHCcQ*z zjqH7>*hSa*;U@pm8uf4R?HQP-p)hgDXtj(AKe~&JTq>?TPT8vSyFh*)efzmFeA0>m z(Y6$Bo|SUFB6&;E9s~-IL=k)VJ4jyPh|{GJxAxs~1Aw^|sCa5e24Nv9Np{j~ z7KgH_?Uf+zm}!P!#(a<*GKu#8iv6)xqz?CKK{U}aW53ZW;Ku3_6qMZ_D9 z+?USPz5)k$5t9M0^dZFYSk1(VYaup+D82D3FjKa}nGQIynDhh#G?A>e$qW+-MXF|Q z2B83LcH^r=1|X32ZF?5%&frP-c2zL6iRVEL4R|8){fV(6z!0g@|7w<8HvPAG#~*%x zamAU3%0n(bN;=ArAd+70t$;yzEpXP`=>e*xk?|O1gGc}_n(F$Km1!+0en03i07E1c zhzJ;d{e}b%T$;JWh&5e0bPQ_Vh4=o`y!*+U=7m4_Tz_FN4q#i5_aRC2@q=TgPxS82M*i_FGc_t6vuN%^_m~~mj5HFO$pWfHMc)Plk?*6Aq{XB?2gQG zl|z{#K>4t!{*&aOSzt_lSxh8#Z1Lg&(Xoix2J$e5O*6$7k|#fipgD%9!8z++U;5Dj zEd{R+t7(%jos(5ucpPqg)of%k^A!12-QABbwf=lNN*Egyq)EwCZ<$j<09N9|cv-!- z+KxVD8=Gstm3FOfGZ6Uk4UsOJU-vV&vmP%0*E`D<`|F)eKoI(P0WF>M4Gs4T0Mv<* zQv|?j;;&}>2!@j8AO0vl`3({V4f1i{eNNGu8Sqeir?=&Yk13NP0uDtY(uyI(uM7Df zx9(L5hD#4dTBLW&(E}KKcwZTiNXsxiOM_8!h&S9|ln>lu;c7c#nQPThvdANyQfiI|fw9!ZodIT!;P>7)`ycph#?xnnuFJCj;Ip)Ba%_qY;HhjSnk+U6w=+&KgahJK zpwoZz&uw4z|@fy$BFYdXJqeCj6OToaw1m1#5B%dctTzM4d8+yNKY|2u}mqk;S zkSBcMPn9dROCV0Xc@Ug^O6d?Q$$7@iMW1;Jo5kh>DxBS6b^EZ1B)(LuC0PcBEPQ8H z0G;V~>RdoP+WyVTMrw+cG zn&qt1TZQb!q<>kELrGO8^*iew1KtpmRGxH4{UJTVr{dn#?ROKLb`#_*yQ@RcP=}SFJuQm0BqhjS zcHQh`2-}mmxlgqc2(-Ki>>d|ELdl;fF}Jfo?ChZz4-wmL_DiKXHRodzJhISC<{G{(@&_7CgqqbW_e zIOtB%WVXdBn_WA78=omGE=@ReG?ORoY%BpNxKK-~P13gg5)y-$Ps2Blk6(_V4p`MSdn zCy=}K(_DpdF;;Zf+X84h9Xho3skk^Oqv$l#<6=>fJpzq}pgtEH{VW4MiW3C|1{5-% zJ&TP}5@=TiDfcrUsDd`0=oe;2?foWjd(=60qCuB{3L{dCuJ`F4J%3lEoL$1GA;@G$ z`#@MP6`gOGE{J%~kbkltt@L`pSZUN+ln#m9Do# zM%1kwI)6XTP&KQl_;89)hKE`TWLxkOFM!|V)gYy7MQ5xi`a#TTIQFn>ME+?4&8y#` z_fb*GfOm>F#>MThLj?MAUvY{&qPnsO#=*DJ8Lnq?WF&0)f91Fmc=*yUxYl5U797^; z#q>I6ft%{wLTTyGLRW0!Z6mOknyuwb(y@|U6qkr! z==0($7QgVT*xFe&n^f@7P1SE955|r)-74|<@d(Z$IllW@a*6;z{uVE1Ri*SYMu4e1 zJA1R4SBF@!uO~It)A6PXV>2NCz@l^EJRqdz=&KmNA^{{YE_r-UcBeU>{Si;c;02AC zei3j3SI1K)qFf32b0y-j^^TwVat|AVP~lY07+kil{%&;|Dgo-J=es{kd^=F3MbCLD z0WjTaQsi?@&7*!!}o*x4+Oei8pD%Q6Qi~g*Q%xdU;2N zo())JRVseMGFC$k)S$*W>ILGdHAX!#b7D2SCH?kJQTLi#L~^U#BmwjFTsvpg{ZlC< zbAJsW^YB7+Xz^871zwVx)A6k$7ms3h2uRi-q0)cKk$S|Pr zsSjT3-Brw%Y&1y35;&0zb#PZkBc=K3P4`?4Flc9Vc*&qsvSsalbBk;{m~T)F;!A^# zvnu?9lWze|gNR~f9KNzp{whXct)=m0{kBz*M~PJPUL9m{ie5~`txnZazG4Yn`u0FC z{Wk*KfBd`UL~J&Qfevbki#Nrj{)T|eN^Cic_u4-!uJSrK#<-;>1$2W#N*=dVuEneK z6~@lu*SEU=+Db`GCw&uek_AkXob^raEJ0RYJ6ITio1=neCvQ*M@#VA7?jTYFa_~Zz zB@qEhgQ5H{VCC*P@SgYYyHFf>bQ);`6-$VJJ9=;_K{@b#*zbFiqxV7%+=t8E4>O?( zEL7fcKf$klMSlzzNQI-IOSuvaP36%&Zx(`R3kD3bN;-h(Y){@^Hh-Y9aCB!&YZqke zRj!r-ij=Ed5%}jBP9GYo+>|u6!vuP1f1^Mz8YB%yy;9*V7O##Tt!~KFgH8L5>Vr<} zZ7r?Wx;#WaG!!&s=q;4CSL@fFA8O(ZiHl44R2qX%-5-oDUGbE3>fJKq)1cj$X){Dr z)m6r{zuSIN*YFy5shy{_dj_SA}{&`oVl# z-NE&U&1m-E#mk>EFVDwR;Ts=*J^V04vLxTF69UhIGis)W>ZNBoU$wCjUX2P_Y`A^9 zNl$A3#V(`S+TrOd@PyVcypMFhG$Gpc9K@Op8y_OP9uY2y>$gV zIM?{6r1AB1H_D+rAfwWti+|%lk9L+`SVsBSP!A0EFm~O+PrTFnNRR6yR6M2^@dazb zdgQbbu0-sUUCX;%+Ut|07i8qPQB)LT+KZSibj{KW1acBI`r%t-fuhJuRSn7M2fKU& zQtuh{HxmYqnu1RQdP}0qi!}z|UdVQr0r&NRL(+g#P~Svt$5q_m^np^@nZe588mS|N zUK&G3HOgH3FLdZPHaGS{^9rl}L-+hkA7*tUCs`(6+) zuVkO-u4vd8@bga^lP<3adi=x`WKKRFwl4`Fjhxc}wJ}XrYK2Y%BQ2%_I_Y}J2cO6s zx$t&_;&7sT-E@e^YnE-)0ekR-b3gr;nMHLh=k}3{eA#*;(HHPdzRLl_0}6ibj8f4M zVVF_n&)bnAGoyxI@XDHCiYIcrxsh@l#NyuFZZl>iU0Si#pVNwaqH|Pu_mLsfBdT$1 z)WYyck{C?aBiq%7R#Wm+c6UnAKssU+Q`9)_EZzNK@+q_@DzEYEK%BzV{5X7;;hxR; zFn>PMs=Ji%{Pq!)eNd6+KzBgd0DLrt?_3`wO?kZWoGm?wT1uKP>?uy&;{^37Dq(*vZI($48$)g9+EO<07NuA8tNR*>L)jvj%TM+kU_LIGqzLPIP#G z8uLljqZa)~<_t9D%J+vGdr^FbG1E_;jVXm~WkPo3{ypNSU4)0%HQx|+G~tg)BO|-6 z*S`6p3~sA!di3Q@j3oS`+FS5bj|unH&1C@_(txRKNc5p0{v0)VF|Fbk?cBPj9rM;5DX0 zm^R#>%{k2ru#`B+A$*M{Io}QQ>SZ@P&n{}3P+wS$Q@AJjMyzR8$!rp+hg zHVnVKdod~0w46IsTrNIf2Y)oYSn%hWsMb4SvIUED{p$6|ULTwihKN<>s!$VX(k3X6r%U@YKkwvBO+^+oez z<;&||uqvL&ghSfeqXPG6Jfa-*p+C#*vckVPn6PUoCXt_j#}&pC!@mE4*-9R9`B>a`eoHlU z+Bx_bCAJ41Ec`Fb77F`HZaV{~P~VW1-Mgv`E$j7-g(#lH)O~WI>cYA`NE+}0|0)s2 z4FaS)9C$?%A=S&#qsll_8ft-ketkttq8Q;e3SqWT*k_(}fgzHK|c?6i0T=iByt&Ai0d4$gDXQ6j^B=Q$BAabI{PZhwL!aCXbS*k^&guWXfH z+Fu?hPq+(O@AL4ud9ey3<|Wc|gjDnHAKNbFBB@8~w3YT6w)@|0 zySlm+1lp|!*vR($#QsQjuP-O)h_Tj-5SiQ#}*&~+c8m+q7{$&LgmB1 zPFac%?jenM{ebJ>J~wfusPeoK!qZNU7u|f;uDw-9 z7f;#dpe28OYWIQt_@m+G-5Re6-OwhU>UcH}%v9b@8xDe}fnUL+qNS29A$q;i0&`&y zVN0OJC4&3-f#_a{u${-Bb=QsPI{1$qmv7&1{JwNR`LfOvld6C%5~-Lc+Kdf*BT+~J zJj9&P0Ahodf`!l6eR)>kvLoO*JVeIN2$|BfKzhL_6HMV;rA{zjVEz-c4M%(0 z2KRxALzCWc?}@hecR)5FB9w`Mqlbb0Qt#bAZG2nzdbMy5M%}}hN2Zk5sxQk2Gp2KO zoIaD9hzuI*&b$Ug2dFy;?!|8Sa%O9Zcks>LQ76IuuSH=b6%Jn|@SB+e3}5#dzb)G$ zRJeN-MUqBD(UxQ#aDZVI#ml4rF|L?~V0g>lHQ@ndLEULRzaxlF^WWn>jK~5Nz6~qP zmcy-Vgcer@FluNTe_bQ=zt>C#$6AoAV9LfV4-VmorwFxxU5P_2RgtvC)lP~ zU&+0$4v@{lF!^KG0l2o~zE(M##BS|;93yKI&+G(NlJFQ;CLC#BWd(RzqOlw@i8`bR zLaJL=Z>{u!En8#vovG;3!h>)&<*&+CK*(y()tlM8=5Nz3PN4QkItZ*^GLv5~9wF~g zXT+HLNHR;(Eclpq373*YvPc;utV1(G2AP6t>DAl{%Q|3~DEx-%v-khEnC*WGdGFs} zgD~4suWaABE=l2yPo7Ji$9{~|h=qBQVPbX(!u^$Sf>xL8!7zpIU&B*XwRyzV*@=b= z^1z?sDm_y{v{XT*;OffGW3UZ@Kqomw5~G(4NCU@oVULy>T1Q`E@Q~D2K<+RmCEGrQ zm+pO2i1ElO<(i|76Tr`nq8|zuOf>nZaPx0G2bjMlyh89RVN&-hcI{1|J;Io9dAwiK z_=7o~QV0Hor4u|Nk)!_n)saf1w>BWFm8fBwfFd%w=_Rf$m*PW>rSEiR?gOH zR%z-m7TeH|x9K^L$UIN`_O{#m}2fSMl(6>vN%y4a92xLKhL<_Re?Z z(l_#33zQRo%z&Z-!sGSHfu~wiIsU(`stkU-Q9|VK8k*fv(zW1`KlH2e!JZ#6yCb*l z5turIu6mwe94V~-@OORNgI~-qNWM=;HWDyfvX_evZoS(1dZOPW&Td}6tM|$d@O(e; z{^IVR#8NxWvNT}Bd>ck{KkfYE3!qGg%XuYVBm<0Rjv`aR^GYIUAF5`d3q1G!xmW0O zfBMb|R`TOrDJH;qYVFyYG`D#%bO0&dMuh+g84{f-S6w15I8$b*2@*a*DkMH02yu*b zo4>$wr%2m_2m9f|dAL_hx47F530S9C5;F`Ed*Jj`L1zxSFgz4eS}F!aF{_{{{ge=A z3Zw=xTX5as3Nt#a7dH?1xW*x>Q2SKelnf$$T`69bX!riZkWe>Rl`sXucKhpvPn?%g zB|tU3eF0}pqV&dGXtM?h{Y9=@=%m7}+kSVba5Yzo4J-bg3k5oM&P;5ZhmtF;bni|+ z5R(e|rw^=|Dk(xGxD3S21gL_RO*&sEp}W67Ib9Wm=;ES@P?eR43s1upCXzq>OwV+t zl(G=;JAOOYQqJ`VXe)w+w5*JGSx+PYofU7`zHEr{Ng=v^#PO?C z_&W*GYeVoZ2wz%DgC?3BSn07Y6tW%G=xnGyEt@0(tb(*O=NJMv4d$CgW@kXt_?@n< zO7~NL7bmw~Wk7D@q`Q6#o~b6|(QXsTFgw(?s5}objFpPzqpNB8P&W{S3r1x^myWf* z<$NzH!8127Jk(^1i`B0`?C~DDj`NeN6H)by3QvT*8o>x#uuz*|yvT%7*>(mK{w3~_ z6Q$gkP@ulRFPtue$-FgTOED@AAOLklMCvc+`Cd4S?YQ_ef5)Q0 z1FIrvU7k7N=%E}tpjF}>9_p@kZog%m$+Kww1?GZh@<36HAUn&`2pn3-3oCYE2b79C zQsn&8bAQF~5F&&EGxvmtve@tr!ePUK(~&6*3hI&uH#5CHn9RB4{Qc5XH%k2?^S4%B z_?Bp_*<=|aFE6I#O!%+TUNu6Sk(04`{*-k|{XB55<*<^|1f zwshK9$jv2`EE|CrqMZ(_m2^eH?W1!MReVY`r_j0hYORW+R~!?lMa3=@caUk}OsQaB z+JVKZ5~}Cx^Ca9U`as#aUwMt`6-sj#4&3#F)&(`|%h$zAJyZ#o0?U*d5~LSua6x>b z&Xl1^Cy#r)Dx8`IHNxw_8m1g7n_ZP#m$1H;yI`Hh?BxHk=;U#Nuf{dbTf6!&1n_!B z9x|pWW?Y6;Ln&euza!|dUsQ$lU22Zel|YHw+Vu3$m^vj9%w$W^*`QidO0A041;@L7 zP@j;wQVb1G>P8ilZ}Wn!Wy~;Y?qXfLWW7sxXfY7{f&i43maiItT&=5p?vxlJqFlXF zet&~ZX#>%?=~E!mL9&cF+Hgf(><^gl?iXS~ZOGaWwz^-3&tAJec)?!<0S?qXFjx?X?$Hjlz$x;Z?@vN=_*3g7eoGP1BOP3OiHN4f59B~ zXuCV)>FvD2JITiLgx&kZ!ri4|p_M+UC9{(O`z8v9v>X<8D0do900^A3Yff!L2Wav9 z3*$8bktQo}Cf{WNLHLDpEt(evncG{){t04>P4g|){wU7{4q6|o1QKIrxHzcTaZDVk zL^`g+L53OrBj*L;)xtvGkGF}9wT&#a@vO6ocpIJ8!#xN0{$}6`i3k)GPG+NGh*+pj z2>;y(AHB?T04!7Uj)7eh-fFldb)eq z`zuQq#g*>xmK<;{tiSy0_X7&=Ew+1AxFj2{LD&}5UX#H-H(LK^JK^{T_WHH6o2|9q z>TZY}>GbY=cspa;=hjY9Q!rZnp+^u~S(-iAcm4ClCixBaGN1FWminE+9lgf&gd>l% zOu?@iow(L(#={+o2ick%C38~UeGwg+IJ#hF_s8vG>gz3d^-j!Ew{3fNk4ZZ-q2{n@ z7hEviC?;y(OpiIa4A`hPoq6bcr1#f)y;ytivEfEt)AnYyChBl6lbr7uo1zihrzfu4 z>FIAi6)IO*8-J-gq4eg;mKp(a<5AZC*yjcG^M`-4qE*d%L!pnKHy(uFKxBg3M- zg-MZ&F5e@RxPc0wC8h$p{=JZerh`nu%qHnR6$z(tqq@6UecPlus*O6@K0?xto`RPomsM)l>+1&2^mHew)A(>CL`$jr^>vM5X1CLRJPQ zyTGz_47VG+yG7>+FAP9opK)RO)^O)^U6WCW@Mo>RHV()QY@|E>t{ErD;3sGIBLvYY z5@Xb;bG9!>p?%vk8=2&q>Y>n(%Oe}pPY0xRf0M?N9&-}ZYhqR7$C@X?Wq_9A7bmkP zcBxL@k{E40G2y8h zm$(H@2E7X(=O2IzQhyWTZk@RB_9!Qi)7PUyaQA$+w0ja*yVGQl5VZUC+0>KO*^0)Z zNLa(`_)Vq;t@34B=3Py0ep&bh8|gcP@Qg;T^5zSPWv)jmW>a(aatPIX?G?N#=10@) z}HYlViO8o)yuGd)xLH^&H1hO6C#Ce2d7z6BxJR z>?!S}DAJB$2<$a1gHrNq+Z`xpV9YCZ zqG4pdcF!z~DsW}bn~%VUYS|^d&>Lb$DLyPj@%1Idq2MEoC4Ta?KsMY#<6|A3ku$x( zH+vegkxz0KZpc%+lPdrq*^E2-$pY-q~s1YS`F&rpY#4G-SS z4rWmP>DR2q0u%y*m}HV9BBU_N%G%JG)>%+bwQRAE>fS1}6A=E@WR;0>-| zMh*E)kR*lu2jNu}IRGqR|9W~i^oh|dwS~ESI}5D60goUkJD-4~{q4Mo0Zq^PE`3gna=I z!$r*Xiw^}5x09er!!SA^9xt@ISc-A>w>!r7EXZ!}-4NclCaOSXG3hd3hsd9Mx2vXo zvFe1Kfp#~k3s5@?_kc{iavyj_vLc*YRBIc*9vZE>=m+fQy`xrnZ})$~yx=*;LzHveO5@gpRo;iB}c~Bls3716blE<|~ ze91*PfIQ59Gw++BADl+Xe=W$!CC8kX6V4x8O?^rjv)!};teZps{L1Ru!T9)L>=0wQ z+05!9sp62}=t{&cMb^J4U$81^wO#PKq#8R=i|;sH3o2#C;=N%|tyfD3u(Z2QEW?ll zIDMUX^}5(BpNb1XktT@?hls-f4HNsGp_|Z1jPkUa4L(CdCiloiVW#z&&nl9&Er`hg zNqnmdRV$i&()u7TZBIk0gdf0#Yiw9Hvbdego?Dp+B2D1_#6FyA zTi_?+T-sJt zuRD(rs#<<=MTJIpZeLc z_V`9TIy3jr4+Gif#8frrO~97-Jl09KMT#8(W_OyZL zTY)_!VpJ_p4tWA%xoGAlSD)jL>Q?g#l9G0LFL?#K&WioPd>;R#P3NV0iT*b1A8!sz zM#|M?D_w9bYvS_vp1 zVKT;Y;kVX1Q)KE|@BCs3<$v-@RtI9BJ@tEHhE4gFpN(-HJoi|F=D9M|*$K{-x7U1@ zh4=kN@awSk0&BAi_4>%I;KwvEeHjtsbp@OaTR-5jwdGlsCpdZatwaPVuu9Q`hfdOz zxtj-bH!RA5H7DWXABY$m*T8#0!(h)mSg3AMPHR742qdlSXH~wwVtz+9f_QT7c^k4~ z3&eF@)8a{2XxL`aoOD|7RkALanzKx58A8ExK&`1}jAb&exastS@64OpcV4|sVMmO4 zYT#q8_^!`(DP_=6M+Rbqro-Six@pe|oRlH6TLJ{D#AeJ3ibVM%vxEKI$JOtuwAEQ* zvtL0`CBW#+Oi0pgm9n%jM&iqS^IW0EF49>j)9VhI@~t4gduV=Ex*;b@_Ou-StE{F# z$j!C>M;2egZ*e(w2%zvN zJ=7Fvv4`0&$?6wEb@#XB8s{e}g<8#6$T-;a67hVI>ewmW%?-=Xbv z313B;32o0>O<^b->e*1D3Wd;M0w?Y~|k9zfA(XeqA@W{7Hp>Qc-Gr5f5P8 z?;JjNCxx2oiOlLU`)wI->V(};@i0xs_lPHaOyd=yi*6DT473NPh^L`10Wpi!XV7>t zQhBN8MGV0)Qsmpyw27aQEHA{dpYDN{adTZ}Odvs96@-ixowffDckdO|)E@3@&&(7O zS|(uVU=Wb*LKLKG0!R}y^r|Z;Dj-S_kuC`}lt4g1x*)x2L{UJ{fb?bnr3h%ih6)Py z&Y7;Y_x{d4XN+@oF3$LFxyltI`TgJLdA!c-Ovq5%W_kv%1PO0u5?)EsO)Jr{bUmyT z){CBK6%JbNN<{F5Ww^9G`P!?*xXp&Js0pVn?G+H7q>(@ip@veWg_YKlYElSz>*VKp zG%-%1Qon^24|{UiQ%ee)rtnyCA$ZKDAce6eXn1Nh?aCnQ#&+lW0Et1lm&<7$f7*HSw3 z)k*4!oodKEFO%ukDUFkfa0s`T=_#Hconr_c_Yk?VBg|iyb+Omt2MxSA9nUFGdhDMu zsFxArk#70`JMh($Cmr(Q`srj^W^ONjzXe_fNGeOpg4wlq%f`ReA=n_Ft?u=n%`Uwz z5dXzfPy>2L1FN}Yyar@I$EgsQ&m|F$s9CAK7MEy@WoH(BAd{1gc{$~YJ&r8plX>cB zMI+BME+Pa@=98Hu-3{qo*j-pO6xF2;IYG2*0~X|fy#Xn~)LJ1`T4HXm1-!8u7-gAS z3SG@lMNpB-5$8GEQ&`VVsd0sTn1n(q>w!%KWjfciQa~*tt=bLjg3dGcTC;hmtY<0n z$8+Gq$%W&d*nSZ6(q{irR6cMqJ1JDYF4xi{mu_oaNQ~}G!D!feGN(`#9v3+wctRPA z`jsXy>tU*r93F7NG!gS+I@+r2Tuu_LGSx9v3N)IHM=HTLdIg+u(G=W%?5*@foM)pu zNG&MjjAL~R98cR`bTh(kxaT``gS(hTwwCy+X(lY>7v-NXolSD>wFu|2+y>FKWe+X2 z3$hz~t@&#y6EZ;BbV2goQc+6Im=WYfztDLLsS{bk85i*76qPdxeYBL9v-y0S+%JBf zN7A_)%mfhLu&FWWpVGG!lyJmye2t*Fx=XYqT1|m#qgv+6L0H$9o6u{qQ>O4~fi{!J z?wm#yf6cB)jr2+iJ&sGR)h*IaW8M08nG+%~jY9gixWtTn4A&&8*7p z8COoqCxX@3AHiQh|3}E#W#s=kNQBxujk++%ZDh3v!K9)p_f`aLq#m<6qX5Wj73$?%Sj?p!1 zZKmCu20;HLTKLwgHUG%WA@>RQx;Ep&%I}pI0~H_wjNKPpO%ZsAX(Kg17+dRN! zT5Zb1%>8NZhhEhW3r3ifl@|9}+>mXONNG6P8|6T0jL?8sX-%?%bvf;BhW%joP-dn_ zRb*A&i*IhW`H0cM49>O6@Rsx55#`P@tRsSzbH?t6j52=@S+FUf@KDB#VQqn+oQthH zv)UhVf|;jwNmT1%%<;tz%3NoH zqOda_GPz=!hz(8Spt`{5_N&l!d=3O!akHWg^q2XoW>ghKib{xO`e~eajZ%QU&4r!y`PD0ULql0BTgERoNdL`D_`MMZu>1ll_G= zLGVSQD-Y#BMg2Q5-uVHlQXv8#5M?6}5CSa*4mEUi6^Y&bahr9!W1^vh6;1r8?*8_3 z)j56rhmxQHeABo= Bb`0!9X)L;YtCaK8i^FSC9R@pvAD;-sl@Yj&_@^c4PLTw={HP^>UZfx>{1N=@rMJ7Ap))q58smg3aeA z?V6BqZ;97TG8I#?zsd<|v@MR)HobaPP>%Jzr+*i8rPl3P+C8_CF64Oq6JsdiQ75)DJyEj-HiZ85=T#?7m^&_Y^Y~%+5 zrn&?+hHHkuU1MqwaJF-gRGkU=IdFLwxc?A{oG7|s`$6Ij#rCDg!1b!zZ=ryXn!HTh3 zo6yzqGkqYi;x)0?e!{3pUPc;0_t{$%4tB{u_-$qFOHcR5$vM!Q?K;CbA*rh|ReH=Z zL$ilx$<}1u`~zlCW!poag@@N{E8H!w?DCp&VG+!tx|Hh%{6?ozw)Ba}O(VCD2HQ@v zGgt*0g~;uBF{^{#krT`z3xl=e31;IbeIDGONmA&XVXTW@5V;h>7nQf1#T-Q?(Pwjh zg>kkg5M|SlA*m|gXW!Xh@QK=;!h8fQTykGXDPQfo(lpKyL)Ctp;lNjzK69}Si5jMr zgP^D=rQy!Wxjj1bNoLdiohpozHO8JrV*LA~ta${KnVFGf(mC+Z;URK^f#aH@fr%j-;%WEDv;71w4JM1MOIziTcUh{`P5{W4zWC<|(rz ztH(>S9*_0jMsug1$twa0aM;#9LX~sFyF@h(N+ z3l%9n`g#h6n~4w4oy%dIdZYTA_GwiLt0t&K;@;Udfm{rE74vM+{QTpnl|sxtCv5Y zu7FD+|IrRER*oiUOL7PACvIr(o%kB;mM4G|J7ZL{_M}Qx0OQ0zpGDQy76!2P#A6EN z3;_gNe7X5~yC@(H6pYGL`G!)N0wBKO_kD3}{0ax?~Ze5l7}e4ceOaFWB!h2`rm*Y3>91|R!n=(DH;fgw{_}h8fBnx`aKZl?3)cHzV!`AyDvKy=H1uooaoUY>DPS|gp5Y=G zD5H{v(^*L_iq^+fB7o~y|7S3-Y&5>db`vb!(;(MCGt#^ zfP(A5w*S8bjJNQOP-UX$|gmOyyO`S;_jIpo7w1IfL>_#XQ8zI?JRuQ zy&hC@491X-9=eEqY6Bvnf4abj{r_7RnDd{!@*{&%7te0;IR{c7SENJSThTnJ5P5*U)eT z!@A9DP)OdwMLy-)z7~G?P(xWAAW=n|!GECTO)dunw{(2Sx`AqW_-`2a7BNM;dH)k} z%U2f=#pFL>V9HvkG?B8fr$+D}aycG4gPCn)-~X3f<`xVAI3Jspc03laV~1n731q{X z3GqJCogM)|z4hMO05wJDELjzQrnyy0?2NCd%q@U!d_Sr8A98tMSmtT^q`nHU0aRGr zR-thBXzRoH@`Htv za+eTw!2HcZ`Vz@S$Hn9iz6{(IS%o7k<(vFo8f^U-82K;5j2BLJ>}@Uc{cJzpC0qZFm)uTnxD_FLR?@Eb_GlTr6>bB3H`v8681fu_@h z$mOKIYamd&qSR040`fIlAvY)@`;={V8z6TwIORel)E3DNfCdn|n^cR505T@qLeO|U zwHJ3kcO;MeUaT^q0ZCfTi$}5{OU2mN&{N5Lu`ua+VH=oj9-Op0(NF{@d$t3*jGlR2~87}5S9l9CRNTZ;j_c$<%xrHUXVa{k)& z9WeoBKhg*GMF#32Ue3{}QcAqC6H^`#qPtVSRuu}_ zK5$spS#1MI!gipl_U64!%N$u+eO;d1D4YoFriwJ?Lkb3|;syfi$28r)=`+sw5|g{r zFB&>Se}>H$OMiQFwz6O0Qi$EN{Ozzj@IWf3dXE-^O{(o4Wbl=}Waj#I@+@z+P|OLR zy|8Uak3mO&<7v zk5}fguAHgax6qME61Y;g?bs7tVXXn%+j+6D2alW}wM}X>yigi28EJn0JDNkK-)&B0 z&qvKn-+7XsC}u~Y3v#FeYU*5E1}Ei<-dPa@jPxG1_F=6e39dAfgz2Ji)Q#tg2>%}N zJCJ^Mr$L6bZbC{@!?n1^C6oaPWqkHq);aqvq9z`I&=LtBr~X+4@znwkN7B7f)2HWa z&2g4p?7Rpa;D>Iqq#Zr2=Y<7&8zsT?H#uE+zN@dJ#b=MEBVuPp>%gG~oX&nCnkH|s z8N(?y2;wCY-b`(rUWF?suoahurYnZj0@)(_0Fx)mBC5KWypzLbCpkpnA5`3zh-}7z zwYDB`-4Y#7_J1p*j7;DRuE&=j?|y;Y+i$TKok5;^+5}4yxr6H&;{iR22P9-@ePsuK zycS*q3(~J}HN~Sl>=L;$95Y32tI_jM;Va2@ei)nR2%a1)_NR){N%0bl5{UVc%m&OQ$o7?uld{7Y4;DFKg%JB*FRS@3!**0OS>=A z<97BGux)t~qzOAkd~SVJktz`b^JhPMS_q<#h@L+d*F?poZjge%UoaW3{Pnp~E~w3#0Xb$X68WpGygekx`;TpYH{|GyYH*tR|a=`@ckKh6^KlV z_Uk>ws4+>2zKJEX7Bc;0_|ezrKUhPuN?&eF)(BeFd?9(9d@%x2#0`M9xOli7Y*_RT z!AxjZII#H)>gOIH!$P|I&^uvN#ajMLbJ>iZw{=Gp-`9rg$G*>89~7{~yAoqheOF3w zanF0M4TV=MPi6}8JlDbTz1Tq5j%j;Xz;@zncby{8!|GR~Gom{zF%ju8=nL zRfM>^ZIm4QPoQS%;!@`Cm+a=#I&Zp*&N?j6AfO&t8q@Ks6%7` zHxH7cIFVm#aC#(01VLpe#aCx0Qj8iN^AfMeJKJo%SqrNNB*H)Z8Tv|s+Qdl6dNbS$ zF`UsMUltLgpCtdGg`*v8He1odl#nD>-B6cXg8TAM>aQm{+9ZDL3iOId0@o9~4WWZr z1K`HrTOTCC;F=yi1r!sGk}}vh3m&u%gIg92q=euwQwKWs@Daw_jg&ZqjR$#x5n!md z@&a)4Plj zjTG=;7xv}xbbWXQ<0c$&K35T*1}epy^}Fv0&$#65FSf>D_TnEHLVqp0KU9a-DTq-&<#(`hW`XvOc^W))srgm)>c?&Z7MV3D72_&+bcR?H`)6X?jo1aY_NLpHE z>+$@;(In`b<-D?>0Wl{GO(#EG0y2b=&|~IBOwQkhiK66sR;8C>_maDX)VPUq z8qgr0;ZPuVnUiwRC|lh&mQ2UF$*4ry<~>@9ao}I15mew4$!H@e*puy8kg=r3c6A49 zE;7mDm?+MHc?p4rmuv<%Bu67xj7{&gjC5rtI=uqQ+T6&8v0481Ko2^W1ZOe|PZ3mp z)4=0{h5BT6W`Hnd#*J*Atmm4NL(IP}qhdmg39QNyn?2wV4u%h;Aj)tdDTVqzo z0Dee9K`2O0?@w{tGaa{cBaDqpjSMH2@@+Ri_H-t9r;6Bw9;1WyZC9D?JiMJCf@BJr99SiA>-YZ1xQH)F}TV zldoZzd$c9!UB2_j>8uA|a%Jo`tF<`;DBP#iICv>T*tw9qi-JWv@ zsxH$du*zoxP4a55ek>89U6x<3Ud^)G+|pKI;hMrAg&Ek@e%yY{nxG#@Q zRXuH|tV%2u721AUU#ZqBEVZDu?rbxjOeshYjHDG7dI5F&d(8N3M4hpR`A|c>rm{A` zs0d7uq1J~;1AP=Q_`8ci1ZZCc%f9NkwU_$^U6+qxyVLUY7x7N?(xjFkZ%tSC)YRvJ zSK7v5&wsHmjCkv2xIAYr6&9%idAW9*E!wY+yl!+LglW?;*M>6WJ;3#}BKQ={x%ZSo z8G5?i{b*YJFT2g^#@Ei8VK0V^z4INflso1PPzT+tyhKs`&iv&d1)Yg^g$qxf?8Ocj>=}E{UpB{fu9x z3SFk)NOJ;knWdB{*ufPM@-FjkE3`vj*AP0?Vghx4y=#?QwN;3Fum2kGqfxW|8nz== zEc*7ZInK8q+;De}gf{0$U>BqfB}0w2uC?w%T`k^)+q7KfEgDozzQpUI1ldVp@T z?cX`QHeD|BUBR`r{;%(O7jwNMxjvduhHRhB(%o3EW{-@%%QtGw=DDXvdOP@>zfGYo zVohjqpWfl>-46?2-R{5F-)Hve3QBuG%Jk~qjf}F7<%P_Vep%rvlb-`I9TA3&&P3Zm zHhgzERQ^#3eW-TOS{}&Zm&+Uf(XqbQ7&_D+OCUCVw%r`X&uEkBIwi#eUe+%~aH1J@K)82p^bu`w=fE65)4=?2Ts^HxHB8I0cXxnQ4KB5Qo^ z(fr8TuEH+c&GzzRbEc5Oo6%tJJIlgRH|P2)gwx;Ik2`fI?hBFQWGFY|Z?Fpjc)zrVZ*=hVL-6lk^43ftJ|zj=BtPa(mlU}#FE_w&sdoN3 zPPvubsWC3E(X~}%0vS>)_bX1{7ja3Bsj+oYnhwNeBc2h-G=;5~xZnzZ${kLIP_LFENo3AQ%*kl@NWHybYJdJj(#hzL zzQ_TMsc%7Ptl05vtBZ`2Wi-#(Z3n~DsGKu1-CIUyrA#3?qn{^2gA!W5smox8?c)aMkZc^$D+aLc7yThCnvF{L~I%M@DZA9j*f3FnQD zEDU}0oo{B1U-elSEy=jMQIeoob7lVI+_YKk+?GNwlgD`_alB4-^R(gD4v)Pf=auUo z5lFe~3$tH{%$Eu(UQqeB)tNS>gkNS5(EkXr|G~?`q)&f3%v{{#AtYHymES~JNGVcS z%=`z(J}eLX<{;y07T?73we2_OuT`l$olhKFb46WsMeh9yd@Hm*lSv-+E?x=*+H8e5V?GNeDSf-JB|sOVBOx z7+bPUnVY{J%8`E|_c%PC^T4PLd4cs}K><+6e@uwDWJ0?}+cpVzw5Y%1jNQj0AJ6{c zpO!1Bh7^~3HabK1)bU@)M>5Yn%h9d7!pc|vx@^4--F-45#y42`)T^bR;>+AHdj%CI zXuR~?WCI&!;!|G8NYfddp4V?5YiID-uuALeoUO{ubPJ^)Vmom{-`r-?OD#$$X z*EsBJe0J~m;^)sV8n1+z&@PPbzE@v@m@Am`l0rQ=v^up7eso1-cZ%hO;^7pyhB*1yGgn_fxDOKmAp-c5 zTixG1mQ4^;IcE9sSLje)zv_jkAbtuwHHhKw{->IAvW4 zSP4y^0Z#e76iC^wIRC%n(u#LXB&lnq||+H4#A<4=!IYB2#eb&QMZ5>7)>GeeMJrPyv7}r?HTe; z8Bsr1aI_HcjS>0@gQQwohK=vz9Yf?waA~-xq&0RZO8|UHWA2N z1aKI+xPt*qcho%1H2v%$vD<~9LZq1EHr?B+E{r1o^@%E0354x*8xbU9bjj+f7+Nwp zY~UFx7Vis@d{Av$;IT3zU%|XA*3rvMqfGaHdi@_#dhZ>02HXAl)yqqC@dsI&W+?Um z=^KjljAV`BTWWT)5rE)PHZ@f@TbD@s3%U0m7eQNz&rlYIxUa|~Du+F4z)#ie1nl6( zjxKndL2{8_p^u_Ct!MSe^1d-6HOVyW8leQW9l=faWYt=g@vO9(PIdf3y~wsT%{>MP z&a1JB0DUV@JX-vLAYkeDt%%Ih{3vdI5a3wm3C!+DxXjAlP73~VB>--ZR8k6cpOhr7 zkZ1sBuiI-CxJ5i^rM=!`TxQk@>B7Nn#*+!*O z^glsj;NKwelBkN;PSxgrg2a3w%Lsr9hJvF8O)k6Ck*Ycrg}h&X zaA_CJH5ivZWi$l_#QGVb7_l%eoe?X(BtU#tPCk_|#x}#0oF;*-q-XuJ2k|c9TPC0F zb`S!5^jLH>VvEO-NqH{vG`No7Ufe2j!&Ve4uZvVanRw#crz&N`T zW4v}CAa$V^zCH_z82l{=0V3K`Q3(*Xd`i5q94~y_ z1`!#ysDu$B0;a3BGW%uJKOGkaOOtW^WTywtipF zy7_ObSnAsT(8mo+FHw5C8z~7OqRd<^b9=gt3K{G9I>o=8R@=7MQb7>Q-4Hz82cVJ> z9<#lkg04^w)>2F3n=AQoIe_3LE2aHNk?4VN6len7J>?*ff0g+M zb%(|GlMrHYG`PPtQ5lW~8NT@N|6-`*|K`@X?T|GOv|e*=FOEg-<8fd{Ym;2G$ud;Iy=hz5}lXZ2sKI)pWBp(so z*V@15(RL=Z!jp$T!qhF-l*>t zVgw%2>}NUTA?Qa?;)Cg8>3F1}41=#5FH)K9{ntL_4Xl9;#uBp0GW6q1q#m?8<~ET< zav^QH#Zum)NynZvQ_1A0GZYoy96gvw9lx=cx@UqLAL!pRhyVnH-onML6S5Q6dOw=g zbC72^J(DmLc2OZckaAmca#hz{Vp&PTzQO_%;t_U4Y=9+!GM{ef-MPyT!f4*_nbNbd zsBssk9}>9S!pTF_oQw~$)Q(o|Ot$0{bmEm0mDKX{tkCC1{EwMbfbBLq)ks~8vb3Dq zh$vm%9LPKhhc;yReF4)80+Jar^XqpkpvR*#VQ;!HU(`>^>x+T=hS8J1u-!L2SD&5R z=_@RF+~6-wYDRm6F^azJi`}CT&^AMIN^OIC{oqnly6^+JR zwbHI67OT)?B5HU%YL6cs_v$=aA>qKCjhAqcn?%`w!#E;@o3voqY|&Dj`U z^C=jqerzq7Ktyk9bzlFC)28~zi3h`L(yP8RA0e>Z+5>_uOVbJK$FSf`#DkgyKX_}Q zB)$_1UggBVK1BGi(8elhiElZj zS9V(L`YCt;igTzOhukCguYNf7k9?`O=O|2KGdI@wd@{0 zh03szgzq$~22$YbJ{|vaAcC%NJnd2~)8)tsQQhc|YES|vDW>(w|iDP^T5 zD5@$BeokE;2>QZC7=88l$v-#+Wku#@Jb*s6G}5&Y{$ATpN?uK&T> zG>;fz2OWngh$nDW87@O}SZwLwyZL5Ej$>C0p;W_6UqUdvC-$V6X@`RohAiZILO3Bf zmy;>7VacS;q{9m=hvJ^tDyZI;=;!EX5s>JIz&X$^_z;2{xS+j8!bkrs*>8R>8tx%} zsIg_z8#lJ91{B4P-E0KCtPaDg1c?%}o-8w(zhsXjW4`oThPa@Up5NR@gqJe4rJobBIo%1b?8#zxYBD41sJ{^lmKbS?6^TY1;7B2?twWGv!sGdFOk76q&YZttGa;XKv^Q~o{(<}rNnsi2 zJTo^lJR-k-0Q`$kQ2sULQ$*Ggg0%xTV#!uAidh^^#~dewiItuE+LO5ZThS?7`i5

n#@#|ZWC;TfM(*zx4gRQ=&*n3@Wa|i9P6@|5z4F)c{1ZE6GRN2m!Yf1y%p4HK_ z#l}eiKe(V;V1j%=spF?|C$2M75aNdb1<9~7+#ZI{wAI0<&DzxbLj(CH z8m{Y-fHu9JOej!k%R_K#%O92cl?yfIm%WfYmuj4z1#k*y+Xbj*{q6u*!fK`q#3kZ7MoTIL{~ zI9JEqs}6)U=uxX2l1N|5(0Y^#r5~ZS*ee8+4COa|zi9%h8`S2Pwvxip&5g%7b_DCo zFj>4-S!yHcORL^<0xpem_TR+A47L;HoJ2VR?j;YBgi6bB?0Xh1#XqV zmP3^nIJlSG4)>DTa4%VSLid(ZD|BYxEt$oeQMYd?gx@-+B~txL`K@j%=qRK_qS)%U za-6UZ^j1n$YuY~1Xb1t%r30mtfm_v^ZTCq!$u{=i5SPA* z@8Ad+@Bu{=OceEI0!<(Q4z*Zu!3r(pA1@sozUj|Vn$pHQ8dP_NEPg+WK%ulgdl`EDe+k*u9& z`>N|;M%TJqkBe}pp?BZ0#vc0^XCAXA$TZp5q}Pa0j5qC1_l)z*sE#(OjFRt#_e+z9 zT@0U8-oDz9jn^G1^L^4G2Hv;s*Ir^y(Ps=!a-8 zMRoF0406Yy@xv(rkmmRcdEiIDcncz$Kp&AERbI#3pY<&6H=1x73_9~_JbXQ_t#M*O z8+x#z(Vv@8<)=MqHoiUUY|=+OVgZFpKDnA+NP zUMI?9{JgVqR)%Ly(ZLasrs`zl;oYW>Vw+MYg&%E|d06i-L7c7o5OGeG*l=xBQCFv> zO*+_tJKVM~?KdvqRW>CP68TDM-n%KI!)&{9!2D3>aik-Qry#cOmiJI$;bkIWl{0O! zu~OmNw9siS8O|QFwWq^ht9B>=ixG9b{x?GE9(S8TAyl@zHnb#p|NUy3Vr}>n`1bSG zlVJs5^<}SI0fMH(e>(awM5@bU993My|DXe{Ut9=k3WiRodA?xjjgH`XLq64iQLof`tIX07vvk$62BTBc2tGW`%ub37 zl6Nl-%CLVb0PwBs+mdH;qURi%=GM2OcWXTt+6J9FKCk_<#_QDBob{MnCL#27iSM?# zzccutLNJs1C}8)}r;8Kqivc2vFNc3I-bar6h1`j_Gw8AYLd@Ze8htMAF?^%94apsS zsfdkAc{}{Z{+#CHm+QZlwG@`wDN=8eaY?6MvEMFPv7cKk2HZ<|TKd)z>=McRJ#lB0 zQFG_<-V`pNmRRunwOnjyxoj|pjc`2mM(44pHndnV7W9yfSbhCwR37Nv->vUkuScIA zcsuM-F0}S&CE{D(_?2h*6!4O~1XBaKrDRnuRsd^#GGFrOdCj*qD|q z)7zRDJlt5>EBbDv8s~2NZbO9W%W1Aj4)}TJ9UiM?1W6?;d}6(j@+fC!op&6X=42bkPlt=onFu!9~kJ zDD%3Hq7PN2qE_r?cz|g1`No26Qxgo$ry$HLkZ1`UWyRUZPUt6P;QZ{g3aH}9EJ-8kS z+ffMHeQ~7D4(UO00Kj*E6@AqN$0|x?M2E&?*aQZx;Hk8cJ1&L zynN+23ff%C-(v?j1xZLh{=W9(D{N~#0R2sWT!vM#x3NL1LRL@F5rZbkPdPSQ6lE@C zX@f~lisqBTpLGxyOXp<% z174%b^%F8sE$=URYyGZ$SsL?MhGd55fdEyo#axAHoypv*b=z-!v!q6lIB5$OqWS>; z6Mb#z|A)RN6_ITIz}NJD;Omi%FHjQkqcYnFgw{lrj2bDHD!-LJW`dxPEa0_iQ?|Lt z;jenio0%Hd_X=$fDzCl-r&(5My|^TQA5Z(M6JI*_OBoAvHVFfW zan3DYg`k=%-(MqIb)fmwF>Kp3*u0f;&ri{>nrtiq*OqnvsV&#WL;zYD&hT9%z!!}E zE)M{AkmJA5FEyR+d8{1==<#V;C^qWNvx|3|-XOS{l`9BdX5H$lfbL$)&WaJ}6XJ|H zfV@LOsR=5`+UypkYY+;0X@~&<49F8&xprJp`H>GGkD$wKs+2%1Grk!NbZutg8LuUP zAMyg$HyQjq^)LfEI7|2I2x6W3EciM*Yq7 zzFR*f>Jt9I*m*y!>o`0Z#unQn{bpqDj;eY5NG4G=h()UG!!mWR!Z0=(hOwc_HGASE zWY;?g+^oo7*{qi1MfRVpibv@J@0XPb0;iFHho9L8B17rwz<|~JUNHoTu^EI?Eo1^> z4`n1H)7)s^>%~I<{ zNKX!sq*+sjQZ{gGFa2Hdhrm{aBF3wYKh;rK^)5C4e}%F6^4uNoQGd^GS;QKbSsi%e zJ?Gd;^!VAbDu)6wM1O>OzG++_;kV)|V*`v$& z=bbV{V52N=&SzP<@I`+}HzB;btEt5#AyVGkyb|98qQ{XfK}%LpAt`IRIaSehhHO%H z`#He746@2@Sk9cu(nR@AUpaby4-a-p?YcF6xt6Qx(R?(nl8kZQ|2eIZb@Ih$SqTEP z(;-TMDY51`rEI!l30Ts_^Egv`33alCIXu%4|UBzL4&% z$6bihTGl#6l`zkZoqnpV+jH>6uT){fc|J(qi#hbm+hFw`)^|YYP6G5{ax5Csvk47G z@27Q=<}vKDh|)qx;7RkKqzq@*q4yUu1b@me^9SfU5pUMTnV0|inrA*)a;M}#F)-V@ z+9H|rR_^e1u7uZTx9gpTkfF5UwZtYvRlfi+JPTwt?TdG=8iu0#U?!8H(c$S zShjxM^(^#VS3WC+3NbcgWm_q8krv$;+<}-9%3jqeJdzKi-W?|if_jV^J7x4zr z>H6NSee77X(@*K^3@`{(NR9JuLu#NUQ@Xy}?M zkS?8!6vGC4q|U*mVlH#!)|NEsRA(}tKuW%BNPxG_6HuPZQ7-yoZ z*C{C=aXc25-4OsL%hHe=zQ{`?&&Va#&5Op7;tciWR0NF$*=9Fd?~ZTH`Uo$( z6fl3;BQl3ARA(Hygfm&oEY=TZ645!mTiG1uiz8=LAz?!qpm90PsqJKOEBSXd`nU`b zPKwCNRm++oo4o?Qc*Hw*iHNSnrxFtK=@%UhlU$?$FM1TKcPqTcS{UVNP2^`qMsM|J zCniNE+vd-Sp%NnVjR!qCYA(9>Y=uuF%WrKd5~4Up9SAq#HAL|2nmS;HeIcmt?E!}sz=7F{3jRGY_a)Y+zOJD z3ivyNy-4w;ZRe9V9-eQJ+D|S(3u@CGho%d+2Ey|mK01+Q5)CXEo5y@bqWA1f$B zkjfZI!2zW5*@3Oe{+IJ|)xHm2iaL79HJ~(SAVukGDLq$h<(tcI$uwaNXqi|T+j7BC zwKy;}#s?^k(Jwh4;P|0hU~M*5$^(39=>8!Y18TTN9?sZnS1_l9%)aH`@|ERLs5V)9 zIX71=hljFlSMc?8eP(-xl9qQk&3*A}m9r|%*7gEI7gG@FPL=^*1(eN=i^{B(hsZLV zU%Ta7N4ag}GVe;qzqhGL@G5mbdPbXA8e*50V@zPtm>#)m916HEEwdpa<18U_)4Uq@%({Z^X=buOKEU~542>JR^&CUWe{1qLDn6N1f3zi#pqp;p zst`b{3UUp+CVOpe{luI0Mp)SJpv^5k%B{0nh(NEaEIj`q-%ZiF?pVvQnf?pJxkj0d z;p)KG%}_ofmz@HV@pk@K>$xn z`SNP48k8rfC^e#>TRNn78b41JhC9)@0Pf#TG)?YSEbk_KEch>{4bPHS;aQSYB(5Y9 zZ_=v0cq>_`b=A1_){NR)UMq|qUxF--J#5`c0G{!IVaWZ$zP9`|P>hH^PZ3?AK}GP5 zB%F$-V2?m3HJGwyBmRQ9L3og)V{YCSXf1-<$hZFk%>GCG*yCL$AqEZ+-kzrAbb9VLp?|8${_;~FvH4br#o70gu44K+E3;8pBgpV$!Dqe)T)ao^P>?t6+xxTCy3w^eH6yS%Rc)l9qP06jyMNmX@XO9sFQ$Lu zwt}@?uY?iAeBJLia!h8Wdf!HaKzz`EF{7R}pAjXEpuHXlgteyi14!S_yo`RtT6c6~ zh2@Ewl6f`N1~}6qO!pcp4H6C?=ocRuI-w0^7xw;2?`^g}H|Kl(2uvmv4_|NW@qXko zYj=%1q6Vs6*^jQ*h6ej%BqFznh~iuysb}BM7>PWLGSeFRgk?=<=$s8G9JbFs^KG;` zs3_U^1}EauiYFG-77fX2|pYMW6Eu(&buPnq>y=&)Bn{3-YuM zSB=^8o*E2cSGz-pc+v6IXXh{7$>c#?7#E7Tcq!x5pXwOKooN15IFXcsPF4?rsR_=j$=WxB}-VevH zu9Qie60x4X@x5k*%?b~bL3HxY+UXgZ&hTN1Uyxq9)mHof&makHi?kca3Ml zQYM-YKHB{npqWl(70tAbDuYsGYQ_*O!95^19~N=H+;kX0nHp-EdnF}sZS=I3xsY1f zz46ZZSkJ`Kjn*xCtqZ}dDN^h}2Q7Zd>@hs_eT$hwu%}t5E*S;=tA^8TJ#zwt0)MF~IJi_qcN0+gSmr`+w^|4M3vU?#D-F`1tam z?*of6cc2f+bo4f;l%J_|WjxBJVnQMPWbu;tHi$_XPcb8~*J^dQEx^y7B@r`wHbMv+Z~AaRN($$%#$1&(Jy$OmUCb#zs1!pX)rgI&|Lq&OAy6lpA_} zP!Sm0HBxnJi~W_We&=BP9lLLV`9HWj^Jpj^zwcjj&CVE?eb*2Th0tP6Gbl#XP_kB| zR1$@hof+%c$3E7OLZWF!sYZ*PhLj}=DJ0TLi{`od{_gue_w#$sxzBmddH#C-cl^bf zx!%|3^?JSZ!Uev1cS;qow|KPmKuP`V^f|q$mk80rdNW(xhGQ1rfI>BN8sXi(Q*V@mva_*!c~2v?lZf;QJqI(RYboyalEI@B8XG)epLsm zq=PON=ll#qd8eK-Jzwtsz`j{Fe@9hvfeu!+oU!5}sKgH(;yIr`0ULtExAJdwS-e6B zaO{vU_YL{aV5y@7W+!J%v461S{zA-$Tq@=L=i4fEg3;-|1q72w1}0x@li57bGjH0eW%F`ULCL=><%EETLk`lxyOvzpq;tr@(gxHi?V`WW*+pBq#p z{{VOy$}>>45blF5)PE7aQtbnL=6+8vAc!G!1b1R)=Yx-vf#PwDV_eQ_LrH@B1mGoj zx%cYu)HU%P`w_{>A_D?(Aw|4x2_MHmYC^ajYrgxP8R6U`MDXsY@x10wqI~r6B@WA{ z=K6n^6K&pzFO-X+3$kLbK4q=>KPJkl|Cz?#4>(D0@-=5~bO(<9RPEa<%P4vn(jH&? ztNPmO8wa}Hsf_KvQqUNqWAuKk^G5a4^OQIdmC*o~&e$w)MJ*q{}o5dHUwchVj-px%lMZ8NaYczI?`PtgPfW*&;FsY?VAFuwjxYr z9?R!1-3E*+{}aLn8ICJlK*BgU5(RMBq)iwg9H)L01t2_;2nA~i{$qa3>K%XqYa$Dk zOmGJ&Sqa2ajidAO2mksaXP!!INc>|Q)E46#E%A5eJB(syaIYR~L()v-dkT4iiIVkUSPG?Y6q3MI^}QyDF|uG2qUXY%^$2VA zK1z?dWk(2l^-Jp7Sii#=mg6Oo6j5Y)<1;Bl$9KW@;3tM0pJM2%C~#YCUmpTxz7FoS z5CRCX#1bB{_6yCXC;FPhz%P1N~sBYRVObNweg=?t+tSNHkZPTumsJX zf>>)OIlT*zp0I*Eb}I+)Mbaf1v}R$jgcX3-FHf{zeBt+{m({w9laG|S^O+L2PDgNr z_5Kk6ZWbRz0z;(WrNe|~ANqQv25+O4Q0M5wuz=OLT@pw0&RS`yT#%zEp|?58iVyrb zV+-J#xYLs2B!B{XaQANQi(D2i7+IT&Ki*UThj;{CzL57Gf6xGVor?C@EakmzA)Aj_ zZy}uw$a900v{4K}r`ea9*jOMlcbmAc3zqUE#!2`H1%w6n9s-`)JHDQZSzi405slUp zOvHl$(~}4-Bl`Yri|UkP*ygFtZ_%_G&R+C47}&mQYMoqLFSPQwzDA5s8R+n^ffT+; zeBGlC8he>he~&@@r~H|#!rq4wBF9g*OLcVR8fmmeX#n?QJD$OR^6@(Mq=%sZBIqk; z7XbjL)!C+=YYk&LBv-ZftZI>L9Hn`qjx~2pW8duuuu|M92nV3iY zB1&e}lrFQVLgiLYoeB~}@()>=QUOe459uAi2TacvcjAx^pnfJb0|5|L(0XA2U)Ha> zD!G3$!N>khj-3^IBk^it+g-2EK|XxI-tRDE#+2JqnI>AUr&ekje-8vw)+sKM)N#zU zgRyE=GSg{CuIwWK`lT^FakLVs!}vqsU4VWBM9>oyZD@8g@^8VeKx-!ZxYe|TK42JSzHdZ9opBD(3xItHK>;T8)XwMA*Et0kf!-_sYB^?W*|4 zO1mLAd_=;8VgQ9LS~(?)8iF_->B7xsRa8|fWU0j@;W&>-=vWEqrv4})E+KDmE`Cj- z;l`7(3Q7W_r}=ljlIMrLfWt*=SYt^c;9M>ZIZ<#)W?IqY4oc581&ZA4ZzW-%<%EQ? zk4Iip#ZQh>US)~c=*LQ%sn|y6yKC<%dnl0`;7R@INTBPhOE#2G?HcNOar@4<`hfI0 z&l$U+JEPwkLVN2DE_V&x|M~4IQ|t-@yKDHN;&&d~;mTpT?%_7m@7Fl#SG>u)M!MX; zU+4B-IrjhZLh>IP`@Q?}o&Q^3xyjnX-+>3e6omHWhsmdv_n9 zxZejM4RToM4yNddnpiPQI-o?EQZoK_dRv=g=DO}TQs?w7QI?E2xe^kJh-;O%XKj0P zpGw-yu3Xss+M$g@bplR&=sSo&QI{x=<=MPz!u2~pUKf9V#8XSC+GsYDjeKH7shl@5hkPNxLz#90KsV!2#E#g)%2#5%H0S%plPFNcLn z9gN+{QPM(+Gs%|F{H*FrDTR(@!D%?TJvKRO>XNDo!Q6?2WOnE!*V5(zC5^E)RD#`?4UZWqTi=fsn z4yiP4GMqU5C`3|XtG?M8v)W`S0rK;p%E~rxM)1R?Z8(-|3*{z+Sy;D9bO2Tl?LLS& zYqolB!I-7xEj)8;RvqcE(SATvEiQr|NqQh2J$u?FQ_3^agmyYsHT3-0kW%ZNcGWo9 zvYbz4bKQnm}?TqFETu+F?NWD=%+S%cP&R;~_*Pa<#g zJlA4lENf)ph0madRgx6@p+E|znkMBmX-SwsQZ(2vZnzZL_MBEmLjKa%EcF(X09gJ; z(PSw0@!1$MJ;rC4<_?6K$^%qR!jmll**s+S0BxiEIa42k!cthE?O9FA=`6{pi^75= zCuY*avtieav`Zhuj>N=vGQ>_IYP))bw)^J>`I#~C2eqIh98AtIElLnKZx~P$0G>Ba z^lcS`3pzLCJ&;Mn;wgM|05dnGxiAL#z($kk;}s@YGkds9(!kv zXvdMQP00vms0l8m6qOe9j0Q)xCu?NkCsU!VJ5MWhL#^zpP%HSJ(cjoik!@Dv8*$~( z9N&Jd=Tf$b1nQEl2d@L%j?eZ*5Q*iP{ZGV)WC6IKbMt7Pivmh|*38oc3UNK~nVye? z@ze7CSC8g{RDukj$bXcN;D{;!1+c>so~Sm>xgm$d;e>YtUYpj4JRBMU!|ZD1Id#uz zFy2_k-Hx2Wn?YPbjV!Aiom=Qelf(M(wlB+pTWqu6cVsji%}A);PCK5v(FFSLT2z3| z&>f`B>gP=wLwiEAFCR@$owc;mN>-N##75k`JJL1|!Ym~sz=sQ}`6+6<$GLH9MrdZF zz=fLZ=33b`1tn#*X^+DS5S)TSZ8s|+j(ei2xP@K}_GjKc?p~^qw@;zC)EgHtlo3Kn z`(P3PUqVdIrOq{F%qjrsCRybdi(4snw4tJ@0x4%f?8P04Ic|2P`(Rr@aaXdR#Yp)8 ztrRm#gD1_clrx)0qC2$rsB)8qwRk-fcbXi0UA9LJU#T&YnF2rL8Wevtu|rnlnYQOo z@XoVkGPxs8@adw9o8ZupbUNxtHD)asT1;&iI1HiHo-3W=?nZ z)2gvHbES4E=_O}_B$#a1ln5ER*n%xT8^oG+4MS6`H|6ZgMd=sS7&l%k8rFlvE|sd0BJ)xhUzxs(RS+rK}HGzc42a8qlp z4M>RAE=r0wsT~fh2tJxl21H*aYNKvK&TT=yRIeNQt2q^mu)PuNv}ah>O~ZTK^i^y!8#{3gFkDwMc~MY1?eA(FUNV zK1?R6d3{2XLPN%L+QL#=L|&i*I!_AKh>bRI3X%gT4l&`W8!tpF|~$CLxpRVm3f6cDEQsjqvkt_C(V|?MlCw zH%m3L?dJUqArvi@SyE{5F+Ji^rxmGUw0BbW0w4 zAr60f$xR-3cfHh=@0>8dvc9{` zXj6cT*&QdPYe66M9++mFGrxADsQnD#GIjpC2@4;N?~qF_H4>&a`}SX9w{WzZMRGk# zd;_m$5<1~lGEe*FH+FkL&-qOq?InbU{$HKXLu=yvTuNqcT)NWk>viK&L~W@wuU@$W zrH0JD;&RZVo9lP$tGRqju^>@z`DTl-kYM!8=9 zlBl)9L98K$u4Kq9I*Wk;-lo9&!jT_#+?;-zgpKa+uwpPBpESvtT&)*yx{LtfD z(fnPf7gWp6Dd|`t)UST%LV9%|R64{w1j~em;a^QpTKWjvQcA1t;?pzW9$B$@|6}-Q zmc~8@{}d zunh`_;l981Ik!^SLX%PElqXS9(3g zH1EPF>?rMB+VdmzXOapLedRB_OEWZEUR-tUe;NA1SM7X&!_e^psYZo8rTZ>L`Va6G zo*Q45g~5opg)S2>(XC;_K0A8eXN@D}V~w^EBaNGi zlQxXHyY`>8>-0rbN7Rq1kTWtni+!(&8>zg!eoutd=B9AGa7ENg5kRwxdHtUuAzLzSo7O zIfz@F?e86Sz&@Xz#88M`%%hs+5ivyV<<3>8Q(b5NpZg*BEmq@MH)GM8uKrmjd_Pzis@cP@PWcreAe8&(I z;xD77bQ(@8ca@9P2OCn}Y&rF2C6cYbDE?yP%>fwZ<|kovAvfA|*S!)=`WR4n^<>ZV zWTY8Y|6-ah^sM*IJ`0I0qSFq4o_dVGJsWD~#C$Vn4t=qEH{ySFXI49H`tq<7@%>1WcY2E>=CTpOxNLW3AMOY)!52o;}(ZqknhQ zR{~qGdu~z}nw`i@E|a>g)n9V(oe2WJZ#-UEyXWG;S#wR~u90~2AI$n!6Kgu22|oE- zxy@@dps%R1eEV^=ee);upn(-ZpIY%Nn-3$UQgQsQ&V#SmeIEj%#qY?CcNZd>b}!`Z z4$wRq(|AMNQ2*W7;(G*yDJDjJ!Y{lndk*#!HF>@3jiJS)4-3S(5xsJjTDYNp^YZRt zAN|br+&T4MAH7~h4w-)hy+jq3W-uQIJBF5!!bMHWjQB^m?}&O@FGX`fhlYRp(;`k? zns+mTN|(n;uip_5g3}qnR^5Zzho%ui1|h>JqVbW~Cb=*A4Z)fdOD(;TTRAnR=X-xI z-?W@O=L}U_?fDvb3gyiEB=#xX40yXMb1q5=wdbSMr%=%1(6=yEApGtv^FTjV09dv7 z&5iioJ)*hySi%Vs@<8VI^?Ss3F5PyNSajzhU+OKV^-3<2(1whU!{s}DO=%BjlkLd%xN8q<(6JL(K6NlSBUgej{gg(>w9_Xe0`g;I7ibRSi$M?coH5BHsZLs9zgRP1Hp@c(TM-4j+ z!N$tt?J{$s4PsS3JA8o0!C-ua(6ISx0mbMk=# z2{#lbxka=!+8(?@(&&h1>V+fu2Da*e`0WbqU_1%aHpOxS>~S0)I{^0-CAwyJ3v8@J z;g6U%guW>#KvMDY`nr?bPuFf#1%PeLC(@r$MZ$Tyu~)_gRQhLnQh+Rg8N`4oB`VFU zf6q9Dzw2<}te+@>1MrUU)yd*JN0O;IPuNFTn1WwU69uMJ?N>_-pp{FF)qH6EkO|x)NQ)t{{A;3y8Tu4T zHP#@9eWXm}W{IVOx=`cksSb1ROcF2_FtGXK>V={0E1P9cQhzWY;4;|z&SvAjD|9P` zRD&u3L8OQV+ZU-T!9S0@1p*TIEiRl3A~d$Z zZ`WW5q-t=J4}c!Lne~9i%H^f)1b|*jeSOsCqZE>T)CFYMV)(M6&v1b3t3;j89nq}f zvL-~6C0z;8vz23a4inG^$PXqxM0_E6Z=@FM!wv3yfYO>SlKhDR0?H7Y13m#MqN2Y< zKtMx5dNc(!PU1)@ytisUEry}PjCs@4Ned4E017o47rwt#EHsBMIAHiUDPQW%=#f{^ zLTDFIFEi-A*%TY_(xC$4GwsAzZ#ZPgmz?3@9fe;2pkH!Y41v|zAvh^6uT0tg?x7Mz z1t2UTWiO2{8I1AT^?p%@3zR%09Xe8;0!|dhue4i#60N}D-xki4`tAAt z@<3%q^#g!?1Q4gcveI~b`e%CCs3-=*^rEx}Nw zvE|13P#X|VU_W#2#*#a+1b8F;d6S)jZpGqIOX~xNpTt`zv$uVYPcjPnl+7iiC0mo^ z-X>?IA^2-Vf5`&AbP}*{_OZb+iDZrPi}d0r;`|V}*At64&;)4? z!zrO2zK)n5Lh?vfiaJn^4RKEfQJm&j+ayFhKS9$TVrqQu#2;RfQgZ^B%7bfjX6?z0 zpYVHhoHb1gc~R@>uqDg>4c1l?hlHCNoC8+?+V4nPqt9-Td5aEkPrAckGo6F?AgYfb{tb+BD|?P5i8gfj3Hn!>sYD<_jQ8X#X&T~bxYt>8VGIW<~}C% zH(3K)uZeoEuTuS#l@1Ep8p3YWm!Nxw)rIvAb?*QFZ=@@&aMV41lNn$^&$L_8=B$4temhY4F<`S_dq80`;Cw1jc1YSE|Hib~C@olI*P zkb_V#{()A5O_++;2s2D1`HK2Rj#fp75VBwp6LTqwc` zz;I>S((T~#H(BsF;M#{eXTN62U&gkBi|~CYk14l&w*BFEN4)GXMfwl)_2F+g^EXV9 zMF>`=l{wyLKVLbtqt5>BWDA1~@|<+0)qTmKvaD|X;8feYVu>H;mp2A2y} zIvL&!=-z=xH-!Q0o6PIq9e7&9Z+9Yd}T&gD;IJ zM~F0^6Fa{*W$J&ROumr`Q}$*OOFuX&D%4n?g4bE|k~3=~J|sz3Q4VIkW}&ye?o=(! zLfG@nZ?EVxpRT2eD~(ZG2(QBi!>+e`dsChcj;}S|O-imiUND)?G^KZyA@(%gYu@{m zzkc!5__p_z;DD{jqx3AqzN+z$GWt71ULOd(&n}TwkdFx7(EtylaUXLsr?>eDun*Yg zV!JFNHJbV8g%oqRC}cj;+y~y=)A(w^n0o(ecYrOAKb29iexo6f@&5gN5c(LQQR>L@ zK<=DzqDKWOyh>8}?Qw_pnz}aeMtcO0|GrYL!{QusapDxkhhKe9CS^bqL}gnG8@sa}np3{h4$f_q|-A6%kQ zT*ZZIv8jTH@IY}*=7|w96j+XyTJeDQxoqYdC+C=l)pB3yAn&%PIvKxJz>3NWHeA9J zw4n0=pmCC?WC4Pmzs4y+gd7kf&H1ciXOLOB{d0qD7UJP!dA zmlK_2P--;^%Wzv;%M;HH-=Xfz3jjl0J)NE(gDG+kr-Z~#Kui5N@&-9P+zZ(-!*aTa zRhHL^_=-1NVn4bVp-D<=IT|1Vg_g_HVBR`{oeYmwiIkK&nV5KWXV@-z6U&leM%>YK zhR;u1$y%F3Sei9*&Xo9Ct-k}rZChn0G=8Tbb?-{*y<0ZVA%rtGwH8jY=qJ0&18@tx zSDxm+bau>%=>?_pHJuki!dkhCkFjZOT*V1~`mw*Uo5V)VAa{P+yq2>ki8D`z7LLQm zna=QnoNdJUP=IhV&RAu85a9V(-_TAg*um$VRB}=+izvZ}RxDJ6?^zZ*l544{x8DYT zwlR$Oni3Zpilm0tthi?haiOO+rHeLYA{eL`V-F`8T*c5Qp2Q7!FU&w^Z- z77o$J*qK0?`Pqe9uLZC61s#v523_VFz{KjMQDwe~b_OCY?brSj~`!zX^0i z+w6=s)JzAhw;cE^C;%OC4xAlVo)?ggBDo~)DJw2~y~d^IA(**S9qt4T)Ej%F6v{(?X=Q7KrPdmxiJZudsKPGH=E(mjtPR9&z;1U!6AvZl zjc^qQ=!iAR?lyBVP1?@xj0}qrls(s79gFvLE7_uu^g;`=?<~&LbVl&OO+PHu8C@aFaM;1rKC;TGx&P7_Iy@VG2_R1r!B=63Pp<}$=5n}IDISr92$+J7E*@YHoFvY zHR6%R87|uHGs(N1c8HRh2b?bAixk|)f0SyjcQ%AlH)}%^vxM&^u1-5b)h_Q?>w~OM zj=5Ec*{2kx&0OMSmdZUO;K#q7*cK3;kPFrvX*iOUvT+urs z7qlvC;boN!`bij_EO0Es9G-^BE^kRT@tz8navM&U=v-1 zDb;oOl3nk0@#|S{TscK=gME1W&xc^MMzd>S9f5vTmgaeS?S7{nk$+5*_G^o{6)Kid z@{4{ZP@69xNciWWZgx${mlSC=`qek>#21t5zG{{F%jEE8b54*h=6nk~C#cmgRD|EG zblG*T3x3XKdTC!@3U~dy{xYtZ@{55? z1Zt33SM7gYkNI}yZ2PUPyLev3ieJlb99N>n%lRKNg{X`Ri89v~=59uK6J*LS^vPV< z<>BhkUBzznqpqZznl!?Pqx-vWM4&`vfa~kEoKL_78Ik5y5m!Qzh>QUHEZno&w?6jy zjS)N7*O$bo3?#PObIbe2uW}8E^HzUvji5`J@OuSDQckg=87VILn}6qocXs*p{SsRi zNMdai(ew1b8F5ws_Qz<;(;6&Gfa8?^GoSKAS|Gw`#K{4{J+c0K6T%H*Z8j34a0ti^ zn%p3kHL`V4a37=+Wq5=SB-aI{4S%hJeAjO;@6RvccR~nHfbc>80s7hlxcqYq&WiI` zuv!y-kN$8ZVM`dx{De{2lW`TbCh4l1!8Zsb*C z5RcT#9~PKEoj;p78=6yZ=^w@fI<7-@Yl+N4gfe}c7sCfOc5Y;#;4}6d*r3S}`^uA5 z4}o?*&)5C-q+T&A`J@Zoy-D$|{w!ZqtqFj)RwoXI{g-oZIa;Ww9ez7_q_HsX@<-d4 zvvn?ZT8&csvyq4^)h8Q~h~Q&FvyM3RARl_OL9yb&?hZ${oOLG~WsGm-DjUXl+&o;{ zUaVsn@wkjjXcSlK%1*iME81~C>_*M+E42m~eWlI=qK~ikbZVNlJ^7igpntzHt^3@S z29^2Cyr12gwQ|O;}|kM_H1cVi>_-lW~Gn7=wS+q>A4RQsvpt$p*T=hN7broock_snc|mFsv{&d>6OB4y!cmzI#?lT8u<*h4T|DaXln*J(Gw|RJz!R5 zuwPl70>YtmkeZ!u>wigp{d4lRzkMnhhbk?X%dQJOsm&q#w?PU@FE;8zojsM^X)jK! za*M81WO<*1&o~du(*imDeo;?3enZQ~&NL>@ivU+ zbn#ih&*7KqL0h6O{FP1nj~MGhI^+EvS#WW>D?w%GNv&MD`_RSSI44@(!BWNi(b13Q z&<{4TQa4@vJ*U~>rBQ1@`^d}K)&QRN*nO42GYidQo!v7LW3PsJ!{myaqFsHfLm-@F zW0o7Q?|HsDc2@YliI-FDFftC|N4J?2MR5nF$2&Zaw@Lr1?Yj4h^_lo}8|0&pc?24L zE!_c&TYl)iexU-0DO9vyk=rBx9MFqJnRFj8skmJ-QP1rd*6KyFiXgogzeCH(rHZ9t zlecuC`1bZox)5h>QvOd)>b*&Lz@G7+dL?#Blk(IWym(@EiVX9OVm;xlQ(ON`A|~S6 zN~NC5fqCO^mbr=sHB;ricXsx@I#xPa4TdRdUaA2O>Fr&bk-6&7HN?>?VACC2jEv7STuSFCS7aA;}iI6p$+qo4P3)1}y*Xv%^vT(EbMb}r+W_7c- z4U5*B}Pl0M5QJF#R5leQ_ z;)a|lY1`S`^GkLrz+<_0kP7V%2T^e96IoA0jdO9;b6ArxP)W{?bZE_zp{{FXI(>yd78HfUIWP#2y!W>(N&)WF=`i<9L9f+5BSSMvVC<=oC zu&IQHjNlPoJbiI@|Kni#Z`}L24YGU>+l;Prtg*j|pE%*qZ7(nS zy=wcf#Ls!k>1+{R!$cuq6{p%FJCVOLGAWcGZyP(%8Gk?zdQ7o>O^JvPA^;>o{KYy1 zgH)v-Aj)j?M&BRbs{d}SM34mAvFl%hspu8{F}+d?oqbXvu&ohA1IOYgFA{kOpj*>Na4Qu{xn$6Ez0^O8jit zA0pO|jTNv<3>$^d^FhYSZ0ifPXU!vFv-qO|sp9e3ZNa%4uw^#S| z(+3ZPLgJ(p5cm)LZZ8AF@4}wF6Ph0hgS*s|L%r!1*KyJ*4tR&0VW|sm z={#7iiu)TJKZu_$qs(jQ1AD=_3oJmRb5@c`!N7xQ^jUZ)S5wK`2dFRM9#Z7Bz7VC5 zVia3y6PE3w(H4v_U4^#{|B6w5$O;N@)HmxDJBZz6(hm+eWl>fixy=6UZT_SAp?lOWa;RS>Q~G1L-9n0J^5BP|8vW%FUTu z@?G2L`5P(kX`7jP6eOuZE<<&>qrB~E|EXH6qZ-%lUR>ekAF-Vjk!La$E#P$_c z%MSWTlX8D zMUNqNK2Zh`k??hB#@V>Yo=*k*%|wek9DqeS!HV#kpr|(8ThzrdQH6Y8$?Oyfym#8a zSa!&sh>~+x!+~AQ8-O%Y4;8lSFfO}LOG`thdCo>xNKFa2e-uB8zhtreLs;-}f(*RD zF{ePj^v&7o5`prNBzL>w9rYZQq~>4R6msvE!7Vf&W~5UJkIKelSSSE*h+o z*2OzY2W6b#YMfZ9wOOxB#iKuexn$g1yE~-oS=rC8)fBPI^d!5%O2uzAwhot_3c3dW z|Ki^LK2cwNc1KF(ti)>vQ3vQF854zVTYfu!bVv z#2P!i`bgf%l~4Q$5vFg&tMZzxAoYNxbNg<)POz;|0|1fRW2+Qc!zV3LJ>_;?5K+*N z&-}8y_JmIb$l@9v$(o)5Hmie21Q@Gh(}cApfb7Fk38RN}mW7XkQ0<8ba}yj4+P68s zd;1-%oGayU(&Haenz%<6k-zRbdy|N>p|&N+YjNruWuNL!CW=)p9osIfQQ4_)dGWN_ zg{Uz#)J<+j=4@7?2<2gHQo>C=V!AIoSW!%;X6Gs4B=Ixz5zdTZu%pA1ageliO{nY+ z^oJ{1uNBmhtxMSIle!#+_XIIc?|bHN$7HQFTh}0gWZm`jH^skq4_EU1cX8`eMdFpn z51#GBtq*k7P@crdx+d(7mP-?vjlF$#z0tKZQ{>~`6zQ&YAC!0oBGUYn*V?f=FeMU8 zL+|c_pWk(UOv_@?#ka0G!^dpp^EBcQp{3LWJ0H1ukoWEbdM$*Xq;#7cTn&68B|>sT zOMjB$94_46-B-iZjs0x4$D6Mh*K54>&qPbvZ#}|J#%JGoYjFkCVI%WBj-*)qpa(={ zMZKE5o;}ya*H(GWX-`?o4EGn9EQ9(t51K{MRs* zWamMSkyj%=X$?cK><;2jlh3rv%wyb6nyAiRCvk?mBjoo;V6HmyER^GnF3mTMT3%~nc9Wf1rd+mbNg>MHD z!8L1s^@_*N96eOMZgz4tbx*&1{_CGP)1EzV3)H!MaI9Kc8zerIi$(-sotQD1&g2EA zACVj5(vNlGxStIYC+mmgza^i5Fj7s?WU9DY!0GcwP#r0Xo2PCvc_ zPaUpkhE^w%9mOO#X+1WocS7T|2T+Ltx-G8h-p0`FrIZ0w$Xjejm3*sxUa$iESo``*PW#R8oNe2>Mf4#G6O;&6CneU+-1WzQU_Pk4f^7Tu5 zp5gGP=EO0z`=izI4!jFwnrZ|0{DT7ZM5yvap86^u9HCv%zMhwvOe8Y0kLIb@(k`OH zWZ+}wQ*f`_cmIQDDEsien+C-9h~&0G;9L3q+LdCPllPvL%nCFu_bb|`RaoOMG>yft zaA(5yYhM?Kr)kqX^>7lGQdklkE~DI4qwO7p#8{Z_uUN@2drJ=IUz8Im^>!x1 zVuJ!jcE?t(8HdeuFKKVS?1I2w!{-()B^*9lkU6^7(Y8Do46d-BvD+3^kugnO{1AV*kE#O-h%PQBNykAXS+tNQmr z$NNLYVsHjM9X=|BGw2YA<^gJ?f5uS#yNGgJLOG5FXV3-lf5o40g@eL?8|Yh?KuOOk z^dumw1If@~2&7dh5>!xYCF!(kmbWS^gVI+_v z@~X?H`pC3g)04cg2${CzrZ}Owyg~Pko;$^<_8p&VZz<1TI;-4y;0@U)0DGq8W=dM; zyb(0z-bp>#R_=Mxg?ed+Ca>DFz_#NmWlQbGmtBmtSF5@j^6k6h?Ny6gx^Ue$?|61k z79oK7x^AtTt!ahGimq#(CC0@){v!48Oxf#xPcT-qkJf47OgR$ym>7N7F0i z%h5W0VAh!!&%O*}cyE8wW)7VY)O}Fy1^auYcJ-EcJpG&s7bpJQuN%# ztKX~s1tm+}`sXg~SfT{yX3&8$xKS3k@*HV^vuPe$B~%99Q_dMpOmZ0BS&$Q!UYXxA zoObW5z3tP6+8ayeBl}f4^wy8m7L-R{9!XERaKff!+7WG{HL9fo;7^Rg_Q&6~qc-(< zw1uv%qB+;o%gI@7qdz*B#V;pqdmn|3z%Rdegt42UGA#Y!)R9QN^s(&+qB6y}F7R49 zF(Oz9L}q0TmUc}GOU9pnCQj)>-4H_glF3y1rdtr`jeT`zeCQ7eoyZ(NjR! z4_C)v4NkDq!O0B@mm*bw%f?eS^?2pgNzRq2$a~@u;Zx!KG5z}^NCe)OFo^)BgpqHA zV(prgg8S^+t;Fd;$%`uP)5ys;w)aO3PgQhogSPycUcG|9TsVD;{d~WLmYM5Ir}SD+ z%IgD*{$=6g2g`EmT;A0!h_j8~o=z_IJ9ts$&xBB-=Bvq!OhX?3N*X+1PF|V$RWGVW zn)q!{q#&HgT&j%c~wtniZ8seMDQwWs!l%GB`FbMDWC1Wd1HUGcs@rz62un>cC8 zRnHFStZaB|J3M6*3d8O1>!JsfR>ml$> z1V^_trVO8r#qDbNKt6~^&3+&UM(@*Ic%%n8=vO~3P>WNTl=gWxgz0yHiG3f%=Ze9N^4C+MQJE8na&&|H zxs&X3^Y@o#W!X9b6D*e!?_HndiG?EKOD%P)?*l1q91*qQU6(r)dVtol~d<9W&Ysn zw}VkS<)eJfZ&$UvbQkk2c8sKKSsl zT0hZ2;NvZnge!MbyO)cOEUR4;52S;0Grng(<7Jj^GdC8Uox;N|$Qbjr0|L~hS1Sdp zlAR2cCLRC8eC^kAtpCR<6{2PVV3ELA@7!Tc61vIt=P?hRItG%+Kt(Y`X_4Zy zba-FIZZpTk=>FQ4`)aOKjLXDq0(Vv&x%u&4@T%*i9Y-0HDgD7iJM8BR<1w_ZH=gN_C+hPjxN%F?5J@*rs zwvabJv6hmzejES-k{Pn`Kuc6!$huYv=Im0vG&|v;D@#%G+ur{iME`WIqg2PrcVk}3 z0_}SVz_F56sRRn3BU;GdR$|2SYOTLxfL~XKm9Jd?Vz zqw1hK=D7i&XU|DENPVkJp+wapDDi$m{?dWa6+8-r4?An7v+cJQj%}BgMllU#8px1; zZI3=3tX{f+@kIcFzkof!r-&#g(4Elf$^QY^)23ZGkpVAi+%4l#JQVc?KpOWE!aM3F zYstZ&xdRBrRdty;U!R*P+{T$oO_QFWQZ*j<1tEalc#RAUk}V8O zHOyy_fSp*!8#F+hV0{#LqQ7~!<IBveTG1^G7=rUF+9@u1j?IEx?&DLAa0L1~2zFM%iSHGQ5 zeixLKk#2{eSJ^xkbmQz&Eno)C^74VCiFg-trzzL)fA6X5gxh0 zM@;{+_3JG65miBb!RGBI`g~WrLu)o?hB#qKdqe(rtR$0kYs-*gK8pf$|222{@k3s zy^MA4PN+FAWDv-xl&k{E3CZfVm)c&yl)d0o z5RQWWhS@m!dp8LcDLV-=Gf@P-H?f&6CL~PZ5^WdcA$iK5b(YBhj!LSSjg_trty&Y@ z8V(jF0+R4vV~hZj0}iMF(AMP&vR`m$h2l_?p1g$R=DT$j0Lujqs?$kc8!lM=31#r~yi6L2(}W z`i*->zm&E8NLoW82|3ybUI?#ea_OAU8ZwSa!b4WukjykiW~aj$(^)F%j(vfDTt2A4 zeEh$-d-HcFAHVPaoPDvK_MH*3giy(n8bXr2dfPRvmQu(%wi)Z#2PK4t$X-LT(~v9` zhR7C%QYfWGwBUR8`CQk1T-SYE$NfEy?{DAx56E%&VJ7F}e7+u!9+XJfY9c|*s8bea z&n@JmiIEw;;Wns1M>46Nn<*8R80e1&G$-%9AT7pI3ABc30bxcGM)zy0PH^D&aGjWN zjez!8%>#g3C|YVqE7kT;7k`N@myvmv0H*zo+54~+qis8G3(YQpB80aVv6E)r6n%2v z|GiiC|6Y(PSVo8IgGt0Cg`{z<#Znl z-A2SY{u-undlpG-EAkk^p=^42XtkX7sY3Z*yl%ceFYKq=$y*O|8%J>jg^AsUG7I`wV~ddetZNT~NeGu0xFcJndZjyHlXHD)AueVcmq_Y8k&e)UaDnv6XYc2K!^m0RpwM?gMV1IGWD3X`?>>^gkm>b3ny zIS$LG*~-K{u8`u47I%2izSS8=kjj65y)#reNG5=}d6dhHp>IQWgPWI(OK*NTCKkCZ zcx#&Q?zF>ki69{0?wek5@y+hg9oP?QNhf;GUV}*X@N)gmQ2{mOK--VfDR|`FHkFDn z04*1j$tQE9rH|4bG41bhiY31IqrczK4&Iw^@C%%3iuN41mDO8>d#p$~{7DY+U}N#^ zd3smKYE3G>dSS2JEviEJ34}0k7E9@mkUyM$Cu{2gl8T^X6*Na4|#07rF-s>KF<8@z&D;#-r40W z7#?=rh-)%I7NQTG**2RHyd;vFO(Q4PFq)a+n?`&}#A{O*FI#~a?tM|F{?ONy%LWiJ zK}4vas89t|juYwJ5UE7uwTYHprNc(DU9Pe4#|RkliKwbhlovg6_@bXUgX_7SLM91u zNX$i^j;!>J0d+-})?&slUUp{27&#h46f=+FvPl9gl*N?FaB6D-FE3tWvO~A+6rhX# z(1XFIBS@-k?DIva1w?(}=Wox(e7JZGl6w8#?beWucIL!O=z`d$tIL7@F(f3#^Xg`8 z_!6CVVn-MJyOE&DLg5zw952&zNSY==GB`9#R}^ZJkosIr1(KXG1f^h1W_f_A05X+B z>kPb}-K0=3;TuPjg-lb*<+M#I)`+E0(UjDf6XUrNUq$5=wx!fJNvv`bt93;=jD(&h z2`}60R_88PZYCm%Fm+|FrrNZ0dxZhdWP&JF4v6hDP4E#*lT=Pwq{-f7BK|Z;K;d|w z;M88_)S-W6mYA$$#4z%P;oi{9R@-hza(pW1*paotD6F;2h=D&-GTmQ zn&DZ+5y33?4@!uq7vmLy3<&yV--`Fv72T$1JPGtSVur2w`&+FgWkJ6`Br3q@x$F*2 zl5Lh~v4s=8+)pSWirHDrKz{>U+}`W{Ivg)O74Qx#i*;H7+TNOq-_SpvIVA>c6A=FI zT`UuE7AgeO5k4i-m6M^DxsGQWAHSh>-9ObA{%kW%G!$OXcF{@9y521D9cn2!ra_OY zv_6+-9_az+FIRDZR&#ebQJ>a8e`iuc;Q6fmUXZ#JJCoy5FA9rp%qiW>uGR&q$I~7K z`g_@?+-jD9j>Ur~GogU%s}L6fahULAUKKy4I???PojP1jsb9Y>ZhpJ*+iggMnpENb zm7VXdh4%Dy8PEggY+=uR4PNSjIuzWlW{J?vocrs(_B+1WbbtSw6f#sNfeX_@AS<-sBeMi@TV@c^Q+&3=!CXC}Y5rN2-PD$zmL6mhc2K zmz(qU>Vq4=?Y$QwgniS!b-^)4@_e&ICM&{wH0e@qp}i)(>SB@D)ZHpM{8nf(#LATj zk$2;6suAvfT+oMRt_imawHX-|7qjj+n$3+6HV65Bjs!npZVCA_b-*t=DcT~Wm_>$t&3OQ@ZWfv|RunO+zib9Y!?w6x& z?u{R(6v~;589mW*(#_I~*90tz>{}$vC(B8p@TI2GC_JO6MIz6(w5~bV^q6xXxvWtl z@G`DS5LbQYBJE0&jVbib!nP8!y;1Sb--F?jmDN?XcPBhb;c`VkE1XOhJPN!I#yg_s zpCy={L!1w-Hr<7i(K~5cTz19@H=tUx2{kWN94Z`dPe}mO=7fSk{|Lr|Pf4=FIps75 z1>F^=?@IRqP|Sjg-0bn1n+Nh1y$wE-)0V}Nn3bB#eHDSIsIQwh^N1CVu7iyhW zxEYdYqzW2H+|Ca4Cu^cZ0{!pou;A4e;Z=T^h$JUfN%-Wi+V?9rLL{I%ZAI3Bys(Sc z+L-wvDxev${?^lsT&IUWdg6VKm*$>^YLxXntrFO!2dz_lM1x1zFpTi@k$5qr*Yp+5 zsfN(g3LBi1aMLIq`aN|?z;ESIs$zx0w8P;_9^VhC(gwArbqM=q2W^7~u_~bR2`AU& zJJi7I+LVgWR=$gu%dyk9lagiEJ*yvL?j8@T`K8+|xfGCE)#zW@jL@o!GmWy+%qeP> zu#V({0N1bp8Q7hF8MwYRio{VJvzUkj!cJBnc_&%bT*M0x=sXy$r)HMC&q??!62=*_ zqe74TAY7Y-bY)_$sDW2r^!QQG{x48F4k+lB^+*H4U=1D~4u|%u6e&O$`m+28U|@YT z?mopGI)C`wkDETl(EcbPRzKZ9+5@icn4WC*i(pMh3uJcVX@tKhGkk~~9aD_~K zCyU3oKCVZxF`)Hv_{v#t7lk&xj{E(0r~VXmRy{uPf$>9f5IdFhJbs{l&!eUM!J0iC zl=a;3--E>!cgKG_OqjR-$R8Z_#2`|N?~B8qO%DmTNcbKb47zyj@n!bc(55D?rrf1L z-qkx*S{3&Uz%ZBL-{%Jm!yPL6hNOIkM`;ZO$!$o(5$RNRmrG+uRh4Q4yNcQ*uro8L z)jom?%~`A-t_pj}mpUYy`k?s3OTPAp(0c6;cF@FU7~xk>KCMvbJ9xs)K`aZeUu_)ZA*VapTZR3@#8&z@-uC&->XUQ4!D~eBpTs2j;j>f={if05eSb#&sh;URHbh))?Hc&e#x4 zr4;7!OjHe*q@>D-N=%)X1{#Q!+NTxjIlbjPllRGCDy{deC8lZ6LKB$UxKPJWscYIQ z<>gEm6~k|uX&UD8m@)yuY^3Tke0mV!`3ZJ-MK3lE>qWL*K1xa``k^E2)sBmmnRME zskrx&=LK^6_2yaR*FA$(XAwQE9275?TMP6PZtR?xUp`k<-#&0RVp__27RI>;Hxxx+ zU(3(VLoRM@Ls389(LIBlX;1pXmAr1lH<~Al8KJZ2CJEXaQ~%SPo>)!YKzg12+h%DX z&TYsbt;((DZO}K~Q-vLIY}1CLi@w6ZUJA}pWAVpUn}7do1bUiu|29I4aZCf^>0=(- zZ)XPJuhqfzrul0cDoPub+=oR=BHjYos!hvaD znQ>k=E!Ca#o&CBiRo08}=H{m*I6wBS>Jp4poHMf=kov~x`NC-5@;&Rf5Z5*yTtIa4 zG)=DTAABHAUqL!4c(PU+uFfIOV(Dq`t2&`S6XzalyuK$6fA3OgdhS_&bOWjQ|%HxsZTbCMPCnQf27Ge1Dusl%Q*x@(BTAr zi;{0???_&Vt7)_QQX79mC;9Ap>%(#SKjRR4SM6C#76SfCO#EWUn#GsYN84*ZE@8*4 zzaWp4*Zr0i5O0^-c@O^*ot&D4-NTgU`v@P#eogtT8v1e1&fb@Q`rse9zn&FE%IJSn zII|{B|I~N(@=eOaLpI-__X|2{pDnR5rbDxpmt>hesyyn{_TyZjq9+V+3DjjUusypU*g=) z<&;I}O;`Nf#%cQZlFxUN${+>m2mOpB)$w0ge9-kTI9g?JmEA4!wci0Tzpuk^ifg|= zHbjaui&>w4lEDz$gQ86E_jA4l1Ql&y`?KaN3G%UFn}VV)HvVi<`Ow|{G%sc2Pbl54+ck*)65aRv9~4B(?3E%s1(AIs20eBpbH z_^Bn^V$)O^)4Ws5_6gb>M$ZVPdB(Z>ObeR&Pks33zFT`FO7h3Wv7q2xul+7DR}4?- zTwn=EI(%|%30$2;Ih~%);a2Pl_ddoqL-I<^Q)Alo%ewcZN*{@r5??fUc9XiQRmY$p z2E{8apS`pG>N!$sbq6hJ$MB9ywtE~eEqRIf-_uaP{*OfXe|HK9HmP6e3hW{WKBs+l zqFmhp|97VVk*5K#nMo=HZbZuni4w-lju~UQyXk!wx^yJ4)_qw+oO&fBfZcC*g#pGQ z&*2X>E<&s`x*E;?w^LwL^*@~g?;)oE$-XQq0!6E{qfn%-z||m1JJ2OgC}&k5bciDD zurw<`^ZY(xEbZS;fpqFmZzMof0>qIpZ@w3Bk}>6PtKL`TKPIwK=3?jlpQap$v@-*5 zP+%_!pZrg_aSjOq0$V$hJA88nae8!K1!3SxGxa{8Kv((?xj-g2`QJpCWU}?gK9&q$ z{$>x^1x(xy|6qFb>m!7p^vPWm?;g@f1V<7L@NVai14p<|y|mIrYVI;whU@~n;3h^g zp?EEM0P!7XLi0emfs|vg8!+O9f7j~&O@u?G4xbY?nYTOsUu*THK%mg67kFo5#Zmj3@w{QehuiHeGmIoT9T*ZnjlE^5hy5 zMO-90{J(_icPJ}HFIYK+#9{2)d}G2ch4gFxp%@@#8e#x8kGx?u!DQDrg&TZm*b7y* zftVB}nYbkt_mpS}aQcXE1^|jg`oD;)Y-Dzzi?| zeX-Iu9uwFpd$dIh67Q~X2Mk1*0=`Cg`vF3^kw__9cAp+MeHR`Rz+dyXVE;5_MFC(n ze(X{E_F|{`@~PVnEq^@&%7^IZPR0g6o`LVjzV@T}UD><2Q)B3gfUWNWgn;Qp0ArF- zLhJ*e@$DXW1Ogz-bejMMBK20H4qT&DSvTC@mVJ}9`(c-mf!zaty{jAUI(*1$fWuXF zcH~dq8*`Uo-2%kRs7Ki!j4bAa@Gx#=^stU`3nbcg|9!UjN+9pq#Kn< z(OC_GT0IHGX9#A0%8n~Q(L}F`N*gT|>(LEWkc@A{+ixi>*gi_vH}7sP27qw{-#Fnt zV79ZwocD*uu_nSWP|QR%K_#AGNvI(b;Zn!=O;NqpLRg9_+u_I>e@SGSrg_rDQMxvg z#fR6UCu7Z@NNlTf!8GT;faSz+JBxF?+!Wm%^crQ=utY7)Mds+e>?cSmN}Q0mEbpoi z%5MNGiv@_0*k~?*L^MKW3~*!W;(!!BxoKShF?jxoPK%$LKbECPjA=uv)`k)!Ztyl9PyyJ{O*t2joVWI+DY(|s}GK`qXhX=Ie?yVpRGNY};P`bn~YtdA@R=&|DDu3M!nGxIyQ^ zy%ork?>my_hdbtLEVaMA;{R6f>i>G4Rmzds^%%K}29l=-vl)2Y-r0^`PC0-Mo=sB?6qmaU+02e4IB~qu@0v)~UeR=EB z?*y$pCLj-eKuQ#B3`j)@1gH}A9jo~Z(gbK6G};kdTI&s|hT%+*yTFJEBlH4?`_rH@ zuq1XAEis%H!`KTg*o@H%e(BpX5+a9sOp3TN7o&9LdBrD;G?~BON9-?#d(s{n^A02v z@+l&}3xXHiy1e?fp9%zy8OHLU3guCi#&;Os7h z(6wt1v@$+BIJ8-p6Po>;A16z7t6>x-6o(O%n)@M|yY)`5v# z2sMxJ516wt56(BQ7b^8F3}8Ndh)ok%n%;Zq7F>cArsQ#o^fIcb;bpMF zpPcn?Fd~nzhlc~ zqnDRp6!BHzF8n}36xk26QReooOr+2k-YP0qqZD++!=>w>%&&25FMp^SE8^?HDCojp zjvn}Q`0{xQ`i+uHwMV2pE!?FSQe#m@QGRDZbiYvuG*xZBDY8U|u^p&2320ZAm&*oO zO_>4>MRX`GKj}a$BV1oNX3itLp&@X?m-_sR#})~ZLvbOkVdQ;rN;wfO7_OG_=$c~` zx1~5JMj_6mJX}Xl06ZGDLYC#C&LHNZ=XDnhw=lo}lntCn@_WgB)8} zgoxWIPlOPbP_yF!=~F`=qG%ILtmgi>hvUe>d!l&+#EDJW(u9bIrF>UtJlEK`Kw7l7 zA0)yI|Ba4QB;oI1lgQ8m4y9u1A=_6!_h3a{xBaHZTJu~Yr25IGLw7y_@x&gwER=5P|?fY;q)nVDA#se$YpW~7MEopPpCdgjCn7n4U5An1%l%D}5 zIITHwkPhR5(nCcU8?RgsN4T{3z8X=agJ(ARuQ-7xyF%0+2;YA+O9yuo?w7_?0S6BT zMqF1iYR=)W5S`)x@Z1|Uy(ltxNcLymr>A_c^*~onLgQEge5Z&fL+sG&=2(tx;hG|! zLjyNI>B6I@g$~*1^KA3TCxw3#THu-e3w+yaw;KYL1og;~Zz2`fav2q(*Thrqqx@oQ zQQZhXZQqcl3Q=gMTt7zs4Z`<}6}dRzPWIo)7eiv7In|Wm3<$)cT-qKzP;w=|8s#Ud zPdsm))-4WDN%Y!_48P@~e~EnKhx8!R9k4ETx8_(ja({NRLlN`P?jg`#URAvqk!nlk;c=p-8zhw{7npbp2o=weV0`Q!)m^{HP~zbi${SykIp z|gcEJUZhx1(xK=nP1H3!j}y45v58?(p4D<>V`E7!U!YNb9n+6LE#lxC)xYk zFX=l;c-NE1E}OASOjMu@M3e9Bhmm9CF-m%YB(TNExq(X6c-}}J#>kN$xGFVeDApCI zI*MSc%Bq?&$4cF~90xYSJq%K7#*vwtZI}OX#Hexg@XH0>A+=MraQxGU3E^4hnO>vPsRs=s@1*ymr0ySKk9{aGbidg4*S zm{*PnHu-~FdPpl@TVOCHZSl894+A=T#eBi=?=$9w?p#|4_#6P2O7ZYxLq|E7U=i%! zpqB05)o(cy&jh(GA$Gjh4c!4P`F0{&z&Sns)fo=2LvFc!+p7Y>!Rlt>6OsH_EPWOpd& zFm_+s6-;tl-@ofxuSJj$Kh6t>%dz|AY+<~%Fz)&OLRYv@QGa>08?$DRN zSqNBryX2*}RNgEQP-6l{Ali?CiH9gK1LMU&nK7U9uEG5i{<7n@zMfh}C-n~uygcO6 z-q=P(`5ph=(3pZZ$nSz!b1(^;Nx=7LcJUpIe{A6RP7)^b=WN&c*3TbXYL0iTxgMQ* z(cU!8`V%&Eq9w5Y#h|<%YuobfO47i0%X^zHZ1l{d8JA?q=j_ct!MnNJY7TZlX(;kp zB!B)ua8-+V`#l7Iqm1Emr1S_ZpxG^-4I{NFx8K`YY6`ts%fGWVvSV2()!(*oc}Qo5 zO`dK^|2?cZ_43Q1;un`kOn6>$e_-aiwDsN|J**BIzGy^rw%Yozo$_Apix@r>F{a{n zn`r0|G&SVDS|qRD5;R6Ww5Ri8>P?t!{T}sK)6=i)r2SO$Uww8Q4p_bWW_d6~`eoP* z+k1W_u=KH|^hEgTWhI}JO3n{yTVwxljVM=%8W8TK7fiqy7>>)y;E|wLI_S- ztVF;VPf{lf`d?XVmm0OaK2tE3Sv8E9FCA2$>B$&sacdadq0dZhQ4upUFbXbBde+ns z3~8XJ%0)YY2cLaPo14q;s3y$i&HbtoUHtWor+*HRnL-Q)jY)G5 z^EWVQlhapbV9dvS)~|h9pKYmwH+^S?Wv05H!OQQB!nKN|ug<5E9*FRkak(y(^-p<| zr!Ta0sCDGm9J{!aKlbg=n~(6BrSLqm+@QV;$J;3Tduo)41WZfn?S9@gaVAGwu-syh z1LsHna%I>mPuguC{LEa0pT#R_o{D_9cx4o8z&`18bxD9p`*ZRG^_~VJ z=-=*>3}VS+pC2uFe0C{*ryxq>~-rm zWGXIjP{AA0US9nSy^=m_m0UHEwC28MG)!(Fezq97979>)9a^q>)(qE9Pl)(34kfd0 z@$lRMHJS!xh7M}zqGxG|ICofMM0I(!vF^Nm)4I&mo_Y}e zv@jTfT{?HAEZ+7%3(V>L5wrwt_0Mc zH2>gTcxu$Ig9A(h(pRm7JV(s$U9-Guj4uYY71V^^0)tQsYf;vNro{TqlKs_}3ls7V zfYkol(AU$QKezXS+>Ld>Mufpy>FD-9O_0RmraIFA7s`Xcl6Un0ySeK=OkZowo;Slzul$L@_; zn)Lr7!m_*y6Q8Z)j5d^u6_l-#xG(SaneEO!`QEzFFk%~7DR>F+u(D=k(zJm_E#dEM zE{W4Crz%g^xIfK%#IZf4loI0I>#N+TE4)B?nfK4CbA!)Jha&EqjDkE@3K0)E-&hyu z_4&S_nWSr19FMG7e$IP?o|K1HnF3wZ7&uD%lnOGX;M`z=VHCQ+k#sbw^ynS40tt`* z4FvD}A3^Z{=t_uv7b%w&?7z_B-tkKD&-mv_jf>xO{!4(%V!vDkpp7fU`PP?rUWQ%u z>JFy$Qm6{bk4z>Op*TV8cVUH_aDW29Bb6`X5OS#Kg?k_vLP&0@*)N+2VgagH83n;5 zW7)(!TWkV9v?oWIb-$|u{%63Gmqn4ix&rEPdCK7g9hcZn{-=35Pa=>e#}$@(oXX)! zf}j>?7JS8ZDQmLlNv*o@?tm^)gL^` zvm?gwA@Kqs)<34zj-AEdLo6fv>}*IKyI{Npe~#gZNj~tcZ|Qm?!k!!|cK3wfVVD{w ziP#m3JZ&$ES{pjV=l*q&*shRCJBD7APbL<vB#n{LG-h>C*4E@1Njq<1BnD8F%X80A;Lqx@Az}e;S@;cje0j>ECEDk zJlD~6x&6FwgwPcG&{xG;S$UXR=g5(12(f0O+wW3t}lh`c1^@&8Nrz6e55l$?^8=T+xnk z0X-Tq#E-miZ&i>Uau!0VWUfrCJ`*{d#FF=!uiC0}M zYztMAhBe5^KH1@$YeYK2!tN{SR z+5|?0U+lEn4eMx0k5B#_McF-}rz738 z0p!smqv?Dw-Cb-woD^Z3m=AdtS~DQyLR@$W#CT5-dkUa~F`?>@vguf&Kwd8kt?w&0 z#6|qhG%@_ZuMnoEKPI$mK`&a_QjS~DTnWnp&Ri(jm(`4V+3=MY1`>3U{TMWyoxFv^ z26r#y%LBeK(E+;v!w?3zlQ6+TrCp7FDQ~`hA0xMlqKE^a(Wp%Hy&PdAANTz0VO}~= zaiM$vJsd^tU4yV+NvaW&`Vv2}SWb0?1E#u(+JG-r#o64!kx(qN;n?lobt6Z!%{8AUVPD|UV->LGss9eZa-OK`@FQg2-Oa{YDQB$>$04z?76RNQdr|Ng#_!Aty-RXNyNOr> z2}rlVZ>}O6%^xdujxZ^O)o3$@{=b~}hIbwlM<1YL6qtm9M7Z%v2IV0(7M8eH7H8gR z|4{J99G*!)8_Ofy3=jsb{Dgcl0rbd+m%T8a__&U z!R1}jSpH+mVqa+gobop{KTb2eYLs}a)IrT7Yib-n@=^b03KXY#GS*ZBj+Kw{P%0cj=5Pa9iE z7)ywF+;TO6`#UIWD|zG-r*r;UQMSp6NcZfLv<&HM*4;zuVKj z%!+C$>Xluua2iKu5`69n*1!h<7$8L&VMdMR}1ezOxHvD4N7QALXgo2I1+ zgm-OhyB-P>Oh-SHf2_#tqv&X_+Ndy$Hr+OqL|SQ#@FGuIcd5k0`;zTA?B9q+xQkED%K+7igoy<}p-tevC7b zvV95_%!sz0xA}80;^UavZ)o`oN^hI+DH6E`O%;8RT#7)brY=Y(Aq|&opfRs*PR#aO zoT6>?^SIc90enh?%Ohv65}VvD8Y!sE5NQ83@H9@Y2;=QZ=oNumD!YH;*qCuH`%Vaa zr^Bw@a=oI=!_V>!oe1ZYZ3GEXcsi7jYKQZIsjdQ6ip zxXO-txXDLnBCIpR;eE;KMJUW>(slsmtZiKDI^TB?-a=2=u18okMk{4-i?c#3jl-!; zu2ceQltxiM8??92&C}6;N-Sm^^6vVgM3~&RnIW#eF`O~823z<&Y^oBBm!HMcw~o#w zA|hFQKPLpBwYHpYi27MX&YE)KLG+NL>vakbw957zQ}`N>_9A2;v~YV#k#9mQAp7cf zdfKB$XsMqVT1hH2>Ur!KTC)=j?-W(p9z_Z&yZ#2UAROL2O4sU(m|nC=Wl}S>!;~nQ zkJr&sIP}7~40S5+r5tjNDEtwNerVZ7hk)16bFt6GX|0|95+VR0>hoT%!q~Xg%f>v$gG3w?n`N>oa%niR;?%qt1C zu%}0T3A)J(qzLKeWcTmu4TAfGo=LogmRE_6I(W+mysgpq=-JG#PD8K-^kBwS}em^iD6^c5^Z@FVG@(|y84jSsnn*La@G7s2hg6iG!| zw?ZJdZ?Bh2e`wybtPmaF@bXX#$WZ)UG|It=J|KT<^3v^@P}jsVC@4hSu7_k533a*2 z%ZaYzBJu+~jAZz(WnDY3z1tUwxC+k!(YHp9!rL{YTsM)6z)MhWj?jk`&^ z8zauVBTp89kU8p^OQI4=|9vSx4R_Jv%-2iE_G8d5!XwNsBu)uH)f+v1u!;qbv%BRH6%RdgPF_T&AiQKv-i3!+brxJ+&FDbiP{ERn=t#D|$EDYqgFWPA7-z{CS zx#x5T;?wggW$GE_p(`3U#bD9iB%CAc3faXoCp!E_2(M}tbWHrkDV4WBvwqYJdbsS= zCvBf9@34SNk{CvH8Z&ktJBD+v+iB+wKBnJ zxdaA2=vuLfU&}py;P#O`Cj9LETxXYRi3-}yysBQm*s@~buqth4P5jQwyH@%Y&{Xba zi}UqgS@K~PPd4iWrUi_^*nMFFP#~^7uU35+v#aVMYz?>VeXpE$BeC?B#R~LK_*{NF z{}6@WX>fewfYNz>rQG~Z-RT+~j-&LgupL!UXR^NHK=suRv~y&E011~U37DTmy;5z$ z`8|)yZ6A`R&4MZDj76JF0>V>*R83|k7=Z56w^D_JU-#9**cjU>X9vee!3N-;TcP%? z^#LcG6Gf52Do!uPn>D8e!k#;C*JnoEeq?+b_6Glu=G{~oSCgvmv@JwIo~TjhzmIik zRJUu+77i8&X|UU@S4?h8#I{toMhUOoF&P)Qm)xd)78yczn%MD1KH+K}!_?nhFB?p9 zYH8pzvaRY46G%*Qe)zMM^E*J1gL9Px=&BX(Z?~Osd92jQ_1=P%co6H#X=^Y5Pfa@& ziHEc#ms+|wCze$gmZsaYA3Bbk)lNTtklVrinrsCkCqA5cQ&GM(Es!Yb>=%qtqt{Iu zfLny-V&RgV=T1fMBe8AQx4WB_pyD{YK`C4S5-`sF?(%fP3|LxIbU?%f={CpvgZVwGY$^WU+g>0jP1Rjl# zAo+E#$sYb-slM##Uh<#b@VC4)HSo^P8k`Z=mnH=Sf$e3BeY7^-INytYYxuV;UW`%y zCn7IP6PKikHe4{Oj|K?DRBBghZLrZR9Br7)M35W=>A z8Y3u%gX;l!<%V^zopf$h#wYRAB$rNgyQc6~?NtIkm5o_YLqWx{2sXBm#U*ACKH%J% z>=H2(a-O`u^Lb^*lw>Dw`?2kM)@@X>qswsK%H!Mrht$3R`S- zJ02PC5$5HNJu^gbr@(2uzJ1@oh|)Z6w3Ti1p+#@CT*mD&M|I?+)ToMhj5b%>M)ipK z%;BU;Gq#p*_n&bjFtwhU9PULK8TRFW&XTriQ8+Vw4@ zITqhdS07cHPgd`DJPV)5h^aE{6YYGK(&bmo ztx0%i^8@vqKS{S6YbFpGrSd8F)oT%(zo)~jXz|2p7?38G@;ZJ-poMYY;%WFNu9@fZ zr?i>)6YGhUJ4rJKrv&K4%3wqA4bLpJM*i-bXmq0Db?R)8bKbbmu(}b~AopC%%01te zdPME*&4Sks19LFV#+~+Yd>f**U{ooi3w5>ZhQajHDS@TsD4xPONJ)`tIk#pJCoD5( zeyNmyRzRCrE3GjBNX{cVxfJOf#jDZ38}EI$qVY{Fh-iS7&lgg~Uh`_c-Y+u)Wd!O1 zvJyUc-|oX3NT1qKvyzuqnWKD1X}B_8<3qw=x$mbj;{6X*hdKPjmMN754gAMbzY6}8 z7tkzb`m9SI;1=|3&H|-(viX5W1AhXkuWw7%eLB%UE*JR5ht{HxxuSpcbe}_w!TiU$L zYx?xX{as^W^GUuEcQx=VeJQl>!Skkd?$PzzeNWlLex~L>WIDXg?~N@NtG)7h8JYtd zv2J@sS>S1l*N48s7?io0*k7%P_1O)DD2)G5Bq5m-Klj6=DQjTfS8{suKnFyMKRTY- zFkrsEG4}&TM=R}(w2q_}@NpoUmG;`ZLwi9DtNGHoMSRoSs;FN&nr|M=Ey4ht8fnVF zFQYK{cat<=?>lnkRyZ&BpQcn^IpV@(us{#c*mvz0{LjR|UU1bH{z_)6a4-JR&M_fB zj|lw-TSEuI;^1|pL!QCf>xH>@OAod|t=o4Sx3voYv1hLwA2*9&!7=JPO;&tB?a}A$ zz`v%!;QWzzG*1ENp6&k(f}v@!O6J+4Wc%p)lg)LE5^&7^zkpzg@AqB+zq|Tqn|_Or zfvr!m^xdca69liXj6}y<=zbf|P}Y|>$n-Y7{cjMQ_f~>vA7^p)fB?@wy9PTNBeu3t zQjW~QQp=cr>;kv^cmz$AR%hV&^}@58>W?p8DUX&R3vq2c2{?Cb^f@#QHY@mb;jE99 z#p~nQYY%r1Gf$kF>nU(K_^E3rx)j&Bi(XE8_37tbkIVEM+&Wi2$IH0=`ri1t+Qq{o z=>%O=9Ixg`IR8R{^tJrXu{-V&w();>i{<-o^{vL(ox;`PY+o0xTk;40D_;eGIJ+yRdI2F^~Cck;jMF@^CFj3W8 zJEJB9hd$K*fLw7*_yL8L_w~&ACp5u5?%_FB6l;{0yM3EFkX9iEywHt#?*pj09zP5x z_+D|-f=Xq(Mt2bfy5MuUAU)cqSlw5AY$lLG6hG#I)U-8Q`?rGv=aNwSmoJ~VGx$>L z!t%|%|I0xkwG*e}D;c9K-95s?ybQ$q!QVgXkRb?AgubDj@f29lV-di17yAeWX^S+P zr7M8SfE0r_5HwSsj}=0%+h{RxyV!f7k2dij!cdTP=vRsT9bJUhH>}(n;qOCx)39}k zdicQW7C;To1?7IMfXQD`aD7foB zMl^y7P;Lrmd%er`wBO`IpC zX@Ubz@HflgU{Xif`UolJX&@G`HFNs_T|Zq(E$nwsy4s1cj*^6F1JE|Y5>zzYR z2*EgVbk)n9dhC4IcVg1sKyD&TM#$vr^WCBV;U;mxQMm0HC<}kU=@MIj+v_s>NJ|fE z$k;}T@xt7MH^3^!E%gQ*XyX3P#f@BJ#bR;HT9vHdW2WYSQ~8uBH%x&=k@$J~H6W7x49WB#@JW z6kI8ab;(H0CARVTp;gFTaZvTtAWEIHkJDf3x=E@4=4|YT~AzZfbl%E3p``vOYW03Q`JcF+~L|WG3 zxI@oW@+uyQ{@5D{@4Q2#y-}wDbi(D6eX~1oLJ9^X9p`qkcFe|#dHk$$k`eDagw>?n z&j5g~B@3V!P@#@O-xO8PMF57RkbsGU4+TwGi<}9HD_ysjsP&}^`4(yRKKXPC9 zh&pd<*x3uv&{$mOIsdK``~Hkc`FQsJp80eG#+ikb7L;vI6LC?HB`;8yeKbH#37IiU zG4|{DzW#=oEl3jt*eI0MlZ^2GyJ&#Z8s!TIG{yRKKT=-+w&$TKK5EZ+zjdPYB7DHF zJ7(eFiC^=YKnOQc&l1?7C|oHPYhsuP`3KOWIGl`=-=s~p{ipzqMewZR23mS_gF7!9 zZf(MVSUTP*=Nd{>s80h+095JcL{rR%sOSJ3KqLsX>UPU)DH%YoO!yhJSh2x6>3>T2i>Ms5XFD$)r4jv%KNk6wkiRRDneR>7#0`knqpGduNuK-r0z z73YnXiGlk;jn8L3kvCd7JP$&8Pt1PJ+h|*|dO#k3KKr9(qkS#)LHPRu z{Ml!2U6*<5#oOHmKl^Rd>TZ--E~>ixeC9Yp>O)Jr6v{*d2(9aNUxO7cu0mY@<$y-T@S7nl5 zYUR-?g_fSiQSzV_mI!ks#OOs8sfjW02w>>WBLu&x3b99ewC= z&(tlp2p+>|NP5(iPCUinUx>%$c%DVbGvsHE@Hzu2axsMP;<2Ls#Qo7Ega^ZMwx8a~ z`)3vOpOZsWVg1>k&R#WV8O$ku!6>ML*zoj;8+qlFCt6&)PhBALH4ggK*$_}yElrX~ zb|$F&OJCM_Z`bjQoA(6K`%?+kZHxPLO4U^u|l7U~Cw7NB&J^ zqqmASw^}7T->d9y+igtp=aPFUYeqxFTU8|E`&^Yz@O4R(s=wjIVw6e7$8d-I&T1Y< z%$xRaeKI<8ZcaXb(?F$6OO?a@R>?7Wl>}=kfZtnu9Ql+4@5M>jiFFO-eE}Q7cEAym z*vWqukWPGt+MmzHOx}8&@63*l#T}tZJLdl)86Oq=bmotLPZ4ggHxzEfHzG&vQl=K9NjmmHrSr?|8RHb|4{yq zzxc1&XBb@eT_c1@l4MB@vPVPNw^0hE5M^hEv2Q~uTZ}Dx*(!Tu3DGjN326w~)1oNy zy?VVr=X^fz^ZkB5=jU_&g_+xJ=DHrw$MgOm({7=2=BTr;uo}!L!g(_bMrcYGMV`Qc zHwvz%!vgJM+&z(0GDUDMLX8~q+{&^V+PEnv?@r)gSy_$&(YtLeg-!g7?JaGHF<7Hu z8)D>1?4C>#%@7l)M!=0&S+WVS81$Yx5}X|r8#u*d#K0V|w~T|<)}|sf>SC9IV)RAA zmw02La6-L5{FQr<8XFg7@0Nz4#P5to>kt!`q*1Fs6A<+r^5B&nR4h(JI-vrm@=&Up z1UK49SgJ=z22*BVAp;epXG=My>5o&LZ?_{m!OZ$rR&G|6iueYaK=F$gX@Pp_U&+ceDN zXb5i@NUv^A+q_;(E{Wk)OFg8S`S!msj?zX9V0~#-3U~ev2K>=or*gQ9aH~oTWygZrnv=-kP zQ@UHTlshAqQ-kk>BIpl^pNKtlcEZm?H`E9mp)I!{RgssTdZJlsg#>#|%3kv4IS}ur zmIyVDZ>Y3L#pJ}ymSUU<2WW3G&aCVy!%P_Erobu7c`zr+H0M=94&p#wrh{7@J+Xcv z%5@-q=>XPE>wx0?t#v_Up}kdL0c06ECZ^4v z#u@<{GqMXHaU3A44__JiLemQ1!tg@S14=`WdrIE*OVpI8iI<20Du z6)|zVgy1zp#9kJPr@I(IO=g6+(L51_bZuHWib`-BJSbYx!{en5x{8s#_kvA+aLIr> z#$v$4eCn}1Ji&XRjVnakW4B;4B8-KMUE{uWRXa)>)KSG9NAKC%A;H_%(%#s^gp*34 zy&$E%9y5w*zYT*SG5P3)WJEpBkIl+GwwB*ni65}(0#A;9mya?q3WhHBSGGz85wllh z@_6Y~4&wl;*2*RSD%<9x`HPkJIHJy0x$W~Rc-SiS)~oy|dXMx%%~!)TGX#=txXImxisza zy}p|7bJ{Yil50ylcHk9v%V5HTkerJ%_r|qBHuTL^na!StZVcRbF<2u=s9m~$^=gY5 zPe^gwU@ezc?Z8aV(rL>-&1EN{cj&tKFIj2l2h3;>5#EWFB0IAc`;$-jXjSg_pwC`t z>~Y9nMO6TqZgtg*cV``cH`y)O(c;lvE!9wnZWZR*umA)oHI6h_ z5p_U+QqzoKa2%mYFYBQ{;{i<*93fOLJg#5mu%DgDHxmbp>hkAeY04}oXw<97zEX$W z%3PTTDjTQiQ1EYvGJKhJu|HFzD|4F zc#Ac?;N#=uW51n9%|QBvb_gCX5$~wZ&gi;-HFJmE0Exk0a$7vY+FF)cZ{JF&3Jd93 zsAA8y^%@3Ws;EC{EPO(#@V$*?V_SQ-Tnx1M;Ee5hBPsq1z^`PNt)=3< z?U8Ck=I(YW8%mGbk-He@o!ilbq(HL9W+1GUwj(g z$LjXa<7X2P){MF|Wzd@4k=ZU)q1ti7nGeD-1wqWhc(B~i;EQ#7MYzk?J}zfEj81;E z_(pJrjc>2x_#1nJ*g**(ar~)23p0qv(FwQ$HV&dUp!v8i2GoD%wp0d3z~>`iw?NUe zIf?FRiRUjD>{fwW@Omf|x-jzkIieoVOXr$+{ruN5_x(BqCkvTchmX((S0=bt+M&)F zE>;z70Y&5w0BMr%-|jR8EhGtq(TBw@4SO+BU*002fM17z*iRb4S;4sJ5RyD1?FZMf z8c|&tL3WKO?d*HGr~@72Reo3xspD^e9&EU+XV1q!kHPqpTqJBF1I+L?e zIT2EmOxycH+s_|6$JB8tPF;R$q+}+|d^UtC3$hs9_v-P*loM3wa_zqR?$5dc+oisQ zc3j_niQw&eYGY~C{%%>|W@X-}{XkD~N1fM+9-=aMZtGd)_7eyo63lnLbG*A=ckGnU zcy$h^6y?rPQaz# zoZd-!*s(o6UOU#!)%rmxDeTDPPUzi$I`D;q`;uDtDKP-tw&08($p2TMEA+zZ1Uu0m1uj z+a);c_tb?O5gmh0qPehVp3?*s&<1E=>w>w=>nfd-4y}dkh@?{?A7`N8xQ>ILTl#c1 zjJf=A@swr!rX9aerb*=VqYF6)RY2J98EAXnn~>t!CY4G~vrYR5pTZm6Z9`hsx<$_F zks4cdLEq51*nQwl?HRahamC8qkeRS|`)pRn=(Rtkv!%JMsVDqN(-D!iSCsAt?o2(L zah?x43OZBn`$_?sbVkbEF(J)42(7?7E*w(<)sv^R?k46xuNn}zlp_Va&{@2x(pJ*C z2m^A$?=C9;>bx=;(L4XR;pm5!kh*Uc!pz(y((_x6oi*B(HO$NNZxTvUpYN3nTkfzF zHmZAD>RP$7vi!23LtCY0wh0mKv(m5+)F3|?>r5pstdJ}}-pZXJpDCV`TCP!hYkc9o}QmTS$%DOCu| zdx-RA824V_A+*{2s`z&DDndkcbL)zk*_6fM&-GeW_8(7VJxc!~| zr|dMe07m+x>(Efxvfio!9uA%PDR#|T@y9pG?1DD7y%s2;wSIvo%;yECnZ1&EKb%YZ z=flAt)L-AdqeIG`{oFtE^KJ0g{_J@Vi<7f$8IocuL*G`~+}6VAI<^LZ7jVN0|7b}53w3T2IMU!dS$ zgRpoE8qfqkbbRDxToSeL}I0k2Cbxf6xtGMb4A_ zM7`eObA77F|Dq?zKEP>d7Q~OO9xogCTQq*wbU9!0w+DK~Q`W-kO|8qLxrA1n@b&#W zFVW3sKPvl7c0}w5DX9UvqA@<0?bC1xzqx0(jk&A#^~m2!tUuac;1V{$=(-z*UsR5{ zvoiavP*`{K6xvg=$CI7n`X~I?0bjd8y3NPm8|&LUn7ZQe?TiuI}*pkH$Ai9yP@)@E=FysSIUzhFKjDpblwm)#i4(2x6JSz6z>GSVtf z=Q!$NBA*ehRg_fhBimpy7mjC&2<0*cyKZDo6~j-alr{`bhPNB1<9+BJ18l~0St9;d z^HZ~fFYwR$BaR;^hN~YpMN80sn4+(%`zXM8_YcoBzUZHXsk6>aW20lS99VZLDqrd7 zNB*l@H1&}_8b7uwYQFN0Bz0rT*!pA?2ln41bKHL$ng6@Zp&_)~%<0h`G8mp^K5){3 zatZgvg{IhW=h=VG*I}JdYqqK<0W%_35-0saiHtN7ea1v!#Jy7l{()<`e;xw^;D=PJ zwAUOmUKB4gKFJk4|>1s?1UeGr$8ifYrt+|vFthb z0@(HY9Ir5BfJY-Z^TeI&b_}T6cpl(TMSUBi7NKSRdK5SSygKSUOjVj#tOz6Ya-C>z z{;M_nN~C-Vo_;L$s96GQ#-w<2Wl3tr*aiTRXR^0I2-`fLOC#H8qRgT05P#~{E3kjOu%)hp{P<~{+ z#Ehqt>&8jIjhkizSeA}(iUN!s5*l|C%a23AzpIhd@e)A4%7A7!0Be=%J+V7&WiKg! zBPW4=q(iz9JcuP_*cHOqB5WNVfKWgj1R1cbZ^}j{Hb;?6Q@st|-5@`pIsNI_L4bj- z*qE#S+=)A2ce-E|MMpXuL^1#x{640iXzpe9kJrHpK-X5W;;~nG9n#QWu0!p56lJ9l zu`<^ijDY&u@MFqU7$Tg$en$xxg{-c^!bz7JA=zmfbINQk6TJ_>CBQ;RxwJ zybiyVZrC@%aeuu$RdsItn*dQS8PjrcVL*XXAQ2D_ynYRMe1v+FxUV$Z7D(jnHI9G_ z?#KYJyD7I`2mt^^emFt?t|r;21fyzunxn}v46!ck4b&rv(Rz8tCHK!9j@1VcA@av9 z;794P*D^|W^uMa$REde&KbEc6CgEiuQyH~Sxu1A7@CQQZuhQ`%S^nPESFJ-T;0Wwq zuWKdZc90fy=0afwqAyvHW^nJ$vJ^406i$N^AmJ6!OOl_c`)=CAY*QpdqOy!LRW;6mDe*$f9{aS0+h|n2W;s z=vr}2MClOmlY5PVlQ)WLcHx3adai*SR5r#0=|JD%ZeUnyuEi4r$wE7Dzs?d!G%>aPqaop|x`u_v0DioR zCkX>bL{uqd1P^fxnGzH|(0`O~CFs@w@Atas<8qPr5)tnD$X#mOK)bO_8;J><2?UEZ zqt7C{gm@nYD`qYz0KtTT{a96icDuxGLWjnjGX%p(96Z_IOO!p|Deg*QD!{-G1bHt* zPBah$FG8c>#8^v-vqBjr(IDSQ`m?Jrld`Y`Z2=H?FG$NwbSEmKqW1-C_@G>{<(e%b z6q3C$zOor5P4L?l-OPzpoJPPvcBi?P9zO3Mreg=OG5oanqvUYXM>!y53JUP=X@*yE!;EPlG zZea(h>!V%p-2{XpqliPzo`{N8P1M~pI$&IY6o%JP_|&Db8qipt5DR&tuB3BJjOXy` z-)eR7j-ol|sfkHTA@P)Qgu*VN>=pyLWxDIH=2FQx0e%hEa(D zYTax=g%QK_*Dw;?&Gw>|ib|#`=m|2XCe<-a5#@^RGU2b@>NG$IZW}0}MozF%I_?Bx z^h@pqa3qEur$ddyJ&!$G1^calAeRu0*z& zgf&@DZ6o<&XsI-!AloGOH#Gr|{MarVV1)hd$CH#T#wQpY6zQMJEnYG9miNE|g}vnD zubIlC()3=Vl++{+7W|PcA|Brd_+7o8A|$v$3r@Y1;{LXGR3!dT?#uJ3{JmX!?(A?I zp#}c9oL$4f~P);=j3{?*-|BLaW8qj%ktUnj(zL&SQ_Lml#( zB~y=!GGAl%b7`6}a6T9le(B~$*U3Fx1$MVQ-c(RjHuM|P#1Y>oYa>u8dSRK~(I|5I z<%t+Dp);6|U%Bo`i0L&Rp}O{;unYRTN|#IxMk&f+UrGhI_isKdE5cDioOYJ)alL=2 zRRW*+Y2JHqZEcmOS4h-L`#a`Lf+V}MS#~_0i@+;Fy+!$Q)J|+3gzLSHiW=e3sJl8e zYZ^pG{`|=wB#fS#HMOCmd9YO2i2v{d3apz`lo8sir?x_Zqefi{PUD_`iD?ZlvR^a0^G1oWmrarQmSDNW=N){KJH z@u-0@2|qPrKqN9VN|_YhGaK)%K(I}S9bMO$SffQ`Yd}nKz>b$wK~p^XYix)J!5WB5 zwikmge8ym%6Dkr=eEtkg7vDw>IWRm~6D)>0tisMl*bod~qQzRm#w`s`1rD2OQym7S z^IV{VCc$YmcJ`-6W*x%rs|J)?j`lkhyh3UPrNE+b8pP!8$JeA)!)&KbH3(NbL%h6QW8ALWQRa%4qh2pjI&Q_YS^Vu3ue|L9(%GUw-PX_Q=FUVO}$MGC||{DIc^5Q zRTB5lVY1F>f%QSx#T>2+5;N-8HL{rTzl$Sc{G9a@5-)FR7_EiZ8v@M_pjv&3tAp5q z%5bVz1}{A;Mhk?>%iaqPo0M$t65J&b^=G5loK447q8fykFg7)mnb~(A=X|VBr;Of$ z@!|PRoy#D|0)!D1Ae$LW#5v_v?kj}$JU^Q1k+UDI^E~_~p?{pC0V&Z(HXWe>Z78HK z$w`7w`2;^nF?bD;+FUPo-d(K-$<}P($WGL39Z3GuoFBnNy~Cxzin(}6S>?02ddz}K z@0^94{6WRP9!0ycdY>&y_Fe8rs8i3ny)|vB2IjSu-3qTPXmo(D4>*>O95PTv8kT8p z0k$v#j(^Z;7f12ig`!=MGQmo$Ekg=1kWXZI)b@hQ5ERdLQrpXO9J*pnK4);S1fJn> zwAIm{Kz;Jjl*&NiH#IDnQOVylet~erqT{gE?WAuS+M6M~xf-7^IRd#FpEn(4=x_<3 z_~c@Q0xr?_AR2lXhh^s7$Z_-qxX6B}r{6SQlM0nZ3GW~ld*RL=)0@@*AT`DW{7^{* zrYg&Krx9ZoT7JwfuR4~8mc$jsFiX_VllCiWx*r2?CH5u8SKjBzYQ@?GmLe3ZZi^8T z$VgboowA~|nphrRQiU;7dGLB#;ggEoVE8?-aI+a&xW+U0Is|BAPLS_ZXoJ61YaX{c z_{MOk`JKlLBs#9u(97T|OiVylB}@&QuIn z9=tdEOCt`bKPXP{eCMc?eFvR)eaf_6w7Ih8e$0red7lu*f>|l~TSKX}31*FRS!nVu z;X*M}6?MRDCatn8m8bIlaC5aAC!@s6QMIxOn5`H6-3Tov`crCC_s9w4aLqj?Wt zBrdIFNBgn6x{t3}C_RKa>%VZ0o)0sRWZf{SPV%b0snrcfeLBS}44WrEoR2l?8GHbP zb8b5{yNP1+IemR!VlbwTWAeG-sOy|nb%*DHA2|-b2=1nFyS|p@r`PIm;*JFZcOnIA zYZThx(yceb>g9!(f1VU(U8M+&(i3u)`+1_L`KR>al)>pj0L4@@}z)BaX^`MGk0C1xGs%m zs8*obdPEU_%&tImC-dke2}OR`+F{94-b5>qM6;aNggQd!t(uO4_&S2pw);MD7s z6U}u5Tvh6=bn3B`AULv+@Vt(nL-5n#^@U6JPvucMln#wsGV+9u%tH+sS=r8HM4nE! z>_P0>lP=6S_F_%CHvzFa_!v%YJMUxvaJ-lPn4(PRes?i3cqhN#n;+|RzTaEMCxUPv z6mE6R?;jj$r>Cfm5l}nhZod2-+2QT77rUG1aMBRoEavC^hI<6WHxW3p09*`+J!kx| z`NTsi8T&6#r0yS#x;MOcgff8ke>xcc)c6E%uLS;Cc;is}VE8QenH zv6Ry}kDtBC=kf>PdoXx|z0X(aTz`Xb@UKC=AG%xtEeA5;I%K3Z0|l+Q%0I*alB{bK zG_)LO!$P|K!%*WRp1?pz5&=QoVQ{-!tc$guJdDyC{yFjJa7B4~Rtr_R&%2M)oBZ5@ zK+OX1uK`Xva9>UJyfUO)@6=)F6pk(^2&W78X@E@)29H~ML!p9HRz@Y}c)f~U3{V>MC!WuIKhzm zx$R9OErGW6M!l`;%67xBaqqS5+Ns>Pj@3Pu;XUqLqjFAS+pHT0B?u}$qrSg2LMh#f z6PDLLsjGo^O8=F%8_ z-@8he8(F&JXdQ5Z^fpQ`cBXo~KoYRfwtusCVyCySvbH@obz;9#&DMB3g4+K4{TQsc z^_&Hx)9F2RAK0;@J90}BXik1R;Zhs4H9osBFl#Z6=z9I`c5cE-&6340W@ca1L`8~dp=ZhiMHO@y7{>Xe-0@}L=;PCvy>U6`CM-&1+Twai~?5>}TgrvvVZ{B%YN$R($oQegti zpRRQB=6zzD79F3*3(-C69II}!RS?e6UK3Y5t_sc;kvNn&TM5{z{2NKJf*AI@j=d8{tpwgXdoo7r(r;NdLVsZDaXWCvVy~?S}8S z>&iPHKEnNTa-SO$k{x>MSUx9?lLDsZ~=8^roO~3x8^7YiL3vMo-2C*UF>s{Vd}}AOAg%=t8ZxZk&qB5DnRY zXF#9DHmH+(-oS$fLo~)BI=nQzP~7AznH>FtS7N`Jj>xi8#O;P z7*W6brGQW68)^!-1j$^TJj-h}zYF?G!=tuN75u8np+ho=JfrdX{+|}E?fqTXWv$ceQ1yOk5hLU-z7Dq9w;~1z0!XU^JV6Bt(#lNk*7zi zsXx7Q(p@2!xP zfg>tPqxCNEtLo$A)xEns?CHg2Nm!q94x#8G)#JRzGYP~{mckVOx{z3sl!?Ac&oMqv zC^C=!aRw_Wu8&1ZJSUIrN#n?^du$|=p3mDK6+P7r+b3J}I5*MsfokIfrQj3{g{oxDI}>Eem5zipWXoc|WnifQm|*ok7Yog0nT^qj@MU<- zHD99u0KMgRDt^F$$de9dYqONf24H>M`F#W;w_bcUKp-7{k%TxkrzWsR2=01y{vkU~X;r^pRB$2Fzoj?bR#-rUA_2py zf!r`a6D)VzUFxhCv`@WSZ(Ec1t^SW1AX*28T)G6Dk^rS~MS@5U90!7h?asFloK2l#8UZ&T>CiBAIVv#hDV;^bSo3@40nu;2BIV(XzcyVJhLs@7!Uz;n24=+^JcM63 z%aTJ7!A5;8*}81vW1l(aqYzEblzZuM%mM?Hs#y$2DtV6rc!8CId6nBRfWvh-=lIfE z|NckE?_ofl>rEJP7^Q`?cR_%ccXCMN>waorG=N_-G*D-NpDNHAAl_UazQzs1lP|+J z>2Te?11HuKb%S>gAj4E2@#U`3;32!FmxENccuTJ#yKb*$!vNl`WoZ|nPo7 zxmH&Rr_6^OHQR(2_s4DXn{dMc?RZrgKxJfLmQOXArh3i`JI!efa6Cbm zKm^o8Om@Frdtb~kB1f$-RKoJgVw~XRRN^PV2g_96Ac^hfrX_0G@8Z8yS%V-@cpi=( z#{+(dMenb9Yze-jt-vinA~CkuM@I33m)Uz!1sWm;knZ-PpAI)6xJP4+ppqnZ2nA$Q z19R<6;0J_wXTUPi0oVk&ow`9#M&Ob^Ya4JdQ3Pdkx~1mf!Qt(|gp)9n;v*iY5$daQ zFSzL|V_Y%be7RPb%Vi+;?mYd8bgzqyoRof=&4~L=n&J=pQ61~9CnT>Mg!ilh>)|&! zpypZ>pPmhc`qra*IJ7%HbfZV+!M%I&vtew#N zFohfeO$&ql;VL3I569+y+9cc!3qM9FGg`29VQwtg| zwRDG!$cK(Hcy8X|5-#<-l6T?=)?Zcg64(_T^fFv!0!!VKz-d|>urJww577TT+<7sA>LGFBkE6+jB92JWCV>(5c#JrV%Rj!AIBykg(=3#krSQw` z7i3xIM?9o28-TV_o7IeBWbCm^h0Rt}5+Y8cdH~QSMP=1G$*9t6^jUVCrZV$-s`TTC znE)Msp%dbp0Wf2<{cT6+Zy#OrD5A%q?)&)OPTV7E>5i-i{qx9=N-;qbw4WD$3J2&k zuTuYO67y0%Y8l|IsEq>Qyb>mhUD&mUA#wzc9N}O)t7~nZkxj!`4N@fQ6W?!U#A#!3 zcLu5lX6mjQUTP>lMuOP~Q3Kqsp6m~@bLW&+jb6HSjdv}wSTH<@B#~B5O+75kJC9Q} z5%;Eqlo*Ob;kFSbS_Q^kZ4_+>jsN-WYNB#WjYjwN!8N>gSv*9bnyGe0v_1;0sR%Rl z)4?K$w&Cxm#)_zUedXhi*nnZ~ml#LW?8skTk)o97%^<<9wYW`~X&ew)5KHw|js0F8 zaKktp8fHmV=x`%%uE?ENu}wFTc3CQBnPVH1coE)Ip6`}TPD$sABqwF0H-GaINOtpjFUFZ?c!IZ%HbVwALsYq`+ zfNl3upbH>RmB%#=BjbS7ZDZ=XrbFpGRY*~yiRuk+NwDkUJQ}RfWOdDN)c$^R>W8oN zOhSeoFS5WZvq>5i$H=gQGH`RO$`N}w#1SF%GNrxK19K}=ei(0E%}hY93vq^ z3#@HUvUBGWq*Fd#Nmt9ZkH}2)J{6^=dNEB4x&oY$qX^F5%A}QDf@my?G0=(|L)0kh+u9VqUw66J0tsYEH#u-R6fsFtLQ-YKp=yQ z`m*UUS7q1ZimMI8M_3H0P`e}Z`TME@=!*7x7x_ZzMYRZ163$^2$kz=Od_spAJh9XI z#RG{ti{>JdH*cANB4Ix)p^@V2dD8JvnP@h*l6-{(c`ogDd~ z1C!SqWeBSx_eDM^+Z@z@a1owJz6t{3z+xIy1oyVj*&*DCVFtTt3&-r#0m}1s zS{IP}wT{KS!R(mk#_t6~#qiV%X@QHtVU9{!y|O(wXxxON*vCm~Bz?NajTeb_PJ2Ob z(w$^&&>5_XvkA9QJT|-#LXFMJx~AV`Rcb6|uQJ9c8X4OXbJ%PnIi#x!x1 zzio-8&fYms%k$2ywxebZm{e-_M@1e2lGfmJxY`&;cz$kGlQb^T!DyEQ{N4pS6AE%4 z$aULMLA1Q$WvCzo%#53fs{x$9Ic%XOe+e7DEq!nOTGgsHc+U@xSxUF7uZjE@MGtTY zE~VM|S2sFbKOACIimea3%HvU2pS)&@(D~c;Cgs|xEJ7Wag*s`@;P9+EXnr+gt)8F* z%I>vKibpRbHNvUh>)Lj{6fPDU-u|@#s^hu-vb*L08v>eybU^z-J8~UX9WX)YT+#8q zZ>M*k-J7J$wBsXTv|~+^>}un+vZ``ShaDaUodc! zUwEi)pEvzDiB@e_nouilDDE=WY*$|yVR&2e(1l=8*XW?ifG|O2a!}q-#nUmDbg#y+ z*YXei;HOZ2=Qz(bS)n!+OB$WpBn-tLRNQ}LDBe`}K>cD$)$i8&>{}H}`;;j;frq@P zKx>%}=-t=W@%mnX&R+;7P|=30PE$mzOOh>gm8 z%Tv>Owo-e;W;=YC+O@Y0d7yPEOz>H?&7Yvw_c~w#DLde*-*T(XAv<_!^&_}ddBvcu z8>YhfwS4Ba#`oe4GaPoAZ#y|ohGf8PvsYyJ5_c zMH~Euq<(YeXT`2tc}%xMUPX3gGU0IwE^ecI`iU!!7G8ngp8Kc8*8>(n=y*YCM3#bzOuDLpqHKU0gu&=AQPSVqxRT_Ez?Wgw zOQ3Sch|A8b)E_oaQ{Lcwa+|LWA5;c^!@|ge$W+QjIt3d6V%&icW%3zrCR~q!@~2=6 z8Jr_zj{sgi6`1MH+ROg0uVH>oA;E&-H7|L#IxrJ_6AaX&t)a7jc^GUqg`SgqhT^qhqh;cc&&>9wZI413U4-+?N%5}h z&mO-CgZDXg8P50R)ixiLK$B->wsgj>hjlCF_c}OtSKWTVFPgFINcu^M@djNmDs*66 z3tS=fHg8)rQCk?bJ?)Yc`q4%G+qrPwo`H^sHMOG&+har96GXVFbzR?Bb??JV?{jwq zI)VImlU(m_@9Q6b_O@7e@~jRRquUuc=r-2 zk1IUcPHloQ-u4bvR5-IsSNIamY}VsD@CD`TAsEDFDRoXk+4u|X>7aL|2k$l`U^Uf}<= z469>vw>|PmnKLNhV!F(&KZEb#{$#Hyyjy1mwpJ4S{3HC!%q8wT)nA|7BL#IJpFb!v z(blM@&Q*P zy+yw5y21N9to8lkm&-<<>puS-i=ZrdH-1*QkGKxL*i>1iy265Lv*5gqoKb5Ap@R22^XHv1 z!2O?-(c_8+;`Je4oWliAC$5TMy36>VMMwaDwIyW^%>6?ms@`+t@2&)$SEJfrR_fOX2D)iS7C_ZwgO!PH@qB|aI~`W-i&1P_rn!A5u(3$9Rnj+3&~nnloJdP;3gFY*D2zgUOC`TlPMFVW=9(CzIYvV3x!R$MOCo8^NdR@u2`PX7$gnd@5 ze3V8JTBHQE{Etr^>vUk|IsWy90vEwLmBvmH|qSJ#PzSslHxyi9RIQ;KcBQb*sFOl(YpK& zAN$%apX!{PMN`xJVsmkD6&NT19r?mJGF}rB0yVt}j8KsHE-{k3h?a6fp zJjZ0QM_kQBdNd~W8}?wuo4mo}!fq0(t=Fo^MXhnnZ?ZAOAJlr|T?hdcIn%ufB^9)2 zJX2K0!(`4_zA%6Pz=e?nMiLp%ky&7Njg?`n@Cf;>l`t+UOOsq>%8G>kd1ox{qOK&_T{ol>$pm4jn|8Mo($JzDUjp|I}iu1F~^@~+D#X3BRN?YG!V z`1hn-_`gre{|#8tkO~j-d3%Vqp1uC{CTm>9eUD{3o#TtXYZK6rBOz z5WPThrI5sSTpXjxY~;~RsUI?Y0B|s7vVi~)>I{^k$BRLcQRxNd*>kD@L5GREA8oJj zRIozY>e!wC0KBJqQ16iQr@@bM-Q#d}!rq`h(IXcSS;sX$1dJ%2|!VPR*nV;QHsKO+VA_Ms+6WR&amE4}Uw*(X>iSAE7qV@6Ep-0&1 zT$dYD8fYtR%8t|k4+hZQ^7-@f;brp3zg(3mU%>pva%Geqf+!q4St0)qtMWVmyQhL3 zjfej@c_8mEtMcW)uqu2+*=c<5QyE&I9qZU5&D{fg<`iB%Q-n3CvLLC87a-ubdyt6n zgrBd8$T?Pes0Qzh5pV_cc;T~h+lyZjV5mZ=aq1iM82j^;vp1bNzW)_f7*FHPxc*I4 zfp6OV6;3)X27|Rn*is)rZfOIYD^F91jyYt47p#u zKmy0#%vO}%yii5jncy=7g0ZE8Iv%S#qRbrF|0=2g|1VJ`4@vJPo<)=J1|MZhc{sdO zUU4Ch;6vt#R|L=Ec$L-wlM{%4L>26f7tjY?DzytBbtz^*m@L>?B9v_8kt zbR0NH6QHEQK++{3{n8$mFoiD=4^tYD&C%oBKU33D+s91T-#OyX%#KSFCLV=jRZ##~ z<3|J($eOJEsvr}=zgw1RWc%Y!%n3LG+vqEN07(ZB7kcg1UY)kHSnNW|$t`t%)6!OQ zgw6aTsu2E)DrpP`f#oe=z=j7%nQJEF4x*}1`>#llT@>5a;R;e=X49-I{yei|D$x*`IK5Z{V4XhsK0!+`AQ`%>4?1B!m?hMWCf zepYmLWuKJiUVU9PVM9eU5c=>*v8?>Nj>j;Si>~Use!&^tx9Uj*R!o5{H)&U@!bdnf z__#j#DweCDA_%q-3#bCs@w^G}2~G+>oFxyN=1trn!+``<9%Bv8myUrjv#X-W~%bOb$K0haAI29A+K>8@|S72JwG2P}VyeepCF zc2xpGQ;2jJsmK&I8hx7se#~b6T$Mgz(HKg~QHQ*PR5oFD?|K~(gtQXn(p`@Ml+5m_ zB*$y(4cX6X&L19n_dN7RBZI5f%h-HuB=<*Cg+=WJyP>f+tv~M9rPlg*nvaj|jQx1f z{H*qJ(Estk%J$><%v)Prr_|y6cL;HZ7Kf+hlv+gZ*vBe1_@p*OHcOGw-wyvE#Dbb+ zj5EEP+n!Fv`W5X6`EOszUK&m@^^!&kVxtRU>S8$Z$@oHY{H^^p%qTAzE^chhp8TnF z{fjc7GQ?dod8hR;B{)I4zD(v9)!mytB2;WQJh;dmWhR5?O+XyxE@lEEXYryHv}4*6 zi{|kF?@zKsMmNFR(k|N!Mu7ltN}2>tK}2nodQjtp++}qrS9ir`L}$c-b!6~o_90s3 zD{kn>;2n3-$WidXve!3jA!^&)Wr$N^d{aUO`ca9PvL%V@v~gGBu#|hY={jWuzMPTt_YykDvTv{VIk_ z_QeOI_dVzsqD}b^cbck5vlS$z?2bF*r|38JDBV~8eYpzb+5q7@;u>-Ig~j+7orU*q>U5_)QK<35*z_h`4!1 zt-tn%dgV`s6}Ca-f&M787lN)DWBm%NM|6|?iQ}!1u!bCM=9T@U3K3+a7&f8=@})mf zZbx%V6QYkR7{;u{{FF1??@1k!HiTm9@Yk-Y3NcTM!jxH8O}!{;tVmAH912F zTlvnS^&bXX>9ALa`hXbsGSJ|DYa7${0i;@oZM8x-$>jjU}>v4#w9zvMTs{qmph*D`;738|Ges1jB=#DrTK#al@u!foZnFC!x55)mZozP~Mv&|$E%RS>6w zN77B(RP`<=@nnu@Z~5Rl&Wuz?@frluC@rdzmw>-Bb~xs?oJy-#>Sscj3_S@S9BhM6 zjM9%rolf)UGBTu6DmSAAEMi82eYuQPtb(xB*fdQMczsu5R3gVNA17(yN2m80K&^qu z*>q@I7*!&a5w#Xe!aB)x-L`%afx)K2Js%wN$%v9h#d$?r1!1f_(sD-R))`s;qtpi$ zhppPUQ1rAnGd_|Yao@xJ_3JWbN8^xVa(_I~6eFi2J~_KI!8v>~I3{-dx@jjHv0P;h(pc>NM`Z zOP{xUXxFX5IFn)DZKOcw{J1ZH$Ktwcng+6~z^B^?I%BYh^lo~pf47m1MOGhs*b~xH z#@|3ylqnC=H15o6-|o7axeIWMA(#`eOmN>U6wc5SLw_2WS>Y z);>u|^EuyDe5x@1^BYg!hR4=O|`? z)1fGw7H9uZ@oOo)zPLP10~-4dZ`nJhz%Ke0BV2Hj^yKcteksCw;aAd_KOa`g>lMk} z`;hkds#|%KH1^t6$0@fb%l64yDrM7}nX|wi%w?zHoYK1%j{an1j8}Ht)M+dR1E4H(y6XEie~+5ieb|D(bko zTsg977VY!6SA8j6 z!{tDAR1n7ReFcQYI$f&~y%yO@Fj!~M9eRo^Lu=U#E&`B}partsieLWB$d!L_*%@`daRzJ{+{?OyFrGkcRe@&K+)$Xz%Jw^;FY=QGtDk5fgiNiIh zFaY3qw*0aaBH+QS`imZp7Ug@ZBC_iow(uN0jTrS78y>ETIstl0a7cNi!%igkBdWDn zuTj;3(ig*?fq0aXNz0wWB#9jk9y5eQPAhlavucAznPtv2)OB-8ef7`3?9nZ1t7>WJ zq;E?Ul1l-fmrO7i1gH&%;l?yht39pfMDr^ThexH^#n?yJ1@m&KbZ8y}qlxuZ1cPyW zQwAYHu*HS>ms!J}NepAMk@qf?|Pj>H1>$+vu`F2dsYfpFPPw(v_S2a6og+YKLtEu1;-HZs3n4>Pwwp%q-MrjyHtWveNL1CG*b zETr0U&4^jEAnx@_!)y2?@ASPM{NwB~Kl_8Gt%U}JE(YA5${nK6dSAY0C#~;!9`U;c zN{cwaEjc*M;K~KCo~%Lmz@UmaM(qZM%C>j|b!KMKIW@&`#}w}lF25PH;GR<%nj^Ln zxrbi72amlR`ZS+#;=xe!g59FZ@KhbT`0(%oKcGP7T>55jt3BL9Msh8~-IlSU55RNU z!_#!!$!fGc87V^tP#|0lMB0$i_sPRB>N}qsXt(8e(4u?5M`TdnWzsS{%)CpIJ|YPM zJj)}{FdyAKl4xGI+kYhd2AKGA^zru|t3<9p3Ih)|lP`a`a;bs0o{rX{16&Mv9{P=9 zAIhA536jqVbc79vjwW+|6G2@@ zq4M@9(Jo;g#)%oX2>Lno7e zL{B07>(UygW}bbP;+g#YtVi!;?U5eTg34r{L%(rPg45W*jOmsjmMr?Y2 z@w%g z`@RMgHMc5NUls#in$%7$*EKaxX=jf*w8E1O5S4t(yNIIpqB~_xYXW%PyFAsnu3Rd#eEd5h+!~Cr; zX{)7+X$EYbmCC{el~XHzWiyAALGg(3quGlb&bi^5AZzP~6gwC3s5tdFZ?XGYXc@P{ zw-qRp3jMaWSoXrbYz@AW8SMV^>>3YQ8LR@~PUeTn=S&mG2)pk;iw=OrML+kwYPtTZ z4$c?ip<5`fyN+Qm?n_JTC|b{!03MI7JJ}Uelvg2LZQ4EG)_0>+3H$tHHoQ4z_WOoN zy2iRn1y{LOfDbzT<|cG7RB}wk05e02T`>K;7A2Qr{Af#E8T1D}9a91&zy2sIFD30A zZs;;P&)TYq-O?}raabg^Y-ih_H>R^`o9`>LgLen+*_yp{JFafBPkGhs6+_7~RS8kO;tbP66@1NS!*YO{Sx7&+{-=0|_ z|7~)t{`wPHTzNHb?n=ZzfVW(U0BWGv-dbkPjzipjZLUKeA*^a`Qz1JD0V^R7tZqE# z9AoE0Ti=9V?hvrDFQ`Pu=tAMu%;7(oj+?gzY}dOy>>L%Zeu1{d-<7qs@`r}6l<&U7gp<1uGE-*aObr^t$keF^dV5w=-vYNkE(+!G-r=N8V4 zUAb?bn;pcqcBk=+s&V01M_E1J7WHP~sHW}9&}KYy*V*&2eF7yWVO6p%k(f;00m8I zkDu@px>QT^k_hn@F=CCl_@g+(#*t#R-gz#ux`ML%AMI?0W&>MALKki!{%sY0@BcX9 z|2Gas)bXqWrQs1~R_=$5(nK}T{)N!ywUWpDFAjznxO!cH;m~{xCW}2Rt3)i0jtK&V z!z3+@LN{G8erJ~jaR7jvTn@f9{z3}Dkp>ueoK40ec*&|J7JDT)5V!FM8Y;^_zxrpu z?=6`WiAvHzEgT>wM#GWQ-VcuqGmg>?+=@0F3WX;|E$^v@riQ;Q!nzoOJYI>5A#RKMjdXd22E1fAESn7yAO7 z*8A%DX<%G1>=62ue*nBqHoY*R$$!cW$vEgC2yhJH*2eh#G%o*b=q#j>ArnU53i0us zIq(ISXs`2&%1078p?3k7(I+s%zYGb*^$ zVpNF4GPG(!*oAt|-I;oFQqsJROocWa+?uvlKukw6S~X{*-vj^^wnh{V8xED%=Yt&Y zQiWl7O$i_dcjprhC|vpa65?QP8nVQz3jAQwIg2=$tV#}XrCF854|CJ}7YB2Pqo|k~ zhMq8_>FrDdFsFA}vrH5yZHYvPU$-J3ki{>z@(ZglLhCvD)QIpI4gd`}WO!w1VgX8f zlfKZ6wWiM6m3OF?QVngb@w*04~8gX7&ko7Z8FvrfpAZA^0R*Jcd@vwIlVR=9W5 zp2C7m|8g*a)OY`IFwt^I9HNvtx3<1BJxv>U+QPSWIpEjs=# zpu*s_O~Es`^$srX{9ti?QNPc=I?V3}qsm((r3AtmFpSe>a1LP{L)GTUyhVi9sN;#YVr8#V@~2xeh;7?*S1Fy!w``WpqN9?3!MU!1@q{0cFO_6 zZCz_8ZC(P7ye^~rFzd+N2*3y@HGO_ePh~?2`ga5aL<2m*#K(fA!Bq9vTgD=u*z zucnD2vEPzZR9R+{yz}}T$;`I>O43}%R+IBePf$19l!1LXiaN(Ku%`V~I;=$Mcz*~N z{A!`(s{_o7S9j6QL*Z%0WJA38L?L2obxr^g0ABV){=K43#AQ^^_2FWl*=#^sP!cp#Xx6o9i23k&dBFtJL36f!g$jFdhw z!oEB^dV*j=M`*JGBw!n8UB8ZKL*Zr^$rcqjvBT@})TP&x)~-F?7@;1N!)Zuv#^OC= zkG78P%~EgXaq|cD-W=aWpavY-@g(cjOz{X15l1z@AM_t-!H8gxnkFBwUZ#o&;QVg` zb2*`$YdM36{cAcnOPHeddC4H1Q)-pa)--7Q4z{e1k|xcEfSSOdTMIT`lI(Q*Jeo9K zeY{K@aJWF@8~#&Xw$2yIk325LD%0ms|9;Lb-GTS(Lri5}bAal?@sD*lK(iFb6G3zk z5@F~!t#I8ix&XWr8Mv#J1_s&vs2PT_46zH#H>1hNL?ngVTE3NhyKmIY(aHYAtbfA@ zxVIoQHLl)__XzNGXOeN7?Hk%@coaDjId)z}uX8EV^A4TJs~K0zy+~Z6EH%y=-~6c) zMfs7R94w(lM4XCv2-l|`8{ei>zP>HxDd_$CTV0!`km18!QKry6sz<`~@4 z8-{b&6Db4=jho!22QoryCKQFt1`bko)^v1{{rQhzHGW2yo!!sE`ia6L1rNS-3PDP1 zu;uNYv(Ccrc(uqFK3N|d#+_M$59YFGAneBIWuH$~zDJ0D{hdN%AZ+G@vt}neixM!= zDP(RzSr_scq)@sB9@r556Sb!{@}w8M6&)Qv8`i51YSdmGu@!_y>aB&r z@kcRVy$G4IQBCTOl?9<^0=(_Xfo};u0kt7Z!r=)9OYW8txsvsSqg_G}r=wIC=vTojNyeGT`K+ivzF;Q^t-puV zINt7rgYOb`!#J)NIau1l;9W`DUz55BK1m))*-}1G@!^BbBtJJ2k+Y;g35|2{%)e*XDpJBS)24 z;FEWTpDIRMJ=2d(;*udI-s=*w@wk^@Of}r+^PNI%5B7!#e1kyGN(Q{uI0N>MhmT6t z4}{?GwERrBGc#9z0J*cMy12Rlp?+cokh;v;GO>9|T(% zHRe4*#BuXbx!tRkN%CNu1{{8|a-+u0tR+K?ua(i_M2aR|v}v@n|f?IQOE<<3Z!R$fB&Mz*Gfts;`JgeG$!; z-7N&U?H9U*hCvu@v=Gr;pe&MDx_RtMvL=`UB2A~WcBdBlHKRJNmOb))>?rTElt$W*jcn@{f_DG4uocX@ zdzDFflbXdJ)Z+`bGI_@I<3o9dvs;G-RB6kh{<2n!Esfo>|%p=&8Oy6snsJZ^johL=>8U(J1mq^Zq-%|l)db$`*BXV>a}6x$ObGqI=}zc?F^qHyt&=eVnt)ebQ&S`Co3 zRcl%qCmY*w09?9KTr^W3aIJPg^yPL}rvBZyi6VO>#j}K3V8|x;Kq<>xEil-@`kH9! zlXTln)=QWSN+Gfd6;CU;%WrYOZM8>;N_$o`(=_Xuk`!T~UH9_IPhOdUx|gC&7rWrk zui1a+x;!IqyLhD{?;^u52X!$0rE5B)VCK~&xztT95NbX^`7z)pn)#!O)4wwQXjKQH z$_Vr(xkl>{BE#P%RD>80b$gf-vz4PNYq0jS71j!5uHg3jy;}B*4FO>XUL}teWX||c zU$gZNt$F&B0i&VMrL`cMvp;^dQ@d{~gsm<_6}mPy=G<*Ks%5L`6;e3Ua`_n8G2XDL z$%x1+KVxREtner+Ib(=t}OKs=vXv9RsGrw^4q&1eP zeyD-X;zWSHj67cG=3-=-gU0B+Cki-!=$jM4xc#)P|Kjc6Z8zJ?sl<93w3AbK%#I)i z8&#>yjPlH)!g|K-jL0ZWyv~>cNb2cV|9hi=S|Hl7^3gxf_N$Os*B$X{#C|~0XU)N` zK7{889r4S}C3?F@_+^OQlWrt^mPEg4sj=S*Q?qCt$m2ig;S>-r4sERJ#H#zI*^Ho#Rv z<7x(R9eD0r=D~9o?{JduycM|*{047+eD_cscR%ypAQjh)=T+m@UZh(?CoDqRcHtit zf`RtOGdv%cM;7TkDP$xc1C>o>pmTTxfxz1sK@LwcCJE2kJYJ+Mx64c{~*v?#}u%z{9LA5cAk2!WivesOhfy4vqHHzD)Ed%+F(oO6sc8 z7uz7Z#-iq<4)}v-saXOT82$b&W@*fQ(V_JD)Z)^BQe3NM&EB*&N&U0nYRr9R$BVsGFe&KY%^NjBg6u|N2bdQ^> zR_Z@KVV8ZfR}dAe&dT3q+3WUu0fSe?O<8Lpyk<+w8;BJ+RNZLsVq-klMSta;ON6XBL&jF}S;1WV<7YQlsn`}8R6*st{r1zW z#h(l~Us==5)$3b}$#u`$_fB8TL5sd$hmEKDz1rz>e8ESlyV{gee)2aDTN#AO?+j$O ze%L$B@p?+G==apAKkzuH+kKm_Q)n>z&wk~w;fFN1B0)xL4;u3dtQ zA{7Qg?l)LzXbQuPibs1M-Y`?qdZu0BOhMg^&LcOH6? z6US2!pAY}|bozNuePujLn81~Ob+4G~s+#%XPN`?eJ9pq#G_5G%+vZwJJC+9yMNv*y z{Hkp}XhBLEoR<(IHp;PEac7EdTb$S{V0_@3d~HR(o|iXhWq#BtT+vz$2sL}M6{iHam; z>fT4VE>?T zzKdZ1H&LwnC}4fkEkKWY?(Lz^j~K@L0@N{==mZaW)k&l!nL~8guTJDVOoYWk?ulnj zbfl2(c@QH^pnu3RS5JIy7X5bj>S${ihEta8&#A|1*?qgzQ0r3i+e_c7tCme;o&inYupX6e z&DUV=SK7S7Iw}6rvccBsD9YJ#xSW7vaxjI+;kO}htOLPd2ozx?T0O}$K%#|n&`(+q z4(#|7l-6D9t}kXx4|B2*!x1KhXdX4{M8#w<*$sovvX-v^5tQe#hWL>eB_s z0d)smH4ODQOL9MeVTyXs1F?+DW*8%jsBv9YVE2XQ(;O$b+yAz&o_twP?udDE`fcrE z@1cM=U=LfiQ-E0hXzooQuSaVZ;|9p#z1wy_kT3!@dtjOBtNp~6((z0`)XWP9AZI#=b%=_Rr5@GF zVOaaj=7ma-UT5lAh{GyXE%;!zhd@KT>~2#)4)-*c1HQX}=F9&NC4VX0;wT3nIA~># z!s{g(a|ZdVEkV;=AZT|`qzA%f+(ge>cqsp5QEzyYs4zP zD^=-4dZ36bg?yc6Ww$yPBIT^2ha4ye4AG`^H!%Q%L8HJU&$W+8dkrabC7?iRDc&{cA9 zQ_dUDBXwZY2@%oSxHc@H7qxQ=4oHjH@w;QKTZ2z&vzHkFG||S8oM2Q$G+SDY0sAcQ zePfDx+x!MbqJI{w@N-g7%H1$ukrU2R!=oG_jmcS8C1TClm2#f&Q_c=KTiPhxUAOrIZs zJ3MxW%$*#kzvd2O&FmIC@aR6t2{^#H5`O|ZjyNoG={$lAj9?NaF5+ZlF4ul$f=S4E zjb(rEL-`g>p&lxn0E z4)xF!KzPIvuP5rki_u7cVFa-EkQxH+NC7t@Y5Y)j5Om1nuE3B4srCeQ2^%B=fc|eK z)Cw{Mki0la@tZtUpr}ygp(?;2=&kbZ28e2KNhDAYLO}@;K-?^d;K=jM?{!-TVrr|!DG$3tqaL+*67YotcTrnSVFqRFgHzzTK})Ay z;-`s)bK0hyNRht~&)PKSi5*6uqCX@@u_VJC1O3wFnHflaAqrM{HwYe=A~s__2uI-; zWiJW3d$J>-?ka2r_BCt-q}VOH9NFXx120j~CX`7~m(e@R@jUWBd>+x8j8_+Y*Pg7k zoDky2gUXgF@m3l82_@Jjo{u#AF1)@Z_w#E14_GO^V@yeo!G3>cfcrTZfSS9UahXBE zTME;NJgVvbdl=mFTttz1J#bf$lrtM2JO>|7B2dv!Ax0;!Q6SzEN!$Dza4*37HuU;IQoa#PXeM0e!3+HK%QPKO)R3De`;awkU z70zb1A6?j*^sU`w_w~8y?~(!mG2}!)DGcD6gecVdjlP@JhWn!E6nx`f)+Ycb2)Xk# zNfAx6iVsnIL7Z+m{NpN5V}3P9YBBL}|5|k9iE3V>5j@<65hNqc7jAKF(qJC`I|Q}B&cz^L*4V+oM$NJLykCC-C>0o z@f-Y~(*|Y0b`dXqUVW&2mEbOZ^g14OW205_+4~dwoNG zRF$Lo;M$E^Qr5RRuq>6+JT+zF<|Cwh!m5WHlOekI3t_)J-aVp{M_kKIkD-;Z9K4i1 zInQ1>u~!Ym#TOjoktwV)wD;mwWD>>1zU0ZyDe`BYC4LcEJiX^SB_{B7;|qUT*wKKK zc_tSqLdSCW_v=w^nVU;)YdW6OhL(?i3jCrT)7rS;%ak<&oYE)&eF+6-5ma-SxsBdJ{;$WraV}XIefqW z_(LmbL@b4TV|OZpB2lmFk==q1ZoVTZAepie;L{Z>um0+VeXU=h&)0B%a{5MQbRe5A zUUyuF6o6vB`g3NCZ}EF%6I@XSm-NdekYuKNq+_GbMYALlr{L6_7QyO@m?O*H5+in0Ji<5Z+=CX>c?*2Qa$CY&0z^P*GrM(qMG$z}e;9#J`G z_BAYtKS}_fv}oW%pn0FW5^`HE0q&o;9F_!K#+Q#cS9k{{>k&eTA?HQJ3@Pp@gLdCN zVkjbFYs-YmBfl1v|O$816K?vtL(lWlnnjcExyetbuPtOJq5O{ zo>Body)q(b;i+lH%8f(l5Fh6%SyZt`M8yCy!Y3W-(EM@B_vY8M3Qyh+TV)k*c&rB4 zHJ((DeM~ZTw$@AhH7Em#EFBu4J)0HJ5)m5*p*o1ns80BM+bpP)V5-2`QW(ZJnkifq zH?IL^;}OS?`?z*y$hf8b?(*fM#g7lm93clH#*zcWoGrqsGa_O(zFRWy$q0@x|k6Q?V=zjB|z zo4M+YomW+!A}Y{t=hTl!oXNL#2-M5?w?CQ%w6bEK_-f zruW7!4MZN`blPW^NWJ~|N@|{u3@zr3-8wyQawc?UHu%41L+HPtOVwy$8{;-OQpjd$%#hOpZyomVh<`id=J>g66QctVV zluH|rG8wWmZO!Ba1S*u`q-)8m~QF=e6d|vdS8>72{vNW>o(U828e_@4LP>F+Gc|vYM^YZgOTHt35r{5R7he2 z!t<^9G1;T~pX8p~My54(8)a6N?1ViL>@%54~Nw6-b^FUh-iwi>EKV0^WFT~pdSEOP}Y z@PjlDR(jNXI|YDiuL0pV<5?<~-)XnH2i@g42c8iCtBW;N-G>twnDzLyOiJVfrS5u^ zadwZu^XJ#H7+dvl|L5{rwbI`b8yXT0JJfTE)c2V*uns(vp+Mx0-*L$+JRs z&&w6H`o04YK+@Q%CD$1KvS`?@WVteT*e-0ju+89clGvH^+ZhdFVpim$RxR+m2eoO; zPK}i{XZ`|cAq_bxb?)zu!srOt6VW(oib z776+7iSM->e{9xlM8=t4Z%grcIogoZYSf-7munjJ=rvbMDBMu;r-xI!8-OgM9jjy81Cgdqu_w`hW{~jpy4Vi401)t-J_0u zj+AGW!4ivju%8OMrr;1`R{3M0ysrKAm&l&&jD8Wox2j!tZl&pk!DDle!n$L1Yg(@h zKU9#&$i1cxzqJM`NIXG)4xg?tDys&xp7TO%{T*Wmj!{O*uuLNR`e2bQT=2L3hqEv* zR(EMI$8oBV)b~aW#f}O-j@+wnG_AN@K-l^5dS1z+>kRHLGFLVQ8%>5%gK$sQu=7W> zKZpqgu>W%Op=Q}?s9Bbb8(e<_5l(Eks#CsR7h43!&c2a0L+Fq{!DK{$a3=ufgd(-5u`7}ub*KdVA%DZ zew+K9k4vvWY!I8s8*PCii~}UL2l{Ud03Mq}#<Ec*za!)o$_GOonK)*xhg>eg?|fgp`KcZ7Xl;9ZbJngDyZ3vK9O&q zVF2#uu?v4sXFQPFm9N>X*DzZDM+I&FPSkzsikps{KI;m-`;(?@W+D5MB#WiSygRrmU5WJ*|Pccu}a zX0PlKbI|F@W1Gz#)p_>fSl6|(xwB>bf(#*Sw_? zH-EdSF(6|uzw9fF%+>mR8j49`o95&9%$n?U0FG^y67%8qy|qeUV&sI)2Sp88K&^N*YA_b7l0 zl$sf(E(ghyp{5(GPmAx2GetZ~O{GiMblzlEA#k#b6AEv(C0o~xjBSncb9(tn&ygABZCLOyzc<`r)*_J2~^x(hEEhr#m>Q1pBY3KWCjn( z>8`@q77X;M@DCC{8Qy}o+?+fRDgVprLu;vN{E`!D3HS%b0?JJXl$ zx^3Xna_QBY%Z}^*&MSQB>kclJhDDIH$#oCuDTnWq5zn&{`UQ96ub6U%u?81 zz)Gbw;n6P`hz$6)3KbkrHg2BV3v|z~-mKqv`iQ!O)p@@u0a88pvi&* z+aJ5^`@2d4n4^46&aNEa`v*ql5I0(|+=iDw`eUO<5#RbF@otI4#qMG=UP%0;Uwi%E zjsyO$*#YmL?V~Ka;CmA0YDf_)GHCqgr?hkudm=?BK|> z2wA$mfbR(h+3r6W9h)>OLb4Wl7pFksw;;AQOmg4w%SY(g zL-RU{te|`U${gf-?+1>gp-mf~d&*`?6C_K^4Gfm^H9W5s!ct2nj&#TEA zmz1PokR+_k^`&BYT#3BAlOAnWms1zXceH*%3M5u;#ko|2XD?J#mrNG6=zkU+ZEh93 z*|t(qI44KiU64Cz_;OFE^q^`zSuTh4+V7ekuUKS|n#p(8pcHrh9RCc`_iuI}hcbyx zCZMj$AZ;7<5BA|6lmrF0$JAeqQpvJ@aZ>AwuZo`fgDC={aS?flm74p!M}(Gpb(W1h zg@i=DgtDvpA&Q>$CR|E;+7F$6n_E1olitQ}#4o5hRB3&BuihH6SI6Mm)0vaOhtCAf zspZ2j&*3-~eJ@b-&zyVI7hPs(D1N9|r1Zjx`quWICGZ`Q3ey#b5AW61n>%wU`w8-Hwz?km>E1%(OnZp9$xhuB*}XjY6mi>SOFK!6 zI_y4#QPjQqZv~{E)5v{yd~V|lGwYrNXc_&i|1Pz+3C$<6hnmZGxs)Vx(?g&1BnWIN z?6}eV#IL}k^~IH^5l~AKZ3T001d-A#vp$&paKo5-OZnf^2GRdHZTRmLk>J8c+_@It zUSFT%8|4>!g5F0I`Th6eS}`wF${7_aK$pnf%>|lFy)rcgaTyGm&n?H$AHmARX#nuw zy<VFQ>=OovOx=Fj=d7HBAb0WRf6)HM z+EXnd!OHF#E7@u1ke*e7X<&(c(B+_kjN$rs#3yoJxY?Dvf#aWmLolrR>Fr;{n@Xqv zxCb$FIl^z7|9`lwb#lqnCIadoOf@V z0E#&MX!BD@AWZMA-0sgrGbBhO+INwt+RvVyhDu+r^O@YI4@iR;z`OG^RbTMRbR6>c zaS{oTof@}9D8h*H2XWAf*-oLPJpkOXgv6mC0Sf$`NRTzj`R!kEh_)eZdVq5+I2^&p zPZU8u+ed`YV%tvf2xYu@azmT{FE*qQGMyWBWWLb(zp$ZGSt69gf3t=%4-=^BqBwkq zVz(_jz#kA6*YDe(!aaQfXjeIOQg4fBL`k11fXXA9B2|tX%~csO%3#u$QZugq;|wv{Qb;RG)+Hpi zwP>L6FbYoutdic95Is4Fp_hOAZFAv}%Zwllmah7kI3!KgHx1lBYV{w)P*@EV3%%QM zYe0(RU1^*iu9LI-Ph#i?L=1Uw>-C7-@zC2R@s}7HkF+>YFtUrN+k*MnY&HJyemB6W zGBtJ3HiJOLh6|e@5$|Y@>D_FF6#$AHAZFR#$(UP-+HVQ>=sg45=}?%0f0v?+an!Y}F;L>Q;0W?BF;r|KJ@w56O^<}5 zsV$F**1IJrS})F&@F3)l9qikQ1E{TsOha`+-J?j>!DRqP1LUL{%>R~VI^Qj1qQ^^!(GP%_$@JfrXElq^GNtDaI+Hy$HN16 zZmI%QyDmC0?4*9c;iS>ejz)MxRaZ+tBnSu?Rd5;J!27Bmx-kV6` zC!#;0h-IqBv~n((=btQHA-h?O1R57SPQ523PStOBAYuEqn?N77N3@Q zL;pnFvcy@aNb#3363u5#-qnx&Ec5OwasFRaT-!A{)h4??L{7&)+?W_3jMb?CPdUb3 zDs|=e-w0Bj=NtFk*yyYaYsH#?$bCjRoHptt)Kf~>C55C{x_>+mE?5M>6QOrc42AEc z1t4fGDYU~aq&esju&Yf{_`r?uBhop+oNmo*(cj$fbfa>x`>X-(4yI}CqDz!s5E-4z zxLLae3&#aD3;$7PZjM1wKpRXvT=0-XrDZS*N!qn;amZoOA1ji<*tN!e7PuoBC@vf* zIXh)2EKdpB&RUXy(0=hb|9OGtN#uFvAwRTuD8%^;R^^8uykLQ{?>ReEsZQGUG_H4} z@;Ij&x%&R=6TET@fH;3nwcrJd=#4C8Aeu>}y?805Zw(ABIPs}pr=gq@()Wij0mV=E zn;uZ@#&&JqQ!!zoe?HU_A+QkiA1`xlE)e;@J6UQ)k&)ML>VK4RJM8-!`s(l2vj4y> zLylvr9zV*Mq6)&TIw~g9i8U4)}{9$3XPQ8&~XV-m&bR_Xzx`&Nm)*N z^K`P>sP4r@yhmm!Q&=FZ&Rak!@S)hpw*u;iea`B~iqmqY6un}VawR?qeB6gQKWChw z69>B-%N-{6I_6AhAq*$+Q0Rpcp4*%rT%vP;`F@}F)PJ-GJ6<84{XDUX$x z7c#!3#`0<^y-rsD>4Nrp<(^RthWy!>`~H1oF=ERlNPXkthE^@&-jsCs%e|jZxKIP; z&)(Vo@a~Vp7+ACTDk+Ln8lhr+nZ*89qYK(!Ac~Ez$H|@~|DN-8;-G?2vEFeoBbluI zb4-T(^wPe4!U6T3{1`)Ek7qoGJ;l3EK*rJIE^Rd9WW980oy<0tXLhmPo zg;x2$yMbI&RAf@n*%h0)2)xYv4gOVr8^{Z$6WnQ69-PlnHdc=bX7G*^h%s<4fH!0tYaxH=Fq zP~yf-y&AP6yE-2jrUJcLaZB8hh41~%r>xyQu-Ik+cX(l_jhefNV)c%mt4A)H+h~Gt z_|&gV{{U<@lF4d!JWbJ+t`7krye>Hj_Dw;Z&xG}~oUK@s0g+_J~`|nbRG7>aBur_oF-$@h)cPz4; z2AVLkY=(6$3xA>@t~N<%YBOhBBo|7=#IuS!(Bg_$h5Z2EgZsWoF@x5$og}>l;UN8F z4TA&XS;?xZ(7b%|m!0H(TrzBhcdkvH8^`|4Oi}Je`%zNrqVTI=Dhu__iNBI$FV@{? z3L}zT%@s#zIyXXVDnp}1k5YCBG6B-(mC0gXVnqm@nWgn3vlpgwD zkII_6h#S|-R(5CR-V6k$gTCk~oz6r!b6ab|z24e{4`7zMslOM+m5-KMd;w#tRWS@3hwMr639wwUabneHpt`VcP%yHOszd_^g~jObpzCE~lK)!bE7GOpM^Gxusmtn6O#Z}Z5CEx#)+N;49r<;%j^Zc+4eZZfo@ zRM8YmZt}&QQaiQyO^JJfFN!1K%l%cTBydewvGBI9pWkbIY52~)vaRdEbTrj36@K+X zT9j`);R^Or=6aG9X6_>qxrYg4C6}DiMj@DwDJ;J~=Yb`vRL&LQ-BrjXWuf=CuDAMC z{0s|xG*tOQg3v#dxnWY-M6e2JsYu$BHMOsJYndI}1C>K4KtX38z@bBrmvtswAEz#<=g$DuphoW3| zaV>gUnQ|~Y{eI@MFzfzs{o0;vsC-7g=e^6>hVJ7i?+Xo~bn|&Itd4hUn4aj#{$_!Ow`10)V+TG%NhCgLRVvQB28xFUX zF@JnCmQ^Pf+raU$!Qp3?g*vp}ntA?O_5NfNC|I+1-p9?_lELVlW>1a8u=(e`X4_p^ zA<5MAWnmb&NUt<>7ee0RY0Aw+PQdwpR(~#j{8qpotV~?pH&y| zt+3>Z=}Gh4I2@!X$YGb(b&c3D%$5R!nP--hL7#Z zhUJG#5;Lru*7hyi|E^e2;h=SgpnR*1G;|41oPOQv?p!;=Q=?_ynN&jEDeF*cL;h*C zIHF$XX<8Tax-C1W^`RuvXU!rS-{{3IzN<<{2IFd9)921IutS}Ht`(iQMn@uuML#=l z|CEi3F?UzQn7_6le*ng2I+VXKsmq6tRp$AdhH=vw5_NKwe#ye8=_F!9TxJd1FWF=| zJ#MQ@#i*k?n?^WA&*A9>-@&Q$Zf;_dBG6)#(;SoLeW1!*w$2n`567c>!?&)VrRAvd zwyvpL|?7nVRx#3t_Cz)*i%Cs1|5)_t;1klb#6NimgnEr7`!0Wbq76y zpx{s24}&5pyVr&exiep)gD<6?7zcnyWGrIg_g(q+=qt$?aRcxdadvutr3O?>?xh}n z2AUMFR?LQgipe;4`__s zYLLa#m&2R*a4Lp3>z~x_Ca6C8Pij|w(yJEh6*ze-9%DmCTanN(PoNIhZ-0a0G>C*FnHS|8SIg;|2-JMXBOh43bAk+ z!3vn+{$~=%q%q96F&BC9Y&fvC+Csok!3k|(&$SH25IA{iOk3mW+(*{$_6!k)FiwH- zJc{wQ#~rF>s34N*d;*hx&yfxz3;Qx-4C!xVlUmfT&(1C6ah`tugx2})DMwV{OP13^ z*0cTJWrjX|VwI7J@j1FdQC~14` zA4aL%@Lj$Zli`RxylFh12lqRA=N9Hg)>~CO?YHIM!`w?QWr3*f_vs)#%Xa{KpZOv@ zebnNz#}`lvJw6HjEZdkn`+OUG#@yKLVf!d1M!C)N)*Jkt4DCmBJc&{c z_M2F_(PLSfkb`{LH)%*y%3+5J#F5Ugs6(&RhsEx^o&9N#f!Y?;$22t{mK$TD@1MeF z^nQJZE=DwzjH-Gc|vrSCFgO~iHMsi>DH~1^HBN>g4W-@$U>FmjW1G-8aFo(nTYzw)jljy^xQf11edE%o(y7*WGsIj;G0V|O<*;b%_U=F9f0k3Wzac6=J$&;m+$+Nw zXMAV)_2Plt>3x-lvvUbDZXaJi*hUJXHSSbxu++{R|MS?gx^)WKlPP?=Puvc1b^3^mP8oEY{1t zL6{P*ucc?jdehN|pJe_^Dg^#P9X!9PAB{${^0wBmb{?oq{;zPYY4vy&H(WfaLfmQ1|U7pAnGLN~s3{S-J1fj-{ zbk3+UNp*%e$mxq_hx&gEV@E7hxbN&z8F$YYfutVxSB zaz8wM^r=f7c#R6m0!qhxm5h&-X1hfO1}qE_t&A;9WMd>G%95Ek^!!1sNT?-SFE?tKoJ@dNUe6M)+ zGL7BF)4K6IM()06+5^oqPB(1*r)6XE#X|JGt)o}VwJ}FNi~3Bc{cc%AIl4(3@^Dv> zE9|3>S1VC<6$`K2i@E-U+7*5LK3hY&8UAieumJ0i1ftm($K{OIRVn%EQaF@dl~C&d zjnJU7d!>Mx-7;J3O!J9Hm$llkDXekwdyb{S99iiqhNPLpT(>u(odoPa{Ka5C#XD;2 z26KXK>sF%@f+655J8HOsyx;&|-O7>k4?}iTqxjjr+B zJ5__!U@@|2swjz^9yU&;!C4(flkK~)2zzD!*KLq?uohu1$%D`eHF_gZtC=ll8b7?sLblam(&3+2c zFfta4oLAtTj7whDg?f%~y5bnJ8yJd&Glw01bR1e}C33XE|M_!ppI~^c*hp|5m zDbs9ffXECl>(t0;h*OnmDaHY?#)z4pfW)lnw_l{f79)beu4|HMIw|A&_VjwR2J~c( zNg8r|#i-2B4EC`Cc+5M#_@}{7_SpysBEXTP#>p!>sv$Vi^LZ?Q{6!7NgR`{?Gi9YUezq=pE1zi6rjDy*Qh z{Ji#%fc?P$KjjY?g7nD4|DHDx1MlYkJ_?IT}H* z)D&B1s=a{Z-tpZGC7mC%j615hH+=|rg=hIxAr83{=Mmlh`oV*`v}Vc60nLMUL5d4< z>}QJ@$V4IZK2RGb=UO80YcHS7`=X$O{iLzj4wwzq$0OxQ=7J+d9LJjJM!AvKYbyo+ zfQ83{o`NSs zLZj5!ASxS|NCMRXxb4+VmE#535;Ca#lSwzql1%R>TJ_dnwwDGs5b-knS^(6dR%2FLfv@GWz|y7(J&AaRLH5 zi~X8-$)<-T7t+&F`2Su0mx?_#5Ay6h+|hRn$w^{3XJ5n;Kd5u`MWsF3`W{D$L@)dS zCUB)U@slv_O55}h;vfl!7!BdDs0Da>9oRL|H=}f1BRORXLB+Bjt~j?49-emx6gFxU zehT7w&Xb6baM22{>tfVv>6qG`8ifycqe-Rh68*DA8U?7qf{~?ZV3Sj@K zGDuT!58*p$x!>0RT~8EN&z>GV@ze}YmT#V?s>~vv-D%eokfP!u-%X4Bw7+#=)ZO+H zhQzH-(~>`!3^#wZFi)Ir=R0?U!WN5yzMXmp4ejIB-e>WuGz; z@zmf!p_*-2X{2C#T(cEr3Ozg-@QKJRW7S%-aRQ&4#B#BK$`IsLQ|VxWus-@)1kpUe zhqQzPfmK z+Kb-FAN%ql98zayFAtOEcn7xshKGYv0^rjr-;ui~68XZkmU>D&@%`6R!XHv6`#YM& z6$=@2Q>`&kPAv~ik`Pzb`CdOOqZgMXe6l}J=ORCdeo&c&utptwZa3L?Cg688tE)!y zrRRWDl(t7jS4UH4x-RCVmUr@iATFZ6ZREN0#nh6&SFvkV*?rm8>r429LM zEWJ6cAA0jpeuS9CpRZH8dU$1oP4Y(}0(}X`gh&Z+MF&24{COKCG%XwjwD_m2px@VOI1g<19!Ycx zZESQ?B>N#V`QV%RdheiVL4tUpk5@2NU)&nygjy=~n-0b}xLJ4VGK+3reW>NZICYyV zlW$_)zcJXK8}Qm#@wT$(iJU}9X7XuKd}Q@KXw-`eIKB=?|DT-h;_}`PJl!)%NH&$Q z(K=>vd#|Gs&~JMrr+z4l54c)tC8r z@DoSGbTHGGCVsJ1>UErzNJh|iTBPT@aCK7TbP`6uDN-a7bBS)n*@QHW;%C^$M(Raf zhlMZYrTij#kzXTWQ8iwM7H*r#mqw0=(f2SVQ9rr6M*$I~TTzu1;Y6;;%07SY!dq7) zZpjq--w%&D=p@`}2H)++sH_GZJ?ov<95X$}bVw!crhZ5^SFlWNSh~K4ItAaN;;U2^ zS6CJ^F%{NSCVbx<%wM(aywAu|$au#hgoP8dc8o&`;)7S?ML1DC5>}k0Xm22KngwU& zmXI0lAxH}htdA4~;&XI7EcIebRU(%M6JW#c;T3VtNt9Drq(~|HepDhd3FA&rObhoA zrH3Q3_+V$#+eu3iad=XoZmK{_Q8ckEzGGYxoN&Z}oHXr_MBVprH!TeP&gCu&gsW!p zVRtQkGm;f0lex*XY#oo}!g$CsiPMtS*^mC=ld7U0e|Ia2?3;>INX^ypkSiXS@HihW`?(*i)=$0Joc2m6){xt>^C}|?Da?2}Azv?J^h@|v=cs81 z)HfeXPEL$BC9_clK9fY4O{R~+@8WkE&Y8$M zB*Dq@y?NA(wg>!(EvIT3JC)6M!UL{b{LbWqT}xS+SyN`PB{@4{`C2zUOW>BfA~p8W zhimarCVyz|&~(nUAo@T{?(|)J*HqHjb!Qvnxw_G?! z*Ec;`KZo1U!vRW@&E|t+(tI)T$h+u?9~LfCnPrzk3=AwqCYeP6+R-7ZvEjXG1e2s? zaSd1ED>2KQsl19y5f)D@BC$EA4+d}H?~h02n5sc#l=OHVk1p<9shI2Y_+$$;=!siN z<$;XMXbX`@{F&){@VoC>s2JIe4&JAiNJ~OAQeL#D`;qzFn^I8HuD@Z-b*mVrglyr1 zQdzO#K^Ci;oSfL~$dc*1*yGsa?;|lWhf}6^OOwm;E2N+Jxvik2Jylw+LMqrLyslr`_tVFB{5YZ-dT}- zsmW^<)9>&XE2)&tD0%Sl8-wzQWl6Ma_!Y{f2R5JgKZVnQV;I8)Cj{( z016JZTq&YglzcmytMx&o<$de@rE8Vc?BEG^QCc0W6!4}q{hUc-r)9j1Dcx;-$l`?L zm(E5eJ}M$ugcvnX_T=7bG4I%+ z-OAzfrql?(5+P7hBp^{F!I`+Jv}4!Gp~!uc=A| zb52+!_pu{%u=sXk<`6^c3J>5;N5@?={pr>+19Puj)`dy~R?;BY!i_>u{CTRyUHRlQn??z1b;o2cMiR9#qY~Uv&Sy|-g`aa*=9kpk52i5>g!FG2kWn|=V-dNf3xl~ zUv^Q~9lX@oh1>r%5E|8VO_UzZ>#kndmiQ}=$ZLiv?{g}-%Vgi1+3r^@J_z^D`Qiqg zPIb71r@Njq>wM)OY-OgVT4}c&o_uX!*03{<$k#wa#N&o?9|qj|eQk)_;E8~dN2B$~D1zz8yxR+#EQ8@8vzWo~9KP?A?g5*druIm$y#b^H zgU8y_#cRWB-W|)XtbeFDz4uR^<_5g^_>?L+p!f5cb^GOVFRZ@?tC1OFH^5M|X%B+~ z6P#FxZwxLE!_8gT*`G}!)YcNZN5{CO8G%ZObZnedUCBK*)($a`t}*eY{p}2ETbs%J zmRf?Hcf)RGO0p2#srU%JxPJJBQU}qh7LfLTfkV7p0*ILuocpHxA==-GfE%6&{(%Ra zXcI6zVDo0epEhAri2gS>3`Yu_euF3$P;eA-{r$?-c8D$M72e%Fg4Fg+1DaSL-Z$#& zM=@nm(CnM8?huYMel)ufyJCYtyMem$7=Hj?1`%i69B(?XX2?P>$LdGxrZ2<_b8@zC z%0T_(u7LRR$19NbV#kh=k-4jjdb6Us03A91c=XTX+ z5Ti`PpWY#$H=B(MQ(p6T^7!Ji7bX{az<0HW^Bs9Ldsyv2?v2xEVi(6VyIuQ5k!}WE zxvpu2#}=k^`E|R~H`wE>I{K=6(YgI!mY3w;E`$*I*y5gV81-h4*qupOls@&;kG^O; zZQ@Mt{k*(1pVzvWhtPZWXd!pzOWN}OeAP$wPLDrjh5c1HhkNfYx%E>joz940#BQJdv-hjc2G8_ZRDVzv^Wh7=>B~B)<11_dkUdl4yqb@JUxbr zx4!_lPbNBXxd>R)Rz>FrtgJ@gmoWDyFb2&V7CpzZ2ore?W!7N`u@e1DB_Gf!*0zAqwn0d9Q4NT0?crn&8c?!vsrw7 z2D|;9oKp|hEs8U*DV<3szFw2v|NIp$;vV_=TzGFp>G%RH3B00FH}dwOde=IFR!SBC z3aIrbo_|A7dN9X>9(I1enO~jtR?|mvOM;mX`u%;*yO@x$rJw-K^p~_YaNmX8%q&4jrK`2w8nR$o!{G0B~>JU4NIT8T$vPnZI=5 zH<*;ZX}pA}&9O1Qq3N9Q|I952{z0lz`o$AP55W1~+9Z}BG28zOx8MtvkWFOvmPfeG zk~*OF|IIDv&Puv1or^R#cm7vOnQUB(xi>y+U-fVP*OO-gjw4*J#w3I0pY7oM zZz~(a$KGR)F1|L^-!}hpu|J;EnsMBzdP3dCO06H}7T(`Ci8pmJHhE`d=P61;X<7`_G6vW!3WlztI~8WOEEsd%y@qP z=yfUi7_mzGCuE+J;w246cQqsh8(^$K3~42WK79UF??O?`>F^>w%<9Q2jT14?lC_wP zunR(m%y0HJO5LTa-c8P^3Ryy(z9sr-D&)+s%@@gM)@wk=xNr`utJllP)h6NNCE%5N z%SX(w9>xnkjX(2ir1Qq}zKIIWGi6t8?nbyW+xpsG;YcEe;0+}l6-O`I1zBHtl|nGv zJtTErksdZ2#Q7@4(hf4?x_jU^UIb~u)vxlhEE(PpgpRWk_=LT7R4%26AFIn#QQT}4 z#Gk7#2~+9OXt{dw0uzagBd%6gFxL~WZIlzKYuV$!S4JXQ5!hE9g$-#ajiS;c-;Z6n z4kihPD*M!7_-K0u7*^Rc5(w7va^2UX-mmO;YVjyA??=} zY@Wj|Mv?TNivs@t%qEA_sVNl-&NQ-Utn>Gb)kGS;5XeAF|_2i>sg5+CA( z-!KG7SU$CLT)z&g#A{J`Lzom0Wb!L=BQb0+y#rOl1rX}zB|{g#&dvS9CInoX@9sHp z&Bj}79k#wOr9M1Zn4#^-g|XNh_&wL21rDS3?av+ta)DrUMIK9`x_8LF1VX>=G|Br` zAIv5^@9H`efUv>*6&@A8q<{`fZ>SmVN|ZyXlr-fpZttQ9cL8#+pr_s_2SP&|l0(drgySVyUm8-~$|aWa1GYanp4mb{Cjd+I z=unanq2V%M(NJ&1fw-8|BZd$Ofn_jg5)s7Dj}0q?iO}d_7`{a;(1xHXxrNJ1f_B9A2va_ z6(y)TYNO7ClH^0>6Z4QAx_{M28 z)^-y~z)rv1wXx<&2fi@Qo4>xOaLYjph6MXXU#|mj7vLZD5$>2PL`RuCro2MiDgvlu zMyV%(W-N?D0L=^en($k_)UpBL2!LdIHOO~3J~#+&UFav}Jd11x4{lP4CU!t(Q}GI# zbDPnPgxk8-=|NEFN@t7!q49U)=Y){Iw7h2?A}B!J&H5`cdnAZ#^s@7tO5B|%6J zAfG{fI0^Vs>HK?8@XF6waDQTg970Yc_0S6U08+>+)i5I&>8K%&ke1-w1psdkH(r*D zf_4BP*X_BQnM&$k=g~J-{kW`QFh_n`qC&WwJgwy^mRvw zAM1exZoBh~xGnQL8W?$~_JrRl<1b1+-y6*9PBJLA18Cg<;-jrUIAs zX(wxfJG9utj6f}hb`&cC7j;)Y&LX}8SHv8{F346xc?{s(xPr+mfGdtJvtxhoC7Og+ z8bpd7>E4fILfM0FPrO1v^hj%0Ar1U@_AE#Tu4C~UW8K08>J}2(qi}hyx_dSy%Xz6G~Y4#La60V@EwT}^$pb`mR;t`V)Tn51zu_)p~ly|Jf&xetSk!JdN#dXfM*)1sGc*qO!rl zc(>3K-SjgjFdFXHJu96Bf}_ZFAKEr9hZVALt8Vit&d2#3Xr9(`g6o<>pTb@|p8u5Q zC9g<{j@NHv<<^e~p0s7;D0C3uFn@8ZhaTcWH(&U+AF*??xH>xSweOpLoEFJN=x=?2 zVEd1b88C=czXTv$JRkO70|ZfRSU3aOsff5Y;OL3Ws3>kRDHU2 z8P{3xV@j7CYW(O~xYUj=wcT($Pv`cXZXF*uHs^`G2i_VOekI)vzVP>c z1HZS@x6b-=s|0;Fy*q%P?aZjgB0kT(+1uxfBki?+e1Z#<=*(}XhkwlpB6Y6l?&Reo zc7I&?#18HGH*G|-&T8)Xv0|+@1Ej{8#NC|l2wqPnA%CXdk}86YGz?uP-rSJqOrxij zo9_XiJASo6Qsc~8kPnXqf2Mul>k{!IH!$#M2#5%7!+M1^AqCQ?QVY!LqqvO~n~(7D zK)uyn=gBZd{m^&=jxEr|dHq5>KYQ6OtoS^x^IXM-E(@alXrV(*H=N}$QzhbG%z6DT zG7gs7N%(-;JE6;Pakh}rEXsz0yVG0e=|@7JSoJ-YDPRpZ4D@ZSOYu)j1=KCT1~(r> z8Ty)j;Bqi5#rGOF^%k@b_S(1Lhc7v=aM}GfLu~(uT6V`eP@*0;dOFMd{u*<8an$bE z0<#u1^sY}7TqJnj7ydV#JQcX?Kzz{bw|p0`2*pNN@cYSAM;kp)%i}bYeVqzpyUK)q z08x)Es9oN1$h!=JqmIKW&?+q`Ro~~deO#Lg6gVIDw9)ej#r=4Z_cYGV(=mS0g8$QK z+?)k}0Uewfjd<5mwKd3;pZlKass^2&^Oht||c>5JP{2nfS zSrCbvieA=YUYE#N?q(2m3mhvE?}p-+6qAoo)2bRhgDL1Z=ZIw%)VY=@zj4&jUGYB_ zAghFpKy<=#kvPnUB(+%k6{U{jGM9sK@*mQd6>!zu*?t$1%9fcKSy>An3B8ln>iV9C zLqkNJb4-(9V^wx^OA_C%b)z`CWH;Z7zt$FkNeqH?roM+oCR>awwM2@UjiMA3ZjTB}xd+x^jeV_E4e~;Tuk(IL67Ycy zbA^$sfRRM;GEAA!lD91Rb@WT}KO`vHYglt)K443h-HQiOQtl3hf!!^f^;>*?m=$}*9^q-0)q;6ko*GnTU~OV>6Wi;jK`2{xXBM$42gjJ4 zRjm6t!7$&_>86+(IB`I}i&=_(QeOV?K3Zw=gmomwnVzxifGmP4^i?6a^SuOAr!?Mx zr=r@`6Mpr?N$2W&S2CMpsxq9By;l4`Gxg{`8M~JJ{d*_2ErD*JCUGLav%F>*!LYfS zjtq`?Z3zEd{GhSizgQeW2Q{Z^X1VUpTJcX8R#&4F8lxY;E}_$fxioWd)}RhC&%91S zht6aMtJa`jXEP1?r=TapJy^1L*0(f?=vixwx+U>3ri;QV}~e4*6fu~Zga^)7W%_;(gl1` zR(@ac>f{I6PZ~h?^1SK$APbIo?V*u0q>xcrxE$zP(da4-g+j$qR_wnE>#VGsz;{)p zec^ps=L30w)xv6*YnBo|WdYXgbG{9O<>yaT3R#gF>(Sw9mPXb*tQ#%G?_BDiOj7)W zGLwuf{S>SFTPQiw(AspXA>25oBp5b&{^V{(vS8iq+wLf~A?EWpC9T?dXl>T~G`G64 zy$V!@#YZtbJ-cbyr1ZLFbD4SNBelCRhZD2*TP@?ftHvwEoyY}sX%(?0;xwSJU?T0z zkj1r_^sCbOu6rFqdWo;DRp_>zU-PelC(Bo2T_;~x?a z;=6w=b+G)#qM4PT@PDGnz@3eVj zW{G&iXnk^c_XW$Y=E}CD#v29Xh>Wz96$83KKu>gK!O+j%jNKBUfCz_=tx^mA>H+kJ z`t_3)LNE6E+u5lCvS_z#_~R!B(G@~) zLdB8TL5*ww^P#;UH?XkuiHrmtDGx1{48h^uTcg`@zrGI#(GU`zhiSsU;P|y=Q(sfs61avm>b^wA_gjMfu0e z>d+&4AM8W=v6*o&x9Vw?P?Xz)Kd+1T{hopE zh(Fr8j^!eJu01ymc0Vxk7&e<}<@Wj2BlByY@$8QLwqaK<#nx3eEO&#C+Iu_KI`bPt zdtEzRiWtvQz?-LS?o*u7~~6&DL!_Z)|aFwgL}kU&dvpaoxo zu-^7BqhQw&yj0BND=8DL5YeJK2!&u;r80dTU~H3Qym;(YTnx0~_G+VW$e(1E75)lY z_tF(c>hfM8YLO{4t6QI#mh7=Co1hm!ly`xApE3;t#DYSc7agr@j}(N<#}Igk<_5PB zV#J}8LR>IRG?1s)OVOt{r?sFPM>fIYPfsu=2&Q>}8v?j%XW-qUmhbib4#<`pv2dyz zsg=ucY+y43abcqWO&xOs4I}CXCf5?m=J9D%oF5gFAdcjw{EaYJdtsyO39Tf?$aFDh zP~g*k_uXyxyS!>|l`ZOi8+F%J4Tx2BZy@k>S5aq2ufj0H-$DY6)m3N1>|8DNMWEWy zpEm`oRnM3owTePLBCJFS#q71&@KZ0Ik%ux+NA3Xn zzPJw0e2HIkz3ad=;=3EahQXvZRAABAH5dQfxz+0V^x1j%FhAF7-j5X%E%WXs-;%9H zuZ$+#64tor#gvd;$tCd&NCd%6~WMKVMPuPHJQR z^@zQ#)WBH{h+H!m9M zT^4zoZg_lb8yXoYYP%y8^^wmX!C2XmD10i4j^4E#@$_MY5?7nXBd($us$DbqX zhALh+pQYC@z1o~bR9XdoUXppC@VW_O?C`DTDNDh5TsviUtZCQI;oF%Ua_rjV{+Y>I zt5^Ha_|%9EW#$OOXLX3pN_Mf&U^jX?p|H4gY*Q`gfRTff{sx5*WUTq$%%^!#h#Xo4zY+%2N)}z69>2(1&w#`+b zkH9GV5$u#aQ4X5A)>V0ouWDHVe@xTiCmAzEWxO>n6e>Uut*Ml3|IYRZ6W@hvS;{8y zZ$*4w=ht-DoBxsU+%)$PbS9QOZU(!w9CkJ_L7zeYD?dQNZJ+%+vRsJiLI-kgRt<;A3WWK-q5%wH4IYeP+kkB458P2-M7^5?BNydAy- zFAAsrvI*8=9p>8R7s~t^eDn(J0{b7w$I+Nwt!Di8wmvay1RU!1>7XpW?1b5bmQcfn z_5=nQg_nOb$qUJAdJ)E}_0mk(L%p?)k58&P2s9;E^j9I3MCwk?feauk3i(2t`M`y+ zvDV;_C)9kFCbf|);!Jd%p1^eLDU#&0<#H0YQ)_6=G+bW6K{E7Ho-K6ki<87yJAFXu2;!8DP&d;bGjiUhT-XV zkp@alYf;j^UKNwleNcxnTzNdCkZ@^O?$%dFtift(!#NG3N;+3%Vb95kI~qFdXUjym zWuMm2pOCoDoGaNfY<8vfP6QXzE6px^yW9X?O9(MMz)|+=@U%iGu`rQOqgPSP;)>}b zD}~T?N32L>NR0WlF2Qf4Dddc z*&2lVsPJ+5w8KAZhI(@~*Km-;e|8<-)c`LDx`g@CGA&<(w(~DyK{NUh1kiCey5s;ZxZ?0$mnnpk za{2BF@h4Mi5&t%!zZFEWD+TeYE*?MJgeX%Ugv1Y3eN9w)&Vvua!o^go{HjdvNzdhyO%`*e=D9-Ma+tiDj`Ph8A~Bf3Oyr_ zXlUzuqkn&k6%KK|n4tY8mzB(bGq00Jl)^(O2>bTQO#kcvkJiek04M;;}RckSir z3ivOPW&jBo9S)}GN-n3K|MQP{DMj!cGB16Ih!k}r9Csm-Ai$PQ`6=UNd@82%AX^v$tz`3yIq ze^PE6x=X?l=n*J6;1r4s)FG7bXOS<=8jLESs%VfW2GLG?fcgExnfPl-k_?!4{HO`o zzYT)OlOhTTbezoY|0tO1(#V#m`CbIJ3Xnu>;CnCpmxrmg^z-%WzPY$?Ui5Sv_p62iuk z*2^)5;x=v*aihktOuXP0)lSg{FnR4tiBb}{P5m>^$yBn?^87hs(?#ORz97c~M6$Wa zqVhYot?ugG?OE^RY%8F_8&N<%f*Z(ZUGRrzwYskbLFI<3|n& z5D-qUYB6+Ro6>y?;f8(C&kiWQj3n*rhXJ`H<&TVE0!MM=iS~hRCO=4Mo?&8VXfppB z%gMmU3#U#F>O!%Ss7oMAKN3e3j=@PeA}CmwO%sTf%}7%OpvvzP>dTu%7K|ZRB8!w$ z%bCV^p_I5HHtg4X2fc2%ED1;XkLneV<52>5E_yV7{oR9HOG*q5uN6r0R7OJ)$JBeVGfOGTVFwsIv0z22W!b**KpJequ?0zTgX1&YaL@%$5(d zW7GfkYlU`)mrUa}=|_iUKoq`<_TRWzwY*qVp=c72KxT+&6@v)l2Ba7IR4AMS3Fxl~ zd~;$IM=3J-TgU@1Gs(dDvB9fqx19A_01sXk(wE=TvF{fz0u%|FN9Mdnjs!+df(6Z? zK)?c-A%#}hq#zp-@IXd?f*%S0DTNUhq?6)8g8MlmP%q2Ad#KdqZtR$ZBG5*n0%hbF zTlpd+LISjT6bc-ly?8)==LKCxD_BtkWJ`ihfVx*&9J9X{o9smjkle&%EpMHllDT`N zWmi@_K<3m%i4SC&2~r6?pU%8HaGKG>$gkd!hgm`&*1mVZ6=4Jl-eECfG|K-X@6E%Z z{2%|{dln1^H`B;&RI(-{yPA}-NW z?$suQ#8<=cqXGnuR&Jztqt(#y?;HeTUKejF-j49UwN2EI)|SKbuUmeCq3xytlj?iv!wV~#+s*X&YVT)8Z`ZB2TV_YA zeH(}0ehJ)eWpLH__Zz+Yp0(Y!YElz8GyLv%%Xa%#e9ePTM(=m$w>x%5YaVS6zdzXB zehF|>{}&%YLtUbV93Ek?YVCA_3Dhtt;}0A*J6!@})Cjea58OdJ-8k;rC_~s*g5j=|WJN7hJEa=%OxNt4`xQl0q{=jZGotq}53`Pba zUzkl&31Gd%7woxgF*isFG(RV8XD9*p15_gmAM%{Y!5`)e{(S~+7JP9>c)m@YfTi<( z(`TUx>AS&oR5!c=q0h=s=Biq!uq)d3nfkl7-#u4_d=h0hNFN0h0>E&(P%PJH3ptv##cGX+`T_Cx$^*r-_aK&F5(cwJn zj!vrc`VoY|xZ8|b)r7wVW`fRIF8xHZGMkm>$!IcR*ZvRkp@QM9;5&y^DmOT z!#UecN4~Y83-qzYG5hx%!?dKWJ`+4!f1mK@5nh__5_=hmJ|-cMc)u9ld{S|i*D=(v z`mEIUVKkQ2*N=##TL!r~q6ox?{8u0Rk$U7-2-%PP`BuCdKLv%t{GduQE2|$=YYvC` zn$!JweIMp|lJvZc+n|Ic8jv zG1P}R;r~c%o86EiA{NPwrQU({dCJp*FGYn0e$MUD5vE(r4DE?l9Fyy`HOv+=Urno_WV+&fq z4)&i8e_TWqY9s^mvmoZRTO1be_scbG%nc_d6&D~yJn0tkHj3X7AJUtF`3p%nSS5+j zVK6!B`?A-+%>lBxTOk*(XF{(!m=lpGVdaCRCo1?G|8^q_S_Swq$RDteC8@CoQT%>5 zAI?n7E0BC;(W}-lZsWyc6I@c5m+>YU=5jNdE*)>q_m2fV>Q5BEj7+$AfN?03{xCd> zzmFD@a?e;NAZGJC$=Xy#@-Q6icbGAhiLi?P>SN3xll23Plc@-K4Y1x6o@JQm2JI45 z|D%KCZ8sUue)v)LfB?H+ zs|i;!y_L7vDgMTh?kBBpJ~`)3SYRY=-!q2l3DMA^LW2i4N5c!*uQl5f(^=1|XS%Ot z{ATgJ4Kd)B@J?#xWNG3#%E|r`c2!S@{(256Mpj4$sXEHuB_sR~+)s*_bSj!(OEI$Z zLJBWF=#!7}DlXReTpFi38D7ZgAd}sn${MC&kEDc73_g-1r}{AcjS2Y2M)!@O)Aqt= z>HO2&J2NW88I-=FgRB7D=E4)P8K}sW=T^veeodv{n+HlYivCCyyNTTUlMCHtmSQ}{ zMDzdL$^!z8qv%MMb$fg!Y0WS85XPWD!Nr0gM#0-&p2HWj-yoo_1Dba$dX1&zun?OYS>vK6_|O#ap0oRI zS_+-0WfWMaUn#vN%WX@|{p4B-|Mu@HlJVrElMwKpiU`^&;G8d5aE@GWE*fL;g~|XK z2wy0>%3$%`ozr=gRnQU5zX!tYC>rjA&@4$=U`jsIy->{GQ*dUt&@GrfzgZ`*pXD8k zuWbRFH%FYCBO*$J;wFI*6ME(b1x0YluSye>*L2dYvO_gND)5XnAF)zq_jZk-WDSoS z%I$YSCU2FEQzGliD?r&ok&+V{!Kh+4`<`ccqKArQo9)D;*nj*XFt@CrF@%1h%q^Ie zSEH&>Ju9Rv@Q_-biz$+eEbRu5JIZGPC;X9O)|BeC7C1#hWY)!87F3 zErK~I{!do^rMYMB8aZb5RnYP9$@y}o0IV{w0yWUK7nfJ8vlcr|K;> zi`Y_$mjfLc$rCKT%H--RCH3;zl^oY!ytAqq@TqB@GfrrEj)1Xi4jOje@-pL$N8PS( z+O2J4@s+2>+=%6;(9`M5<%cV(yl-d5&!;&IH(cn4_YB$+XV~7Y8O!WdybdpV8P()A zfpUFg`>{Xkxa%`!rrp>Ya3$vXG1)YqTb0sj&8v)tMi$=)(lcUglH*o$dsIW(XD@4d z6N?roPpwPP0wKm|C_HaJ&|KCEUUJ)}|7t~{a7tnrzIM zvetg=<00!dXW?c^8y{|RaRM_osXyEHgl6r$9LTE~dpgMYp<)MwKYVd7>SpoPQY^n^ zk@(MSI|53t)3dgNj1Mk!XlKHRnb-PL(Lya92(!$}Uw(61FZ+8~zBXDD4n_l!KB4G%n*5L42L~ev_tAr<)fKk8#tSMzzd-lcS-nIVb0M zc8(h_n~@w1A<_N1^_tgeOXsgvow(e+p%yEFXe?dX*jLs_8=W@-h=**W?Y<~Z|P5&VvM9b#5 zTyt(k2mLky!tM;2Z8i=4&+2`Qb621Dy84;R54b@IAJe|Bpxzg*QL!Gj6ph40k(ij9 zy-j=Vp6GnH5A1Fa+T9=#*@J=C&v~>IJDYuspV_o1*;d(Q_cwYF=1oIee)R{p4GIL* zUDgKI_J&6z{a$K=EnAJ*Z8gc-eQvzHadH0oie*6~gH0BlLODHm*LvT35b8aKpX6Xx z!LD(6uySMQmND%SdPHKYuJ(MPxAqVuWNAZp@~5%}=8TG5hsTqLj31QVvl%-p((|;f zIPbHKm?f7auDxd2%U)w#gHUrh2a`c0Eo##bJ?z$i{=bflAZmM0c;qOjPf`Wol3d+i zhsL->0X`;YC&H`C!(&9+j0;Lef8Xnf-|Fffd2~vij)3(PEJz=0-3bPV?>s0)uuVku z(_3;ddJDs^k8%+p)BPq`0YMrhjtmfmm-lw%>InoYyO#-UATR*!Q* zO=t#*`$0VSfE5^!J0rgVeleYen{i5jw&9~y5Spxou71&Wh|b z68NNjc8Q99`agFM8l3k(j0OS6;!I_uiUL&Vm@dpdz5%gEsn1LUBO? zgmHT=aFbyu!a~m|Ty!Q>`H#)d)=7bflOMDP_X#{y5CzRT+)Nt0N(bWfUOUnt4HQC( z0R%N5tUcM{aU6XB_p2L(%R+$Ym4fX%?{{XV98VB@t9R2x`M> z_+mUaa4o=eZvtWVQvU=fU3Kf&I`H^y7xMaGi}5J#QvCww(y9$C!ea!=A`NJNEDS6c z)&Upi$6&N^KM!ZwvBlSweR6jf;osPm&p7{DEwj=ARdLH}+Mxc{;Hm17VRw4YzguUr zu^6CZv*dmElWtsx*O{Sy`A^pV#_kDi9hKv7X7F;L0@$~;93eK&dSINczM|al@bse< zc+yJ9SjJK``}yklGY8FtyMuap&H|5?;Fa+gAB|sWUqkaR+G>Nq=K39t9_i|3?X}gS zyIs=zy|AsZr}hD>#@(`Z6H5Va)2efrxqWa6#+8MhSTVq*;w86TkMM)(t2%d$jv&Ug z>Nm1BNj94kd0zDg)Bf*TnOf_e3H-H2wQdv0=3BI|>Xp;STVh)q6>~80W6O#+o~g8U zT$p*eY+p&#-hkGU{m(DIoB>Z|e|alACDYM}V0P?T^?Jzl|H;|lM}E!Vj8FO0+JCh* zUjcj#J+|dE&^HEFxH*M~KlXc6y~(40U@Cy-I7-vqS4}gG2;S)xvCM#qOTl zI0yfuQ#4;gv|SWA^jxH)OXCSoER*Nz_}78*K9)Qxvh0^{&9P1HYN^c?FWEniiOx^P z#UFpIh6qko#czxKRTJ0X3-Znti5Nff&wUy2FSxyQanF3~n3|_JgWK6-f`>=yZy_^dXT)LWY_+o=dsdljJz4f)`Wt6e{M!;uFgK>w zG=E!770AWY>UdTZ?#56qeiD1@3^*>MkT4kf|CpA}gbA1}>cwDBbaeaE4JG{eA=6R- z_^~xq%Gd{;`9If;j?F7S0u_jTAxn%-UPwOc$#qvUw4@Si+-OZP!zJ;!F2L%+fV-uDZS z-}_+@z3r+H*pd&e8SS0J5heQy?KUJ3npIDSZJH&mwsA$W_De zGToPIOQmTZiOYtp!2ETc=RX$!t9;u|q>+{Bh=Y;wKkM3Q47pMs>F<&LhbpfN8 z0C(t7GT=NZywpDCTX9@hH1gOz1KKKkaNTIgsTxD6{GPA%9Zwd_}q+BWH~+kv`a-At%6&=rRFWGsDIVc z;RL6mcUO1pG|;pIUbFM#T2m3e_4cx&d;r8pMEzXvXFVgxB0uLEAFgVh4`AY^3}Gof ztXE5yf4>?we(QUcHqU-?0pcUBT3oC73pFR`;f=FXE_f9S8j-zo-hca-uiDY95$^@C zW2uqx=;h*5`1|_0v{*l`2=(dVGaA8S5!*JUVU9;v{LO4C47(T7f9gshtu^)M%-iP$ zce>u_+a!QQrO7r;eB30s2v5H;e&En;0NHTRv#pE^LmbT`tQm&m~d9mv!t!|XG zew7$}L->;FalRC8v#;NFm$pwh$Lg&&W^~d_mLcgi>~-u_zKTl|1ifk(?%$iRt3OS~ z)PECEG*Nc*@t!e|Z*NRAER{+ClLK`8c<tHv(tc*s;%%lKzx~t;uS3PjM|NEF2?t`sE{z6w5PY zJ{MF^3X%RNT9r5vrF4~sqL6a_9-7TfB8G|P@FHxIaKGbtaTplFLaBQ*V$29yFnZ%KIO8XjB#Q;uA*7FenD0>rF80-=^ z`w)x-J5AP2mir3eq8a}?eeFXr6BV~wQ2((KnT|Nb96p+G^XzFr@8^_Y2L`}Q-#E~^ zsW?otL*gohSC0a@6eDDTzVBQ(3rElgyJw6LwCXC($FAxJCkqm}HGFcY^5@9O-&Q?5 z5irVqc8S8Jqu|*p@cY2&SvwUTnJ|&X7~}7oCFsDrwmZX*`0P&ez4 z4jV@xsOl*gz*L#c3LNU5I-9QYiAVP(fQOx-NbWE)T%NeEWTJgahpb>xuevT?F>#*I z0xIz_ci}H^W2#DV;ed?R9bJOGjN+A}Mvi}7uO)sU;4PA&{sErDQD3smL-RZwz#{&< z7*0zB=;w8v0J=Uz!k4X=S2hUQS*}o+a2Tw7x`i|6>L@!6iKYd|%Ig56Ui2CAqLC=V z7&mT^gM<>)z5DQfK$J4IXwaH^QNOA@;|EVXvh>K8rdphU#Yy{+Hx@Un^nS3Q6l6k9yj;zoBfv%|m)z07yl~I5-((CS()8&Pz#6~?Z0nt2!5QQ(%U>-A zvzI#LlP7x?h!_*V_}uQ3b%VciLbkO&IN-`O`aDQVi9@3wY|f9C*cQhU>wQ z{(WgnzmFqd$h+TkANiwi*u{5AUK@MG!D2SDEV%8mFF*;!Ll{6z*t5stg>!fh{)}Pu zMC2uF!`Dn}x1_7`mvD6ep6htV3n>)RP8u2*SaCqw0CfJZK1tAX>rx2(7R%v|MzPX) zus13nA_F9@E=hsgZDSF07mxs|784{8hV~zE7FI~f3nNH%u+$11j59B2 znkIM#jz>%gES!z;LYc4Xp9 z{xVYpS-Ljmo(KsjG3Ju$hGG=@m2%5OI2qV_8e8>G?lWW8H%`+&f15T;8}AD&ftTG$ZoElErn z-Eff;F1i`^LgqI#oJiLycQVe^r%Oi@hj=-HpXy4o{peGv#Ll$*|6(E;Syl-8Gfd=u zp3!f-qMZF_#O=~4lW(0Xs*jzS*eJI!8Ax8$CEGlD=Pv8<-ySg*;73n`>c|3?zwtU7 z1<-pb>~K98hLOiXLInK+Hai}t4G91{fX9^J!f_h~Kt8TdEoK3Gv!D}ZZ56KCv=XQ8 zLSv1`8<1OdIgh&FxU#H#Vi$=>et8;93*TFLeKGF%RR;IM>=C2i!7;Mx0B_dxw@dpH z9KtyO-!>j)xF5`YIR}U8T&=x~GlQL@ch{+S^>O>+;zg(QgbC!}<3&{-!vozEu zMX9IT6mAdH$P_UtfV|!%%mo)BR>b|{*)AO7`f!uX7?FV09ZP*WTLjO~_||le5tnZ( z$t`cF8ke0MhsMLD&nW4$9^-Y+S2=>*jM#PE^$dB~sJ<>p>tWZj4|&!)D-|UjJQEt? zTl9QZstpJ<%Q_OzvAXyC~%h>7-?GeP(s4uZBCd#@IejdHcp{9%Dn8t)3|Es7gr2UxJJBPG> z(VYXr=unu?_N)<}e^(Kt1iq_9-;<*MZm>-qy5oXBbS&Z_rpYwpsX#FtmU!U02!@TF zIxE{r!84Wh9(a#gGL_?JAp~Uua~XK2Xjz8j9Q*rWCm*-9b-9CUL~L=zk|yvuJs@3z zW%!e$apXgoG?bM!iP+n<>l2VL?c=z0)shMu6_Z-xv19@=A-gK;>*| zNRnBwvVW*qAqz`};}OGz+tSi%oCg(nesBt88e2na$A=LURu(g!HT9b(B8z~{yH+lPgGwWMN$V}o5F5eMy*I72$qgwlu*ulg3vxvx=OU1K(^1s zBn3k!^bh%b1&as#8VsX71RT?AIV2fTPt`#Jjy=ne_*?)r>@V=p&A-kqN(vX>pbmDD zVfRpu-Bxit_XMHwrY{QmR%{BZkgSm9#X$V@P8gR{7;1)iknXc8fGscx`)(MiZ+iT7 zI&8-E86a4T*VL;jqRs6D|gNQ!Xj3P-F(BuV%%cM_5&yx&lWS$=^xCJ#YIth4^a zt)`@ONYQ{N@0|~xjnqs}VzqCIHY?+;D9b}loe)^}R*CP6# zC7bag&qXJhbwb)H|099{m2O1F0K8=&QOX~#>F!|33puJ}(+U4>1xLE$1|wrC?qO9K z?1pn**n$wZd)O!t=_o_AEM!-u%cetzH;iO6GnR)$%LoDZaW$giPGtGyp#vKH6DrM2 z!sn-F+I<0RI5jau5K9J;j|8z9roczGR5J;df>p(I0=FP|7xwzlo?=viAof6!^@?=* zZz~uELOp^}(SID$1&|4UqLQFV!855LK+u|=4o;|HV z2*AMYWNUw5&s5Jb`36xlnP$AKevH#S%nK2JeXz=mgfb0qPcfqULa3NbUOF%8azL_~ z1cyA3pX9|>HRzz;oX<0rCUYU*%TC|xXSG#)-bOD*SAbfs}TYG}dnwD<{?+ zC^VDEe~KxF6>#x_+27Is^hA_L=3zm9$yaIS6@L46#xi3MI3{Ub;i&D6mpB{(O zKE4zlT=0$N@ZIz&+$>WQsrrui6iz^6Y23dpo_Y*rJw3{ETk~ISlCUgzk{Dm|@$6q> zs+Ayim74ktQ9`A`jfL#HnH0*RcSwS!!?Jqe)07gkPI$CiQMv>rQ3(2>Jp1Y+XewKp zCWMVL&E4+xp7%eK9?bqkrp(NYz2@Q>lL_t!O^TUx&dPnkJ+Snkiq<6v<*)C?s6s`IQHmnzX5CR_3 zSYl)B(vv7Wa@kOyI$*6TV5YM2B8AJkdYxW#DOIrCgqQ7LuExx^yYD`iE}p!M~>PLzecIo$y@$2D1s2b!<~oVXB=_-P9VD3|;;Q ztM1ByCN|z|L4tvbtSY5d+|co|oUN^YNuElXc|~!yMw3Y)Oa9smP9fMJhdwGBmUr7e z{adxFk02z(e+KZ`j;-51+w`jlZ!mCqv{@=Khf*ttHMcFN(Hmg0>O3GJ>$5o{<9(QIpL2`w73L)rVbmbC~s zcUyILgqike>&R%TKz+bo&h+m1;SW5HAhLU86yezO`$0is<+vFyn@Jm8yOzg-h=jhH zlR(_4Xal3zhve(Ey?DOM(c!f`IZxY@JzhA+P5cuy)c>lrX^jr|;?ZJ){Tp%Bswc*< z4?0_HQ%BxRo!~`F(vjS8^ds~AYH!DPwFj`INrAt-+eA+{>ewUsn#AD=OnMV6FsRo zI~c*ex|M`dnvFTZcVv9 z?%RLM7X%udn+lwyBi&6=`5>C%`OfY>c;pnrV)w0y2H4XweM)C?A6g|C6W7}?+YEFO z33ZQaBEpoNN=7%vwg#^jDMR`yu6K^}bh8yd%Xa$p6BCG9+7;H$v9!oM`YXro3N2aJ zh0V_Iwqvpi;KGHE9g(4Vl?)he^1R(JcfzON!7{D5T zx|FkYL+qsq_Xv;Z#H|qwDsaLuVlnQ^hqDXQj~2#jEbA|12bTs$ThfE(BkKUactfsC)0q8|O=ZLT=#6Y)AX#f2uCy_u1*wlW zaBml1%C9X)qj3Pot@IYvkCFS%}w?2Z`H~9K}kxquL__AuyaOh;-`Jhm~iDv-p;x5 z>h#XaIiWBq>ZGx66|@XD>=s$v{-izrC#Q9^o=HEj{b;MT8zX>?0OQ)vE;j^K6UO&r zD0z|w)iC$prOcs}uX8_+c>HY@1I!K9>MleFin}5im`~9a1C%A1Axy58Yk&m!)Dxbq zd@O{Xd-#R7y**w3`K`9uE1qg>LV86YaWKl zQcQRDu=~(NA{fNomfmUghRpQmtN#}L1yV@GKRI1?0 zQCoF0n)@W$;0v#JE614cQPoN5Ki=yS>`1_pVB_BBGrlKME`=3xLjeOqp&b&f(ZBs9nm&(yfuaN7{>6Bvyp-iE3SFTQwk3;H`RLt+| z^^?VDYU)JrD!YVqA7$NuwOv{A#q=>kic91mzM>~W(o1h~Phl45;`KZ}kE9ot z4sVNxF#OV+a(DxWzo)Oe<|0o-?ZsH|=1x2*ZLr>bckwCQa}jwbPN|Yb&DPMu_$c}= zJJinhCSx1z{0etZ3HT<$Uq!rn*Q@rv22AO(XaGa?A_9I%HW8E7tCrq3(jmqqR6N2; zs@#7Nf3X&hE*^|hTM;r>HkJ2hS2`gX`Q zc8S|H;|c2PWovfo2y1#o&_{$^MuoI#wz|UI_HfqC6h2>mj#_nJ;O;-&Kd{;;r~4fA zl$Sh_BHtQ!m5%(=_nza%{D7L@;SS7~htaZkb;0GEW0$4U%02$!dgv<1O3?Z3SyK&Q z(N7>JkY1h;0s{!;bMB6ns6KYj_}C9iLseS8H`Spxqh%3-SPLJZqn9VeCU z+5t!bq?O{5>Lyium0O))G;x_vo)~;==rHO1FXxL`3r{?j!;rvtW8Lq-Dx6mtjMyV} zA6r$7kp2R~1#wPxl06b-xVmmXpcrh8#UuHt0Kb4Enl|9b$4fcFaa|rb*vjKe!GQmL zUip7%eNR4dMl#(?25LWQyS6^%nr<@t&|ud;9e?bPl8b&a{Jki~_pa-O$iI1;=BhQt z7X4iKLFl^s{_A{&4=8E{DR*y44syQZ|Boaimh^qlu7gnE5h!u+1zs#bl zT>Gdb<_4=oDf$}O*TWm*H@6Lu)<~yRS^JTu+K>I@qim9J#`Qiu9bZ?IEDpR=HqU73 z-w#i@mjTlHyF&u*G~l@Z>@f}6@BGGkT?U=^dz$Iy<0%1PKw=fd05F%NL&r**e;fh~ zw}j6PU@9JC+?&nsdw;e3# z-@j#gE)AamkVqHdX)pkTUpNmvP$i?9;+=|dzgLi$M5&b~PUDA@lV zt0-iLp=k<>{un;{gQPnk`PKB-Wk|zS6!-Ah@=>EBVPTUgw-6>NDBv<>CswWeG>VtQ zY;L*$1E@Q>>M}C`yet9>qe*f(A-k?#txBN*3LGVgtnfpp7IVB`yMM|(>+|CE_@H!h@B+Dk{-|u<7tvcDTU$#Z;LE3!^HVez=34jx)kR0N{)U#JFdq7aQY9p;vo@NE#e0iI?knSr4rEii3KnU6jYSbM(X9uo&Jb7mn@z<5!?883I^JG|aWZqK2_rNTVV8X@WD z2?gW=fcJtav<3m<2mtvjZn`&QvKkM|7YM2RJ@3)T<>-3UNRsT>JDtM9RO{Ws&WIV)6bua)~!-2VAf>%N6!0@7t z+h3VX^5EM*Uo|oTx&jGo<>6IV!ipsrFffjRfYZ6w0#+oa{Ucb_+`xyF6+Q%sw*Tc6 z+2{ca;la0gq`gx#DCT^c&ORNOrv$LJbss;T(`i%?5)z^fhf*&EAT!diXOL#%ckC2# z6uSNjD4OEbvf+$t&g8X;nwtTCuG{@b)a7KvBBO8pQz`kjfb`L991UURo#KZg0xzFm z27s;eI5T}CysT*jYLXrJSrA1+m*BAGEgM{l(QtJrrt!T8P&{|fqfkuO7Dg(oLh`r_ zlpN>c(@FkU*+q-_&6=FJGx|lm79b6=!ebPEhdh$J&ITZXqZ)8V+V5uQDwGTKxWRyj z2}dFv$UAQhq<0g1=*lJG9fuo5UFY5>q;G zTvZtuAd-LFEXx1}97KCis771@Cbo0UWEHVcA8g(xkDB0>UDVre{Hj zkp@U`>^|FRZjdBMxmx-hcR`nj7IAeXgeNEToZXI@w3nvGVKzJl$MJB{lzwNXv+u0fl@*x(LmbQt^S^T$u7SKj`#G5;UCa{T z9&E^zc&76({Pr=8Fi-kDK+WG%K39UE2;F`**XB84L>a%PHauq=;4HKy*neuNHtDu8 z!gD14@DG5K7?rZf6hJ%Yd>((lFsEGkarNa9VDo8;fw^T&?V zaz3I>HquzWc&dF*xT+q)TS!T~HKxQhWA2OlMOBbQ&&~aRfI#`bnOB}?&5W$5w*Fy` zdL}&2`DFY_^Ua?z|FP$J+asUO?EM)han~2HnXKvx@6w|#)fXKeUDemxoggRFmq?kc zU9{Pq^y!LxdRjEm8o!8n0WmB~j)^+|SWmsDgyTCpIj=lGRNSkMtaQ~$yx{qPg_9h7 zD2^CBK4@PYu~>97=dvk1|#4&1e-d8Maz@MUTzw7Bkb0wPjlq4OVm((PmOJen;G%NhX>!IR^v7r=5 zw5c9^sHyYDE2OL5 zn<|CKdfa`wEa7|PLchSjE-)2t%$*GyYMx|BH%)>WXNZhQeClFPmf)@1a0UfYeG}ae z#LZj^cv7%|7m|5H2)OoRub@?CRmrC+UGEUqQ0cJ92kNm0mw9hs-cy!{ZJB1W`R!XCCP?Ohg(a0HO-p)R0l{ZY*El>I$)B|yG;PcMG zfd-C=O0qOg`HGHh-@_N*%Q4WhS~@5%{KZ$NOt}`*OE@}a4wxnl@!T>qzqkoI55NBt zg5pnoJhUwshF&d9ZFwqzny|cQch(HvEmd0WMt-#7htWIi9pm+|cE)An0~(9-iR~2I zBO>PxyK-8=TId2B5?s@tTs9`S2Q znPmh$#Md9=WEdf#4h~!Xb5c4)kpAF(r`Q3A3}X7Z3|Ycn17h1y(;640bt3{}7%kaJ zVl{LD4I>vj#Tc{*U0+O|C)}VZO3jPS2o+N`i_C}$S1pK#vauNGU#$=n{j*m*SLYNk>izM%=JJCKN=Ty=K|qA7|x{fo|F= z7&@PoMv&BwJh6mR8O~}+@minATy+m5Gn}X05Xj63E@k$UWb&zNmKLOl`{tJ6bmWdY zxC#3Bm|LpS$*Wd;E!0HO=14B4F1H}fTm8o4p`GMER`3cpXGNJ5sks=P*%abo*nxr6 zf_k9P91f~rs13#-;M}~#r~!YBH8I)GJXpOc4Kc|hkK^z+x3p!%>&-=D!6*1RoFg^b zM&sYybz@P4AT3epM#O+$I+uA&iu4ocm`@5!YB0AXP{TO_k^-XTgg$U1phmfA+Ocbv zWPqG-Jyf2W0X_D4`e%@3z)fOI&>Ze32#;A!hi<_`>FZQMCpEK_a{*5ZWx&9#6ve(s z*-W`a4KSIARQ44om_~|R$%ZLrIb>vWO(yrzl$fU3+xV;#z8FaNWf~<%p2H_RO#b>ch*#Wu&jZ!609!{(L{UblsJK0SV%=Sj;gEFS%7K=p|%4|GbDVp^6b3-*}8Hi%m3vS11ok-h7vHi2rr z{>(>`L)p~HO{1hv6SoV(M>U>GLX-lns4=BPu65O?=&4C?_%>5jvsll2V}1qJT)#z* z(SY1qJd)%rmf>V9sR*tG67bZWdE6iw_WXJ^A{ccr=vX7mVrN~*U<%Z-aHcn{Q+upn zpEIG~0K7Mb%C%U_O>tzCjnfv+`zQ!0-8r~8A!8frU3C5a^%qzhK4N*=VPA0*(}ECh z%q9rSpMCK%5RNmd=PF|1xZQv-<8rfpe%hMPnUMw!CF4R3vTrhO2oVjgGZ>km4!l7sDZtc~ZW!DM`RgmP;)QudslUV(5jbhJ*lyQkU!u1h@ zO?R!}T-GhEYIPK&FhxyAHHd%0nQrrE!3MV5k3E44t_ z=hltLX3!V2;7M&57PBs>;Z|);i*1R{hPCgusTHz?GlfilUWfO_IvkTJ2vvDev)T@^ z4h&6Gv5PG{*GjHuT5M+K%)G(n(~7N6KdM`8=L%{4TT$6GNQ{cE8_8~})_QqUxNS-c zH!w&;6b2{nwLrox*A^mjAj!t(QFBG7YF6hKXB^hFlcg^{{PxS4i*+bpOw8VMgf{h$ z7C2|5-eJO@DTx5`|h`qM8KVYNg;C$akZ-S~Z@wUgn1*@uCwtSlm;QmNoCc1%& zj+5u??>!8!zCPS))LW+wm2xWDMe?F5haoCT0+$c`9w^>8tL9kWZaZiYH{^Mpw*P7{ zKWBieh^=0P=;uFFWgI8PV1K3E<$1lYP8&y*9i8$ZqbludGhyWq9K3RdcX9@0HU}l5IJE>P0*#{b ze!HAm!NeCzQrYz=z2OhaF2fJV$Vf8z6eivF#9x@6XGIz+E}Fbx=w~t`_zUd%x~Y` zUvP|R%jbt1I$YJvql4?Cd+iwyaV<7qH0f3~nT&XYGXd$>+j+M^HbMGR57FsMf2TuC zX6+#<6>;hp8UxBA;_>6WNp}{==oTCYR4Rw|nsouTrw`}-Kvel#6dCs~;Zg)}RzQQ! z39g2}Q)sU@4eb+z58NFm!1RE`U(0X4;6NXlg&*e^dPM=q+BGohFto}2d5hfygjsBH z%#pzf6K)!bJ)Eh?YJ&UMwT1PBtI`6k67UJV5 z9IB6m7qGX{xPBj(M1QbN5(1JrQq8Sk0$Q&MZC}I4BQ}-12UMOh9LGbD^~}M?Ksu_Z zfb)1>bI{-B`+plQoR~WQ_NGD`Z8vR-`{3;9hg0``F=_Pf`#QK2@l#dOGY_s=Y8A}B zuPox=9&y$fy!2%lDLMytoVWi{$(?)i_svGvGq^)-jKs~GFI$^(Jjnbe(~tfR1^JHk z$b(Or8?y+)*n>+9){aR``zU3hR+5Oma_NEj&hUyzSBL`iPTc7@wubP<1SG5=lxEZI zT^}aAxpo4S`fUGPs=e?GE;^wHVfOi3+v;-VO((I{;xARn3S+w61@Q-qN*&9rZ%3l# zKgB;e_GMjc>(Tn_Z2Q>O>aKc)FMht_uZBC|O5^7HuZnQr5bC(K!56H| z2N-jFo2W-`fA!rBNP?;T13}=N+hct7_(BV;=c{b@LKuL)Z1TR#Ce6w5HMDE$G&cAY&e{I*H#})MN)EJZ`#rU@?8fu@@#AkjdCj7m=#YOxxXkn8YoIl#HEBHNo&6u%S)2tf z-cJ}{P=Bo%efvJV4FlV=beaf4s0{H)ow1{WYT~%Y|QX-U1l2DlY$d{>7C5 z2fo+1&-cG(zvr(1(6K9F#phMfd;dM|qHJwQfBW?cTIJoFYOtRJ%-2vo%$iC5tJ2hJ zZuh+v?c`+CkRk`_3U9e>{7n`I1dQv)MSl82kA{zSgqpS+?u#ef`choR1$;R9-{uw3 z{}3qMkFo3*2`Xk#>ziHfKsW>HfhYW@_5Ck_B6XGzT~fMioOSw+P`$dMRrEu(hsqB$ zOpOZip?T$e)>S8ZkYKV5M4;TD1FB~({K`BeTejqr{gJN>w zw24Tt=jOZK+uz^Xhe#PW4+{%?e&>gnOQWz@QT4hI&n>JPpuuL)`urTl==zW8f`}52 zyN0KayG@psn!ork_;bC<13|A~#GSr0W5SFd?aK{vHMQ6FVMZ8Q@T9+Y9fup_El9jN z9-n&FfbzmF{8n@5t}~2t_xC0t*8(@#-uhbIO}VB){@i{bF(d4Em^Mn+X+97$$E!icidQ}tY ztM1G-4Z=&%5*Z7yNw`e3F?~^+eN@RUU?J&rd5NN4@6f%FWh6_e3!ltk z2aaOe@rnDR8EB7%k=z1bip#~5v4M3*?ubyo8ckBli=Zm~u_*rcBVo@=A9U?Y4XKZh ztZ8vd?M03Thme;p5iB@TDwNrluQ27bgs;j2Ht+OQ%;Q(~R|!WY+i!R6^8K1(HCE_V znGVaV=QA=xq;PUwdgBC}zTzOddf}*Y2-aeTR)){&4f%IyxyAAu2Zww9$RmC$TIXK$ z@TuZGYOBLP1*0TMymUL|!8EVrH5=x+#}ULtS)1%L7L{gs=w<$1)$BGRg6TFE0GEroyWA&a05x>qv4;zf%Gw z%I-F6PyD&Jk@g-3{{MryHw}mKfB3)8*=HDxWn`@(Ted8fU1P~kqmV2$qHHNj5vm#M zSQ|@)s39c8ShE}ZE+lISAqml!sMOr&_jg_QbsYcue;og3_kG;Y=E3=B=A84G`Mlrn z*UQ7Byz18mDJgd44#qDJ7mSGV6g2K_aOc z8)15ajIb6G=o8y+e5gtF({>Er=zqv6Ae~)6ekAS!N8B+F0z!&oNOIfE2&sSTl-l1- z>0P1`Vw<256+G-_Pj(kxLccg@Z!F?MBZ|$P>%Pxu_mw7giXraE>ifXBxY6O_y0(e; ztBgc@=MXZPa};@6Zd^o%2OVAc_$s-L+oXpG5hPLhdsyg1g6VU$It#<^?pGjQF}^On zeLHaY|C;g~f;vI~G#h}S#mtzD)(AAeyh{%=r#%LD*di-^^MB!tNoM}D(?8RCUygmG zq`Ty?dF0Q+_4+QJ`I<}0w%7h+P5Hl59@~fpsFi}y5z4dY$Rz|if9qquG#Y6$ms%!K zAqj&+9Sy9>eQDP~MTDKdvj7yPb4+~i^lSzkCOp>q;tWBM!w2DGHpWvl-%jIK08^d- zqyGTMdQNPCz_FrB{{fD@hA>q+9s&T5c3`fG=9M2;%OGw?cepl(A}Io4e0~xDg%<=k z$ql=8L>o|)D~~dI!nI?kwUeG(KC@}6-)W~ypKi(eZ{QevA^TWP9VbklGfSha+9Fhe zB!D4=lHUrfBb+!WIsTN3fSmszu^UHVU54ICO(8M>e~R|RDY^Mb0f&{zlbtjf8nLD7 zoDJ{+yKM#hvyy57B-7M!>JM;dE*P-)7ifeh>CZ_TFW|#%#LHXT#sEbQ?kddnP8CqL zDmnf{6w+fr*K2%rcvu?18BCm10dVo5l?VU|G&#yG|2v{7Fl3WRIG~TQGDc+OtF;p` zS#1wQ+z90+2Zgy8O4=^IiZ8F$_D>EM)#a7&7AjMj?9w zr?(OPkR+_pC#gIh4j_w0H%B!dHse;1;x#`9Ujkz=+!^gB|5C^jh(Dz`GKjzOR9F>k zO(=!u+*9cXBET@mS8zn57+^A`x>G>3gsT{t<*M-lkPo8=rimBjEJ#!Zsg7&|;iDd} z4A_$*M%L)4BZgc+AjQzpc+v=W2%wCX_ki3s7(`b^!Vr3ur7(QL9IX<;uYgsFO5C`` zYXo3a7$*1lW0ZbO@}09Hoo%?%_>uUyWe`7-@J zb~Yk$%f#O=w>*G26saf^k$*LLHvK0kaz`x|;*_BV8pE*%1iDUhV_l-pEJ_;w7key$ z2cW6ab&mk7uH%2Kz)xGtKkO0ljg{)7HznOi+52&I%D8ENeT(6HegDKa5F2pBCF}yn z6L=Xx!ii?bG0KU=k0gtlM+ zQqf5d*_5H>hJfjb9jZEbD_%t4;qypaoYSB*2jJBgz7J5W2K@;&J}{ooX5HG#9p-jn zuG8D54H8{n??YIoP$cDeOkp7s82~pz24T@yAcpg&>3f0@g@=o9E@vfNM&oDxp+KrU zdynrsIt8wQU||5Wj$idFO@gZ)gxTj2;-ED}`%)6_Z{49aO2nzZe^i4Yn->(sM<2kp zO%M0gQhOdCMD9d|Km*zW&}xaJbX!}XmZ~49#&cuvve=K{%Rr$j z6)4Pow3*OMr9HfLH zpaf{d+@=};IP3dAiX_!8V4<3Wf~p))U4U7Mx6Bo8e0RR))wfnpFyv>G69=1u6F964}vF4-A^Bt^R$eMqvHY^zu; z-9uB-Oyuae*3*PKc@KaiRU_Qxu=8V9Cz&_=0pz8eq|4=TqT%-hm&_%hH2+A2RRdf~ zu9WdNqPYIGku+!ov2l3|MdI)%CIzr!;kx&mXD^#FD&IGWZ0fKF_6)o@bNfjK6}70;3j98 zl(<%9M)U2zn5+m%&s)oNviFb1vOqs)`-*1a)x{BUlkMEk?;VU^)D1rt zth$GBeR!XhJ`%@W9dm%o=S=F@SR(RP(P_VBE8qG-*P?P7&v);0HPNGSUAHcdYkWrh zoPN_%a5LB5@2f*gCQI+pPNDPHFBiYnkEM(sFTbw0=9!u~+EjCb8Qb>7{l)7U0oA~o z>OX554h^GI&9|x~l&;=*J2g4Wtx|jZ{Z+GP(^D+v>cU%o)|Ygg-nBXeWx0xf`#Iz+ z8Qm3B4NLL~;%WF$JigoHd2=)9!21?F%8xel;rcPy^gH1PQmsezSCaV=eMB~QU9p|b zjg94uVL4g({`1HGdE_}UD8~Kz1Y_ z4KaSeotCK)`C-PS_U*H4v+8fAS7IJ*x0K!WbGSZfH{ej4KXLCzR9W_v%c1&SQ|#@i z(=)T|B+c1>p8l|n4_V+p8d@50Fi7{!pLVB@gVtd&83F*W{sl8~GZu#kUC7$)+&y%Z9VoE1?d47zjH}4GB+}#-A3W_go zexJwITXj1W`q@NpwEDHiviNDgC7qMw85;PxpX+M@8Ykbie+=1b3Ei)h)&IuX(#W1G ze|9?^@^^le`^1l3r911_TN*TX^-rCc4IK+@+}}NkSyj{f{icEaXXdhJV*zg{5)U(z z=|E8&f85u#rI_;Gbx)yi1iSE=`RaC2_`O{5UO4VxJJEFNK^j$bgle)wB{BAq5z1zkeKPLPZbxX>MjUg9SnZ6EdlW&`j5Ib2)env|OOLeh651P% zv@rt_nV57kM=>4ypgNLoK9cIe(?RA)A4Z3g(A6v_M>Ow_f3%kwHj#k9lc4q_#2Fl1 zhYpb?qdJ)9FMHvFX%+TB@DPBJWj&UuF>BZbGBu;~zc0_Gjl4Xn?C zr1c1Yo_Mc&N6LA?P)61t8Z?K^8|N51oFgEi_XaNwAWvU+@pHpx#U#%O2liW`fge0$3KOl9Nnp z6HS<~(a8r;Dz^a{zD|#nTH=YOLzr{oWgT2$(ZXyxR^+9P7ZavZmjXsGE(F*Lfey%}3eRCp z%#$l^G1C5Y;U3=rkSgPyx+;J=F`U5BJTGH4-gLPPlmlw@Ze*Z9a7A_I*Zzv<~~+4FI(|DASiVnIz~m zAzfG1XdNVsQ6Ar=a^T6>Q>sQQ{?L!K3}`a;iMN1y2iKNRsJavvp25kpXHn9dQS{T| z;SmgS&m!+mdVq$}HVc~Low*u`QJhPT&@!^eA$Bi-P2T#HjZmS|20}6WXr45|`>v);7I)*xfyWV&Q z`ivy5z6dVbQp|r@OmF7tX^4WUSZM~R^g!8@#jod~teFLY-f&Bw0(Fqi=YMt8IMWML z7<&f<>}3nFm(vwO#8<0$WGNh(w{sjtBvw5@&rgbOlV~y=uT}!; zL(Y(kczcAw3v762Duw#94MbmEeu;S1<{L!GveXgPpLS)YhVGT1-EKe z1(5Cvb+?LYqIEQNc zFfkxMajVS4vtC-C5Ct7u73Uk>g!2M*L|buC!q?hL2?TflCG|1%_><;f(T1gB#vg?f z>VYjk8yfEBl#3~}fQ@j-k;Y1D!5XLPa&i6o*HQy!lSF)-Fp~xQVd6xub$@Pi_iO7` z{v$<7qU=D`P9}MOF30w3nTLA&!9Hl34_W7u0~*;M!6aYd1OXO%6qnnAV~g(TN$uXcdat*3{twn%Kg7Amocn9DXP=$hy3y7RIM z_>mRC(snH=KnlK;_AmF>#U1Ofp47pCVy*)Njk;f&?&ykUvKh=R^+wq~7O0%TP50nk zAd-q#Ry|;swNI{ga78vY+|y-zznQZVfAyemNmhxCJsB;(?^g+7Z9lgurj!;mwj6%a z2jj)+He4SiVAFk*Gz(7=JorkB-;cHjC&T^x;6rQ6|4CD;7ksg&6ts1j}X z^!}F29VpMhV5%sjCiLQJB=-&HH|mkKa|sP>Z2kM#9`viOy@6puW8IBi3+v&ETX{A^ zjJhvt&hA#G!eTwpfB}*00SA%xov0$?{SkswQ94^!bnI$`GH9+@zkw}o)!8=b$a>@N z^sG|gp7#UHx5Q3g zmxAduwpF%{hkQ7Y7T=wvAsRw#3HdNKvVY-?@Wfg1-qfqXFt?$t_{lQk%12)>xLLD6 zMf;uKjfL57?{T%hbs0RVS>^C&5~hk2aJ^CK2G{2ruWZeHY;^%>=q}Ih>Pi^6p@(a; zc3l2CTAkQ1w9feb{=#(uRF(BKY#x))c%hL!4yThG2_MQ5^l-bxW(lF`8@(4^d;y}~ zPeCQ>yOl!GzVLsPnj@Ydcbh0~b*0hvPjmODuQm)U{Hf(-j(x(v{OUTFmOVbpRk>zG zT^$?Y(Z@YwyyY88(d?gHJ%$wib$MCjEy*)~=Bmr}F|_!={9OYcZo(A%kHvDrP>1;Y zM*|-X?m&wf3sBo8TZc!Rx}R=|pnfN^lr7$tHrAGMF5GS9+PHh+!`ef==GvAoi>`+KrmHL--M65UKiV}fDE(b(3xj$n zURdqOME_mjQiQc|U7*UpGrBV4ql^n;Z%*Al2tZe-H(%Jq{c(AzH~#+I5a&H=nE>jB z;)?yfrLGqY=MC4ssSnSdrYov2=XV+||NR1{mQDR%nm#O#K71*>IXihO1NkSsa-JtN zYqczI^lhiFH#qWgb&b&fdhypMNczXFX2PF;Crv|R`HkkvUn*M{YxLJ2{T*!mYZ2!? zrTc2=Y3bMBqO-YwEe_oKT6F~W?yl?g#rZ+y4-aN%s5ToVccBMgxvGEd+_D+%np>6` zEI^fhD-#&y54&ldG1X%;)%SPe&*0m;Ib7hHD(Tv~*~SL`&K$sgTRFlbp)!r;Nhz$I zoaSyDOS| zKt3*ZjpFKi)Z;5?EX3_j9N&e4YhNOFFx&O!$=!Z3N|@Bi!ga!V_k3IaCFyyAx>3@9 z^g&FRH3{KF??|XaWqtf<>B3=?i2Zy9mFf}BuUH|J|e86#P z`waW^(AD@=g`@xO#qTz+{2Bgw^Pb=elOsX}={B5g&q9FWpmYL94WVIEe6;hzs_%tw z|C=>Md4KmhL0%Y~Y;>gmoAQW*oUshmTw`j$LZmUs8S6}jo?LenJ}cAr2%3K^^FN$1 zy}Kd_nwu98o+lFzDhb)mHDi0}`q}6Cvm$Pj{G4S)TbZnUH)XFmmhp1w?*L>UirV-yi^x>AZDq)Xu-Yj;fJK- z-WmSZr&W$Si<^I6_5=~NH!iP^Z99)ypA%iuu3q(>u4WtESidT&w5%C^%k-5nt^fK$ zr)bjg@ZQ&3#k5_u1I63d$t&+NZdMmeXnU33d>v6z7uOl|y}J965?kQ)=WWTlq-%#h z-tYydGbvd5baUq<@0D*T`q80DP8HdK0r^dp(nw2YYmLawVdDPx5M{&gedtv!P7QDb z-KlAZF~q^<;v~6DjcpD0)hv@`_HV!fN@NJ$BQu{^I&7ytEqEEZ*>8Mh`(^kw^BllI$&-CN4B60biBCi9QY8KT<8^|7~XH9O6!<0owt z#p91wY{@4jD+p@IY@LGkf4Xf#k2rR$JJm?W`x)-wAAy#&I2YkF`^r0GuGP_&4`wtO zCBo-R&A6Q8QFhYjU*=G-PAk+vt(<4Mb)%Qq^rzRaRCwoXrAkf|_;Sd=omxbz?Owg= zyxzn1IoOZ1y-|~>;OI#Cef4V?GGvu1|IQ?tiLB_m(1@cAzo>0Pg1=XX z+>7r>{~q^KJc8wYrd!H=x&F3;I#Ksp{&%N_yDPKv7a4ka{-_^&6D`164hN)U5J0s> zX%a~HD}2wRDYE)s7%|*HR6+K=G64Wp|DrWca61j z)?^Iz{$wcJE)eb~a0s@q&U>OJoag`Se`-6}ln~R`{-C7IwAC5I8DlX&!yBqemkC~v zoRGiZ9o8LgZu5s!fjH^K@d-cE(cI^cNKDL2BtS4GeFMCy)G&{O z?+W#c^}15-@8^ll9P6>wuYmsKr=Jlp@3u=RkO@wZlGr*MMO5LFKVIjdyu7YT<;S)uF3#L`f6g|G9BXFt#TM%HD^2A`S|m0^o^*2usdjKC=j^jzJh9_% zp6}~=-b}lcz)?jij?iMsY1!+8H4;hM~T<4 z%!PMyH(6aOF8CA?0+&v}+IrRCDb?ACRSNrNU~8*`cE>%CX;#Yr>c#ylo_>rXv|;l9wv zM?-G4DyI}%Qs1{DZMJ(Iq2;hT?Oi1l`jj5Ung5yxl*pYB8?o#)unQ# z+ll(mY=I0@#WVU;3H};rGk(W0k|EC;;C=1Ll!62_1RL{RizK)ycLjJnl#DBo+C4X} zX>jDG?&6z`Ra0kSUo@0$=^^9!TIOL7MXok4&E9VAiFMcayBz1kHO;K+ERu~8+ZmVD zp1+o!n>6503Mpa?ALf#!T+LWgOue}NX;ATsnU|Dg9G_il$xURS)%N~_f8jsw`n0FT zBaxSp(<4G$gZczs=;0N^(vXc9~2?3^G?(C zd%H6q*~nnlPuEDcbgd|O1;k-fJ(nc#eon`*w#|8LGsZ}FelVl9U12tt=B|56;G<^u zQSQuy7?(vpc5Rn6cWzRu?vjG3ZU6n=RO`v{!*}Gm?1|hrxqDsobaRZQjgc98FY6IDy%j2b2LN$ zM&2A0ae4*9QNs)PNRcr%W>o%dUdmCN1k#2|8 z0?m2L&f$WXAvi*qa1LBJhq+4Y0eEh-m{lv>6-`kiQ6LgTHZl**I^jf*7>L)~(|0sP zO{%2!ST-A|UGFA9%kTYo{qfJYn3MbVa`cdGBgtzN*k=fHDx`{4bCC#X{|e`uivcG% zIh+)A8uVo=Oae^_GJ{yGgdd@ce1z#knN5yDfX#3{Oa=9UA04Vfy@&=3d%~%;%`^Q? z@UU>sswQ7e%BA?&@9HhkWUWAzSh2BI@x|7I+pU^FZWuZ82re8ir|BaE)U-$B{to}h z3Eb19_^J@$aS#%Y=1HW~Xd{s-RIne%X%!`aLth7gc20mxuECEElfgmR9FvOt#s+KZ zR7V{8A_JJ?H=?FfJn0yb5(B`y{@EN%awQ7T9so8pz5kWPhc#@l_X4JDd zny(Ph`85je1yP5$3*l(y0%#mA8gPW@lcT-oAUP36R5Jst*X#1Lz#QxpwHBCpVvzsa zh?v*-+ze_-rzsJQeE^E171WTRcL+yQszTXfDMx}kfZ9mBmkwVoTwbmo*y|t(P^g5? zARMrjg5tnwo2G|rVkwe1IF%eJ#^|KhcIuCHx>h|PZetA0Ai0)QH(iPtAySz@y+zRD z?+G_nff%l!Jav&A6qr7PLP7)bgb0)|WM;aH{qAd*tzxGT18TAY;ltItQz+`hE`j$5 zj=~7tbl_aDsdGo?!%d@*1fI~f*n2B*-IYk+TEx&AP&2UTJJWacTE!QlinFFWC7&#*GoNUNZ<@#K?W(J^%?M%EK`;uPpcK}COJ~k zAF46gD|JMxtEBrvAkESY5CI}Im{9m8mC=FLU5Sd~j5X5iE1ra2M*{}Imf@@j$3|L9 z$H1z;RRkIVcZ3hLDS8pZ*?3Z8{0h~EXiaB?8~1RaY0-QgeWqRp)H&F66?&%8db!6s zd^m<@5B71}+Diyx!lEsBL^}{lsU+k%|3P3S#(PukI+}0`7jw%jsz!k3ZHBmIW<#Bf zwwpxMRHA%(P%d)O-aB3JDLRSzjn}#16kYV(w3&T3KE(2dXtOs4tE_C4A_RvZCNYn~da*irjOF6R`bHofH z58hTGC_rdP7Ns9v(v1@A36~^7ChU;tJ*qS=@}QX&+?rCx zPYYmC*}^^Hf^s?rEI=LykzIqx^gv`OlEiVwjPy6 zK#pSD*DQhZe~<{$5KIrIOVbB}`>k0JDl5W59IeWL9zEOOX-lL(9k+FDiji&>*>cI*a35NM${W^}XA|)^>or%`@p#su^@C3w6>FDq%*wX@?BY*2c;q*>?fRDi#o+4FbS8 zl?IJmqYiRV%)AWL3Srb?6qGd%3_DQg#syi;069AJ1AjD6(GaUuc>jB4b>8NI41qnw}Y|su=GIYr!LXL>MiHj7pi{>QI zv^670jIMA3wNC(TIY*^3pkwkjR2p0sO;PTFT{EOS^qT_a90WA`youAUL@HGUlJ|D% zz|xe}<#UmfLmO4Ln*yg7)}XPqa3M5cGU=o!76Z^aTHXRhcv>+R_>iL1HULW{Ge9u3 z;`j`;HX4J2E-BKE^t4bX4XGU{9J7Nx-ZTT4!BGMezFdF-7hq`??q_e|Rpm@N=F(yR zKG5&|`sVrCMeA>3NGZnnmJ3AH-)!v(O2{92QU#)qqba9T4U8e9)lMaYGr~CdAtGdH zF+xD4S&;G}oD78%-%^94xhJ89tnluca3KJG&}7gvbi#Mr#6mdMw70Y+0V5 z-r(YKvZG%2)}qd|lw$`S`ZBQ#`3h$QvYpAT+mitoHd zi!|PhCT+I4GNQrTlDXE7s9K9QBS$W~=vfNT&hCB8R&sk=J4>YuC7Q|E~!N|m8khF-a8!%T+vJi~7>{|Rd?2$RQXmi3X&4|}r zaH(@|aR$9~_FkeZ3(%x2IX+rCU$EpNB-=j(aNyvkLRxe+h@4gTHd1NLZd(qIRf!_2F`V8asg@IL!Zmb$$& zlaO8es$QObZnUno8W=!`hMo5QArRa@a)PGIwvBLyQqDv4lfc|DP)HCf)lc_&HN{fGcCzUFe@a~cPW3stT~Q3g0$@w?5Eo%^QtZfgv^h4(AOKkg zE+r?E;i)eR$ON_?mg(Yu#oh#n#HBzUepyrg$&{Yc9DvO1-7Ju*n`RU!0|0@V6+2%i zD}6sU2i~~clcg8Iz89QfC%FV&SA~!w=X$AOz@nz<@cZ7g08y9U=c5l`p*L6w1)d{@ z-vo?d0=Zx)EA`>f_y1MmN_TXeeIK5s(z3rWcd{G(PqOYoB-2_dvSTz=F9&xCb5|GP z&n+7%H5wo4hJiUtiv7Lx#@I+4Muci!tG0on!`@|{ib#C%j`$5wVd?5EAt@qI42G)b zTnDbSPdWWpiA%=ykTmohaK(Cl#QxAvC{ZBxm@J8JN1*-jc>#g;R04*DAo46Qe%js) zhk`OqS}cqO`J+n{k_O(_cmO`hV95vzkZd0M00bH_2cW<%JpxD(d5^QdtQIr7*wf;t zC(fXxw3yuui%OP!#{$KoFw8;1(k+U-0Lh0u8IfIeLYQ3IM> zvE~3VR`bZi^~rB_2%IaS2R-tu{tD6S6(-8*VPK#D5Igq9l^f~L1v!vlG%NrF8XhoM z*xHUah%G8AC4L|QM7h;_X&p^)0@LsXCTo;m93s#PK#q_B3J|&dkFEYSDFT#V7dLEp z^w25wJZ<<9PRb2l=YOaAk7HFYiSkIv`ooXlScAvzEXNTk0GookQ~@wM2Vn2Q&g3AZ zbN3dWq>EDY^w1YP?6ndGI{g_|+Bi3$j@q&N(BTj3@N&%2HLGgcp8;<)bEG!J5=$7s@Kt(nw zR+!m{Xjz=rDXNX7yUhfFLP65`Z*K`R$=vW zNpS#st*4Zsl%pWAJ8$dUONUcT2#G9i&lh==)Idf1_v7DU~8)k%!*)wOT!@dN`2X#C zYIhH)qKU*qZS5AY&yk(fJBuk}ngHyF5&d3?>ZPsn19yCG^!25|HDCdq61PWE!)OGc zR>(|C`&N8*$!8pF#1sn<*xi7DyT?c&Uqkw4lQo(GS2F&rcA$?GFCL8s{Gk$JBXJt$ zZ{xTckK_X93p96JJOLmk zHPR5k65z^;$s)44X2Kico*OLSIv4upCeC3>H$Y6peB z6rH(KQqIw@egjAR?3fnJGgf#UMrutZ8Ty1<7}S+UrDzBCDKgT&m@l`<7+{Reb=F_H zvgPv?JH{kmPo|y^rnEgEm%h5v3iRlYVg?+LSKk>FdztDK?Cu{vG?5;yq02|{!sZ<; zx;&Xn6H4)B6W>Yxs68ch(12q?MC#J#^sZyeadc+knc5zFY4z3b38$Mri|3FdrA^M| zg;g!^rjf1Bmz85oj28rz=X*8H=Ft}K6|3_8|1FFBe`BhjK2#O6)#_~{>du#rJ}yI3 zZPO3Re7i&Fl2;j_=?UZtZtdAV`D)|LWGZ}}upc=dKXFp>Ed*=8rB_+#wFk$YK z&P=&v6Ml=iSdC8&ym+)xi#3$*J}n$!&nDD9-pWQMUCffeg(Ent{2v@Qq6tc%!&MD$ z@`iXBAV*hjSP%2U4>OD;zvaXT+*bLnZiMC)#vz^;L2uc42^$V+8i@QzZc6!>1Ml_M zHrr@L2*R7b+Lxa~BB__ruX3R&E9gjhTdIAd?!fW+Xs$fsgND9>FR&_NgEffA6TEo&YV+Dk_9?F;Looh_{csLOo zeCfMb>>b4I=I=!eBjjBYM`Um^m29l_O`6hCQj{BuwKH0=_m07i(uo~3Nq9fyPx8kI zZb5kN5hH^ROohRW!bIdj9ia&J*$OtaR6Qfhfc$rlmmeiM*0^rJ)m_CY22li z)BJ12X%O!29`|nn_X|)7cCTS7X7Tn0JOV-z$5&!HXmM)HxM?{Ys4gqe^e_rQ*{eu= zJOHIVc0V4#Bh93Iuf>DO{>Vy_vs;3kT#~Z{#(?~Q#*4NlNf_lI%;h|cBoGZ|61$Gj z9WVE{j)~awc(A504$#33xdba#;5`1?{0GK=+SVolI>dq#0@9w&{>TId>YBqiE&C z^B(BVa-wqp>S%8&TS-nJ4fjDf#=Q=FmK^pWAh~6 z=XWFs+2YY@ZQVMwd5po-B`qQ7qHsQ~99HJ}eA%4g=bnB*_^CY=V=(tT6O?pP9uvBF z0{@_RT`2Z7yLVR`u2;nmn$6 z1x>9#k)(|aB|kcdl(>JMXvB+ts+~=9gDLh|)oA3J)Z^z^MY-~ic^O>S;@oICoU-&h z^6KLdQZe>Kq}yCEOAF@>r2mb5mPjbME{_|;M%1l_0z#L<@mUAW}z+7rFR2 z6&bWy_NMNBWN+Cl=BZ7jkh;@z{u6=Rz+05D zE;5RHVVjqJ*2!(LgBfpEFeG0A+bW`KRVnmW*{cTh`X?0wva7PRAgobe*PvizFi8|$h&XsN%6;vG@XCEob3+<*rUUaHR^{uSbuK#gdK-9|ZTr^xy{7?qcv5oMP4Cvy{XF@mLDQ9>z%XOAs$uVzS1dr#^V zp7WAkRV(0lM9VKX;A@x-jXLFcXEKW|?-WLBz&X$sIO_L=b2@e6f)$#bCAb9QtIs;u zZ4_4~)HS<5srk@=H(|Z1aORHyYBu6)p<(1JmQG^DE!n>JZJb-6ZV5@2WSRsQFC(kF z0UuOc&M5{Iv!Gv&N4g(rT|0m(DlT%1MM{TV zClcC+zUF4>kZC!XkJD|=BXGnFdA{KSP4%(*+C?LYf+PDnpG7+Vd6(~J*#WxqPGZTc z8ITOoMwmgF?a$hf{?}{o;&7JrN@h8ZinzPX&aeF~e~T}CLwD~Z>JI+Akk;QWxt6~5 z^@7m>$mGn$$KKf?3C}+JvW~L@P~ODOxApkDaz)Z&Q^o6@wf$W3z4?v!Gpx3kYq^V|JrWs^)`Wg%gX=px3F%^kuz=U+Vh6zrQgr-9 zl2G=H*!>qJJ$mJ@m$Sm8hpQJ9aZ(NS81w#AmyY%HA-&{~GP8^HnSS}TqPLvQ*Uq>8 zymhnE^9{@vGk_iLneIL>R*@stAu-qAV%7Ui7gtPxJ$&Ev@qIJinxe?+RuYR}X&k|Z zb+VVjt~6f6sUZ!>qsQ2aIB!-L&J|CkyumbO{MH?nE9dd@hl-SR2*!_;;Ms!-c5OtX=U#lpCEcZy|&NCdekBl%`%)lO_jLhw-ix z5Q+@U*>%#umrl>7nrqn;5c>E?7++{8G-b2%$u@WaS0j_-83jXEK~w3W0l29YaTFLf zfaK)#In2}la!qbdojbynJ1De4ns%fi1qLq`Bu0VL``*fn#Y+ED-qAJF`F8moXMd9iYth$H-= zCM-m#3Z{^ZeNVc{`<8#-AID?!f_F&VK)1tLY38Kg8+gxKB*>3uaYo}%po#K~KUA6w z_XaRk46b^McQl;>CD*RLtM|Vqc=GGMwiX{fl|A%0%QH-~c0~!qvrNOpvto5Uho?K# z4+7(x-7vkD2^asu^bD7){S3u^K&yC-ydwH2ap2AEki{DXy*{(^U-ZT)S1Y%DKiTuXK;LFLUcf`JpO3J;mi82I#R)5( zeJaQAdD2D}!=8S+{p7Rohffsc&stfXH=mA}Y%F^p9E#J$jZ=m*lyNJYpHpU|?1qM( z1uq%D=Z|141)8jka4vUQee$jcn`A8ymD`@%3_?d*uN};MyFbCdz9K!%|3+~Y8jxyn zVKsDUO}4n*ifaWX(XrH!;iTte{(f~9^T{J&{Gi`h5SlT35EvA0h`8409ySV{A9`X_ zqM6;hYtmimuKL-RtG{)cEy~y%9ZsxAlNR`&a$G zjihe_p_v3F-20(#BVE~3pgWdO6`+s1@@l5 zbW^kbGK{mD-1xmC^lM1*IG@hOcyqF|8(QY#@{N)j2w`PKv`cpQt1yQk$zRLS3}iOijIM{#rl)BS;vJ)`;B?`6VK*zMhy z&eUSz>%HT@+b$nW+2h!=6e)CV8R*u>ogsfd`H??`vYF|7Uvcw|-pNh;-0a~)>*?2+ zokLLXvimihi+39EuCBk5ArdC^`Jks^cdov&NUS{W%g|KbfVFOyoc;`LMMxekv*$(b zDlh4kGd;NX)Q|px_*bgl-%I#A>Je94v9SP-^lLV@<-RS6vYoeIUw=UHm?&xPWl zKSw&9B|4g(d2q#6b+6Xle(-myvFypmWZT(4cHVp1aeGP|o50q$i$J*dD9$*YG;bKq z^y*&6-&oYJ3gzX(} zjy{(T%cphr`ZH{tIFNywCz4TaX??^j;j z%)ZR%{yFaw$Xgq0k{$BJ#Y)GnCHm#0)P>17_P0oCwsVk0ry6M;S$a;PjPG~goBVUF z=lz!lO?~m5Z9lhT`q1)}^K0bR?ncWm zcL@#qdkWpsvZ6nn{U|YUFj?pHysG|Ip`ITN@ zr>{jiwkUvA?W|Zfj6(df^RQ7B)m05pHo``zb{BYTFB*zhMhu-AvN^VFdbpgU;@M$p zDz9;$fM{fc^ozh)(?c(f*NX)&1}2y(wk#@{sZhuIkg~iHXZlnp!mM81{oar=C|jNK zz!Ft$_yYQRagkrLlMwLgjpApH1*v17EnsX7g9EN!rMF2Qfo88#dVy>s-jssyw~~ot zCzKWzkEwLF(O_d$%PF}JNILK0j`})qkre#X8u%qH5F_kKomI7m&tY3ujRqSxDk1!5 z@4DVlc30cvoa$}PeF1k?d~3lkycQ_fkA=w{o6+K}5Ol6=u73e{Y!pAMYAb2HJDj** zp2NrUnFHQ^yV|~3{N}gyGq0SVoboO8k*7yrl*e1PACBM=wI4ZK?ITH#dLTufA5ZhM$DOo}3Kc3)^|!b1GXdGT_l&mKL+M zE6&;Ojd*WjN$j0MUZWn(yq7a9T|)WZ+b zC2w<7SwwHfMDPAISNc0=i0eVMewk~Z0L0)QiNl}(<)yJ|0287ok2Vyn_@eM$&ft(k zA?`*L6%pj^#$CB%C~B5-IpWTFT!Q~`aY0@O;rbXs4-yyQnz4v1(dbWtX6GqC1)T7( z)u|dpJeC+9cX8ldjqyC7bX8tbcr;p2jmW7|vqiK07nA58!*zlqiAn=RXe%cAtMUqL zdbEHA1%sDae88SFIc!Kk$ov>d&eE1r3TILXaHx++ovF$;Ap&g%x%mJt{US_~{{~oa zkd-6KpT(RyTX;CF%){QqgilBMr+YLr(2Dr~$a=*7&sooZu*`oz>!my8PTy^7(L&o# zZGH_&FZmru^Xe}4EM8U=p8KHc_StL{%Pf6dc1zouV{P~9R}w9E@ee6RqC$r>pzU4%AhCjx`2!-)0ncmzLR`g)qgobL#3r z0RcuF82(fNJIp1-g7Z9)LT&o!9w!phjKi-16#rL?$B@7cv~~v^fSi|}$N`4ico-sp z|0Fx~e@M++bxpr_H$U}%6AP(wc>lz{vYGAwAtSjC;!o7toevs-V6(bLwG5ZQbu?_p z$QZbhW{(7{aBx$ApTpQRa0i`sninEw$R`c_2h}|Ac_Ch`6gOJ}Wsi84FvDh*zg5CZ2F& zoVg^H1L`Uy_m539l#AHoT$@e+3Q8%$06r1A`Nf?dBWRHceaQxa&1T6*NSwgFVag*9 zY!w1{fQtmF&DcNym`U4tp!@v7VUhwcMtPPy=HRME#F?>^wnzekSH@e^R1^*Fni}^( z$eZvJp|eJC%%8!JilIP#WLuTWPxh0Q;x+Yp-|J=R>S&hwlG-YgHJgxXGk8w=mZE6A zDa`vU95$HVJPt_vi_x{XIwe3jVEV8|)2l!fJYFr+bdFikTZE+*&v@b+-DJL;%i0;G zVA~1bbJhp=T)w9W!O+lQ7eFrAmIMfTnfU!l72Ag>?D8z(y3#S)0{k3j0Sb|=U<dQr{U;Oqi+by(X#!lo6 z-6gUy{a>B4i?Y`YD4A}^rA@!&1&gfZk}!Q<7^`P=1q+A(v6N?vq@Aa{=;E$EJWwG1 zdsPRmv}O82Dk4&A%OzI=z0WPmd&_{ zjc+*yy)J}N2UOD;Xjm4PQxC3ADeyM8vCGN%xR{^ zaS`rh_<6SkAJGm69J4XPBebb|0_)^{4Lp1Z-o3&qew-^7YkV#B=uFs%Xizm5WPv8L z7qWaiZ`X186p@dtl4gV(g9H{=PE*KE#ku^G(yAg^@rm?H9?LFqr!_Da!_;G=e(s5R z4*aJ3o^*-CpqoDx96`v^c<=CF3t|M;M71ZRgbj3v{)#li3>1d<*_5bEbi{soghcAXs!l3C(N z1B#{@6fc@Q$`M^d6q`FDX+9H~>%fl+{jxTPQ zFh!KaqgU%s+*`6`7P&5K61gm63D+<%)(o^slSWwI@#wvBAv{G%DB&c#|A0Lk>{zD| zjn!$+=uGehK9tZW#ZqaUVCJ zWrccU3E;+wAMFeh!l_I`{f~sT%8+WXiFHXWNWh)km|kxBPS*bSn9WpUX50TuTTj{P z$<2#F`_HIsEfwd@K3e4M&sAJ(sj{B@Xw|hpU!UAk<7T#Hx3vGfeX6C-Z*uF(!Tt*x zTPt+4ZTp(w!OM}0t&Lfe+t;-Y7U;>X&E;l0p7sZeFQ-~t+a`Bz1|2M|u(h=hn|<=l zJ6PVh*w*=C^3%PpgIBxBZQUQtJ_jxxy#6)S_VnlE=gi(f>_9H~bA?Rmj-#m^}MFjhICD8bf2sF7kZ7_DEDYvhX6`K)@w`L4^^jG4V z<<`A_Di|=dli9k9PVlSM>nZU2N{}K~kxp(uG6?2jTJ*OfZeEN67bz@mZaOU3ipV#D zeQKtc@thBJ)t1D~VONYIZ)8-Er7a!@7OO`vIJ6&Z-I#`-a6v4%eH}h_afKzmK8a6+ zj?g0aaE+ZU5z{I@&y!0yXk0$atoBm#n@1n3pb>0n@agOkPO1J*$~IC+1a0suYBu?p zN|_r;3_c3pU-^(u_&bME+zUj62aa5#g3==em_ofP z9KspA-^m+nM@ORg!?vXmexNrAS^^0E7aO1z1!+lQe~RMssYie|;rcK(DFt*7iZ7M~ zU;N1pX?X?p*v+U6Pf&c(G`KjLN2{G%>B#?_$soNx?zKB4P; zu_XpE=VGy1y{uS(xinTVmjv(p5L*(-BmpM)OLH$$V{&19)fAY9e}d~?v`>3N2{+1} z7FXWNl~WN~z!7dnPAuaMk;lj8i=r)Y5?=dwLZAQoNW?w*KAJt5({I_UW;S$H%JONt+r zHn9ZBUtoN8NA={YRxW5~N>eya>Sa)i^X#^PpYl)B4`aiw1RBVgKt5=JxcK&7Rxjx^ zeVHKMYUxR>-^VQ|xxxbkjLlLe z>jyvlyo_gw0kdIcRyzly^GasBNV+nd&jQRUy{C3a%Z$rO=UGV$jT7|DPVtNrbQ)n@ zk~T>rBCcbSBjQj=GA4TT*r>j6SKAz3Ec_i`jw@7~q~&C2fE6S-drodUQ~<5_rw*z4 zk&~nKDVo3YvPa-0WNGhbXg$!gq?DC|7TvFr!GTZ7L-A37jJT3Sd3uVVjES8>`m>`r zL1$cH{`K%D#wSYFF-l-=qNK?XIVJu}J_qhW4vH^~!0^d76~4-@M5TP_fKGELUonM= zSSlpdec4{Ls}8b`Qez}dpqyz)fOJVZ3%3BZeTK2m_5{fZ5mN3!aza*A7M8dmbpr~z za$pPoCz?j!Z)`j`1>hYXB@p;1MJ;JBX0!u}Kf(C4=$UQ-B@!QtOT-bQ0YzPLNqP}! zQsBchNs~?jT-CD_I@X4rP(VFLx$9@X{waWL0?>yQfKKbN#oR5d9dW8_9IM1Njl1hS`mce ziy)SJ2bMPRJ-TIE3JpaN!k4}2UUG+BLZ;FP8jyh8+{I)bLh;LzY-DE@9ERD-*3b@s zw}Kve0n`A`luK2Wt~2bA#bQUyq`9iPy_l7a7?b_A*qF&S092KahMt4&0`|I(BuK1c8MWpy!4AZVt>+0MakB&HpZJ z_o?~ZR4s7ffePBdn+tWk!u?3SMpllSf3YDtGoIrJtP++3Zy7a3JP+Q%HaT^cpVZ16 zmNpQ}E#c_olJ;!AEsaP}tCH8OOAUA^k8AOgG|?Jwh793SySc_%U>c$NEc7T%i&yR9 zf|{CE%wlTUnQjS!u5!kOGOdx{%b0^Ip z6RKO_5dMr$CG%GJX_;wp6p^ajO1Puz1PqQd)wRf(M6a|yK$hz7cj$AVDyuu|+7T(x z>O_FM$9J`_V(41k4VyrrR%<&%i67CsA85un#+i@Vq}@mHg@Ely)d7p6Hj8^$}DH)q<{-Ld=Xp5>v?HG$oBQKSwEH=VTA4HRBb|^kQg`VdZ zKzV!(OFlKA(p;;UxkvM9FF)--jys7ECnyg}$@enE3o5M?1Q=30^DJBC3KSEM`*c~} zKIpmpvX?zk&_kiWJ3+9O@~~a?zE`~4kV%MUqM&V1f4ezDLzSgGf2B#{aY%e}zNYzV zU_YXl^>nrUlcg$aZ4funXC(`ktTbCMxBpcwaddDanKP8-*=yUvO+DPkvg?ipDU3D4 ziZ(^Jy!#BvLl#!?@3cl-j~duFF1V#H)|+{UNKku|gG+qmhYY+%E=rm>Jno`q-(j5~2rXD;iE&cY!FA2d*o4vc)y{@QL5r21d)x6Pf^Gz_=vwc*8hN*p z0aiBhn2J32UzzS(tz5aZ+FA$Rg6;8=IYy^lmq+M_b3$djH6yMZXb0+OgpkO7*Jz0g z;#JLcoACyMT3Yz>#Jb#6fh?%r*>&BJvQ|BU&>P-$7&r2oa>{MIA!))Skhzm6*i0Ni zBqe;7oBk>UWHV1xI`C%T+g>ILI&8Ig@P?lgbXDUY`zUXsMVkQ5fDyo`TkG)0z?t4o zMA8bKorR_?H~~KjV?*YTL025&v|VrV!-5m8D>=B{)*h5O%sdJnnfIP?RjcCJeWsm6 zXJVZjU8Gx;B`T3dFC+V$mwd}HOGP{gTuj4;rtbdFMCJ7!AYMpm-B=hAsc`vDBKhlx@b< zXAPH(TSOe~O+07qD3o8)hfM{Taph8AcC?q5CMTaezTVb)1yh)esO8upG4ha6zLWm9 zX8yx(ul#47qBq*n7@UC05D*;!V4$uiq>6^Rp4CL=UecxGjRGs$OYtENes<&?JGR&! zyd2M}{TF|Ck<|+Uqoe0IwCT45?H?xIp^Owd2s>I zzV(&Kc}KH=eyqhwEurghIX~eQvm@srkwp)L%ddo5Qcz(yObN)cOq>q0=Y5&CbZ9%( z@+xN4`=*#|bKXglA971bANbo7H%lTrdbT!Uz|ii&i)7Y?b>8r%Kd%upNay%PbJMwj zzfU3r7d*S4<%PWXfxQ{(@UlUN`{t8{b|-XZ?oPWCvh>xK)6OeIFTA5_izQ@xws8CM ztCw)|fe%A7UOUqpPp9uX+$po#!2A;YYpGKXgF!=j*Y5=2k9#y1~E4 zb$m7<_>k_f)G?Cq(r+V@t_DA8Xm_>~*?Hs7?_+M@J7gDuBEyB;+_g@^`_}Q-5WUmbl z-8ztb_3&(>U{BFcylrClo1Zszx5@Hb3waZMW_i^|kB16A4bFD$=yw01KaLel>AAVx zn}6eQMQuoi{r6R&p|{5YubMr)>2hb!^vlrh4{r_u4)T>KPZ*2v|GM??{5|j^yujS& zg@Aoq4(B0YN_Ls~e{4OGo4%!bMrPMu59DyYH;s@dY$9{h+{h|E;s0uxH)k`>+S0BG zSbn^a$f(GWldFoijQA#M^Gv{M+olohK-J$ZfvT5opIwcH)Hdjb7Mf#&dDfq&n#=@t z7;5gg7b*B5+SWHeZ#qGbqGH-|weU0jDJQDeF(=`jV_E0YSjh3`+@>FyDIbe}&$juj z_88l{+2QX4#d=4wkd|3X^3ol)=1o*6$DKwN>4;O>7nXndyq~;UbgVS0 zXRAh1O54^%>-EN`7Tu3CUeKy8K!^>lZbp*h5Vq+(_N__zB0$$$0f>2v zU3=|u)TN0#-bd0WS_PZUQ>IE7Po7^|GvVg_f=n{JBl#{}jSeJ z+}d@ci}Q}tU3u09-yQioqAQYCj_jJ%X*knYmZo)|FtDDFQ=MXo#Jle*j~8W5#-C(M zIa5)ZKyYA7Be z@OX&GP0)_`D??DM8C<(a(`lxcU3SBY9q6FCrf_!yVgfs~FEtLnH_2o24Y9XLOB^LW zdooq>2&uF6gCs4(&+x~d-X5DvNZU_crS~BiYcGrm4;w$x;E^)s6r3x|H%t4|0DCYc z_kvw-uuJyd9meTCgXqx9r-km?$S~}%Z4!T`NCoO=AM>kHXQRP}p7xMC=c97QPfkD$I`A`kTY1Sa#LVdV~uLx$D%CRas9&yS4;$%GAm&X!&UiPgg{K&vaD}pM9(6(PiPp`#s;Rq&+|Jbq|MTp8c5MuN- znE7s=SNcA>a!Pku#GOSX0u}BfjS*mC_?VywV}wt&4Z>0#Rkid;sow- zBzWkb$LKg2;=;=~DWerI@ z62o1x+8gtLOCG;XL#fdS@i+JPaDJ39DMe+je=Y;j@6r==2EeIv0K70IKTh`(0S*gy zxqzKH#}FAX-L1|gc%O*W)9vRmO|*!1fB=x1#$nLN6>^g}ub5 z@MqB`6qF4$LYdzfC0e=y@Z$9=Z!pxj#u}8`ZLczLknk{Wt$Aa4vHFz5OKkU|*VxBU zz)9h#?V*rsZneN;>0bL!hfCCTQ7@sk{w9erQio&?E4{{MG4_FnMVZ0~^r4l7jfo2{5%V5ZM{v4iPwGWEeos#FkaQ&-HE% zpzCsTBk{gwXC&yHKxtpzf7z{l7y#e_((HDG4P1uKt$*+20v8sxYhIelV4(_T41>*6 z0OOs(OAaU4N;v^>lR%W-k!izP_7-Mt8VT4Oy?yx0ANyGt$jOGYeCWHhZUXf)chN2_At|4Rm1R(X^ zf{${&(ArA+#-|MX=KNaqdn+0*2amgluDY{6ENlFw0!FKAQ`_F{2QM`r`{yD?kj5gy zu$z*Gj1>f2OEBNgl_HOwr7@{GUMJWx`*_iHpA6BaJE7a}=c`{BRJ=Bl0mun>Ie-=y zSWG@=n+~%Hmlc7z^m_6sA}IjEGm?LA-p1{4cL2!{;CrWzgsMvZ0jTwpMz6lH&`PvTEkEm;DVol5 zvf}_e+&=qR)pKghNzEt+_Vv4fYq1Pv))Sm7!oXJr-SnjGk!@pVcG74tZQ0T*Kst04 zI|oK+(pWvSbcLM_&|Vqf0u|`W=`awA(P}C0G!G5vDl-6b-%juUTF<&~vk5Oqb}K{3 zoOp$I>=mX#;L<&c9D2|ZjAJskB%ETw;hUe&=M8h*I!3HytWxQJdVfNUT^fgnXHyf` zG3!BbFKr)R9DFjp_ZCG|E<&F->MNk$vP`l&uD5)i@(Uxbu@WBp7p>G9IdKB`*H~TA z27Wh%%-X6f_wbJQ=7c;)@2@ zpIJ9(!N?)i5!aXzINe}zBA^jyl;BAO&np<*8Ya_#^ylDrx)Z@>&W2m~JjnBkDsIYc zw3}I9co_g95u&|Vc0*7RNrbKnluDk@jupF$iR#OBIhaH1s<92EWd)#Gw5RS^)faN=ekTCG$t|YLpTy3k#8Nt2YJ(5WDV^;D7@Ei2AmZxTh%& zsCrqd)+WVVfw&Zg`e77 zwGp#e$LMUP&i3(8GXBcOWy85tF7Nj&fF{ElD?}#aFkt@&rtm}oWIW;bpG`dq6TQV_ z0%K-UIy9Av3}0Tk0S`D22YJYh>U~CH#s+rCL9$}i+9?M!KrsK~Y-?wW*{R=2CR2)( zpRuQ^VX+UZ;pF)+2ZTu$jlrHHoLwXT}{-7YLG9xeW8ZJ(^Y={LUgdjCfo zjkS&xb76Vy|9hwPRDJY+cUt4v8vYNb^~HvG>xnhqu3v)+|8ZKs6^JdN z_~6$to~@A*W4bOX_i+6nz!n2v(-!TR-x6EB@u4Au2u zCd8QQENVlMZ=<+{h)84V!w9hs##1cNH6C2J@afk%y6)x-jF(}&_0Rcr=N_=A7(fY9 zB4g71m}CVPfU`VwVJdM3Y5l-?C{j6^)rN?^^UL{`c=35L8yo|6+>R5AKdTk^OY3?T z4oj8fI>9i!iql7Sq4jVM3+I(2-Xa}F?#ADLk)o0g@Ni+{bR%n7Pc{d=9XNV;jzI-hnA$D|?9k!N z`C(ta(;s5=NbLp=Iuw_5D#vF@MJ`oyn4R~)yR9$-6#d4vHJ`I6hxXx_D0PbGpY8$p zX#-SZ?}PgUM_ld*FnNB$z&V}Deum>(b*ax?4rOyrsfy@Jb2^}LBwoP9k8;xLFPEf= z7%~a1$mJw*k804$AwiE`Ip&hcR3j=K$_^XXHPv?Gc9c#%Hh}rKvpVKRBh^FYQrJ_D zZ}m=V-ydQu(T5*L=aRXI`up7Xp0WnB^OU>c`LM~}N4R^`y*FCYSRP{Mr=+=ytc78glw$b zz%%5Clv9H>teeKa#)mwXO*9M-b@mHKh_Ld|0@ycjP+T-Z;n+YEyAlqgyn%zLsTVJx zkHP3bimJ81DAlviDF*UT{aJ?s4GG5vp0Qy;ma{fQFdL?86FqR7(F}}1To=zQXAR80 zUkk^mtq@J21#35k{3}deA%Kb3R__QG{(Lo9i58pmQWlz|{tQRga<@`g&NKxDX~OT6|^2f#4wzVhjzEZUEGcs&JFj0 zHYntEacE&sian;%p3n=iSH$?H3bMF=g0H){C6#eLHew56wRSP6%=k5Tk%xYXGtyu; zDe+Zo#H*5e`^Xqi#8EeWHckv`3$@7}{4kc7-LDm6e z^y0MTSxDaHp&T5kJup;4v;LygUW0g}+u|}H9-DH&kjgnK$s4x^PdB`Vr0k|a z=)%trk}B=dW(%^_&~JmG>#RD z&n7O7kh1S84mo|9a-jMs^he8J^UZ8kih`i1kj+d|PA0+^?!Az`#gXQZ$st;2|8^CJ z6vr+dX|=OxGkRuicy`-busk{JheTE(DYw>_{lbfEgi{WivpAISRI|M@@HMMLBi^ut zQP?)q@LDb_0wS7nzYgZMEXZ!G0PgL%wfcFd-r;iV5l^sJLPy~*HuGX+9?)%b-8=H% z9Qngr@mFg)3YKNSc>?Skx$w2C_zEe@`m8pEn(-y0;1f2EJ1%K&(7;b2_-kC02<5?P z4{FzdfA35roniSMfbsV#z;|S*J^C`)KAw?}Q9)BZ^>$!3aZ=(sZQFmj~5g0V6uZ&7yMSjUhP@B<6|Otd{n zjG>yTTdVBrIaT~7S!s*1i?qUzgJ~SQ`85K$53$u-P>GaYQDy?_k*N@06%B@nek&HS zs~#ORumq#t^@rCDjklI{VslZi zH!IjUkz_;tp#7AWaZ$yZj}faZ*xigb=O|2CIuF}wehNfuE!LvOsu5c_2l71!@hsjY z$JD#|f`ZXMWUf5f0PLCSt27&yUB#LAbGBr`ZwfUp?Hp3)8GDbgjoWth!qrK<*v8s$ z)B)2K!$x)y@&e&E$hnqoz4Bip2}wHC0U8U2E<-X zF1M{Ez3HDW;X?u(xp?loTk(aUddc7C2AZf7o{ss(l{xF#%FGTz*wO$maV2W%B9E;h zHSm6ya9c;SnqS7Ei+GwsV@M3!{yacp!1TodVTey;rCL~Au za_QrUgWPLvZ7mjIpE@1?TEpwMa<}xV7F@-1sf`b{z$2NizLDBW!Hj6;PSk#O9x_d` z3yPZN{}{7q^(c5TSWov7cgJ-;lL$4oee%Yp`Cb>f`DoFiT&n5WlB|JObN`ZTAhB*? zJbzs7si809=?jj22UZvPU=~XbIc-mt<-ik_p*u^mP=J&h>%VgW%wDouTX= zW64Flo(5-?Pg*plsr`&@k+U!E>Q!BoU6XZG@hCZz10fnwn8p5VbrVzfgFn?hwVXvC znR<@5XEVx!g~S$qd2lMP@1{iP*Mt7raOfX(zm`0B?Z7Tbwp$^w)zfQWZBtfFA%pHJ z-d^38=?}MDmc2jPs~ZqK{iw5HzDk~W$E;h}3_obIEbB+3O}IX6=o*?`EH-n2}aOfQGLN0f2G7aWeKXuR=lHr5@zTl926x(eg)O~AN)}yO6dRf+q_B6Qr9>(5Y zJ_sJ3-|Zm(*ngWULMUAD6!!s}ub6_aH4frcL(PNXQVRWjgOxr)W3@`PH51Ko%Okpi z$dg<4A&K@9L5=;EO;O(V|L`L#w8!_+wO5v9g9AqqVby7g6KtGeQ-AD(vq$^#2MZ=z zrO{(;miKxpM#{P;9{57I@$whRtgv^uVDVuVN|wzp7s$Zz-flh=AB8B2yB`Xa_Au1lWTga4n+yJ!mDufi;thgm~yK3InA3 zwSd~9&@oj#LTeZP)T|cix>sykVN8zYU(W4RRR}WAYDrqX#c#I0^OiB?ZdCruZn!5b6@#NHN z*$~o1?)Fm{tIPL;psq7UO`HLN@ zN3UD13cs&y8I2PTwcm0u|8GN>9zI&@|!1Fw!d}0xT{0g z6dK~K+jicfbJwj;F4GPUhq0_N4s2~=Pd00>F?YP~OL+YOp;-Oo(~2<@^M|ML8tQ9R zPus<8d!dUMdG=2bd)2Hu@1%2M-Z6hx=@x$6`H4$1OF)43?o(TYJP2OdzVY_~DA-XO zUOy7j45Rd~p9Gz#4d5GDnz^*FGX+i}@*j$5v{^5mA#)$Z!0kN2zJs=wJ~l$*UJ2VTSO z?2c{B{cS>D`m(9h39tD^_}oL3ZypN#lKEoi%yseDl_CA(K;igTL>S8cl#7edme#@S zOZ#uvF4Z*N+!Eiy^_YA+DUf?c;~iVt&<7Lks|k(ndDWf5K<4Sa39Yv*`_0z(_h2CE z_TzR$YVoBd*?|3D8!KODWWnr};YnFA-=lHO@<;%yBhzL-xXSaR_tpKdp~r0n5I|{U|>s;Cg_#&`;k@Uf$bsesGj|F zipyub9gPB;9=fu6WY7Y_a|={I+}c;dzl2=ZcGSHRPb%(eesaLx3AUX$_Qyc4=>JqM z#r!=u4?d3zW&6K6t+8K32VxP!%X?D)g+u8?8WB)cS*j<}#Q6=<%nHwh{6z{h6DPt} zgh*WfPGk}4h|5fUbCNSauhQ~^T+1!1I^hCTY=oq%b))NPizj^HSqmvw^KjP$tv@*w zU7k5tVQBr?Ax(nScp)LxvytT+{J3Gh`sxcEJ8s=flNQHl7Yaw{{Os_T>r<`;v(_czVk7wQccOi@!(p?j;#9G!e4T^Doc}cNBOJ2et%7@{wC>pLNjQ;p@%Jv^Qq4M za@UCiLl0fps+hZyGiq+?$&v5vGWZKH5^Q+<&Ht4C#|k*B_TbYheRgKux$(Ns`1Mn5 zcwkAP%|+Hd#(?k4!;fqyub8s+gLgPmWMxpr4d-hs;N@_SV3tpEM)yWian&qhjic13 zCTHcPZrt`f&TF8tEhn~;+jya{qN)sD+8sG5V{Sw9JXPf`BVwlX=JF;Ku#9-n{5YI! zU{Yk+rTa|eOS%%T63?FbyFOMq8s4ii z_pT!F@|@}IYRPcLg?-s%tXb4N?$Uh1_Xewu6&1O1f%LlPHn+adTa|3cz<8|+pizl< zf6`1qF>5ka`Vw6wLDpt5(&};>d{lMGv(htssxH4XChAi6;5Rw5izF_`Gnhuh5ubut zF)cr_yG#Wvr0&xSCJ6LE?9DJ=&vQ5SS=0N~!KpN9xibs#v!UJ;7f6*^YLd>y@+A9Y z71}ku@*upv-I?8{=AUZxxa`s5(rjkPDN5k8K1JNOcQoEuR|3aN6QQTd{u>;q6jg zTE%J2ie<9NxTl5o9woF<{JSFQ@8{!HOs1B)AM41h_V&FUQ%9Efl*)pS`51j(FySBN z?~T~v_aCV$tE+!S>pm#vnE5_+gGFrjM}9@MwMGanR{BYKT$Z!0T3JXUt>b$dJyp+P zc|mODO-Pk{$*a}TFX;@$*8AR!Dw&TT`{(ah_Mww2-3p~|=z~$Dn3Ca)ptXZ9F$uWV z)AwJeWe-`1`$e;s{Q1!~KD>Yb57wD6aG>YSoBX~6mUWEyQT7`=R3MeDKS`d)hOtS{ zBuj2nZ?oTdgU|N~H(Qnb6t-9&#w`@9_ikMb=m*XshN#+{*A;+``Y_%fFdFcO8IleY zm|G%Py>Z3-Ds#o&*JjzokgGnYdq*`tfpB}Ixt7<;>T%B1f#q{9$HOY{$8Fq?<&&Hl z^)`5TG9IRA?2+AXGH?$fhinEI|*(zAv0*an|S$7S;*MZJ6ug_(}0 zc!OjPqqF>n+4-mOZ`se;xbPh5v74&&!pvv}Kus81?B%mu?vyaZY<-oHo%3hM?MaJW(SVNUSY)SU^DS%JtJ?Z~G0V(|NvZjy` zFR_&XQBn^fBi@^1OLuFX$tg$r$?`JbJDOKl@~R-3v-rXT_1ho+&#b9keHs2@^6n!c zeg@j(Vnc+&?Qh>iOcFi=^B_R=iYFi++aU$1)eCiT@|_5k2(K4B#RH$>o$kSlL#02M z%ic!70L^O;IggpP|JMW*&3~7H?013T{bn!A$HB04V8tnz$CivRULP5S;Q@(U->8Z! zlL$Qd8gD|#Mg8+^$+KC6PhSq!!2;%7b3^4VKGMoa!UMUhQ{5e3`;(4KCFce-S*}0Z zxRWpeVG%(*NjHz+p!25kPU`7@MqV_Y1GZqTdN_hDwOzZkd-Zq1pVE~N07`m=jFgnh z)b7a!XeWC9_)Zu<`y)DizE68&N;2{e{0eZm?28tA_KVTtOr^NKk*r{RET{58$jr*A z52h~Mx)9Q2>OaE6ffsdh53g7>8*Ux%kdaR(4^Fzl!-ZA^(&R#?QTn4qD~2hd`kVP3IJDB z%Sk&Y3gGO4N=V!5dPIVggUob1=w>$8t2WE>1^hF#s>B82Wvf=cJo@LFETD&NTkb)!7_nwVwmW!$Brm~^ zgi-5Pb!`D+9DYArfp!wf0VfNb_-nzo;yg*rVPVHmcm=J1fuHDf6@!m1lH%3Z?nS)4I(F@MJz2glXt0TI{4?&&gn4x z*RAv(7F-O&L!Jk40Lv=@r?HR>P6oiym(2)wxt(Nva>LjR7=VE7Lvue#@0c_tE@~VD z2XcVWrlDTG{NYXWiyEr6Ve*Oyjg(#T@EoMIm}HO`A-~(=O~#~XEJoQr)V+&zWAQs zGpFuLn-(((a`Ny4_+xroud>Nf+G{)tKobCrbMgcC=Jn*=q@k=^w2^_*iYqRaA7Dst zpj6OZxr9vDI6KZin3ga*C+R)Q)HX86b4?bbAMbP&eEuw~Fp|uo90uT>D1MhuC^Z`K zx&<4=!Ayxp*%m`0nojA?{=+v^f5&j2LG+D8UIPS3F}y{{x`4ZTsg!M7;twtaUVV+T zyow16v+2*Ihyp`RBPZDKWM#@4zeJ}V_{KfeR|tT48x4rHW=S}+5+fZ)9-Z9cCQq!> zq+J0#I5?YN{{^4b8JToWa}S|+r;pQy|FV2tc#OmBBZdwYwldMt$(x@{TI z6O(D-j4ftqdBZ5fDnmXQq1+Li zi9nRXQ^~HdiaP=~yWOrBY9JC_+av)bMbqf|77)* zpJOkc?tgzwX00JIUU=Cj@S{G~tmYcu_{$;99}SeG8W*Vx3uAUa8nY*BuAd%Xm5d#b8lI zl*&NE>%i<^0|QX?TL_ZI89A}&#o`&liHyD#KL;cW86|TmVGJWwrhEKnxm+k=$AFe@ zYYbV$1`O9ye`vF)aE?cmjPk(!mR;F6i@ry|c>Q{tG*9e>Lyd7g@w45=Lk0}Z0CVox z)X}kJ=(0sA$fEKPdCY-?=TGcCb8oqyKh5YY!y2Cbv!tz{AyKd3^Ja2-GlB!V5s}xH zw|>b5VBH~(=n6dHCS5K@R;<)r*q@1I`nD>}zS@j$Ziv8<&(7iW&huO(CR~2w!Xr`9 zSKY9c7G%_mx|AGy;fGHQ3r)1^wB9+?EWtg-TfqC95rX-iy7k&C780-0>lwAVddOnz&@y_D|rFnHdp*wvy zdB3f`xv&@0+@ePcUBW%1*T$*nlhK8927*!wk(~whTvr)kYpj=k@!!LzB%NxL+&EI# z6ASj;0(2Li9yKeZv%@kfp zJ1O+(gj;aAT_(3s(&VdFX@Jf{_?OHHuq$E8 z2d$DhkDp$c;nlR^@Cxmuea~V>7IQX#>eExs^un;sdDn-^24c@h~hkm7%D0f8pv9TbM zCpJK7C3H%WtOZ~?TyJ2h{>uK?0}{NN6rmFiu}ncs>fqxS_Z#nWIfE#eZ@3b)oWs~A z8F7Rxl);Fd&X+KemqG{#f+5)(7BeKjh!ijiYgYAEB4ey=BL6)UuaB;>f&%f(SpiOkc`DnyZ7?TtsyzZSC6jO{+4~5EL z5`^0iHpD!DF!Eb5ht}8_8+bEb!f*!3$Y`%)!HSNJPc3GapoZ7pjWHv|6)J(V1Q>=t zM#q97kRV~mfm9obPn}`Aj!sAoL$TT4(Hry~HKy z`0QOfoj%AT#oFE;4t4cRW23TQanIEybi$c#Z6radKxh7BL~ro5EIUOhM0~7-p$G!z zpOl))!b6Unl?Foy45$w7428(tHL>h^#3z2N1vNBhO>Bn(d+%qrVGUnAotoOfE z>rdeUlLR-#qUlJP4(>Es%!$$PwHQ0YBXfo@O7iro*iTX#ZZtxQ6raB)_KlKQ_D;;I zoU+P~rI7C%W3e2@rwof37x^<%%^9kVGPL>NHd1yQe(fJip2)fa)bMCvJvw0 zUAYbMcP3>r2s!zP-mIx3dM+~-aHi%g1W;(U1sC{Wqz|@#KwTIeeQV+LUS$HN!*)-m z$gV!)Oj8lUr?3!umJ{HVA~2tSu8g#!!sy5-Xew%<{=38MvWAKkLk?vuP@MHWH|_Un zRmc|yraXvBnj9&VnPG=mv?rCehP@^03+V_a1l_|n-23wp7IM^5N%9}ZeN zh2d_%W@)NV`k}OKw}-BdC_@tXFg(h4AVBwrUrFjaF;SC}kY^92fU;CYv>iqFU3RvF zK=~=ga-E|-xN}Yg!YS=)Wm%T_bxNnFYrL+QO;MHrP)JObPLG;zFSlZfPweDAANMd$ z0INmF&iyDRZ&Fo~Q+mfPJv9~8wwasi#3Hg%?)Yz!6xot%ts{!jiZ7>F!+JYx40{>0 zD)n_1vN{E@$Q=FCGssfEvQ!vboJLIo7Hj>n_U=0|9j4j_^{N!hjGc{hsZPn)O>7KB z81md|>px-^HLH(%)bVRPj(;b%NU4O-sUk416MCcHM!{qGhn|l{M(Z#iDxPVAwX${m z@5JUi>whhtQ+29gkOS>IYl;Q1LJ19UpLzj7>`(loiH~CL8^=NrrtZO7L!u8I{pvF`VMw{HGr2UFhf>=Xb zgmPDz)_Bv-ethgZu~x9+^}1LQE^9XsOQBU-Yk@`lt*Yh>e*}y-${WqR8p3j#mjs$( z-ia;m*Rg4V&pKKz=p}J)r0&-&yMW57M8j) z?Vqf6am!V;ycWb(9ask2!Dj@!8}hnr(cyc7STk~$!@QIdu_Y}*=y2<)juOfl>_O~3 zHtn+1vtgLnvcxRW&UE3=t-|%CtrTe%K+>Cis);u+~7eEgrG_6c4@HGwMh@a8xr)Y zEt!S-hqXWmP#PG&tw!u4%{RG5^*+xV^vSJtx$Cp=p-)1l*14ruySug|$jZI^o|HCN zG&ZE{(0}J#sRJ-r-kEH1+In%b-`>07?}3%h8oLzu$TBfNk5YE!$U9dq&WicZ5L}P> za<`Q#M8nccZd&#R3JeKk_g%@)I3YhAWe-ywv)XVQiqQt&%304Pj9xL1l0! z&H2p*Cx0!SiQNUHIW4cU1Dau6ha)rU~9%&d`E>!cT zz|?RI?jSmeKt~mzETKGjJ;1gLhwg&J?qYgrtYLRJnN!sw&0fN>|Bbu%3~DNX`!!Ea zLP$b8H0c8D$)@Y6%iGbE@(pU1O(|2dMMIFKtK(>Dxjb=F*HR$1VsTw zv+>^d-FffbnZ0*E?99%7&lfU*A?Npho<{)HF&t4f{6iQxGV^NZF7I11O9273!H>k~ zptA5RgV57-xmKo*fuGv1^b()FoO6}9)RKLWP&6{QGTXbkBK~D~XiIJI8zTTqrT)l> z?~Q$B=sfVv@)7aCb!8PO&>4Z@Pzk^L;rdBGFY|=aTA%+D{Eglh7I^h*E>*wh!LLC$ zU95r>R%$WM9@sXU*?>`k=B0DvKD+e7$5HC?7q&5dp&jp~A=b4Uc?dChu-1j%u(?hh zh*&=-H#aA_RYLh9KA!(!-RgZ`SYOs)=Z>+GQuD_IVp@Fau zLeF`u#%9eeNBS(gx?a*wzpLe_?Ho9|2y<)w_`Y?$ooAIch!I|x(SiP0FKFmOALXfn zH|JCKB6p8Mm#!~^sj~|AZtLD&T-Ji*t>2zvrFM(VW-in|I~q74-wtk1snzC`w>>Xn znRU(0*b%;PT5y!ddqzhzDmH!@rvHS+;({ijxX5MI@3Nq_EdnD|J;ps<=)r&d?}_XG`Bfb5g9`J%ygzhPXS6J^*Cuk zhuc5X+6K3N6laaJa$T<@i2}Q%(n?XFV{H`a+<4LJajJVGck+i~yQ!RL>kDxw<(UP94Pb+^Ok;;jTm;aE;xxDwRelKAW)*kA1cLT0CdzA5xy#FGg zPH}&=@6QLw5^QB=+U@gZgXV<^z8od&`)B&WScIy??^}Vbh$hP@S6iQlie| z@TlvI>_`$*&!0!-_~&2gqFZO=8f#urK&|iGDenjG)eR>CA<}797W7z*be%;YHiPaeEi(6RO9E=?9P2b0d5rS)00Yzs)s{fKlyHbiLCi{ zbEq`U=UdCwr=L)Jm6NC zY`t@=`ZK!!@K6CGV%lA>${+Vr)iKS0qm;pJ%L6&+==Ngmmvzznb-K)Z-s`l{LRXsf z`sd0ec5+p>9%Mq;?5kVCy~sU~`uX8&h+ojshmAj5AFjQ(Z>avT4vg1^Hvvp+{})P1 zqNLQy1$9y@-6K}o$S9tfX1;`1i%L`kO{@qp#&VZ4C@GoIUx=BXi_=oE%k#at zEi1Da-yeS`g&t#blucnm+QUbCo^>aQ==Etzy}C4Xc{KdN4F7fLWQNZDX89BNCny@e z@Mipv^l*9GTXo*TU>uUM5W>QJ85vcTwg=B>%!kn{OyrIWA8 z!uIy3_onQPBLgRDxbMJ~>EroEk0s%LJSyzf`ibPTvVSB}^$pF`@-3u7PVGg$S?qbR zaIzZlh{|tcXNx+jcl7d;#>b_V*z79yB$an?<2SuFF4wv-X_o8SEN89mulQM6r!qaP z)r!rC%f%2bsZQ%wQ<|qePmD#$B9idRPR0$dmm^Jkb=ayEJ`?@x9`8&o*!%t1k(&&* zX}3C7x??B_7yBCay)xhwwbX@Rn10ReBTU%Gsm1lNZ&ps`u)2+3vl0+| zs%}-YQ?EZyl5NLD7))wgBZjVo!% zZ^GXB%3KSt@AQlP+v!qnE{BDJf$zcM1RHBqF{1d9opb3usFKX_gtHs98@6#>^Z;x) zj$%FWD)2%;V$HQ;P?_>xq1+pZ)`yJ7Q-1N9u`+6vM-VpDX`WMpfif@_BrJguO%$gQ zda+dyQEn^6mPikVgP(9PwNM|`uXuNiRcDk)9vNhcrGf#tXcNFtM5@CTRiq!`Li16h z(-+!Q+=ciJ)*F|oxebDlFES%2|RDnIl;!ZwFN#s9md<-hsp zu9XfnENNeEFK3%*Z79)Cqay=m{k`YS(xBfuvt=V?gSr28X*p&#G~SkY6(9}SbFHeF zwq%w2#eRiSU_fIUIg;xm{(?jI6<)K7^}Ztxss6@&;_`6qed}-SrO~D!;4o6Yv1?{z zkGL3(5&e&)B~SvSIrJIn1f1l}!Qg3`XN7X$I9g1uW+EJTtwqWvy`e-g0wLzdC11fN z($4h(0H;Ba8L%4u`to^1(8&ZC8Ou_jr0yl-`fq9ZG?sZHAW^_~Wf**>>KtgYOf>`8 z)9KxL(^v(7f5(0ECpPY;2jT%@@AYZ2CKt?yt;bG!Le;c0`-dZD7V>MddL5E~gqRQifj90MZ#q7u;6m!pVBwazF?0sccWHcmyB0b^Pi6vTEV z6JY#YW*CODjxT*@G??2mj_>RvfGnIvj+R@au)HlXXOxJF%p#Rj#$r#T3)5-NzRXLY%Dpa1kenXCFQrr_*!s75mIaOOINC&6F&ZM>l zmj$-arK|vl{fsOy?`9%-Hq^d+&Mi;Ye=lb9Mal*V*z1s-v zz&UlZ)nzFg!4Q$N_x?DLnv{Mn^^`9>v>Rh%^w*|&m`hu4w!=omR@!K*xd8`Zv^m?3^6hY*3Q7?}J_2Ff7%PoA^0%m91B0Z1t zGma@qMx5b`^LdrRtSAn^zjg3nfKXOC&*z?dT-(W|90&k^T=sX(B9Ft0^{sz~I6|P6 z-Oc?KR^5D;3HZLs=_@x&&BuApt#G{JyUwSJE$CED)p$B8uL$}kE0265P8EF4FljqKEEepvC`?AY`Pi=7U7|7;iEp&%n=r9#CV0$55j@y;dqqe8{WeboG=%$sP(SK$ZgV2wVPyy8kY>oSKClj=xLvF z&c$SAu2NB0P+okxJKDsjnD5u@!xNQ?Y;m&wVn40PZcN2u|CDVL07aLJQadfMEC{PN zwVU&eH!}kH)|4#N5Y_lHuTs%UAB1EV|J(nMEiE*p)?O!+TpuZIxqxxn>*D`^3AT~z zi+R{0OmMWk$nm5;ddsil^08TQfvhZq^9y%Y#Sg7?QJ?7VYT$M_=s`u=lET@PtO?xb z+<8^weDjtp6BVc2V3Jdv;GQs%`y7GE*WP&E&HIq6XD7_Do=Hclk0Wqv>F|yj^2jMH z{G|6xugm8cnQ#(JXABg9(U@^Hz8py#5qu217ryD^btte`Kue|*JGPMWfZTJKf-_)3 z+IaI;2y&J7_2{6^c)#{E#7K|z#)qwO7@Z??{D)&DG z=Tzt$FN%{O$M$F4UnJP+tf}`IjP_7h{;e!>1dAljB<}qqG?BZ5Cb`gy?!u>BiI}RO zd4{v{C~yYeEe3@-8rsEDiKM^|i7#|Y7yHMs?KE|9gm0FrY3Q#wR)pcQtG*FB&z-Ao z56-4UcoOq0EfKx)KhgXDUHHrHu@?b65fV_KBX{p4 znrg5>iad4d@MXss+~><~v2(wBe)6KCzw&Kl+(n47g}d*e?M2-SEr=}LdZAZzIl*o% zdo5?ru0^N9Y}`4qU+A~VbTM!2_vO3B99lAZ+qvN=0o;d!v$8tthb?z7w04}XTDWNK zg*1^( zBG<4?f>R-koka2~QIb)Pp|ZsniJY+}GM9@~LtxKC{(D#9nUQX#{a_AN*wsCJ<4{Dl zd-#nOVb^gERV-S3^}-AhX*(u7!^i<`-2=--tbhoUEP=mQ!;o)-1l$6TP4PGqkQP}N zTy4-wO?$3CSa_Co^p-TV>UIb5kvDM9|J69p7oT94DISL7%+EdsRE&*M zzc8bSbcaM{=!&Q#_HM4@>_Mxs?pNVl{BBl7;clp?Y<&(fYD`XSP*N5)V>b#2h|Kbg zw}PSdNimN0FlUs=3@37+KT@Lw9%sg%69^h-#k+DMlBifKB0FK~g4Ms+P`qRjIue!m zQU*SIH7J&F1e# zGfP?d-pxl{c-D&1mW?KoFIY7spF^d+kBQn|3Dkn*Oa(xW>2xc1L=r8{oe@=nU^9e_ z_r@Wi%yNs3@B&%}ZIY*%Mk-bcEHlf<9%nvN{}5N1ApDtE3l~#zCXp_E;a+Rz?O=kK z&z%E%u6^~S3&kQ~Taox_o-i`gm1_}JoT#6aSSwCMwwYWQnn2r&8aLX`7Qg z3=>XUD_9)3bkli^IXzpzgiNT*7Puco$`!cJ9hYsC2|HWqnk$omI1%VE z;5tKO#F=mb4i6Ku1+08BMl>RMso~RE0=rOF%I7!+^K<%X7Q86+Bpn{^Tc1C+5@>=e zSg{AgpXS2Fn4VQAv&N=%IdJV-gG=i9@Nwqqr`hmS)(y{suqhsQA7*gIIb5Bz=0Mts z%eyF(Yq`YB0Cn^PTy+D%Ca5U8lj+!J^4TIbPV1tUYypOA?&FVSr7>k2fxN|)o4!7& zg1-tkf{Lvg;D==kRo3!8_i`lh0{4UNTXmP{2qGT1xoT@d9ps1lGbK4&`Kyu~)|%Ju zLYbM|WuQA_7j$KKx6afv6PuNtez6OXSUykk{D!i!N<@?hnB~i9oTT(O0@;5~mYlUg zV?s2n+$)a91z8G|1Wb`v%F4atb*xhJzwEp8t^zh!H8$yokXizi>;{ay51D1rFFE*O zB04NmFhRb}WyU>wb}7dBWM!u<urhG#-KDrB2G#1#7&=Lky%GU|+mkVEgDF zUWNDKT%t7VC3u1(2ozaUh*=(nxoos5 z9S*Bna|~D2XymV~IjjXuRXt)Bs(ckvSE-SfOP{F0{dQJZeZ-qk`~6)b=*uC1O>sfg zOini3a%{5FuWOu146JH`D>j%~qZh0dEC(!()HFt+1i5jMhDHO zVzR9xlkvl{XZY+Nz2XhlKH8SeX!wlP^^}zxd~Snp$K(XJtH>6s4L^FC;B1vzDkp^7 zEN6ajt>f18Q;8Mc{i$Yw-1-YEF#{fqXWzQ|TYJr-g}7K??@=VywT=7u|1 zr`tg9LTMaj$e-AM&GDrZxM10A+m*F#;ue`l-4IsUQl z63P?!R_$mtjygBgg4TW}nkUd=*NV5yjn(QoJI>DT)+0B^Bkw~s*M@xE+L`94oMXv+ z9YrF)+Ii)lALKqc&Dwem+pVq%by|ZO!%nTUj=^&9>vK*y?_N}2ZaSUVII!OJF_&N} z4`r-7>UcN5_z`O`(yg!?WS7`OpeNq83hf6KYtDENaIF)Qg#qrWUR6tS+nST7MrA#3 zaQ)H#9s9mI|8y@_=hT?)!o=Isv=(p6S}|O+TVm}It$|v;oX57oRl|dl4c!fs@!>U2 zgOx9;6JMy3x|%LWRqPJ8P7f4YLaRw;Y9Zpsa85|u0&fa~ngi=W#Csx$8y1blA zq>=2@QeSzesg{Q3vKUnya?aVnYMcYjH@X>LtLXi*RRDI%`;~<-!nVG}jS>0rss5-9 z=^hNhVdzfzmy-G%CS!MZKY zOJzMegmY(A#lkOc^kviIonC4^rdg5$sz>{!&;k%LmDRVooFUo#XD=hUp@`Vrt(gg5 zA7&yn8Os1^Xy_a)rn(;U6yo^IDzdpX8OaMiq1iPty=CBm5Y{b7B= z@R7AYcN&t_>3kacs)E%c_S!Sm8}p2+tT1M#K)Oa68~V!cTCDH;mEGoZW_$?A34J~5+4D>km|DJoV)%QWZU`D@YNjGn~p(PFJI!Hz@w^ADXFy>>1TuytEH!N^K^FDpl9@h1;m$QyJ%SpH`90nhqUU%gj1eo^_@xKBqcySplET zMF9Y_WxBbTDfkqj^W}W?o3-a08=p7dv8?FdFo4%=GRkzbIRdd`t2%UsQ#5W1gl!yd z?@9UHQuC@nweE|C9#lW{{p-hXnYvK&OcOk{h3$Urvgn4xd@K6zH~RJMQz_dC7V9qe z>fmCPQhNMTpBA(Op7e|EfUq`3F6BY;rS$7N(h2J)3Tl)&mTc(j)`uImr8n7GhL?XY z9BTja_b9Y4_!xO>-BFL%mipQGIP@&!$CEEfoQDCd*T>gU^=}1%eX~y|kl_f%B~*Pf zp)k{mGk>ih_n2e$NoNfm2Uu1OBWFaLU*VVCkt!Cl>2xI1N2uBDN_u`5^b$j|(H{e?Uo z;oW)CI+F_m(TIr^z#v$&;={KWGpAwJ49;Jh=? zo2y26hg#j4m)9JNuE@X7cGyH)*$24Jdmt4(l3x2zHoZvT=kw^uoYGpZ-(Ga&^FvZO%AHBqBd?{+U+MOXz-x-S zXd2Y7v?Kus>iv9 zTr4U)Kqe;EO0kMr>!n?MQ?8TtQ-fHHkUn6Mn%^w4)@)lub?b*?r^O68m&|WG;Y^7@ z=VQ_;NfIFjV=G1iy%&#C1tLn0Lb5x>*CE-gcEthm$XdS~HcI$q4PWr!a7}=c8|O*c z`^D8Jg#JN_g<&u>3xYYVr`mwC@vM@u#!%t!r#G%Nh6Is+ss=$+xwoiz2a!me3bbBA= zb6?#AB~Xp4YbEHj7i{HmA?5_8x8Pxq1-aws*X7_f@34$ott#N>TdJEZtW3?l>d2#u zhAP8N>V^J3in1ebyv98$ADy!jf)-Rqsa1o@PH7{~E3bSiJTiv;t0gI%0_HAWjf(Rs z6Ez-k^~eiB@U4E7_qvN^I@i{ByHlqw;}jPT!I#Rz-6X`(d92>P_6x^zt<{zq{%Ywv z6g68+TvBwOd2Ib4*rT~M)%~@^az=ySH$>N!D*{LSl*lV9zLI?o=0|c@ah?y+29k)3 z3wLaghMKA&_+qfVn~n@A*?d!@>j7n3rX5rouuvKv-dZE-q8Bt9AG5P=91b2zU4L?U zf^YTd_Lt%vkzaOjK*!QlS<{_rM|ua z`J1Omk#~k|v;&zH5W;_Mr|Ax2`NxHnEONPjp3>2i3`B`{%uKUerenOy9!T6UCx->@ ztsEOib4rJcl?$9f`{e4<=K-bXk z>zucZ65-|_8p>W?C-xV*6g<6QDr{8h9)Ue4E`Ft?pWhr32f(X9@2aWINO_V7LSJb1 zy4!B~M-Ibtz(=l2Z}?bBsRgXBk?8Xjq7vnGGCLCVm-Hx@P7{lelIXTNdlaL#X$|Y{ z#HrW#bZY-yNK`yW#`JA1bc^0j!F#wdXSL>N`3xk;sk^cMF~4|Y9tYv@ohX6U?$?c3 zk7G8Lxb+9{f^tPHHxDj}yd_6TRGru1N^VfO&OdNO5Ma99+MOI1Y>I_HO;l%`;_}K+ zK_#~cxhWX;Cga(X%i|Oc1R!*W7NIGTT@kytbogM3MW<1p`(FC(2aY{RWzVssvyFX+ zH#{%e-xsDtYbU2*;xYnh5_>is*ka{rnG}HC55jK<{@dk?SG* zj+tY#3htX+H;=v@o_%ru$bW@wX71P#t}%%-Z5d9GJAfkPzwJ$kPAWR|n`~32&q@7T z4iErM74hodvO%J>>!VhvmoDP~el05cNw~et2ros<=0!OH&hp=N#jhvTGKk zk>mpV1hj2X2x_r)wLTLJ;4DRgc#KL=qnowdmT)}qpL#W-ALu*~Zkjm9BF+3CdbK<2 z*#DS*;76~_X@6V(r&s%DR|85ohDGSuu^U)DVPJKuegAafEN~Otp$P(oBp?y#SnQGV zr(F>6^F4GIB!X1fno$K~`cYlQUZnGMXJf%XN~eJpgmnRa6oE_8twca^>Tt#HC@~uE z&gk)ERAZb5#{Z5vaE#T@?$qf>Bqu}JrcWYj>~zmt!T%V7K!cCzlKw_2NWBiSowUC8 zOxtrM!~RNTnE~C}8Ulu5TPN@q010ygl=Q*qc~N-r1SYFH-3*-?bw=NkSHkU-2ZGvf zNN)o0=ioXpK+=dy2GWBA_(i-ttX@oiV;>}-jkz?e^|%3O`r&_@exm-|vEYHx#7J^q zW3#UUmxt)4@yGpH@i0*yqi@4fe5{%zbwO5a-?1V4a7M^R#OS3ItQ2RR1>@-+Q%8S} z2+!uQ4eq=FAGA%BG^(M(v5M%4l)z5(4#h!kzK0n&=b>4u?FA6zD)&BCe|;`sl{t|G z2CEpF!48(hVPnWG{;Ocvg0y}=R3C1cCa^qdFetc_Ql+@{oz(3ErKbR(B_lv{R2Tv< zLVr&vN+URb*|!f!;0U;H0h|mo7>?W*b%11~hz@>PkQg0`%V>RVS9xm>4OA%y90llD za{#4IB!A@Pys;!?nGzmEpHSw2yK(uwvIn4V@6_$JUh-fH1D0yCfo%6=tLadhO4&IDW3C{S%L`Ld6y9)v*U_lOJJ%>bko}6lz@S!Gh*l^(|5Q8V| zxQt!z5P-tBC#K=2v|%v#Di>4=Z{pz5vCO^g0cpLdMNmZ)2QYkhO}F9K zF7GRVp8q6jVW-AQ(K`PmY7m}cNZ%stmS5ylTGqn>q;2hBG9C|F$~+GI1b_L)5IBp? z>Ogg+2qE0A4Ox&uJ_`58r}36!4_pC?G_;PEunfE#yDJ>i5RO`cA;#VtmWvS(>D6W` z1{0)v5Wp$uA-Z(UmL3lfq=TZ*-Yv`Y`t5cR$iv65-2)LVGiTWWU%zlR-P()zW@QEeDce7%F z)-RqwL-0PBII_)seW5KSeW7cn55S*HfFe`A5U;iKs|h$)dz znw1r6yypf2u{aJ@jEC?a8*vpW2(TU5&ZyTeuu&ijn@S7>ha}E({y`1g&H{jwQ$~tD z`f)N7C^0&IlqaZ15AT8nj^I#-#Nj|S8X<12X~qYPgR%qXhs3ZaMq(X+ETN%C2{@3@y{a-PMu~<^mLZfBd@)9CA_|Sj1q#5e5 zFf3`U*AfUJ6jf#etLsQA8b*c;HnyWoUPi(Eg$J~LYLJ-CQn60tv-(Z%%%2S?!@Rd- z@PR{bjy+vbmDlLU4|NZoR~dJPjpg8LJ8LXx1{J~@gC$rcn{Z1NiBWZr^i9w<+TLA`sPz5;gRC?mv0j=OtCb};9ZBYeT4S)N@ihkQU;vOY$201xvXi@oKOHega4 zqvE=aK6Va|bfy^yE|Q`};wE4ydhE!c1_h{kYAn>uEKvrGNe=tUOZNp&LC?rJ1`Np)H67bdid4W9J9ZS7>^uG z#(26I;q2KTRwltF#7`7DCpo4I*$_`#=Hh9%aJEvhRMnUwL?5{>9VEnI_=_i}74j6% zyIe3nS%L^`Wj22MD2{d2;Q5(0X1-ITn;V`(0+RTiP~H{BSaVT)-Ncy54R*o!eF@r% z9Am~)mc+dZo8Pz`gp^2q;6GaoKBeEh^(excDJ;|ZERCcuIM=@EG3F$_&Thh_%z4}D z$t7mTDdy8WlkA6-4OVg*HKam|WpYalp2Zu)uyq07GWlK!{B^A>rrLl7bR(NK3SMcf zS|(%)%VyjERL~|B=Ka9s?Cw;jNO&;?@GM5qaCOB8HcYamE?>MhBG{Z==i6e6(2jpX z*q7?zT`?`2AtYj7)Dg-1W@4-%c03aH*e^w9m4~fpT|w)canN$UjM3H3Zc~n*82)zI z%U6kFJ=HS#e8NAO>!>x?>SS+t&^{Aw(pBUj)-AbsA+fDUH|&SV7gqzn>aTXYt<}bH zTNbp(ul2K+>V<*tBbZ!wZ_?j$y2FbCFC^LGBfeKS?doq(58fX}9ajRpx38NEUQ}Zp zHv~ezs6GQ@&dX^iBhS5anYQzUicJ_GOF^^?tREZ+;QwvvJ3Dz#tNtD()9{)#6aSR6 zKOghGOhV2#v^1HGmtrz#4O?y&Zs5B&nPJ#Of>lT}OlnN}wEH=Y97^>eBSkXb-vv(? z`$>-7m#3KQ_<&6`Li|OP+N!X>^c9g1-0okk0>LGjyU!urOddNT~a zt46#ml3`#vJp7RwJxsokh(9x0m3l8{kwXiMz8HJgs}y}_FWifVfj&gqQe+vRg9NjS zzchpU2|7hF`9r6IMzOK}o^VbIR-^O|+bU5v6P9@;PJ@x9A;olO7&7LfV*XHgZ15}F zKu>Z!OJkrC>2{jEIs;_seTTgelrUl(&1-$Xjv`YC#XnYuu2~aW&EoA_6CMmiu!0Hm zKbP5%=T%9jGRzKtdl1t+Ab|jdh1q>IwUI- z%ief1o#L#4Ko7Pi=e$O}tVr~lKzw~D>Ba{pn>t_S1M?{qaRNSJ7!3#r zPJTRjPfUhH>}NW3&B>n+F`}L)1NJ;fdN1g~w7o^?DmQ{3;H%8q17|z{msl3kNgiTAbDcn2YUlyn0Blfb0s}KrLE0A=qDH&`HCHqqgO^ ze<1Ti*_<2$7D;N(GY!ZVhpNvuWCVru&ps@Q%gfD&e zR+^~NvYRptvmgW#BSMwQZ0+UX*M!{Nm}4IlF_5oAa!&jhZ5Wggy;KDA;gBSeS|vFa zxdFz5(eeOwg{m_QSjS(|NkLAx+y~SURMygj?pibH{UU3WG7D#`YxJZ%u?@VdQRG80 z*@j?JQw4to3d}JD?6OX%DzZU${DaS_UI_G`EXIWcb05knde_%M6WaS!*6<|IEKA$Q zF5MY(Cn8vTO&~3h;V#3%haTU&1eHIs&8zh+2VpFU*Gl2^q1+pC&}&phC2wALoVIrl zSUpyHKem9FV`xRKsPa#_Tvbu(iAdCh92vsrbi)Mn!+Vw4rH<-d`yswnCNvsw>SRUT znxjT3#d;=5H8`&$q%xd$iS_ ze_bt&%XnHTvy3(ZS?atZEA`F=s*-EpRzAYia9P*Bl z-{edkT%TMYNxn7hfNL*9Ic1Am*x$&8Svl2e@F0@c918aul(Zlx`!WM9!dzRE*AAL5 zi0sh*gcg#?ca+hnDEk{34OBJ5iT-v8PolaRpZu(%C#75a<|MnCJf^0|Uyn5+k&C}t z{z$;$*Z)GB=nSl>EtmUP7-SFSY(#i2HN88YGoJ- z{C4n{hNs3p1&i3ORyI2ZYdSyLD#$(fr5LZG_>cIbBS|v9lT; zY%fDPqTX;wLge=KJHc%Z8jv0X+GR3HP;0tv zU}crv@&Fht?~-@ zM<29{k?K-<+e0r0C0y^0y43F1Y{#CEG&=KCnr7!@2Ya2*Sz}V>M2)RB;hVFI zqjWyZF#HXHr}MgDc#d;ky*66Vd~Tdcp5Ym&hg8-jFW(0vAY*3j{jZ{ww0ol>*ad)U z9m~25O0P^7OuNQDtMbMD3_}W?N_fzlo+j6?MI#5)^hET=3lDU5%Gt-CL6>L_+6$9% zSOcNhLHKsBdq-cRW8eM6zE-cky-L|WTF;jzrhUczW5FGXz}=9kX-8Gl}*h zq0i=POnlc{K3gV8hT0!Ad%x=l_~c|Cy_@r08{*y=G`h&D1+VH+?^hZYo*@fU(}- zP()myFZ4#~5i^l){YL&6`h&Ht-6FfTi^5$p(^q$Uonuhc*o&yiH!HosEN&b z_LI%PnJu(I6m;qf`?MP-e#?VlG-ILxVq2ir7=t%tVgz%9F&uV%ICa-bGGEN*lQ@4U7Q_IYY<%>L#bK=(qo8gz&|5f2K6;@%R|ct<*cnYtm-B}GzGx>qSB;YVau{5#O5ZFgAopXh9>gR$T^Ldf3hs2nm&XZ<_Y$VMdF zs83_306?X!vL7Fjqk3=77CK;_L}+$fM)# z2>lVkB6Os%W4xzQ*4Fv`(qP+!JoM|@@Mlf;>7-%Cn$-*qZMDup0sZZ)?_q8X8e%>( zyVZZhP1kY=OzjKRdAwycXuXlQc5Hyri7Stvw|AaFiUQ5`6upfHX>)EpF5TKg`jy{-n@{jI>l;1MW#(v z8~UQtou|<*dUG6mZvlo|#MYP$xeTD2ZxTtRvLlPX*`5o=k1Cyd7ZCQMCUmJg_gz5z zeEcBDo>+BAw9`wu6ZjkC-7%}2yo{RbVtG&f@MT1jZH4vA^U1t1y8^>7Qn?3R0lLlp z>E-VZF9qmW!n2I(SG-&Az);#(?YXPD%_CZnAM5j|r8$<`Orr3MsHKO~PU`+)?{YTF z(HO@z2eNuW&Ro_9LC+2b1eZg5eC2ma_uO)0NK?IQuHw;FFXhmb8n@D^LFelaJm0NH z8D1%QK4!Vu4#W4{xfk7Ys=8TsRpsc5AkPi>_9G(&Xi=N-$M5;HYb1PT0Z}Wfdauzx z2>g-MD*39ixmK1)Ui?sN@-?`3f%W4f_Rp&a&9E`{jOUvmsyTapnQ_gLr|{J_m>F~b z9^+PHF!$@pqwBjNExbO9u}i&&=RUo-{-mf%=I+zRw#_FwwI04wE%b5Hdxh)5@-I0kgSu`w`tu29M-uqf^mJKE0opVD zdCBQ}Th6AS=q{*8Fy6vnkt-o{)sbJr0fGAkD&|M$nU@TJ@o{NS?!P_ zj_WHGg~o-o4yvRpnX!q)eO32Sx?wC0E)SAe#FJHRO`g~bpEV~7f+;S8Hls}74E^+ZV$ENx_53HRD^qcyJ((+ z>H3cAee$u|z?e=jkU(_|z3w&^>IKbnP*qRIHOW8S7ap`{HA*5vG&d9nr?ZqUDoIv~ zzaHSd!`NqR3VOcDlrifis0b!QDwBuzkTNAV%FJCSGiPm% zF2+ZNnHWE+QPzEVGDXTdYVsM8I!MU0KMlv^Ly@^_jhH6io%3p+l!{H<4Ii7QbA>!G zw>qS(5pb?rkg>#gI#?vKpi3GtY&vz1l>0GxFuv)$8FZ&Y*~}1-e_Qs?c(lp9N+#BR z#!Bv;-)Bj`PGCpo!H1z5!IF5lvyD|4WyJg&IY%XYx;xXI;{Iqn`zdajllEKZE-K#{ zAzP(Lizenmwa!Y?E=I!pOLrWyS}qS9tVFF8-ma2@r(f>-W-5MuCHP9YoJOZh4#A80 zN@B!j-7NOhWkIL#F&s!=n?tTwpcRVG-=5*lTA69d+(aKqEYktyk}A5NkAE;%QYYQ; z*7xd<#{F`Luhg=~Id1a&xgin3`RAb~5E4%7T1)$A9uXCb9v%CDH;)y%-Eds919M&a zmm;gcn8xfkjyv()zT;7S+NhUWzaGV7leKm9Rdkqjem-Tp)fGMDJA@V%&sm)cSlJO% zk#;>r0lgQB?hYO{k{ggaa^H9m%if!LI2p;?X8#G>`FEOe(AXfoU+iH|D!yfL+)Fx< zHeknIs8;V_#JsDpXdEpi8gqa1{;KZ<@$gU2GItDl#8466ewhk;6N-5M?zw7V#Ui-O zE)vQ6^LpOnk(fDR-F^7JsJfJNgo#VN`oA&efR=L4CxWj4Wr)bBk6+IoyHEG&<39pL zD!UyK*xl>bsVZWzG!p}z>oeFAPQ(xoI^j$*c;rq?%w-u))vweehaMNj>X_>?YV5aLU}D4_G%bahO<3}F3u_$v^nH`B>R*}jxK?B2^cN6OL*9~6nw z9z~^*F?vT{r?T|K!1nY9OwXSQ+Q$+kRpOrg&l`>?_`edRg*JEmhbZkG@9fH>5^4$^ z5ira9a{eRqN$zc-WmvKg0Dq zmH*MoY2EIrM#~tnVasE*svm3vw1~srEEkY z;L7svscTe%eB6`_3Xhf)MOwU~eFkBKIDbzOi^Bib%1IVG>ltc$;#16nKp0)~(}N3q zz%ia;VHp(lLBe+~z)ZzD9|;s8UbW*xX$^4Ja}3gCY4vQDW-w>?jO~=lDlGysF%xlI zJ4mC#?f*1R>J1$z(e(B_`Kjs*9ih1uZ1oOCEY*2{dqC{$F*-t z*qmL8^*?3&pbR27DZ&V1UY}q`NOAyqj6>fZAV0K1?8ESUSFNNLGTowOKW4EOO%B?_ zVtcy@XR|Mjs{*w8xKQwY{VQenxH7!F3)9$~y`uG-H>MKxlIM@78266CfJ8$N_jZ6l z)P+Ag0f74*48zw$)N<@yn zMcYzfdcY-V4jlF^Ta|VGk57zNj(c~Mj-_o63o>!SpoqtBE@s2RT`MZYn+HfD zA9~$9>>!};SWYY-5DS!ae}|{fQJc$w;@BwS88$anMZkloPZ46LTATICIgVd}4_*LkpQC(+i(9zj}2@~JUAw?-2dneoByQvo1koadNM1FmS` zB@fd@?UouZY!^TcKnC}kXughQK1k3q?>E>D+m51eUNYnN0gQNiOqmlSfip}6<;$HK zvsiZ^AT{=!vLxwfYbyRsk(n>gN3{3Z%SQkR4mYmB{-K=V$=VyZDER$O z`~5(#LY5^ptm3_8E^yCQF4-5OUxU|Y^yCx~08A6t#knYR)((7Hr_lO6Km6O_LphBI zfbjU}L6-hMQDB@4Ash{u5tMWdP*TE-X$O!&kceDN@-QfKD)Mkw7l9b?HH-h{YS-B7 zq$3dCsx7{pj~VPE+J6@>lHqZ(^ugG=L_$3L3DV=SX*p$a$H2i1?UF?{P#Bv({mWD> zt@*VBIg&F&$bwz|SE`_dZROd7WRnW>Nju(Chi9`)JzFUBgEC+@s;O){C{7R_P@E|{6A{td<)+0^pJWN!B0Z{J%iJM(b;TKAj=VJP)qresHEzNoKH3^TJ_T?&samj zMFL~+abvza&>L%`H0Y)*1}D}VYlRCk&NtkcGg?h!^^^wh$A&Y>o5AIk^N)qZ9$}Nj zg`d!!tFY5<E$21rQXOALwU z7BDlcIWbpZyMaZdO~p8$1(Ov$$ea_=Czb4}Ot)!mV(YM&L*@VrYu(kufdhE4@}!%- zkKI^jYPaU)Y>4Iu46t;7AST}-dUFGdqM4*UO`UqS?^t3~cM z$FuIheCR(1b(-8FA`K6ue$y%8oU28?Q7i~yRhq$bkq)(!9)v@B4k>z@K8(Yp1F1h_ z22jqI)ZDRd6nlk+r37cVZ3Rv)NrpHm!1~~xj~I$W4Q;u}`Kjh`>qh|}&F(KZETw)T3ZbDlL-;6V~_J` zGBxIs2SOKbfyrEZxtk1`=wiynZB}yEwl3O)spr*xu0#pgM(sGAM+_O^G2tt*`!j5@ zb^RR&;*h&E&T_^VJjq`!OVay&-@P#f3;o@-&LnQ_JN=MKgeh7vQj&YG4k$fhC~V6! zd?^$Is7bP4In7G9Y_);K!&_wwWQYyDr}v?z*%wyhkrTY|P=S$-7fW?`96$VlZKT`U z@5{ctZmb8p0s1&pHy`gApU}^j!mJ4QZ(T(Y@nHj>{^`;nd;TmRa5#|vUn>Vd!}xh) z-Qc^X_a!{TCqHp7x7>dXe}<4!4da(d5;B&;E0i{gs3%M-ac#C3_e=a zp1-E$-Z>Pv<5-v*ikp$O@d|Rib`}0yEhdT+d3!IKaegX>4SvhX%UEAJa2Hgh;nQkj zQS?qWPEz!at^b)->~=pWJ>}XS6Z_CJ%o!J#auxo6koTTnO|_4o^+|(-dLV*S4brQC z(h(DsD$Nd|7^*ZCycMaM&^w`5A@tshbOX|x0W5&1AQqa63QAEk=bqnp=6Pn;yqVXN zKY*;2wL+5XbM3wF?S|_?P>yu?`D7NqU0hcb<(xk@YBjWGB$AKLxy8p<&Ptw}J`{#S z70Woh{T0K*8((29KwzLB?}oz(5D5_X#UQLrQ#*pfRoCv2nHAF|z!!-_JrdwEB$Kc8 z$8nE1#9oDK9!`uPaI00sL^QIA2uRspg}0Fs&KI&?29kDU;@=DKsnamdynN}nSXa#i zzJ`F+RqQGVdqGdsgUoQ$cy)Ay>JnycC&Y0psWOY@038A0K{arnuhCH&u$TqBlyV^_ z7cK51A72)ZDkaD_ERzzU!ty{y%DfLX%e%<+v5!3rk6DFGUmPaJ4(~Ex;kzk?hv61;_U4Z0mDRL} zX`}%<-V!4Z;W$|hDQj6Uq`$J8K*sX(OjGyN2r)KQT$;pc92y(qyJv4MhO%1AfP5d) z)WGur*kAN?HbmAE3JVbru4{5uFEbw42&6F5vey!pKH8h}uyBlIu31xWk0zhWRyK;x zsM?F>p{39;*l?+TD?Ca8IT4OXt#(s+g+Xq0eGV}& z3-hE90byWE@y{fS;L~WsEiDmG@d%%!1xapI&-5TrTUEOl*1)>xZm*#YN|V@Vv&FD2 z$RWq!A89YWmR;l=&1c2A8GsEJ)P|UuTAPOvV(uS)gb10~-`&f+fH^Fs+fv?8Jaq-`sUwN2>AN+SwHHxy5%`_+wADnwVL#O4-2^0jHMmwVL_6gE|# z>d*izkseWR>NgUjf039v+NxpL5JkNtFp94z(5@;qH8>NK#@HvG7vto?m2r8-UmU5? zJCBhk8U!KA$J1+nF4Tm`L06>_M?4II7V1Y(RR=_YIPJ2C<$|>Zxzyx_SH#Mu{aQUS z%uY`I`NoHdhxjst8qqp5__?}|<#x(2E-rc=YgfEEu_1!MF3m9hP?@A)D-h_DEX>S} z)pfT^n5SJm#D@_~P|yKOw40R2Bi|A2&O`i_PmT1mL(bG@f;^bx6ES!x^FYha{CqVh zdo~Q8c0vc#X{fwxD^LK05AgAotaI3QAG3|B5@TUL zXBw-(<%ntlySrW22I}KGj9o&JHLVO{*L66Qu zAkA6_V!E+#JPCHtbvhd+8PGZF-&B{I6;W7&@3M86nnTX5 z3~?`CVUH8Ux6IiJq*NAOYAq9^RW-RrcLdmU&vj&LgVkF#S!3IKTsn z_B7|T-s#n$PmNZ*3c@CUh2{IvT=bUe4Q!)rA0@gg+aOqXzBgi;HOz}1L18J@vDN5k zXSWl`S*qmH1^-&X(IStRJUd!lqh&{JJbvYgK*gK|8$f|=cDx(fMNkt@!bah@yNJJp z$`y6N?HoGPg)-I6``~5k;NMs8RnT6TQeTLoa&p+F zLSPYfBvt`zqry_giBYkAN4@Win~rMqu{(*3R?48ZZHb{e#GtVL##W7+-o)5P2+7US z2uh(^&A>IS$0d0+JU%^j-gk7ihHLrw2xi1HzsF_Qt6MnYR2xbyYRHw96D3-W6_-b= z$)jESw-v~}Rj3ZTiLtd+;Az}Af`>zr5&eE5RGP-RsX&CVMpd1O6WN2yB7Ba()ZRoW z>m#bqMz1vR_{HM*H#^4oD$s8?EYtY!fa72~_2|=Mn7shx1fA7|X1~e#?ju8V_yt<7 zhj;pOyXkYI)8A{lcj9=rK~^prDy`DzD1~c=335~~VbTFi7>Fhdv+Dhs_4S!zUEw;b z2+lVE^E9Htjb{ey;^hX1oW=3^djP7(pnasS^H~Ax zApAJP=U>Sh=&rTz>fpwDQwaDA_RcOwJ=>qqTjqX{`(*wdcLNS3wgj}rqthW6XbA%) zbrQ%d1S;%bN1HNBkTRwMs@BkML==PS?{ZW{YWDJ`HWsJFwZ|^S^RD9Aqm@~RI8;Lj zyv-X8`IQ$rq|Prl4cp08dM&^krytq-3szSbzn+kSmM8^hy`ZK#*T=^=hv7VR)xk~+ z6{x;bkKlc%!2_Ej9cON)PEz6~_V4_Z+`*tSKVREc(}V(;5zl}r500Jce)VuVilex~ zPCy5E_(`nc9lPE75ElD2Jw=GlQ=j-$t zW1V^fiVVUjkb242gCzO3gHzxtup}qa^Yq3Oc;b`ehV;sWr5`t*L=Z}k zB?fSDEqgB(V5i1Em@kQnJYg;@tNwj;xa;kLMx~Uzz_iq^$=!lAo$6F;o)X!)Q~iAsr0@F@{QD=Z#)w?DX0Ob|h%|$-{1;Q==1J z)Ba!HA0J-quI`g(cD=vhun_DZu)VmF-?bvE+jgVtrN--eG;OUKJ4 zcwd9|fnSk*3j+4;&6f~~-Y?zSA7tYe&&Gd&G2Z=o{fMsc>|o(TuM$YX^+uXTr7G1x zKH1;FYj=W%kH~{H!)w+1w}0tu)h9MS8C{r5FZX`uPx`Pi_0G2Lhd$SLjB&Gj@DJs_9O(zx%fJW4 z$hHoLT0~#q9dETU%$O_-)%;6695$+LS^aWh_1>Eb#US{t#QgViVU-R7Yv$Wwzv~lz zmkxVpDjmUuor0-sD+c;0xE#>}jw;YlCvIPTT z{#g8Ee))Npvb@0V{FSk%7s}$Sto!W49wexA$L(9M>>(VH5#)WZf*L-6abFIEqKxUc zb_{KIBqDzx7ltsFJt5H_>yLw(9pi)A;KP_52aj(m`8(XEeZ1P4NvFXct*yT}+G`sD zZ*8cR!{FlYeHWRuJN*DV5Oa|DWmi73Q~d1#6xYhN%&i~oeZsxo(@P`SuGg)t{&e`o z-}4vX!7t%M|2I+EvAzdPmRKhh2;Yg~Q)HoK_6ZoJ{Aa@%OXoY@G&g+VBeda&1&YX= zNi)yYL~*6`UtF~+GDs-e7Nkc?KQMZz7h(F%88Fw$F_c`pKpIK5?twO(wnEEG%7gg^ zUDKa>vDGtv&xGh!sgLe{ese?cUX)aK$iewC+Qq^+4fCuU>Fw1P19l=>RhAD_ z^%Q^Z^6=P?K0NhcQo+Zl^l53#(BPbI*?yStUGJjaSrpWrv;4joc+pFC> zBEL?=(W^SoU&I7OuM|~NIiOY!Dph~sy#2vkI|0XOks~$X_r0GzigDSYr?0(FmGMLP zsx9i~#^+2fQQEJs2Om<^Ro>UPx3m|ZMu-R1!LM`K9j|kd!?PYQh##eivK&8TRef@Z z&UoBDgbzF2lA;Pv=CTZyuk$=s!ENxFH?6L&-Ced&>+r2@xk|ZhkY{))1=@84ebf|eynXnUT zlyj!BdL!}Gv6^oNu$7fnmG~UpxI+)(t!tXJt_aSCSx+VC4}z)3abOt$YmBDw`avVB=i*s+OYmU0b}cb4eZ;VkEt`c2Z< zu4ui!tKB+N5^8vItez+N&ZEzq-ZbAr;YfWi)`Sjut! zq_gCnK6YN_aYTpv+`(&~BI$UnL*eUV59BIwi2=`<3I%F#x*N}Ft6_{Lq;`0;blhEY z`YcN*J??vip%8&eSm4+d3;_o?E{>)f?Zem=HF1wQopY98^7>pRX>{~jqlMd-Zx~rk z9H_-!c>N6sT%j$Y6wnBX_{OBzmM4O3?Pt&~r0AQ2R1(u?`1BW83<%vt~s@K1SmP!a@_o(p zo=xNbY&!O1EtRw7ye3-2%x@gP1;G&Yo{y_nUOeFbCi+eVAlvY!1r8}>p~GwdWJUDF zE+uwYGso`M#klxkTNeNCJGzl8bX%Bic;%m$Uz4LBp$G5}%{rPsjAxzjax+EJo8w~w zH}~1p_<&KhqyLe#JwyOR4nIgSm5lu+2BSrsO4j+Ro2KgoV>WvfA{)Xu6X1UzGGi+ zx!Fzz(eYzW>Hy^vW(xC0^Z{cWX-MGOwm4N=0!cnc`JPtt6bqbH;gy7yG;k6=wv@k% zRcKo+irxKv0Rce$lQ<`)9hR;wEc#>o^bfNBh~!uDj^*(f30_CQ^Mm-gW8vZ7XPgk` zsc67*ZZ}S&#XP+Kvf6V$P5@)AX(b4}SFs8xkH5qU+(5TX0q}`IEF^IwS?~tMZXu?n zXYcc%NjG*tCLVtZc>{)*xXncdYIQ%)DOG|4j#-)>R|%J(l2z@Gtgr&- ze5%LPgqBmr`q09co>sx)!{~rC+}P^y@HcVlaf}uIGSGvhiV@x*$>hN?U<+uRgo8~3 zFx}=*z#20!>@ns&t zr~DtTI|5ZKJT)2kKbkOlM?LSQBms2R(pfIVGct!|iKeZU9vq;r=%NAY^aMa+4qVhw z8Nl}gvUg^%gJ#`baFkE-?vE9!kx~FaNOHM60n;54wX^~7tb`jy{G5P1c<>a-oi*xW zVl$liej`TU()*Xt1uZiAQ#acU;5XQxYs2bYD4v=J;LZ}55&&IY=%ML=4qXof0MYvU zlL+oKSGf2obH^)O^3tkw*uMGAzk91))>@XC+}m@ym%0iS36GJ`A~RSH4FCQ8ulB9l zQ*>NHKL%z+GHDS;^8-|*%lk7Tp*T9~&UTU&u*8CzHnN#2OulJninwU3zd#+Vub*Ez zBn1FRHOn8lgUGXYjSD!g8=sl1Niz8?o&znbtN_j(r~OYTp1B(aYzp!O!B!0c%Tzv3 z-IW-tlhJzo|HQ!XWGh$k==!tDhbRn+J_-S_sb1h}fA5TYqlrL6bICFf9uP63skWRr zR81q@OCpgte~k?59s3Z;9C7^UXWV+^uN97PDEfIBsq?kqS#tF&VsU3#h6PB5^`cV= z-bQVd#Uc$Mp5c26L#a;DDmGC<%86Fiu+M`XLD#(jJN7DyX4@x$a8k^wvM2N9MjFrw>^ zoef;rE?WzdWc$5@wnOpSk>;<9Q7{7l`aEugga|LT183{BirZ?O7kT z*0et51XY3z{~0!Bk1K{bTI2V~R`HhEnbRx&hEep}2_E3M$gE5S-o3SHU*-vK{LR&W(jJ-PXj=yVnP&u(N{<_(U(5u}c&8f!3dlM^1 z4t9s}Tusy{v-ih@_eP8@no=?+-b?B1janr(rInj~kh9$zvz}_ocr@`rDQIt;#MPWN zZ1zz#cW=VoqB-Z~#7Fh6J?5lOVsqXnvrpQu_NM%&n)826e9}AEdrIbNp|P5;>I?5P zqAgmA4o|Kc>g-Qb6I)88&DTtA_h+)ETFNvg*DQkeXK7rm6-MUk7jpNXRamrEU7cLN z(zXA*A+fdQy7>n2)&7h2sn)uClN$~P`!DHSZ4FW8n@++9b0ZdQO_`IMZaN3^jKsE< za`Vrgwg(GyQ*CXJ6upD}4_-~u&x$KM#uC9WLigXcM=OqOzN}8%e!Jmn{`N_MFS`UO zRDBjX22#mb46Uw7Kn*p-D$Ojs`T2rHA_s&C8&lZbqr*hwq3z1uk(VX2mDsKl$rfJ7 zJHvQ*5-t|TMxzL~Ft5a^$S9#q$Y<{TQ8pA0^?_UNo_XjpvhjAR%2FdWTrW6RK}@ zZLihFfXTAOwaznJ1Sg#ygK}jQm*7Cf1sQ_)Tyk3LrDMqWuiMc9=V3${*MZBc;ZegLUXC1sI5x9Je#kMe0N%?nBr7mj&BZ8@KJe4`D3XPof=d_+F^We6 z!aT|&Et6s?M!5(1(#k_6p~VM8TQ&0k!J#hD%~K=8%*ia|!xX(f6p`v7HHRd~gtz)~ z>-ex{NKpdGp=pEwNq}OxiY>5$uTsNJWxypWtO4)AD|4S+Q_zdRE=Zy{S@TX=!TNjz z^$6@@TNG+rh#)m2LyY1KIbP=6y$IZ@047U};!8q?WVt_(K_pNGA6Q33F{7i;Sck`J zhQ;niM@UgF(@{BMlm;qHW!GH~vZHOq_@EVUXa?VJzo$SA&RxYi<6>ymyq`h1W4j=) zHKsZ%w)I;?A1OvrCQgzZ)u{B$T@ge)CPu#Us7VLeFk^6#+EnIMc;E46i+OKSdDp?gwTTQCnM zRgc1gH%?*jvgV-E^q}mIfIF`{GLk_Ju;yKYd~Em>gcv8ERiuVTEFUfMej9&Lbf95& zk_V7v=@EAP7zGMUUzvCF^5vFRzIzL!xJXMqgHeQZel=N{kfD!{`XES(62d@6!ZR&o z(jg_C0xdD(U8wlzb-g}LK73FdMsWs&xy)bJgJE>2GHJh3qqM@u{bhJ7P(r)c@7loE z%5yd~bIP^A8@t(|vLFO~Q37%pp=jd@882A&mFVk}0_cA{;w)p(t^tX!WE2ZW;9oVb z>n)RoO>!VPpcpB6Xbrokt|;Dyz%f0pi@!id0uQ}-kSU~W#theIBSk$5n*urGP8)wW z2=9q`*b40c$`7BdVFRtQS22p}%K1!;A_1f#v_W;Nyn7$9t5#V$*n%H6*YzCP^)UsE zPz-^Z=VBP`NI$`AP1{++N)Q$G8o9-MQut%jiED)$gu?ATx9PQl=wp;H9F0{Q3i}kD zI#I;3?#3&Vf0|8km6rZ~KA(q_g=JIxu2t;qS11XTvde)U)Epf-Fa(G*Fr}#*73(=7 z+2o2C7ob-ymP8cZroz7b(wxRzf1V9nj49F+Lrv@zAYggP;uO^-ny0$cWib8p3bs?Z z^tO7QBrY(hv#^CJSehpYb6+Sy%4K^%mx&pLDXB#bYZVM$mIREJULhtyu0#@Y>^HEb zic_L-C}pCnUUIsQO$nl~NMWoJf{#=gRZ8!$+gte_>Q267mdf>qcAaj&eQG#}iK+k8 zJiEtg9^(cbUm3}fld-ihYP#*b+jmI93(4hZ4ynzxh-6MKDyN539lVkCvX9=Y*g88B z>r$-SXGFtoYhONc{W-=R<4iO&*YL5@39Ler4CmfijkUV#42f81=|KTvZ3x|Nh4RB zOEpsqt=3h|m_gU%)Hiols=dc@cZD5eAEMEtEmXZPeQdm-yK7+IXG&pjAdxPv?Er#t5x8 z*8zK~vZL7*q3nzChI33;yQ)N@qP!clT^W+ky&Hk6X1hvRH$vb}0xipV1A9TkvT(F3 zn_Y1mggwjYGL_KZ)7fv*&F9m7Whk*zUDL||3$53a|MV7VTtLpVr2i>j9+_kokPweLHzUtuY zdMw$PnY?aPC5M`4SIhyCnh_Nj*0(AQHcv$53T*RveHC!LCZay(w2O6t}p;_9S$v(&^8c7oF7nMce z7F|Rtimkni$aXD3i^Gd32$USj;ZRgqYI?|_m;&bAQi!`XKBSjS^V`f+pgTQq?@r?w zx~y9vFy9-`p?Id-iFf2t<;38n&2hc+s9Kxxu2rCYbWDD+-_)>4a%%vR!np;G7)Vhl zTQvilePe+xJ^>T2;`>cHT=Zb{yCPF=3VkMq0g=C*7W}8)aEvP(wu#h?c5cvrEOtoy zJp48>zP+N-&DV-Vm}v?KTY+>96#ab~Vhyo^ttR&Y+c2haZPJXbS$Wuo=9g3DVo zXRku&qj9o=UGbx?^Ni-BvxWgYOGAP^Y0q_B^v-u42}$H*T5)pQ3sb=%sZ(JJ4f(S6 zI&nG{(f4pGecqWf<131`M${KhXRufJDpM8 z7t@;RPDP}Ce)Ab=;3?@8c>C3J+6JJ|Giwp|!2A>hoQz-L>`{OHtkrkSc`{KFH*?}) z{5?zP zO*Tc7;FoZorhi_)fcp*&`ZeD-k6*HzLrk|04NcW5E+7d077k-=Ym6r!vC-6(3wofv z!mB-ZR^s3LOXJUijsUvyuMkXM?yE<a^%5o`iWAj?<58os`FbPk$oyq_vN)_Oi3*DfPmASL>C)Sf$Q;`9r1mXRr0n zI2{4fEWCOB*8~zjo`QNiz(6nm`mG~#C3>HB&Zbqp^72o73O5Js?KV=hL0@o#UdE@2 zU*!&Y`o^L>CO`Ye)CWoG7*%QW!i~kxT#7{MFkK0Bq<*ZKnEb2K6PfV zuOzN?P0(~5J{wieVJtxfT>O?2Sf2OgDSIamoUZ_B-$W`A2@!;hSp$r?bzDeC6R*|Gn_Te6yuEcBJpf=XUaB4!IX-4#j!h{V=qm>#H)+ z<9m^8kAUMZiy?p@&i>Gq)QaqYm;Q6N3&k)`0X zk)uFQ@E_;j9RLpwsKx$4{{P}PyIXG`hdq~TiTnSQY!}`er-(`)34d1d-ZVqezAn%B zJdNYh@f(Tp0m|lixu-(@B84uw59GmZ=tBQ0*(lPeD{TFDJkAI5mHc-l+m%cUM2%A) zq-0Al`08qG_`+=(h%Tv!5Wf25QawR#a!@Cu_J~q|N#N_Np_$kEBRIXbJr$ln@tcT1 zgTt^q=R^m!&$K+7AB$P4r2-2gIgrM{aXZ>?vs!!Zki)i1P3U>1!`qJn2M_Ti z!I5RX3fm=V{x9UCMqDYMvvfuu%1emSjf+>jKkE(WhlshbF19%T8mk`ATXG0<#WC%B z{%O0{UvvHIT~?_@@6%6)uQ|AptERq-|6=3gpZRA}-a~2sIAMBD^}Ql$FEi$TmHd(n|B1UfTMeM>SB++48E>Xp9Kt+k}GQrcz zmmuKV$17e@W+dK0Y#bC3^O*P+`LxjUS#ukQu zoY;9KcNV!tS$Bg^UW`sTbm?MK&Dq!)8NQvCORIUYz7`knF4m`rY7bV+U~6q!UjTES zE*ETf^wT49*0Pm*5WwW?njT^e=A!8$nJ>evv?waZzg8gLXvQ^7QOUpPszO`5^4Z1OxrODr;Dp!5vpJN71Wd~F zveoO|Y?NgjwSO6$b&B|PZsnA|YpgF{oU~tT2Jhk@P5BWy>(u9eK$W8R8YZudSj_ES zj9J(Rq+>+YJor=lt_G-gytFLZk>j{PahQ?6Dd#hEtz>kOJ0rRE)GAZ=PQJy0ysW}N zr)ho8>dLIc^)Cw}fMwPr?|Rpnvd|VKJ$GvE^PkizUj0&AS-TrJW%oAmt>a%0y{ggQ zYDImQMl(GB?w@>eep@a(^61N;#|T7btfHSunH{0og{sfmwcOYlo6FNoFDTue zDpz$>SpT#gP3oQUpPlt?B2*r_{qoP#Fp2WJ+hIb@50RH+~GQU1Hh+id#az*RN! z)zm$zWg6i4H;((2>XITd-%=_aFT88^E{$}Fc7_v4y~yYbC6JVvGKW$^k>l?UdAN|= zk1W16S#1nEN!tpuD2(DHw)2;hSCG$q#jZ+#5w>X(eizV=T%rPGzY(%mF{O|*QRZyr z>I!F#CS26#UHZvQTA*3{MNS(~N#b@5<}xV8Z~L9an-s<}i^kaQ(?hFczDXNQ8)AHR zr4v2+&{yxQSbek_I<2g)Rlyd<(ULq2W5ElF$skXc`KR~^6k=E-xqo_i6&f>4 zZNf1pVck z)C=bmzaK;MDC-|}CnUwRgb9ykIiUKtbhCRKPE=3{EIG<(hehXOs|}GV+w@S55`v9^ zXe@BH;WAGHLF216ixdMFhEkvb>=krO%NFJ?DP8tj!lbHHU&P_Gof<(>pMb;ii&Bsz z)(CAA!wGT&Qw^>ry;ZUTI=JtPH3zzjy9J+{SWWt-e(Uhn_72dpax-(i9&uERo{Y>h4KpMllohWR|UwxB$|%6 zW}m(9#sT2oAMIn8X<`(n4%`wQVif<&I|VupQ%kS*=6x&3xrX%RVFKhsZk~FGy*>1n z-IAcA*7bz1Y7BGok)OzSv*W9eAbD6GA zod0b|!<*$vF-}VW;5mOap#cuKZMZ5e*@y*z1KS3xAO7W?+>#C*LXuU*)zuihKuJ?B z9+TIfB;~-WLX0m_}2O%8kGnAsrvptvy|8~MI2GN5A zqS8P5^l4q;zb--eV+P<|oy)4$t7@cvK2~(eKlK&@r9hmb! z>~;FNY@)nmtQ5+J6OB|5!j~XEIO_wA0xzHXzXZcQv4U=1RckSd?wt;pTxAct~LfH_s4!-{7u1Dimgl*+GmT4l8^+1DA?M zdt}_{ev#zM44%LchAgB&HH-w$#R}x;GXoBo1f4AO;n?Q(tkuyPWrEr3^#;lKccxaZ z|D~`ysR$|To&_=dSPZJcMAm;5c6?9nU}oSLI@13H_nk3-O_`aRdQpb9kkIPE!rA10P^2a>HHsE1b04UU4OIm3~{-~4X|emZxup*_;nL-PPbtU^FI_-wS+u& zKmz->Ik?hJ%|93^*)5)#RSeDR0jKb*g3{eXhoo&yf?$6If z@u3cUzDA9V%_h&l^R+JY);ysO7w$*MlR9*n(4&keH?k#!0dP0=lk=PbuOi@Fc(yJM zmm>jq7>t*Wbd?x8wr>6AL>Zya7{Ia4DhqeXq3|_#zlPyB#4LNSSF0u5!dZJI;isg* zlRRI5WmG*+eM4OX=k=nIIc<`vfo?aBhN02!w}KaXH3&_LN!Che05lmEK7vQiXx(o z(6Y5)K%oj_E!s|g2;c7|WtWK`ZT2@G3XJUm~bq*A2} zC>%mdi0x7DivWo1l4w;W99c}PF}0m70W7Up9IML7!GSl(SUF4?a!krY zl7+Bnx~Tl|y^zasESk%6_VV?8$3_tQWYj&|586hDAw+2PNExWCgPHi;1ks z5A6Q++Zl_>BgnV^I9~w40mTdFnJjQLPUrV3JBBO3xBx{Gm8FMCYKui39c4RrhMin- z*64or}nveywwLzC>G>b4#X*2GWi-GF3 zN1Ut+@VKpVV6`{~`Hfu`v6Yy>^&WQ1JI_8^9lX39VTmDy&EdzM*OkR8^#+V;vGnI` zVoI)f9vUI-Yf!zcHhA0T)=kzUD*dEN>cj#JzeVf3M-J9tQXw%!BFTU_GBT?Jl;2F zS~rOpFNRP+D@JkEoSqt(%^DtR~XHv}9xMEzQ&UnhSb7By}794(*>P)5j^$0w9L8p!PF8O9|)RifEAoQ@v$Gb&jX zLkTwo9%J$wpybXw#(Z+&<8wdTDtp04yaAZQGXF*mp!zulalzu7riPez%D2(gy3%1I zWW_s8eTHe|*Sv|NW7B=`Q(NKoOLG){&o`t(;o+l>REm1m8&N-0C~CMZz+$x#;qxop z-mbhO%=KL&uZMA9bh-_}2QVL{vclxrlkseR2-}`Ltu^=@v$K z&}InE5gocr=~ucDPF`ViJ9rz>UkAm8I5^&rL|lMf+JG)%(r}AqnjTQpP%V0#diH(7 zd^FZB@B8LE15`X=2Vi#bO0WL5iuZ_T1OCuA*$hz`=YPExzKHG6@R^VY;@=4~jRTcK zSH+(vVo9N*mh&Wm604=zW<2lQ)BDUtSK9s;;eQyd4|?&deejW2e}89baC8Np-htf$ zc@(UJ9Wx5ze;pkKRk!@YzugK1k!!=(h9rW2`3W#tFbX&_+Fzon+$*|I=>UHp&f+Jz zgo$k=Tm~Qf8B|&Y;YAGs-B)3&KIC76e&?=--n$Afd~}UjhH}S=4V`5107!jTVf8O5 zMsRjX{0-GCEWRSBE(N<}1(VSTN8YAn(Lxda_kHQ%@M$iw2Da%&LI^#C$6q1@7cwIj zDyZzWTN>gBL>xT2E5`7+Bmhi-F!rp7Aqk8s>E;htGsur;b2!rI7)G5O`PCKw7eqol zRj5(4eEZ!kx9H>q zVd?%CSF_K`k!&7jzI4>Mzr-jx^zUjY0>&;4ro3q-KzceSr({9Kt+iHyAufR@KmuZ@ zUK!&`nF3MQZa*OHrf4~`e`-%L3T0CurMxN)Xv<1Q-sYC1M}FG5HLocpyd5p71uoI4 zRjN^hrBp;C+muYY(RXNSbMU?zW+Qk{y5XOXtpv4zj9q`YMMsQQAE$MP9C0tr=os_| zsX74?2@SD&0TS*&vR_O_isbyPDc$6&P8Koet&oakfSxttzZ?JYJ!7KY3pPhhAwf+xGN8ZV{{s_r|t%4%;!M2o(-e2 zh7PgZ^HDDCh+}49|I)qN){^^V@~DEa#!(5Y)veL0fN<>=~U`%nJtza)mG^1mv7po_UBgr3S z!2?EGW^q7xjQxN$%upsD4iN`?_P@!hFe}W<7%j+Iw?HkPYc19tL;3k=8SdxyjoN?T zDuL8VRDUf??b9$C%8zXG0#yqCcTu{2X{>a>3bt%i1Q%mlsMHz?kKtpp5A|nt_*KNa z7cOCn!&aUWmO!a$*^|n{J#!v@UCUdQDTlzn&mQ)haLf_Y3OI9_`$M+9@Bk`=e#%>x zZEejqbQoT~SAJg>u?SQe-AY@T#@B$1|uQ?>K~Rbd*2^^Js;W%0 zXXT(Lg^$SA81b_FiLTWYguOJa-M9+-zE*qMI_+3X+0%~PA?VW2KB2h0b{duNQ=p#J zGWA_;N~v1LFTOSfq?;(Yv#&Qn8aRomL2lZU~?dd(NpxMGvWu~B%`s9l45>ff>2 zFWO*2WvbYn2X+DtMi=78s;VT$>kby8zGWHk+hmS12mJ(vn-CP1{q@En3B;R<#?blZ zAxWBYoWW3dLl3cq*S{ilJ3vw1?w`3@ZFx`!XwnOkxJ*K)Z#QaqneiXAoWa!Vd8P9- zL^Tl zg|4R2h3?So<|mRdaqDK~QFU2fW*(%TcBVY|0+;>rpt;W$I&iIftpomADt~q^u3*o0 zXaM@3+~uzW4sEs3UCq+*tqZx>Qfu0Qmzf=iE)!NumwQaoDgCMgZdvzgj<#p3wXy{_ z2m)P?m#Wo*C4SaI89~3uTEO=iiO_ z(lub@R9~=DZ7=fViB_epw;9CNp4uc%1j4D~HaV=l&6k@;*oXJ{k(R->oBHe&7UGH6 zzS@YMBDLIRjs8#92b6*(2uytUKNACmtpq9#L7pI%xOarr&^S8#u~m;V&61?dY`^-~ z-;a;uBQ@y-hnWYCQf*)n^0q_oD|`iqgk*=kyYH&M8ub*0-whty2!NLw#2@AuQw<^t z-?^(MG!pfDoVRkIF`Yi(ZRSowrq)b6_Z)?sXjc{|a=V9OCW_1(x<-CKQ1qXKF?!3o ziN(K0pH5_{QpeKrB$KKp-kOY;2T5$xsjS}Z#@6tF8saaLwlc~3*_tu<^y5}D+yV|k zWHc1F5{Oov6%hmb0+1Z8ZP{C7n}$-w^}}l0c}1p;LNSKarwKaX6gWW}SBk{>>`WBq zzM9z>o8Bc(Pl3>9{xr9kL`{^ z<2<=@@{5%p{2QCJRaxcT=hmDYf(=}DAw&m7Fcn1JA=o;EJRc{su!H%mjV~M?a?-aj z5hPY3h*YqGp{TIqAkrKkHcl=_ENNcSUE~MFG381n|+}hIB|e%X$w)Q)sNd z4IzdkgqRh;1$x;vuqKe$h5)X=TerA^BtCCVuPQWY+?bKMF`^3N8p5$%csQRPGEb#p zisGc5Ap)7+Wk~S`8d^D}A5!S7;Eb_`&xSmPL%E(s zv%$H%(GxEoy*7Ux-Ln|y?aaTn&dMHqKe0;<7$&XXuq`mV+!8+Mf zbzgoj3gy9Sgq>gAczpWL>%91J*b;^Xz2sUmdNObPUWd1%zPR*_e)|?y)BGwGQ@?PRO(*D7Ixm_*&Q_#SZjdu_+ zdgRD^EuMGRyBlWDEhBv2IoL&*)YQ07DndoRo{P5s*xNC8o9o_l-6|Jdkmbe)qYG~#0_v#Qz((Md>YJ_yN}vLhmeCW@ z?C~b+>}Mzc)p1b;Fw6Lzw0!g3{D4tiy3mn$O&9+fzBx&lzGI~8>QU9atFUT_mu7F zy>HzM+wGg9_un65t9>ZHBXw%)v>q5u-qf@FVwdDkm~paaaP`9#wR0{^KB1e}d)gGhv%D2qlsQ%>2It?0Hp{;M& zXVsVL0GNl|Y6YkNWul88|A3JjIC_4D%y7^!gA@`l)xv^yS5cqbSPWR+v>`x;wOvzQlG%Ijz8l7ppGUIw)4%A<^W}jrUPq7rnaJruy9=%;}>|+l|+e&*e_e z+jic)uK)SsV4YD0tVD28*m{c;@9~4z(Cl#4;s655^SowOs~ooW}1K4xKC`qXowmFcQ4>Gk60%~TIgHIo{(J34O$6Rw&GM~(Y_ zbf?UWgYiBKQeipQhK~TAgq!m{r_I?{0oE-E!=iRr!pmvzEO%Ume5oUg_*q zRZEd%SXg3hT2GLRJMxMqK8dgzfScxW;Q0KTX8pkFx4og2w4BI$Pd-6h(D^% zZAD$%QZv~-YCMj7_#ydqA@fo>^!w$b`OI%+L{{C4j(STu_cFH%xFhUZgUPIs^A$UP zBT2WYeg7MSw0;SMSGz?;3fNNl>So{fMtJ-o1#82b8S$0mD}7JgFrTjn&6=ih1c%t2 zfV)+e^OQY+k7aWZr@B?DYAsCV?d7PQ+tX-k6K;OsuC%j5rHg6wnL6H5RdJ-F|3MgMvnn~dU&4%qh!%hg&z>%& zIsZ4_-ZQAl_+i(4(hGq+p@t@*N*53msi6u|q*#zwHH}@Dn5ad?8o{fI3FUBzGb8DDM+66|=6`2ov63g1HC zN#)MOzB^kg7Qt#e_iFO99~AokD)-5^h>Whi`Cpv7Pm&Wgb~Byf&_5m%7HX%d8H$8Q z5>^*Qw8HS`uK)Mkr^GRVgz~%+97G`ieJKh;aeafDaT=Ub9uP)738*=V_9ayEMO9)3 zx_Xrvp4iGQN{|2AZ)jnJ@Qtu3aoG!fh5yr4WbzaVNYhKnx`q|j*Ca>;z;yRY>!c9C zU8@HA14LFl{gWC%toAaGH3bv`U@TE!(^mxw6w9T4C=A z>tCQk`z_1Iwa)g#(`MF$UrI>;Vp}tuYoT^P#4~8A65ycvx6>Ow0-(WzPcV=-2zzHL z`{UuJV>u^i_ADVkb_7~s%l*Xn9j?R&!ksy3?K51rF%!Erg)`!R!8cmV*gbx=WZt>IC)n`qnRJPxwQW+e6B06l$@;07&v|E=9zak zA&^xj%u|w#xq?0S{P(Ck>ImqQVkmJOxWu>0XQB%y$KM{s1Y?1tx+eyjxUjpQ*0VyH zUDKhTIKNlO-asI%SM!eC(F>8SQE}bB$cv}%o7}2v+hICi|Ysg zzQgY}R`Rr>J`xw(bhZr$Cd&yx0+EyQK$jO+vp5fQ{$NV6?~f^-&c0|4A6i?mJeZ$} z=K}&X?Tp8|?zOsdG@{7-FfT0G{f8!3$>g%7LFR>q9^D~(091<^^9ps&&M*9E{oBfn zU4=AzI4S9N9so$FnieM7eWT)8E(LH9ieP$f zxlHEkiNol<;5})IawI@SmuL$2z*D@#9Ru#84RG%n7zNKC>Ey=ps0N)Yvsl<>(_ zq{HzZT}28_>D@dE?J~9i^S%8!Ov{t1wT6Cr3(;Um%N0~M9SE@*;baUFQ{+MZr?w7$TItlp$_oNm3}%huALdF;&m z)8pJ14&6#P%rCyOq6-?#ezt;DTP^SbvCa~*LeV)UlFes0X%|2;B#_b;PfQnbFM5Z% zKT`BqS%50H^;YHw00F!M<2?doP!Kv**ITwf!{ISH8bHVwlc@0V@A3+yNGa7IjGhB8 z!saSP_uP@;^5;F6`!*SR%ZfIUD{FF9H+wzF!0U4!(fq`%go4SsrwZRKNZwWAfJB+; zVlD>R$#gwz`~vea6oGuBk$n7(7Ikm1*?*F@>z!QC+kDMRt_Xf=GxgPVvwpn4;`*!JsqZ114Q$@Zo1He(KksigF4|Rw zjP*`$)NeMeCRc`jvHA4(<7V?#f90Lc-cSGjZoUEd7*v!k8!EoVMB6hWMf(1~;N1Oh zH&L&(1X@FCV?p{LjuAFhQFN z6oJu*E)ricOFrdy`IoaR5eOlMi9iP<*3i!c$dm6B;YzuMdX+0BsmxHh{9(C zHi=ml4+han=2S!$ZH-d84F%?xo#Z_>BNWy-J%;bVejnCCYPsi ztxgLvo9I@_13UN+D9Tb8VC%FP1U*{a+$x;5YZSoxHSyF4ez`O7r{hp6Y0^L=Ww3ta zNq%U=q%^uy>Ii2;g_6t@-X=MXhqlN3$kEr9-XYj0sA)06HaPO&0T)iRq-+9MF1byr z!fTN*lOo&&2=uW7(Rv1N2co*h1mDvj+=7sG8gBlam$NkDJP>Y?CddY%7)38@6FyaD z$X!jLFbW*MB@(j={d+hfoZHi04d=~{aHUBIcS5BVBZEXB1I!3ZO`#y*Hn>16352fE zmBWLgi%&+|NmG+4Ra?C0{4PEHeHT<1Lun*JK5|Iu;aeg>AX4wO z=Tcn!XI=0<1qMAJUKlQusS85y+9mjoqj(zv(=Qr<_Y6(S=bHbL0=?ob4d@M}*T;>w-IEY3Gy|;(J*{$S& z&v!*hnLj@hyBBE{e?(rt&f{v`Ej9A`HHGXbksDbN?VLY(u&SI3qNjsSL4)Hp&bj~_ z#E0S1ytTO+id|W&S%Nt<8ulespPsj_Bjm+MIPhEK+iJq%5>d+`W2H1lh}&z=4I!{& z-*jjA1=3;C*nP~0BUYdn>A`pTXrUgR6i6O_f~Rv8%v5gqt_cKI`ieY0P9BV-z!OGwC}PF0X^<6$=Q*xZh=Mv(ro$BwxiV0je?)czp|uP> zXD>KB$J4ohx2jZ+=N6Q!E_$?@75Z1?8Q0Y%hV?L2O!F`kRb@O?|4KYSxjj2iR3)b< z^w2YMxmTiHS4)OJ6I%ice`N@!(<8scFV&QMJ{$^=-3-ozzWjFzzLiCiafBr`g z3}YhlxsR;3+&Py7&lAKvGuvbJthmfQOpkGBp7=(re6#FX7Uh)@qdT=`0j zb3lmLxO*+-J&R5naeWaUfz;+GzaYkEe9{p*;BZBATV(d*i;kE$-j7^O63UdveMl6l z8^YjvkN%#29v)FtQdF@KQU=CXtSf`t)Ig_+N=}dE)cwa&c`xPfzgYcyhoBEuvrEd3 z#XGvydjBny5f^Ci$5}tCmN->Z+7>5DPm`Lc%yz8_*F*>Bd89;?_qe{|rZz@OuOI-= zrHNNKz4*y%&u{VMa;%=kHN5)NR-StM^$hVv{_SVEx836N%GpK11cy71#RcvIFK03Z z8v~(F-Q02->QmB?=^-9_^(tN_(y_`OFRbdH=!0D$wQb7}?6zy2RS>WA-2!c#_lwoR zyk4GP8d8sneWq;IHN~ zxpl|m`fy@}wNHZO>0KfEU_GUwE=$m{uMaQL^13}%2*i1jP9@>k@E?y(i3 zUD(v ziLrWDI{T9b6ld@^9H51hEIY^k-;E{aN)5x@lYGX*7n6e9!fkIuW9hc6>u!*OzXK`K z6-5#PF`TDW|J)P&C*4d-S~V_aE$a;{rr~%<0U&Q>Rgc^Atzo@y#31HyX8_?J18WBc zW^V@y2jNF)PY%xWxf_D}Rxw|}r*-Y`JtP5r4a^&hQK$)@5CiAy=kA+)hZ_K;38Qjo zyq7(|p#JwC9C$JqC?5)ZA2$PH6}i=w+PXtypAW(`hu*xekhFU(6@)LLpez~x(HObY zkYOxzvIaVgbnZ9~bAOBuo^m zoFIydprCUoJOiwE_Ts=dM$;lU^k^Dsc89>4e5@gux}9-5$j#y8*7XOz&YU#*QOSz0 zwye{kk1RWwMUDLyyzM6pd=HCv*GzS(8iJOTVRPYJJ~n-SSQCmXB=X{Zu}vD@?fw}0 z&Ngod7KEz8`Eq*upaDHKeKlWJrnU0k8LELl#XorVO;3k4-!mBeYx`-#Zbs7t|9pE! zXX4X=9T7mCZO~En^KS=tm4~Y6o_@tP9%UQvu;UECg$IMCwbjD*6U04pDk&x3B1pl{aWFL*sqA4n6gY+ zK2bK}-8-WD-RDz(;l%HTOt*>SYF}ZR-M{wqNExnLJX%HQf==YGl`3FE$k*3@Mc7T> zyPnlAeY|t4?#D~Svvf_+c;?$4;5dgdw4PD_+Q`yMga$68z0q2$@Ib^b0G`Um7{J&PL$U!1K?z6{FMNye_QX9q6=| za?9!NZPf!ySS$A*&Hm_l^4DYigYN8+<~PUxm8aZ5c}PVM#4kQvAVyH~k4a7a(%76u zJ!rE3X|xAQop=^q@_kSL*E{c`%yZ|>-Ym%;&6k&|KVuAPv0u(BGnozL37B=04Le8KD){tF`+G~cTC=F-1}JhNNhu}@=>BxxLr%&^?mhg&(_8F09nA! z5&Jm)%g=hOw_1;+ssgL`FWn2{6r^b8^zP$Mr#1$^7f0YX4|DKE_oaSANF@i2i@tp+ zZ^84}NNwxrf7ijr_o@AX=zn{MFX*)Yx17H%zA4h8@$zdv8z3nBKe&q8VmSW@Bf<~~ zixf#o*J@pd1nJcO=_*n)<1;^L;%dWn6-_6h(@FQWb;Fu*v~s9nxY7S`6)7Eg2%AH@ z|DUd+*A{Hc_rAk`os~b=RkSi5Yu9p|bs}@cwN~(T@zRIdmG%fOUoIo>-d}W2qaI?<)3EkP>L_a6HZ$S(`0+Wcsu`t5MeLx4;`DAnQZQm@HidL=q^uhIz{^RmqE4eijn0MVJyd*U z>))gN+F+n;?}u4`lr_^_;AwAyt$-mNhw)acFv3;Y={qMlAW=Wc)!rGt^~XNMY0tl8 z%~P>*oH#7+=anAZSy-Zq+N^hQ10lgGMynngs1TW}{2pJTUA-FM>|)B|A6Z(x6(yuH zNh?zdkK8))epFo*l5ORoY9i=Xa~mce;CJ(^5^%9(eQfZ)a+-wQLCI^5XFT%E#*K-Z z!nN3>+>I0TB63uI>1cHI1bai;Y}^9wn4qGRseP}exUL(>a=BK2_}$I4XTstdu4%QE z#d2OVZDHbwo=n^ee~}X1`{*soK;*70D#&``Sc$Kkr*MhB;5U9nM^nXnK4X3k5VX>- zmYj;~E?dL%{W8^FG}=;YnnSL~+fM53kB4TA3gviZXCI>4UPC=o9)DOU^yrNR5+l3U zI5l?SUXaSCgz1qCey64-E-0bc&OZ@a)k3*{U+b*x3&QnSb@eihzbrcorIxN&r}l44 zg_qH|Klv8aOctBYrQ9Zk1Z-XTb}!oX@9N;+e_tMv=vS7WT=!ix`#CUsJvYV`QEYP` zhuaK&Sz^pXStoxTu-+STy-V#{1!_nEev}d$cP-GKIJMEOC>58-KX9zH^mfvg{mqJf z{71&-b-qmA8Z;{G&Bd;q`TFEenV-z5WyuTJ?2Bu`gUBPDKa#F_DwCV#Mt=;-pr3zu zRjzcj);Rw6^+>-x|0*{5&pjaVMJ~sk3gALvF|^R~VGE>xCbL)& zGUYr}%_D(K+_X9{L@^PNJoLzW-f?{J4j z=9gk&q1_~9dhGV`=xakIt(XJX+rA(uQs+y^vfOHUt!N7pS17}8=ESQMO%@pPmOR)B zM(E$vNZRl7P&1MVT~dPI9-u|SPi|T2er*%h8jnz*>Vhk~Fo_^;bC~h=u%_p{fV^L% z;(a2p^3Z`th-+>T{m^yiSSy;3p0%G9!S}e@Oz=D<0#*lf*d6$}Cl1{TO#vtTK;rDm2cZ3kFb{idpF~ldfQn~dUDaHt z1XqWY>3Aa5>SSs&j4`V`dRGakR*Z`6i2!W>K9^Taqyl?m;hzB}#kKcRnB#+%mk4;l zYtD2HK#NQb0QN7`tSpT@0lFb{~^t@rBhbX~EMQykE-lZ)<>`DEE?Ak!s33p~vr&rU+A z7@2?G6aM`FF$pb&A)!F){JbCm_FCqn)uS4aeEq5<48ZK-qD=v?=c$9p(V&ur``pfF zvAKdElBv!K;HOH6J4Q?ecu2CWjj!QIAmF?@JaoWtD~l|1!7D2ch_M)4G!GuXmrFhf z1lriA0gQI?5iM5-8yp<8v;Q;Mo=L`A#Knm2DNKRMfTqQ$_67W$m(TDNzydN`WeKhviHx4ti((_Z>5yLn zFn~Cv3(5mvl@l;c*C5}9#$4}Jur8vR?fDY$3lE3%9T_qhYZqtc94!Z7Li7>^VUu4A z)a4F|8!MU)vpQMDPXrW->W%B0Q zL|~`d4M5uF&=nvgLGR>K1CUdlo(;|Q(6IRr9mC5DF5W1#=|j_)O;u4BGgMdI_{Fb_kAhtJwAM0r_pdM(1img&V5~khb4uXakQ{+A=n_2Rc zArXo&0DhB-Jh;VmBdPg~`@|o7WYWqn7H#f*2)U`6#x?Qz1JCaBD8=okef-=);jke9 zbpwAJkU_w$$o!myG^OR|YJeC3s1Ie}aebHwhor}XF^`!PA^hbdwtE0MF31KuF9s}9 ztrs$AAoS_EJAZOrGJ_%@H^2EI|FqMzyzygoW~7&1nKs(9(G_b)rEnnmpu0TnM*Cr- zPh!J@BHdk`zK2}COnN@kiv;}I9X zZ*d9*(f}Y9N7co}WZh}&gMU~wom%b=n?IHhAl;V_ zG(m6eB6St$QSxNRSPVesRhx-Ivscj$;A12}q!Qe;s`r}zD);+6CG9^Zq(``1n7y+| z?lXybc?|(^aXGJjC9qaeqCW!}pY;x^5%bXKGU<zLp{n{LV5)gCfaU|Z|p_TA7r}H#- z`E<%9l90(|<6dh`9X7gG{r_`bbXLGP1dRG$8G0FBBrZem5YicaC3QK7Ds$_9W#~Ov zaPD&A^y)8Y-AP->x!5Q=a435{Y-y6HKXC*T~rJ7QYq_5K# zeYlGiLb56}GMux=Fb z@v+R)Ft_$r%Rapk5bH2PH{r?ydDICQtm+^^unVeG!uSeMDTt&+^Mi`i*j}$~q9Dhi z;}BgKIF6!AKwV7tj+3E#9b^btlDZN)2y1Ce72WAFLmjBX+-cMUhN)C3@*q^9#Q^gF zfWuY~2}Vgtw8w44@*ZLSuDHFsOu^qCPiEtzM&`t9MbPjL**GITC|tG*g-}F6D`#3N zKPUhfMF%70OH4@W`ws7HwNP!)(I~$C--LHSzym+O=ue^mv>@s&w5Qj8;GkpqoofQd z_r-_MO^b(*{vFDj{xzxCrJqBFO0ntpK@E4{n6%SjRWFhuMH=mL_h1LlJanfFg0>(1 zdHk(=9%(Cv{D7M4K_?+iH6q~LjZxv=f-Ei@R4Zj4O^y+`e&c&6hjFw}(ln+A71z;LQZbES8|9WFZ53&uxCNi7ae088SQ= z&N&>|CjzJdSO|+(ghK5hL(W_Y&Za?Y<wu zAe8{9HG@Be4LbzF1Smp#4hM3@g@O#I0-I-t1ZM~XT(IT_fIT)#g?dFE?81N!Ff}p) zIgUR?h2Sapa}?5!15$(rRifwy69Eu?$DX5mXR-x9#;}J$AnzD_)$(8ph}aF}rC$d( z*v|Tz_%Ygk^qS~zvU}KQbgGLtW|Nrh0_LIjU}44S~N&!SG#^zNRs+awU!#1zp3DeE$jaw;$KJguAx+(!|9 zSPA}g5&WPCZo~z@l)=epfPJ7DxRwgs@`5UXG7L28Q2J#$>`W&ukc@T)(DYiqCyppx z0uUL<3!TAUS;NJ1NIWhiWC{24w1m2|s2|?^IA10*lerJVM)w>BC&(!0 zK;%0R;KET|0+G*5v4$duo8;s8L|EfN96uf&`hUDhGJ}W4tBLhy$b9fL=u^( zQYI|?DPAQI`I3eJ15^JjqD9y$TO`8|8$cu-Yd|Ki1AqmHO`!o3q^$C;dtDrK4DTQh zhLnTC@InLK@GZz=k^4{%e5JsRZ;?6 z)3V@grAPc5X?+wRBL2}^62R;N16FTD4D-YX-iB%-x}x(T^!zeF7ea;ffV>zDFmzSv zGYzK3gqsJZeK?!}4MGO9@QT1ucnf?%8*Fz_RyRS1jUd~daU`1dm(Bw+M;`B3xjYjE zuHJjN$&W|@9%(6iOO@h58fGz`H<1keUT3f&!pmj%8F8qhD%1;?sJWUNpshb2jGXMh zs&tECu%1i*blyaShE<>>&}VI7X^%J9{MS~ME&{0mV!%CC5QGK|`dEDRFJd(gk6Lw& zQ36AHo`zw)r9^>ibm&3799fNG90sB-icwC^it%!vX-> zW`R~=;%|O^c3ThB6f5UDP`*xsDU(W&xfodnyl@nJhJ`6opzwnXMLNX$CXPgg>d=uF zLEt4|%Owl+(4Yz|s5i-E40x%)p`xf)A&+ljP%K%b2|Bg}q8^3Qq(DUipSOLy+X?92 zBSREva0_}=G`sMk!wdEEWj6yMniq6`uL7Alh)Y*xW|kOxtRL|?;)7`bMgxkb2a9fl zjea0t11`|*cnbK6l)*2n@u)Oz$q`&w^;B&IVf=(0N)Bd_;oCrYs|Rkdc%G7QmzNdB z08|xQulh+ulA>Wz3qQepmS9RYRkmElAqa@s0b!(*CT`* zy0sfj92;u&DRs+M^*n-&6Ah4TJc?=3mDkwQ(AYQ8$fe)0#G8inn?~H4a1?0UZLc4J ze3KJR)7wpKj(GE|e)GIr^TO@sMYrZLTJy?8^OwNn58`ir>c9Er_NFclzm@l=o0PHxkhZ(@1ki`H#0@A6;*Yc7Z)_WV1-W)Ww2_JBdk~rqyi-`~ z(WmnL4&dLUaHEvoL>tQi8YCYOL_UPP+o`W;gmss*wgX_F0vdebeDV$$Qxi*WXW=ou z-nSZW=YW7u5qzWh_EOM%P4BemD09L)AqF;YTh@yM!h0kHeT#TS={!Z^Lv|XheRh`h z4iMuNhVd1YmP4P3A^6w+t6Eyh?p;e7-H_5(-r^FSmK-aiJRo?%Ij$w()MArlV=eGPQzMgDyDNHXF54f6HQ zMLyqoj6C~Y>8|LI10<4{R*@{k?T9q45~bB(f07a_48c+6M6;UE4a$d^E&S^#brTlq zqqNZVunGIFNf$1`mp(+B>5-@KJm6fMf<~azC8xTk;Hf2qw~{~*3r^=9&o97eX?zff zn}$O8%=;zZBxBz1ie69doZl7Yt~Q<%-yaV|ecK(s<^jnI3-le~GJz+zc15{3*Tq2g zT?L_9Zn9{Q_v%L}6-E_X}IpS8{0)+P2&2vHNALd5N z7p@ob_P=vZT1n;;7han+44jF$7O@OzouACO;PJz8{XLFC@~ z=ESXte^+o!=Hp|q7ypTxkl$6yED(Sn`U*n7H2Qz53%P2bCyacEp3t9DE56#uAaGSp zcvi~(n-c*C&tGvOz`^MsTq-DmJoTsf-N8$1FfW)&%6INImT+0c@gdTWzN#!dD|hi{ zdh=qP(V7tFw2G70C%Y7%ipe!?j_4*0GC=>SYPl>Qu2RN3lC3Tj#rkP})G~;MG*+13 z|KlfjyQNj(^S5H%X&-m$F=Jr4EDe0o=ZJ;?-*r=e9Z6MjoPswrul-cVkl)SeJX*WF z&-;+nS8+2-1`}$i@Qd=}rvd@B_mYpQ@n+B-fLpPczWCe83x45;rc=b)7N5`GN095` zn@$mE-qRbf!NIUMzw!ylFZMo5&2v&_md7f2qousz_Va_I-VEPL$$?Y!*0bhJ$Hlm2=>NuI`|qk!Mp z2Lfx)p;f?t_aYf69(~**nL+Yw`!9yxl}yD-N(DDpdu0A6(7VO(`1F%#QD?3fiI+2_ z9cOjK?$Mqg;T^fcFI+Fu?dhF!j2=>5YIK9X7H zT#m!iahm0+^;0EIrI$8t=~~INp7ie-z4kbNiFF&+X8qQ6!=WpRQ`R?)7Rthf*M+S| zt3Gl3@rhV)C6QXO^^=9%4m$I1mEqz#`20q+|8wZXa)igeZ+jj|j~qSFwlDf)N%yUd zqXiw(lSa}b6w!@t5&W%Kg&idR^!4I58>(+@$sGE}cjRUIkpNAIbOVfcR zRCWwt(po=|<{sm*sWt;|5gr1Gs`!GC3KfB%DC~oIy-a**Q#Ivl`)6&zp0!J=&o?ZGRt#7E zVYQzpDgb9Vx$;B9$24%&PPgENiJ%@T__>tuiNUKc2V_`xIo7)de_lFN((BiaGz-ei z?G8&ul~pPi{DfE9taH~vI-B)R;X=l{JX*p5YfjHp9Ut;2E0qckSvHSGz28?t@hTY9 zD^MO9b3cEzpEhyeTJj@Yy6AxuCDFInH3B6ZDo&Lbi$6PF@|V^6v6gT6>~p_@vR2Tm z>3N@yXXlhnnLjH`unhff_u4*Bd%DPUYUG7zkEmIi!>3C3x9O)0r86QNB7T2N%)>5r zi#S9T?*@1k(vPe=m5^SuyxH@-`Q1;hR!>J!e^Hr+POi zcV)Bby7zwF9sVBqH)7-&`bJRn*r;k_lJlCrPvNtI7Vs>*xKKtt%FmdTw?rzB2V~yQn3MCEGk337Kp*8e%epKQV$p3gX*aa3_>Iro1t729 z_ZlutPH#=tI7Y@h_wgF9w#eNW8J2`7nhT5$)`W=p@;~yvZ}>wL(58FkKNavZyeA!l zSfSvVepaU45S;A_gts@)?w7j{>=?<}ZA`X6VNe%ugelOSQ7#!sc{9RfAjKTjR}$R5*9teg1Ym+MW)KgniwK-ER)T7$%uuxsq+7 zY8={;2$Qtf!yg969xJ{ z4a@s^hn_a|yhuJ`;Da_09p{M3Io-ZC$#D{Qqw#8vRw7N_B8E?$2==Tc+0mlU5H7sJ zHmW=v6`b{hvCRf&Ye-8r1tz|W79x)eYO2-HUPlkM_SGE#w$TyUm-J7yjmO3#tLXkJ z`tCcg6<%uKm@AL!+9MUyU(eW_I3Hw{Hfh2jl{ZyvaB*<|l23;9KfidhR2-Nx-P9^> z|1Mhk)N@WKnmQHLceP2Jsyeh;l=EKoj>j-*rM{#7-$jY@Grh){Q?z=vMc_=|?UN0* z-`^li&O|R~ySb*O`#S`BY&!o#!zQdrltkQogXP zf4A44e?_g^*=}3OiTFpGFRhcpZBR!PB+leduTp$-8ADu%*`c;oEqDnV!d1M}8D#!e8_F%=@=>o^h=hl1wUhrvNcY7Sa5V>MG^bm<# zTg-d8Cv{Q7&Vf|sA$jIonTXbb#R^d#r<14N)sw!OXmqF=D2++H9utkk@=yo?xrgRP zGK;;eQj_JPSdUNk89ljZEeX`vZJWFkvya|ZRQDG5b(sE_WzvdxcRYiq?~Zz$8Z-71 z`AlAWaMIN#oD9O8mG=?RGVQf{dzs@NetX~Y#;Z20O#FHZ(ayXh6;tzYbw|$4YqQoP zFia9qa^5j;=w5$0cjU_@>4pfCjhiuiK5(0DmlFhC?R37brOaoI<)VydcRK~|T|Ue> ztYe&Zp^kY~S*oM_uewzv_0D7M&dH8heMTz`Olns%)HByge_&#Cc_XgUUFKE2r|;|W zr*E7VKFQx0PrORJdsNH^#Q%NcUAQsZ`1bq4zc%vc(9OtlS$GZW_KlT)>40w`w3oj9 z(L)w1OsaX8%m1V&oF6Ty@JQ#Cz1m}p`SteRAtL2fXkW^W$j}?PR@cAt`HsN;vYsyQ zHSxRk^mMb{g2Y*s=u1sm>E`+$csQ0XF7NrFc{TjcxhAd<^n?8*jGbyyb!W?Ozm<39 zjnJ*+dTW=RKkK~5!-B;P|LD(VMAf_ri*hmRAHHiVR4#QQsyuRet~1jm{KxeVVVu8} zm2x`;9(QuK^>>%Yn*8-6P7E8@gHpMVbxQ(~+dL|n-EW|_HGj8@zsrgM1_EPbgs`F^ zIyn0WgZy<)_4@v@{8f~AmjRz`7Q~0ldB(&`%TJSA41Dl(b>8U3m_szbYlgBc@4>jYUTumbrnritlxb+HoE;6K zCPD0k@CzDH9oW#vA3E-qQpqnZOVH4{3?8d);N!3{bSw6HR|ntZLHA>wf1{qgU>J%r zqltZ}$eq|DbTf`7{61vljiKscWLcX*G&x}>mb7?qU@;%ZH2l^OA5m7&tl8aUg}i5N znwHe9)R6sc$tvh-Y!f+#pK0=x(F8xz8edH?tLwU{iFVYDAXRrf)J8wMVpT$f&*WLV zX+mQH5)`|srsgdVkC_Q?S-jecM^twc1-pxY*yoK2OMa2BmrZ1pdlL(!g($5fqh_df6*$+KA|_M?k$#ODcr=uO|kfTk zbX$wn*M&r=4E@7IN|vys5JLbMgY|=VnmttThNx)_A}j`R;2XtVOj#mKy~c^NV4dJQ z4iRT{vLHO+tI=4+Zk;p3MJxo}$!W?qA&ktuN7ta=IlLqqM}`6a(E%VtX%HFt5evJ7 z+vsTQA`E)$X;?|L02->8JYrxGtI z8{a1p8(W?sv}qCGYAM2nN+QE-$&DA^$6X3TUDt@wycq$yP@!Dxo(5EZD>^^}bIl^} zI4<$J3+~S9$vattQN;1j7h<QFpM#+heGwzTWY_*VE_b#zjZSw7Vmyx208cDY<-l-16M5mBF zvu3haZHjfqqp<2!e{$vUR_wcrZo~3!%UlJxkLHQBT4G131qU(|Cp`N+rJiRRsppTj1nj(gPdx_8A)w>+O7Z}J>^?!n3$ z8U8l?es{Vi+4Bdl=U27U>pF?dyy>N>+P{(y$J((wVII5hb^d)jy%C+1!ukMJpdf@L zzFlO)Ein*Jn~C-*q$dSwIh(hc{kMn0n<7!^F~VcvL5TS@Bs9qm zbE`?7S?Qk^p7JC}&PYyB5}RCC+TBO4dHwqA)_KP3*OX_r#jG^ad!)~+_B=Z=jPhM* zs{P6A%g-J^`acQ}O#PUeU7PagJ3g&&_r7Gs_?`+kYmce)!QVWgc*m>7&V%hSTM{+_Zp>fw}D( z&j8`iF9Of*U0B%ty>OB5%VO!r9JO;t^%E~=GlHl22P{4$#eBI{d~V>{mm3vdQnS8< zE_}JO;F5y=e`(_$^T1R%x>eQ)~*_ds^i6`YnEf?EEZcTLkUx4V6 z!9w&6M9v8fC&1W>w}%JxpL-$?|8Ib36&F<$06^X9To3&hAUfjE>S<$35>i3YS%e1> z$pu9Fh}ZlVAiB>*IuCe=^={0(=>|xMYr=Da6v%>52m>^-@@G<&;-MpGa=`?d3xoaz zn)_h@XdUv=HWmibMIkrYvg4IJ0FrA+eVtbL9U*vXk!5|Qc3`n%{N?{Behqe})wppw z${qXnMb?p3?CS2nBi}KCj)*EEnHk{$?*S{V|3QjIN2h`i4O5!4N?ozIi9P{-1VEL{ zO+^cy@SBMl7mBg~B5}u@4nY)&%>9tQ!lTO3aMHkqR5;_2$s1jM=6|C^8~uk8jnxFH zhha6ucJkUq)A4;kjs}Qk6#9x3O|OKtF@=mXB}Liw<7$UzHCg(QqC?;bP8w&{MiS;gMIq95UUVal@yewjVR1o; zTGjb%}d=`Q?~R*Y0#Wx~(FJ^v5#-uxZv|Nr}b&1#0h%QB38?7L9O z-q@F@AxhQ}g{VjxyBYhMA^SS^H6h7bW68dZR!K#vkcxLIg`D&Le81OuT-R}(znnjR z{{Y7^hrYXtu`id!q&njWCRM@S_f#jUZ+{(zqTe&iaP(>U{SoJGKx=Z2&>=n!=JGyu z3z~63&PdOtZd>P z5C+ef<=5nb;|Z6c6__&kdDU12F94Igp#RTiE}(8ClyFTl156)bej#^qMibNS7mye1+$Mdp$P(VuaKd$KdH^v9m*N?^4!y+(xQjkOw zP+{vc{<}5+al%qe361z1$yg&(91wobGl7Ju!U;+x2}#=6s>i>@d^&qPQicQ+1dpYj zISmS_#$OqwFo2U?pyLuPhIPXFR)*q_N%kiY!6O1ypF4q zJ0>*p6qL#?kB~fb9(P>$`M2!+6`b*(Ai(mHsZie~9^?8kb!_2BGqmz~z!U&1z>m%s zOvaA1Y*)q%1Hkg{QT?u`cY$9#|R*-x$SBnoGIC|^c)kF={%(>kQ$Q*u*L zr@46NonzZoxx?d?_bxqi7^_dRC^ZAbvr@w&PZib$!evM7Y0>;J{`BN{Wz6{V{~3bl z|6e@SZX_x1elzF!$V!lgH`l-3_d)YjmB0;FRFr)#`BdclgOMM}!6motPy+mTsEYa^ zuA1Z{g-XPR~S@o#yWFlt(G3AEqnfSju@th}#=$PiN z$NL0RL^?jzKKN)6L>*b45fq^I#)KQ|8{ejfxa>5~KrIo1>Pp*SBHCWB7C)YsRU)CT z-`aUPLZk9DZ-KtwSR;OBLW=SiZc7I|%e=}f*whw>_pKUcashHm6g2tR%G1g*0$%j1 zr?3AIQja!bx^X)RqwO_}K4yx_&f-x+F1@oo=sKEgTb9mi)3+j*Z;Cqd;Mxf!LxQY5 zFmUwzKT*DtD5XzrI*E3Z%bJ5+actky4LYh zJBSnR(aI`{s=z;+=j}~+d*{B+G4DI!#c^@-mfgLqmH&5iapW&fZbQ%Hli|!)CE{AE zCJygflEmPyg9dM@;_Q6C&OLem9r-5mfUk>$YhzpHnt#|U9t->(JDH4Hs5o^hXp zJ$?zbn#F&c;dm!Kva*ebB`=ZWd@xud=K+~q&VZ(jlH^`+$+L{mp4V6aHolI;9SSW{ zr;>f(aRdr^6tOZ&ji;i1BvHwA2PP0Sq;>i`M6?1cp{Ay^a-6YiVGsM z*)LHZe7Z3oM1ID)do!nE370b<6j?@yZYbHF5^WYrP9{Yy`vm`Oh3OQCk>%OtnH0pu zYxQ8_LQtH9B`dOw)>;Zk%L=q5B%JfL+75&gLlfiesDd~WnT_kj80$wk5fpT=HW&`Z zQ$opcEUZuV2s)@k_%X$T>d^Acr%2q$z>!MeLf9BXWR0T3=(8>rKNtopvEF`w{huOFSuE) z%5{{-1`ddxkK7y+_(Hq7CmSh?PizS#7qr42g_3<~$RC!mtbwlPQsVZ#Fs)W9?izVF z5c*^%Q|l}>ge=Kxm7H&hW9gPT#%WMVv=P%I=q%!upd8tP zVkH+OkNBpYOU_3sE6B;^Bg>LJ4CG-&#B6upU={&4?7kV#g3F8yEx%xvFEYd`4_1Lb z1Y~*qldNi$7f(g{5(=P~T8VacU$HH8IF?UbZwgP|#0Q;Oh&hWyHFWZD5K=h<)csG>T06p_^6 z{z)4N3np)qsL#67%Zcg*JNYY!2reLQ%rDfJQo8UXK?Ps5zg9py=YAZA1d2-E2tgKK zmO_J4ITkYXgmO2maI2fKKmD#b2hvx6Wanxh9h^t4VaZfFLdqJ)GJ?bZREQ~{9fx9M znU(KC$iG;%8*7{%CAH5A*D0U-4V`07b|=fD&A}?EZWy1ETV_GHgV!|{G(IumT70b3 zQWxAMLUkJ4_lSiMW(~mG`0Ah6a>1)Gmh6ZtG!QOCW#$oP~_ zRk0OrmvZaLL_&*(PUs4$Z3dJm4q0E>%A>i(+RtzoSsIYmGCaMIIArQ%QBxnrJaQ zfxD2}2K9{KPcshkf&B<`lS@LsUBCNty#vaF6l}T|P=Vg?aXamD&n&G*meOu{0++&G z;^m!X-Fw&kM3sGSs4cA(MnyR?+9RxR;UMzb36|F*swk)9tW_s@6e@JC>%p(~rwR2F zJytJMEB#rX0eaf=j_fZZ)n`^~uclRm`Q5X(tbE~pjTP04eC0e*-&N?6*CNyf%_`nO zcfurLO$^qi|8|Xk@WN($!)NEGpUMKBiU;HMJJ5_I0i0 z&*_2B=*5}E)yfG)9>uQ54|dAul)Lt=`(bTWmqN(I&#r+HUA=nXB5Qir>#C9uu~Y6Q zCq0<{knyY0e*AaOhJQnVS<$&B*C0W7``W|!tl}%Z594{t_g?nbehP9ZO2P&{+<8?p zD8gW=2386mkOkQQl?F-I2fXRcJoL<^2(lKb7_SdL2ks!#8~@Q^B-Y&-3nBBKxIfQN zHdn9KvB8~>a3&{l3GDQ0sdT-K7-aQ%t%Zk;iy8h{aw3tziac_pIUD?{KdS;_lLri@ z%yyUZw*6Tqs6Nw;av2+3cabyM;`-fPmuc(FD^tBZ;GO;pRap9<)n2r})gUaWXF&JC z7wx-rYn;=hbL+vcq>+TX_$Fr$-=ZPe)@}Cjv|q!I5Z&KjjY0xjz6iUn`#)^d3(*9I zZ`t5{^e3V@x&{-P$dqA4;W44saYzK2B_3|=t5^sd?N%`lpBi-*9W-JL^&D+rM38Ms zW7h(LO)xG7g76crQ<6JlRq3@_%*hUA(1=krlOA)Q!?kE}Iv}g2v1n9^V`N}Tpmix` za!Q~>lOIqkpwI}7()Rs+VJiXQu?OFVC7 z&)vLliw|Q3%!5d%GCId|61TH$1#}rxY4ez%_{h}lZuXv6OW$+jfJd7u;CSES?t#S+ z!^S0Cg?T}&mkWHNWzG;&1%pVljiR&P16~uxrOCCfvCBmGiY{)9WT|-njDH4Cf(~*z$7e$mZ@W+s!e|gQv~ECr0}wjLpYO48WQF zx9qO%+#=r9&Je-Um%7%kx@=#+aSPiEAA?a@@|yRgl&QN#%luc~LxZ?^-A6Yg-bkLr z<&v7}rbf_)kJgi(?3X^wjhvAAyXerbrX9B8c;%hi*E#6dmFJNw0gHXoYT$IqNPO0m zGgk)N{3A$U)yn=L)bpt>S1f14N`~uT$d#LayFVHGrdBR}lI(qq+3&kL?WKDV*`ch` zf%hA_sQMAMd=I;k=A$}b*Y^>^?7XE0?$V#yhyotzYu{W)Min09%@o;|c{QCVtrqXa zMfV4|FKhoCk>7M({Su{UGKAH01r)8!=E-8-52=IeVXm3?@;JGN==sTvsG^cg~ePi*u}8@@c2 zlvOYj?ixKtdGH0T4X(6&V@qsmc(BHPe_6xj*|#@d&B6m+A}jn;Uw%eCUCWs8?d#Vf zv$5@W+su4bA#mh=USFNQ&Dt^axG(+v`vqo)a0~5Zm1bp+C+dG~qeen!4rZEDCbyJM z;w(^2{v4}H5`aw1_v!8@$r1129&LVa-h<+w!QPf~%-lT39o0LD@kUQv^==xt+!x~B zhE}{KmAXZBwTGlV!nWqV69=?JI=)#A4f%-b%jf!4fC4aYz`qo+Y&?CC$ zqWc;uhMbAM?R#m-{5YuE{5kaZ7XQN^!_GSp5(lI4$A;?m?!rLm$?txDm+WpnQYgG#!5+G%i?9dv+$2zOI)4uFMx-zM2P)=AAZH- zf|ie`!ZMCz7uZz|r$S{BFLD3IQ~yg8Ao(Z;R!nmE&*2xh9&!o$&fT_51@TkQGwt8Q zuMBa6uqRH)aLZD|1YKqwL7G;X*ViyU;@IL=B}`11^&f74RO9|RcIJz7*0B&)lH>VB zix^GQ@khmHtFh{8(Q9U*htDP6pm0j4iI_fKjz4BFZaK*kL<3h_IfDnTTze^(s1PIm zxpP>T390?+MQz-^)ScHh-QCe$!zi&mIQLe|`G$pbbosfNmJZmjz!v{jPnQ*oYv-GW zOP};vDaT)adG}i`^M`AMUDSxjX=g({pqX#Cv;0)}T`T;=1rZ@536I(bI{9t|Uarp* z<$mv*oJ7<@uX~Fmmw~ZchX%441@Gfd4~kgw3;eNbHBO4=SSnS2hdR|qsBTp^P1!WU z^K!(dU|Jjgw4E>&gz;q-qdLY<_1#di{Aea7sEMa6fxT!x5&OlhNA2%Wah81(J#lGL z3l^rFL-Weu41zxWQ#bYLC{{p1XF&2SGksRyRmblriVF zpF9@(wO41~y;#(8+U~>9_0H&k`jw}}_?MTS34WK%Ek5L!uzo~9zs+&jhK*e=4kBMV zeF7dAlJyk8K&(`M#V+N({H}?;nyx`BRn3sOjh%ZL<-K&M<7VFxq$@|=C3%>8^%sRg zc81-tVFR|uvhjmGO8%H5jknMC7Av(4=tr-y58kDisHCMG(Z`+=^b$N1s1$R<_iJN2 zK1)(9Rk?)St);f|Q~W8z7VS4-76PY4MC~p*={s{qH>w=zpy&)pFK^_kN&guObL%N$ z-2L=Y#!$=mj9w25d-<2$^QtlWiaIF4bX-sMzE$`0R4bvPZ2E&}_w(O!4%YL>?iXK? z>wVacd`bOSsiGwXQeMfmG^+=manW}&wiN#MU4;v}`he|{DY6@p$vu=kDSJujvL+>A ztH$U3h}*rC{m1{b`*74kg_DZb#YK=?eLuZ}80N?*?%QeELA*<1ZHzji7{%TJSN`?r?2=la&wFvyMvV5f<_QUa(V zo8Qd2=VdpjeDDVK>1s-?D!0@(58xXEq|I9Baib7*cOl>m%JBt{odXFgSHh`nsC^uJ z!&fTz2c zoUwrqjyWIVlqFMPS#7*g5&_ zWD|s@Ru+369wV-N;Xp|$13ym+C~r>IViKurBfQC~Xe37wozs24R(70ejLW=p!xDc9qix}bpQLiis2;3N z+je`3L~rEOg`@xPfECMZ9ow1y-)8IA|Bu=F3-;Bs%S+?b*Eb}e$Zys#{Cacdn*HvQ zW^WSW*u|_nSis8imXezi&kErLM2%|?LJ~e*2hG$mMs8J`1w)(x90!o76z6{Mp{k11 zOc9@WY_BXuQbC^ZbGeOAlgxf0>l7yx(Nq>Z=()yIME9J3Gyl5I9vG}fVc7- z{jZ{F&yV^XX^Ft*!n;1PkN!zMFcG4c3js9N)}WpJ_^& zfg0Q*Kwr_$@)@0{w!7bWaddSl4m7uPbN;+%41xT|acyVtJ#irT?rLnQ@EbLJ zN;zKt8s`oCv@`u8$L?XFt|MA&^FR?}<{!WmfhR!=R?A7yy(<7(?2>V9N$S zYf%Cx7)d?agN_1X^>ObldWWseTN?|$&t|}C-hJ(DQ}Lze@n2ta;5mCqNk9y02L<>l z|GsAjG*H86K&QDV+25V>NM?|zrcy%-|Ji`8M+74|p$iA|io`MqVC=4gf)ioKk7_^| ziqPp`2y_&5U;`r6t(g~7LVw&eish8MIvIgB{%qj`;E_f$FlK@o1!zsUGzu_{&cyXg zU-E};J_!W!fWV=yd*@Yt&U-YG(gbF|%ap5&S;5$J(;vo0D zQ3_nGOPW_AW%KPnf2%$~=m^p&{~G6bHo&LeJR<`7!=w(USE@-V(R+_0+|8mG1ifUL zt#ylhf}3xY$ygSd0{xp$kBVo*7%2aIJ(Hsgi?TEIm5$-@NbaqGxG>l^pK{XKuX&TVZW+`7jU(C~T@A|`+> zB>>zgIU;NpzlJF%;J-q^RIIlEgd{$|j18ej(|9INQDg5E4b7lwaPwwA}zlk@H z#$0H$fGW*RBq+35-nEnj&zWXwxZ(}6i#0UlGNhQJJe@M+`r8UVbe~cb^?I0 zlai7ZKtQ|*W(VkaYKl#jf`#Hl*%AOCu8n_wrwxkttRz7KUjpwOY0Mw+%uAa#k`Ox8 zmtRfkkv1HwdX!rdPDqAoV86nzWx(-(p~03Q``@v81%Tkqw~JQ1KW_W;cCD`t7%#1B zq$2v!D(QBKmo0tpcpB|IfTEcw-OOS)9;U>t@3I|5(hgM2wV{UL`c^9IQt@iIZF(B7 zI{^I5lA%fR(m^=8eM06f{VJ>L^N-}@QmZUws34tg$`5A%9@RCXtPCvm%=f`7J=--{ zJw-ki#L^83i2l@3u8U}Yc&q+=B^3hE`7T7UBvDjo?5h@9lHdSp7#q3!!YUHPL35U! z-3JiCBbpQ~-!Ia6I0ETBG5uMt}(t2M>~uEU8{i>Vu1# zw^ENd?`210Dxuk%7S&^X=@^H>M<=b!QQ$yU{tk>s=m0g6x~7^S#sXIMtpB?-Th15b zs-P0Tl24o3LAeV~jF;nhQkY7*j}B)#MJFQN0u-C#eYMEqJg?~T1K(RR8k2x`#mwxMx{ zGQk>NUG^sMX9i6uX>R_*4SUV{+LmgoZx?$pX=f{rm}(0S#5zRGEB>vI<<~SRJc5Jd zh#{k}9h<+ZNU|7PUxUOp-XyWb_e%CJN4fqih1M+&An%VFgney`8@q~A&Q>rQl0AgI z;!VOf)TPViWESKHO2aE@`|)kiG>mrDpPX}h2fs28Vf`E^ua_h&)s@u$a@;T7NFA`o z#}cCd*%(4vox+?E_JlQ`omcG158J#Ip-H=Z*Fq=?gfGZPLRmvOM#O=IPzAgs& zIH=6WGbbqcd8_hD1!t@vb^R=4p_PJB07E`T+Xr#0kSG~cY%T+8D(^`kL)CU-k+G~G zGZmT5dV`8hqGIhqwj-88&LEQDi*tgYHEHo^b0L;abag3S9>pa@yup=-EenKh6B4Q| z#Q&0DM+7|yXQ7_Q#GJO!@-!;uBmXKG%Xc1sY&4NG5gWc4_l$~VEehRtJe;y(!z_hd z1KGTN@z02mXMtiqqtPM0_?`nA z{5fAd%eFmGm#iELP4-DaYNED}r6LD8vBVVQnM5DUG*&oNwl%fe7ry{PzP!NaP?3Jj z#GD|uDmF>uf)qp|wg4xY!&=WVFS45peN4)jQNSiS#SUnLmGso7tNcOg$d{Hv_CN;r z`J`z}5)caQozH-=49-j{s`I*#dK@qGx+En5(iwAiK65fTo-Gl}VoR4|BlUnxdn0bW z0=XP2*NadZvYlOiDW>^Wgo=9R-wR2Ot#VFT$e^W^ABb=*=JhKV@MR1rb|=Li!j-O& zJ&1$k9V0zHkcV}~VzmO}_C9dc)ZI|_!#jg0IYkeGUyMA!ao<>|gO+uG$YDt)bGmNX zXJK{~NC&hW=o||6QV!KX+rO8Kv`0ky|DvDLQaehShQLA^uS8U z2#@}mfc0V|UF5r^g)W8;aEa+?ojeB>7Vt zC2TpqOx{XJOC7ypqLnjODcI0)HO1j6 z1*z^6g^fsi^l*dw$+@DC(I(hdPPC%C&^mBBvFzJe`& zq6t}f+d$V1RT%v26254&Y3veyhW+-i68KZ0;eAab7HF#IVFil|zpa;lywrdkL~QuF z-(joQ^iF!U(3lZ+`@M6a5dO}uf3aA-&-EJ7-QI_?Xn5yM-MyhxvO);h1+)Wh#${qed* z$;!&$7Z8#u+;MNUUE8Ht>GM4#FWdNhNB$Ya+e;eZT?LCj!uS8Q-kUF5&J|NpZ?0b9 zU(CBdm|MlQ)MBRx?uEBJnt-Y~Rx)4QN5-PgO?ILt8|P)?yC-Zb6bsBEs;!iIPTJLw zSgpXZ;%jN0GM4v{P!8!=wju?&+WvU*QfX&IIuPMT-?e`{cE4Q@+}&*UuPH>k^sLPF zsMqwBop8%pM&J0;2UALA?B09sk55SHM)JZD2MfJRe)p!$Sat>I>0aBSu)@^OE{#2X z0T(*P{N0ZBz`ium7dhG=yM(U`J)A5+{)%vM@`S%D>O-C{Oe^YNG2%|%anAAN>^wb1c2|YNf53(*Jh`p`^a^_vf46db~@uLHC z%6%(BJxtk>Dn%DDmUWJYP1efgWLEx}$VWMnu)7OGFepJ(WY{TW1D+JcSj*iF0SIS%f%x@xy4(lE`(9& zN58QZ2)f#TB!2wSs98kq*!bD7#t*$CmoX#t^@C%w53jqrjLFAAHXh!yYHJJ_if(p2 zY1H4BfOV!Lh>>H0m`P;&7{jK_I$)AJ42lSF%`xK6Epd5aIVPzdA6SfF*;29|Q2?XD0_9-AZb7(fd@nvN5E(=%QtZ{$V|RxOuj@yQ5CDQh#dN zz5;EKKa-;|j5GklDK~$WRXVBGeDn)_fCISdM_~aabP^}}QsX4FVt`$BF7)#7 zQaJB62~)0)^1>sER1vOt&cn{#Fs05@Vn8{O*=r_rtYpaI=L5^>rz6F)b*k9FDR1ep z(L)B{=S3z|5>XrAZLW9g7fTO)?6GJ7UbT0c@R6UY&wRT(b=pRVO0PVTNRwEfg-K4e zO^?chm}s})*9U#$#`_B=Ij8$AyPp`0G)yhRj7B7;`}^IzA9BuSs)BDe7B-w8b=bD7 zh`fYB9`x&jbFW`3ejLkaetRGWSpF$$+JAj}`mG!LVzoZlM0#VLI6?1wa{)7x^81ac zz}sy7#g(YHWBXo@@4qeFm=ab4(^QtMUo0v|zOL;bTXk_sb$nFsO}ZEmIQ7o$ z*!{JrWoX-s;Y`KK9DKEJX_|fcnvJ-m?P9>IzMZHyD{YH78zH#sVz%uEm=T@VhG}-P z7#j3o?bR|H=HV^XH&-yv?7zHvpgg25_Ay-tJQw{2menbu`*ONz`f|dfqi=G*?R@z9 zOtjO<<1Yy1)W04P=HoT^1j-L25e$(5bZqCr-uG1;(A9aqg$cNUw^A&&DFm) zDTCRq19zjpCC+@kz0lk$*4{R?Ds|?Su*9n#jybEQP0Y8CEDwix(e6|0AvqE}r~e{%J^-@-15#G)euQu90=gf3=MH(MK6nOxcTJcs z6|8CpSl*!GhAO{Z4$DF=MSJ*DIOkhYo>F^|R&Kp-bm&$x=bP2)2c0`L+@mqOrR`<; z2Q3ulA<&$$++8^nde!5XI$Pa0D5+xi!vHiz%_C=v-D!5eb$9hQ0(q4HwW_(la%ubj z1gz}d9Z!Y6MKs9Ry&p;8KR`bnN_hWYz)F$lE!C2PxphK_uhN40*E>1;KSfg!W%l@x zL61|Fuoxu$?7%s@THDfpHtNh~pOjjdwb6?lKR=H6PKCZB5)OR?*ZP%HM<$-e7)Ksz?z#E@1gnZYAEE=V(QV(6!~5 zaZTnESK0=bO}I(9dBoFOoKNcd-*E6WAHB42{y^uzKeqno9DVoF!Ho4>DI;3t%yg|y zXBN-W^!+zn0?>}n<$nX>L&{25kCP=}q;{j;tBItAX~F*eQ|#y0VaMAD(e8#;U*GJG z7l;%Elq+q0I{2hezFpD)i0wx&Bq2%w@4)J>$exK~(>IMR6c2=lX_63wKgnr&T%z^a zVro;Zrg1&r)hJ?`6Y0&`gX$V1NmuwRS=7pJt1iNtZe}jQV;qEcx9*Z3rFL~^4NKTA zGMfZ%>8)$Z=15~(Vc9+v?=~3MR59v$l^DZ z(e;wUw(T7|n=@671xmB}lY1vl-o6R-Ij}Km&}TmxxF@PmfLV0DK2s%(meOeNT55kR zJ8lgd8R%<2$$LuGjELNT>RH=cpZYP^bVGB=Oubzxt3tx*hmBpn)w!Am2@$77NAq@> zaqK+x;_Z7*=KYVQZuXDG%IN!e-M+$RS!~ugGs4&f5A<-{4TQJLCLTYLZVN)f@MU8X4uN za_488=c`l^L-w2gDq20_d7s+8^-+|8{n`Dt3^MBaciJiS z)*HYDRikf|{vNNS;i!XBxhuw?d)*mjg7EK^ey`xo<QuJ{`lJ~wQB5L}5i zY$uKbqnj~*9z@SP?8CRa$jYSsAEz$(a4f}WB@nVD z6;MGZ@PDC8nM&IhatRz1aVN$@RN{#P3$23J2%hQ$Im`Mu-s(}VE|T#r+6OL`r4ck1 z)yX%1NLHlD7+f{d6Ix)uW>i18r5!tMn;2O2r5L)o$lOusEwp>1iE z=B{J04YpaSP@^QyLAvrE=8Cv|a;4x}b(QGXz~pB}ahUKr^WS6E2`U?w*gFcQy5UT{ z-KAL0#$~=%Ay2m8jVcL*aVGus;2D}prLQsK9o>)|9xp}OD7;U%JbK0xrRYGyJZ`PeeAD(gH`|NXk;SgqK`5I8A%W^-ZtXSvIQL=| z=-6t6yx0T8->d*%G8^(01~ZkMtJ3x;R`w=>wd$%N(T{;zhcCR~|4pRz|0LZurb$`l z@$UrXw`VEY_I!SJ;x!}tKzIHB6KS1`eJH9i*@dQ*q|2qe3m!&ann@}xV~O>C7?p-= zS8=7^i&ds@WDZ`t)}E^j*Z(#Dej!*Uf8)aGO0}2;% zo=ImrR(%7SyY|!(6oCtyL>-V~^|19UqE-q|v6j*X0dUaIn2>%rwDxI8>~}W~Kye2( z0U?d_W!J?kctpb(6o275)pA3CpfLL1+bgfJ?5nj0XG+5E?rdR}H>4C)AQT4;+x5ee z5lbC#R14?zyUO0F==~ z_y^x-bszzE=Z-w=8_HBkGCj`%MK*kB$@by=CmNZkYbo05iAQPL_gNLyo#>yKFtfX18+gFONma%Ygtgww*EYafdPM-+LY z;(jF6vZULdVnMF|E#02y-&^Xi<&Ko4jb%ZPYCG|#Tbr^030Xpf(+1uhXSquD-;ZR& zGyuX8_m8Jv*lVESa_}Ec!VJAir32|t%`EA*Ke>yvmZ;R%^8M85(2v#fsAKW}a7e(_ z8Eo+M9Vj~raAHZf?_H4OI9yDKKv%tphf+{|jn~r6N2||&?M8;gEfDq#QtTq3R4BkD zbQA^g*$dPm226zNoC^8&GxS-GPqh^qD0$PkIfyy7!53=NrbsJOoHyYWfMA#$R@FH- zp4D9r6|x1SHog49h-*3pMz8)T(C`2qtYI`L!T{LU#dyS7^<`5cJL@k124saQa-2<9 z@tuVO@Vs@xaKfj}rw(T?hXCMP_y!?d&HAysKDd1nP{qU#0G~pCv*u2s!R;4`EUWh7 zb&>6<9>~%)2IN8Yfe_2eI#psF0<3JjSB2y87$eSD^$f!MDUcH2mG~@YrA1Sk0QK_t z^7|9LxA3Ty%PE#j+daJ3%=|wx?PEidyBim?V~A}K(w*p?FkgP zOa*Sb&CRJr1Ax!3_(8_lkU*>W_wLOEbvXNspC{v7$BxTZhgQT ztCw5fdibEqw#nXNk9&+vT1t&fLwpCPa7!s)t3;9`xj+JCQBp> zwAB@GC8l7`s*U2Qw|qzh;C0nYlRWTtvHE+O)%U`t z6|C0Qb{rf?HY+Lt0Hf-yTXgt`fla1)%WGzoo{SYY0?GyuJ#C<$U0Lty5ag5%3Dl?t zcs*q!Mc;w{1m?<~f3AdE%g$HGSz$ehl^4`Y*~pnx{Hw`6l=x54{1J)&t;wc)wg#X^ zW5%+Qu45>A_8>*V)fm^?3ddT44FEp`u))Vm6O#^(B|JsK+)(v|CzV-K0HX*(H|0gm zp{;Eo0Q)N9qK?RWghYcKU{DB*>Zn|`K@_%HcRRk_ULI&$6Q&R|p^Vn&HiH>7P=7Wj6xEu9wTPy&6V z7wTLb1|SbqdQ(c$@VkYqrh4KHnF!f0Oen|o0nqA9B{UqRl@>Le#(M2S&((S``FZh_@~Lnuwlk<_T?nT8Had|;N$A#Y-WUERFTuCFOV-RN`ponZ+Ys~JMv zkiHD}WLqd01J~x_<(Rv}CVdus-bXKE@Ri6!BW-%e)bGYR1!ws}lZvCq_17W-Si*-Xt+ z@@L+u3@xSBh?f=!-WPQ^6F8R;W#pQOh<^2pd_({e8~8xIFUAPEhY-AkF?`qvt^JB zO}JH-uAI;|Wigt7e3COiin~ipauiwyQth&k_6$}m3MQ?PI3l0$TEnyhgmU;^c5 zmLfw7ggc4QcNWQZ2Xk;LGr>d~bX1SI8H(K}!7#s)>^$Lo7D=!+c6s&WKwsWPdOV`m zEV&hyT@VN3`FE%U7r3VHD_JTCzo`u_5h3DElB+(b+XWt%afyP^SQS?Eyw=PaWW(`d zAJkFD3xw-(2MC$@+IwpB9n0$Fi(!y zc{w}QXsI=Pzs8J9A=8crIfcvEkcX|+OFHwjnXh`-QMvY#G899xtY^x_(98yw9~6+c zo8#j5rFr0xS1Z%Aa3p*vwDx{hHaP~=VeKd~`Tcmu!8Ab5iZunf)*d8DqWp1;A=7CZ z2Rq5-$yqQX?!!9DDAcXpgm^6Trc@aALucZkcD8m{;@LKC6$<;&-^mI%d1r4JL?@?V zjztxzghFA~BeSiayNP#l`>LGa7!)iNCNmITYdI{$S(NM%rhvYuY5JD|ZDM%9aF9+P zWjiAdd3w$k7F$nGq!bG0QqoQr3j5KJR~y8_d=s~8%rq(KV! zgFX3NVM9VN_|2|pdPuy{_+!={z=ynDZI z$`T4RbWHu2nLldG!s!Suufn3U1$I2}8{_J{P7vE6`f_@`ko-pTdF$PuP=l z1z&W)3?}^jnwTY9_SYZWoJyc0F?Y_7w+Nqu3CI2-LK(lxQpXE6E>ys>;$MX++qH3* zD0&ElW7F1jB=aHt_3pw!6`pi9o`nn;4~mKQ(9s1o@wsQ8ggFLQHn3WhCY)AR-7tVy3az)R zKu{^}d4AP5i-fCRR?T6tHtW@_94gD<`w8uC2jP&%H?9;2tAN>Sh~f`bW=5?^D+$rJ zgmqD<3hg4{6=v>7K5Ru#eFKD5G^RW9VfWWCtv#;J4yfVKCOf<8UR_gHO6|(`5MS{2 z1QyGplV_cpDoBE3P2~D?1H9NW>dGq$2 zLg6=P%psY$QLDU$tVa3kt$#kzV9HhIjJgMxio3=emFll)93eBD?z~uUP~*pzt7ok% z{W}D!6>e{+;6Q(Nv#Brt=MwKQS4|b__$e71qWryIHQG2WCvT z*#%`Q>l)5jHxrb>vY%GA5mhTfSh6}&TLgPvxD6ImZ0~=st-;M!&;Q(H&FKZV{<=nb zP6rpg{y7#~K&mtl!Fs9R)a%X6FEXE~zw<04x8NM>?mv>A)aj7a{$jg*snG?MR>D)93zopL1s& zqn=0f%Xz|ISh;l-_4jkM`V#tOwL83?HOk}T7yNmx=KC5Vu-n>QKZ=Db)#(U*Q%z>v zlNz(h2Ip0IblzuYXK#3q(iuBR`re7whuzMCzA%YJXFCn*)SrhTaGFqa!CK>B!yGq! zqwkD=pJ)JYPhbYazc|KaprL~8SFx+A?gQ_8{b7?su(oVWWWQX)1ELC84nDLE;N7n0 zR81dxz%ghy&_9J8lujQ4nplFDp|i`SF>8bLKRwm~yqrQqD-l>%bi`RvAUAO6{8Y5O zdgaKE5W_uI9UQIVI%0QFL2rGQ=%qW>(8g_p87)wN<>-voUn*-mN;#A6x~b=Kp|H2i z=DvQe4S2cJTZv-W1k{U=}=cVk6e zh0E zg7w|(y>qX>kHht1iHoHm-0Aa_!rll|H1!&0mfL^yOLLqah+K7@G58$=Z!!>Cm zVA^Z3ssGu)-ofICISKaEX$G&_&8xdnr$jK@nQ!UZHa-|O2teM6j4 z!-8VZMC>??C{Ju{t2(WU*HoSvO{)?6r!!MgSR$g6_RR4;*CkbuL4&L?T`rX#juD2e zFu3}#FP!$EW7rq|{cI{kXatS(Gijm$;$vi6zN&|ajUq?w zOqd#g+|Bd1duNTcX#J7%u(k=Ai+N(AbMs3GetetbiJS)N z%E7tU^LjG|k&oZ=j9GNvoOE`z^Wne)CXVvFYey_9m)sp`#xvE%ov>Z zu{O4>Ns@#z_9ZlgkY$J>Dk@u1GuE+>tt`b@vhNhxLiT;DY?ZYX`XXgZ?(=(H_x;@0 zbKS>rAIJ0S^AGsJ91e4yug~lC_We|p(4RX%W1kydnrV08|I^{ms+rgTI=HEP@*q2*C zI8CaT_DMeK?z5lLlLu4RXX~1#xcSe(DfA>T0i>FTIl&+OIn9S*mq;Ms36 z>x*WkuRPt9_N zNR@EY+*KH@1lPYVpw_Bu>Trk5QaT5rk9Sw*9~vH+euq1;u+ms0|5@O^;~*Q)a&Jz} zSWU-i|(=<9A$9 z-4A*CW=r0oQ+DT0`R?Ystm}XCZ0{6)?R@pJCHwEk<#h%CJ_-m{s%HLV?fHDpvXbd; zkVEeslm5?ttdjodM4`vtI3PFJ4(Ke*N3ATSk9}J{zWV%mOuJ$AzG?q%0Nfz{kbj;{ zJL^}9=|bbNTsS*2!|lw2iT?27<|Qv+nW=XGJd@pd!pjU8Xwt#@tWgc=1a_7x}<q{$Uu1AfkJ0#?~ZpIkDXmu#wi0i z$07IXJ&Hq`*_w*z7P|Mf;#yw{^G%js*^cx5yo>*WtDkOtQA}1C#Wbb%`dQHldm(|! zPnDWS;=QI)^$F~=&7n0vK$w6mhFlSedpRX^h0$`9}c zuBpGk*qtaf@+DPjWzzX&)0Td7ti&nEAvfD87ZT>reQy8$HMC31rK-M?F~Rxm&ygZ> z4$qzY?9u{#t0oG@o~@^P3K;pBFU%qvLzqRL3Yz1un$E2m6#js;tK(NEOqzwWp?niV zMTc1>9-m-NSZ~F$t8n*Y-LXp}*q=?L21T&gw$cU`hfGwC5yXZq z-g0_I7})c0Rykv>whSXRhi2Y&e#Eqw$j%3_L7|}d|t+0OoTqV{$m2SGj=q@c{_REf~9L` zZS#ERb`;vyQeMs-YUM~GkHDl$%n_X_r$danGpmA0{4KjW7i?&}m6g*hX`gk{QLv6Y#JuC#bfD4#Bo)59baHdn)Ogq<>+R< z*!h#OY?~Na=irKRHWj|xFFl+DjFAFOl|S-+ltq=99$cc!j^umFpO!j%dj)y0gsga^ zHjE?vVpWqrU#nh1>_uIfnT8%Kz6ta6TyOf8{JSbUp`$9v>06&Gw&*!XochzGf;o8B zoFwbjRa&1{L@%8vi}pwXm0M)w?G*_Re18rJEUnFEf4{+`9awO_T%qvg&232pQ>Q#@j@eU!uKgF0WAR@bw64*X{4w2Hw%$R)qf5db0iRcv6zxO4@&*sD7Gm{ zXZvNhYjvX)65cfP4KZdSm@V=WD6iNn$@w!dxGP*xtagCX(fgE3PVdb~72)U}ud##C z{%B}wVI~QKY=gh|c*OGkiKeS|~d)2Ar#;X$TtNO^J0$ zq~WL%e-}Z91$4Y+wdB36P~7R>m%Jv4u}*u=2>nP+)_`CNEEsb_257dd=8y?d(OdXA{OZ|v@ja;gd^Fx4RCrY6Y&IcLR$I}7C0LWhVI2yNzT#W z%wv9o*D>OJa)s?YvUjV6)(8S`#BV4(T!_CpmMGFb0Pxdrm+Uk{h22!3kLUEIf2%)T zO9dw`bG%VlNjxK%sK;$e>I(H`7fmlD2sYTznh6~^%}R>4EPwZ7`XVd0Tf1Uz&C{U3 zb`;;?jKSzGn+LrOW{dl3bW1DV2(q_A$OXoqUtTtNMquWdWY3Ib|E1qNIg`bVMK>thJ-XLq!qsp(6@cJA35Gk2Slt};SM86C1A01&CJ90 z!zr{_CJDx8O<-`rhpEUdmjC7N(b#Q+F3{fce^>Wpo3!eS2X+^Q$Lbwj-u!n)CJaCE ze;KCT_t8!UT`>FxY<~qpk7~Qee#aLz5mL{w&%)$af}{juAope z0H$@TsWx;Dd0`KisC9}M@*-H$qyYxZnQPuLV??P}zIf64cxy-;*F$G*d3>jeh%Xc| z(`Yh9Fbf;k|Jx_zu11d(;q_`l>lj+A*tN-gH{d!VAizutr88oCIOr@Pz(uC;bqQ6# zh4Qt&9YDJ20m8c$Ct(B%tC(^@Bkum9>^7w&ssTS=7mu=p8` zmmkt+e}7c-Ockg`V7rRCJnk?=iMnbuqDS6l5(2g03jDjw{2TsG2@lGBf8Ui;fmh<*zSBdJ6T@G>=*VLXrdpAe`jz{k9DC35!M? z7$~(Cm*JKvQMcgG8+MJGptzvs_$+}2U*=n40vLR%IQd{32_xplTuROy3}}>8;!~h2 z-c|xi6J`l9Dlh}n45UOfT;a001}8wIr{+Dm`MoIYBZn^FkKJayY0PqD!5x&hYc9^< zPXv2UX4rx62n%isWL%xpH8dlfbRRsEfuyw)@C-z(_IHsywkt*AI);EQSMAqC#4;y> z5vz!?)_4X($z_$H@-ATz1}}=lfL$6*{U%T;Q~c-m>OXI|Yziz&-5v6Wp_nmP=JA|m zTbGVR*K6HFy51Nm#YjISmYf=JNd|abs9pd%u!{*mGZNi$5oI7CiR?X?RyIT_gmB7Y z6&PZIx+=Bc*g_G-Rvq43wQt~@_w!3(foDdjI3~Oe>kmb8>j?Z8NN!-XS;J|c6;AF0 z&~kwzFJXnJE=$58HHdahM1g^J1nFa$Qe2aRHHEOF{5XCrjhk@Cx?m502i|V`IT~~J zhf1g+TkZWeJJxN>XNV~T84V9GI<6^yRcG8q{of$rY5CB8J873T?HM3h5YRZMfKM~@ zWwT&&WmDNiBC+Z-p1@Wf00?~8K0U|-EO|lSMbu9-0J4)iyT2xHT(Vw*n+OvuyTNTs zA>?w+YeHjfEHOU!hAQy|M$-}s5`y@X+C9da6aYUrDt-m#j|4UpV&SIRC_tq{X^4`o z4$#nj{!dnr*(XiX@{XwkFA2LPygZYIz=7HB9~-4AxTFj=mi-JYIv6mfGb*JT3@Rx-uNREMuc zi(Tub2VYDl&-Ek%%3Q3u#MqlfcXK%yF?rhWIeSXRP~zn*OZJWRsJ*ioO`}Y4q8H0a0>Mp}t|1CR)$B-4p&z{}iE(YEbVSX>L;L%-cWNrTV*y z7F+5fd2y=G_IGvaVCnU<{Zm5^e%H`h%G~rXPXGU{PiRaE+}-Vdub?Y(yb9wSC{`ly zw<>;gGxGeT2rE$@c}m$XUgpXazpsK8gD8lUw{T*To7}?Pq&Uf5J;w{1Y=Z}r8P(QA zj(~?aZL}gW%uq0({oG-MQacD!3e*z#+f#F9-z%7NnGE4i3D1kb zZhL)46zn6fsVM8XxW@_^z{VJr^E9w#luO1Pw6RJ}&Jp&1T(0H7(|Zi6{}Blj+Q?`P z*U{(nB(hL6Hig}xt5NW_fr$&APoPSf-`#vSPopUWbc=7EZpqJ-#!j*ZUx4nBzwri|M;fYH~dA=)+Uw;|JEC>%i!O( zoybJslvvq)lynR7$QC4fd3;8K9JVYi$nQyY501GI;xj)#UFF*dor!R`Yn(hczTdes z6~^H!uLK+4Hc?hJB}cyA(Rt!G+19h3;rXDlbwZoZ9~>ipcKJsP<*g9-ZuniOf}3!Q zQ$;Y(Gtpg6rQl7gOCjvFCdn>!xyTa2;SFrt@79sP@07X+5~f~WV~-iRCCGJwZ_A@G z#F^jFqB**SWj|3M7p|!P_eL=oF^dQn;IoE;|6_jg*f&daD9TYYI?2;3=6s9OopvGY z;y$N;&R&+;(eJ(6J_eJ(#&?#764v;@t*7cZZoqAw+ZUo^2MUk3nQ(tWWWkQZxht?X zGS115NpsHO7*kNBlg|)H=5h1+{#EeF4aC_xhu&9Y3J`4N$7HEM{@VqQ_QP38vT%=h zedG3}dOaQ<_1EimSbhrq5OT{7U(g70Z--A2~PQ}5AmofQkgv1V7jvPMa>hmQc^v;o+Pk3ecf~!v(4c2^C$ms?GCK+K> z!0>JdA70C*NJb}F--X1oL_oxfiP@ni5&O)&6yTG{-KV0F`xY(ylt0(P>1&sSc6nACslYcELZk zX_wE57Vz-}g`4cxZ+*9rM*Ym~8-iybnLj#Bjkc0xQ2#37B#F438kdz2Guj<1t@2=o z!SB|Ngw6- zy}#vNNr3j`t`TLdCllVKM21NwX8qfz11Zxf_t@z^9PU1;_{cMRd{A|9_d{HbBm=j* zUC3^vqRm|>eOO7d@AZv1q9#E=je8DjVrW*e+}Cx!jvo=WYt`%_7WT2c}OpO_lDFejrg-3}`QDoRBI_p)Il5FkqH zmS7Www5v)4)kjHGMgy7{{7kl!meGJ>i;_l4(yCyKO0KE9kFvs}SZz9EdM>nj$4+Mf z_K16K<~bH8K)2yR zQg)$7GGK!j+%SOt0g_<$uO5vQ!oU}zE1Pl^px?}5%ZC{-QO~QPDgebRDR|!f5&evL3?JSL^)Md@$wt+ z9#^$!7}D(OlS6(IpPZH=bG2Ftg(xY{N`Rg@E3&wKHNBFqay`&^aMh}gmF=Kv;>a5I z+vchj6P6Fi`K}7S@`5v|fvIy?T1<{IV@`WnmEx&c(jf7HNn)nKs(^{}p;@eZCEdfv60FH(#;t>ihWmVl z5AN4rZQOj_2sxug%#8?drrwK1%2r{v550+n1PcE#VIbuNDhir<-y6 zhR>xPsb$_xZ@u}Ux!Bcba<%4pG{+7;tWqKwi*4&)1w_NV4>MjBq&z~& zbx80s)p&HU#=Ie_c8dPtT!uWsMeZG9%yVi z=qiwT`}AE%PGxsIL?-q7lmgo?JnM9`?aBVbH~h8yxlhNF7afutop%HuUs~(ywF=Cc z88|21l>D-pqja!909M)1Z^lF!mjhGrUBkv*#cMV<`I?vP?&c61UO?Dxxt;Fn16grh zbNxH%C46A-l3m*4z~L(QH}!JhFSS831tayLEJF^2J+m>gtC=o+{p{hWR2z#Xh}7X9 zX6YNmp8#i9ht}4*Ha$6@30~8$!0~_#112&&Z+t2+fJc&p1lv@AT7*|$B zV{>dYSSDa2$gox$Jt1I?2!A=plVdrdG02)lcXcDMzFaF-VTSz7{EU}Toq=6K+iXK* z#=p#+2$-wj!T~a zL+IV&z6tUVN1-zBJHb9A`=G>ipXTXt#0gNyV+5hetkpOvEme3tNWQ^yaNMt-V$$^R z*0}U!-^V`*>vGP$-3=i@%?qA`2q%=S!iRvfEh;916^A`jg3erlGb%v?ZR>?u=bgpu zx&!Q|Y0FQ-TW9v(rH%;o!@ZfxV?V%%6)8t79nOcnU4tK~_!k4~GbVwpqaOt=_dmXh zor2!K&mK0=4{1M`-{u{@hYvK~mzyaLdjIA;=;7Y^c>NQc@=_x(D7^V|)@bjqTe(r{ zJxs#b-;WdYay-3%>t*n3%)THC*<&vgCE)x>L7dCi(&x)cWKn^P?)0 zS%nkh;=+I{cJj^Y!slnxSyhO;b&Ul=i#(>STz`EhtVguu!CHKenjpY@I0vUxhaB+9 zDa@+LgS4QfYDv(psP~%yuspb2yvz4Ac0NkADePv&?Z)Djo~tr+xEH|+bHJylkY;IG z{!O*vU-x#7+6ZYw8%!F+I$X(fm!ls|aPKnWt(OSc^EVPJlO%?E+KQA)xA{y#Drv!&q z5z^~dO~ByrlSd2gL5=x8J|+I{bes)!C1Wv>c#NSI;ie62< zU4t>0YJ0)L99KoIqI~+)O5QB&z5pGLEVo-S9LCne+3R5*Uk7GOS5DZ?PJfe-%sXaM zCEHtBCJd}O*!c?IKV=!P_N^Wa5{byX_>(_?zF4R>!QkG{!aaquh=P|a8=O5+6DGjO@wqy6`f&q?Od(YX2EGGT@r|pdxksQj;Wkx%l<7 zmv8c68-+{5@rt*9|2Ia)B6J}XHwyI$kB~-+3zru3;)JAGu~yEG`v0>}=+sG3Qz{DW zO?UxidYnIXq+Pzzk+!3SoZ*|88vx9)Xx(%R>Ati=Yd5>%pSi8R+`j z7T>*IjoEI`)D=iB#G1KZ;&_+axo+1Wabv8XR$AU&1jU)AA>B(S8m=(~sMR}tE*|32 zcx0?ZA`oQ}&}u zG%3YJz&R+8@0S0_Wmo*nVar0L&PT?Zk|){GN+UYF4Bsz89Yal)R?N^t@3-uaqdn^u z@7_-+6jER>%W0p4K>pu-h!#0St(8P-CS&iOy=qz?QPWb}7H1@M5bUCUq6{l?@#Hyi z8I*ytm{By(a18DB!Q@&$qj6&By_S~X-d4Gu>x#z_EI)NdlsjZHdXJL$(1&-=O1rFj z*B!^UC7J!Bp4^sXG@i)GeesQ;K{~4Rn>YTdk;2c*NBd(ENDZ~s682e(*qREpypWd) zk3Ib(-&-Ce<}|kb=mVr2nV(}SzQQjP8TsSw@1DiJoU%A`)jLdi`lCXEQ(p6Rqs?B= zUrn#3OFxz18@(UD^I;|7 z-|`kNlQZ+%)CJMl;DYI2_K}i5JR;5rnOc30{f7m3hQTl0KW^yh@4NI5wj7vG_KVh* zf4VGY#K9-}sjtELj$VABO1hUvX)2}bwWE{As%(tXoGyP~`wyq=qbvD7EIA2`D#@Gddiu~rg6~f>eHSy%CYGvqq|%!R%TwIdD6S-g zo^mIlgwM7g*&v0~R)jDGV{FnyTG+I7jIya$Q}V1t=-COpr6-w@(OHf~%^DA0Nq)J26QjTHGJDC}xKnx>YHxqk_2-QFTIW#G ztb6n~gx9T*%vEnT(#L1WYf{+iNQALQ(Z%>)5kgrM!3YQQ?F6pP2q{k@`~)tTXPu5x zNz{zKP&tQuP#A8w{F60v>povB;Vml^Fof&OA(cnkB`2~kZ*SKYyo59|PlXA%#T-&? zu3dJi&7%CK|36svVhyT!WKsU>D-}u&cNGVKs;x|M5LX7i`_J7J$oiP!vbJNb!(nwAjnjz2{HI9Fbwl?!a2CaaJ~*KfYdJPI}9Jz zn8vdS5D1<3**GORm${P)2Pm)t)1e1y%iwdUEGHCa+}!YMb+YDimL1>L`=P934oAmR zR)j7+GzPe`qf?3NGiQnb`n@eK06cdieNkFole__|7X?tiP!pFhqnr0x5KP8zg)dF( zO3gz%T&ecfpJw4?bo-yJ=#V2pu>t+9KwPVG0?5%HkPSK;UQ}c7VwDUPA7l1#LN6kL z$osp|=Q(wKu)tpiZcA3c8ZL4MqEEy6Aut@b1h4_jYiI#L6hT{y#1?uRATq^)wr*e2 zpsZoOwiEh>6>!~Tp55x$9-P1x*(5>a_{D{QJ9Vy!8^HZxBOxk!Keny10Xt4{=Y^$r zmvWF!0D+D?1+<=&D$;EaL430cw>&C@k#X=aNZ6v;2_s-7H>_QdA6F=DkkuM+@ z?Cfz&cFDO){gJFjLJu1pAO??#!PGTlai?m@4Dz7S3`3E#g)}HV{Dcpkkc4qveGBT# zd7I7J_)0v7Pw^3?)X@k6V1b<&wr6GZVuA6-Xpe9K_qDze=GM2PHDg-%JCo8+<8`E7KV|)SM<7Qt9 zR&j<*z*FmvYECaM$G|p?6(PVsaWs#uUx&-!i~b)Kkr9r|B+D}^w_1Axh=r`4W|Byx zf;P|T$!G2Q-RhMhJQ`Sqw*b&nb1SXpYsJyu_;=-;R*0(0TzxLV0N{Gu#~@KRudXn4y&Hjyji4Qk0cSbOuZEvIXk;jzb1=MIT0#8OYYAj(~ep=w_rzD&rckl{eOH!sIdPxpmt^r@eP zu~VtkMm6>kvR--)A@2pF+>;_w@43iaj8?djtvP7*O~1`~BvE5)=~$UTs&2){{qn_>uUHyrYk%FiuOl_>ru~WNz^GL03@m(>i3=lvQR7~s|em?)B7K3?C zKyo4!$6;)Jqp$)}`yMSnm<(asxdzSM>cx%^bu90p+L+Suc8xndgas2ZJYX53)m z``?U!%CkHMFFI0c!wUx7r<~~{0AM6Cpy!(>Y~m|{Za|aH4CQztV}Tj-(MX=qynH=vN#~vzsE1yX z75ufLUw!ila+h*UrJ*xxqaE@5OSqXKy~|W})S{-A&KuEo%$(`sq%C^+*j{~?(wE>w zH*B78^ogY0XFQ4S9TTFz>vhG2H8I`c;Hj^vT}q)g3D57F*A{Y@y+SU;-bhA>?@fkD z2x?*?kE$h)mH8tj;M`(2@3*r*k(xT}(!}T!ov)8em)?EaKl?>>=k-Wz`Tc^6AHUn~ zG)xYb`_}b;{PAF?agL?Jzx(2+t@NFy6_bhwANoK2ZrEwwh^+|xdhzrA^iIp}V8x@I z{?C8+cisT3m1HL4Ik>=XE6TJon0H`~QEj&kjH?WlG@i#?-EGGWRfeA(m}h;s`xehy zMb$T6;Kk zZ^(bBCUa-t>xHMdV`Rqr>Q3pn98IR8x{Bk_XH#ExTN=~y=D?O z0z(Ot!NNOG>@ar|} zdDg(!TG13_e4^jswC>i=xW~!!*g#{M-MS6msYO3+DWh)`)=g#LFs<~|V=L!BrCeqZL7w{qNpPx$} zD71gl9p-$n2C#UusT)9NUX~p#U961=X5%|tgEauhh5Sg3^wzMM{!Gb+Lh>o!X9r^f zkEN8n^%#Jmz;tXo;{`_}3w3t*t))q)R4LfeXa>hG4r7OI>ZmSbX%!!eMT@bg<&;UV z87!^tG2YhT?N3Kz&ily(t^>aZ(2ju{{;^dXiwHoD8hy-12vYuStmnl9n|v6v^SJ&7 z_cjR;G=igMqvdEpr@tsbxx<523Yhcg!|`ioZ4BlLl;pFZ37v@zC6YsfN%!E)yqWao zg2nYX6M@Hv*SM!Qe3iP$ujYiHu97kdrH*sffu*M-PG6zwSVw_5Oy+nIsuQyaJ>onSXG;j5X6Fvt zh<>30YOi>)R|l6|ai&rtI#AJ&cf{)EY~vr<+T-7+A8U03^5sORFti#m8f<3{aEqgg zpued&o0*}N$27J+8co~`_gx-^L~R^CjOwBt&rd_NRA zQI1roH?%k*X=%nk5qg)--ulRGELO6Yvyuoe#L>VplnE&w%fs!a5UYz8fvSz4x}8|B zAyNryRk$!yln7*_k@b_5G~J2rBqb4y965j;EfU@uBm64(dEId;h4ojR6WoyIix%0Y z!G3>mqKX93RT6(lKE>&ArW50uftR#aprXYSHZY#QW|$S?!0tjt)d^R!XrMbSU&J^v0-}t6lBVw z@^BelIMmyKbgC25mFZNqVFt(X3_cRJpDzl2%JVe|hZ~VgtKnkkx+fIcSbP*_(xEgI88&Qrj4k46_iY zGVr`vY4_m_s;B<(f5sJ#yJC~t*30<-h-6g-Gb?GNw@IjT&>RC}4^G+d8z5UmGCM_+ zioyj|0>-h!*Njkkb5r&Y=_rRk^T_#5u2$s*YcBB~Q2Fo2}_9XO3qqr#Zw@I@fJBy&Gj7?X3;kW=7hF#;N@ zA>WgW!kLf~_d;;cYx&l`Jn$|X*}WL#Kne1fB1D2_z707+e zDJspiEq>Th{^Pr2x?iqAa_(+=h2)VzLXc9nvKlzqr>`_0b|6hMGh+y+UF=VXc`?;k zeXTslEMh)_Vv4Q=+gTdjYjqom(_l~N?obl$^)nt;s|Xl(0eP<3xCPHkEe z&DZDV)}(v4s>wqVMbptt<0qM#y?Zukc?76Yn5p#-S2s$rw)3PUz!9qU9@%3E_osJti`ABt$s;80$co# zkH2VBC#YD+r4FW7whZWU*0#2$SALF=7K zr|r7I90uD!hkN=RxyF5mZb)=-54cb_&ix|wSsh&S)$2gAV|{;cpAa{epoVTYG8Sih1t7u0PLXc;Rv$4zH%t zK6=Kir**4)zxuGOPy)5iuns~v`T|zul|uExix>vG;Rcz2Ep@Qd)Bb5&?UHNhK#aYt z8}ePLeaK!DCaBETYv>?1{BMK3z!Z{CXe9lay>wJJ@)q}{8T-H$f6+nCow*^&^W>ka z_9aJAuMP(|sXJ{-EFzg3bzCeWcS=XA7ZnWTUaE_*NPtX^`{OqTn#G%I*;Yrvg_7Rl zF+7D;uM)90JB&z3**^T^S8<@6BhcCZ+TtC;7{>VO;Q*dUNci1%? z=f&J*d>)h*nuX2vJ`@VJI@RlX9xMU6OM(X7c>4NJfPXhecu%~(W^|ordiun9Fz85O z2cg22IGUy!_0t!b)?M{Fv z1wXboR8BRukqr70GX`p(=jj@MPG$Zys>`_;G%G{JJs>yE$$=LApUmXIQsX(%B%fDy zpWmp1bB*sDkN5sznViPXk=EN4)EyCcyJBpJ#f^T^YaiDSyVcbl4ZM)5UgypV16TIu z$RDB1d^f^u{x<}t6fp7xTc^O6JVTY2SAi*f|L)GGO@`%3fH99W2;ZD3kSh%%OrBQ< z8%q|}UouXTS)xa@o(Te3q_7{loP`_kE2foR?o(S5jNX5l2Dj&7b5qxj)ZbxEzQE>6 z@>v|cSXq=RS%O%j5vQJv3ieW~n4AY!ro$a~HyEP{h%kp`^JhI0@?iY;FZJT#_k+MhB=%dvZEzTxFxw2xhl*5Al-;iX^X?xW_JxKE#V489Kgoi%58L2vr7Xpc z*dsPm(>DtypWH7tBv#hlRRfRBI0_uG{;Y@ARu1Ov8?6A9G-hn$TQnsQAa^4Vin*QQ#!#A@nP9en$O5L;KCo zT{FFVv5uC<07CRHQwq-S_U~7rxWTgD#_aD0+!s75x=rotsIZ==7eA`3{YDSZ4jul2 z&0%?-H$nT1pB_~o4DOt+*oki$W%jHNJZSFee>D_`j(P*la_t5<&Msv%N$fYC_TU~m zcsCNgkaTR{YV(I$bk#I#gScJ4cw;L)e)(79uU*5$CmP$N;qSn+^|YZ1;l8da4KN2- zwEkP#d4+Uy_1EvHk=m74hyL)X_1#~xpNmyX@RttZ>{#8S$5pVo4)nv|sacl}Oo)2C)D(}QD-6n{I%~HCg_CFH% zQcZKi2Q7ZJa^@d7bYE9d172e~ZZ9&L{uZm?I0!xvLapk&SsZlT3Uyhk{7I3vWF#P; z?EB`b`?)QcR?5z8ET7qG;uTHZ1N3)N<~kiN=w%jK<4z8bPfqO}a{8XpiTYL;?WuUg z`X^qJPp3D&K!y?GT;DI`6a>5QH_4M3B$m9|DN0q@ZIoh4u{N^tyEZdBL-id3=Yd*r z7N^^MxvbLkgU!|w(Zc+$H}HNltxR!rdpAXEOvV5g5OpnQ-5+xtS(~iBnY;b|-t97_ z!tHoTFF}Lq*X1#8q5U$au_L;ZaTr5^(_d@Y^-rCSx!ZU4sbFC{b9{{{UFlWR{vh~k~;Jlv6$rwwUW2a-p zVjP)@FHgIcsl%RJJN*Y5YBURZrGGa;$Zv)sGo@+Q5?7obtT4WuRG?Px^`RQ;BrS5~ zLCv4SV?0DyS&7W{?$cK6Oc79cQDaM=@zR#b?mR_3f#O_8A0P|I%JN`4WiWqHoB|gZ z_o{M587rzc@rF}G%5*Q#e??lZ?MZ6Z0P!iP-m<4^X4-n^tD{EZ(h{ACUq>z1mB#=R zYWdgg=ok+!kiQ=1>UQo_yW9Z(9Hq9XmA@kUw8EMP!`3;OPO^~ptwKcowWYd>pS{;# z4<8zQuVG4L9BaPRsTQ)k|GoG}TRe}H!?j<7BmZ>1yim-+m-_Imc9(FLT}{XOP$1sI z)T{Jf7he`Au+!9MG4uA|5}SIb$tBlD~Jgz83yD|^7{>+t`+=Q*ARucKkvjV z6{A4p`3_yrNbadV4klObV3QJ_?$1_uNQPR*eT|G(qVHTN)f71Xc^}WOsc~5KUAAp~ zPh(61aj;y#Kj=IDJxW}@TjL7@f%%oW<2&m)G@SJx)x$~6>W;f982@6*J5H2pKJ=^o zn0pSm)Z#(h(AJs0m zRLsftQsF0?o_rjgKPIRg#|^ttd`;;vkKJg1PLDVE;93Z)(`QJ?ezBdF=O zCSrD6D5sV0CF>wPvu03Y8qoG1dmy3U6TO}0NPSC^Zfqy$nQbpALpC=r*VzS}h8^wfysJOf- za#8h}T=#$G0G`lnjv;@PYVADM#GnnPN7Fe+QJaad7Q-^rH2KxDV;}D#gx(v3i$m)s z(*B|q#o0UUrqUj3lMP3iy-O$=;bw}g9Obp}LM~4XkNSZb=P~~hqVPAzEz$2c+ z0pv__s6KGH?4JoO^(n)bZUC*_1P;B0cc)=Q z1@P`d%6%*#E{Fr3_#l4`t7EWqmxpj4C+;XRqs$6D)M(<^wMHU0Sy0l9-QnJ~|Ji&5 zfy*0+3FY&0PY9xxm}CR{XkGSVo%_IC>La-2J8iuL;E48?;IeYPK%tNYvWrIlB(pi1 zGmLyY?)#S$0X+5OYgKEMxx7*{q9=ReLA?u%EKuyy$ZBbI1_S(`^+)G1)#E5ynB0IT zTnl&_`oKgApwh}@y4~&@%RtOKcSu0;(G>BXf&#-g8@XrxmbZzn?$*5r$nKl zW13Te3KO)_#?U`lrT=p-l=rqjpj;99lMr`&>vHLT=|Xb#BY|%9^ZZtkq4Euy!{Rah zFs9vh8O?6rDj%6S82C!BML|;rI0Xt!6ylA=MpRBC=`)mHLgZ*u3sjc+2mVt~8#3vb z{NeTlQ~GXV^eWVb)Y$xAZAizrPJj2h7hHc;XUWQ%odU6y=mZ9IjV#7`TYIkh!`Kq`FvpIJ|X_qfhL4Z*~1jA)OSQd2RP)3pgomQ=;n;`k5g(2&sl1!AoLHnlN zC9x@Ha&Fuejz=jXVrb%Jph=I+G`SJZ=5O6jSLVK>z8FDJLd6`7+>P0_34WCKww(c> z!&J8608XJ73lK^ZiHiVQrJJw@qjG_Gn4we`3qZdRYrVjTQX#Myh%iFLQ+}@%0KQ*t zSDpSJB2qO$dQnhBx&c8!5y3~4Vo5^pp?3&Xss;pU z0-<+lqJRys0Rm!2MA_?k|NGrDdmnr=`|z86l9^0SGb@? zQ;jI*hDsN_ZzE(mmzFHc9*R^Kn-GLW*cY-dlt;M20V@!5WV@j*gZM#cbA|(fT*O7A zs2pAid|kHGL5H?48GN6Qz3~4bxAEumKH9DYH{KKmcnzkbtIVEy8F6Zge9cDlqiqYJ z5wN+$RKC?Yegu^dhGdJKBEx{Fx9Tw_{z0(p0pNgb^0p2Ppi|5Bp0ys&y1XK%;Og-c z*fMe(Q3nD50RPr&FP~oK4d3^$BK@g$G1z3iCL&kBgP&jR$ctB_z z;hai}GN&4W3uWhBSwA8&cD~=A(Kl8bOqI`{y;k_WZ`BY%;Z^MOSH`f7>`GI@=S*m+ z8Cpa4Dh7&gqk;0QVCBv9SRpfJlM06p;s~{b+OJNe`H;O`2Cxz}dj(NG)bTq13lEcg ztxNMi1*0k2^l^?1W62p2GgFB8=UgkrC9wLGqlRR{-@Xx@VIR=J8S%UheRktn!ehRJ z(n+>Dbb)?$E$Mx6oSC|`pe2@D6&g@GWiWK{k9?G@_*CpwV*0*LmFNEd|G{~`e@#$% z8<`w7D@I~FlQG8|ON7T)O!arB7)gy~ayF}$E<4lNj~govkFOpN+nHhVHdUJ0tewo; zc~W`2srtp!E-ufGXp(dhzRZS2R zYkx*mjuf8%mpe$6#T3QW=gKK=#gfi6^W&)~GcYzu!ki}QcY*V;-`3CkL5Y-Z3{8rA z;=+ON`?-}FQD$IBvZ8p$=NLYkq)69|OrQNosFW^^P>+&Wbd`@;-{EYjzhK-$-!vhY zX(+PepWcO<;yz~UGbJ2CuHq9hZ%t4>fr7>*(uk)+Usw18;dgP~-+VCe#SP`(kbEa! zx-a6>C)byj5x}N-;G;dkYG#n${%HaMbL*t(KJ@^LLaWSV(48?N!;{A@q!v^vc)MW_UXcMYD0ZY^qW-L}yPg?6j1IJo5oz}q+o zrCDg3$@8VnSOPmVg=Q`kL(|U2J*H68$RXN9+NFwX1PWJriV!q)Hj@>pONPMO9k*=U zG=-`zfBuIYBF2_b`V4ub^8ET;RHmIfewNQ-CLUZ1_+mOJfAHB?>j6R)5xbBa4SE?Jd}cbpCVMqqFMXD+c4!|>(jaHUH72J*?wd;i$G8%s3` zkz--ibwS^u2-#J96cMHT%c~R;4T3uZMUR+g>q205E7?5fU!IsZlnrTH#GIu6s%OSuTgCg3l5Dj@6Sq<$G($sK z07EyocMdb(Zl^Y|&IXIv1TMxmp z0$ms{-nPIxQ)ol|PK*VkF(>0>rcg})T(7dw9Wwt&`4v9V>Zc+u#xmVK5aO-OuNDQr ztIpj#1KXA_M$m3A$9mnn0mrv7P-~3X;V@UQWLFm?gT+=3Ze*}XqxS|crO3=Q<$7!h zQWq>#&&IUn6zJ-h=;RwaXbwNl4gKT46<;{$;)IfIBB{!Q&ydMR6A5#Jn;S8uR9r54Z>d%yk?&jdpI+Vuyx6Eg-_CivcXuAb|^H5mlrDSyOd2?sQV`r?kaC& zCJJ|0J?9G*Ef??3=L*>XoC$0Al7Pzn*9sqwoP*rDwKaUrV*0W7`RaQ2B?)<(mgN?0 z_kFwJMLu=p6z-#zMzeS{PwqKiDNfc%?K4F$&x>Xc9bwao=St7qm4&|3x>dNg+^@Mf zQ=mWx%|u?RZ{CYWFFAW!43{e?u@31!=#_r}(+9T{?;AR#@r0Sl)!YzOij+}m@cmq; ztM4iHygn#hh(WD8G;llbZlk*gH@^K`>0rUVvIf$}6yC)K$vm7|Xk$30#5>;nhHatC z^F*t8%Yi}o-;uJ=wI+OJg?47BoNbP~6)1nH*j=OG61Hh)B{xVPg#55mVg)qcCaoX$ zKc)+@n9W)7=HIba<~3zBr5p>cHh1z}ez9}DDN*l6S`Z%DHe%2bLdANzPz;4}KrAik zVjG#3qx8I$?_yO&SkCvH_GhiNYw76+bs_4u_!38%8Xt;Q$19w{JyTO>SU=f z$2FG@=;ZBA)4h$I&X)PRpOv~08U+{gJhiwSD~BI|`M9Wn=Jh-wACRMZv@FSm9s3c8 zSLz%zXA{Q~__x>x&L>OfyBKVD;|;*Ztp^0|TwfNOPrJJv->s+}dU~?????Q%U+sqZ zDGqJD2-h&YxS&amOJr>O@A&)L>XcbLMozRBy27c$U1ndEru3dS#tX?2)>9;UUmiUm zTibU$!CbMm9~(6Q_1gF++qUzBPA`@nKo3-pwA$yVXi{Rq+Cj)!I_ygEg;;EW=iVN1 z2u4JyC-fosGnbxw#2bLx3T+Gn5Nz+EkMXGZ4fSIBq#q8E>q{}`+gEi*%9O!dr0yJX z03}~uEw0_Q)_K3SQ!(GecZpAyl4qWe^QCsnJZw7=Mp2Q^c%Tfjh^?IG@9a10L6C>A z=qmdf{>Jqo|J};hIk1Lx4>RYs0fSC!F3;8Hcexzg&aoaLHjkwb=J=Vj%8kj!| zW9J;<6PAyAbq1I>b3Xp|kh5x;$;Wx<_Oz|z-;Pjj#f*Is7i=T-A~x_IAbQ@lcgl4L zTY!56H1imO&a7bFeB4F={Kwk3dp+->_!L44@#c|-Zwk+z_%vCHhp@MpCLsZ2tM^M8 zf?GFdV73@rZjad99MuBcuKE=tm1zygCI1XpQJHCQffrx&sL>y^NX-0G;}Pu&$8WTS z`yoCDOu7ehd}yC}lr!Xfd5}h`7RU@eP2zS-Y}Tcfu_vGM<+a(X^g*hoFgoZns}h$f zRK!B`tWidVCj>KZeb1jOefI44*ql$^DB*Go+|A=a_tVS*+_?E5VFQ07!6Q21sp>eN zbm}u*@=)NdCU@FU(#Cx7BagBIC%*T*P)|{whx-##L%{TTqc|Y9g-z?_#W_5Or|@t= z4arH5;f*<{_or7d?@pcw8K0>d^9_`5yq@^*#+2mHr!;Jg_k0Z@I{18E1>9gg zAwER!{o$Ca172j7oF|U>kKrx#)3h!RWQxVw`kKOCb4;X?K#D!HA(3L$YZHm|jAm6Gl zBBuB{ZoY*rYRNGNWNzmuxO#3=018(JI#VcxYx3*Oez8|e3g;1JE01+QxBA?BY1LVv zeaq9SeW}oIvd$2kd+`q5%{7|ixxr-pSjX4x)sCbjyf*IaIPULhb7T^8`<>LoQI~tu zFx!;|3r{4A-|+Sd{@(qJLLmp`Re1M%`KPO*-SAcC_c3pWdX@W%*4MJDtE&73q5`@a zRlzv1j~zT8^(9wa3p}g;@~ySMB)Y!6$301ZgdO7^apzy{;}tC8*?=rYv)Tvr{6*K> zqrC2({eSstUrxZ6Uc`+JIa^cutCsSUglg|?Cg1W*c+q#uuchv`XBXXEnEMk#YB2wg zN5G4$`x`y(WG>63Pt}t1T{ovp48S*?1BG>Oq<+Zm{vOGCv6Y+fEXca?{0q<5!&3t5 z_y=PBWZ1+J-h71Jn(EV+qMth4>r3p`CsOwkm*FXkXWG70T5pLtkC}*XEQ)?%{9f0& zzZE2&FTVcSy*Qs*&|2s+t>*Aqtf+S0>Wfmr1la(58~SBeb=~=FDs3L=cK<89yU?Sk z90qdCT7Fmd|89NuBmCwgf^%nP!lMEGADO=`_nrMAb(U%NsRLohc_aB7IgsyK(W4J; zKVgi?ckxwMRM|K0|9nR?Ut}&P?GwEE_*>quN2OwdaTD!dJJvP!tufRR9B-YQokbq- z-`@0DTnW3Ek!bcw^nU5tPbF8j^%fpW7=XVYx06#gD~kFG&yJ3bE`E#uNw8S$I+4Eq z>H$vdVV&C46QyTlkIfjXZ>%CA5Ae@-C2(<1tV1!hI)>{{U>@t>>#vFzN41|nB9Puc z=NmP+zu>;~d-&{T$>uC<^6i7yD_tWKlKLP}uNF}cpm-#Wvu&4*qW();vs*TfV&oa#`n#(zO_Ww3 zC3cPxNGGyOZ3>Pg%4<=NLO*`)Hu8t4Ja x4-A4yQ6$5^#?k#q;i}dUOsam@=0Ia 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�!_N8fg(l0XQH5~Kx! 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%0D3A9jJ#~R`A2@Y#R|U0;QYpx3v4 z)wJ~f){&>{Bk%x*pytf?+&1^PJ5X546jeufS_G#PQ;n1Y$+`3{dAJcR}o zL>klR?Fap#_kz`}8Ryl18-0RN2M_xvSEQ%zpgaG>j15ZV4$O^jZ}7ONf2^eQbY|+f$y+}jGcok1 z>*=3-viJ)q&KIuS$o1Z`|&AI&o4c} zqzA!@ay9)DXS2d~G4oZ%hkLYV)RjNwm;dBGYU{RbP0Nl+9+{f8dO62=aRuH!J@v#t zRe05kA82w;y)iQKTmu|oTAN|dQ+=@jU&zSP5KNb=e)@2U=V79e*>IU)pPT@FODsqD z^z=g3u#VFtS4sLwmgU#TTM?YSab(C3j-?%M^nr%BX2Yqq- z8=Y+&mxbT{PAz(^ej{;|X`yeaW_s-%ra^Ng(&S~Lx%wy6L1Ft^%KO%Yr!f`ZG@_5q zev4O}{+yIqhm{+-Hni;S-{2f;D*s_$(6#Dt9nb30O;3U{ZEr`;+?h^XJ&Uu7+}0Gy zpZk+=2D5Wx<1;4vCF}eu8_ho~WN_O+V0>ji=ZgByt+wydSv#Dv=^dw{O>iSNFCcXIdQKAx0i%@O)@evK-zpIyJE2U;`;QA(XG(p`*JASR*MCb1}B^YkKu};mJ zcF3!_%0i-T=D@cx)^QPbp74vGegz#gt`~+yz1-s)9^O@2a@UNwEVJeEX8P7QbDO&% z)%ziVvSRmBzV7bNe2oqm5l2L^L|yF*v!q2eRzxKUY`aLVD@z|j;B)q7`VGI`?`Ltz zQr~wx_s+D0BUq1KMszDw1?r+>>|gm^h&^1~JW6;QZm)4OvF70`SpnYlRHvKc4mamG z;GFA?MSX9goc@Y-Z5~e1GzD8Nev>Mu8s2m-?EgmSbhFO;?sfaV>f4q0v$=k0xb9m} zG|%cGooDT9;%k4JIyVehkp9oO(h*4e%j$LwmZcfWDf54XUk}~%K^wXNArmVmWz+Ep zKXIsg4++19LM0KqPTK56oneR!kO;9F*~YN(H@B9ULOmYGMXFaw-P z=Ft|KS>)b-3M(d8?#Yyc>%*B&AKFY>e%&`BBWuP^!pfoU{Z;3e1ykJR^$cT&g1XXA zDp_@&PW6l?SnN0?Mxm4&W(rttk7St@8DE3V-N?w*^VQ9o%^41#)8Av-I$LpXHj6e@ zv~Zcb{Ea}&Jz9e^d*kMFub*(eSe}#3VDHkcB!~Q)kJrL#8cxz6}K#{h9et&8F1`%hn*&lzvNx?i7T$)X8Mv%1gpch1O3h>sWJf=9VG zpHxL&*$Hk%$)1qX-srM2iW4a6lYiH?J-&a_*^Bk7F5Qc614BQ+

=ZLdBF|13R!}f@ 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 +

Source: Video on Trixi.jl's YouTube channel Trixi Framework

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.

+

Source: Video on Trixi.jl's YouTube channel Trixi Framework

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.

+

Source: Video on Trixi.jl's YouTube channel Trixi Framework

Package versions

These results were obtained using the following versions.

using InteractiveUtils
+versioninfo()
+
+using Pkg
+Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
+           mode=PKGMODE_MANIFEST)
Julia Version 1.9.3
+Commit bed2cd540a1 (2023-08-24 14:43 UTC)
+Build Info:
+  Official https://julialang.org/ release
+Platform Info:
+  OS: Linux (x86_64-linux-gnu)
+  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
+  WORD_SIZE: 64
+  LIBM: libopenlibm
+  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
+  Threads: 1 on 2 virtual cores
+Environment:
+  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
+Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
+  [1dea7af3] OrdinaryDiffEq v6.58.0
+  [91a5bcdd] Plots v1.39.0
+  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

This page was generated using Literate.jl.

diff --git a/previews/PR1693/tutorials/notebooks/DGMulti_1.ipynb b/previews/PR1693/tutorials/notebooks/DGMulti_1.ipynb new file mode 100644 index 00000000000..8169567be87 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/DGMulti_1.ipynb @@ -0,0 +1,478 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 5: DG schemes via `DGMulti` solver" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "`DGMulti` is a DG solver that allows meshes with simplex elements. The basic idea and\n", + "implementation of this solver is explained in section \"Meshes\".\n", + "Here, we want to give some examples and a quick overview about the options with `DGMulti`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We start with a simple example we already used in the tutorial about flux differencing.\n", + "There, we implemented a simulation with `initial_condition_weak_blast_wave` for the\n", + "2D compressible Euler equations `CompressibleEulerEquations2D` and used the DG formulation\n", + "with flux differencing using volume flux `flux_ranocha` and surface flux `flux_lax_friedrichs`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Here, we want to implement the equivalent example, only now using the `DGMulti` solver\n", + "instead of `DGSEM`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq\n", + "\n", + "equations = CompressibleEulerEquations2D(1.4)\n", + "\n", + "initial_condition = initial_condition_weak_blast_wave" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To use the Gauss-Lobatto nodes again, we choose `approximation_type=SBP()` in the solver.\n", + "Since we want to start with a Cartesian domain discretized with squares, we use the element\n", + "type `Quad()`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\n", + "cells_per_dimension = (32, 32)\n", + "mesh = 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", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n", + " boundary_conditions=boundary_condition_periodic)\n", + "tspan = (0.0, 0.4)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "alive_callback = AliveCallback(alive_interval=10)\n", + "analysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\n", + "callbacks = CallbackSet(analysis_callback, alive_callback);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Run the simulation with the same time integration algorithm as before." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol = solve(ode, RDPK3SpFSAL49(), abstol=1.0e-6, reltol=1.0e-6,\n", + " callback=callbacks, save_everystep=false);" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "pd = PlotData2D(sol)\n", + "plot(pd)" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "plot(pd[\"rho\"])\n", + "plot!(getmesh(pd))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This simulation is not as fast as the equivalent with `TreeMesh` since no special optimizations for\n", + "quads (for instance tensor product structure) have been implemented. Figure 4 in [\"Efficient implementation of modern entropy stable\n", + "and kinetic energy preserving discontinuous Galerkin methods for conservation laws\"](https://arxiv.org/abs/2112.10517)\n", + "(2021) provides a nice runtime comparison between the different mesh types. On the other hand,\n", + "the functions are more general and thus we have more option we can choose from." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Simulation with Gauss nodes\n", + "For instance, we can change the approximation type of our simulation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq\n", + "equations = CompressibleEulerEquations2D(1.4)\n", + "initial_condition = initial_condition_weak_blast_wave" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We now use Gauss nodes instead of Gauss-Lobatto nodes which can be done for the element types\n", + "`Quad()` and `Hex()`. Therefore, we set `approximation_type=GaussSBP()`. Alternatively, we\n", + "can use a modal approach using the approximation type `Polynomial()`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\n", + "cells_per_dimension = (32, 32)\n", + "mesh = 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", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n", + " boundary_conditions=boundary_condition_periodic)\n", + "tspan = (0.0, 0.4)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "alive_callback = AliveCallback(alive_interval=10)\n", + "analysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\n", + "callbacks = CallbackSet(analysis_callback, alive_callback);\n", + "\n", + "sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n", + " ode_default_options()..., callback=callbacks);" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "pd = PlotData2D(sol)\n", + "plot(pd)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Simulation with triangular elements\n", + "Also, we can set another element type. We want to use triangles now." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq\n", + "equations = CompressibleEulerEquations2D(1.4)\n", + "initial_condition = initial_condition_weak_blast_wave" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Since there is no direct equivalent to Gauss-Lobatto nodes on triangles, the approximation type\n", + "`SBP()` now uses Gauss-Lobatto nodes on faces and special nodes in the interior of the triangular.\n", + "More details can be found in the documentation of\n", + "[StartUpDG.jl](https://jlchan.github.io/StartUpDG.jl/dev/RefElemData/#RefElemData-based-on-SBP-finite-differences)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\n", + "cells_per_dimension = (32, 32)\n", + "mesh = 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", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n", + " boundary_conditions=boundary_condition_periodic)\n", + "tspan = (0.0, 0.4)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "alive_callback = AliveCallback(alive_interval=10)\n", + "analysis_callback = AnalysisCallback(semi, interval=100, uEltype=real(dg))\n", + "callbacks = CallbackSet(analysis_callback, alive_callback);\n", + "\n", + "sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n", + " ode_default_options()..., callback=callbacks);" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "pd = PlotData2D(sol)\n", + "plot(pd)" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "plot(pd[\"rho\"])\n", + "plot!(getmesh(pd))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Triangular meshes on non-Cartesian domains\n", + "To use triangular meshes on a non-Cartesian domain, Trixi.jl uses the package [StartUpDG.jl](https://github.com/jlchan/StartUpDG.jl).\n", + "The following example is based on [`elixir_euler_triangulate_pkg_mesh.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/dgmulti_2d/elixir_euler_triangulate_pkg_mesh.jl)\n", + "and uses a pre-defined mesh from StartUpDG.jl." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We want to simulate the smooth initial condition `initial_condition_convergence_test`\n", + "with source terms `source_terms_convergence_test` for the 2D compressible Euler equations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "equations = CompressibleEulerEquations2D(1.4)\n", + "initial_condition = initial_condition_convergence_test\n", + "source_terms = source_terms_convergence_test" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We create the solver `DGMulti` with triangular elements (`Tri()`) as before." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dg = DGMulti(polydeg = 3, element_type = Tri(),\n", + " approximation_type=Polynomial(),\n", + " surface_flux = flux_lax_friedrichs,\n", + " volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "StartUpDG.jl provides for instance a pre-defined Triangulate geometry for a rectangular domain with\n", + "hole `RectangularDomainWithHole`. Other pre-defined Triangulate geometries are e.g., `SquareDomain`,\n", + "`Scramjet`, and `CircularDomain`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "meshIO = StartUpDG.triangulate_domain(StartUpDG.RectangularDomainWithHole());" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The pre-defined Triangulate geometry in StartUpDG has integer boundary tags. With `DGMultiMesh`\n", + "we assign boundary faces based on these integer boundary tags and create a mesh compatible with Trixi.jl." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "mesh = DGMultiMesh(meshIO, dg, Dict(:outer_boundary=>1, :inner_boundary=>2))" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "boundary_condition_convergence_test = BoundaryConditionDirichlet(initial_condition)\n", + "boundary_conditions = (; :outer_boundary => boundary_condition_convergence_test,\n", + " :inner_boundary => boundary_condition_convergence_test)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, dg,\n", + " source_terms = source_terms,\n", + " boundary_conditions = boundary_conditions)\n", + "\n", + "tspan = (0.0, 0.2)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "alive_callback = AliveCallback(alive_interval=20)\n", + "analysis_callback = AnalysisCallback(semi, interval=200, uEltype=real(dg))\n", + "callbacks = CallbackSet(alive_callback, analysis_callback);\n", + "\n", + "sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),\n", + " dt = 0.5 * estimate_dt(mesh, dg), save_everystep=false, callback=callbacks);" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "pd = PlotData2D(sol)\n", + "plot(pd[\"rho\"])\n", + "plot!(getmesh(pd))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "For more information, please have a look in the [StartUpDG.jl documentation](https://jlchan.github.io/StartUpDG.jl/stable/)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"StartUpDG\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/DGMulti_2.ipynb b/previews/PR1693/tutorials/notebooks/DGMulti_2.ipynb new file mode 100644 index 00000000000..452985ee64a --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/DGMulti_2.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 6: Other SBP schemes (FD, CGSEM) via `DGMulti` solver" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For a tutorial about DG schemes via the `DGMulti` solver please visit the previous tutorial.\n", + "The `DGMulti` solver also supports other methods than DG. The important property a method has to\n", + "fulfill is the summation-by-parts (SBP) property. The package [SummationByPartsOperators.jl](https://github.com/ranocha/SummationByPartsOperators.jl)\n", + "provides such methods, like a finite difference SBP (FD SBP) scheme. To do this,\n", + "you need to create an SBP derivative operator and pass that as `approximation_type`\n", + "to the `DGMulti` constructor. For example, the classical second-order FD SBP operator\n", + "can be created as" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly\n", + "D = derivative_operator(MattssonNordström2004(), derivative_order=1, accuracy_order=2,\n", + " xmin=0.0, xmax=1.0, N=11)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Here, the arguments `xmin` and `xmax` do not matter beyond setting the real type\n", + "used for the operator - they just set a reference element and are rescaled on the\n", + "physical elements. The parameter `N` determines the number of finite difference nodes.\n", + "Then, `D` can be used as `approximation_type` like `SBP()` in a multi-block fashion.\n", + "In multiple dimensions, such a 1D SBP operator will be used in a tensor product fashion,\n", + "i.e., in each coordinate direction. In particular, you can use them only on 1D, 2D `Quad()`,\n", + "and 3D `Hex()` elements.\n", + "\n", + "You can also use fully periodic single-block FD methods by creating a periodic SBP\n", + "operator. For example, a fully periodic FD operator can be constructed as" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "D = periodic_derivative_operator(derivative_order=1, accuracy_order=2,\n", + " xmin=0.0, xmax=1.0, N=11)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "An example using such an FD method is implemented in\n", + "[`elixir_euler_fdsbp_periodic.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/dgmulti_2d/elixir_euler_fdsbp_periodic.jl).\n", + "For all parameters and other calling options, please have a look in the\n", + "[documentation of SummationByPartsOperators.jl](https://ranocha.de/SummationByPartsOperators.jl/stable/)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Another possible method is for instance a continuous Galerkin (CGSEM) method. You can use such a\n", + "method with polynomial degree of `3` (`N=4` Legendre Lobatto nodes on `[0, 1]`) coupled continuously\n", + "on a uniform mesh with `Nx=10` elements by setting `approximation_type` to" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi.SummationByPartsOperators # or add SummationByPartsOperators to your project and use it directly\n", + "D = couple_continuously(legendre_derivative_operator(xmin=0.0, xmax=1.0, N=4),\n", + " UniformPeriodicMesh1D(xmin=-1.0, xmax=1.0, Nx=10))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To choose a discontinuous coupling (DGSEM), use `couple_discontinuously()` instead of `couple_continuously()`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For more information and other SBP operators, see the documentations of [StartUpDG.jl](https://jlchan.github.io/StartUpDG.jl/dev/)\n", + "and [SummationByPartsOperators.jl](https://ranocha.de/SummationByPartsOperators.jl/stable/)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"StartUpDG\", \"SummationByPartsOperators\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/DGSEM_FluxDiff.ipynb b/previews/PR1693/tutorials/notebooks/DGSEM_FluxDiff.ipynb new file mode 100644 index 00000000000..2da43a6e4bf --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/DGSEM_FluxDiff.ipynb @@ -0,0 +1,525 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 2: DGSEM with flux differencing" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This tutorial starts with a presentation of the weak formulation of the discontinuous Galerkin\n", + "spectral element method (DGSEM) in order to fix the notation of the used operators.\n", + "Then, the DGSEM formulation with flux differencing (split form DGSEM) and its implementation in\n", + "[Trixi.jl](https://github.com/trixi-framework/Trixi.jl) is shown." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We start with the one-dimensional conservation law\n", + "$$\n", + "u_t + f(u)_x = 0, \\qquad t\\in \\mathbb{R}^+, x\\in\\Omega\n", + "$$\n", + "with the physical flux $f$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We split the domain $\\Omega$ into elements $K$ with center $x_K$ and size $\\Delta x$. With the\n", + "transformation mapping $x(\\xi)=x_K + \\frac{\\Delta x}{2} \\xi$ we can transform the reference element\n", + "$[-1,1]$ to every physical element. So, the equation can be restricted to the reference element using the\n", + "determinant of the Jacobian matrix of the transformation mapping\n", + "$J=\\frac{\\partial x}{\\partial \\xi}=\\frac{\\Delta x}{2}$.\n", + "$$\n", + "J u_t + f(u)_{\\xi} = 0, \\qquad t\\in \\mathbb{R}^+, \\xi\\in [-1,1]\n", + "$$" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## The weak form of the DGSEM\n", + "We consider the so-called discontinuous Galerkin spectral element method (DGSEM) with collocation.\n", + "It results from choosing a nodal DG ansatz using $N+1$ Gauss-Lobatto nodes $\\xi_i$ in $[-1,1]$\n", + "with matching interpolation weights $w_i$, which are used for numerical integration and interpolation with\n", + "the Lagrange polynomial basis $l_i$ of degree $N$. The Lagrange functions are created with those nodes and\n", + "hence fulfil a Kronecker property at the GL nodes.\n", + "The weak formulation of the DGSEM for one element is\n", + "$$\n", + "J \\underline{\\dot{u}}(t) = - M^{-1} B \\underline{f}^* + M^{-1} D^T M \\underline{f}\n", + "$$\n", + "where $\\underline{u}=(u_0, u_1, \\dots, u_N)^T\\in\\mathbb{R}^{N+1}$ is the collected pointwise evaluation\n", + "of $u$ at the discretization nodes and $\\dot{u} = \\partial u / \\partial t = u_t$ is the temporal derivative.\n", + "The nodal values of the flux function $f$ results with collocation in $\\underline{f}$, since\n", + "$\\underline{f}_j=f(\\underline{u}_j)$. Moreover, we got the numerical flux $f^*=f^*(u^-, u^+)$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We will now have a short overview over the operators we used." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The **derivative matrix** $D\\in\\mathbb{R}^{(N+1)\\times (N+1)}$ mimics a spatial derivation on a\n", + "discrete level with $\\underline{f}_x \\approx D \\underline{f}$. It is defined by $D_{ij} = l_j'(\\xi_i)$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The diagonal **mass matrix** $M$ is defined by $M_{ij}=\\langle l_j, l_i\\rangle_N$ with the\n", + "numerical scalar product $\\langle \\cdot, \\cdot\\rangle_N$ defined for functions $f$ and $g$ by\n", + "$$\n", + "\\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.\n", + "$$\n", + "The multiplication by $M$ matches a discrete integration\n", + "$$\n", + " \\int_{-1}^1 f(\\xi) \\underline{l}(\\xi) d\\xi \\approx M \\underline{f},\n", + "$$" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The **boundary matrix** $B=\\text{diag}([-1, 0,..., 0, 1])$ represents an evaluation of a\n", + "function at the boundaries $\\xi_0=-1$ and $\\xi_N=1$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For these operators the following property holds:\n", + "$$\n", + " M D + (M D)^T = B.\n", + "$$\n", + "This is called the summation-by-parts (SBP) property since it mimics integration by parts on a\n", + "discrete level ([Gassner (2013)](https://doi.org/10.1137/120890144))." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The explicit definitions of the operators and the construction of the 1D algorithm can be found\n", + "for instance in the tutorial introduction to DG methods\n", + "or in more detail in [Kopriva (2009)](https://link.springer.com/book/10.1007/978-90-481-2261-5)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This property shows the equivalence between the weak form and the following strong formulation\n", + "of the DGSEM.\n", + "$$\n", + "\\begin{align*}\n", + "J \\underline{\\dot{u}}(t)\n", + "&= - M^{-1} B \\underline{f}^* + M^{-1} D^T M \\underline{f}\\\\[5pt]\n", + "&= - M^{-1} B \\underline{f}^* + M^{-1} (B - MD) \\underline{f}\\\\[5pt]\n", + "&= - M^{-1} B (\\underline{f}^* - \\underline{f}) - D \\underline{f}\n", + "\\end{align*}\n", + "$$\n", + "More information about the equivalence you can find in [Kopriva, Gassner (2010)](https://doi.org/10.1007/s10915-010-9372-3)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## DGSEM with flux differencing\n", + "When using the diagonal SBP property it is possible to rewrite the application of the derivative\n", + "operator $D$ in the calculation of the volume integral into a subcell based finite volume type\n", + "differencing formulation ([Fisher, Carpenter (2013)](https://doi.org/10.1016/j.jcp.2013.06.014)).\n", + "Generalizing\n", + "$$\n", + "(D \\underline{f})_i = \\sum_j D_{i,j} \\underline{f}_j\n", + "= 2\\sum_j \\frac{1}{2} D_{i,j} (\\underline{f}_j + \\underline{f}_i)\n", + "\\eqqcolon 2\\sum_j D_{i,j} f_\\text{central}(u_i, u_j),\n", + "$$\n", + "we replace $D \\underline{f}$ in the strong form by $2D \\underline{f}_{vol}(u^-, u^+)$ with\n", + "the consistent two-point volume flux $f_{vol}$ and receive the DGSEM formulation with flux differencing\n", + "(split form DGSEM) ([Gassner, Winters, Kopriva (2016)](https://doi.org/10.1016/j.jcp.2016.09.013))." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "$$\n", + "\\begin{align*}\n", + "J \\underline{\\dot{u}}(t) &= - M^{-1} B (\\underline{f}^* - \\underline{f}) - 2D \\underline{f}_{vol}(u^-, u^+)\\\\[5pt]\n", + "&= - M^{-1} B (\\underline{f}^* - \\underline{f}_{vol}(\\underline{u}, \\underline{u})) - 2D \\underline{f}_{vol}(u^-, u^+)\\\\[5pt]\n", + "&= - M^{-1} B \\underline{f}_{surface}^* - (2D - M^{-1} B) \\underline{f}_{vol}\\\\[5pt]\n", + "&= - M^{-1} B \\underline{f}_{surface}^* - D_{split} \\underline{f}_{vol}\n", + "\\end{align*}\n", + "$$\n", + "This formulation is in a weak form type formulation and can be implemented by using the derivative\n", + "split matrix $D_{split}=(2D-M^{-1}B)$ and two different fluxes. We divide between the surface\n", + "flux $f=f_{surface}$ used for the numerical flux $f_{surface}^*$ and the already mentioned volume\n", + "flux $f_{vol}$ especially for this formulation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This formulation creates a more stable version of DGSEM, because it fulfils entropy stability.\n", + "Moreover it allows the construction of entropy conserving discretizations without relying on\n", + "exact integration. This is achieved when using a two-point entropy conserving flux function as\n", + "volume flux in the volume flux differencing formulation.\n", + "Then, the numerical surface flux can be used to control the dissipation of the discretization and to\n", + "guarantee decreasing entropy, i.e. entropy stability." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Implementation in Trixi.jl\n", + "Now, we have a look at the implementation of DGSEM with flux differencing with [Trixi.jl](https://github.com/trixi-framework/Trixi.jl)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq, Trixi" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We implement a simulation for the compressible Euler equations in 2D\n", + "$$\n", + "\\partial_t \\begin{pmatrix} \\rho \\\\ \\rho v_1 \\\\ \\rho v_2 \\\\ \\rho e \\end{pmatrix}\n", + "+ \\partial_x \\begin{pmatrix} \\rho v_1 \\\\ \\rho v_1^2 + p \\\\ \\rho v_1 v_2 \\\\ (\\rho e +p) v_1 \\end{pmatrix}\n", + "+ \\partial_y \\begin{pmatrix} \\rho v_2 \\\\ \\rho v_1 v_2 \\\\ \\rho v_2^2 + p \\\\ (\\rho e +p) v_2 \\end{pmatrix}\n", + "= \\begin{pmatrix} 0 \\\\ 0 \\\\ 0 \\\\ 0 \\end{pmatrix}\n", + "$$\n", + "for an ideal gas with ratio of specific heats $\\gamma=1.4$.\n", + "Here, $\\rho$ is the density, $v_1$, $v_2$ the velocities, $e$ the specific total energy and\n", + "$$\n", + "p = (\\gamma - 1) \\left( \\rho e - \\frac{1}{2} \\rho (v_1^2+v_2^2) \\right)\n", + "$$\n", + "the pressure." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "gamma = 1.4\n", + "equations = CompressibleEulerEquations2D(gamma)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As our initial condition we will use a weak blast wave from [Hennemann, Gassner (2020)](https://arxiv.org/abs/2008.12044).\n", + "The primitive variables are defined by\n", + "$$\n", + "\\begin{pmatrix} \\rho \\\\ v_1 \\\\ v_2 \\\\ p \\end{pmatrix}\n", + "= \\begin{pmatrix} 1.0 \\\\ 0.0 \\\\ 0.0 \\\\ 1.0 \\end{pmatrix} \\text{if } \\|x\\|_2 > 0.5,\\;\n", + "\\text{and } \\begin{pmatrix} \\rho \\\\ v_1 \\\\ v_2 \\\\ p \\end{pmatrix}\n", + "= \\begin{pmatrix} 1.1691 \\\\ 0.1882 * \\cos(\\phi) \\\\ 0.1882 * \\sin(\\phi) \\\\ 1.245 \\end{pmatrix} \\text{else}\n", + "$$\n", + "with $\\phi = \\tan^{-1}(\\frac{x_2}{x_1})$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This initial condition is implemented in Trixi.jl under the name `initial_condition_weak_blast_wave`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "initial_condition = initial_condition_weak_blast_wave" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "In Trixi.jl, flux differencing for the volume integral can be implemented with\n", + "`VolumeIntegralFluxDifferencing` using symmetric two-point volume fluxes.\n", + "First, we set up a simulation with the entropy conserving and kinetic energy preserving\n", + "flux `flux_ranocha` by [Hendrik Ranocha (2018)](https://cuvillier.de/en/shop/publications/7743)\n", + "as surface and volume flux." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We will confirm the entropy conservation property numerically." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "volume_flux = flux_ranocha # = f_vol\n", + "solver = DGSEM(polydeg=3, surface_flux=volume_flux,\n", + " volume_integral=VolumeIntegralFluxDifferencing(volume_flux))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we implement Trixi.jl's `mesh`, `semi` and `ode` in a simple framework. For more information please\n", + "have a look at the documentation, the basic tutorial introduction to DG methods\n", + "or some basic elixirs." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "coordinates_min = (-2.0, -2.0)\n", + "coordinates_max = ( 2.0, 2.0)\n", + "mesh = TreeMesh(coordinates_min, coordinates_max,\n", + " initial_refinement_level=5,\n", + " n_cells_max=10_000,\n", + " periodicity=true)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n", + " boundary_conditions=boundary_condition_periodic)\n", + "\n", + "# ODE solvers\n", + "tspan = (0.0, 0.4)\n", + "ode = semidiscretize(semi, tspan);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To analyse the entropy conservation of the approximation, we will use the analysis calllback\n", + "implemented in Trixi. It provides some information about the approximation including the entropy change." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "analysis_callback = AnalysisCallback(semi, interval=100);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We now run the simulation using `flux_ranocha` for both surface and volume flux." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n", + " ode_default_options()..., callback=analysis_callback);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "A look at the change in entropy $\\sum \\partial S/\\partial U \\cdot U_t$ in the analysis callback\n", + "confirms that the flux is entropy conserving since the change is about machine precision." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can plot the approximated solution at the time `t=0.4`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can use for instance the dissipative flux `flux_lax_friedrichs` as surface flux\n", + "to get an entropy stable method." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq, Trixi\n", + "\n", + "gamma = 1.4\n", + "equations = CompressibleEulerEquations2D(gamma)\n", + "\n", + "initial_condition = initial_condition_weak_blast_wave\n", + "\n", + "volume_flux = flux_ranocha # = f_vol\n", + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs,\n", + " volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n", + "\n", + "coordinates_min = (-2.0, -2.0)\n", + "coordinates_max = ( 2.0, 2.0)\n", + "mesh = TreeMesh(coordinates_min, coordinates_max,\n", + " initial_refinement_level=5,\n", + " n_cells_max=10_000,\n", + " periodicity=true)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n", + " boundary_conditions=boundary_condition_periodic)\n", + "\n", + "# ODE solvers\n", + "tspan = (0.0, 0.4)\n", + "ode = semidiscretize(semi, tspan);\n", + "\n", + "analysis_callback = AnalysisCallback(semi, interval=100);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We now run the simulation using the volume flux `flux_ranocha` and surface flux `flux_lax_friedrichs`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6,\n", + " ode_default_options()..., callback=analysis_callback);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The change in entropy confirms the expected entropy stability." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Of course, you can use more than these two fluxes in Trixi. Here, we will give a short list\n", + "of possible fluxes for the compressible Euler equations.\n", + "For the volume flux Trixi.jl provides for example `flux_ranocha`, `flux_shima_etal`,\n", + "`flux_chandrashekar`, `flux_kennedy_gruber`.\n", + "As surface flux you can use all volume fluxes and additionally for instance `flux_lax_friedrichs`,\n", + "`flux_hll`, `flux_hllc`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/adaptive_mesh_refinement.ipynb b/previews/PR1693/tutorials/notebooks/adaptive_mesh_refinement.ipynb new file mode 100644 index 00000000000..ec3892f5dea --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/adaptive_mesh_refinement.ipynb @@ -0,0 +1,410 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 12: Adaptive mesh refinement" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Adaptive mesh refinement (AMR) is a method of adapting the resolution of the numerical method\n", + "to the solution features such as turbulent regions or shocks. In those critical regions\n", + "of the domain, we want the simulation to use elements with smaller mesh sizes compared to other\n", + "regions. This should be automatically and dynamically adapted during the run of the simulation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Implementation in Trixi.jl\n", + "In [Trixi.jl](https://github.com/trixi-framework/Trixi.jl), AMR is possible for the mesh types\n", + "`TreeMesh` and `P4estMesh`. Both meshes are organized in a tree structure\n", + "and therefore, each element can be refined independently. In Trixi.jl, AMR is restricted\n", + "to a 2:1 refinement ratio between neighbor elements. This means that the maximum resolution\n", + "difference of neighboring elements is a factor of two." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The implementation of AMR is divided into different steps. The basic refinement setting contains\n", + "an indicator and a controller. These are added to the simulation by using an AMR callback." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Indicators\n", + "An indicator estimates the current accuracy of the numerical approximation. It indicates which regions\n", + "of the domain need finer or coarser resolutions. In Trixi.jl, you can use for instance\n", + "`IndicatorLöhner` and `IndicatorHennemannGassner`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "`IndicatorLöhner` (also callable with `IndicatorLoehner`) is an interpretation and adaptation of\n", + "a FEM indicator by [Löhner (1987)](https://doi.org/10.1016/0045-7825(87)90098-3) and estimates a\n", + "weighted second derivative of a specified variable locally.\n", + "````julia\n", + "amr_indicator = IndicatorLöhner(semi, variable=variable)\n", + "````\n", + "All indicators have the parameter `variable` which is used to specify the variable for the\n", + "indicator calculation. You can use for instance `density`, `pressure` or `density_pressure`\n", + "for the compressible Euler equations. Moreover, you have the option to use simply the first\n", + "conservation variable with `first` for any equations. This might be a good choice for a starting\n", + "example." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "`IndicatorHennemannGassner`, also used as a shock-capturing indicator, was developed by\n", + "[Hennemann et al. (2021)](https://doi.org/10.1016/j.jcp.2020.109935) and is explained in detail\n", + "in the tutorial about shock-capturing. It can be constructed as follows.\n", + "````julia\n", + "amr_indicator = IndicatorHennemannGassner(semi,\n", + " alpha_max=0.5,\n", + " alpha_min=0.001,\n", + " alpha_smooth=true,\n", + " variable=variable)\n", + "````" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Another indicator is the very basic `IndicatorMax`. It indicates the maximal value of a variable\n", + "and is therefore mostly used for verification and testing. But it might be useful for the basic\n", + "understanding of the implementation of indicators and AMR in Trixi.jl.\n", + "````julia\n", + "amr_indicator = IndicatorMax(semi, variable=variable)\n", + "````" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Controllers\n", + "The spatial discretization into elements is tree-based for both AMR supporting mesh types `TreeMesh`\n", + "and `P4estMesh`. Thus, the higher the level in the tree the higher the level of refinement.\n", + "For instance, a mesh element of level `3` has double resolution in each direction compared to\n", + "another element with level `2`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "To map specific indicator values to a desired level of refinement, Trixi.jl uses controllers.\n", + "They are build in three levels: There is a base level of refinement `base_level`, which is the\n", + "minimum allowed refinement level. Then, there is a medium level `med_level`, which corresponds\n", + "to the initial level of refinement, for indicator values above the threshold `med_threshold`\n", + "and equally, a maximal level `max_level` for values above `max_threshold`.\n", + "This variant of controller is called `ControllerThreeLevel` in Trixi.jl.\n", + "````julia\n", + "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", + "````\n", + "You can also set `med_level=0` to use the current level as target, see the docstring of\n", + "`ControllerThreeLevel`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "An extension is `ControllerThreeLevelCombined`, which uses two different indicators.\n", + "The primary indicator works the same as the single indicator for `ControllerThreeLevel`.\n", + "The second indicator with its own maximum threshold adds the property, that the target level is set to\n", + "`max_level` additionally if this indicator's value is greater than `max_threshold_secondary`.\n", + "This is for instance used to assure that a shock has always the maximum refinement level.\n", + "````julia\n", + "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)\n", + "````\n", + "This controller is for instance used in\n", + "[`elixir_euler_astro_jet_amr.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_euler_astro_jet_amr.jl)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Callback\n", + "The AMR indicator and controller are added to the simulation through the callback `AMRCallback`.\n", + "It contains a semidiscretization `semi`, the controller `amr_controller` and the parameters `interval`,\n", + "`adapt_initial_condition`, and `adapt_initial_condition_only_refine`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Adaptive mesh refinement will be performed every `interval` time steps. `adapt_initial_condition` indicates\n", + "whether the initial condition already should be adapted before the first time step. And with\n", + "`adapt_initial_condition_only_refine=true` the mesh is only refined at the beginning but not coarsened.\n", + "````julia\n", + "amr_callback = AMRCallback(semi, amr_controller,\n", + " interval=5,\n", + " adapt_initial_condition=true,\n", + " adapt_initial_condition_only_refine=true)\n", + "````" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Exemplary simulation\n", + "Here, we want to implement a simple AMR simulation of the 2D linear advection equation for a Gaussian pulse." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq\n", + "using Trixi\n", + "\n", + "advection_velocity = (0.2, -0.7)\n", + "equations = LinearScalarAdvectionEquation2D(advection_velocity)\n", + "\n", + "initial_condition = initial_condition_gauss\n", + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n", + "\n", + "coordinates_min = (-5.0, -5.0)\n", + "coordinates_max = ( 5.0, 5.0)\n", + "mesh = TreeMesh(coordinates_min, coordinates_max,\n", + " initial_refinement_level=4,\n", + " n_cells_max=30_000)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n", + "\n", + "\n", + "tspan = (0.0, 10.0)\n", + "ode = semidiscretize(semi, tspan);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "For the best understanding about indicators and controllers, we use the simple AMR indicator\n", + "`IndicatorMax`. As described before, it returns the maximal value of the specified variable\n", + "(here the only conserved variable). Therefore, regions with a high maximum are refined.\n", + "This is not really useful numerical application, but a nice demonstration example." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "amr_indicator = IndicatorMax(semi, variable=first)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "These values are transferred to a refinement level with the `ControllerThreeLevel`, such that\n", + "every element with maximal value greater than `0.1` is refined once and elements with maximum\n", + "above `0.6` are refined twice." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\n", + "amr_callback = AMRCallback(semi, amr_controller,\n", + " interval=5,\n", + " adapt_initial_condition=true,\n", + " adapt_initial_condition_only_refine=true)\n", + "\n", + "stepsize_callback = StepsizeCallback(cfl=0.9)\n", + "\n", + "callbacks = CallbackSet(amr_callback, stepsize_callback);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Running the simulation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We plot the solution and add the refined mesh at the end of the simulation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "pd = PlotData2D(sol)\n", + "plot(pd)\n", + "plot!(getmesh(pd))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "# More examples\n", + "Trixi.jl provides many elixirs using AMR. We want to give some examples for different mesh types:\n", + "- `elixir_euler_blast_wave_amr.jl` for [`TreeMesh`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_euler_blast_wave_amr.jl)\n", + " and [`P4estMesh`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/p4est_2d_dgsem/elixir_euler_blast_wave_amr.jl)\n", + "- [`elixir_euler_kelvin_helmholtz_instability_amr.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_euler_kelvin_helmholtz_instability_amr.jl) for `TreeMesh`\n", + "- [`elixir_euler_double_mach_amr.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/p4est_2d_dgsem/elixir_euler_double_mach_amr.jl) for `P4estMesh`" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Animations of more interesting and complicated AMR simulations can be found below and on Trixi.jl's youtube channel\n", + "[\"Trixi Framework\"](https://www.youtube.com/channel/UCpd92vU2HjjTPup-AIN0pkg)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "First, we give a [purely hyperbolic simulation of a Sedov blast wave with self-gravity](https://www.youtube.com/watch?v=dxgzgteJdOA).\n", + "This simulation uses the mesh type `TreeMesh` as we did and the AMR indicator `IndicatorHennemannGassner`.\n", + "\n", + " \n", + "
\n", + "\n", + "Source: Trixi.jl's YouTube channel [`Trixi Framework`](https://www.youtube.com/channel/UCpd92vU2HjjTPup-AIN0pkg)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The next example is a numerical simulation of an [ideal MHD rotor on an unstructured AMR mesh](https://www.youtube.com/watch?v=Iei7e9oQ0hs).\n", + "The used mesh type is a `P4estMesh`.\n", + "\n", + " \n", + "
\n", + "\n", + "Source: Trixi.jl's YouTube channel [`Trixi Framework`](https://www.youtube.com/channel/UCpd92vU2HjjTPup-AIN0pkg)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For more information, please have a look at the respective links." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/adding_new_parabolic_terms.ipynb b/previews/PR1693/tutorials/notebooks/adding_new_parabolic_terms.ipynb new file mode 100644 index 00000000000..5d9b704f78b --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/adding_new_parabolic_terms.ipynb @@ -0,0 +1,309 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 11: Adding new parabolic terms" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This demo illustrates the steps involved in adding new parabolic terms for the scalar\n", + "advection equation. In particular, we will add an anisotropic diffusion. We begin by\n", + "defining the hyperbolic (advection) part of the advection-diffusion equation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq\n", + "using Trixi\n", + "\n", + "\n", + "advection_velocity = (1.0, 1.0)\n", + "equations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Define a new parabolic equation type\n", + "\n", + "Next, we define a 2D parabolic diffusion term type. This is similar to `LaplaceDiffusion2D`\n", + "except that the `diffusivity` field refers to a spatially constant diffusivity matrix now. Note that\n", + "`ConstantAnisotropicDiffusion2D` has a field for `equations_hyperbolic`. It is useful to have\n", + "information about the hyperbolic system available to the parabolic part so that we can reuse\n", + "functions defined for hyperbolic equations (such as `varnames`)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "struct ConstantAnisotropicDiffusion2D{E, T} <: Trixi.AbstractEquationsParabolic{2, 1}\n", + " diffusivity::T\n", + " equations_hyperbolic::E\n", + "end\n", + "\n", + "varnames(variable_mapping, equations_parabolic::ConstantAnisotropicDiffusion2D) =\n", + " varnames(variable_mapping, equations_parabolic.equations_hyperbolic)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we define the viscous flux function. We assume that the mixed hyperbolic-parabolic system\n", + "is of the form\n", + "$$\n", + "\\partial_t u(t,x) + \\partial_x (f_1(u) - g_1(u, \\nabla u))\n", + " + \\partial_y (f_2(u) - g_2(u, \\nabla u)) = 0\n", + "$$\n", + "where $f_1(u)$, $f_2(u)$ are the hyperbolic fluxes and $g_1(u, \\nabla u)$, $g_2(u, \\nabla u)$ denote\n", + "the viscous fluxes. For anisotropic diffusion, the viscous fluxes are the first and second components\n", + "of the matrix-vector product involving `diffusivity` and the gradient vector.\n", + "\n", + "Here, we specialize the flux to our new parabolic equation type `ConstantAnisotropicDiffusion2D`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Defining boundary conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl's implementation of parabolic terms discretizes both the gradient and divergence\n", + "using weak formulation. In other words, we discretize the system\n", + "$$\n", + "\\begin{aligned}\n", + "\\bm{q} &= \\nabla u \\\\\n", + "\\bm{\\sigma} &= \\begin{pmatrix} g_1(u, \\bm{q}) \\\\ g_2(u, \\bm{q}) \\end{pmatrix} \\\\\n", + "\\text{viscous contribution } &= \\nabla \\cdot \\bm{\\sigma}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Boundary data must be specified for all spatial derivatives, e.g., for both the gradient\n", + "equation $\\bm{q} = \\nabla u$ and the divergence of the viscous flux\n", + "$\\nabla \\cdot \\bm{\\sigma}$. We account for this by introducing internal `Gradient`\n", + "and `Divergence` types which are used to dispatch on each type of boundary condition.\n", + "\n", + "As an example, let us introduce a Dirichlet boundary condition with constant boundary data." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "struct BoundaryConditionConstantDirichlet{T <: Real}\n", + " boundary_value::T\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This boundary condition contains only the field `boundary_value`, which we assume to be some\n", + "real-valued constant which we will impose as the Dirichlet data on the boundary.\n", + "\n", + "Boundary conditions have generally been defined as \"callable structs\" (also known as \"functors\").\n", + "For each boundary condition, we need to specify the appropriate boundary data to return for both\n", + "the `Gradient` and `Divergence`. Since the gradient is operating on the solution `u`, the boundary\n", + "data should be the value of `u`, and we can directly impose Dirichlet data." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "@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\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "While the gradient acts on the solution `u`, the divergence acts on the viscous flux $\\bm{\\sigma}$.\n", + "Thus, we have to supply boundary data for the `Divergence` operator that corresponds to $\\bm{\\sigma}$.\n", + "However, we've already imposed boundary data on `u` for a Dirichlet boundary condition, and imposing\n", + "boundary data for $\\bm{\\sigma}$ might overconstrain our problem.\n", + "\n", + "Thus, for the `Divergence` boundary data under a Dirichlet boundary condition, we simply return\n", + "`flux_inner`, which is boundary data for $\\bm{\\sigma}$ computed using the \"inner\" or interior solution.\n", + "This way, we supply boundary data for the divergence operation without imposing any additional conditions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "@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\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### A note on the choice of gradient variables\n", + "\n", + "It is often simpler to transform the solution variables (and solution gradients) to another set of\n", + "variables prior to computing the viscous fluxes (see `CompressibleNavierStokesDiffusion2D`\n", + "for an example of this). If this is done, then the boundary condition for the `Gradient` operator\n", + "should be modified accordingly as well.\n", + "\n", + "## Putting things together\n", + "\n", + "Finally, we can instantiate our new parabolic equation type, define boundary conditions,\n", + "and run a simulation. The specific anisotropic diffusion matrix we use produces more\n", + "dissipation in the direction $(1, -1)$ as an isotropic diffusion.\n", + "\n", + "For boundary conditions, we impose that $u=1$ on the left wall, $u=2$ on the bottom\n", + "wall, and $u = 0$ on the outflow walls. The initial condition is taken to be $u = 0$.\n", + "Note that we use `BoundaryConditionConstantDirichlet` only for the parabolic boundary\n", + "conditions, since we have not defined its behavior for the hyperbolic part." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi: SMatrix\n", + "diffusivity = 5.0e-2 * SMatrix{2, 2}([2 -1; -1 2])\n", + "equations_parabolic = ConstantAnisotropicDiffusion2D(diffusivity, equations_hyperbolic);\n", + "\n", + "boundary_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", + "\n", + "boundary_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", + "\n", + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n", + "coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))\n", + "coordinates_max = ( 1.0, 1.0) # maximum coordinates (max(x), max(y))\n", + "mesh = 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", + "\n", + "initial_condition = (x, t, equations) -> SVector(0.0)\n", + "\n", + "semi = SemidiscretizationHyperbolicParabolic(mesh,\n", + " (equations_hyperbolic, equations_parabolic),\n", + " initial_condition, solver;\n", + " boundary_conditions=(boundary_conditions_hyperbolic,\n", + " boundary_conditions_parabolic))\n", + "\n", + "tspan = (0.0, 2.0)\n", + "ode = semidiscretize(semi, tspan)\n", + "callbacks = CallbackSet(SummaryCallback())\n", + "time_int_tol = 1.0e-6\n", + "sol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,\n", + " ode_default_options()..., callback=callbacks);\n", + "\n", + "using Plots\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/adding_new_scalar_equations.ipynb b/previews/PR1693/tutorials/notebooks/adding_new_scalar_equations.ipynb new file mode 100644 index 00000000000..69fa50f5d65 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/adding_new_scalar_equations.ipynb @@ -0,0 +1,451 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 8: Adding a new scalar conservation law" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "If you want to use Trixi.jl for your own research, you might be interested in\n", + "a new physics model that's not already included in Trixi.jl. In this tutorial,\n", + "we will implement the cubic conservation law\n", + "$$\n", + "\\partial_t u(t,x) + \\partial_x u(t,x)^3 = 0\n", + "$$\n", + "in a periodic domain in one space dimension. In Trixi.jl, such a mathematical model\n", + "is encoded as a subtype of `Trixi.AbstractEquations`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Basic setup" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi\n", + "\n", + "struct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,\n", + " 1 #= number of primary variables, i.e. scalar =#};\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We create `CubicEquation` as an empty `struct` since we do not use any parameters\n", + "for this equation. Other models could bundle arbitrary parameters, e.g., the\n", + "ideal gas constant for the compressible Euler equations." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Next, we define the physical flux `f(u) = u^3` using the calling structure\n", + "used in Trixi.jl." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "Trixi.flux(u, orientation, equation::CubicEquation) = u.^3\n", + "Trixi.varnames(_, ::CubicEquation) = (\"scalar\",)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "In Trixi.jl, the conserved variables `u` are usually passed as `SVector`s of variables\n", + "at a single physical location. Hence, we must use `u.^3` instead of the scalar\n", + "operation `u^3`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "That's already enough to run a simple simulation with a standard DGSEM discretization\n", + "using the non-dissipative central flux at interfaces." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq\n", + "\n", + "# Create a simulation setup\n", + "equation = CubicEquation()\n", + "\n", + "initial_condition_sine(x, t, equation::CubicEquation) = SVector(sinpi(x[1]))\n", + "\n", + "mesh = TreeMesh(-1.0, 1.0, # min/max coordinates\n", + " initial_refinement_level=4,\n", + " n_cells_max=10^4)\n", + "\n", + "solver = DGSEM(3 #= polynomial degree =#, flux_central)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We wrap the return value of the `initial_condition_sine` inside an `SVector` since that's the approach\n", + "used in Trixi.jl also for systems of equations. We need to index the spatial coordinate `x[1]`,\n", + "since it is an `SVector` with one component. In multiple space dimensions, all spatial coordinates\n", + "are passed together." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Next, we create an `ODEProblem` from the SciML/DifferentialEquations ecosystem.\n", + "We can solve this ODE numerically using any time integration method,\n", + "e.g., `SSPRK43` from [OrdinaryDiffEq.jl](https://github.com/SciML/OrdinaryDiffEq.jl).\n", + "Before, we set up a callback to summarize the simulation setup." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create ODE problem with given time span\n", + "tspan = (0.0, 0.09)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "summary_callback = SummaryCallback()\n", + "callbacks = CallbackSet(summary_callback)\n", + "\n", + "# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks\n", + "sol = solve(ode, SSPRK43();\n", + " ode_default_options()..., callback=callbacks);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "That's it, you ran your first simulation using your new equation with Trixi.jl! Now, we can plot\n", + "the solution at the final time using Plots.jl." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "You can already see that discontinuities will develop and oscillations start to\n", + "occur around steep parts of the wave. That's expected from our central discretization.\n", + "To avoid these issues, we need to use dissipative numerical fluxes (approximate\n", + "Riemann solvers) at interfaces." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Advanced setup" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Thus, we add a Godunov's flux for our cubic equation. That is easy for this equation\n", + "since the wave speed `f'(u) = 3u^2` is always non-negative." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "@inline Trixi.flux_godunov(u_ll, u_rr, orientation, equation::CubicEquation) = flux(u_ll, orientation, equation)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Let's run the example again but with a dissipative numerical flux at interfaces.\n", + "`remake` will recreate the semidiscretization we used before and only change\n", + "selected parameters, in this case the `solver`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# A new setup with dissipation\n", + "semi = remake(semi, solver=DGSEM(3, flux_godunov))\n", + "ode = semidiscretize(semi, tspan)\n", + "sol = solve(ode, SSPRK43(); ode_default_options()...)\n", + "plot!(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "You can see that there are fewer oscillations, in particular around steep edges.\n", + "Now let's increase the final time (and also the spatial resolution)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)\n", + "semi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))\n", + "ode = semidiscretize(semi, (0.0, 0.5) #= tspan =#)\n", + "sol = solve(ode, SSPRK43(); ode_default_options()...)\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "You can observe that nonclassical shocks develop and are stable under grid refinement,\n", + "e.g. for `initial_refinement_level=12`. In this case, these nonclassical shocks\n", + "can be avoided by using an entropy-dissipative semidiscretization. Thus, we need\n", + "to define an entropy-conservative numerical flux" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "@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))\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "and use a `VolumeIntegralFluxDifferencing` instead of the standard\n", + "`VolumeIntegralWeakForm` in the DGSEM." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Let's use a provably entropy-dissipative semidiscretization\n", + "semi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))\n", + "ode = semidiscretize(semi, (0.0, 0.5))\n", + "sol = solve(ode, SSPRK43(); ode_default_options()...);\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Possible next steps could be\n", + "- to define `Trixi.max_abs_speeds(u, equations::CubicEquation) = 3 * u[1]^2`\n", + " to use CFL-based time step control via a `StepsizeCallback`\n", + "- to define quantities of interest like `Trixi.entropy(u, equations::CubicEquation) = u[1]^2`\n", + " and integrate them in a simulation using the `AnalysisCallback`\n", + "- to experiment with shock-capturing volume integrals `VolumeIntegralShockCapturingHG`\n", + " and adaptive mesh refinement `AMRCallback`" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For further reading, Trixi.jl provides another example on adding a scalar equation. In the\n", + "[elixir about the KPP problem](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_kpp.jl),\n", + "the 2D scalar \"KPP equation\" from [Kurganov, Petrova, Popov (2007)](https://doi.org/10.1137/040614189) is\n", + "implemented." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Summary of the code" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "To sum up, here is the complete code that we used (without the callbacks since these create a\n", + "lot of unnecessary output in the doctests of this tutorial).\n", + "In addition, we create the `struct` inside the new module `CubicConservationLaw`. That\n", + "ensures that we can re-create `struct`s defined therein without having to restart Julia." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Define new physics\n", + "module CubicConservationLaw\n", + "\n", + "using Trixi\n", + "\n", + "struct CubicEquation <: Trixi.AbstractEquations{1 #= number of spatial dimensions =#,\n", + " 1 #= number of primary variables, i.e. scalar =#}\n", + "end\n", + "\n", + "@inline Trixi.flux(u, orientation, equation::CubicEquation) = u.^3\n", + "Trixi.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))\n", + "end\n", + "\n", + "end # module\n", + "\n", + "\n", + "# Create a simulation setup\n", + "import .CubicConservationLaw\n", + "using Trixi\n", + "using OrdinaryDiffEq\n", + "using Plots\n", + "\n", + "equation = CubicConservationLaw.CubicEquation()\n", + "\n", + "initial_condition_sine(x, t, equation::CubicConservationLaw.CubicEquation) = SVector(sinpi(x[1]))\n", + "\n", + "mesh = TreeMesh(-1.0, 1.0, # min/max coordinates\n", + " initial_refinement_level=4,\n", + " n_cells_max=10^4)\n", + "\n", + "solver = DGSEM(3 #= polynomial degree =#, flux_central)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n", + "\n", + "# Create ODE problem with given time span\n", + "tspan = (0.0, 0.1)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "# OrdinaryDiffEq's `solve` method evolves the solution in time and executes the passed callbacks\n", + "sol = solve(ode, SSPRK43(); ode_default_options()...)\n", + "plot(sol)\n", + "\n", + "\n", + "# A new setup with dissipation\n", + "semi = remake(semi, solver=DGSEM(3, flux_godunov))\n", + "ode = semidiscretize(semi, tspan)\n", + "sol = solve(ode, SSPRK43(); ode_default_options()...)\n", + "plot!(sol)\n", + "\n", + "\n", + "# A larger final time: Nonclassical shocks develop (you can even increase the refinement to 12)\n", + "semi = remake(semi, mesh=TreeMesh(-1.0, 1.0, initial_refinement_level=8, n_cells_max=10^5))\n", + "ode = semidiscretize(semi, (0.0, 0.5))\n", + "sol = solve(ode, SSPRK43(); ode_default_options()...)\n", + "plot(sol)\n", + "\n", + "\n", + "# Let's use a provably entropy-dissipative semidiscretization\n", + "semi = remake(semi, solver=DGSEM(3, flux_godunov, VolumeIntegralFluxDifferencing(flux_ec)))\n", + "ode = semidiscretize(semi, (0.0, 0.5))\n", + "sol = solve(ode, SSPRK43(); ode_default_options()...)\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/adding_nonconservative_equation.ipynb b/previews/PR1693/tutorials/notebooks/adding_nonconservative_equation.ipynb new file mode 100644 index 00000000000..4079de43271 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/adding_nonconservative_equation.ipynb @@ -0,0 +1,455 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 9: Adding a non-conservative equation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "If you want to use Trixi.jl for your own research, you might be interested in\n", + "a new physics model that is not present in Trixi.jl. In this tutorial,\n", + "we will implement the nonconservative linear advection equation in a periodic domain\n", + "$$\n", + "\\left\\{\n", + "\\begin{aligned}&\\partial_t u(t,x) + a(x) \\partial_x u(t,x) = 0 \\\\\n", + "&u(0,x)=\\sin(x) \\\\\n", + "&u(t,-\\pi)=u(t,\\pi)\n", + "\\end{aligned}\n", + "\\right.\n", + "$$\n", + "where $a(x) = 2 + \\cos(x)$. The analytic solution is\n", + "$$\n", + "u(t,x)=-\\sin \\left(2 \\tan ^{-1}\\left(\\sqrt{3} \\tan \\left(\\frac{\\sqrt{3} t}{2}-\\tan ^{-1}\\left(\\frac{1}{\\sqrt{3}}\\tan \\left(\\frac{x}{2}\\right)\\right)\\right)\\right)\\right)\n", + "$$\n", + "In Trixi.jl, such a mathematical model\n", + "is encoded as a subtype of `Trixi.AbstractEquations`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Basic setup" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Since there is no native support for variable coefficients, we need to transform the PDE to the following system:\n", + "$$\n", + "\\left\\{\n", + "\\begin{aligned}&\\partial_t \\begin{pmatrix}u(t,x)\\\\a(t,x) \\end{pmatrix} +\\begin{pmatrix} a(t,x) \\partial_x u(t,x) \\\\ 0 \\end{pmatrix} = 0 \\\\\n", + "&u(0,x)=\\sin(x) \\\\\n", + "&a(0,x)=2+\\cos(x) \\\\\n", + "&u(t,-\\pi)=u(t,\\pi)\n", + "\\end{aligned}\n", + "\\right.\n", + "$$" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Define new physics\n", + "using Trixi\n", + "using Trixi: AbstractEquations, get_node_vars\n", + "import 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`\n", + "struct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,\n", + " 2 #= two variables (u,a) =#}\n", + "end\n", + "\n", + "varnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = (\"scalar\", \"advection_velocity\")\n", + "\n", + "default_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()\n", + "\n", + "\n", + "# The conservative part of the flux is zero\n", + "flux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)\n", + "\n", + "# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation\n", + "function 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))\n", + "end\n", + "\n", + "\n", + "# We use nonconservative terms\n", + "have_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))\n", + "function 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))\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The implementation of nonconservative terms uses a single \"nonconservative flux\"\n", + "function `flux_nonconservative`. It will basically be applied in a loop of the\n", + "form\n", + "```julia\n", + "du_m(D, u) = sum(D[m, l] * flux_nonconservative(u[m], u[l], 1, equations)) # orientation 1: x\n", + "```\n", + "where `D` is the derivative matrix and `u` contains the nodal solution values." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can run a simple simulation using a DGSEM discretization." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# Create a simulation setup\n", + "using Trixi\n", + "using OrdinaryDiffEq\n", + "\n", + "equation = NonconservativeLinearAdvectionEquation()\n", + "\n", + "# You can derive the exact solution for this setup using the method of\n", + "# characteristics\n", + "function 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)\n", + "end\n", + "\n", + "# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries\n", + "mesh = 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\n", + "volume_flux = (flux_central, flux_nonconservative)\n", + "surface_flux = (flux_lax_friedrichs, flux_nonconservative)\n", + "solver = DGSEM(polydeg=3, surface_flux=surface_flux,\n", + " volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n", + "\n", + "# Setup the spatial semidiscretization containing all ingredients\n", + "semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n", + "\n", + "# Create an ODE problem with given time span\n", + "tspan = (0.0, 1.0)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "# Set up some standard callbacks summarizing the simulation setup and computing\n", + "# errors of the numerical solution\n", + "summary_callback = SummaryCallback()\n", + "analysis_callback = AnalysisCallback(semi, interval=50)\n", + "callbacks = CallbackSet(summary_callback, analysis_callback)\n", + "\n", + "# OrdinaryDiffEq's `solve` method evolves the solution in time and executes\n", + "# the passed callbacks\n", + "sol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n", + " save_everystep=false, callback=callbacks)\n", + "\n", + "# Print the timer summary\n", + "summary_callback()\n", + "\n", + "# Plot the numerical solution at the final time\n", + "using Plots: plot\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "You see a plot of the final solution." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can check whether everything fits together by refining the grid and comparing\n", + "the numerical errors. First, we look at the error using the grid resolution\n", + "above." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "error_1 = analysis_callback(sol).l2 |> first" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we increase the grid resolution by one refinement level and run the\n", + "simulation again." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "mesh = TreeMesh(-Float64(π), Float64(π), # min/max coordinates\n", + " initial_refinement_level=5, n_cells_max=10^4)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n", + "\n", + "tspan = (0.0, 1.0)\n", + "ode = semidiscretize(semi, tspan);\n", + "\n", + "summary_callback = SummaryCallback()\n", + "analysis_callback = AnalysisCallback(semi, interval=50)\n", + "callbacks = CallbackSet(summary_callback, analysis_callback);\n", + "\n", + "sol = solve(ode, Tsit5(), abstol=1.0e-6, reltol=1.0e-6,\n", + " save_everystep=false, callback=callbacks);\n", + "summary_callback()" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "error_2 = analysis_callback(sol).l2 |> first" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "error_1 / error_2" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As expected, the new error is roughly reduced by a factor of 16, corresponding\n", + "to an experimental order of convergence of 4 (for polynomials of degree 3)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Summary of the code" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Here is the complete code that we used (without the callbacks since these\n", + "create a lot of unnecessary output in the doctests of this tutorial).\n", + "In addition, we create the `struct` inside the new module `NonconservativeLinearAdvection`.\n", + "That ensures that we can re-create `struct`s defined therein without having to\n", + "restart Julia." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Define new physics" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "module NonconservativeLinearAdvection\n", + "\n", + "using Trixi\n", + "using Trixi: AbstractEquations, get_node_vars\n", + "import 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`\n", + "struct NonconservativeLinearAdvectionEquation <: AbstractEquations{1 #= spatial dimension =#,\n", + " 2 #= two variables (u,a) =#}\n", + "end\n", + "\n", + "varnames(::typeof(cons2cons), ::NonconservativeLinearAdvectionEquation) = (\"scalar\", \"advection_velocity\")\n", + "\n", + "default_analysis_integrals(::NonconservativeLinearAdvectionEquation) = ()\n", + "\n", + "\n", + "# The conservative part of the flux is zero\n", + "flux(u, orientation, equation::NonconservativeLinearAdvectionEquation) = zero(u)\n", + "\n", + "# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation\n", + "function 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))\n", + "end\n", + "\n", + "\n", + "# We use nonconservative terms\n", + "have_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))\n", + "function 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))\n", + "end\n", + "\n", + "end # module\n", + "\n", + "\n", + "\n", + "# Create a simulation setup\n", + "import .NonconservativeLinearAdvection\n", + "using Trixi\n", + "using OrdinaryDiffEq\n", + "\n", + "equation = NonconservativeLinearAdvection.NonconservativeLinearAdvectionEquation()\n", + "\n", + "# You can derive the exact solution for this setup using the method of\n", + "# characteristics\n", + "function 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)\n", + "end\n", + "\n", + "# Create a uniform mesh in 1D in the interval [-π, π] with periodic boundaries\n", + "mesh = 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\n", + "volume_flux = (flux_central, NonconservativeLinearAdvection.flux_nonconservative)\n", + "surface_flux = (flux_lax_friedrichs, NonconservativeLinearAdvection.flux_nonconservative)\n", + "solver = DGSEM(polydeg=3, surface_flux=surface_flux,\n", + " volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n", + "\n", + "# Setup the spatial semidiscretization containing all ingredients\n", + "semi = SemidiscretizationHyperbolic(mesh, equation, initial_condition_sine, solver)\n", + "\n", + "# Create an ODE problem with given time span\n", + "tspan = (0.0, 1.0)\n", + "ode = semidiscretize(semi, tspan);\n", + "\n", + "# Set up some standard callbacks summarizing the simulation setup and computing\n", + "# errors of the numerical solution\n", + "summary_callback = SummaryCallback()\n", + "analysis_callback = AnalysisCallback(semi, interval=50)\n", + "callbacks = CallbackSet(summary_callback, analysis_callback);\n", + "\n", + "# OrdinaryDiffEq's `solve` method evolves the solution in time and executes\n", + "# the passed callbacks\n", + "sol = 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\n", + "using Plots: plot\n", + "plot(sol);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/custom_semidiscretization.ipynb b/previews/PR1693/tutorials/notebooks/custom_semidiscretization.ipynb new file mode 100644 index 00000000000..f2aa3de1411 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/custom_semidiscretization.ipynb @@ -0,0 +1,673 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 17: Custom semidiscretizations" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "As described in the overview section,\n", + "semidiscretizations are high-level descriptions of spatial discretizations\n", + "in Trixi.jl. Trixi.jl's main focus is on hyperbolic conservation\n", + "laws represented in a `SemidiscretizationHyperbolic`.\n", + "Hyperbolic-parabolic problems based on the advection-diffusion equation or\n", + "the compressible Navier-Stokes equations can be represented in a\n", + "`SemidiscretizationHyperbolicParabolic`. This is described in the\n", + "basic tutorial on parabolic terms and its extension to\n", + "custom parabolic terms.\n", + "In this tutorial, we will describe how these semidiscretizations work and how\n", + "they can be used to create custom semidiscretizations involving also other tasks." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Overview of the right-hand side evaluation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The semidiscretizations provided by Trixi.jl are set up to create `ODEProblem`s from the\n", + "[SciML ecosystem for ordinary differential equations](https://diffeq.sciml.ai/latest/).\n", + "In particular, a spatial semidiscretization can be wrapped in an ODE problem\n", + "using `semidiscretize`, which returns an `ODEProblem`. This `ODEProblem`\n", + "bundles an initial condition, a right-hand side (RHS) function, the time span,\n", + "and possible parameters. The `ODEProblem`s created by Trixi.jl use the semidiscretization\n", + "passed to `semidiscretize` as a parameter.\n", + "For a `SemidiscretizationHyperbolic`, the `ODEProblem` wraps\n", + "`Trixi.rhs!` as ODE RHS.\n", + "For a `SemidiscretizationHyperbolicParabolic`, Trixi.jl\n", + "uses a `SplitODEProblem` combining `Trixi.rhs_parabolic!` for the\n", + "(potentially) stiff part and `Trixi.rhs!` for the other part." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Standard Trixi.jl setup" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "In this tutorial, we will consider the linear advection equation\n", + "with source term\n", + "$$\n", + "\\partial_t u(t,x) + \\partial_x u(t,x) = -\\exp(-t) \\sin\\bigl(\\pi (x - t) \\bigr)\n", + "$$\n", + "with periodic boundary conditions in the domain `[-1, 1]` as a\n", + "model problem.\n", + "The initial condition is\n", + "$$\n", + "u(0,x) = \\sin(\\pi x).\n", + "$$\n", + "The source term results in some damping and the analytical solution\n", + "$$\n", + "u(t,x) = \\exp(-t) \\sin\\bigl(\\pi (x - t) \\bigr).\n", + "$$\n", + "First, we discretize this equation using the standard functionality\n", + "of Trixi.jl." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq, Plots" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The linear scalar advection equation is already implemented in\n", + "Trixi.jl as `LinearScalarAdvectionEquation1D`. We construct\n", + "it with an advection velocity `1.0`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "equations = LinearScalarAdvectionEquation1D(1.0)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we use a standard `DGSEM` solver." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(polydeg = 3)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We create a simple `TreeMesh` in 1D." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "coordinates_min = (-1.0,)\n", + "coordinates_max = (+1.0,)\n", + "mesh = TreeMesh(coordinates_min, coordinates_max;\n", + " initial_refinement_level = 4,\n", + " n_cells_max = 10^4,\n", + " periodicity = true)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We wrap everything in in a semidiscretization and pass the source\n", + "terms as a standard Julia function. Please note that Trixi.jl uses\n", + "`SVector`s from\n", + "[StaticArrays.jl](https://github.com/JuliaArrays/StaticArrays.jl)\n", + "to store the conserved variables `u`. Thus, the return value of the\n", + "source terms must be wrapped in an `SVector` - even if we consider\n", + "just a scalar problem." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "function initial_condition(x, t, equations)\n", + " return SVector(exp(-t) * sinpi(x[1] - t))\n", + "end\n", + "\n", + "function source_terms_standard(u, x, t, equations)\n", + " return -initial_condition(x, t, equations)\n", + "end\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition,\n", + " solver;\n", + " source_terms = source_terms_standard)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can create the `ODEProblem`, solve the resulting ODE\n", + "using a time integration method from\n", + "[OrdinaryDiffEq.jl](https://github.com/SciML/OrdinaryDiffEq.jl),\n", + "and visualize the numerical solution at the final time using\n", + "[Plots.jl](https://github.com/JuliaPlots/Plots.jl)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "tspan = (0.0, 3.0)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "sol = solve(ode, RDPK3SpFSAL49(); ode_default_options()...)\n", + "\n", + "plot(sol; label = \"numerical sol.\", legend = :topright)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We can also plot the analytical solution for comparison.\n", + "Since Trixi.jl uses `SVector`s for the variables, we take their `first`\n", + "(and only) component to get the scalar value for manual plotting." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We can also add the initial condition to the plot." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "plot!(sol.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "You can of course also use some\n", + "[callbacks](https://trixi-framework.github.io/Trixi.jl/stable/callbacks/)\n", + "provided by Trixi.jl as usual." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "summary_callback = SummaryCallback()\n", + "analysis_interval = 100\n", + "analysis_callback = AnalysisCallback(semi; interval = analysis_interval)\n", + "alive_callback = AliveCallback(; analysis_interval)\n", + "callbacks = CallbackSet(summary_callback,\n", + " analysis_callback,\n", + " alive_callback)\n", + "\n", + "sol = solve(ode, RDPK3SpFSAL49();\n", + " ode_default_options()..., callback = callbacks)\n", + "summary_callback()" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Using a custom ODE right-hand side function" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Next, we will solve the same problem but use our own ODE RHS function.\n", + "To demonstrate this, we will artificially create a global variable\n", + "containing the current time of the simulation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "const GLOBAL_TIME = Ref(0.0)\n", + "\n", + "function source_terms_custom(u, x, t, equations)\n", + " t = GLOBAL_TIME[]\n", + " return -initial_condition(x, t, equations)\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we create our own RHS function to update the global time of\n", + "the simulation before calling the RHS function from Trixi.jl." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "function rhs_source_custom!(du_ode, u_ode, semi, t)\n", + " GLOBAL_TIME[] = t\n", + " Trixi.rhs!(du_ode, u_ode, semi, t)\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we create an `ODEProblem` manually copying over the data from\n", + "the one we got from `semidiscretize` earlier." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "ode_source_custom = ODEProblem(rhs_source_custom!,\n", + " ode.u0,\n", + " ode.tspan,\n", + " ode.p #= semi =#)\n", + "sol_source_custom = solve(ode_source_custom, RDPK3SpFSAL49();\n", + " ode_default_options()...)\n", + "\n", + "plot(sol_source_custom; label = \"numerical sol.\")\n", + "let\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)\n", + "end\n", + "plot!(sol_source_custom.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This also works with callbacks as usual." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "summary_callback = SummaryCallback()\n", + "analysis_interval = 100\n", + "analysis_callback = AnalysisCallback(semi; interval = analysis_interval)\n", + "alive_callback = AliveCallback(; analysis_interval)\n", + "callbacks = CallbackSet(summary_callback,\n", + " analysis_callback,\n", + " alive_callback)\n", + "\n", + "sol = solve(ode_source_custom, RDPK3SpFSAL49();\n", + " ode_default_options()..., callback = callbacks)\n", + "summary_callback()" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Setting up a custom semidiscretization" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Using a global constant is of course not really nice from a software\n", + "engineering point of view. Thus, it can often be useful to collect\n", + "additional data in the parameters of the `ODEProblem`. Thus, it is\n", + "time to create our own semidiscretization. Here, we create a small\n", + "wrapper of a standard semidiscretization of Trixi.jl and the current\n", + "global time of the simulation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "struct CustomSemidiscretization{Semi, T} <: Trixi.AbstractSemidiscretization\n", + " semi::Semi\n", + " t::T\n", + "end\n", + "\n", + "semi_custom = CustomSemidiscretization(semi, Ref(0.0))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To get pretty printing in the REPL, you can consider specializing\n", + "\n", + "- `Base.show(io::IO, parameters::CustomSemidiscretization)`\n", + "- `Base.show(io::IO, ::MIME\"text/plain\", parameters::CustomSemidiscretization)`\n", + "\n", + "for your custom semidiscretiation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Next, we create our own source terms that use the global time stored\n", + "in the custom semidiscretiation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We also create a custom ODE RHS to update the current global time\n", + "stored in the custom semidiscretization. We unpack the standard\n", + "semidiscretization created by Trixi.jl and pass it to `Trixi.rhs!`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Finally, we set up an `ODEProblem` and solve it numerically." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "ode_semi_custom = ODEProblem(rhs_semi_custom!,\n", + " ode.u0,\n", + " ode.tspan,\n", + " semi_custom)\n", + "sol_semi_custom = solve(ode_semi_custom, RDPK3SpFSAL49();\n", + " ode_default_options()...)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "If we want to make use of additional functionality provided by\n", + "Trixi.jl, e.g., for plotting, we need to implement a few additional\n", + "specializations. In this case, we forward everything to the standard\n", + "semidiscretization provided by Trixi.jl wrapped in our custom\n", + "semidiscretization." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "Base.ndims(semi::CustomSemidiscretization) = ndims(semi.semi)\n", + "function Trixi.mesh_equations_solver_cache(semi::CustomSemidiscretization)\n", + " Trixi.mesh_equations_solver_cache(semi.semi)\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can plot the numerical solution as usual." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "plot(sol_semi_custom; label = \"numerical sol.\")\n", + "let\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)\n", + "end\n", + "plot!(sol_semi_custom.u[1], semi, label = \"u0\", linestyle = :dot, legend = :topleft)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This also works with many callbacks as usual. However, the\n", + "`AnalysisCallback` requires some special handling since it\n", + "makes use of a performance counter contained in the standard\n", + "semidiscretizations of Trixi.jl to report some\n", + "performance metrics.\n", + "Here, we forward all accesses to the performance counter to the\n", + "wrapped semidiscretization." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Moreover, the `AnalysisCallback` also performs some error\n", + "calculations. We also need to forward them to the wrapped\n", + "semidiscretization." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can work with the callbacks used before as usual." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "summary_callback = SummaryCallback()\n", + "analysis_interval = 100\n", + "analysis_callback = AnalysisCallback(semi_custom;\n", + " interval = analysis_interval)\n", + "alive_callback = AliveCallback(; analysis_interval)\n", + "callbacks = CallbackSet(summary_callback,\n", + " analysis_callback,\n", + " alive_callback)\n", + "\n", + "sol = solve(ode_semi_custom, RDPK3SpFSAL49();\n", + " ode_default_options()..., callback = callbacks)\n", + "summary_callback()" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "For even more advanced usage of custom semidiscretizations, you\n", + "may look at the source code of the ones contained in Trixi.jl, e.g.,\n", + "- `SemidiscretizationHyperbolicParabolic`\n", + "- `SemidiscretizationEulerGravity`\n", + "- `SemidiscretizationEulerAcoustics`\n", + "- `SemidiscretizationCoupled`" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/differentiable_programming.ipynb b/previews/PR1693/tutorials/notebooks/differentiable_programming.ipynb new file mode 100644 index 00000000000..c94a1f3fd04 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/differentiable_programming.ipynb @@ -0,0 +1,956 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 16: Differentiable programming" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "[Julia and its ecosystem provide some tools for differentiable programming](https://sinews.siam.org/Details-Page/scientific-machine-learning-how-julia-employs-differentiable-programming-to-do-it-best).\n", + "Trixi.jl is designed to be flexible, extendable, and composable with Julia's growing ecosystem for\n", + "scientific computing and machine learning. Thus, the ultimate goal is to have fast implementations\n", + "that allow automatic differentiation (AD) without too much hassle for users. If some parts do not\n", + "meet these requirements, please feel free to open an issue or propose a fix in a PR." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "In the following, we will walk through some examples demonstrating how to differentiate through\n", + "Trixi.jl." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Forward mode automatic differentiation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl integrates well with [ForwardDiff.jl](https://github.com/JuliaDiff/ForwardDiff.jl)\n", + "for forward mode AD." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Computing the Jacobian\n", + "The high-level interface to compute the Jacobian this way is `jacobian_ad_forward`.\n", + "First, we load the required packages and compute the Jacobian of a semidiscretization\n", + "of the compressible Euler equations, a system of nonlinear conservation laws." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, LinearAlgebra, Plots\n", + "\n", + "equations = CompressibleEulerEquations2D(1.4)\n", + "\n", + "solver = DGSEM(3, flux_central)\n", + "mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n", + "\n", + "J = jacobian_ad_forward(semi);\n", + "size(J)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we compute the eigenvalues of the Jacobian." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "λ = eigvals(J)\n", + "scatter(real.(λ), imag.(λ), label=\"central flux\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As you can see here, the maximal real part is close to zero." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "relative_maximum = maximum(real, λ) / maximum(abs, λ)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Interestingly, if we add dissipation by switching to the `flux_lax_friedrichs`\n", + "at the interfaces, the maximal real part of the eigenvalues increases." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(3, flux_lax_friedrichs)\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n", + "\n", + "J = jacobian_ad_forward(semi)\n", + "λ = eigvals(J)\n", + "\n", + "scatter!(real.(λ), imag.(λ), label=\"Lax-Friedrichs flux\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Although the maximal real part is still somewhat small, it's larger than for\n", + "the purely central discretization." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "relative_maximum = maximum(real, λ) / maximum(abs, λ)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "However, we should be careful when using this analysis, since the eigenvectors\n", + "are not necessarily well-conditioned." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "λ, V = eigen(J)\n", + "condition_number = cond(V)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "In one space dimension, the situation is a bit different." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "equations = CompressibleEulerEquations1D(1.4)\n", + "\n", + "solver = DGSEM(3, flux_central)\n", + "mesh = TreeMesh((-1.0,), (1.0,), initial_refinement_level=6, n_cells_max=10^5)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n", + "\n", + "J = jacobian_ad_forward(semi)\n", + "\n", + "λ = eigvals(J)\n", + "\n", + "scatter(real.(λ), imag.(λ), label=\"central flux\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Here, the maximal real part is basically zero to machine accuracy." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "relative_maximum = maximum(real, λ) / maximum(abs, λ)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Moreover, the eigenvectors are not as ill-conditioned as in 2D." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "λ, V = eigen(J)\n", + "condition_number = cond(V)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "If we add dissipation, the maximal real part is still approximately zero." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(3, flux_lax_friedrichs)\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n", + "\n", + "J = jacobian_ad_forward(semi)\n", + "λ = eigvals(J)\n", + "\n", + "scatter!(real.(λ), imag.(λ), label=\"Lax-Friedrichs flux\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As you can see from the plot generated above, the maximal real part is still\n", + "basically zero to machine precision." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "relative_maximum = maximum(real, λ) / maximum(abs, λ)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Let's check the condition number of the eigenvectors." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "λ, V = eigen(J)\n", + "\n", + "condition_number = cond(V)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Note that the condition number of the eigenvector matrix increases but is\n", + "still smaller than for the example in 2D." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Computing other derivatives" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "It is also possible to compute derivatives of other dependencies using AD in Trixi.jl. For example,\n", + "you can compute the gradient of an entropy-dissipative semidiscretization with respect to the\n", + "ideal gas constant of the compressible Euler equations as described in the following. This example\n", + "is also available as the elixir\n", + "[`examples/special_elixirs/elixir_euler_ad.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/special_elixirs/elixir_euler_ad.jl)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "First, we create a semidiscretization of the compressible Euler equations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, LinearAlgebra, ForwardDiff\n", + "\n", + "equations = CompressibleEulerEquations2D(1.4)\n", + "\n", + "\"\"\"\n", + " initial_condition_isentropic_vortex(x, t, equations::CompressibleEulerEquations2D)\n", + "\n", + "The 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", + "\"\"\"\n", + "function 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)\n", + "end\n", + "\n", + "mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n", + "\n", + "solver = DGSEM(3, flux_lax_friedrichs, VolumeIntegralFluxDifferencing(flux_ranocha))\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_isentropic_vortex, solver)\n", + "\n", + "u0_ode = Trixi.compute_coefficients(0.0, semi)\n", + "size(u0_ode)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we compute the Jacobian using `ForwardDiff.jacobian`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end, similar(u0_ode), [1.4]); # γ needs to be an `AbstractArray`\n", + "\n", + "round.(extrema(J), sigdigits=2)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Note that we create a semidiscretization `semi` at first to determine the state `u0_ode` around\n", + "which we want to perform the linearization. Next, we wrap the RHS evaluation inside a closure\n", + "and pass that to `ForwardDiff.jacobian`. There, we need to make sure that the internal caches\n", + "are able to store dual numbers from ForwardDiff.jl by setting `uEltype` appropriately. A similar\n", + "approach is used by `jacobian_ad_forward`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Note that the ideal gas constant does not influence the semidiscrete rate of change of the\n", + "density, as demonstrated by" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "norm(J[1:4:end])" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Here, we used some knowledge about the internal memory layout of Trixi.jl, an array of structs\n", + "with the conserved variables as fastest-varying index in memory." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Differentiating through a complete simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "It is also possible to differentiate through a complete simulation. As an example, let's differentiate\n", + "the total energy of a simulation using the linear scalar advection equation with respect to the\n", + "wave number (frequency) of the initial data." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq, ForwardDiff, Plots\n", + "\n", + "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)\n", + "end\n", + "\n", + "k_values = range(0.9, 1.1, length=101)\n", + "\n", + "plot(k_values, energy_at_final_time.(k_values), label=\"Energy\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "You see a plot of a curve that resembles a parabola with local maximum around `k = 1.0`.\n", + "Why's that? Well, the domain is fixed but the wave number changes. Thus, if the wave number is\n", + "not chosen as an integer, the initial condition will not be a smooth periodic function in the\n", + "given domain. Hence, the dissipative surface flux (`flux_lax_friedrichs` in this example)\n", + "will introduce more dissipation. In particular, it will introduce more dissipation for \"less smooth\"\n", + "initial data, corresponding to wave numbers `k` further away from integers." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can compute the discrete derivative of the energy at the final time with respect to the wave\n", + "number `k` as follows." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "round(ForwardDiff.derivative(energy_at_final_time, 1.0), sigdigits=2)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This is rather small and we can treat it as zero in comparison to the value of this derivative at\n", + "other wave numbers `k`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "dk_values = ForwardDiff.derivative.((energy_at_final_time,), k_values);\n", + "\n", + "plot(k_values, dk_values, label=\"Derivative\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "If you remember basic calculus, a sufficient condition for a local maximum is that the first derivative\n", + "vanishes and the second derivative is negative. We can also check this discretely." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "second_derivative = round(ForwardDiff.derivative(\n", + " k -> Trixi.ForwardDiff.derivative(energy_at_final_time, k), 1.0),\n", + " sigdigits=2)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Having seen this application, let's break down what happens step by step." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end\n", + "\n", + "k = 1.0\n", + "round(ForwardDiff.derivative(energy_at_final_time, k), sigdigits=2)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "When calling `ForwardDiff.derivative(energy_at_final_time, k)` with `k=1.0`, ForwardDiff.jl\n", + "will basically use the chain rule and known derivatives of existing basic functions\n", + "to calculate the derivative of the energy at the final time with respect to the\n", + "wave number `k` at `k0 = 1.0`. To do this, ForwardDiff.jl uses dual numbers, which\n", + "basically store the result and its derivative w.r.t. a specified parameter at the\n", + "same time. Thus, we need to make sure that we can treat these `ForwardDiff.Dual`\n", + "numbers everywhere during the computation. Fortunately, generic Julia code usually\n", + "supports these operations. The most basic problem for a developer is to ensure\n", + "that all types are generic enough, in particular the ones of internal caches." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The first step in this example creates some basic ingredients of our simulation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "These do not have internal caches storing intermediate values of the numerical\n", + "solution, so we do not need to adapt them. In fact, we could also define them\n", + "outside of `energy_at_final_time` (but would need to take care of globals or\n", + "wrap everything in another function)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Next, we define the initial condition" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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;" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "as a closure capturing the wave number `k` passed to `energy_at_final_time`.\n", + "If you call `energy_at_final_time(1.0)`, `k` will be a `Float64`. Thus, the\n", + "return values of `initial_condition` will be `SVector`s of `Float64`s. When\n", + "calculating the `ForwardDiff.derivative`, `k` will be a `ForwardDiff.Dual` number.\n", + "Hence, the `initial_condition` will return `SVector`s of `ForwardDiff.Dual`\n", + "numbers." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The semidiscretization `semi` uses some internal caches to avoid repeated allocations\n", + "and speed up the computations, e.g. for numerical fluxes at interfaces. Thus, we\n", + "need to tell Trixi.jl to allow `ForwardDiff.Dual` numbers in these caches. That's what\n", + "the keyword argument `uEltype=typeof(k)` in" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n", + " uEltype=typeof(k));" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "does. This is basically the only part where you need to modify your standard Trixi.jl\n", + "code to enable automatic differentiation. From there on, the remaining steps" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "ode = semidiscretize(semi, (0.0, 1.0))\n", + "sol = solve(ode, BS3(), save_everystep=false)\n", + "round(Trixi.integrate(energy_total, sol.u[end], semi), sigdigits=5)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "do not need any modifications since they are sufficiently generic (and enough effort\n", + "has been spend to allow general types inside these calls)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Propagating errors using Measurements.jl" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "[![Error bars by Randall Munroe](https://imgs.xkcd.com/comics/error_bars.png)](https://xkcd.com/2110/)\n", + "\"Error bars\" by Randall Munroe, linked from https://xkcd.com/2110" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Similar to AD, Trixi.jl also allows propagating uncertainties using linear error propagation\n", + "theory via [Measurements.jl](https://github.com/JuliaPhysics/Measurements.jl).\n", + "As an example, let's create a system representing the linear advection equation\n", + "in 1D with an uncertain velocity. Then, we create a semidiscretization using a\n", + "sine wave as initial condition, solve the ODE, and plot the resulting uncertainties\n", + "in the primitive variables." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq, Measurements, Plots, LaTeXStrings\n", + "\n", + "equations = LinearScalarAdvectionEquation1D(1.0 ± 0.1)\n", + "\n", + "mesh = TreeMesh((-1.0,), (1.0,), n_cells_max=10^5, initial_refinement_level=5)\n", + "\n", + "solver = DGSEM(3)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test,\n", + " solver, uEltype=Measurement{Float64})\n", + "\n", + "ode = semidiscretize(semi, (0.0, 1.5))\n", + "\n", + "sol = solve(ode, BS3(), save_everystep=false);\n", + "\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "You should see a plot where small error bars are shown around the extrema\n", + "and larger error bars are shown in the remaining parts.\n", + "This result is in accordance with expectations. Indeed, the uncertain propagation\n", + "speed will affect the extrema less since the local variation of the solution is\n", + "relatively small there. In contrast, the local variation of the solution is large\n", + "around the turning points of the sine wave, so the uncertainties will be relatively\n", + "large there." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "All this is possible due to allowing generic types and having good abstractions\n", + "in Julia that allow packages to work together seamlessly." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Finite difference approximations" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl provides the convenience function `jacobian_fd` to approximate the Jacobian\n", + "via central finite differences." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, LinearAlgebra\n", + "\n", + "equations = CompressibleEulerEquations2D(1.4)\n", + "\n", + "solver = DGSEM(3, flux_central)\n", + "\n", + "mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_density_wave, solver)\n", + "\n", + "J_fd = jacobian_fd(semi)\n", + "\n", + "J_ad = jacobian_ad_forward(semi)\n", + "\n", + "relative_difference = norm(J_fd - J_ad) / size(J_fd, 1)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This discrepancy is of the expected order of magnitude for central finite difference approximations." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Linear systems" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "When a linear PDE is discretized using a linear scheme such as a standard DG method,\n", + "the resulting semidiscretization yields an affine ODE of the form" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "$$\n", + "\\partial_t u(t) = A u(t) + b,\n", + "$$" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "where `A` is a linear operator (\"matrix\") and `b` is a vector. Trixi.jl allows you\n", + "to obtain this linear structure in a matrix-free way by using `linear_structure`.\n", + "The resulting operator `A` can be used in multiplication, e.g. `mul!` from\n", + "LinearAlgebra, converted to a sparse matrix using `sparse` from SparseArrays,\n", + "or converted to a dense matrix using `Matrix` for detailed eigenvalue analyses.\n", + "For example," + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, LinearAlgebra, Plots\n", + "\n", + "equations = LinearScalarAdvectionEquation2D(1.0, -0.3)\n", + "\n", + "solver = DGSEM(3, flux_lax_friedrichs)\n", + "\n", + "mesh = TreeMesh((-1.0, -1.0), (1.0, 1.0), initial_refinement_level=2, n_cells_max=10^5)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, solver)\n", + "\n", + "A, b = linear_structure(semi)\n", + "\n", + "size(A), size(b)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we compute the eigenvalues of the linear operator." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "λ = eigvals(Matrix(A))\n", + "\n", + "scatter(real.(λ), imag.(λ))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As you can see here, the maximal real part is close to machine precision." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "λ = eigvals(Matrix(A))\n", + "relative_maximum = maximum(real, λ) / maximum(abs, λ)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\", \"ForwardDiff\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/hohqmesh_tutorial.ipynb b/previews/PR1693/tutorials/notebooks/hohqmesh_tutorial.ipynb new file mode 100644 index 00000000000..34e3ce63a0e --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/hohqmesh_tutorial.ipynb @@ -0,0 +1,1034 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 14: Unstructured meshes with HOHQMesh.jl" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl supports numerical approximations on unstructured quadrilateral meshes\n", + "with the `UnstructuredMesh2D` mesh type." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The purpose of this tutorial is to demonstrate how to use the `UnstructuredMesh2D`\n", + "functionality of Trixi.jl. This begins by running and visualizing an available unstructured\n", + "quadrilateral mesh example. Then, the tutorial will demonstrate how to\n", + "conceptualize a problem with curved boundaries, generate\n", + "a curvilinear mesh using the available software in the Trixi.jl ecosystem,\n", + "and then run a simulation using Trixi.jl on said mesh." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Unstructured quadrilateral meshes can be made\n", + "with the [High-Order Hex-Quad Mesh (HOHQMesh) generator](https://github.com/trixi-framework/HOHQMesh)\n", + "created and developed by David Kopriva.\n", + "HOHQMesh is a mesh generator specifically designed for spectral element methods.\n", + "It provides high-order boundary curve information (needed to accurately set boundary conditions)\n", + "and elements can be larger (due to the high accuracy of the spatial approximation)\n", + "compared to traditional finite element mesh generators.\n", + "For more information about the design and features of HOHQMesh one can refer to its\n", + "[official documentation](https://trixi-framework.github.io/HOHQMesh/)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "HOHQMesh is incorporated into the Trixi.jl framework via the registered Julia package\n", + "[HOHQMesh.jl](https://github.com/trixi-framework/HOHQMesh.jl).\n", + "This package provides a Julia wrapper for the HOHQMesh generator that allows users to easily create mesh\n", + "files without the need to build HOHQMesh from source. To install the HOHQMesh package execute\n", + "```julia\n", + "import Pkg; Pkg.add(\"HOHQMesh\")\n", + "```\n", + "Now we are ready to generate an unstructured quadrilateral mesh that can be used by Trixi.jl." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Running and visualizing an unstructured simulation" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl supports solving hyperbolic problems on several mesh types.\n", + "There is a default example for this mesh type that can be executed by" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi\n", + "trixi_include(default_example_unstructured())" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "This will compute a smooth, manufactured solution test case for the 2D compressible Euler equations\n", + "on the curved quadrilateral mesh described in the\n", + "[Trixi.jl documentation](https://trixi-framework.github.io/Trixi.jl/stable/meshes/unstructured_quad_mesh/)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Apart from the usual error and timing output provided by the Trixi.jl run, it is useful to visualize and inspect\n", + "the solution. One option available in the Trixi.jl framework to visualize the solution on\n", + "unstructured quadrilateral meshes is post-processing the\n", + "Trixi.jl output file(s) with the [`Trixi2Vtk`](https://github.com/trixi-framework/Trixi2Vtk.jl) tool\n", + "and plotting them with [ParaView](https://www.paraview.org/download/)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "To convert the HDF5-formatted `.h5` output file(s) from Trixi.jl into VTK format execute the following" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi2Vtk\n", + "trixi2vtk(\"out/solution_000180.h5\", output_directory=\"out\")" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Note this step takes about 15-30 seconds as the package `Trixi2Vtk` must be precompiled and executed for the first time\n", + "in your REPL session. The `trixi2vtk` command above will convert the solution file at the final time into a `.vtu` file\n", + "which can be read in and visualized with ParaView. Optional arguments for `trixi2vtk` are: (1) Pointing to the `output_directory`\n", + "where the new files will be saved; it defaults to the current directory. (2) Specifying a higher number of\n", + "visualization nodes. For instance, if we want to use 12 uniformly spaced nodes for visualization we can execute" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "trixi2vtk(\"out/solution_000180.h5\", output_directory=\"out\", nvisnodes=12)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "By default `trixi2vtk` sets `nvisnodes` to be the same as the number of nodes specified in\n", + "the `elixir` file used to run the simulation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Finally, if you want to convert all the solution files to VTK execute" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "trixi2vtk(\"out/solution_000*.h5\", output_directory=\"out\", nvisnodes=12)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "then it is possible to open the `.pvd` file with ParaView and create a video of the simulation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Creating a mesh using HOHQMesh" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The creation of an unstructured quadrilateral mesh using HOHQMesh.jl is driven by a **control file**. In this file the user dictates\n", + "the domain to be meshed, prescribes any desired boundary curvature, the polynomial order of said boundaries, etc.\n", + "In this tutorial we cover several basic features of the possible control inputs. For a complete discussion\n", + "on this topic see the [HOHQMesh control file documentation](https://trixi-framework.github.io/HOHQMesh/the-control-file/)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "To begin, we provide a complete control file in this tutorial. After this we give a breakdown\n", + "of the control file components to explain the chosen parameters." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Suppose we want to create a mesh of a domain with straight sided\n", + "outer boundaries and a curvilinear \"ice cream cone\" shaped object at its center." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "![mesh_boundary_cartoon](https://user-images.githubusercontent.com/25242486/129603954-9788500d-bba8-49be-8e6f-7555099dbf7c.png)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The associated `ice_cream_straight_sides.control` file is created below." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\"\"\")\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The first three blocks of information are wrapped within a `CONTROL_INPUT` environment block as they define the\n", + "core components of the quadrilateral mesh that will be generated." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The first block of information in `RUN_PARAMETERS` is\n", + "```\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", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The mesh and plot file names will be the files created by HOHQMesh once successfully executed. The stats file name is\n", + "available if you wish to also save a collection of mesh statistics. For this example it is deactivated.\n", + "These file names given within `RUN_PARAMETERS` **should match** that of the control file, and although this is not required by\n", + "HOHQMesh, it is a useful style convention.\n", + "The mesh file format `ISM-v2` in the format currently required by Trixi.jl. The `polynomial order` prescribes the order\n", + "of an interpolant constructed on the Chebyshev-Gauss-Lobatto nodes that is used to represent any curved boundaries on a particular element.\n", + "The plot file format of `skeleton` means that visualizing the plot file will only draw the element boundaries (and no internal nodes).\n", + "Alternatively, the format can be set to `sem` to visualize the interior nodes of the approximation as well." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The second block of information in `BACKGROUND_GRID` is\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", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This lays a grid of Cartesian elements for the domain beginning at the point `x0` as its bottom-left corner.\n", + "The value of `dx`, which could differ in each direction if desired, controls the step size taken in each Cartesian direction.\n", + "The values in `N` set how many Cartesian box elements are set in each coordinate direction.\n", + "The above parameters define a $16\\times 16$ element square mesh on $[-8,8]^2$.\n", + "Further, this sets up four outer boundaries of the domain that are given the default names: `Top, Left, Bottom, Right`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The third block of information in `SPRING_SMOOTHER` is\n", + "```\n", + "\\begin{SPRING_SMOOTHER}\n", + " smoothing = ON\n", + " smoothing type = LinearAndCrossBarSpring\n", + " number of iterations = 25\n", + "\\end{SPRING_SMOOTHER}\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Once HOHQMesh generates the mesh, a spring-mass-dashpot model is created to smooth the mesh and create \"nicer\" quadrilateral elements.\n", + "The [default parameters of Hooke's law](https://trixi-framework.github.io/HOHQMesh/the-control-input/#the-smoother)\n", + "for the spring-mass-dashpot model have been selected after a fair amount of experimentation across many meshes.\n", + "If you wish to deactivate this feature you can set `smoothing = OFF` (or remove this block from the control file)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "After the `CONTROL_INPUT` environment block comes the `MODEL` environment block. It is here where the user prescribes curved boundary information with either:\n", + "* An `OUTER_BOUNDARY` (covered in the next section of this tutorial).\n", + "* One or more `INNER_BOUNDARIES`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "There are several options to describe the boundary curve data to HOHQMesh like splines or parametric curves." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For the example `ice_cream_straight_sides.control` we define three internal boundaries; two straight-sided and\n", + "one as a circular arc.\n", + "Within the HOHQMesh control input each curve must be assigned to a `CHAIN` as shown below in the complete\n", + "`INNER_BOUNDARIES` block.\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", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "It is important to note there are two `name` quantities one for the `CHAIN` and one for the `PARAMETRIC_EQUATION_CURVE`.\n", + "The name for the `CHAIN` is used internally by HOHQMesh, so if you have multiple `CHAIN`s they **must be given a unique name**.\n", + "The name for the `PARAMETRIC_EQUATION_CURVE` will be printed to the appropriate boundaries within the `.mesh` file produced by\n", + "HOHQMesh." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We create the mesh file `ice_cream_straight_sides.mesh` and its associated file for plotting\n", + "`ice_cream_straight_sides.tec` by using HOHQMesh.jl's function `generate_mesh`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using HOHQMesh\n", + "control_file = joinpath(\"out\", \"ice_cream_straight_sides.control\")\n", + "output = generate_mesh(control_file);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The mesh file `ice_cream_straight_sides.mesh` and its associated file for plotting\n", + "`ice_cream_straight_sides.tec` are placed in the `out` folder.\n", + "The resulting mesh generated by HOHQMesh.jl is given in the following figure." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "![mesh_straight_sides](https://user-images.githubusercontent.com/25242486/129603958-08e4b874-53d5-4511-9a54-6daf4c21edca.png)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We note that Trixi.jl uses the boundary name information from the control file\n", + "to assign boundary conditions in an elixir file.\n", + "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." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Example simulation on `ice_cream_straight_sides.mesh`" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "With this newly generated mesh we are ready to run a Trixi.jl simulation on an unstructured quadrilateral mesh.\n", + "For this we must create a new elixir file." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The elixir file given below creates an initial condition for a\n", + "uniform background flow state with a free stream Mach number of 0.3.\n", + "A focus for this part of the tutorial is to specify the boundary conditions and to construct the new mesh from the\n", + "file that was generated in the previous exercise." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "It is straightforward to set the different boundary\n", + "condition types in an elixir by assigning a particular function to a boundary name inside a\n", + "Julia dictionary, `Dict`, variable. Observe that the names of these boundaries match those provided by HOHQMesh\n", + "either by default, e.g. `Bottom`, or user assigned, e.g. `IceCream`. For this problem setup use\n", + "* Freestream boundary conditions on the four box edges.\n", + "* Free slip wall boundary condition on the interior curved boundaries." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "To construct the unstructured quadrilateral mesh from the HOHQMesh file we point to the appropriate location\n", + "with the variable `mesh_file` and then feed this into the constructor for the `UnstructuredMesh2D` type in Trixi.jl" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "# create the unstructured mesh from your mesh file\n", + "using Trixi\n", + "mesh_file = joinpath(\"out\", \"ice_cream_straight_sides.mesh\")\n", + "mesh = UnstructuredMesh2D(mesh_file);\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The complete elixir file for this simulation example is given below." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq, Trixi\n", + "\n", + "equations = 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)\n", + "end\n", + "\n", + "# initial condition\n", + "initial_condition = uniform_flow_state\n", + "\n", + "# boundary condition types\n", + "boundary_condition_uniform_flow = BoundaryConditionDirichlet(uniform_flow_state)\n", + "\n", + "# boundary condition dictionary\n", + "boundary_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\n", + "volume_flux = flux_ranocha\n", + "solver = DGSEM(polydeg=4, surface_flux=flux_hll,\n", + " volume_integral=VolumeIntegralFluxDifferencing(volume_flux))\n", + "\n", + "# create the unstructured mesh from your mesh file\n", + "mesh_file = joinpath(\"out\", \"ice_cream_straight_sides.mesh\")\n", + "mesh = UnstructuredMesh2D(mesh_file)\n", + "\n", + "# Create semidiscretization with all spatial discretization-related components\n", + "semi = 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\n", + "tspan = (0.0, 2.0)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "\n", + "# Create the callbacks to output solution files and adapt the time step\n", + "summary_callback = SummaryCallback()\n", + "save_solution = SaveSolutionCallback(interval=10,\n", + " save_initial_solution=true,\n", + " save_final_solution=true)\n", + "stepsize_callback = StepsizeCallback(cfl=1.0)\n", + "\n", + "callbacks = CallbackSet(summary_callback, save_solution, stepsize_callback)\n", + "\n", + "# Evolve ODE problem in time using `solve` from OrdinaryDiffEq\n", + "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", + "# print the timer summary\n", + "summary_callback()" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Visualization of the solution is carried out in a similar way as above. That is, one converts the `.h5`\n", + "output files with `trixi2vtk` and then plot the solution in ParaView. An example plot of the pressure\n", + "at the final time is shown below." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "![simulation_straight_sides](https://user-images.githubusercontent.com/25242486/129733926-6ef80676-779b-4f1e-9826-3ebf750cf382.png)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Making a mesh with a curved outer boundary" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Let us modify the mesh from the previous task and place a circular outer boundary instead\n", + "of straight-sided outer boundaries.\n", + "Note, the \"ice cream cone\" shape is still placed at the center of the domain." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We create the new control file `ice_cream_curved_sides.control` file below and will then highlight the\n", + "major differences compared to `ice_cream_straight_sides.control`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\"\"\")\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The first alteration is that we have altered the second block of information\n", + "`BACKGROUND_GRID` within the `CONTROL_INPUT` to be\n", + "```\n", + "\\begin{BACKGROUND_GRID}\n", + " background grid size = [1.0, 1.0, 0.0]\n", + "\\end{BACKGROUND_GRID}\n", + "```\n", + "This mesh control file has an outer boundary that determines the extent of the domain to be meshed.\n", + "Therefore, we only need to supply the `background grid size` to the `BACKGROUND_GRID` control input." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The second alteration is that the `MODEL` now contains information for an `OUTER_BOUNDARY`.\n", + "In this case it is a circle of radius `8` centered at `[0.0, 0.0, 0.0]` written as a set of\n", + "`PARAMETRIC_EQUATION_CURVE`s.\n", + "```\n", + " \\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}\n", + "```\n", + "Just as with the inner boundary curves, we must assign a name to the `OUTER_BOUNDARY`. It will be included\n", + "in the generated `.mesh` file and is used within the Trixi.jl elixir file to set boundary conditions." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Again, we create the `.mesh` and `.tec` files with HOHQMesh.jl's function `generate_mesh`" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "control_file = joinpath(\"out\", \"ice_cream_curved_sides.control\")\n", + "output = generate_mesh(control_file);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The files are placed in the `out` folder." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The resulting mesh generated by HOHQMesh.jl is given in the following figure." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "![mesh_curved_sides](https://user-images.githubusercontent.com/25242486/129603957-6a92618f-9ed8-4072-b6ab-05533bea746a.png)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Running Trixi.jl on `ice_cream_curved_sides.mesh`" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can reuse much of the elixir file to setup the uniform flow over an ice cream cone from the\n", + "previous part of this tutorial. The only component of the elixir file that must be changed is the boundary condition\n", + "dictionary because we now have a boundary named `OuterCircle` instead of four edges of a bounding box." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# boundary condition dictionary\n", + "boundary_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 );" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Also, we must update the construction of the mesh from our new mesh file `ice_cream_curved_sides.mesh` that\n", + "is located in the `out` folder." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# create the unstructured mesh from your mesh file\n", + "mesh_file = joinpath(\"out\", \"ice_cream_curved_sides.mesh\")\n", + "mesh = UnstructuredMesh2D(mesh_file);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We can then post-process the solution file at the final time on the new mesh with `Trixi2Vtk` and visualize with ParaView." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "![simulation_curved_sides](https://user-images.githubusercontent.com/25242486/129733924-778795c1-9119-419a-8b89-bcbe13e33cd7.png)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Setting up a simulation with AMR via `P4estMesh`\n", + "The above explained mesh file format of `ISM-V2` only works with `UnstructuredMesh2D` and so does\n", + "not support AMR. On the other hand, the mesh type `P4estMesh` allows AMR. The mesh\n", + "constructor for the `P4estMesh` imports an unstructured, conforming mesh from an Abaqus mesh file\n", + "(`.inp`)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "As described above, the first block of the HOHQMesh control file contains the parameter\n", + "`mesh file format`. If you set `mesh file format = ABAQUS` instead of `ISM-V2`,\n", + "HOHQMesh.jl's function `generate_mesh` creates an Abaqus mesh file `.inp`.\n", + "```julia\n", + "using HOHQMesh\n", + "control_file = joinpath(\"out\", \"ice_cream_straight_sides.control\")\n", + "output = generate_mesh(control_file);\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Now, you can create a `P4estMesh` from your mesh file. It is described in detail in the\n", + "[P4est-based mesh](https://trixi-framework.github.io/Trixi.jl/stable/meshes/p4est_mesh/#P4est-based-mesh)\n", + "part of the Trixi.jl docs.\n", + "```julia\n", + "using Trixi\n", + "mesh_file = joinpath(\"out\", \"ice_cream_straight_sides.inp\")\n", + "mesh = P4estMesh{2}(mesh_file)\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Since `P4estMesh` supports AMR, we just have to extend the setup from the first example by the\n", + "standard AMR procedure. For more information about AMR in Trixi.jl, see the matching tutorial." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "```julia\n", + "amr_indicator = IndicatorLöhner(semi, variable=density)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "amr_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)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "amr_callback = AMRCallback(semi, amr_controller,\n", + " interval=5,\n", + " adapt_initial_condition=true,\n", + " adapt_initial_condition_only_refine=true)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "callbacks = CallbackSet(..., amr_callback)\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We can then post-process the solution file at the final time on the new mesh with `Trixi2Vtk` and visualize\n", + "with ParaView, see the appropriate [visualization section](https://trixi-framework.github.io/Trixi.jl/stable/visualization/#Trixi2Vtk)\n", + "for details." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "![simulation_straight_sides_p4est_amr](https://user-images.githubusercontent.com/74359358/168049930-8abce6ac-cd47-4d04-b40b-0fa459bbd98d.png)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\", \"Trixi2Vtk\", \"HOHQMesh\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/non_periodic_boundaries.ipynb b/previews/PR1693/tutorials/notebooks/non_periodic_boundaries.ipynb new file mode 100644 index 00000000000..c03614e4c16 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/non_periodic_boundaries.ipynb @@ -0,0 +1,346 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 4: Non-periodic boundaries" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Dirichlet boundary condition\n", + "First, let's look at the Dirichlet boundary condition `BoundaryConditionDirichlet`.\n", + "```julia\n", + "BoundaryConditionDirichlet(boundary_value_function)\n", + "```\n", + "In Trixi.jl, this creates a Dirichlet boundary condition where the function `boundary_value_function`\n", + "is used to set the values at the boundary. It can be used to create a boundary condition that sets\n", + "exact boundary values by passing the exact solution of the equation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "It is important to note that standard Dirichlet boundary conditions for hyperbolic PDEs do not\n", + "make sense in most cases. However, we are using a special weak form of the Dirichlet boundary\n", + "condition, based on the application of the numerical surface flux. The numerical surface flux\n", + "takes the solution value from inside the domain and the prescribed value of the outer boundary\n", + "state as arguments, and solves an approximate Riemann problem to introduce dissipation (and\n", + "hence stabilization) at the boundary. Hence, the performance of the Dirichlet BC depends on the\n", + "fidelity of the numerical surface flux." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The passed boundary value function is called with the same arguments as an initial condition\n", + "function, i.e.\n", + "```julia\n", + "boundary_value_function(x, t, equations)\n", + "```\n", + "where `x` specifies the spatial coordinates, `t` is the current time, and `equations` is the\n", + "corresponding system of equations." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We want to give a short example for a simulation with such a Dirichlet BC." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Consider the one-dimensional linear advection equation with domain $\\Omega=[0, 2]$ and a constant\n", + "zero initial condition." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq, Trixi\n", + "\n", + "advection_velocity = 1.0\n", + "equations = LinearScalarAdvectionEquation1D(advection_velocity)\n", + "\n", + "initial_condition_zero(x, t, equation::LinearScalarAdvectionEquation1D) = SVector(0.0)\n", + "initial_condition = initial_condition_zero\n", + "\n", + "using Plots\n", + "plot(x -> sum(initial_condition(x, 0.0, equations)), label=\"initial condition\", ylim=(-1.5, 1.5))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Using an advection velocity of `1.0` and the (local) Lax-Friedrichs/Rusanov flux\n", + "`FluxLaxFriedrichs` as a numerical surface flux, we are able to create an inflow boundary\n", + "on the left and an outflow boundary on the right, as the Lax-Friedrichs flux is in this case an\n", + "exact characteristics Riemann solver. We note that for more complex PDEs different strategies for\n", + "inflow/outflow boundaries are necessary. To define the inflow values, we initialize a `boundary_value_function`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end\n", + "boundary_condition = boundary_condition_sine_sector" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We set the BC in negative and positive x-direction." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "boundary_conditions = (x_neg=BoundaryConditionDirichlet(boundary_condition),\n", + " x_pos=BoundaryConditionDirichlet(boundary_condition))" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n", + "\n", + "coordinates_min = (0.0,)\n", + "coordinates_max = (2.0,)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "For the mesh type `TreeMesh` the parameter `periodicity` must be set to `false` in the\n", + "corresponding direction." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "mesh = TreeMesh(coordinates_min, coordinates_max,\n", + " initial_refinement_level=4,\n", + " n_cells_max=10_000,\n", + " periodicity=false)\n", + "\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations,\n", + " initial_condition,\n", + " solver,\n", + " boundary_conditions=boundary_conditions)\n", + "\n", + "tspan = (0.0, 6.0)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "analysis_callback = AnalysisCallback(semi, interval=100,)\n", + "\n", + "stepsize_callback = StepsizeCallback(cfl=0.9)\n", + "\n", + "callbacks = CallbackSet(analysis_callback,\n", + " stepsize_callback);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We define some equidistant nodes for the visualization" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "visnodes = range(tspan[1], tspan[2], length=300)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "and run the simulation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\n", + "using 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\")\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "# Other available example elixirs with non-trivial BC\n", + "Moreover, there are other boundary conditions in Trixi.jl. For instance, you can use the slip wall\n", + "boundary condition `boundary_condition_slip_wall`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl provides some interesting examples with different combinations of boundary conditions, e.g.\n", + "using `boundary_condition_slip_wall` and other self-defined boundary conditions using\n", + "`BoundaryConditionDirichlet`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For instance, there is a 2D compressible Euler setup for a Mach 3 wind tunnel flow with a forward\n", + "facing step in the elixir [`elixir_euler_forward_step_amr.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/p4est_2d_dgsem/elixir_euler_forward_step_amr.jl)\n", + "discretized with a `P4estMesh` using adaptive mesh refinement (AMR).\n", + "\n", + " \n", + "
\n", + "\n", + "Source: [`Video`](https://www.youtube.com/watch?v=glAug1aIxio) on Trixi.jl's YouTube channel [`Trixi Framework`](https://www.youtube.com/watch?v=WElqqdMhY4A)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "A double Mach reflection problem for the 2D compressible Euler equations\n", + "[`elixir_euler_double_mach_amr.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/p4est_2d_dgsem/elixir_euler_double_mach_amr.jl)\n", + "exercises a special boundary conditions along the bottom of the domain that is a mixture of\n", + "Dirichlet and slip wall.\n", + "\n", + " \n", + "
\n", + "\n", + "Source: [`Video`](https://www.youtube.com/watch?v=WElqqdMhY4A) on Trixi.jl's YouTube channel [`Trixi Framework`](https://www.youtube.com/watch?v=WElqqdMhY4A)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "A channel flow around a cylinder at Mach 3\n", + "[`elixir_euler_supersonic_cylinder.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/p4est_2d_dgsem/elixir_euler_supersonic_cylinder.jl)\n", + "contains supersonic Mach 3 inflow at the left portion of the domain and supersonic outflow at the\n", + "right portion of the domain. The top and bottom of the channel as well as the cylinder are treated\n", + "as Euler slip wall boundaries.\n", + "\n", + " \n", + "
\n", + "\n", + "Source: [`Video`](https://www.youtube.com/watch?v=w0A9X38cSe4) on Trixi.jl's YouTube channel [`Trixi Framework`](https://www.youtube.com/watch?v=WElqqdMhY4A)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/parabolic_terms.ipynb b/previews/PR1693/tutorials/notebooks/parabolic_terms.ipynb new file mode 100644 index 00000000000..663610ad7ba --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/parabolic_terms.ipynb @@ -0,0 +1,264 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 10: Parabolic terms" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Experimental support for parabolic diffusion terms is available in Trixi.jl.\n", + "This demo illustrates parabolic terms for the advection-diffusion equation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq\n", + "using Trixi" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Splitting a system into hyperbolic and parabolic parts." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For a mixed hyperbolic-parabolic system, we represent the hyperbolic and parabolic\n", + "parts of the system separately. We first define the hyperbolic (advection) part of\n", + "the advection-diffusion equation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "advection_velocity = (1.5, 1.0)\n", + "equations_hyperbolic = LinearScalarAdvectionEquation2D(advection_velocity);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Next, we define the parabolic diffusion term. The constructor requires knowledge of\n", + "`equations_hyperbolic` to be passed in because the `LaplaceDiffusion2D` applies\n", + "diffusion to every variable of the hyperbolic system." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "diffusivity = 5.0e-2\n", + "equations_parabolic = LaplaceDiffusion2D(diffusivity, equations_hyperbolic);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Boundary conditions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "As with the equations, we define boundary conditions separately for the hyperbolic and\n", + "parabolic part of the system. For this example, we impose inflow BCs for the hyperbolic\n", + "system (no condition is imposed on the outflow), and we impose Dirichlet boundary conditions\n", + "for the parabolic equations. Both `BoundaryConditionDirichlet` and `BoundaryConditionNeumann`\n", + "are defined for `LaplaceDiffusion2D`.\n", + "\n", + "The hyperbolic and parabolic boundary conditions are assumed to be consistent with each other." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "boundary_condition_zero_dirichlet = BoundaryConditionDirichlet((x, t, equations) -> SVector(0.0))\n", + "\n", + "boundary_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", + "\n", + "boundary_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);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Defining the solver and mesh" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The process of creating the DG solver and mesh is the same as for a purely\n", + "hyperbolic system of equations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n", + "coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))\n", + "coordinates_max = ( 1.0, 1.0) # maximum coordinates (max(x), max(y))\n", + "mesh = 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", + "\n", + "initial_condition = (x, t, equations) -> SVector(0.0);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Semidiscretizing and solving" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "To semidiscretize a hyperbolic-parabolic system, we create a `SemidiscretizationHyperbolicParabolic`.\n", + "This differs from a `SemidiscretizationHyperbolic` in that we pass in a `Tuple` containing both the\n", + "hyperbolic and parabolic equation, as well as a `Tuple` containing the hyperbolic and parabolic\n", + "boundary conditions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "semi = SemidiscretizationHyperbolicParabolic(mesh,\n", + " (equations_hyperbolic, equations_parabolic),\n", + " initial_condition, solver;\n", + " boundary_conditions=(boundary_conditions_hyperbolic,\n", + " boundary_conditions_parabolic))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The rest of the code is identical to the hyperbolic case. We create a system of ODEs through\n", + "`semidiscretize`, defining callbacks, and then passing the system to OrdinaryDiffEq.jl." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "tspan = (0.0, 1.5)\n", + "ode = semidiscretize(semi, tspan)\n", + "callbacks = CallbackSet(SummaryCallback())\n", + "time_int_tol = 1.0e-6\n", + "sol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,\n", + " ode_default_options()..., callback=callbacks);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We can now visualize the solution, which develops a boundary layer at the outflow boundaries." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/scalar_linear_advection_1d.ipynb b/previews/PR1693/tutorials/notebooks/scalar_linear_advection_1d.ipynb new file mode 100644 index 00000000000..5e821e90cc4 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/scalar_linear_advection_1d.ipynb @@ -0,0 +1,976 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 1: Introduction to DG methods" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This tutorial is about how to set up a simple way to approximate the solution of a hyperbolic partial\n", + "differential equation. First, we will implement a basic and naive algorithm. Then, we will use predefined\n", + "features from [Trixi.jl](https://github.com/trixi-framework/Trixi.jl) to show how you can use Trixi.jl on your own." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We will implement the scalar linear advection equation in 1D with the advection velocity $1$.\n", + "$$\n", + "u_t + u_x = 0,\\; \\text{for} \\;t\\in \\mathbb{R}^+, x\\in\\Omega=[-1,1]\n", + "$$\n", + "We define the domain $\\Omega$ by setting the boundaries." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "coordinates_min = -1.0 # minimum coordinate\n", + "coordinates_max = 1.0 # maximum coordinate" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We assume periodic boundaries and the following initial condition." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "initial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## The discontinuous Galerkin collocation spectral element method (DGSEM)\n", + "### i. Discretization of the physical domain\n", + "To improve precision we want to approximate the solution on small parts of the physical domain.\n", + "So, we split the domain $\\Omega=[-1, 1]$ into elements $Q_l$ of length $dx$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "n_elements = 16 # number of elements\n", + "\n", + "dx = (coordinates_max - coordinates_min) / n_elements # length of one element" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To make the calculation more efficient and storing less information, we transform each element\n", + "$Q_l$ with center point $x_l$ to a reference element $E=[-1, 1]$\n", + "$$\n", + "Q_l=\\Big[x_l-\\frac{dx}{2}, x_l+\\frac{dx}{2}\\Big] \\underset{x(\\xi)}{\\overset{\\xi(x)}{\\rightleftarrows}} [-1, 1].\n", + "$$\n", + "So, for every element the transformation from the reference domain to the physical domain is defined by\n", + "$$\n", + "x(\\xi) = x_l + \\frac{dx}{2} \\xi,\\; \\xi\\in[-1, 1]\n", + "$$\n", + "Therefore,\n", + "$$\n", + "\\begin{align*}\n", + "u &= u(x(\\xi), t) \\\\\n", + "u_x &= u_\\xi \\frac{d\\xi}{dx} \\\\[3pt]\n", + "\\frac{d\\xi}{dx} &= (x_\\xi)^{-1} = \\frac{2}{dx} =: J^{-1}. \\\\\n", + "\\end{align*}\n", + "$$\n", + "Here, $J$ is the Jacobian determinant of the transformation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Using this transformation, we can transform our equation for each element $Q_l$.\n", + "$$\n", + "\\frac{dx}{2} u_t^{Q_l} + u_\\xi^{Q_l} = 0 \\text{, for }t\\in\\mathbb{R}^+,\\; \\xi\\in[-1, 1]\n", + "$$\n", + "Here, $u_t^{Q_l}$ and $u_\\xi^{Q_l}$ denote the time and spatial derivatives of the solution on the element $Q_l$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### ii. Polynomial approach\n", + "Now, we want to approximate the solution in each element $Q_l$ by a polynomial of degree $N$. Since we transformed\n", + "the equation, we can use the same polynomial approach for the reference coordinate $\\xi\\in[-1, 1]$ in every\n", + "physical element $Q_l$. This saves a lot of resources by reducing the amount of calculations needed\n", + "and storing less information." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For DGSEM we choose [Lagrange basis functions](https://en.wikipedia.org/wiki/Lagrange_polynomial)\n", + "$\\{l_j\\}_{j=0}^N$ as our polynomial basis of degree $N$ in $[-1, 1]$.\n", + "The solution in element $Q_l$ can be approximated by\n", + "$$\n", + "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)\n", + "$$\n", + "with $N+1$ coefficients $\\{u_j^{Q_l}\\}_{j=0}^N$.\n", + "By construction the Lagrange basis has some useful advantages. This basis is defined by $N+1$ nodes, which\n", + "fulfill a Kronecker property at the exact same nodes. Let $\\{\\xi_i\\}_{i=0}^N$ be these nodes.\n", + "$$\n", + "l_j(\\xi_i) = \\delta_{i,j} =\n", + "\\begin{cases}\n", + "1, & \\text{if } i=j \\\\\n", + "0, & \\text{else.}\n", + "\\end{cases}\n", + "$$\n", + "Because of this property, the polynomial coefficients are exact the values of $u^{Q_l}$ at the nodes\n", + "$$\n", + "u^{Q_l}(\\xi_i, t) = \\sum_{j=0}^N u_j^{Q_l}(t) \\underbrace{l_j(\\xi_i)}_{=\\delta_{ij}} = u_i^{Q_l}(t).\n", + "$$" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Next, we want to select the nodes $\\{\\xi_i\\}_{i=0}^N$, which we use for the construction of the Lagrange\n", + "polynomials. We choose the $N+1$ Gauss-Lobatto nodes, which are used for the\n", + "[Gaussian-Lobatto quadrature](https://mathworld.wolfram.com/LobattoQuadrature.html).\n", + "These always contain the boundary points at $-1$ and $+1$ and are well suited as interpolation nodes.\n", + "The corresponding weights will be referred to as $\\{w_j\\}_{j=0}^N$.\n", + "In Trixi.jl the basis with Lagrange polynomials on Gauss-Lobatto nodes is already defined." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi\n", + "polydeg = 3 #= polynomial degree = N =#\n", + "basis = LobattoLegendreBasis(polydeg)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The Gauss-Lobatto nodes are" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "nodes = basis.nodes" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "with the corresponding weights" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "weights = basis.weights" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To illustrate how you can integrate using numerical quadrature with this Legendre-Gauss-Lobatto nodes,\n", + "we give an example for $f(x)=x^3$. Since $f$ is of degree $3$, a polynomial interpolation with $N=3$ is exact.\n", + "Therefore, the integral on $[-1, 1]$ can be calculated by\n", + "$$\n", + "\\begin{align*}\n", + "\\int_{-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\n", + "\\end{align*}\n", + "$$\n", + "Let's use our nodes and weights for $N=3$ and plug in" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "integral = sum(nodes.^3 .* weights)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Using this polynomial approach leads to the equation\n", + "$$\n", + "\\frac{dx}{2} \\dot{u}^{Q_l}(\\xi, t) + u^{Q_l}(\\xi, t)' = 0\n", + "$$\n", + "with $\\dot{u}=\\frac{\\partial}{\\partial t}u$ and $u'=\\frac{\\partial}{\\partial x}u$.\n", + "To approximate the solution, we need to get the polynomial coefficients $\\{u_j^{Q_l}\\}_{j=0}^N$\n", + "for every element $Q_l$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "After defining all nodes, we can implement the spatial coordinate $x$ and its initial value $u0$\n", + "for every node." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "x = Matrix{Float64}(undef, length(nodes), n_elements)\n", + "for 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\n", + "end\n", + "\n", + "u0 = initial_condition_sine_wave.(x)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To have a look at the initial sinus curve, we plot it." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Plots\n", + "plot(vec(x), vec(u0), label=\"initial condition\", legend=:topleft)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### iii. Variational formulation\n", + "After defining the equation and initial condition, we want to implement an algorithm to\n", + "approximate the solution." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "From now on, we only write $u$ instead of $u^{Q_l}$ for simplicity, but consider that all the following\n", + "calculation only concern one element.\n", + "Multiplying the new equation with the smooth Lagrange polynomials $\\{l_i\\}_{i=0}^N$ (test functions)\n", + "and integrating over the reference element $E=[-1,1]$, we get the variational formulation of our\n", + "transformed partial differential equation for $i=0,...,N$:\n", + "$$\n", + "\\begin{align*}\n", + "\\int_{-1}^1 \\Big( \\frac{dx}{2} \\dot{u}(\\xi, t) + u'(\\xi, t) \\Big) l_i(\\xi)d\\xi\n", + " &= \\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\n", + "\\end{align*}\n", + "$$" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We deal with the two terms separately. We write $\\int_{-1, N}^1 \\;\\cdot\\; d\\xi$ for the approximation\n", + "of the integral using numerical quadrature with $N+1$ basis points. We use the Gauss-Lobatto nodes\n", + "again. The numerical scalar product $\\langle\\cdot, \\cdot\\rangle_N$ is defined by\n", + "$\\langle f, g\\rangle_N := \\int_{-1, N}^1 f(\\xi) g(\\xi) d\\xi$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "#### Term I:\n", + "In the following calculation we approximate the integral numerically with quadrature on the Gauss-Lobatto\n", + "nodes $\\{\\xi_i\\}_{i=0}^N$ and then use the Kronecker property of the Lagrange polynomials. This approach\n", + "of using the same nodes for the interpolation and quadrature is called collocation.\n", + "$$\n", + "\\begin{align*}\n", + "\\frac{dx}{2} \\int_{-1}^1 \\dot{u}(\\xi, t) l_i(\\xi)d\\xi\n", + "&\\approx \\frac{dx}{2} \\int_{-1, N}^1 \\dot{u}(\\xi, t) l_i(\\xi)d\\xi \\\\\n", + "&= \\frac{dx}{2} \\sum_{k=0}^N \\underbrace{\\dot{u}(\\xi_k, t)}_{=\\dot{u}_k(t)} \\underbrace{l_i(\\xi_k)}_{=\\delta_{k,i}}w_k \\\\\n", + "&= \\frac{dx}{2} \\dot{u}_i(t) w_i\n", + "\\end{align*}\n", + "$$\n", + "We define the Legendre-Gauss-Lobatto (LGL) mass matrix $M$ and by the Kronecker property follows:\n", + "$$\n", + "M_{ij} = \\langle l_j, l_i\\rangle_N = \\delta_{ij} w_j,\\; i,j=0,...,N.\n", + "$$" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using LinearAlgebra\n", + "M = diagm(weights)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can write the integral with this new matrix.\n", + "$$\n", + "\\frac{dx}{2} \\int_{-1, N}^1 \\dot{u}(\\xi, t) \\underline{l}(\\xi)d\\xi = \\frac{dx}{2} M \\underline{\\dot{u}}(t),\n", + "$$\n", + "where $\\underline{\\dot{u}} = (\\dot{u}_0, ..., \\dot{u}_N)^T$ and $\\underline{l}$ respectively." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** Since the LGL quadrature with $N+1$ nodes is exact up to functions of degree $2N-1$ and\n", + "$\\dot{u}(\\xi, t) l_i(\\xi)$ is of degree $2N$, in general the following holds\n", + "$$\n", + "\\int_{-1}^1 \\dot{u}(\\xi, t) l_i(\\xi) d\\xi \\neq \\int_{-1, N}^1 \\dot{u}(\\xi, t) l_i(\\xi) d\\xi.\n", + "$$\n", + "With an exact integration the mass matrix would be dense. Choosing numerical integrating and quadrature\n", + "with the exact same nodes (collocation) leads to the sparse and diagonal mass matrix $M$. This\n", + "is called mass lumping and has the big advantage of an easy invertation of the matrix." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "#### Term II:\n", + "We use spatial partial integration for the second term:\n", + "$$\n", + "\\int_{-1}^1 u'(\\xi, t) l_i(\\xi) d\\xi = [u l_i]_{-1}^1 - \\int_{-1}^1 u l_i'd\\xi\n", + "$$\n", + "The resulting integral can be solved exactly with LGL quadrature since the polynomial is now\n", + "of degree $2N-1$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Again, we split the calculation in two steps." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "#### Surface term\n", + "As mentioned before, we approximate the solution with a polynomial in every element. Therefore, in\n", + "general the value of this approximation at the interfaces between two elements is not unique. To solve\n", + "this problem we introduce the idea of the numerical flux $u^*$, which will give an exact value at\n", + "the interfaces. One of many different approaches and definitions for the calculation of the\n", + "numerical flux we will deal with in 4. Numerical flux.\n", + "$$\n", + "[u l_i]_{-1}^1 = u^*\\big|^1 l_i(+1) - u^*\\big|_{-1} l_i(-1)\n", + "$$\n", + "Since the Gauss-Lobatto nodes contain the element boundaries $-1$ and $+1$, we can use the\n", + "Kronecker property of $l_i$ for the calculation of $l_i(-1)$ and $l_i(+1)$.\n", + "$$\n", + "[u \\underline{l}]_{-1}^1 = u^*\\big|^1 \\left(\\begin{array}{c} 0 \\\\ \\vdots \\\\ 0 \\\\ 1 \\end{array}\\right)\n", + "- u^*\\big|_{-1} \\left(\\begin{array}{c} 1 \\\\ 0 \\\\ \\vdots \\\\ 0\\end{array}\\right)\n", + "= B \\underline{u}^*(t)\n", + "$$\n", + "with the boundary matrix\n", + "$$\n", + "B = \\begin{pmatrix}\n", + "-1 & 0 & \\cdots & 0\\\\\n", + "0 & 0 & \\cdots & 0\\\\\n", + "\\vdots & \\vdots & 0 & 0\\\\\n", + "0 & \\cdots & 0 & 1\n", + "\\end{pmatrix}\n", + "\\qquad\\text{and}\\qquad\n", + "\\underline{u}^*(t) = \\left(\\begin{array}{c} u^*\\big|_{-1} \\\\ 0 \\\\ \\vdots \\\\ 0 \\\\ u^*\\big|^1\\end{array}\\right).\n", + "$$" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "B = diagm([-1; zeros(polydeg - 1); 1])" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "#### Volume term\n", + "As mentioned before, the new integral can be solved exact since the function inside is of degree $2N-1$.\n", + "$$\n", + "- \\int_{-1}^1 u l_i'd\\xi = - \\int_{-1, N}^1 u l_i' d\\xi\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\n", + "$$\n", + "where $D$ is the derivative matrix defined by $D_{ki} = l_i'(\\xi_k)$ for $i,k=0,...,N$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "D = basis.derivative_matrix" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "To show why this matrix is called the derivative matrix, we go back to our example $f(x)=x^3$.\n", + "We calculate the derivation of $f$ at the Gauss-Lobatto nodes $\\{\\xi_k\\}_{k=0}^N$ with $N=8$.\n", + "$$\n", + "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}\n", + "$$\n", + "for $k=0,...,N$ and therefore, $\\underline{f}' = D \\underline{f}$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "basis_N8 = LobattoLegendreBasis(8)\n", + "plot(vec(x), x -> 3 * x^2, label=\"f'\", lw=2)\n", + "scatter!(basis_N8.nodes, basis_N8.derivative_matrix * basis_N8.nodes.^3, label=\"Df\", lw=3)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Combining the volume term for every $i=0,...,N$ results in\n", + "$$\n", + "\\int_{-1}^1 u \\underline{l'} d\\xi = - D^T M \\underline{u}(t)\n", + "$$" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Putting all parts together we get the following equation for the element $Q_l$\n", + "$$\n", + "\\frac{dx}{2} M \\underline{\\dot{u}}(t) = - B \\underline{u}^*(t) + D^T M \\underline{u}(t)\n", + "$$\n", + "or equivalent\n", + "$$\n", + "\\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].\n", + "$$\n", + "This is called the weak form of the DGSEM." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** For every element $Q_l$ we get a system of $N+1$ ordinary differential equations to\n", + "calculate $N+1$ coefficients. Since the numerical flux $u^*$ is depending on extern values at\n", + "the interfaces, the equation systems of adjacent elements are weakly linked." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### iv. Numerical flux\n", + "As mentioned above, we still have to handle the problem of different values at the same point at\n", + "the interfaces. This happens with the ideas of the numerical flux $f^*(u)=u^*$. The role of $f^*$\n", + "might seem minor in this simple example, but is important for more complicated problems.\n", + "There are two values at the same spatial coordinate. Let's say we are looking at the interface between\n", + "the elements $Q_l$ and $Q_{l+1}$, while both elements got $N+1$ nodes as defined before. We call\n", + "the first value of the right element $u_R=u_0^{Q_{l+1}}$ and the last one of the left element\n", + "$u_L=u_N^{Q_l}$. So, for the value of the numerical flux on that interface the following holds\n", + "$$\n", + "u^* = u^*(u_L, u_R).\n", + "$$\n", + "These values are interpreted as start values of a so-called Riemann problem. There are many\n", + "different (approximate) Riemann solvers available and useful for different problems. We will\n", + "use the local Lax-Friedrichs flux." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "surface_flux = flux_lax_friedrichs" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The only missing ingredient is the flux calculation at the boundaries $-1$ and $+1$.\n", + "$$\n", + "u^{{Q_{first}}^*}\\big|_{-1} = u^{{Q_{first}}^*}\\big|_{-1}(u^{bound}(-1), u_R)\n", + "\\quad\\text{and}\\quad\n", + "u^{{Q_{last}}^*}\\big|^1 = u^{{Q_{last}}^*}\\big|^1(u_L, u^{bound}(1))\n", + "$$\n", + "The boundaries are periodic, which means that the last value of the last element $u^{Q_{last}}_N$\n", + "is used as $u_L$ at the first interface and accordingly for the other boundary." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Now, we implement a function, that calculates $\\underline{\\dot{u}}^{Q_l}$ for the given matrices,\n", + "$\\underline{u}$ and $\\underline{u}^*$." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Combining all definitions and the function that calculates the right-hand side, we define the ODE and\n", + "solve it until `t=2` with OrdinaryDiffEq's `solve` function and the Runge-Kutta method `RDPK3SpFSAL49()`,\n", + "which is optimized for discontinuous Galerkin methods and hyperbolic PDEs. We set some common\n", + "error tolerances `abstol=1.0e-6, reltol=1.0e-6` and pass `save_everystep=false` to avoid saving intermediate\n", + "solution vectors in memory." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq\n", + "tspan = (0.0, 2.0)\n", + "ode = ODEProblem(rhs!, u0, tspan, x)\n", + "\n", + "sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)\n", + "\n", + "plot(vec(x), vec(sol.u[end]), label=\"solution at t=$(tspan[2])\", legend=:topleft, lw=3)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Alternative Implementation based on Trixi.jl\n", + "Now, we implement the same example. But this time, we directly use the functionality that Trixi.jl\n", + "provides." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq, Plots" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "First, define the equation with a advection_velocity of `1`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "advection_velocity = 1.0\n", + "equations = LinearScalarAdvectionEquation1D(advection_velocity)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Then, create a DG solver with polynomial degree = 3 and (local) Lax-Friedrichs/Rusanov flux as surface flux.\n", + "The implementation of the basis and the numerical flux is now already done." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We will now create a mesh with 16 elements for the physical domain `[-1, 1]` with periodic boundaries.\n", + "We use Trixi.jl's standard mesh `TreeMesh`. Since it's limited to hypercube domains, we\n", + "choose `2^4=16` elements. The mesh type supports AMR, that' why `n_cells_max` has to be set, even\n", + "if we don't need AMR here." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "coordinates_min = -1.0 # minimum coordinate\n", + "coordinates_max = 1.0 # maximum coordinate\n", + "mesh = 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)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "A semidiscretization collects data structures and functions for the spatial discretization.\n", + "In Trixi.jl, an initial condition has the following parameter structure and is of the type `SVector`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "initial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Again, combining all definitions and the function that calculates the right-hand side, we define the ODE and\n", + "solve it until `t=2` with OrdinaryDiffEq's `solve` function and the Runge-Kutta method `RDPK3SpFSAL49()`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "tspan = (0.0, 2.0)\n", + "ode_trixi = semidiscretize(semi, tspan)\n", + "\n", + "sol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We add a plot of the new approximated solution to the one calculated before." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "plot!(sol_trixi, label=\"solution at t=$(tspan[2]) with Trixi.jl\", legend=:topleft, linestyle=:dash, lw=2)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Summary of the code\n", + "To sum up, here is the complete code that we used." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Raw implementation" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "# basis: Legendre-Gauss-Lobatto\n", + "using Trixi, LinearAlgebra, OrdinaryDiffEq, Plots\n", + "polydeg = 3 #= polynomial degree =#\n", + "basis = LobattoLegendreBasis(polydeg)\n", + "nodes = basis.nodes # Gauss-Lobatto nodes in [-1, 1]\n", + "D = basis.derivative_matrix\n", + "M = diagm(basis.weights) # mass matrix\n", + "B = diagm([-1; zeros(polydeg - 1); 1])\n", + "\n", + "# mesh\n", + "coordinates_min = -1.0 # minimum coordinate\n", + "coordinates_max = 1.0 # maximum coordinate\n", + "n_elements = 16 # number of elements\n", + "\n", + "dx = (coordinates_max - coordinates_min) / n_elements # length of one element\n", + "\n", + "x = Matrix{Float64}(undef, length(nodes), n_elements)\n", + "for 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\n", + "end\n", + "\n", + "# initial condition\n", + "initial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)\n", + "u0 = initial_condition_sine_wave.(x)\n", + "\n", + "plot(vec(x), vec(u0), label=\"initial condition\", legend=:topleft)\n", + "\n", + "# flux Lax-Friedrichs\n", + "surface_flux = flux_lax_friedrichs\n", + "\n", + "# rhs! method\n", + "function 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\n", + "end\n", + "\n", + "# create ODE problem\n", + "tspan = (0.0, 2.0)\n", + "ode = ODEProblem(rhs!, u0, tspan, x)\n", + "\n", + "# solve\n", + "sol = solve(ode, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...)\n", + "\n", + "plot(vec(x), vec(sol.u[end]), label=\"solution at t=$(tspan[2])\", legend=:topleft, lw=3)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "### Alternative Implementation based on Trixi.jl" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi, OrdinaryDiffEq, Plots\n", + "\n", + "# equation with a advection_velocity of `1`.\n", + "advection_velocity = 1.0\n", + "equations = LinearScalarAdvectionEquation1D(advection_velocity)\n", + "\n", + "# create DG solver with flux lax friedrichs and LGL basis\n", + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)\n", + "\n", + "# distretize domain with `TreeMesh`\n", + "coordinates_min = -1.0 # minimum coordinate\n", + "coordinates_max = 1.0 # maximum coordinate\n", + "mesh = 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\n", + "initial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)\n", + "\n", + "# solve\n", + "tspan = (0.0, 2.0)\n", + "ode_trixi = semidiscretize(semi, tspan)\n", + "sol_trixi = solve(ode_trixi, RDPK3SpFSAL49(); abstol=1.0e-6, reltol=1.0e-6, ode_default_options()...);\n", + "\n", + "plot!(sol_trixi, label=\"solution at t=$(tspan[2]) with Trixi.jl\", legend=:topleft, linestyle=:dash, lw=2)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/shock_capturing.ipynb b/previews/PR1693/tutorials/notebooks/shock_capturing.ipynb new file mode 100644 index 00000000000..2453dfff1da --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/shock_capturing.ipynb @@ -0,0 +1,503 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 3: Shock capturing with flux differencing and stage limiter" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This tutorial contains a short summary of the idea of shock capturing for DGSEM with flux differencing\n", + "and its implementation in [Trixi.jl](https://github.com/trixi-framework/Trixi.jl).\n", + "In the second part, an implementation of a positivity preserving limiter is added to the simulation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Shock capturing with flux differencing" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The following rough explanation is on a very basic level. More information about an entropy stable\n", + "shock-capturing strategy for DGSEM discretizations of advection dominated problems, such as the\n", + "compressible Euler equations or the compressible Navier-Stokes equations, can be found in\n", + "[Hennemann et al. (2021)](https://doi.org/10.1016/j.jcp.2020.109935). In\n", + "[Rueda-Ramírez et al. (2021)](https://doi.org/10.1016/j.jcp.2021.110580) you find the extension to\n", + "the systems with non-conservative terms, such as the compressible magnetohydrodynamics (MHD) equations." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The strategy for a shock-capturing method presented by Hennemann et al. is based on a hybrid blending\n", + "of a high-order DG method with a low-order variant. The low-order subcell finite volume (FV) method is created\n", + "directly with the Legendre-Gauss-Lobatto (LGL) nodes already used for the high-order DGSEM.\n", + "Then, the final method is a convex combination with regulating indicator $\\alpha$ of these two methods." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Since the surface integral is equal for both the DG and the subcell FV method, only the volume integral divides\n", + "between the two methods." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This strategy for the volume integral is implemented in Trixi.jl under the name of\n", + "`VolumeIntegralShockCapturingHG` with the three parameters of the indicator and the volume fluxes for\n", + "the DG and the subcell FV method." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Note, that the DG method is based on the flux differencing formulation. Hence, you have to use a\n", + "two-point flux, such as `flux_ranocha`, `flux_shima_etal`, `flux_chandrashekar` or `flux_kennedy_gruber`,\n", + "for the DG volume flux. We would recommend to use the entropy conserving flux `flux_ranocha` by\n", + "[Ranocha (2018)](https://cuvillier.de/en/shop/publications/7743) for the compressible Euler equations.\n", + "````julia\n", + "volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;\n", + " volume_flux_dg=volume_flux_dg,\n", + " volume_flux_fv=volume_flux_fv)\n", + "````" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We now focus on a choice of the shock capturing indicator `indicator_sc`.\n", + "A possible indicator is $\\alpha_{HG}$ presented by Hennemann et al. (p.10), which depends on the\n", + "current approximation with modal coefficients $\\{m_j\\}_{j=0}^N$ of a given `variable`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The indicator is calculated for every DG element by itself. First, we calculate a smooth $\\alpha$ by\n", + "$$\n", + "\\alpha = \\frac{1}{1+\\exp(-\\frac{-s}{\\mathbb{T}}(\\mathbb{E}-\\mathbb{T}))}\n", + "$$\n", + "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)$,\n", + "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$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For computational efficiency, $\\alpha_{min}$ is introduced and used for\n", + "$$\n", + "\\tilde{\\alpha} = \\begin{cases}\n", + "0, & \\text{if } \\alpha<\\alpha_{min}\\\\\n", + "\\alpha, & \\text{if } \\alpha_{min}\\leq \\alpha \\leq 1- \\alpha_{min}\\\\\n", + "1, & \\text{if } 1-\\alpha_{min}<\\alpha.\n", + "\\end{cases}\n", + "$$" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Moreover, the parameter $\\alpha_{max}$ sets a maximal value for $\\alpha$ by\n", + "$$\n", + "\\alpha = \\min\\{\\tilde{\\alpha}, \\alpha_{max}\\}.\n", + "$$\n", + "This allows to control the maximal dissipation." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "To remove numerical artifact the final indicator is smoothed with all the neighboring elements'\n", + "indicators. This is activated with `alpha_smooth=true`.\n", + "$$\n", + "\\alpha_{HG} = \\max_E \\{ \\alpha, 0.5 * \\alpha_E\\},\n", + "$$\n", + "where $E$ are all elements sharing a face with the current element." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Furthermore, you can specify the variable used for the calculation. For instance you can choose\n", + "`density`, `pressure` or both with `density_pressure` for the compressible Euler equations.\n", + "For every equation there is also the option to use the first conservation variable with `first`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This indicator is implemented in Trixi.jl and called `IndicatorHennemannGassner` with the parameters\n", + "`equations`, `basis`, `alpha_max`, `alpha_min`, `alpha_smooth` and `variable`.\n", + "````julia\n", + "indicator_sc = IndicatorHennemannGassner(equations, basis,\n", + " alpha_max=0.5,\n", + " alpha_min=0.001,\n", + " alpha_smooth=true,\n", + " variable=variable)\n", + "````" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Positivity preserving limiter" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Some numerical solutions are physically meaningless, for instance negative values of pressure\n", + "or density for the compressible Euler equations. This often results in crashed simulations since\n", + "the calculation of numerical fluxes or stable time steps uses mathematical operations like roots or\n", + "logarithms. One option to avoid these cases are a-posteriori positivity preserving limiters.\n", + "Trixi.jl provides the fully-discrete positivity-preserving limiter of\n", + "[Zhang, Shu (2011)](https://doi.org/10.1098/rspa.2011.0153)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "It works the following way. For every passed (scalar) variable and for every DG element we calculate\n", + "the minimal value $value_{min}$. If this value falls below the given threshold $\\varepsilon$,\n", + "the approximation is slightly adapted such that the minimal value of the relevant variable lies\n", + "now above the threshold.\n", + "$$\n", + "\\underline{u}^{new} = \\theta * \\underline{u} + (1-\\theta) * u_{mean}\n", + "$$\n", + "where $\\underline{u}$ are the collected pointwise evaluation coefficients in element $e$ and\n", + "$u_{mean}$ the integral mean of the quantity in $e$. The new coefficients are a convex combination\n", + "of these two values with factor\n", + "$$\n", + "\\theta = \\frac{value_{mean} - \\varepsilon}{value_{mean} - value_{min}},\n", + "$$\n", + "where $value_{mean}$ is the relevant variable evaluated for the mean value $u_{mean}$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The adapted approximation keeps the exact same mean value, but the relevant variable is now greater\n", + "or equal the threshold $\\varepsilon$ at every node in every element." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We specify the variables the way we did before for the shock capturing variables. For the\n", + "compressible Euler equations `density`, `pressure` or the combined variable `density_pressure`\n", + "are a reasonable choice." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "You can implement the limiter in Trixi.jl using `PositivityPreservingLimiterZhangShu` with parameters\n", + "`threshold` and `variables`.\n", + "````julia\n", + "stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=thresholds,\n", + " variables=variables)\n", + "````\n", + "Then, the limiter is added to the time integration method in the `solve` function. For instance, like\n", + "````julia\n", + "CarpenterKennedy2N54(stage_limiter!, williamson_condition=false)\n", + "````\n", + "or\n", + "````julia\n", + "SSPRK43(stage_limiter!).\n", + "````" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Simulation with shock capturing and positivity preserving" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can run a simulation using the described methods of shock capturing and positivity\n", + "preserving limiters. We want to give an example for the 2D compressible Euler equations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq, Trixi\n", + "\n", + "equations = CompressibleEulerEquations2D(1.4)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As our initial condition we use the Sedov blast wave setup." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end\n", + "initial_condition = initial_condition_sedov_blast_wave" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "basis = LobattoLegendreBasis(3)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We set the numerical fluxes and divide between the surface flux and the two volume fluxes for the DG\n", + "and FV method. Here, we are using `flux_lax_friedrichs` and `flux_ranocha`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "surface_flux = flux_lax_friedrichs\n", + "volume_flux = flux_ranocha" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we specify the shock capturing indicator $\\alpha$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We implement the described indicator of Hennemann, Gassner as explained above with parameters\n", + "`equations`, `basis`, `alpha_max`, `alpha_min`, `alpha_smooth` and `variable`.\n", + "Since density and pressure are the critical variables in this example, we use\n", + "`density_pressure = density * pressure = rho * p` as indicator variable." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "indicator_sc = IndicatorHennemannGassner(equations, basis,\n", + " alpha_max=0.5,\n", + " alpha_min=0.001,\n", + " alpha_smooth=true,\n", + " variable=density_pressure)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we can use the defined fluxes and the indicator to implement the volume integral using shock\n", + "capturing." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;\n", + " volume_flux_dg=volume_flux,\n", + " volume_flux_fv=surface_flux)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We finalize the discretization by implementing Trixi.jl's `solver`, `mesh`, `semi` and `ode`,\n", + "while `solver` now has the extra parameter `volume_integral`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(basis, surface_flux, volume_integral)\n", + "\n", + "coordinates_min = (-2.0, -2.0)\n", + "coordinates_max = ( 2.0, 2.0)\n", + "mesh = TreeMesh(coordinates_min, coordinates_max,\n", + " initial_refinement_level=6,\n", + " n_cells_max=10_000)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n", + "\n", + "tspan = (0.0, 1.0)\n", + "ode = semidiscretize(semi, tspan);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We add some callbacks to get an solution analysis and use a CFL-based time step size calculation." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "analysis_callback = AnalysisCallback(semi, interval=100)\n", + "\n", + "stepsize_callback = StepsizeCallback(cfl=0.8)\n", + "\n", + "callbacks = CallbackSet(analysis_callback, stepsize_callback);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We now run the simulation using the positivity preserving limiter of Zhang and Shu for the variables\n", + "density and pressure." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=(5.0e-6, 5.0e-6),\n", + " variables=(Trixi.density, pressure))\n", + "\n", + "sol = 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", + "\n", + "using Plots\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/structured_mesh_mapping.ipynb b/previews/PR1693/tutorials/notebooks/structured_mesh_mapping.ipynb new file mode 100644 index 00000000000..c56e5a26da2 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/structured_mesh_mapping.ipynb @@ -0,0 +1,451 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 13: Structured mesh with curvilinear mapping" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Here, we want to introduce another mesh type of [Trixi.jl](https://github.com/trixi-framework/Trixi.jl).\n", + "More precisely, this tutorial is about the curved mesh type `StructuredMesh` supporting\n", + "curved meshes." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Creating a curved mesh\n", + "There are two basic options to define a curved `StructuredMesh` in Trixi.jl. You can\n", + "implement curves for the domain boundaries, or alternatively, set up directly the complete\n", + "transformation mapping. We now present one short example each." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Mesh defined by domain boundary curves\n", + "Both examples are based on a semdiscretization of the 2D compressible Euler equations." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq\n", + "using Trixi\n", + "\n", + "equations = CompressibleEulerEquations2D(1.4)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We start with a pressure perturbation at `(xs, 0.0)` as initial condition." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end\n", + "initial_condition = initial_condition_pressure_perturbation" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Initialize every boundary as a `boundary_condition_slip_wall`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "boundary_conditions = boundary_condition_slip_wall" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "The approximation setup is an entropy-stable split-form DG method with `polydeg=4`. We are using\n", + "the two fluxes `flux_ranocha` and `flux_lax_friedrichs`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "solver = DGSEM(polydeg=4, surface_flux=flux_lax_friedrichs,\n", + " volume_integral=VolumeIntegralFluxDifferencing(flux_ranocha))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We want to define a circular cylinder as physical domain. It contains an inner semicircle with\n", + "radius `r0` and an outer semicircle of radius `r1`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "![](https://user-images.githubusercontent.com/74359358/159492083-1709510f-8ba4-4416-9fb1-e2ed2a11c62c.png)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The domain boundary curves with curve parameter in $[-1,1]$ are sorted as shown in the sketch.\n", + "They always are orientated from negative to positive coordinate, such that the corners have to\n", + "fit like this $f_1(+1) = f_4(-1)$, $f_3(+1) = f_2(-1)$, etc." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "In our case we can define the domain boundary curves as follows:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "r0 = 0.5 # inner radius\n", + "r1 = 5.0 # outer radius\n", + "f1(xi) = SVector( r0 + 0.5 * (r1 - r0) * (xi + 1), 0.0) # right line\n", + "f2(xi) = SVector(-r0 - 0.5 * (r1 - r0) * (xi + 1), 0.0) # left line\n", + "f3(eta) = SVector(r0 * cos(0.5 * pi * (eta + 1)), r0 * sin(0.5 * pi * (eta + 1))) # inner circle\n", + "f4(eta) = SVector(r1 * cos(0.5 * pi * (eta + 1)), r1 * sin(0.5 * pi * (eta + 1))) # outer circle" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We create a curved mesh with 16 x 16 elements. The defined domain boundary curves are passed as a tuple." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "cells_per_dimension = (16, 16)\n", + "mesh = StructuredMesh(cells_per_dimension, (f1, f2, f3, f4), periodicity=false)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Then, we define the simulation with endtime `T=3` with `semi`, `ode` and `callbacks`." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,\n", + " boundary_conditions=boundary_conditions)\n", + "\n", + "tspan = (0.0, 3.0)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "analysis_interval = 100\n", + "analysis_callback = AnalysisCallback(semi, interval=analysis_interval)\n", + "\n", + "alive_callback = AliveCallback(analysis_interval=analysis_interval)\n", + "\n", + "stepsize_callback = StepsizeCallback(cfl=0.9)\n", + "\n", + "callbacks = CallbackSet(analysis_callback,\n", + " alive_callback,\n", + " stepsize_callback);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Running the simulation" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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", + "\n", + "using Plots\n", + "plot(sol)" + ], + "metadata": {}, + "execution_count": null + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "pd = PlotData2D(sol)\n", + "plot(pd[\"p\"])\n", + "plot!(getmesh(pd))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "## Mesh directly defined by the transformation mapping\n", + "As mentioned before, you can also define the domain for a `StructuredMesh` by directly setting up\n", + "a transformation mapping. Here, we want to present a nice mapping, which is often used to test\n", + "free-stream preservation. Exact free-stream preservation is a crucial property of any numerical\n", + "method on curvilinear grids. The mapping is a reduced 2D version of the mapping described in\n", + "[Rueda-Ramírez et al. (2021), p.18](https://arxiv.org/abs/2012.12040)." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using OrdinaryDiffEq\n", + "using Trixi\n", + "\n", + "equations = CompressibleEulerEquations2D(1.4)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "As mentioned, this mapping is used for testing free-stream preservation. So, we use a constant\n", + "initial condition." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "initial_condition = initial_condition_constant\n", + "\n", + "solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We define the transformation mapping with variables in $[-1, 1]$ as described in\n", + "Rueda-Ramírez et al. (2021), p.18 (reduced to 2D):" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "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)\n", + "end" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Instead of a tuple of boundary functions, the `mesh` now has the mapping as its parameter." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "cells_per_dimension = (16, 16)\n", + "mesh = StructuredMesh(cells_per_dimension, mapping)\n", + "\n", + "semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)\n", + "\n", + "tspan = (0.0, 1.0)\n", + "ode = semidiscretize(semi, tspan)\n", + "\n", + "analysis_callback = AnalysisCallback(semi, interval=250)\n", + "\n", + "stepsize_callback = StepsizeCallback(cfl=0.8)\n", + "\n", + "callbacks = CallbackSet(analysis_callback,\n", + " stepsize_callback)\n", + "\n", + "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);" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Now, we want to verify the free-stream preservation property and plot the mesh. For the verification,\n", + "we calculate the absolute difference of the first conservation variable density `u[1]` and `1.0`.\n", + "To plot this error and the mesh, we are using the visualization feature `ScalarPlotData2D`,\n", + "explained in visualization." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "error_density = let u = Trixi.wrap_array(sol.u[end], semi)\n", + " abs.(u[1, :, :, :] .- 1.0) # density, x, y, elements\n", + "end\n", + "pd = ScalarPlotData2D(error_density, semi)\n", + "\n", + "using Plots\n", + "plot(pd, title=\"Error in density\")\n", + "plot!(getmesh(pd))" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "We observe that the errors in the variable `density` are at the level of machine accuracy.\n", + "Moreover, the plot shows the mesh structure resulting from our transformation mapping." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Of course, you can also use other mappings as for instance shifts by $(x, y)$\n", + "```julia\n", + "mapping(xi, eta) = SVector(xi + x, eta + y)\n", + "```\n", + "or rotations with a rotation matrix $T$\n", + "```julia\n", + "mapping(xi, eta) = T * SVector(xi, eta).\n", + "```" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For more curved mesh mappings, please have a look at some\n", + "[elixirs for `StructuredMesh`](https://github.com/trixi-framework/Trixi.jl/tree/main/examples).\n", + "For another curved mesh type, there is a tutorial about Trixi.jl's\n", + "unstructured mesh type [`UnstructuredMesh2D`] and its use of the\n", + "[High-Order Hex-Quad Mesh (HOHQMesh) generator](https://github.com/trixi-framework/HOHQMesh),\n", + "created and developed by David Kopriva." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\", \"Plots\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/time_stepping.ipynb b/previews/PR1693/tutorials/notebooks/time_stepping.ipynb new file mode 100644 index 00000000000..e695e83f618 --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/time_stepping.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 15: Explicit time stepping" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For the time integration, [Trixi.jl](https://github.com/trixi-framework/Trixi.jl) uses the package\n", + "[OrdinaryDiffEq.jl](https://github.com/SciML/OrdinaryDiffEq.jl) from the SciML ecosystem.\n", + "The interface to this package is the `solve(...)` function. It always requires an ODE problem and\n", + "a time integration algorithm as input parameters.\n", + "````julia\n", + "solve(ode, alg; kwargs...)\n", + "````\n", + "In Trixi.jl, the ODE problem is created by `semidiscretize(semi, tspan)` for a semidiscretization\n", + "`semi` and the time span `tspan`. In particular, `semidiscretize` returns an `ODEProblem`\n", + "used by OrdinaryDiffEq.jl." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "OrdinaryDiffEq.jl provides many integration algorithms, which are summarized in\n", + "the [documentation](https://diffeq.sciml.ai/stable/solvers/ode_solve/#Full-List-of-Methods).\n", + "Particularly interesting for Trixi.jl are their\n", + "[strong stability preserving (SSP) methods](https://diffeq.sciml.ai/stable/solvers/ode_solve/#Explicit-Strong-Stability-Preserving-Runge-Kutta-Methods-for-Hyperbolic-PDEs-(Conservation-Laws))\n", + "and [low-storage methods](https://diffeq.sciml.ai/stable/solvers/ode_solve/#Low-Storage-Methods).\n", + "There are some differences regarding the choice of the used time step." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# Error-based adaptive step sizes\n", + "First, we treat time integration algorithms with adaptive step sizes, such as `SSPRK43`. It is used in\n", + "some elixirs, like [`elixir_euler_colliding_flow.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_euler_colliding_flow.jl)\n", + "or [`elixir_euler_astro_jet_amr.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_euler_astro_jet_amr.jl)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Other error-based adaptive integration algorithms are for instance `RDPK3SpFSAL35`, `RDPK3Sp35`,\n", + "`RDPK3SpFSAL49`, `RDPK3Sp49`, `RDPK3SpFSAL510`, `RDPK3Sp510`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "They already contain an error-based adaptive step size control and heuristics to guess\n", + "a starting step size. If this heuristic fails in your case, you can specify an appropriately\n", + "small initial step size as keyword argument `dt=...` of `solve`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "If you run Trixi in parallel with MPI you need to pass `internalnorm=ode_norm` and you should pass `unstable_check=ode_unstable_check`\n", + "to enable MPI aware error-based adaptive step size control. These keyword arguments are also included in `ode_default_options`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "# CFL-based step size control\n", + "The SciML ecosystem also provides time integration algorithms without adaptive time stepping on\n", + "their own, such as `CarpenterKennedy2N54`. Moreover, you also can deactivate the automatic adaptivity\n", + "of adaptive integration algorithms by passing `adaptive=false` in the `solve` function." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These algorithms require another way of setting the step size. You have to pass `dt=...`\n", + "in the `solve` function. Without other settings, the simulation uses this fixed time step." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "For hyperbolic PDEs, it is natural to use an adaptive CFL-based step size control. Here, the time\n", + "step is proportional to a ratio of the local measure of mesh spacing $\\Delta x_i$ for an element `i`\n", + "and the maximum (local) wave speed $\\lambda_{\\max}$ related to the largest-magnitude eigenvalue of\n", + "the flux Jacobian of the hyperbolic system.\n", + "$$\n", + "\\Delta t_n = \\text{CFL} * \\min_i \\frac{\\Delta x_i}{\\lambda_{\\max}(u_i^n)}\n", + "$$\n", + "We compute $\\Delta x_i$ by scaling the element size by a factor of $1/(N+1)$, cf.\n", + "[Gassner and Kopriva (2011)](https://doi.org/10.1137/100807211), Section 5." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl provides such a CFL-based step size control. It is implemented as the callback\n", + "`StepsizeCallback`.\n", + "````julia\n", + "stepsize_callback = StepsizeCallback(; cfl=1.0)\n", + "````\n", + "A suitable CFL number depends on many parameters such as the chosen grid, the integration\n", + "algorithm and the polynomial degree of the spatial DG discretization. So, the optimal number\n", + "for an example is mostly determined experimentally." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "You can add this CFL-based step size control to your simulation like any other callback.\n", + "````julia\n", + "callbacks = CallbackSet(stepsize_callback)\n", + "alg = CarpenterKennedy2N54(williamson_condition=false)\n", + "solve(ode, alg;\n", + " dt=1.0 # solve needs some value here but it will be overwritten by the stepsize_callback\n", + " callback=callbacks)\n", + "````" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "You can find simple examples with a CFL-based step size control for instance in the elixirs\n", + "[`elixir_advection_basic.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_advection_basic.jl)\n", + "or [`elixir_euler_source_terms.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_dgsem/elixir_euler_source_terms.jl)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"OrdinaryDiffEq\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/notebooks/upwind_fdsbp.ipynb b/previews/PR1693/tutorials/notebooks/upwind_fdsbp.ipynb new file mode 100644 index 00000000000..11a54d9c26e --- /dev/null +++ b/previews/PR1693/tutorials/notebooks/upwind_fdsbp.ipynb @@ -0,0 +1,219 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 7: Upwind FD SBP schemes" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "**Note:** To improve responsiveness via caching, the notebooks are updated only once a week. They are only\n", + "available for the latest stable release of Trixi.jl at the time of caching." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "General tensor product SBP methods are supported via the `DGMulti` solver\n", + "in a reasonably complete way, see the previous tutorial.\n", + "Nevertheless, there is also experimental support for SBP methods with\n", + "other solver and mesh types." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The first step is to set up an SBP operator. A classical (central) SBP\n", + "operator can be created as follows." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using Trixi\n", + "D_SBP = derivative_operator(SummationByPartsOperators.MattssonNordström2004(),\n", + " derivative_order=1, accuracy_order=2,\n", + " xmin=0.0, xmax=1.0, N=11)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Instead of prefixing the source of coefficients `MattssonNordström2004()`,\n", + "you can also load the package SummationByPartsOperators.jl. Either way,\n", + "this yields an object representing the operator efficiently. If you want to\n", + "compare it to coefficients presented in the literature, you can convert it\n", + "to a matrix." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "Matrix(D_SBP)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Upwind SBP operators are a concept introduced in 2017 by Ken Mattsson. You can\n", + "create them as follows." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "D_upw = upwind_operators(SummationByPartsOperators.Mattsson2017,\n", + " derivative_order=1, accuracy_order=2,\n", + " xmin=0.0, xmax=1.0, N=11)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Upwind operators are derivative operators biased towards one direction.\n", + "The \"minus\" variants has a bias towards the left side, i.e., it uses values\n", + "from more nodes to the left than from the right to compute the discrete\n", + "derivative approximation at a given node (in the interior of the domain).\n", + "In matrix form, this means more non-zero entries are left from the diagonal." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "Matrix(D_upw.minus)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "Analogously, the \"plus\" variant has a bias towards the right side." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "Matrix(D_upw.plus)" + ], + "metadata": {}, + "execution_count": null + }, + { + "cell_type": "markdown", + "source": [ + "For more information on upwind SBP operators, please refer to the documentation\n", + "of [SummationByPartsOperators.jl](https://github.com/ranocha/SummationByPartsOperators.jl)\n", + "and references cited there." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "The basic idea of upwind SBP schemes is to apply a flux vector splitting and\n", + "use appropriate upwind operators for both parts of the flux. In 1D, this means\n", + "to split the flux\n", + "$$\n", + "f(u) = f^-(u) + f^+(u)\n", + "$$\n", + "such that $f^-(u)$ is associated with left-going waves and $f^+(u)$ with\n", + "right-going waves. Then, we apply upwind SBP operators $D^-, D^+$ with an\n", + "appropriate upwind bias, resulting in\n", + "$$\n", + "\\partial_x f(u) \\approx D^+ f^-(u) + D^- f^+(u)\n", + "$$\n", + "Note that the established notations of upwind operators $D^\\pm$ and flux\n", + "splittings $f^\\pm$ clash. The right-going waves from $f^+$ need an operator\n", + "biased towards their upwind side, i.e., the left side. This upwind bias is\n", + "provided by the operator $D^-$." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Many classical flux vector splittings have been developed for finite volume\n", + "methods and are described in the book \"Riemann Solvers and Numerical Methods\n", + "for Fluid Dynamics: A Practical Introduction\" of Eleuterio F. Toro (2009),\n", + "[DOI: 10.1007/b79761](https://doi.org/10.1007/b79761). One such a well-known\n", + "splitting provided by Trixi.jl is `splitting_steger_warming`." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Trixi.jl comes with several example setups using upwind SBP methods with\n", + "flux vector splitting, e.g.,\n", + "- [`elixir_euler_vortex.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_2d_fdsbp/elixir_euler_vortex.jl)\n", + "- [`elixir_euler_taylor_green_vortex.jl`](https://github.com/trixi-framework/Trixi.jl/blob/main/examples/tree_3d_fdsbp/elixir_euler_taylor_green_vortex.jl)" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "## Package versions" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "These results were obtained using the following versions." + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using InteractiveUtils\n", + "versioninfo()\n", + "\n", + "using Pkg\n", + "Pkg.status([\"Trixi\", \"SummationByPartsOperators\"],\n", + " mode=PKGMODE_MANIFEST)" + ], + "metadata": {}, + "execution_count": null + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.3" + }, + "kernelspec": { + "name": "julia-1.9", + "display_name": "Julia 1.9.3", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/previews/PR1693/tutorials/out/ice_cream_curved_sides.control b/previews/PR1693/tutorials/out/ice_cream_curved_sides.control new file mode 100644 index 00000000000..2ba8e1dc5bd --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_curved_sides.control @@ -0,0 +1,65 @@ +\begin{CONTROL_INPUT} + \begin{RUN_PARAMETERS} + mesh file name = ice_cream_curved_sides.mesh + plot file name = ice_cream_curved_sides.tec + stats file name = none + mesh file format = ISM-v2 + polynomial order = 4 + plot file format = skeleton + \end{RUN_PARAMETERS} + + \begin{BACKGROUND_GRID} + background grid size = [1.0, 1.0, 0.0] + \end{BACKGROUND_GRID} + + \begin{SPRING_SMOOTHER} + smoothing = ON + smoothing type = LinearAndCrossBarSpring + number of iterations = 25 + \end{SPRING_SMOOTHER} + +\end{CONTROL_INPUT} + +\begin{MODEL} + + \begin{OUTER_BOUNDARY} + \begin{PARAMETRIC_EQUATION_CURVE} + name = OuterCircle + xEqn = x(t) = 8.0*sin(2.0*pi*t) + yEqn = y(t) = 8.0*cos(2.0*pi*t) + zEqn = z(t) = 0.0 + \end{PARAMETRIC_EQUATION_CURVE} + + \end{OUTER_BOUNDARY} + + \begin{INNER_BOUNDARIES} + + \begin{CHAIN} + name = IceCreamCone + \begin{END_POINTS_LINE} + name = LeftSlant + xStart = [-2.0, 1.0, 0.0] + xEnd = [ 0.0, -3.0, 0.0] + \end{END_POINTS_LINE} + + \begin{END_POINTS_LINE} + name = RightSlant + xStart = [ 0.0, -3.0, 0.0] + xEnd = [ 2.0, 1.0, 0.0] + \end{END_POINTS_LINE} + + \begin{CIRCULAR_ARC} + name = IceCream + units = degrees + center = [ 0.0, 1.0, 0.0] + radius = 2.0 + start angle = 0.0 + end angle = 180.0 + \end{CIRCULAR_ARC} + \end{CHAIN} + + \end{INNER_BOUNDARIES} + +\end{MODEL} +\end{FILE} + diff --git a/previews/PR1693/tutorials/out/ice_cream_curved_sides.mesh b/previews/PR1693/tutorials/out/ice_cream_curved_sides.mesh new file mode 100644 index 00000000000..5cdee3e4898 --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_curved_sides.mesh @@ -0,0 +1,1778 @@ + ISM-V2 + 256 472 216 4 + -2.6873977405837541 -6.8533127622695584 0.0000000000000000 + -2.0107216208337615 -6.8653592763871760 0.0000000000000000 + -1.0410418717253931 -6.9216393501901949 0.0000000000000000 + 2.9912702576840707E-007 -6.9498898853362308 0.0000000000000000 + 1.0410424460724244 -6.9216392767031785 0.0000000000000000 + 2.0107220324553001 -6.8653591831123713 0.0000000000000000 + 2.6873981284579389 -6.8533125932786199 0.0000000000000000 + -4.7376904454980995 -5.7175213451225044 0.0000000000000000 + -4.1206720130528520 -5.8675490522077896 0.0000000000000000 + -3.1043042956445648 -6.1731350923322887 0.0000000000000000 + -2.0036785626447200 -5.9851228109660299 0.0000000000000000 + -1.0098066418509064 -5.9615428122665204 0.0000000000000000 + 1.4706799468291222E-007 -5.9621383436589896 0.0000000000000000 + 1.0098069252998503 -5.9615427750810719 0.0000000000000000 + 2.0036788470530045 -5.9851227251882229 0.0000000000000000 + 3.1043047227986076 -6.1731348858195423 0.0000000000000000 + 4.1206723395676512 -5.8675488550488604 0.0000000000000000 + 4.7376907442183054 -5.7175210852012199 0.0000000000000000 + -5.7175290854607779 -4.7380091301910010 0.0000000000000000 + -5.0338745166877699 -5.0343954062500895 0.0000000000000000 + -4.0192675410949015 -4.9833531598216387 0.0000000000000000 + -3.0341474170277136 -5.0182548701078833 0.0000000000000000 + -2.0156881211264164 -5.0103777714865521 0.0000000000000000 + -1.0040300753799325 -4.9870767872107384 0.0000000000000000 + 6.0815912483782476E-008 -4.9814748373723354 0.0000000000000000 + 1.0040302008008126 -4.9870767661818354 0.0000000000000000 + 2.0156882686372239 -5.0103777190234284 0.0000000000000000 + 3.0341475955502211 -5.0182547800320005 0.0000000000000000 + 4.0192677419725520 -4.9833530285321146 0.0000000000000000 + 5.0338748213315210 -5.0343951447304720 0.0000000000000000 + 5.7175292975176388 -4.7380089561448235 0.0000000000000000 + -5.8675188863064056 -4.1212636296863909 0.0000000000000000 + -4.9817761240538099 -4.0207066396640707 0.0000000000000000 + -4.0043466716132494 -4.0091310423573763 0.0000000000000000 + -2.9990315694177996 -4.0029589564990600 0.0000000000000000 + -1.9980410613753681 -4.0034989440708078 0.0000000000000000 + -1.0025886914582574 -4.0005457543668728 0.0000000000000000 + 2.0716010322157786E-008 -3.9975159229364250 0.0000000000000000 + 1.0025887371619329 -4.0005457439384919 0.0000000000000000 + 1.9980411183580911 -4.0034989210294167 0.0000000000000000 + 2.9990316405720265 -4.0029589207724925 0.0000000000000000 + 4.0043467561697534 -4.0091310005645440 0.0000000000000000 + 4.9817761918620427 -4.0207066409172585 0.0000000000000000 + 5.8675188518455164 -4.1212637904706897 0.0000000000000000 + -6.8541002111688183 -2.6879947245913107 0.0000000000000000 + -6.1729085409881828 -3.1048888913844155 0.0000000000000000 + -5.0136659075640297 -3.0350713738960646 0.0000000000000000 + -3.9875424262402634 -3.0037083370185043 0.0000000000000000 + -2.9583450770060664 -2.9862077152150777 0.0000000000000000 + -1.9564448711240272 -3.0074316257274023 0.0000000000000000 + -1.0288837123639378 -3.0335503938670736 0.0000000000000000 + 1.0288837261293409 -3.0335503875679914 0.0000000000000000 + 1.9564448907221292 -3.0074316143886093 0.0000000000000000 + 2.9583450995996925 -2.9862077071259527 0.0000000000000000 + 3.9875424417605054 -3.0037083567292124 0.0000000000000000 + 5.0136658835814423 -3.0350714872829925 0.0000000000000000 + 6.1729083819393678 -3.1048892701218342 0.0000000000000000 + 6.8541000555287406 -2.6879951006708396 0.0000000000000000 + -6.8662753709801922 -2.0111701987867616 0.0000000000000000 + -5.9840270273315026 -2.0036316982582778 0.0000000000000000 + -4.9988021360598456 -2.0128444316642962 0.0000000000000000 + -3.9673460790320734 -1.9910456416213265 0.0000000000000000 + -2.9250676751279636 -1.9602609213766236 0.0000000000000000 + -1.7488220331260820 -1.8941799125227698 0.0000000000000000 + -1.0549997787868850 -2.3236466700725056 0.0000000000000000 + 1.0549997837346989 -2.3236466644045155 0.0000000000000000 + 1.7488220456724668 -1.8941798935970877 0.0000000000000000 + 2.9250676820651060 -1.9602609194579510 0.0000000000000000 + 3.9673460732862944 -1.9910456785028996 0.0000000000000000 + 4.9988021003931316 -2.0128445626745215 0.0000000000000000 + 5.9840269527385770 -2.0036319863591987 0.0000000000000000 + 6.8662752831181848 -2.0111706214718250 0.0000000000000000 + -6.9224179711968894 -1.0409114847469898 0.0000000000000000 + -5.9580972668346384 -1.0079369394830269 0.0000000000000000 + -4.9644031999205085 -0.99567599301028353 0.0000000000000000 + -3.9291101003161621 -0.97695020835669544 0.0000000000000000 + -2.9054997225222792 -0.96230280748999231 0.0000000000000000 + -1.9926400784257630 -0.87289673502189002 0.0000000000000000 + 1.9926400966711493 -0.87289669885085341 0.0000000000000000 + 2.9054997267781739 -0.96230280151691017 0.0000000000000000 + 3.9291100927795046 -0.97695023859068741 0.0000000000000000 + 4.9644031747190178 -0.99567610299695042 0.0000000000000000 + 5.9580972159582188 -1.0079372294112183 0.0000000000000000 + 6.9224178848348696 -1.0409122106557087 0.0000000000000000 + -6.9501005397333646 9.2742624259376633E-004 0.0000000000000000 + -5.9557814357875589 3.5672791828285848E-003 0.0000000000000000 + -4.9483036165862142 1.0995072712916637E-002 0.0000000000000000 + -3.8953761385874000 2.9859225313277699E-002 0.0000000000000000 + -2.7044268180022062 9.0239571225917664E-002 0.0000000000000000 + -2.0577134077941768 -0.24596023237843018 0.0000000000000000 + 2.0577134210781893 -0.24596020432330881 0.0000000000000000 + 2.7044268189529750 9.0239580439220993E-002 0.0000000000000000 + 3.8953761307951136 2.9859213141896310E-002 0.0000000000000000 + 4.9483035951629128 1.0995006083563994E-002 0.0000000000000000 + 5.9557813901342689 3.5670820551844027E-003 0.0000000000000000 + 6.9501004563400075 9.2689433946285945E-004 0.0000000000000000 + -6.9211366160086696 1.0424222176432969 0.0000000000000000 + -5.9532838484776942 1.0137526163989738 0.0000000000000000 + -4.9500311685113738 1.0133010960715971 0.0000000000000000 + -3.8931011037157370 1.0206864672017701 0.0000000000000000 + -2.8597405927114097 1.0355541279811451 0.0000000000000000 + 2.8597405855121849 1.0355541561971500 0.0000000000000000 + 3.8931010938629025 1.0206864792386088 0.0000000000000000 + 4.9500311437661138 1.0133010952219772 0.0000000000000000 + 5.9532837990717420 1.0137526003884889 0.0000000000000000 + 6.9211365315572104 1.0424222862574206 0.0000000000000000 + -6.8644255432723220 2.0119396442671040 0.0000000000000000 + -5.9770878564770857 2.0066264662415398 0.0000000000000000 + -4.9783437062948490 2.0217143918982812 0.0000000000000000 + -3.9140404518912146 2.0099176101976779 0.0000000000000000 + -2.7410761635755314 1.9789206013273941 0.0000000000000000 + -2.1286743374522938 2.2972195370402191 0.0000000000000000 + 2.1286743610257428 2.2972195426678863 0.0000000000000000 + 2.7410761638388315 1.9789206359776161 0.0000000000000000 + 3.9140404460755791 2.0099176374807124 0.0000000000000000 + 4.9783436737400066 2.0217144567818068 0.0000000000000000 + 5.9770877867144092 2.0066266051878681 0.0000000000000000 + 6.8644254594391168 2.0119399050256175 0.0000000000000000 + -6.8525413060636966 2.6881963732921865 0.0000000000000000 + -6.1678363756747823 3.1055140586749621 0.0000000000000000 + -4.9973810792864457 3.0371864629703023 0.0000000000000000 + -3.9532479064607431 3.0086876509391756 0.0000000000000000 + -2.9421500723748752 3.0044506681060703 0.0000000000000000 + -1.9325861810773708 2.9330503835958242 0.0000000000000000 + -1.2961124323034472 3.1292858466381226 0.0000000000000000 + 1.2961125095535806 3.1292858073071472 0.0000000000000000 + 1.9325862367186470 2.9330503517007265 0.0000000000000000 + 2.9421501048823253 3.0044506615488382 0.0000000000000000 + 3.9532479276365025 3.0086876615716163 0.0000000000000000 + 4.9973810641359471 3.0371865415826074 0.0000000000000000 + 6.1678362306961185 3.1055143771001839 0.0000000000000000 + 6.8525411601091664 2.6881966863964721 0.0000000000000000 + -5.8641463558607985 4.1208556574546105 0.0000000000000000 + -4.9733093718925314 4.0196757173264421 0.0000000000000000 + -3.9922265881412802 4.0059453056237606 0.0000000000000000 + -2.9890091422252363 3.9843170145084694 0.0000000000000000 + -2.0054941764375291 3.9431793687522627 0.0000000000000000 + -0.97208389168591847 3.7420513075922179 0.0000000000000000 + 4.9676272106708220E-008 3.8718978722738666 0.0000000000000000 + 0.97208398546357100 3.7420512824509329 0.0000000000000000 + 2.0054942543469472 3.9431793364082628 0.0000000000000000 + 2.9890092219353601 3.9843169730044226 0.0000000000000000 + 3.9922266832879605 4.0059452501162065 0.0000000000000000 + 4.9733094595143239 4.0196756893634520 0.0000000000000000 + 5.8641463429630729 4.1208557832656991 0.0000000000000000 + -5.7158908831846356 4.7374654742093689 0.0000000000000000 + -5.0310753814344409 5.0329859200420142 0.0000000000000000 + -4.0146693983288904 4.9778067867170375 0.0000000000000000 + -3.0301613062086163 5.0005146435834220 0.0000000000000000 + -2.0111150485345335 4.9601592448796588 0.0000000000000000 + -0.99816482806907292 4.9040223934159526 0.0000000000000000 + 6.5559167275215029E-008 4.8889229740908711 0.0000000000000000 + 0.99816495902914193 4.9040223703928012 0.0000000000000000 + 2.0111151922869741 4.9601591923650652 0.0000000000000000 + 3.0301614770132304 5.0005145532717288 0.0000000000000000 + 4.0146696060123634 4.9778066411423163 0.0000000000000000 + 5.0310757370402959 5.0329856029402960 0.0000000000000000 + 5.7158911418430645 4.7374652500277525 0.0000000000000000 + -4.7366408724331448 5.7163969255377962 0.0000000000000000 + -4.1192062592906806 5.8644052326761127 0.0000000000000000 + -3.1027380900121511 6.1648179887777212 0.0000000000000000 + -2.0015559213129070 5.9647195940348077 0.0000000000000000 + -1.0080842121091849 5.9307120578964962 0.0000000000000000 + 1.2809144579091231E-007 5.9271981412979953 0.0000000000000000 + 1.0080844592290032 5.9307120244791536 0.0000000000000000 + 2.0015561708518548 5.9647195166171958 0.0000000000000000 + 3.1027384683617534 6.1648178022211253 0.0000000000000000 + 4.1192065691366757 5.8644050357600435 0.0000000000000000 + 4.7366412086031051 5.7163966234799082 0.0000000000000000 + -2.6868851371343672 6.8498717712581927 0.0000000000000000 + -2.0100960238839289 6.8591082624958490 0.0000000000000000 + -1.0405857107919183 6.9126053965829257 0.0000000000000000 + 2.5020681072890381E-007 6.9397443383701223 0.0000000000000000 + 1.0405861922485977 6.9126053343110048 0.0000000000000000 + 2.0100963728176224 6.8591081816647161 0.0000000000000000 + 2.6868854733549496 6.8498716232438612 0.0000000000000000 + -3.6705104009983383 -7.1082595194719094 0.0000000000000000 + -3.0442865551243687 -7.3981294507658495 0.0000000000000000 + -2.1863978152204240 -7.6954314104928097 0.0000000000000000 + -1.1313695802431920 -7.9195961306685545 0.0000000000000000 + 3.6410209097182056E-009 -8.0000000000000000 0.0000000000000000 + 1.1313715929171260 -7.9195958431437754 0.0000000000000000 + 2.1863978152204160 -7.6954314104928123 0.0000000000000000 + 3.0442865551243607 -7.3981294507658522 0.0000000000000000 + 3.6705121720218252 -7.1082586049636394 0.0000000000000000 + 4.4376011313588206 -6.6564026469980702 0.0000000000000000 + 5.1002019105058052 -6.1634357684714240 0.0000000000000000 + 5.6568541807137214 -5.6568543182710380 0.0000000000000000 + 6.1634357684714249 -5.1002019105058043 0.0000000000000000 + 6.6564026469980728 -4.4376011313588162 0.0000000000000000 + 7.1082586387364719 -3.6705121066178656 0.0000000000000000 + 7.3981294507658539 -3.0442865551243559 0.0000000000000000 + 7.6954314104928132 -2.1863978152204129 0.0000000000000000 + 7.9195958648410292 -1.1313714410364422 0.0000000000000000 + 7.9999999999999973 -1.9089446951922548E-007 0.0000000000000000 + 7.9195958696254367 1.1313714075456063 0.0000000000000000 + 7.6954314104928123 2.1863978152204151 0.0000000000000000 + 7.3981294507658530 3.0442865551243603 0.0000000000000000 + 7.1082586908781771 3.6705120056410205 0.0000000000000000 + 6.6564026469980719 4.4376011313588171 0.0000000000000000 + 6.1634357684714232 5.1002019105058070 0.0000000000000000 + 5.6568544506792646 5.6568540483054894 0.0000000000000000 + 5.1002019105058061 6.1634357684714240 0.0000000000000000 + 4.4376011313588162 6.6564026469980728 0.0000000000000000 + 3.6705119402370614 7.1082587246510069 0.0000000000000000 + 3.0442865551243585 7.3981294507658530 0.0000000000000000 + 2.1863978152204191 7.6954314104928114 0.0000000000000000 + 1.1313712556649234 7.9195958913226860 0.0000000000000000 + 0.0000000000000000 8.0000000000000000 0.0000000000000000 + -1.1313695802431916 7.9195961306685545 0.0000000000000000 + -2.1863978152204133 7.6954314104928132 0.0000000000000000 + -3.0442865551243616 7.3981294507658522 0.0000000000000000 + -3.6705104009983285 7.1082595194719147 0.0000000000000000 + -4.4376011313588100 6.6564026469980773 0.0000000000000000 + -5.1002019105058114 6.1634357684714187 0.0000000000000000 + -5.6568527973323857 5.6568557016520025 0.0000000000000000 + -6.1634357684714214 5.1002019105058087 0.0000000000000000 + -6.6564026469980755 4.4376011313588126 0.0000000000000000 + -7.1082595194719094 3.6705104009983378 0.0000000000000000 + -7.3981294507658477 3.0442865551243714 0.0000000000000000 + -7.6954314104928097 2.1863978152204235 0.0000000000000000 + -7.9195961306685545 1.1313695802431951 0.0000000000000000 + -7.9999999999997362 2.0536640888705361E-006 0.0000000000000000 + -7.9195961306685545 -1.1313695802431909 0.0000000000000000 + -7.6954314104928114 -2.1863978152204195 0.0000000000000000 + -7.3981294507658522 -3.0442865551243612 0.0000000000000000 + -7.1082595194719147 -3.6705104009983280 0.0000000000000000 + -6.6564026469980782 -4.4376011313588091 0.0000000000000000 + -6.1634357684714196 -5.1002019105058105 0.0000000000000000 + -5.6568527973323830 -5.6568557016520042 0.0000000000000000 + -5.1002019105058114 -6.1634357684714187 0.0000000000000000 + -4.4376011313588135 -6.6564026469980755 0.0000000000000000 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + 0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 0.84062499397195267 -1.3187500120560947 0.0000000000000000 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + 1.5593750060280469 0.11875001205609381 0.0000000000000000 + 1.8406249939719526 0.68124998794390512 0.0000000000000000 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + 1.9234528539428934 1.5480229180052039 0.0000000000000000 + 1.7577069153495042 1.9541836299856183 0.0000000000000000 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + 0.95418362998561834 2.7577069153495040 0.0000000000000000 + 0.54802294711610822 2.9234528456487245 0.0000000000000000 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + -0.54802270862631064 2.9234529135983243 0.0000000000000000 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + -1.7577069153495022 1.9541836299856215 0.0000000000000000 + -1.9234529135983240 1.5480227086263110 0.0000000000000000 + -2.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + -1.5593750060280471 0.11875001205609437 0.0000000000000000 + -1.2000000031251037 -0.59999999374979263 0.0000000000000000 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 1 2 1 136 1 4 + 2 11 1 2 2 4 + 10 11 1 9 3 1 + 1 10 1 135 4 -4 + 2 3 2 137 1 4 + 3 12 2 3 2 4 + 11 12 2 10 3 1 + 3 4 3 138 1 4 + 4 13 3 4 2 4 + 12 13 3 11 3 1 + 4 5 4 139 1 4 + 5 14 4 5 2 4 + 13 14 4 12 3 1 + 5 6 5 140 1 4 + 6 15 5 6 2 4 + 14 15 5 13 3 1 + 6 7 6 141 1 4 + 7 16 6 142 2 4 + 15 16 6 14 3 1 + 8 9 7 189 1 4 + 9 21 7 8 2 4 + 20 21 7 18 3 1 + 8 20 7 188 4 -4 + 9 10 8 190 1 4 + 10 22 8 9 2 4 + 21 22 8 19 3 1 + 11 23 9 10 2 4 + 22 23 9 20 3 1 + 12 24 10 11 2 4 + 23 24 10 21 3 1 + 13 25 11 12 2 4 + 24 25 11 22 3 1 + 14 26 12 13 2 4 + 25 26 12 23 3 1 + 15 27 13 14 2 4 + 26 27 13 24 3 1 + 16 28 14 15 2 4 + 27 28 14 25 3 1 + 16 17 15 143 1 4 + 17 29 15 16 2 4 + 28 29 15 26 3 1 + 17 18 16 144 1 4 + 18 30 16 145 2 4 + 29 30 16 27 3 1 + 19 20 17 187 1 4 + 20 33 17 18 2 4 + 32 33 17 29 3 1 + 19 32 17 186 4 -4 + 21 34 18 19 2 4 + 33 34 18 30 3 1 + 22 35 19 20 2 4 + 34 35 19 31 3 1 + 23 36 20 21 2 4 + 35 36 20 32 3 1 + 24 37 21 22 2 4 + 36 37 21 33 3 1 + 25 38 22 23 2 4 + 37 38 22 191 3 2 + 26 39 23 24 2 4 + 38 39 23 192 3 2 + 27 40 24 25 2 4 + 39 40 24 34 3 1 + 28 41 25 26 2 4 + 40 41 25 35 3 1 + 29 42 26 27 2 4 + 41 42 26 36 3 1 + 30 43 27 28 2 4 + 42 43 27 37 3 1 + 30 31 28 146 1 4 + 31 44 28 147 2 4 + 43 44 28 38 3 1 + 33 47 29 30 2 4 + 46 47 29 40 3 1 + 32 46 29 185 4 -4 + 34 48 30 31 2 4 + 47 48 30 41 3 1 + 35 49 31 32 2 4 + 48 49 31 42 3 1 + 36 50 32 33 2 4 + 49 50 32 43 3 1 + 37 51 33 191 2 -1 + 50 51 33 44 3 1 + 40 53 34 35 2 4 + 52 53 34 45 3 1 + 39 52 34 192 4 -3 + 41 54 35 36 2 4 + 53 54 35 46 3 1 + 42 55 36 37 2 4 + 54 55 36 47 3 1 + 43 56 37 38 2 4 + 55 56 37 48 3 1 + 44 57 38 148 2 4 + 56 57 38 49 3 1 + 45 46 39 184 1 4 + 46 60 39 40 2 4 + 59 60 39 51 3 1 + 45 59 39 183 4 -4 + 47 61 40 41 2 4 + 60 61 40 52 3 1 + 48 62 41 42 2 4 + 61 62 41 53 3 1 + 49 63 42 43 2 4 + 62 63 42 54 3 1 + 50 64 43 44 2 4 + 63 64 43 55 3 1 + 51 65 44 216 2 -1 + 64 65 44 215 3 1 + 53 67 45 46 2 4 + 66 67 45 194 3 1 + 52 66 45 193 4 1 + 54 68 46 47 2 4 + 67 68 46 56 3 1 + 55 69 47 48 2 4 + 68 69 47 57 3 1 + 56 70 48 49 2 4 + 69 70 48 58 3 1 + 57 71 49 50 2 4 + 70 71 49 59 3 1 + 57 58 50 149 1 4 + 58 72 50 150 2 4 + 71 72 50 60 3 1 + 60 74 51 52 2 4 + 73 74 51 61 3 1 + 59 73 51 182 4 -4 + 61 75 52 53 2 4 + 74 75 52 62 3 1 + 62 76 53 54 2 4 + 75 76 53 63 3 1 + 63 77 54 55 2 4 + 76 77 54 64 3 1 + 64 78 55 214 2 -1 + 77 78 55 65 3 1 + 68 80 56 57 2 4 + 79 80 56 66 3 1 + 67 79 56 195 4 1 + 69 81 57 58 2 4 + 80 81 57 67 3 1 + 70 82 58 59 2 4 + 81 82 58 68 3 1 + 71 83 59 60 2 4 + 82 83 59 69 3 1 + 72 84 60 151 2 4 + 83 84 60 70 3 1 + 74 86 61 62 2 4 + 85 86 61 71 3 1 + 73 85 61 181 4 -4 + 75 87 62 63 2 4 + 86 87 62 72 3 1 + 76 88 63 64 2 4 + 87 88 63 73 3 1 + 77 89 64 65 2 4 + 88 89 64 74 3 1 + 78 90 65 213 2 -1 + 89 90 65 212 3 1 + 80 92 66 67 2 4 + 91 92 66 197 3 1 + 79 91 66 196 4 1 + 81 93 67 68 2 4 + 92 93 67 75 3 1 + 82 94 68 69 2 4 + 93 94 68 76 3 1 + 83 95 69 70 2 4 + 94 95 69 77 3 1 + 84 96 70 152 2 4 + 95 96 70 78 3 1 + 86 98 71 72 2 4 + 97 98 71 79 3 1 + 85 97 71 180 4 -4 + 87 99 72 73 2 4 + 98 99 72 80 3 1 + 88 100 73 74 2 4 + 99 100 73 81 3 1 + 89 101 74 211 2 -1 + 100 101 74 82 3 1 + 93 103 75 76 2 4 + 102 103 75 83 3 1 + 92 102 75 198 4 1 + 94 104 76 77 2 4 + 103 104 76 84 3 1 + 95 105 77 78 2 4 + 104 105 77 85 3 1 + 96 106 78 153 2 4 + 105 106 78 86 3 1 + 98 108 79 80 2 4 + 107 108 79 87 3 1 + 97 107 79 179 4 -4 + 99 109 80 81 2 4 + 108 109 80 88 3 1 + 100 110 81 82 2 4 + 109 110 81 89 3 1 + 101 111 82 210 2 -1 + 110 111 82 90 3 1 + 103 115 83 84 2 4 + 114 115 83 93 3 1 + 102 114 83 199 4 1 + 104 116 84 85 2 4 + 115 116 84 94 3 1 + 105 117 85 86 2 4 + 116 117 85 95 3 1 + 106 118 86 154 2 4 + 117 118 86 96 3 1 + 108 120 87 88 2 4 + 119 120 87 177 3 -4 + 107 119 87 178 4 -4 + 109 121 88 89 2 4 + 120 121 88 97 3 1 + 110 122 89 90 2 4 + 121 122 89 98 3 1 + 111 123 90 91 2 4 + 122 123 90 99 3 1 + 111 112 91 209 1 -1 + 112 124 91 208 2 -1 + 123 124 91 100 3 1 + 113 114 92 200 1 -1 + 114 128 92 93 2 4 + 127 128 92 103 3 1 + 113 127 92 201 4 1 + 115 129 93 94 2 4 + 128 129 93 104 3 1 + 116 130 94 95 2 4 + 129 130 94 105 3 1 + 117 131 95 96 2 4 + 130 131 95 106 3 1 + 118 132 96 155 2 4 + 131 132 96 156 3 -4 + 121 134 97 98 2 4 + 133 134 97 107 3 1 + 120 133 97 176 4 -4 + 122 135 98 99 2 4 + 134 135 98 108 3 1 + 123 136 99 100 2 4 + 135 136 99 109 3 1 + 124 137 100 101 2 4 + 136 137 100 110 3 1 + 124 125 101 207 1 -1 + 125 138 101 206 2 -1 + 137 138 101 111 3 1 + 126 127 102 202 1 -1 + 127 141 102 103 2 4 + 140 141 102 114 3 1 + 126 140 102 203 4 1 + 128 142 103 104 2 4 + 141 142 103 115 3 1 + 129 143 104 105 2 4 + 142 143 104 116 3 1 + 130 144 105 106 2 4 + 143 144 105 117 3 1 + 131 145 106 157 2 4 + 144 145 106 118 3 1 + 134 147 107 108 2 4 + 146 147 107 174 3 -4 + 133 146 107 175 4 -4 + 135 148 108 109 2 4 + 147 148 108 119 3 1 + 136 149 109 110 2 4 + 148 149 109 120 3 1 + 137 150 110 111 2 4 + 149 150 110 121 3 1 + 138 151 111 112 2 4 + 150 151 111 122 3 1 + 138 139 112 205 1 -1 + 139 152 112 113 2 4 + 151 152 112 123 3 1 + 139 140 113 204 1 -1 + 140 153 113 114 2 4 + 152 153 113 124 3 1 + 141 154 114 115 2 4 + 153 154 114 125 3 1 + 142 155 115 116 2 4 + 154 155 115 126 3 1 + 143 156 116 117 2 4 + 155 156 116 127 3 1 + 144 157 117 118 2 4 + 156 157 117 128 3 1 + 145 158 118 158 2 4 + 157 158 118 159 3 -4 + 148 160 119 120 2 4 + 159 160 119 172 3 -4 + 147 159 119 173 4 -4 + 149 161 120 121 2 4 + 160 161 120 171 3 -4 + 150 162 121 122 2 4 + 161 162 121 129 3 1 + 151 163 122 123 2 4 + 162 163 122 130 3 1 + 152 164 123 124 2 4 + 163 164 123 131 3 1 + 153 165 124 125 2 4 + 164 165 124 132 3 1 + 154 166 125 126 2 4 + 165 166 125 133 3 1 + 155 167 126 127 2 4 + 166 167 126 134 3 1 + 156 168 127 128 2 4 + 167 168 127 162 3 -4 + 157 169 128 160 2 4 + 168 169 128 161 3 -4 + 162 171 129 130 2 4 + 170 171 129 169 3 -4 + 161 170 129 170 4 -4 + 163 172 130 131 2 4 + 171 172 130 168 3 -4 + 164 173 131 132 2 4 + 172 173 131 167 3 -4 + 165 174 132 133 2 4 + 173 174 132 166 3 -4 + 166 175 133 134 2 4 + 174 175 133 165 3 -4 + 167 176 134 163 2 4 + 175 176 134 164 3 -4 + 10 177 135 190 1 3 + 177 178 135 0 2 0 + 1 178 135 136 3 1 + 178 179 136 0 2 0 + 2 179 136 137 3 1 + 179 180 137 0 2 0 + 3 180 137 138 3 1 + 180 181 138 0 2 0 + 4 181 138 139 3 1 + 181 182 139 0 2 0 + 5 182 139 140 3 1 + 182 183 140 0 2 0 + 6 183 140 141 3 1 + 183 184 141 0 2 0 + 7 184 141 142 3 1 + 184 185 142 0 2 0 + 16 185 142 143 3 1 + 185 186 143 0 2 0 + 17 186 143 144 3 1 + 186 187 144 0 2 0 + 18 187 144 145 3 1 + 187 188 145 0 2 0 + 30 188 145 146 3 1 + 188 189 146 0 2 0 + 31 189 146 147 3 1 + 189 190 147 0 2 0 + 44 190 147 148 3 1 + 190 191 148 0 2 0 + 57 191 148 149 3 1 + 191 192 149 0 2 0 + 58 192 149 150 3 1 + 192 193 150 0 2 0 + 72 193 150 151 3 1 + 193 194 151 0 2 0 + 84 194 151 152 3 1 + 194 195 152 0 2 0 + 96 195 152 153 3 1 + 195 196 153 0 2 0 + 106 196 153 154 3 1 + 196 197 154 0 2 0 + 118 197 154 155 3 1 + 197 198 155 0 2 0 + 132 198 155 156 3 1 + 198 199 156 0 2 0 + 131 199 156 157 3 1 + 199 200 157 0 2 0 + 145 200 157 158 3 1 + 200 201 158 0 2 0 + 158 201 158 159 3 1 + 201 202 159 0 2 0 + 157 202 159 160 3 1 + 202 203 160 0 2 0 + 169 203 160 161 3 1 + 203 204 161 0 2 0 + 168 204 161 162 3 1 + 204 205 162 0 2 0 + 167 205 162 163 3 1 + 205 206 163 0 2 0 + 176 206 163 164 3 1 + 206 207 164 0 2 0 + 175 207 164 165 3 1 + 207 208 165 0 2 0 + 174 208 165 166 3 1 + 208 209 166 0 2 0 + 173 209 166 167 3 1 + 209 210 167 0 2 0 + 172 210 167 168 3 1 + 210 211 168 0 2 0 + 171 211 168 169 3 1 + 211 212 169 0 2 0 + 170 212 169 170 3 1 + 212 213 170 0 2 0 + 161 213 170 171 3 1 + 213 214 171 0 2 0 + 160 214 171 172 3 1 + 214 215 172 0 2 0 + 159 215 172 173 3 1 + 215 216 173 0 2 0 + 147 216 173 174 3 1 + 216 217 174 0 2 0 + 146 217 174 175 3 1 + 217 218 175 0 2 0 + 133 218 175 176 3 1 + 218 219 176 0 2 0 + 120 219 176 177 3 1 + 219 220 177 0 2 0 + 119 220 177 178 3 1 + 220 221 178 0 2 0 + 107 221 178 179 3 1 + 221 222 179 0 2 0 + 97 222 179 180 3 1 + 222 223 180 0 2 0 + 85 223 180 181 3 1 + 223 224 181 0 2 0 + 73 224 181 182 3 1 + 224 225 182 0 2 0 + 59 225 182 183 3 1 + 225 226 183 0 2 0 + 45 226 183 184 3 1 + 226 227 184 0 2 0 + 46 227 184 185 3 1 + 227 228 185 0 2 0 + 32 228 185 186 3 1 + 228 229 186 0 2 0 + 19 229 186 187 3 1 + 229 230 187 0 2 0 + 20 230 187 188 3 1 + 230 231 188 0 2 0 + 8 231 188 189 3 1 + 231 232 189 0 2 0 + 9 232 189 190 3 1 + 232 177 190 0 2 0 + 233 38 191 192 3 1 + 51 233 191 216 4 2 + 233 52 192 193 4 -4 + 66 234 193 194 2 4 + 233 234 193 0 3 0 + 67 235 194 195 2 4 + 234 235 194 0 3 0 + 79 236 195 196 2 4 + 235 236 195 0 3 0 + 91 237 196 197 2 4 + 236 237 196 0 3 0 + 92 238 197 198 2 4 + 237 238 197 0 3 0 + 102 239 198 199 2 4 + 238 239 198 0 3 0 + 114 240 199 200 2 4 + 239 240 199 0 3 0 + 113 241 200 201 2 4 + 240 241 200 0 3 0 + 127 242 201 202 2 4 + 241 242 201 0 3 0 + 126 243 202 203 2 4 + 242 243 202 0 3 0 + 140 244 203 204 2 4 + 243 244 203 0 3 0 + 139 245 204 205 2 4 + 244 245 204 0 3 0 + 138 246 205 206 2 4 + 245 246 205 0 3 0 + 125 247 206 207 2 4 + 246 247 206 0 3 0 + 124 248 207 208 2 4 + 247 248 207 0 3 0 + 112 249 208 209 2 4 + 248 249 208 0 3 0 + 111 250 209 210 2 4 + 249 250 209 0 3 0 + 101 251 210 211 2 4 + 250 251 210 0 3 0 + 89 252 211 212 2 4 + 251 252 211 0 3 0 + 90 253 212 213 2 4 + 252 253 212 0 3 0 + 78 254 213 214 2 4 + 253 254 213 0 3 0 + 64 255 214 215 2 4 + 254 255 214 0 3 0 + 65 256 215 216 2 4 + 255 256 215 0 3 0 + 256 233 216 0 3 0 + 1 2 11 10 + 0 0 0 0 + --- --- --- --- + 2 3 12 11 + 0 0 0 0 + --- --- --- --- + 3 4 13 12 + 0 0 0 0 + --- --- --- --- + 4 5 14 13 + 0 0 0 0 + --- --- --- --- + 5 6 15 14 + 0 0 0 0 + --- --- --- --- + 6 7 16 15 + 0 0 0 0 + --- --- --- --- + 8 9 21 20 + 0 0 0 0 + --- --- --- --- + 9 10 22 21 + 0 0 0 0 + --- --- --- --- + 10 11 23 22 + 0 0 0 0 + --- --- --- --- + 11 12 24 23 + 0 0 0 0 + --- --- --- --- + 12 13 25 24 + 0 0 0 0 + --- --- --- --- + 13 14 26 25 + 0 0 0 0 + --- --- --- --- + 14 15 27 26 + 0 0 0 0 + --- --- --- --- + 15 16 28 27 + 0 0 0 0 + --- --- --- --- + 16 17 29 28 + 0 0 0 0 + --- --- --- --- + 17 18 30 29 + 0 0 0 0 + --- --- --- --- + 19 20 33 32 + 0 0 0 0 + --- --- --- --- + 20 21 34 33 + 0 0 0 0 + --- --- --- --- + 21 22 35 34 + 0 0 0 0 + --- --- --- --- + 22 23 36 35 + 0 0 0 0 + --- --- --- --- + 23 24 37 36 + 0 0 0 0 + --- --- --- --- + 24 25 38 37 + 0 0 0 0 + --- --- --- --- + 25 26 39 38 + 0 0 0 0 + --- --- --- --- + 26 27 40 39 + 0 0 0 0 + --- --- --- --- + 27 28 41 40 + 0 0 0 0 + --- --- --- --- + 28 29 42 41 + 0 0 0 0 + --- --- --- --- + 29 30 43 42 + 0 0 0 0 + --- --- --- --- + 30 31 44 43 + 0 0 0 0 + --- --- --- --- + 32 33 47 46 + 0 0 0 0 + --- --- --- --- + 33 34 48 47 + 0 0 0 0 + --- --- --- --- + 34 35 49 48 + 0 0 0 0 + --- --- --- --- + 35 36 50 49 + 0 0 0 0 + --- --- --- --- + 36 37 51 50 + 0 0 0 0 + --- --- --- --- + 39 40 53 52 + 0 0 0 0 + --- --- --- --- + 40 41 54 53 + 0 0 0 0 + --- --- --- --- + 41 42 55 54 + 0 0 0 0 + --- --- --- --- + 42 43 56 55 + 0 0 0 0 + --- --- --- --- + 43 44 57 56 + 0 0 0 0 + --- --- --- --- + 45 46 60 59 + 0 0 0 0 + --- --- --- --- + 46 47 61 60 + 0 0 0 0 + --- --- --- --- + 47 48 62 61 + 0 0 0 0 + --- --- --- --- + 48 49 63 62 + 0 0 0 0 + --- --- --- --- + 49 50 64 63 + 0 0 0 0 + --- --- --- --- + 50 51 65 64 + 0 0 0 0 + --- --- --- --- + 52 53 67 66 + 0 0 0 0 + --- --- --- --- + 53 54 68 67 + 0 0 0 0 + --- --- --- --- + 54 55 69 68 + 0 0 0 0 + --- --- --- --- + 55 56 70 69 + 0 0 0 0 + --- --- --- --- + 56 57 71 70 + 0 0 0 0 + --- --- --- --- + 57 58 72 71 + 0 0 0 0 + --- --- --- --- + 59 60 74 73 + 0 0 0 0 + --- --- --- --- + 60 61 75 74 + 0 0 0 0 + --- --- --- --- + 61 62 76 75 + 0 0 0 0 + --- --- --- --- + 62 63 77 76 + 0 0 0 0 + --- --- --- --- + 63 64 78 77 + 0 0 0 0 + --- --- --- --- + 67 68 80 79 + 0 0 0 0 + --- --- --- --- + 68 69 81 80 + 0 0 0 0 + --- --- --- --- + 69 70 82 81 + 0 0 0 0 + --- --- --- --- + 70 71 83 82 + 0 0 0 0 + --- --- --- --- + 71 72 84 83 + 0 0 0 0 + --- --- --- --- + 73 74 86 85 + 0 0 0 0 + --- --- --- --- + 74 75 87 86 + 0 0 0 0 + --- --- --- --- + 75 76 88 87 + 0 0 0 0 + --- --- --- --- + 76 77 89 88 + 0 0 0 0 + --- --- --- --- + 77 78 90 89 + 0 0 0 0 + --- --- --- --- + 79 80 92 91 + 0 0 0 0 + --- --- --- --- + 80 81 93 92 + 0 0 0 0 + --- --- --- --- + 81 82 94 93 + 0 0 0 0 + --- --- --- --- + 82 83 95 94 + 0 0 0 0 + --- --- --- --- + 83 84 96 95 + 0 0 0 0 + --- --- --- --- + 85 86 98 97 + 0 0 0 0 + --- --- --- --- + 86 87 99 98 + 0 0 0 0 + --- --- --- --- + 87 88 100 99 + 0 0 0 0 + --- --- --- --- + 88 89 101 100 + 0 0 0 0 + --- --- --- --- + 92 93 103 102 + 0 0 0 0 + --- --- --- --- + 93 94 104 103 + 0 0 0 0 + --- --- --- --- + 94 95 105 104 + 0 0 0 0 + --- --- --- --- + 95 96 106 105 + 0 0 0 0 + --- --- --- --- + 97 98 108 107 + 0 0 0 0 + --- --- --- --- + 98 99 109 108 + 0 0 0 0 + --- --- --- --- + 99 100 110 109 + 0 0 0 0 + --- --- --- --- + 100 101 111 110 + 0 0 0 0 + --- --- --- --- + 102 103 115 114 + 0 0 0 0 + --- --- --- --- + 103 104 116 115 + 0 0 0 0 + --- --- --- --- + 104 105 117 116 + 0 0 0 0 + --- --- --- --- + 105 106 118 117 + 0 0 0 0 + --- --- --- --- + 107 108 120 119 + 0 0 0 0 + --- --- --- --- + 108 109 121 120 + 0 0 0 0 + --- --- --- --- + 109 110 122 121 + 0 0 0 0 + --- --- --- --- + 110 111 123 122 + 0 0 0 0 + --- --- --- --- + 111 112 124 123 + 0 0 0 0 + --- --- --- --- + 113 114 128 127 + 0 0 0 0 + --- --- --- --- + 114 115 129 128 + 0 0 0 0 + --- --- --- --- + 115 116 130 129 + 0 0 0 0 + --- --- --- --- + 116 117 131 130 + 0 0 0 0 + --- --- --- --- + 117 118 132 131 + 0 0 0 0 + --- --- --- --- + 120 121 134 133 + 0 0 0 0 + --- --- --- --- + 121 122 135 134 + 0 0 0 0 + --- --- --- --- + 122 123 136 135 + 0 0 0 0 + --- --- --- --- + 123 124 137 136 + 0 0 0 0 + --- --- --- --- + 124 125 138 137 + 0 0 0 0 + --- --- --- --- + 126 127 141 140 + 0 0 0 0 + --- --- --- --- + 127 128 142 141 + 0 0 0 0 + --- --- --- --- + 128 129 143 142 + 0 0 0 0 + --- --- --- --- + 129 130 144 143 + 0 0 0 0 + --- --- --- --- + 130 131 145 144 + 0 0 0 0 + --- --- --- --- + 133 134 147 146 + 0 0 0 0 + --- --- --- --- + 134 135 148 147 + 0 0 0 0 + --- --- --- --- + 135 136 149 148 + 0 0 0 0 + --- --- --- --- + 136 137 150 149 + 0 0 0 0 + --- --- --- --- + 137 138 151 150 + 0 0 0 0 + --- --- --- --- + 138 139 152 151 + 0 0 0 0 + --- --- --- --- + 139 140 153 152 + 0 0 0 0 + --- --- --- --- + 140 141 154 153 + 0 0 0 0 + --- --- --- --- + 141 142 155 154 + 0 0 0 0 + --- --- --- --- + 142 143 156 155 + 0 0 0 0 + --- --- --- --- + 143 144 157 156 + 0 0 0 0 + --- --- --- --- + 144 145 158 157 + 0 0 0 0 + --- --- --- --- + 147 148 160 159 + 0 0 0 0 + --- --- --- --- + 148 149 161 160 + 0 0 0 0 + --- --- --- --- + 149 150 162 161 + 0 0 0 0 + --- --- --- --- + 150 151 163 162 + 0 0 0 0 + --- --- --- --- + 151 152 164 163 + 0 0 0 0 + --- --- --- --- + 152 153 165 164 + 0 0 0 0 + --- --- --- --- + 153 154 166 165 + 0 0 0 0 + --- --- --- --- + 154 155 167 166 + 0 0 0 0 + --- --- --- --- + 155 156 168 167 + 0 0 0 0 + --- --- --- --- + 156 157 169 168 + 0 0 0 0 + --- --- --- --- + 161 162 171 170 + 0 0 0 0 + --- --- --- --- + 162 163 172 171 + 0 0 0 0 + --- --- --- --- + 163 164 173 172 + 0 0 0 0 + --- --- --- --- + 164 165 174 173 + 0 0 0 0 + --- --- --- --- + 165 166 175 174 + 0 0 0 0 + --- --- --- --- + 166 167 176 175 + 0 0 0 0 + --- --- --- --- + 10 177 178 1 + 0 1 0 0 + -3.6705104009983383 -7.1082595194719094 0.0000000000000000 + -3.5803997071952218 -7.1540714237919358 0.0000000000000000 + -3.3605253584455799 -7.2599496771840100 0.0000000000000000 + -3.1375238868024042 -7.3590722146031649 0.0000000000000000 + -3.0442865551243754 -7.3981294507658468 0.0000000000000000 + --- OuterCircle --- --- + 1 178 179 2 + 0 1 0 0 + -3.0442865551243754 -7.3981294507658468 0.0000000000000000 + -2.9208434333314410 -7.4477294283536244 0.0000000000000000 + -2.6195632955431121 -7.5589607844361328 0.0000000000000000 + -2.3140614803533142 -7.6580101504989546 0.0000000000000000 + -2.1863978152204173 -7.6954314104928114 0.0000000000000000 + --- OuterCircle --- --- + 2 179 180 3 + 0 1 0 0 + -2.1863978152204173 -7.6954314104928114 0.0000000000000000 + -2.0339247302763477 -7.7371280325176395 0.0000000000000000 + -1.6626658046773015 -7.8253142059572776 0.0000000000000000 + -1.2876240548142968 -7.8956965679706554 0.0000000000000000 + -1.1313695802431920 -7.9195961306685545 0.0000000000000000 + --- OuterCircle --- --- + 3 180 181 4 + 0 1 0 0 + -1.1313695802431920 -7.9195961306685545 0.0000000000000000 + -0.96656542320610084 -7.9413947945346735 0.0000000000000000 + -0.56711151925005809 -7.9798737160893651 0.0000000000000000 + -0.16623058505690086 -7.9982727755804657 0.0000000000000000 + 3.6410244624318844E-009 -8.0000000000000000 0.0000000000000000 + --- OuterCircle --- --- + 4 181 182 5 + 0 1 0 0 + 3.6410244624318844E-009 -8.0000000000000000 0.0000000000000000 + 0.16623088894862023 -7.9982727692645836 0.0000000000000000 + 0.56711253687833307 -7.9798736437687676 0.0000000000000000 + 0.96656714691797452 -7.9413945847375480 0.0000000000000000 + 1.1313715929171329 -7.9195958431437745 0.0000000000000000 + --- OuterCircle --- --- + 5 182 183 6 + 0 1 0 0 + 1.1313715929171329 -7.9195958431437745 0.0000000000000000 + 1.2876257675546530 -7.8956962886581001 0.0000000000000000 + 1.6626667990339425 -7.8253139946835502 0.0000000000000000 + 2.0339250182345823 -7.7371279568196014 0.0000000000000000 + 2.1863978152204191 -7.6954314104928114 0.0000000000000000 + --- OuterCircle --- --- + 6 183 184 7 + 0 1 0 0 + 2.1863978152204191 -7.6954314104928114 0.0000000000000000 + 2.3140614803533164 -7.6580101504989546 0.0000000000000000 + 2.6195632955431036 -7.5589607844361355 0.0000000000000000 + 2.9208434333314228 -7.4477294283536315 0.0000000000000000 + 3.0442865551243541 -7.3981294507658548 0.0000000000000000 + --- OuterCircle --- --- + 7 184 185 16 + 0 1 0 0 + 3.0442865551243541 -7.3981294507658548 0.0000000000000000 + 3.1375241553142388 -7.3590721001237425 0.0000000000000000 + 3.3605262628541577 -7.2599492585463343 0.0000000000000000 + 3.5804012286008309 -7.1540706623735320 0.0000000000000000 + 3.6705121720218283 -7.1082586049636376 0.0000000000000000 + --- OuterCircle --- --- + 16 185 186 17 + 0 1 0 0 + 3.6705121720218283 -7.1082586049636376 0.0000000000000000 + 3.7859245146957798 -7.0474658969749919 0.0000000000000000 + 4.0603471263922497 -6.8930095903892514 0.0000000000000000 + 4.3284784509689231 -6.7278729402016557 0.0000000000000000 + 4.4376011313588206 -6.6564026469980702 0.0000000000000000 + --- OuterCircle --- --- + 17 186 187 18 + 0 1 0 0 + 4.4376011313588206 -6.6564026469980702 0.0000000000000000 + 4.5377671295720710 -6.5885255921014112 0.0000000000000000 + 4.7752670922349045 -6.4184752237442186 0.0000000000000000 + 5.0064007762506497 -6.2398678886300862 0.0000000000000000 + 5.1002019105058052 -6.1634357684714240 0.0000000000000000 + --- OuterCircle --- --- + 18 187 188 30 + 0 1 0 0 + 5.1002019105058052 -6.1634357684714240 0.0000000000000000 + 5.1846655472125462 -6.0925563734402353 0.0000000000000000 + 5.3844888456410187 -5.9166950125190203 0.0000000000000000 + 5.5783507939965791 -5.7342830780419041 0.0000000000000000 + 5.6568541807137214 -5.6568543182710380 0.0000000000000000 + --- OuterCircle --- --- + 30 188 189 31 + 0 1 0 0 + 5.6568541807137214 -5.6568543182710380 0.0000000000000000 + 5.7342829622587921 -5.5783509130161875 0.0000000000000000 + 5.9166949470519077 -5.3844889175789401 0.0000000000000000 + 6.0925563549769590 -5.1846655689089411 0.0000000000000000 + 6.1634357684714249 -5.1002019105058043 0.0000000000000000 + --- OuterCircle --- --- + 31 189 190 44 + 0 1 0 0 + 6.1634357684714249 -5.1002019105058043 0.0000000000000000 + 6.2398678886300871 -5.0064007762506488 0.0000000000000000 + 6.4184752237442195 -4.7752670922349036 0.0000000000000000 + 6.5885255921014121 -4.5377671295720701 0.0000000000000000 + 6.6564026469980710 -4.4376011313588197 0.0000000000000000 + --- OuterCircle --- --- + 44 190 191 57 + 0 1 0 0 + 6.6564026469980710 -4.4376011313588197 0.0000000000000000 + 6.7278729460341653 -4.3284784419032931 0.0000000000000000 + 6.8930096090691286 -4.0603470946805356 0.0000000000000000 + 7.0474659267083171 -3.7859244593474495 0.0000000000000000 + 7.1082586387364701 -3.6705121066178688 0.0000000000000000 + --- OuterCircle --- --- + 57 191 192 58 + 0 1 0 0 + 7.1082586387364701 -3.6705121066178688 0.0000000000000000 + 7.1540706904927474 -3.5804011724152676 0.0000000000000000 + 7.2599492740066429 -3.3605262294543121 0.0000000000000000 + 7.3590721043514726 -3.1375241453980860 0.0000000000000000 + 7.3981294507658548 -3.0442865551243545 0.0000000000000000 + --- OuterCircle --- --- + 58 192 193 72 + 0 1 0 0 + 7.3981294507658548 -3.0442865551243545 0.0000000000000000 + 7.4477294283536315 -2.9208434333314215 0.0000000000000000 + 7.5589607844361355 -2.6195632955431023 0.0000000000000000 + 7.6580101504989546 -2.3140614803533150 0.0000000000000000 + 7.6954314104928114 -2.1863978152204178 0.0000000000000000 + --- OuterCircle --- --- + 72 193 194 84 + 0 1 0 0 + 7.6954314104928114 -2.1863978152204178 0.0000000000000000 + 7.7371279625319387 -2.0339249965046329 0.0000000000000000 + 7.8253140106267232 -1.6626667239976600 0.0000000000000000 + 7.8956963097356363 -1.2876256383075975 0.0000000000000000 + 7.9195958648410283 -1.1313714410364439 0.0000000000000000 + --- OuterCircle --- --- + 84 194 195 96 + 0 1 0 0 + 7.9195958648410283 -1.1313714410364439 0.0000000000000000 + 7.9413945972463518 -0.96656704414461170 0.0000000000000000 + 7.9798736425696513 -0.56711255375116587 0.0000000000000000 + 7.9982727664103441 -0.16623102628154870 0.0000000000000000 + 7.9999999999999973 -1.9089446951922548E-007 0.0000000000000000 + --- OuterCircle --- --- + 96 195 196 106 + 0 1 0 0 + 7.9999999999999973 -1.9089446951922548E-007 0.0000000000000000 + 7.9982727732846479 0.16623069552132208 0.0000000000000000 + 7.9798736573010984 0.56711234646407993 0.0000000000000000 + 7.9413946074905288 0.96656695997760744 0.0000000000000000 + 7.9195958696254358 1.1313714075456114 0.0000000000000000 + --- OuterCircle --- --- + 106 196 197 118 + 0 1 0 0 + 7.9195958696254358 1.1313714075456114 0.0000000000000000 + 7.8956963143833914 1.2876256098076511 0.0000000000000000 + 7.8253140141423119 1.6626667074515964 0.0000000000000000 + 7.7371279637915515 2.0339249917130173 0.0000000000000000 + 7.6954314104928114 2.1863978152204187 0.0000000000000000 + --- OuterCircle --- --- + 118 197 198 132 + 0 1 0 0 + 7.6954314104928114 2.1863978152204187 0.0000000000000000 + 7.6580101504989546 2.3140614803533159 0.0000000000000000 + 7.5589607844361355 2.6195632955431032 0.0000000000000000 + 7.4477294283536315 2.9208434333314224 0.0000000000000000 + 7.3981294507658548 3.0442865551243554 0.0000000000000000 + --- OuterCircle --- --- + 132 198 199 131 + 0 1 0 0 + 7.3981294507658548 3.0442865551243554 0.0000000000000000 + 7.3590721108786434 3.1375241300885865 0.0000000000000000 + 7.2599492978757336 3.3605261778884632 0.0000000000000000 + 7.1540707339058658 3.5804010856706525 0.0000000000000000 + 7.1082586908781789 3.6705120056410174 0.0000000000000000 + --- OuterCircle --- --- + 131 199 200 145 + 0 1 0 0 + 7.1082586908781789 3.6705120056410174 0.0000000000000000 + 7.0474659726134474 3.7859243738954413 0.0000000000000000 + 6.8930096379088956 4.0603470457209783 0.0000000000000000 + 6.7278729550389462 4.3284784279069148 0.0000000000000000 + 6.6564026469980710 4.4376011313588197 0.0000000000000000 + --- OuterCircle --- --- + 145 200 201 158 + 0 1 0 0 + 6.6564026469980710 4.4376011313588197 0.0000000000000000 + 6.5885255921014068 4.5377671295720763 0.0000000000000000 + 6.4184752237442195 4.7752670922349036 0.0000000000000000 + 6.2398678886300898 5.0064007762506453 0.0000000000000000 + 6.1634357684714249 5.1002019105058043 0.0000000000000000 + --- OuterCircle --- --- + 158 201 202 157 + 0 1 0 0 + 6.1634357684714249 5.1002019105058043 0.0000000000000000 + 6.0925563912123897 5.1846655263282955 0.0000000000000000 + 5.9166950755355483 5.3844887763958980 0.0000000000000000 + 5.7342831894909869 5.5783506794321447 0.0000000000000000 + 5.6568544506792646 5.6568540483054885 0.0000000000000000 + --- OuterCircle --- --- + 157 202 203 169 + 0 1 0 0 + 5.6568544506792646 5.6568540483054885 0.0000000000000000 + 5.5783510275806201 5.7342828508097012 0.0000000000000000 + 5.3844889868240617 5.9166948840353761 0.0000000000000000 + 5.1846655897931875 6.0925563372048082 0.0000000000000000 + 5.1002019105058034 6.1634357684714258 0.0000000000000000 + --- OuterCircle --- --- + 169 203 204 168 + 0 1 0 0 + 5.1002019105058034 6.1634357684714258 0.0000000000000000 + 5.0064007762506453 6.2398678886300907 0.0000000000000000 + 4.7752670922349036 6.4184752237442195 0.0000000000000000 + 4.5377671295720763 6.5885255921014076 0.0000000000000000 + 4.4376011313588188 6.6564026469980710 0.0000000000000000 + --- OuterCircle --- --- + 168 204 205 167 + 0 1 0 0 + 4.4376011313588188 6.6564026469980710 0.0000000000000000 + 4.3284784188412866 6.7278729608714549 0.0000000000000000 + 4.0603470140092695 6.8930096565887684 0.0000000000000000 + 3.7859243185471225 7.0474660023467655 0.0000000000000000 + 3.6705119402370658 7.1082587246510052 0.0000000000000000 + --- OuterCircle --- --- + 167 205 206 176 + 0 1 0 0 + 3.6705119402370658 7.1082587246510052 0.0000000000000000 + 3.5804010294850976 7.1540707620250759 0.0000000000000000 + 3.3605261444886256 7.2599493133360387 0.0000000000000000 + 3.1375241201724351 7.3590721151063727 0.0000000000000000 + 3.0442865551243541 7.3981294507658548 0.0000000000000000 + --- OuterCircle --- --- + 176 206 207 175 + 0 1 0 0 + 3.0442865551243541 7.3981294507658548 0.0000000000000000 + 2.9208434333314224 7.4477294283536315 0.0000000000000000 + 2.6195632955431032 7.5589607844361355 0.0000000000000000 + 2.3140614803533159 7.6580101504989546 0.0000000000000000 + 2.1863978152204182 7.6954314104928114 0.0000000000000000 + --- OuterCircle --- --- + 175 207 208 174 + 0 1 0 0 + 2.1863978152204182 7.6954314104928114 0.0000000000000000 + 2.0339249699830715 7.7371279695038888 0.0000000000000000 + 1.6626666324153139 7.8253140300854840 0.0000000000000000 + 1.2876254805605953 7.8956963354609258 0.0000000000000000 + 1.1313712556649251 7.9195958913226860 0.0000000000000000 + --- OuterCircle --- --- + 174 208 209 173 + 0 1 0 0 + 1.1313712556649251 7.9195958913226860 0.0000000000000000 + 0.96656685773355411 7.9413946199349068 0.0000000000000000 + 0.56711236515284669 7.9798736559729280 0.0000000000000000 + 0.16623083596138777 7.9982727703658352 0.0000000000000000 + 0.0000000000000000 8.0000000000000000 0.0000000000000000 + --- OuterCircle --- --- + 173 209 210 172 + 0 1 0 0 + 0.0000000000000000 8.0000000000000000 0.0000000000000000 + -0.16623058816404371 7.9982727755158889 0.0000000000000000 + -0.56711152106598395 7.9798737159603110 0.0000000000000000 + -0.96656542373539966 7.9413947944702512 0.0000000000000000 + -1.1313695802431845 7.9195961306685554 0.0000000000000000 + --- OuterCircle --- --- + 172 210 211 171 + 0 1 0 0 + -1.1313695802431845 7.9195961306685554 0.0000000000000000 + -1.2876240548142890 7.8956965679706572 0.0000000000000000 + -1.6626658046772940 7.8253142059572793 0.0000000000000000 + -2.0339247302763508 7.7371280325176395 0.0000000000000000 + -2.1863978152204200 7.6954314104928105 0.0000000000000000 + --- OuterCircle --- --- + 171 211 212 170 + 0 1 0 0 + -2.1863978152204200 7.6954314104928105 0.0000000000000000 + -2.3140614803533204 7.6580101504989528 0.0000000000000000 + -2.6195632955431045 7.5589607844361346 0.0000000000000000 + -2.9208434333314273 7.4477294283536297 0.0000000000000000 + -3.0442865551243550 7.3981294507658548 0.0000000000000000 + --- OuterCircle --- --- + 170 212 213 161 + 0 1 0 0 + -3.0442865551243550 7.3981294507658548 0.0000000000000000 + -3.1375238868023905 7.3590722146031711 0.0000000000000000 + -3.3605253584455697 7.2599496771840144 0.0000000000000000 + -3.5803997071952116 7.1540714237919403 0.0000000000000000 + -3.6705104009983285 7.1082595194719147 0.0000000000000000 + --- OuterCircle --- --- + 161 213 214 160 + 0 1 0 0 + -3.6705104009983285 7.1082595194719147 0.0000000000000000 + -3.7859230159610333 7.0474667021005866 0.0000000000000000 + -4.0603462676951780 6.8930100962071599 0.0000000000000000 + -4.3284782054877473 6.7278730981356629 0.0000000000000000 + -4.4376011313588100 6.6564026469980773 0.0000000000000000 + --- OuterCircle --- --- + 160 214 215 159 + 0 1 0 0 + -4.4376011313588100 6.6564026469980773 0.0000000000000000 + -4.5377671295720692 6.5885255921014121 0.0000000000000000 + -4.7752670922349054 6.4184752237442178 0.0000000000000000 + -5.0064007762506559 6.2398678886300809 0.0000000000000000 + -5.1002019105058114 6.1634357684714187 0.0000000000000000 + --- OuterCircle --- --- + 159 215 216 147 + 0 1 0 0 + -5.1002019105058114 6.1634357684714187 0.0000000000000000 + -5.1846653290170721 6.0925565591209976 0.0000000000000000 + -5.3844881221784417 5.9166956709061242 0.0000000000000000 + -5.5783495970446006 5.7342842424449403 0.0000000000000000 + -5.6568527973323901 5.6568557016519971 0.0000000000000000 + --- OuterCircle --- --- + 147 216 217 146 + 0 1 0 0 + -5.6568527973323901 5.6568557016519971 0.0000000000000000 + -5.7342817978554761 5.5783521099679048 0.0000000000000000 + -5.9166942886646945 5.3844896410414416 0.0000000000000000 + -6.0925561692961825 5.1846657871044126 0.0000000000000000 + -6.1634357684714214 5.1002019105058087 0.0000000000000000 + --- OuterCircle --- --- + 146 217 218 133 + 0 1 0 0 + -6.1634357684714214 5.1002019105058087 0.0000000000000000 + -6.2398678886300836 5.0064007762506533 0.0000000000000000 + -6.4184752237442160 4.7752670922349090 0.0000000000000000 + -6.5885255921014103 4.5377671295720718 0.0000000000000000 + -6.6564026469980710 4.4376011313588188 0.0000000000000000 + --- OuterCircle --- --- + 133 218 219 120 + 0 1 0 0 + -6.6564026469980710 4.4376011313588188 0.0000000000000000 + -6.7278730981356611 4.3284782054877509 0.0000000000000000 + -6.8930100962071545 4.0603462676951878 0.0000000000000000 + -7.0474667021005848 3.7859230159610364 0.0000000000000000 + -7.1082595194719094 3.6705104009983378 0.0000000000000000 + --- OuterCircle --- --- + 120 219 220 119 + 0 1 0 0 + -7.1082595194719094 3.6705104009983378 0.0000000000000000 + -7.1540714237919358 3.5803997071952214 0.0000000000000000 + -7.2599496771840100 3.3605253584455794 0.0000000000000000 + -7.3590722146031666 3.1375238868024007 0.0000000000000000 + -7.3981294507658477 3.0442865551243714 0.0000000000000000 + --- OuterCircle --- --- + 119 220 221 107 + 0 1 0 0 + -7.3981294507658477 3.0442865551243714 0.0000000000000000 + -7.4477294283536226 2.9208434333314437 0.0000000000000000 + -7.5589607844361311 2.6195632955431147 0.0000000000000000 + -7.6580101504989537 2.3140614803533173 0.0000000000000000 + -7.6954314104928114 2.1863978152204169 0.0000000000000000 + --- OuterCircle --- --- + 107 221 222 97 + 0 1 0 0 + -7.6954314104928114 2.1863978152204169 0.0000000000000000 + -7.7371280325176404 2.0339247302763472 0.0000000000000000 + -7.8253142059572784 1.6626658046772975 0.0000000000000000 + -7.8956965679706554 1.2876240548142996 0.0000000000000000 + -7.9195961306685545 1.1313695802431951 0.0000000000000000 + --- OuterCircle --- --- + 97 222 223 85 + 0 1 0 0 + -7.9195961306685545 1.1313695802431951 0.0000000000000000 + -7.9413947581331668 0.96656572228434601 0.0000000000000000 + -7.9798736431692099 0.56711254531473887 0.0000000000000000 + -7.9982727390922488 0.16623234069752618 0.0000000000000000 + -7.9999999999997362 2.0536640888705361E-006 0.0000000000000000 + --- OuterCircle --- --- + 85 223 224 73 + 0 1 0 0 + -7.9999999999997362 2.0536640888705361E-006 0.0000000000000000 + -7.9982728119391444 -0.16622883563054935 0.0000000000000000 + -7.9798737887512807 -0.56711049681722270 0.0000000000000000 + -7.9413948308073232 -0.96656512518646220 0.0000000000000000 + -7.9195961306685563 -1.1313695802431840 0.0000000000000000 + --- OuterCircle --- --- + 73 224 225 59 + 0 1 0 0 + -7.9195961306685563 -1.1313695802431840 0.0000000000000000 + -7.8956965679706572 -1.2876240548142885 0.0000000000000000 + -7.8253142059572793 -1.6626658046772935 0.0000000000000000 + -7.7371280325176395 -2.0339247302763503 0.0000000000000000 + -7.6954314104928114 -2.1863978152204195 0.0000000000000000 + --- OuterCircle --- --- + 59 225 226 45 + 0 1 0 0 + -7.6954314104928114 -2.1863978152204195 0.0000000000000000 + -7.6580101504989528 -2.3140614803533199 0.0000000000000000 + -7.5589607844361355 -2.6195632955431041 0.0000000000000000 + -7.4477294283536297 -2.9208434333314268 0.0000000000000000 + -7.3981294507658548 -3.0442865551243545 0.0000000000000000 + --- OuterCircle --- --- + 45 226 227 46 + 0 1 0 0 + -7.3981294507658548 -3.0442865551243545 0.0000000000000000 + -7.3590722146031711 -3.1375238868023900 0.0000000000000000 + -7.2599496771840144 -3.3605253584455692 0.0000000000000000 + -7.1540714237919403 -3.5803997071952112 0.0000000000000000 + -7.1082595194719147 -3.6705104009983280 0.0000000000000000 + --- OuterCircle --- --- + 46 227 228 32 + 0 1 0 0 + -7.1082595194719147 -3.6705104009983280 0.0000000000000000 + -7.0474667021005866 -3.7859230159610329 0.0000000000000000 + -6.8930100962071599 -4.0603462676951780 0.0000000000000000 + -6.7278730981356638 -4.3284782054877473 0.0000000000000000 + -6.6564026469980782 -4.4376011313588091 0.0000000000000000 + --- OuterCircle --- --- + 32 228 229 19 + 0 1 0 0 + -6.6564026469980782 -4.4376011313588091 0.0000000000000000 + -6.5885255921014130 -4.5377671295720683 0.0000000000000000 + -6.4184752237442186 -4.7752670922349054 0.0000000000000000 + -6.2398678886300818 -5.0064007762506559 0.0000000000000000 + -6.1634357684714196 -5.1002019105058105 0.0000000000000000 + --- OuterCircle --- --- + 19 229 230 20 + 0 1 0 0 + -6.1634357684714196 -5.1002019105058105 0.0000000000000000 + -6.0925561692961807 -5.1846657871044153 0.0000000000000000 + -5.9166942886646918 -5.3844896410414433 0.0000000000000000 + -5.7342817978554717 -5.5783521099679092 0.0000000000000000 + -5.6568527973323857 -5.6568557016520016 0.0000000000000000 + --- OuterCircle --- --- + 20 230 231 8 + 0 1 0 0 + -5.6568527973323857 -5.6568557016520016 0.0000000000000000 + -5.5783495970445989 -5.7342842424449421 0.0000000000000000 + -5.3844881221784373 -5.9166956709061287 0.0000000000000000 + -5.1846653290170703 -6.0925565591209994 0.0000000000000000 + -5.1002019105058114 -6.1634357684714187 0.0000000000000000 + --- OuterCircle --- --- + 8 231 232 9 + 0 1 0 0 + -5.1002019105058114 -6.1634357684714187 0.0000000000000000 + -5.0064007762506542 -6.2398678886300827 0.0000000000000000 + -4.7752670922349063 -6.4184752237442178 0.0000000000000000 + -4.5377671295720754 -6.5885255921014076 0.0000000000000000 + -4.4376011313588188 -6.6564026469980710 0.0000000000000000 + --- OuterCircle --- --- + 9 232 177 10 + 0 1 0 0 + -4.4376011313588188 -6.6564026469980710 0.0000000000000000 + -4.3284782054877544 -6.7278730981356594 0.0000000000000000 + -4.0603462676951878 -6.8930100962071537 0.0000000000000000 + -3.7859230159610400 -7.0474667021005830 0.0000000000000000 + -3.6705104009983383 -7.1082595194719094 0.0000000000000000 + --- OuterCircle --- --- + 51 37 38 233 + 0 0 0 0 + --- --- --- --- + 233 38 39 52 + 0 0 0 0 + --- --- --- --- + 52 66 234 233 + 0 0 1 0 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + 8.1918573019674312E-002 -2.8361628539606514 0.0000000000000000 + 0.27968750301402334 -2.4406249939719533 0.0000000000000000 + 0.47745643300837237 -2.0450871339832553 0.0000000000000000 + 0.55937500602804668 -1.8812499879439066 0.0000000000000000 + --- --- RightSlant --- + 66 67 235 234 + 0 0 1 0 + 0.55937500602804668 -1.8812499879439066 0.0000000000000000 + 0.60056311315811417 -1.7988737736837717 0.0000000000000000 + 0.69999999999999973 -1.6000000000000005 0.0000000000000000 + 0.79943688684188530 -1.4011262263162294 0.0000000000000000 + 0.84062499397195278 -1.3187500120560944 0.0000000000000000 + --- --- RightSlant --- + 67 79 236 235 + 0 0 1 0 + 0.84062499397195278 -1.3187500120560944 0.0000000000000000 + 0.89325425707682937 -1.2134914858463413 0.0000000000000000 + 1.0203125378423255 -0.95937492431534910 0.0000000000000000 + 1.1473708186078211 -0.70525836278435783 0.0000000000000000 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + --- --- RightSlant --- + 79 91 237 236 + 0 0 1 0 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + 1.2526293208844796 -0.49474135823104071 0.0000000000000000 + 1.3796875438703724 -0.24062491225925520 0.0000000000000000 + 1.5067457668562652 1.3491533712530313E-002 0.0000000000000000 + 1.5593750060280467 0.11875001205609337 0.0000000000000000 + --- --- RightSlant --- + 91 92 238 237 + 0 0 1 0 + 1.5593750060280467 0.11875001205609337 0.0000000000000000 + 1.6005631131581151 0.20112622631623012 0.0000000000000000 + 1.6999999999999993 0.39999999999999858 0.0000000000000000 + 1.7994368868418849 0.59887377368376971 0.0000000000000000 + 1.8406249939719528 0.68124998794390557 0.0000000000000000 + --- --- RightSlant --- + 92 102 239 238 + 0 0 1 0 + 1.8406249939719528 0.68124998794390557 0.0000000000000000 + 1.8639649232289370 0.72792984645787406 0.0000000000000000 + 1.9203124969859759 0.84062499397195189 0.0000000000000000 + 1.9766600707430158 0.95332014148603150 0.0000000000000000 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + --- --- RightSlant --- + 102 114 240 239 + 0 0 1 0 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + 1.9983479703871072 1.0812735458173770 0.0000000000000000 + 1.9807707726899886 1.2766715490561058 0.0000000000000000 + 1.9441339362737691 1.4694073261344140 0.0000000000000000 + 1.9234528539428932 1.5480229180052043 0.0000000000000000 + --- --- IceCream --- + 114 113 241 240 + 0 0 1 0 + 1.9234528539428932 1.5480229180052043 0.0000000000000000 + 1.9048209196670516 1.6096369936271651 0.0000000000000000 + 1.8517494276368289 1.7556613376683212 0.0000000000000000 + 1.7875027702478623 1.8971253236623173 0.0000000000000000 + 1.7577069153495042 1.9541836299856179 0.0000000000000000 + --- --- IceCream --- + 113 127 242 241 + 0 0 1 0 + 1.7577069153495042 1.9541836299856179 0.0000000000000000 + 1.7159031169606289 2.0274611881744238 0.0000000000000000 + 1.6025531944504807 2.1965881743342441 0.0000000000000000 + 1.4725959561431350 2.3533148746507173 0.0000000000000000 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + --- --- IceCream --- + 127 126 243 242 + 0 0 1 0 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + 1.3533148446578711 2.4725959837065434 0.0000000000000000 + 1.1965881552143354 2.6025532087268597 0.0000000000000000 + 1.0274611821782322 2.7159031205510731 0.0000000000000000 + 0.95418362998561790 2.7577069153495044 0.0000000000000000 + --- --- IceCream --- + 126 140 244 243 + 0 0 1 0 + 0.95418362998561790 2.7577069153495044 0.0000000000000000 + 0.89712532762418773 2.7875027682594489 0.0000000000000000 + 0.75566135168116888 2.8517494219184703 0.0000000000000000 + 0.60963701823418193 2.9048209117915880 0.0000000000000000 + 0.54802294711610733 2.9234528456487245 0.0000000000000000 + --- --- IceCream --- + 140 139 245 244 + 0 0 1 0 + 0.54802294711610733 2.9234528456487245 0.0000000000000000 + 0.46940735118449745 2.9441339302254752 0.0000000000000000 + 0.27667156381993480 2.9807707706277959 0.0000000000000000 + 8.1273549858423472E-002 2.9983479702227562 0.0000000000000000 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + --- --- IceCream --- + 139 138 246 245 + 0 0 1 0 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + -8.1273514348751255E-002 2.9983479716669477 0.0000000000000000 + -0.27667144147234074 2.9807707877171499 0.0000000000000000 + -0.46940714556157248 2.9441339798727189 0.0000000000000000 + -0.54802270862630975 2.9234529135983243 0.0000000000000000 + --- --- IceCream --- + 138 125 247 246 + 0 0 1 0 + -0.54802270862630975 2.9234529135983243 0.0000000000000000 + -0.60963681664226710 2.9048209763109716 0.0000000000000000 + -0.75566123688154063 2.8517494687658642 0.0000000000000000 + -0.89712529516674266 2.7875027845494351 0.0000000000000000 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + --- --- IceCream --- + 125 124 248 247 + 0 0 1 0 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + -1.0274611529224809 2.7159031380690477 0.0000000000000000 + -1.1965880619272244 2.6025532783821101 0.0000000000000000 + -1.3533146983210931 2.4725961181899434 0.0000000000000000 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + --- --- IceCream --- + 124 112 249 248 + 0 0 1 0 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + -1.4725958216597181 2.3533150209874787 0.0000000000000000 + -1.6025531247952236 2.1965882676213502 0.0000000000000000 + -1.7159030994426530 2.0274612174301749 0.0000000000000000 + -1.7577069153495026 1.9541836299856208 0.0000000000000000 + --- --- IceCream --- + 112 111 250 249 + 0 0 1 0 + -1.7577069153495026 1.9541836299856208 0.0000000000000000 + -1.7875027845494327 1.8971252951667479 0.0000000000000000 + -1.8517494687658640 1.7556612368815410 0.0000000000000000 + -1.9048209763109714 1.6096368166422679 0.0000000000000000 + -1.9234529135983243 1.5480227086263101 0.0000000000000000 + --- --- IceCream --- + 111 101 251 250 + 0 0 1 0 + -1.9234529135983243 1.5480227086263101 0.0000000000000000 + -1.9441339798883621 1.4694071454967825 0.0000000000000000 + -1.9807707877486287 1.2766714412469717 0.0000000000000000 + -1.9983479716827337 1.0812735139606025 0.0000000000000000 + -2.0000000000000000 1.0000000000000002 0.0000000000000000 + --- --- IceCream --- + 101 89 252 251 + 0 0 1 0 + -2.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.9766600707430160 0.95332014148603195 0.0000000000000000 + -1.9203124969859764 0.84062499397195278 0.0000000000000000 + -1.8639649232289368 0.72792984645787362 0.0000000000000000 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + --- --- LeftSlant --- + 89 90 253 252 + 0 0 1 0 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + -1.7994368868418851 0.59887377368377015 0.0000000000000000 + -1.7000000000000000 0.39999999999999991 0.0000000000000000 + -1.6005631131581148 0.20112622631622967 0.0000000000000000 + -1.5593750060280471 0.11875001205609426 0.0000000000000000 + --- --- LeftSlant --- + 90 78 254 253 + 0 0 1 0 + -1.5593750060280471 0.11875001205609426 0.0000000000000000 + -1.5067457553473789 1.3491510694757736E-002 0.0000000000000000 + -1.3796875045765755 -0.24062499084684896 0.0000000000000000 + -1.2526292538057724 -0.49474149238845522 0.0000000000000000 + -1.2000000031251039 -0.59999999374979218 0.0000000000000000 + --- --- LeftSlant --- + 78 64 255 254 + 0 0 1 0 + -1.2000000031251039 -0.59999999374979218 0.0000000000000000 + -1.1473707515291136 -0.70525849694177278 0.0000000000000000 + -1.0203124985485283 -0.95937500290294331 0.0000000000000000 + -0.89325424556794286 -1.2134915088641143 0.0000000000000000 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + --- --- LeftSlant --- + 64 65 256 255 + 0 0 1 0 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + -0.79943688684188507 -1.4011262263162299 0.0000000000000000 + -0.69999999999999996 -1.6000000000000001 0.0000000000000000 + -0.60056311315811484 -1.7988737736837703 0.0000000000000000 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + --- --- LeftSlant --- + 65 51 233 256 + 0 0 1 0 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + -0.47745643300837282 -2.0450871339832544 0.0000000000000000 + -0.27968750301402356 -2.4406249939719529 0.0000000000000000 + -8.1918573019674756E-002 -2.8361628539606505 0.0000000000000000 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + --- --- LeftSlant --- diff --git a/previews/PR1693/tutorials/out/ice_cream_curved_sides.tec b/previews/PR1693/tutorials/out/ice_cream_curved_sides.tec new file mode 100644 index 00000000000..535e295d57c --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_curved_sides.tec @@ -0,0 +1,474 @@ + VARIABLES = "X", "Y", "Z" + ZONE F=FEPOINT, ET=QUADRILATERAL, N= 256 E= 216 + -2.6873977405837541 -6.8533127622695584 0.0000000000000000 + -2.0107216208337615 -6.8653592763871760 0.0000000000000000 + -1.0410418717253931 -6.9216393501901949 0.0000000000000000 + 2.9912702576840707E-007 -6.9498898853362308 0.0000000000000000 + 1.0410424460724244 -6.9216392767031785 0.0000000000000000 + 2.0107220324553001 -6.8653591831123713 0.0000000000000000 + 2.6873981284579389 -6.8533125932786199 0.0000000000000000 + -4.7376904454980995 -5.7175213451225044 0.0000000000000000 + -4.1206720130528520 -5.8675490522077896 0.0000000000000000 + -3.1043042956445648 -6.1731350923322887 0.0000000000000000 + -2.0036785626447200 -5.9851228109660299 0.0000000000000000 + -1.0098066418509064 -5.9615428122665204 0.0000000000000000 + 1.4706799468291222E-007 -5.9621383436589896 0.0000000000000000 + 1.0098069252998503 -5.9615427750810719 0.0000000000000000 + 2.0036788470530045 -5.9851227251882229 0.0000000000000000 + 3.1043047227986076 -6.1731348858195423 0.0000000000000000 + 4.1206723395676512 -5.8675488550488604 0.0000000000000000 + 4.7376907442183054 -5.7175210852012199 0.0000000000000000 + -5.7175290854607779 -4.7380091301910010 0.0000000000000000 + -5.0338745166877699 -5.0343954062500895 0.0000000000000000 + -4.0192675410949015 -4.9833531598216387 0.0000000000000000 + -3.0341474170277136 -5.0182548701078833 0.0000000000000000 + -2.0156881211264164 -5.0103777714865521 0.0000000000000000 + -1.0040300753799325 -4.9870767872107384 0.0000000000000000 + 6.0815912483782476E-008 -4.9814748373723354 0.0000000000000000 + 1.0040302008008126 -4.9870767661818354 0.0000000000000000 + 2.0156882686372239 -5.0103777190234284 0.0000000000000000 + 3.0341475955502211 -5.0182547800320005 0.0000000000000000 + 4.0192677419725520 -4.9833530285321146 0.0000000000000000 + 5.0338748213315210 -5.0343951447304720 0.0000000000000000 + 5.7175292975176388 -4.7380089561448235 0.0000000000000000 + -5.8675188863064056 -4.1212636296863909 0.0000000000000000 + -4.9817761240538099 -4.0207066396640707 0.0000000000000000 + -4.0043466716132494 -4.0091310423573763 0.0000000000000000 + -2.9990315694177996 -4.0029589564990600 0.0000000000000000 + -1.9980410613753681 -4.0034989440708078 0.0000000000000000 + -1.0025886914582574 -4.0005457543668728 0.0000000000000000 + 2.0716010322157786E-008 -3.9975159229364250 0.0000000000000000 + 1.0025887371619329 -4.0005457439384919 0.0000000000000000 + 1.9980411183580911 -4.0034989210294167 0.0000000000000000 + 2.9990316405720265 -4.0029589207724925 0.0000000000000000 + 4.0043467561697534 -4.0091310005645440 0.0000000000000000 + 4.9817761918620427 -4.0207066409172585 0.0000000000000000 + 5.8675188518455164 -4.1212637904706897 0.0000000000000000 + -6.8541002111688183 -2.6879947245913107 0.0000000000000000 + -6.1729085409881828 -3.1048888913844155 0.0000000000000000 + -5.0136659075640297 -3.0350713738960646 0.0000000000000000 + -3.9875424262402634 -3.0037083370185043 0.0000000000000000 + -2.9583450770060664 -2.9862077152150777 0.0000000000000000 + -1.9564448711240272 -3.0074316257274023 0.0000000000000000 + -1.0288837123639378 -3.0335503938670736 0.0000000000000000 + 1.0288837261293409 -3.0335503875679914 0.0000000000000000 + 1.9564448907221292 -3.0074316143886093 0.0000000000000000 + 2.9583450995996925 -2.9862077071259527 0.0000000000000000 + 3.9875424417605054 -3.0037083567292124 0.0000000000000000 + 5.0136658835814423 -3.0350714872829925 0.0000000000000000 + 6.1729083819393678 -3.1048892701218342 0.0000000000000000 + 6.8541000555287406 -2.6879951006708396 0.0000000000000000 + -6.8662753709801922 -2.0111701987867616 0.0000000000000000 + -5.9840270273315026 -2.0036316982582778 0.0000000000000000 + -4.9988021360598456 -2.0128444316642962 0.0000000000000000 + -3.9673460790320734 -1.9910456416213265 0.0000000000000000 + -2.9250676751279636 -1.9602609213766236 0.0000000000000000 + -1.7488220331260820 -1.8941799125227698 0.0000000000000000 + -1.0549997787868850 -2.3236466700725056 0.0000000000000000 + 1.0549997837346989 -2.3236466644045155 0.0000000000000000 + 1.7488220456724668 -1.8941798935970877 0.0000000000000000 + 2.9250676820651060 -1.9602609194579510 0.0000000000000000 + 3.9673460732862944 -1.9910456785028996 0.0000000000000000 + 4.9988021003931316 -2.0128445626745215 0.0000000000000000 + 5.9840269527385770 -2.0036319863591987 0.0000000000000000 + 6.8662752831181848 -2.0111706214718250 0.0000000000000000 + -6.9224179711968894 -1.0409114847469898 0.0000000000000000 + -5.9580972668346384 -1.0079369394830269 0.0000000000000000 + -4.9644031999205085 -0.99567599301028353 0.0000000000000000 + -3.9291101003161621 -0.97695020835669544 0.0000000000000000 + -2.9054997225222792 -0.96230280748999231 0.0000000000000000 + -1.9926400784257630 -0.87289673502189002 0.0000000000000000 + 1.9926400966711493 -0.87289669885085341 0.0000000000000000 + 2.9054997267781739 -0.96230280151691017 0.0000000000000000 + 3.9291100927795046 -0.97695023859068741 0.0000000000000000 + 4.9644031747190178 -0.99567610299695042 0.0000000000000000 + 5.9580972159582188 -1.0079372294112183 0.0000000000000000 + 6.9224178848348696 -1.0409122106557087 0.0000000000000000 + -6.9501005397333646 9.2742624259376633E-004 0.0000000000000000 + -5.9557814357875589 3.5672791828285848E-003 0.0000000000000000 + -4.9483036165862142 1.0995072712916637E-002 0.0000000000000000 + -3.8953761385874000 2.9859225313277699E-002 0.0000000000000000 + -2.7044268180022062 9.0239571225917664E-002 0.0000000000000000 + -2.0577134077941768 -0.24596023237843018 0.0000000000000000 + 2.0577134210781893 -0.24596020432330881 0.0000000000000000 + 2.7044268189529750 9.0239580439220993E-002 0.0000000000000000 + 3.8953761307951136 2.9859213141896310E-002 0.0000000000000000 + 4.9483035951629128 1.0995006083563994E-002 0.0000000000000000 + 5.9557813901342689 3.5670820551844027E-003 0.0000000000000000 + 6.9501004563400075 9.2689433946285945E-004 0.0000000000000000 + -6.9211366160086696 1.0424222176432969 0.0000000000000000 + -5.9532838484776942 1.0137526163989738 0.0000000000000000 + -4.9500311685113738 1.0133010960715971 0.0000000000000000 + -3.8931011037157370 1.0206864672017701 0.0000000000000000 + -2.8597405927114097 1.0355541279811451 0.0000000000000000 + 2.8597405855121849 1.0355541561971500 0.0000000000000000 + 3.8931010938629025 1.0206864792386088 0.0000000000000000 + 4.9500311437661138 1.0133010952219772 0.0000000000000000 + 5.9532837990717420 1.0137526003884889 0.0000000000000000 + 6.9211365315572104 1.0424222862574206 0.0000000000000000 + -6.8644255432723220 2.0119396442671040 0.0000000000000000 + -5.9770878564770857 2.0066264662415398 0.0000000000000000 + -4.9783437062948490 2.0217143918982812 0.0000000000000000 + -3.9140404518912146 2.0099176101976779 0.0000000000000000 + -2.7410761635755314 1.9789206013273941 0.0000000000000000 + -2.1286743374522938 2.2972195370402191 0.0000000000000000 + 2.1286743610257428 2.2972195426678863 0.0000000000000000 + 2.7410761638388315 1.9789206359776161 0.0000000000000000 + 3.9140404460755791 2.0099176374807124 0.0000000000000000 + 4.9783436737400066 2.0217144567818068 0.0000000000000000 + 5.9770877867144092 2.0066266051878681 0.0000000000000000 + 6.8644254594391168 2.0119399050256175 0.0000000000000000 + -6.8525413060636966 2.6881963732921865 0.0000000000000000 + -6.1678363756747823 3.1055140586749621 0.0000000000000000 + -4.9973810792864457 3.0371864629703023 0.0000000000000000 + -3.9532479064607431 3.0086876509391756 0.0000000000000000 + -2.9421500723748752 3.0044506681060703 0.0000000000000000 + -1.9325861810773708 2.9330503835958242 0.0000000000000000 + -1.2961124323034472 3.1292858466381226 0.0000000000000000 + 1.2961125095535806 3.1292858073071472 0.0000000000000000 + 1.9325862367186470 2.9330503517007265 0.0000000000000000 + 2.9421501048823253 3.0044506615488382 0.0000000000000000 + 3.9532479276365025 3.0086876615716163 0.0000000000000000 + 4.9973810641359471 3.0371865415826074 0.0000000000000000 + 6.1678362306961185 3.1055143771001839 0.0000000000000000 + 6.8525411601091664 2.6881966863964721 0.0000000000000000 + -5.8641463558607985 4.1208556574546105 0.0000000000000000 + -4.9733093718925314 4.0196757173264421 0.0000000000000000 + -3.9922265881412802 4.0059453056237606 0.0000000000000000 + -2.9890091422252363 3.9843170145084694 0.0000000000000000 + -2.0054941764375291 3.9431793687522627 0.0000000000000000 + -0.97208389168591847 3.7420513075922179 0.0000000000000000 + 4.9676272106708220E-008 3.8718978722738666 0.0000000000000000 + 0.97208398546357100 3.7420512824509329 0.0000000000000000 + 2.0054942543469472 3.9431793364082628 0.0000000000000000 + 2.9890092219353601 3.9843169730044226 0.0000000000000000 + 3.9922266832879605 4.0059452501162065 0.0000000000000000 + 4.9733094595143239 4.0196756893634520 0.0000000000000000 + 5.8641463429630729 4.1208557832656991 0.0000000000000000 + -5.7158908831846356 4.7374654742093689 0.0000000000000000 + -5.0310753814344409 5.0329859200420142 0.0000000000000000 + -4.0146693983288904 4.9778067867170375 0.0000000000000000 + -3.0301613062086163 5.0005146435834220 0.0000000000000000 + -2.0111150485345335 4.9601592448796588 0.0000000000000000 + -0.99816482806907292 4.9040223934159526 0.0000000000000000 + 6.5559167275215029E-008 4.8889229740908711 0.0000000000000000 + 0.99816495902914193 4.9040223703928012 0.0000000000000000 + 2.0111151922869741 4.9601591923650652 0.0000000000000000 + 3.0301614770132304 5.0005145532717288 0.0000000000000000 + 4.0146696060123634 4.9778066411423163 0.0000000000000000 + 5.0310757370402959 5.0329856029402960 0.0000000000000000 + 5.7158911418430645 4.7374652500277525 0.0000000000000000 + -4.7366408724331448 5.7163969255377962 0.0000000000000000 + -4.1192062592906806 5.8644052326761127 0.0000000000000000 + -3.1027380900121511 6.1648179887777212 0.0000000000000000 + -2.0015559213129070 5.9647195940348077 0.0000000000000000 + -1.0080842121091849 5.9307120578964962 0.0000000000000000 + 1.2809144579091231E-007 5.9271981412979953 0.0000000000000000 + 1.0080844592290032 5.9307120244791536 0.0000000000000000 + 2.0015561708518548 5.9647195166171958 0.0000000000000000 + 3.1027384683617534 6.1648178022211253 0.0000000000000000 + 4.1192065691366757 5.8644050357600435 0.0000000000000000 + 4.7366412086031051 5.7163966234799082 0.0000000000000000 + -2.6868851371343672 6.8498717712581927 0.0000000000000000 + -2.0100960238839289 6.8591082624958490 0.0000000000000000 + -1.0405857107919183 6.9126053965829257 0.0000000000000000 + 2.5020681072890381E-007 6.9397443383701223 0.0000000000000000 + 1.0405861922485977 6.9126053343110048 0.0000000000000000 + 2.0100963728176224 6.8591081816647161 0.0000000000000000 + 2.6868854733549496 6.8498716232438612 0.0000000000000000 + -3.6705104009983383 -7.1082595194719094 0.0000000000000000 + -3.0442865551243687 -7.3981294507658495 0.0000000000000000 + -2.1863978152204240 -7.6954314104928097 0.0000000000000000 + -1.1313695802431920 -7.9195961306685545 0.0000000000000000 + 3.6410209097182056E-009 -8.0000000000000000 0.0000000000000000 + 1.1313715929171260 -7.9195958431437754 0.0000000000000000 + 2.1863978152204160 -7.6954314104928123 0.0000000000000000 + 3.0442865551243607 -7.3981294507658522 0.0000000000000000 + 3.6705121720218252 -7.1082586049636394 0.0000000000000000 + 4.4376011313588206 -6.6564026469980702 0.0000000000000000 + 5.1002019105058052 -6.1634357684714240 0.0000000000000000 + 5.6568541807137214 -5.6568543182710380 0.0000000000000000 + 6.1634357684714249 -5.1002019105058043 0.0000000000000000 + 6.6564026469980728 -4.4376011313588162 0.0000000000000000 + 7.1082586387364719 -3.6705121066178656 0.0000000000000000 + 7.3981294507658539 -3.0442865551243559 0.0000000000000000 + 7.6954314104928132 -2.1863978152204129 0.0000000000000000 + 7.9195958648410292 -1.1313714410364422 0.0000000000000000 + 7.9999999999999973 -1.9089446951922548E-007 0.0000000000000000 + 7.9195958696254367 1.1313714075456063 0.0000000000000000 + 7.6954314104928123 2.1863978152204151 0.0000000000000000 + 7.3981294507658530 3.0442865551243603 0.0000000000000000 + 7.1082586908781771 3.6705120056410205 0.0000000000000000 + 6.6564026469980719 4.4376011313588171 0.0000000000000000 + 6.1634357684714232 5.1002019105058070 0.0000000000000000 + 5.6568544506792646 5.6568540483054894 0.0000000000000000 + 5.1002019105058061 6.1634357684714240 0.0000000000000000 + 4.4376011313588162 6.6564026469980728 0.0000000000000000 + 3.6705119402370614 7.1082587246510069 0.0000000000000000 + 3.0442865551243585 7.3981294507658530 0.0000000000000000 + 2.1863978152204191 7.6954314104928114 0.0000000000000000 + 1.1313712556649234 7.9195958913226860 0.0000000000000000 + 0.0000000000000000 8.0000000000000000 0.0000000000000000 + -1.1313695802431916 7.9195961306685545 0.0000000000000000 + -2.1863978152204133 7.6954314104928132 0.0000000000000000 + -3.0442865551243616 7.3981294507658522 0.0000000000000000 + -3.6705104009983285 7.1082595194719147 0.0000000000000000 + -4.4376011313588100 6.6564026469980773 0.0000000000000000 + -5.1002019105058114 6.1634357684714187 0.0000000000000000 + -5.6568527973323857 5.6568557016520025 0.0000000000000000 + -6.1634357684714214 5.1002019105058087 0.0000000000000000 + -6.6564026469980755 4.4376011313588126 0.0000000000000000 + -7.1082595194719094 3.6705104009983378 0.0000000000000000 + -7.3981294507658477 3.0442865551243714 0.0000000000000000 + -7.6954314104928097 2.1863978152204235 0.0000000000000000 + -7.9195961306685545 1.1313695802431951 0.0000000000000000 + -7.9999999999997362 2.0536640888705361E-006 0.0000000000000000 + -7.9195961306685545 -1.1313695802431909 0.0000000000000000 + -7.6954314104928114 -2.1863978152204195 0.0000000000000000 + -7.3981294507658522 -3.0442865551243612 0.0000000000000000 + -7.1082595194719147 -3.6705104009983280 0.0000000000000000 + -6.6564026469980782 -4.4376011313588091 0.0000000000000000 + -6.1634357684714196 -5.1002019105058105 0.0000000000000000 + -5.6568527973323830 -5.6568557016520042 0.0000000000000000 + -5.1002019105058114 -6.1634357684714187 0.0000000000000000 + -4.4376011313588135 -6.6564026469980755 0.0000000000000000 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + 0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 0.84062499397195267 -1.3187500120560947 0.0000000000000000 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + 1.5593750060280469 0.11875001205609381 0.0000000000000000 + 1.8406249939719526 0.68124998794390512 0.0000000000000000 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + 1.9234528539428934 1.5480229180052039 0.0000000000000000 + 1.7577069153495042 1.9541836299856183 0.0000000000000000 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + 0.95418362998561834 2.7577069153495040 0.0000000000000000 + 0.54802294711610822 2.9234528456487245 0.0000000000000000 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + -0.54802270862631064 2.9234529135983243 0.0000000000000000 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + -1.7577069153495022 1.9541836299856215 0.0000000000000000 + -1.9234529135983240 1.5480227086263110 0.0000000000000000 + -2.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + -1.5593750060280471 0.11875001205609437 0.0000000000000000 + -1.2000000031251037 -0.59999999374979263 0.0000000000000000 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 1 2 11 10 + 2 3 12 11 + 3 4 13 12 + 4 5 14 13 + 5 6 15 14 + 6 7 16 15 + 8 9 21 20 + 9 10 22 21 + 10 11 23 22 + 11 12 24 23 + 12 13 25 24 + 13 14 26 25 + 14 15 27 26 + 15 16 28 27 + 16 17 29 28 + 17 18 30 29 + 19 20 33 32 + 20 21 34 33 + 21 22 35 34 + 22 23 36 35 + 23 24 37 36 + 24 25 38 37 + 25 26 39 38 + 26 27 40 39 + 27 28 41 40 + 28 29 42 41 + 29 30 43 42 + 30 31 44 43 + 32 33 47 46 + 33 34 48 47 + 34 35 49 48 + 35 36 50 49 + 36 37 51 50 + 39 40 53 52 + 40 41 54 53 + 41 42 55 54 + 42 43 56 55 + 43 44 57 56 + 45 46 60 59 + 46 47 61 60 + 47 48 62 61 + 48 49 63 62 + 49 50 64 63 + 50 51 65 64 + 52 53 67 66 + 53 54 68 67 + 54 55 69 68 + 55 56 70 69 + 56 57 71 70 + 57 58 72 71 + 59 60 74 73 + 60 61 75 74 + 61 62 76 75 + 62 63 77 76 + 63 64 78 77 + 67 68 80 79 + 68 69 81 80 + 69 70 82 81 + 70 71 83 82 + 71 72 84 83 + 73 74 86 85 + 74 75 87 86 + 75 76 88 87 + 76 77 89 88 + 77 78 90 89 + 79 80 92 91 + 80 81 93 92 + 81 82 94 93 + 82 83 95 94 + 83 84 96 95 + 85 86 98 97 + 86 87 99 98 + 87 88 100 99 + 88 89 101 100 + 92 93 103 102 + 93 94 104 103 + 94 95 105 104 + 95 96 106 105 + 97 98 108 107 + 98 99 109 108 + 99 100 110 109 + 100 101 111 110 + 102 103 115 114 + 103 104 116 115 + 104 105 117 116 + 105 106 118 117 + 107 108 120 119 + 108 109 121 120 + 109 110 122 121 + 110 111 123 122 + 111 112 124 123 + 113 114 128 127 + 114 115 129 128 + 115 116 130 129 + 116 117 131 130 + 117 118 132 131 + 120 121 134 133 + 121 122 135 134 + 122 123 136 135 + 123 124 137 136 + 124 125 138 137 + 126 127 141 140 + 127 128 142 141 + 128 129 143 142 + 129 130 144 143 + 130 131 145 144 + 133 134 147 146 + 134 135 148 147 + 135 136 149 148 + 136 137 150 149 + 137 138 151 150 + 138 139 152 151 + 139 140 153 152 + 140 141 154 153 + 141 142 155 154 + 142 143 156 155 + 143 144 157 156 + 144 145 158 157 + 147 148 160 159 + 148 149 161 160 + 149 150 162 161 + 150 151 163 162 + 151 152 164 163 + 152 153 165 164 + 153 154 166 165 + 154 155 167 166 + 155 156 168 167 + 156 157 169 168 + 161 162 171 170 + 162 163 172 171 + 163 164 173 172 + 164 165 174 173 + 165 166 175 174 + 166 167 176 175 + 10 177 178 1 + 1 178 179 2 + 2 179 180 3 + 3 180 181 4 + 4 181 182 5 + 5 182 183 6 + 6 183 184 7 + 7 184 185 16 + 16 185 186 17 + 17 186 187 18 + 18 187 188 30 + 30 188 189 31 + 31 189 190 44 + 44 190 191 57 + 57 191 192 58 + 58 192 193 72 + 72 193 194 84 + 84 194 195 96 + 96 195 196 106 + 106 196 197 118 + 118 197 198 132 + 132 198 199 131 + 131 199 200 145 + 145 200 201 158 + 158 201 202 157 + 157 202 203 169 + 169 203 204 168 + 168 204 205 167 + 167 205 206 176 + 176 206 207 175 + 175 207 208 174 + 174 208 209 173 + 173 209 210 172 + 172 210 211 171 + 171 211 212 170 + 170 212 213 161 + 161 213 214 160 + 160 214 215 159 + 159 215 216 147 + 147 216 217 146 + 146 217 218 133 + 133 218 219 120 + 120 219 220 119 + 119 220 221 107 + 107 221 222 97 + 97 222 223 85 + 85 223 224 73 + 73 224 225 59 + 59 225 226 45 + 45 226 227 46 + 46 227 228 32 + 32 228 229 19 + 19 229 230 20 + 20 230 231 8 + 8 231 232 9 + 9 232 177 10 + 51 37 38 233 + 233 38 39 52 + 52 66 234 233 + 66 67 235 234 + 67 79 236 235 + 79 91 237 236 + 91 92 238 237 + 92 102 239 238 + 102 114 240 239 + 114 113 241 240 + 113 127 242 241 + 127 126 243 242 + 126 140 244 243 + 140 139 245 244 + 139 138 246 245 + 138 125 247 246 + 125 124 248 247 + 124 112 249 248 + 112 111 250 249 + 111 101 251 250 + 101 89 252 251 + 89 90 253 252 + 90 78 254 253 + 78 64 255 254 + 64 65 256 255 + 65 51 233 256 diff --git a/previews/PR1693/tutorials/out/ice_cream_curved_sides.txt b/previews/PR1693/tutorials/out/ice_cream_curved_sides.txt new file mode 100644 index 00000000000..a16c98dc3de --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_curved_sides.txt @@ -0,0 +1,222 @@ + + ------------------------ + 2D Mesh Quality Measures + ------------------------ + +Signed Area Aspect Ratio Condition Edge Ratio Jacobian Minimum Angle Maximum Angle Area Sign + 7.1136E-01 1.3622E+00 1.2021E+00 1.6498E+00 4.5524E-01 6.8188E+01 1.2253E+02 1.0000E+00 + 9.0371E-01 1.0468E+00 1.0079E+00 1.1294E+00 8.5394E-01 8.6778E+01 9.2863E+01 1.0000E+00 + 9.9891E-01 1.0425E+00 1.0033E+00 1.0841E+00 9.6953E-01 8.8446E+01 9.1830E+01 1.0000E+00 + 9.9891E-01 1.0425E+00 1.0033E+00 1.0841E+00 9.6953E-01 8.8446E+01 9.1830E+01 1.0000E+00 + 9.0371E-01 1.0468E+00 1.0079E+00 1.1294E+00 8.5394E-01 8.6778E+01 9.2863E+01 1.0000E+00 + 7.1136E-01 1.3622E+00 1.2021E+00 1.6498E+00 4.5524E-01 6.8188E+01 1.2253E+02 1.0000E+00 + 6.3450E-01 1.3151E+00 1.2698E+00 1.5998E+00 3.7707E-01 6.9440E+01 1.2711E+02 1.0000E+00 + 1.0349E+00 1.1443E+00 1.0318E+00 1.3000E+00 8.7458E-01 7.6742E+01 1.0019E+02 1.0000E+00 + 1.1254E+00 1.0967E+00 1.0277E+00 1.1869E+00 9.9283E-01 7.6830E+01 9.8988E+01 1.0000E+00 + 9.7737E-01 1.0238E+00 1.0011E+00 1.0384E+00 9.6836E-01 8.8341E+01 9.1699E+01 1.0000E+00 + 9.8432E-01 1.0179E+00 1.0006E+00 1.0362E+00 9.7836E-01 8.9680E+01 9.0659E+01 1.0000E+00 + 9.8432E-01 1.0179E+00 1.0006E+00 1.0362E+00 9.7836E-01 8.9680E+01 9.0659E+01 1.0000E+00 + 9.7737E-01 1.0238E+00 1.0011E+00 1.0384E+00 9.6836E-01 8.8341E+01 9.1699E+01 1.0000E+00 + 1.1254E+00 1.0967E+00 1.0277E+00 1.1869E+00 9.9283E-01 7.6830E+01 9.8988E+01 1.0000E+00 + 1.0349E+00 1.1443E+00 1.0318E+00 1.3000E+00 8.7458E-01 7.6742E+01 1.0019E+02 1.0000E+00 + 6.3450E-01 1.3151E+00 1.2698E+00 1.5998E+00 3.7707E-01 6.9440E+01 1.2711E+02 1.0000E+00 + 6.3491E-01 1.3135E+00 1.2701E+00 1.5992E+00 3.7719E-01 6.9504E+01 1.2711E+02 1.0000E+00 + 9.8895E-01 1.0228E+00 1.0052E+00 1.0426E+00 9.5206E-01 8.4178E+01 9.3757E+01 1.0000E+00 + 9.9036E-01 1.0210E+00 1.0009E+00 1.0427E+00 9.6025E-01 8.7667E+01 9.1229E+01 1.0000E+00 + 1.0208E+00 1.0083E+00 1.0009E+00 1.0175E+00 1.0079E+00 8.7576E+01 9.1950E+01 1.0000E+00 + 1.0001E+00 1.0120E+00 1.0008E+00 1.0257E+00 9.8204E-01 8.7676E+01 9.1403E+01 1.0000E+00 + 9.8850E-01 1.0099E+00 1.0002E+00 1.0204E+00 9.8651E-01 8.9597E+01 9.0320E+01 1.0000E+00 + 9.8850E-01 1.0099E+00 1.0002E+00 1.0204E+00 9.8651E-01 8.9597E+01 9.0320E+01 1.0000E+00 + 1.0001E+00 1.0120E+00 1.0008E+00 1.0257E+00 9.8204E-01 8.7676E+01 9.1403E+01 1.0000E+00 + 1.0208E+00 1.0083E+00 1.0009E+00 1.0175E+00 1.0079E+00 8.7576E+01 9.1950E+01 1.0000E+00 + 9.9036E-01 1.0210E+00 1.0009E+00 1.0427E+00 9.6025E-01 8.7667E+01 9.1229E+01 1.0000E+00 + 9.8895E-01 1.0228E+00 1.0052E+00 1.0426E+00 9.5206E-01 8.4178E+01 9.3757E+01 1.0000E+00 + 6.3491E-01 1.3135E+00 1.2701E+00 1.5992E+00 3.7719E-01 6.9504E+01 1.2711E+02 1.0000E+00 + 1.0379E+00 1.1470E+00 1.0317E+00 1.3028E+00 8.7623E-01 7.6723E+01 1.0025E+02 1.0000E+00 + 9.9746E-01 1.0281E+00 1.0013E+00 1.0502E+00 9.6376E-01 8.7292E+01 9.1636E+01 1.0000E+00 + 1.0282E+00 1.0156E+00 1.0017E+00 1.0239E+00 1.0107E+00 8.6734E+01 9.2643E+01 1.0000E+00 + 1.0083E+00 1.0136E+00 1.0009E+00 1.0207E+00 9.9708E-01 8.7739E+01 9.2360E+01 1.0000E+00 + 9.4384E-01 1.0266E+00 1.0027E+00 1.0744E+00 8.9626E-01 8.7439E+01 9.3171E+01 1.0000E+00 + 9.4384E-01 1.0266E+00 1.0027E+00 1.0744E+00 8.9626E-01 8.7439E+01 9.3171E+01 1.0000E+00 + 1.0083E+00 1.0136E+00 1.0009E+00 1.0207E+00 9.9708E-01 8.7739E+01 9.2360E+01 1.0000E+00 + 1.0282E+00 1.0156E+00 1.0017E+00 1.0239E+00 1.0107E+00 8.6734E+01 9.2643E+01 1.0000E+00 + 9.9746E-01 1.0281E+00 1.0013E+00 1.0502E+00 9.6376E-01 8.7292E+01 9.1636E+01 1.0000E+00 + 1.0379E+00 1.1470E+00 1.0317E+00 1.3028E+00 8.7623E-01 7.6723E+01 1.0025E+02 1.0000E+00 + 7.1306E-01 1.3614E+00 1.2019E+00 1.6506E+00 4.5597E-01 6.8265E+01 1.2250E+02 1.0000E+00 + 1.1353E+00 1.0961E+00 1.0278E+00 1.1787E+00 1.0073E+00 7.6821E+01 9.9197E+01 1.0000E+00 + 1.0463E+00 1.0091E+00 1.0014E+00 1.0186E+00 1.0385E+00 8.7416E+01 9.2893E+01 1.0000E+00 + 1.0551E+00 1.0158E+00 1.0020E+00 1.0295E+00 1.0419E+00 8.6450E+01 9.2834E+01 1.0000E+00 + 1.1622E+00 1.0997E+00 1.0304E+00 1.1756E+00 1.0286E+00 7.6220E+01 9.9351E+01 1.0000E+00 + 7.5968E-01 1.3367E+00 1.2159E+00 1.5941E+00 4.8133E-01 6.8807E+01 1.2386E+02 1.0000E+00 + 7.5968E-01 1.3367E+00 1.2159E+00 1.5941E+00 4.8133E-01 6.8807E+01 1.2386E+02 1.0000E+00 + 1.1622E+00 1.0997E+00 1.0304E+00 1.1756E+00 1.0286E+00 7.6220E+01 9.9351E+01 1.0000E+00 + 1.0551E+00 1.0158E+00 1.0020E+00 1.0295E+00 1.0419E+00 8.6450E+01 9.2834E+01 1.0000E+00 + 1.0463E+00 1.0091E+00 1.0014E+00 1.0186E+00 1.0385E+00 8.7416E+01 9.2893E+01 1.0000E+00 + 1.1353E+00 1.0961E+00 1.0278E+00 1.1787E+00 1.0073E+00 7.6821E+01 9.9197E+01 1.0000E+00 + 7.1306E-01 1.3614E+00 1.2019E+00 1.6506E+00 4.5597E-01 6.8265E+01 1.2250E+02 1.0000E+00 + 9.0787E-01 1.0464E+00 1.0080E+00 1.1289E+00 8.5643E-01 8.6550E+01 9.2822E+01 1.0000E+00 + 9.9578E-01 1.0202E+00 1.0014E+00 1.0330E+00 9.8122E-01 8.7356E+01 9.2199E+01 1.0000E+00 + 1.0488E+00 1.0119E+00 1.0019E+00 1.0203E+00 1.0452E+00 8.6804E+01 9.3370E+01 1.0000E+00 + 1.0385E+00 1.0240E+00 1.0026E+00 1.0447E+00 1.0212E+00 8.6149E+01 9.2979E+01 1.0000E+00 + 1.0633E+00 1.1477E+00 1.0228E+00 1.2844E+00 9.0925E-01 7.9788E+01 9.7834E+01 1.0000E+00 + 1.0633E+00 1.1477E+00 1.0228E+00 1.2844E+00 9.0925E-01 7.9788E+01 9.7834E+01 1.0000E+00 + 1.0385E+00 1.0240E+00 1.0026E+00 1.0447E+00 1.0212E+00 8.6149E+01 9.2979E+01 1.0000E+00 + 1.0488E+00 1.0119E+00 1.0019E+00 1.0203E+00 1.0452E+00 8.6804E+01 9.3370E+01 1.0000E+00 + 9.9578E-01 1.0202E+00 1.0014E+00 1.0330E+00 9.8122E-01 8.7356E+01 9.2199E+01 1.0000E+00 + 9.0787E-01 1.0464E+00 1.0080E+00 1.1289E+00 8.5643E-01 8.6550E+01 9.2822E+01 1.0000E+00 + 1.0057E+00 1.0397E+00 1.0030E+00 1.0801E+00 9.7534E-01 8.8630E+01 9.2090E+01 1.0000E+00 + 1.0096E+00 1.0068E+00 1.0005E+00 1.0178E+00 1.0001E+00 8.8661E+01 9.1623E+01 1.0000E+00 + 1.0507E+00 1.0280E+00 1.0023E+00 1.0460E+00 1.0417E+00 8.7055E+01 9.2955E+01 1.0000E+00 + 1.1357E+00 1.1274E+00 1.0352E+00 1.1837E+00 1.0301E+00 7.6282E+01 1.0164E+02 1.0000E+00 + 6.6321E-01 1.3524E+00 1.2104E+00 1.7001E+00 3.8357E-01 7.3347E+01 1.2339E+02 1.0000E+00 + 6.6321E-01 1.3524E+00 1.2104E+00 1.7001E+00 3.8357E-01 7.3347E+01 1.2339E+02 1.0000E+00 + 1.1357E+00 1.1274E+00 1.0352E+00 1.1837E+00 1.0301E+00 7.6282E+01 1.0164E+02 1.0000E+00 + 1.0507E+00 1.0280E+00 1.0023E+00 1.0460E+00 1.0417E+00 8.7055E+01 9.2955E+01 1.0000E+00 + 1.0096E+00 1.0068E+00 1.0005E+00 1.0178E+00 1.0001E+00 8.8661E+01 9.1623E+01 1.0000E+00 + 1.0057E+00 1.0397E+00 1.0030E+00 1.0801E+00 9.7534E-01 8.8630E+01 9.2090E+01 1.0000E+00 + 1.0066E+00 1.0388E+00 1.0027E+00 1.0760E+00 9.7778E-01 8.8255E+01 9.1555E+01 1.0000E+00 + 1.0116E+00 1.0044E+00 1.0001E+00 1.0079E+00 1.0056E+00 8.9436E+01 9.0324E+01 1.0000E+00 + 1.0513E+00 1.0313E+00 1.0021E+00 1.0667E+00 1.0432E+00 8.9072E+01 9.1158E+01 1.0000E+00 + 1.0795E+00 1.1529E+00 1.0305E+00 1.2448E+00 9.7916E-01 8.3572E+01 9.8506E+01 1.0000E+00 + 1.0795E+00 1.1529E+00 1.0305E+00 1.2448E+00 9.7916E-01 8.3572E+01 9.8506E+01 1.0000E+00 + 1.0513E+00 1.0313E+00 1.0021E+00 1.0667E+00 1.0432E+00 8.9072E+01 9.1158E+01 1.0000E+00 + 1.0116E+00 1.0044E+00 1.0001E+00 1.0079E+00 1.0056E+00 8.9436E+01 9.0324E+01 1.0000E+00 + 1.0066E+00 1.0388E+00 1.0027E+00 1.0760E+00 9.7778E-01 8.8255E+01 9.1555E+01 1.0000E+00 + 9.1043E-01 1.0418E+00 1.0068E+00 1.1192E+00 8.6059E-01 8.6930E+01 9.3005E+01 1.0000E+00 + 1.0018E+00 1.0080E+00 1.0004E+00 1.0158E+00 9.9199E-01 8.8366E+01 9.1399E+01 1.0000E+00 + 1.0593E+00 1.0348E+00 1.0032E+00 1.0757E+00 1.0457E+00 8.7757E+01 9.1848E+01 1.0000E+00 + 1.0664E+00 1.1408E+00 1.0272E+00 1.2341E+00 9.7307E-01 8.4344E+01 9.7994E+01 1.0000E+00 + 1.0664E+00 1.1408E+00 1.0272E+00 1.2341E+00 9.7307E-01 8.4344E+01 9.7994E+01 1.0000E+00 + 1.0593E+00 1.0348E+00 1.0032E+00 1.0757E+00 1.0457E+00 8.7757E+01 9.1848E+01 1.0000E+00 + 1.0018E+00 1.0080E+00 1.0004E+00 1.0158E+00 9.9199E-01 8.8366E+01 9.1399E+01 1.0000E+00 + 9.1043E-01 1.0418E+00 1.0068E+00 1.1192E+00 8.6059E-01 8.6930E+01 9.3005E+01 1.0000E+00 + 7.1607E-01 1.3554E+00 1.2012E+00 1.6490E+00 4.5808E-01 6.8486E+01 1.2237E+02 1.0000E+00 + 1.1438E+00 1.1025E+00 1.0284E+00 1.1738E+00 1.0145E+00 7.6812E+01 9.8982E+01 1.0000E+00 + 1.0611E+00 1.0342E+00 1.0032E+00 1.0649E+00 1.0417E+00 8.7117E+01 9.3811E+01 1.0000E+00 + 1.1032E+00 1.1245E+00 1.0316E+00 1.1739E+00 1.0097E+00 7.7393E+01 1.0133E+02 1.0000E+00 + 6.7398E-01 1.3229E+00 1.4055E+00 1.5706E+00 3.2697E-01 7.3630E+01 1.3460E+02 1.0000E+00 + 6.7398E-01 1.3229E+00 1.4055E+00 1.5706E+00 3.2697E-01 7.3630E+01 1.3460E+02 1.0000E+00 + 1.1032E+00 1.1245E+00 1.0316E+00 1.1739E+00 1.0097E+00 7.7393E+01 1.0133E+02 1.0000E+00 + 1.0611E+00 1.0342E+00 1.0032E+00 1.0649E+00 1.0417E+00 8.7117E+01 9.3811E+01 1.0000E+00 + 1.1438E+00 1.1025E+00 1.0284E+00 1.1738E+00 1.0145E+00 7.6812E+01 9.8982E+01 1.0000E+00 + 7.1607E-01 1.3554E+00 1.2012E+00 1.6490E+00 4.5808E-01 6.8486E+01 1.2237E+02 1.0000E+00 + 1.0434E+00 1.1550E+00 1.0329E+00 1.3077E+00 8.7767E-01 7.6689E+01 1.0017E+02 1.0000E+00 + 1.0022E+00 1.0439E+00 1.0032E+00 1.0646E+00 9.6423E-01 8.6198E+01 9.3040E+01 1.0000E+00 + 9.9508E-01 1.0145E+00 1.0027E+00 1.0307E+00 9.8201E-01 8.6527E+01 9.3973E+01 1.0000E+00 + 9.8818E-01 1.0224E+00 1.0103E+00 1.0324E+00 9.6179E-01 8.1826E+01 9.6783E+01 1.0000E+00 + 6.7782E-01 1.3299E+00 1.4155E+00 1.5807E+00 3.2642E-01 7.3144E+01 1.3501E+02 1.0000E+00 + 6.7782E-01 1.3299E+00 1.4155E+00 1.5807E+00 3.2642E-01 7.3144E+01 1.3501E+02 1.0000E+00 + 9.8818E-01 1.0224E+00 1.0103E+00 1.0324E+00 9.6179E-01 8.1826E+01 9.6783E+01 1.0000E+00 + 9.9508E-01 1.0145E+00 1.0027E+00 1.0307E+00 9.8201E-01 8.6527E+01 9.3973E+01 1.0000E+00 + 1.0022E+00 1.0439E+00 1.0032E+00 1.0646E+00 9.6423E-01 8.6198E+01 9.3040E+01 1.0000E+00 + 1.0434E+00 1.1550E+00 1.0329E+00 1.3077E+00 8.7767E-01 7.6689E+01 1.0017E+02 1.0000E+00 + 6.3765E-01 1.3098E+00 1.2663E+00 1.6004E+00 3.7845E-01 6.9921E+01 1.2686E+02 1.0000E+00 + 9.8996E-01 1.0247E+00 1.0062E+00 1.0471E+00 9.5317E-01 8.3630E+01 9.4430E+01 1.0000E+00 + 9.8795E-01 1.0236E+00 1.0020E+00 1.0462E+00 9.5732E-01 8.6446E+01 9.2558E+01 1.0000E+00 + 1.0169E+00 1.0124E+00 1.0039E+00 1.0360E+00 9.9775E-01 8.5413E+01 9.4714E+01 1.0000E+00 + 1.1127E+00 1.1089E+00 1.0285E+00 1.1456E+00 1.0298E+00 7.7701E+01 1.0133E+02 1.0000E+00 + 1.0740E+00 1.1250E+00 1.0207E+00 1.1851E+00 9.8863E-01 8.3678E+01 9.7608E+01 1.0000E+00 + 1.0740E+00 1.1250E+00 1.0207E+00 1.1851E+00 9.8863E-01 8.3678E+01 9.7608E+01 1.0000E+00 + 1.1127E+00 1.1089E+00 1.0285E+00 1.1456E+00 1.0298E+00 7.7701E+01 1.0133E+02 1.0000E+00 + 1.0169E+00 1.0124E+00 1.0039E+00 1.0360E+00 9.9775E-01 8.5413E+01 9.4714E+01 1.0000E+00 + 9.8795E-01 1.0236E+00 1.0020E+00 1.0462E+00 9.5732E-01 8.6446E+01 9.2558E+01 1.0000E+00 + 9.8996E-01 1.0247E+00 1.0062E+00 1.0471E+00 9.5317E-01 8.3630E+01 9.4430E+01 1.0000E+00 + 6.3765E-01 1.3098E+00 1.2663E+00 1.6004E+00 3.7845E-01 6.9921E+01 1.2686E+02 1.0000E+00 + 6.3688E-01 1.3145E+00 1.2644E+00 1.6032E+00 3.7838E-01 6.9800E+01 1.2679E+02 1.0000E+00 + 1.0403E+00 1.1506E+00 1.0306E+00 1.3067E+00 8.7524E-01 7.7102E+01 9.9740E+01 1.0000E+00 + 1.1458E+00 1.0971E+00 1.0309E+00 1.1612E+00 1.0241E+00 7.6134E+01 9.9754E+01 1.0000E+00 + 1.0189E+00 1.0178E+00 1.0022E+00 1.0329E+00 9.9833E-01 8.6274E+01 9.2627E+01 1.0000E+00 + 1.0357E+00 1.0204E+00 1.0009E+00 1.0401E+00 1.0247E+00 8.9133E+01 9.1420E+01 1.0000E+00 + 1.0357E+00 1.0204E+00 1.0009E+00 1.0401E+00 1.0247E+00 8.9133E+01 9.1420E+01 1.0000E+00 + 1.0189E+00 1.0178E+00 1.0022E+00 1.0329E+00 9.9833E-01 8.6274E+01 9.2627E+01 1.0000E+00 + 1.1458E+00 1.0971E+00 1.0309E+00 1.1612E+00 1.0241E+00 7.6134E+01 9.9754E+01 1.0000E+00 + 1.0403E+00 1.1506E+00 1.0306E+00 1.3067E+00 8.7524E-01 7.7102E+01 9.9740E+01 1.0000E+00 + 6.3688E-01 1.3145E+00 1.2644E+00 1.6032E+00 3.7838E-01 6.9800E+01 1.2679E+02 1.0000E+00 + 7.2149E-01 1.3542E+00 1.1966E+00 1.6536E+00 4.5980E-01 6.9040E+01 1.2204E+02 1.0000E+00 + 9.2098E-01 1.0367E+00 1.0065E+00 1.1114E+00 8.6758E-01 8.6144E+01 9.2611E+01 1.0000E+00 + 1.0217E+00 1.0301E+00 1.0017E+00 1.0596E+00 9.8972E-01 8.8506E+01 9.2096E+01 1.0000E+00 + 1.0217E+00 1.0301E+00 1.0017E+00 1.0596E+00 9.8972E-01 8.8506E+01 9.2096E+01 1.0000E+00 + 9.2098E-01 1.0367E+00 1.0065E+00 1.1114E+00 8.6758E-01 8.6144E+01 9.2611E+01 1.0000E+00 + 7.2149E-01 1.3542E+00 1.1966E+00 1.6536E+00 4.5980E-01 6.9040E+01 1.2204E+02 1.0000E+00 + 6.0980E-01 1.4486E+00 1.1816E+00 1.6785E+00 4.4463E-01 6.2700E+01 1.1527E+02 1.0000E+00 + 5.6865E-01 1.2312E+00 1.1827E+00 1.3940E+00 3.7296E-01 7.5887E+01 1.2221E+02 1.0000E+00 + 9.4396E-01 1.1142E+00 1.0289E+00 1.2712E+00 8.1479E-01 8.3176E+01 9.8628E+01 1.0000E+00 + 1.1148E+00 1.0754E+00 1.0079E+00 1.1319E+00 1.0415E+00 8.5935E+01 9.3617E+01 1.0000E+00 + 1.1148E+00 1.0754E+00 1.0079E+00 1.1319E+00 1.0415E+00 8.5935E+01 9.3618E+01 1.0000E+00 + 9.4396E-01 1.1142E+00 1.0289E+00 1.2712E+00 8.1479E-01 8.3177E+01 9.8628E+01 1.0000E+00 + 5.6865E-01 1.2312E+00 1.1827E+00 1.3940E+00 3.7296E-01 7.5887E+01 1.2221E+02 1.0000E+00 + 6.0981E-01 1.4486E+00 1.1816E+00 1.6785E+00 4.4463E-01 6.2700E+01 1.1527E+02 1.0000E+00 + 9.3589E-01 1.1374E+00 1.0332E+00 1.2859E+00 7.4833E-01 7.5540E+01 9.8612E+01 1.0000E+00 + 5.0423E-01 1.2163E+00 1.1129E+00 1.4793E+00 3.2952E-01 7.5239E+01 1.1544E+02 1.0000E+00 + 5.2090E-01 1.2479E+00 1.1649E+00 1.5324E+00 3.7971E-01 6.8464E+01 1.1745E+02 1.0000E+00 + 5.2094E-01 1.2480E+00 1.1655E+00 1.5330E+00 3.7978E-01 6.8414E+01 1.1748E+02 1.0000E+00 + 5.0400E-01 1.2163E+00 1.1127E+00 1.4795E+00 3.2934E-01 7.5202E+01 1.1542E+02 1.0000E+00 + 9.3574E-01 1.1373E+00 1.0331E+00 1.2861E+00 7.4808E-01 7.5562E+01 9.8650E+01 1.0000E+00 + 6.0960E-01 1.4489E+00 1.1820E+00 1.6808E+00 4.4396E-01 6.2629E+01 1.1531E+02 1.0000E+00 + 5.6798E-01 1.2319E+00 1.1826E+00 1.3962E+00 3.7255E-01 7.5893E+01 1.2219E+02 1.0000E+00 + 9.4333E-01 1.1146E+00 1.0292E+00 1.2727E+00 8.1433E-01 8.3188E+01 9.8621E+01 1.0000E+00 + 1.1147E+00 1.0755E+00 1.0080E+00 1.1328E+00 1.0414E+00 8.5986E+01 9.3661E+01 1.0000E+00 + 1.1151E+00 1.0752E+00 1.0078E+00 1.1315E+00 1.0425E+00 8.5884E+01 9.3498E+01 1.0000E+00 + 9.4445E-01 1.1138E+00 1.0287E+00 1.2702E+00 8.1557E-01 8.3095E+01 9.8509E+01 1.0000E+00 + 5.6898E-01 1.2307E+00 1.1816E+00 1.3936E+00 3.7319E-01 7.5982E+01 1.2212E+02 1.0000E+00 + 6.1210E-01 1.4520E+00 1.1848E+00 1.6839E+00 4.4488E-01 6.2359E+01 1.1551E+02 1.0000E+00 + 9.3864E-01 1.1397E+00 1.0328E+00 1.2858E+00 7.5085E-01 7.5655E+01 9.8709E+01 1.0000E+00 + 5.0542E-01 1.2194E+00 1.1131E+00 1.4811E+00 3.2974E-01 7.5143E+01 1.1551E+02 1.0000E+00 + 5.2252E-01 1.2507E+00 1.1666E+00 1.5339E+00 3.8067E-01 6.8254E+01 1.1763E+02 1.0000E+00 + 5.2219E-01 1.2508E+00 1.1652E+00 1.5335E+00 3.8009E-01 6.8395E+01 1.1757E+02 1.0000E+00 + 5.0578E-01 1.2196E+00 1.1144E+00 1.4814E+00 3.2983E-01 7.5252E+01 1.1564E+02 1.0000E+00 + 9.4047E-01 1.1430E+00 1.0340E+00 1.2900E+00 7.5140E-01 7.5425E+01 9.8599E+01 1.0000E+00 + 6.1411E-01 1.4555E+00 1.1869E+00 1.6825E+00 4.4693E-01 6.2299E+01 1.1564E+02 1.0000E+00 + 5.7212E-01 1.2275E+00 1.1840E+00 1.3873E+00 3.7436E-01 7.6014E+01 1.2232E+02 1.0000E+00 + 9.5150E-01 1.1096E+00 1.0272E+00 1.2619E+00 8.2026E-01 8.3156E+01 9.8746E+01 1.0000E+00 + 1.1249E+00 1.0704E+00 1.0068E+00 1.1218E+00 1.0503E+00 8.5935E+01 9.3658E+01 1.0000E+00 + 1.1249E+00 1.0704E+00 1.0068E+00 1.1218E+00 1.0503E+00 8.5935E+01 9.3658E+01 1.0000E+00 + 9.5150E-01 1.1096E+00 1.0272E+00 1.2619E+00 8.2026E-01 8.3156E+01 9.8746E+01 1.0000E+00 + 5.7212E-01 1.2275E+00 1.1840E+00 1.3873E+00 3.7436E-01 7.6014E+01 1.2232E+02 1.0000E+00 + 6.1411E-01 1.4555E+00 1.1869E+00 1.6825E+00 4.4693E-01 6.2299E+01 1.1564E+02 1.0000E+00 + 9.4047E-01 1.1430E+00 1.0340E+00 1.2900E+00 7.5140E-01 7.5425E+01 9.8599E+01 1.0000E+00 + 5.0578E-01 1.2196E+00 1.1145E+00 1.4814E+00 3.2983E-01 7.5252E+01 1.1564E+02 1.0000E+00 + 5.2218E-01 1.2508E+00 1.1652E+00 1.5335E+00 3.8009E-01 6.8395E+01 1.1757E+02 1.0000E+00 + 5.2252E-01 1.2507E+00 1.1666E+00 1.5339E+00 3.8067E-01 6.8254E+01 1.1763E+02 1.0000E+00 + 5.0542E-01 1.2194E+00 1.1131E+00 1.4811E+00 3.2974E-01 7.5143E+01 1.1551E+02 1.0000E+00 + 9.3865E-01 1.1397E+00 1.0328E+00 1.2858E+00 7.5086E-01 7.5655E+01 9.8709E+01 1.0000E+00 + 6.1210E-01 1.4520E+00 1.1848E+00 1.6839E+00 4.4488E-01 6.2359E+01 1.1551E+02 1.0000E+00 + 5.6898E-01 1.2307E+00 1.1816E+00 1.3936E+00 3.7319E-01 7.5982E+01 1.2212E+02 1.0000E+00 + 9.4446E-01 1.1138E+00 1.0287E+00 1.2702E+00 8.1557E-01 8.3095E+01 9.8509E+01 1.0000E+00 + 1.1151E+00 1.0752E+00 1.0078E+00 1.1315E+00 1.0425E+00 8.5884E+01 9.3498E+01 1.0000E+00 + 1.1147E+00 1.0755E+00 1.0080E+00 1.1328E+00 1.0414E+00 8.5985E+01 9.3661E+01 1.0000E+00 + 9.4333E-01 1.1146E+00 1.0292E+00 1.2727E+00 8.1433E-01 8.3188E+01 9.8621E+01 1.0000E+00 + 5.6798E-01 1.2319E+00 1.1826E+00 1.3962E+00 3.7255E-01 7.5892E+01 1.2219E+02 1.0000E+00 + 6.0960E-01 1.4489E+00 1.1820E+00 1.6808E+00 4.4396E-01 6.2629E+01 1.1531E+02 1.0000E+00 + 9.3574E-01 1.1373E+00 1.0331E+00 1.2861E+00 7.4808E-01 7.5562E+01 9.8650E+01 1.0000E+00 + 5.0400E-01 1.2163E+00 1.1127E+00 1.4795E+00 3.2934E-01 7.5202E+01 1.1542E+02 1.0000E+00 + 5.2094E-01 1.2480E+00 1.1655E+00 1.5330E+00 3.7978E-01 6.8414E+01 1.1748E+02 1.0000E+00 + 5.2090E-01 1.2479E+00 1.1649E+00 1.5324E+00 3.7971E-01 6.8464E+01 1.1745E+02 1.0000E+00 + 5.0423E-01 1.2163E+00 1.1129E+00 1.4793E+00 3.2952E-01 7.5239E+01 1.1544E+02 1.0000E+00 + 9.3589E-01 1.1374E+00 1.0332E+00 1.2859E+00 7.4833E-01 7.5540E+01 9.8612E+01 1.0000E+00 + 9.9795E-01 1.0307E+00 1.0019E+00 1.0642E+00 9.6958E-01 8.8132E+01 9.1384E+01 1.0000E+00 + 9.9795E-01 1.0307E+00 1.0019E+00 1.0642E+00 9.6958E-01 8.8132E+01 9.1384E+01 1.0000E+00 + 7.6662E-01 1.4908E+00 1.3016E+00 1.8827E+00 3.6340E-01 6.5303E+01 1.2965E+02 1.0000E+00 + 5.9625E-01 1.4355E+00 1.1541E+00 1.7096E+00 4.0321E-01 6.4115E+01 1.0649E+02 1.0000E+00 + 8.6780E-01 1.1668E+00 1.0575E+00 1.3379E+00 6.6778E-01 7.1069E+01 9.7567E+01 1.0000E+00 + 5.0197E-01 1.2065E+00 1.1581E+00 1.3575E+00 3.3616E-01 7.6928E+01 1.2027E+02 1.0000E+00 + 5.2776E-01 1.4983E+00 1.2092E+00 1.6948E+00 3.8289E-01 6.1848E+01 1.1633E+02 1.0000E+00 + 5.8837E-01 1.4327E+00 1.6541E+00 2.9369E+00 2.6838E-01 6.4950E+01 1.1893E+02 1.0000E+00 + 6.4816E-01 1.2061E+00 1.2061E+00 1.7183E+00 4.7388E-01 6.9380E+01 1.0984E+02 1.0000E+00 + 3.6583E-01 1.6158E+00 1.2969E+00 2.1068E+00 2.0753E-01 5.5253E+01 1.1056E+02 1.0000E+00 + 3.5991E-01 1.2625E+00 1.1513E+00 1.4516E+00 2.8849E-01 6.2114E+01 1.1562E+02 1.0000E+00 + 3.6017E-01 1.2618E+00 1.1505E+00 1.4524E+00 2.8839E-01 6.2161E+01 1.1549E+02 1.0000E+00 + 3.6635E-01 1.6098E+00 1.2940E+00 2.1016E+00 2.0759E-01 5.5255E+01 1.1042E+02 1.0000E+00 + 6.6431E-01 1.2282E+00 1.2016E+00 1.7724E+00 4.7782E-01 7.0223E+01 1.0943E+02 1.0000E+00 + 6.6431E-01 1.2282E+00 1.2016E+00 1.7724E+00 4.7782E-01 7.0223E+01 1.0943E+02 1.0000E+00 + 3.6635E-01 1.6098E+00 1.2940E+00 2.1016E+00 2.0759E-01 5.5255E+01 1.1042E+02 1.0000E+00 + 3.6017E-01 1.2618E+00 1.1505E+00 1.4524E+00 2.8839E-01 6.2161E+01 1.1549E+02 1.0000E+00 + 3.5991E-01 1.2625E+00 1.1513E+00 1.4516E+00 2.8849E-01 6.2114E+01 1.1562E+02 1.0000E+00 + 3.6583E-01 1.6158E+00 1.2969E+00 2.1068E+00 2.0753E-01 5.5253E+01 1.1056E+02 1.0000E+00 + 6.4816E-01 1.2061E+00 1.2061E+00 1.7183E+00 4.7388E-01 6.9380E+01 1.0984E+02 1.0000E+00 + 5.8837E-01 1.4327E+00 1.6541E+00 2.9369E+00 2.6838E-01 6.4950E+01 1.1893E+02 1.0000E+00 + 5.2776E-01 1.4983E+00 1.2092E+00 1.6948E+00 3.8289E-01 6.1848E+01 1.1633E+02 1.0000E+00 + 5.0197E-01 1.2065E+00 1.1581E+00 1.3575E+00 3.3616E-01 7.6928E+01 1.2027E+02 1.0000E+00 + 8.6780E-01 1.1668E+00 1.0575E+00 1.3379E+00 6.6778E-01 7.1069E+01 9.7567E+01 1.0000E+00 + 5.9625E-01 1.4355E+00 1.1541E+00 1.7096E+00 4.0321E-01 6.4115E+01 1.0649E+02 1.0000E+00 + 7.6662E-01 1.4908E+00 1.3016E+00 1.8827E+00 3.6340E-01 6.5303E+01 1.2965E+02 1.0000E+00 diff --git a/previews/PR1693/tutorials/out/ice_cream_straight_sides.control b/previews/PR1693/tutorials/out/ice_cream_straight_sides.control new file mode 100644 index 00000000000..ca732872568 --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_straight_sides.control @@ -0,0 +1,57 @@ +\begin{CONTROL_INPUT} + \begin{RUN_PARAMETERS} + mesh file name = ice_cream_straight_sides.mesh + plot file name = ice_cream_straight_sides.tec + stats file name = none + mesh file format = ISM-v2 + polynomial order = 4 + plot file format = skeleton + \end{RUN_PARAMETERS} + + \begin{BACKGROUND_GRID} + x0 = [-8.0, -8.0, 0.0] + dx = [1.0, 1.0, 0.0] + N = [16,16,1] + \end{BACKGROUND_GRID} + + \begin{SPRING_SMOOTHER} + smoothing = ON + smoothing type = LinearAndCrossBarSpring + number of iterations = 25 + \end{SPRING_SMOOTHER} + +\end{CONTROL_INPUT} + +\begin{MODEL} + + \begin{INNER_BOUNDARIES} + + \begin{CHAIN} + name = IceCreamCone + \begin{END_POINTS_LINE} + name = LeftSlant + xStart = [-2.0, 1.0, 0.0] + xEnd = [ 0.0, -3.0, 0.0] + \end{END_POINTS_LINE} + + \begin{END_POINTS_LINE} + name = RightSlant + xStart = [ 0.0, -3.0, 0.0] + xEnd = [ 2.0, 1.0, 0.0] + \end{END_POINTS_LINE} + + \begin{CIRCULAR_ARC} + name = IceCream + units = degrees + center = [ 0.0, 1.0, 0.0] + radius = 2.0 + start angle = 0.0 + end angle = 180.0 + \end{CIRCULAR_ARC} + \end{CHAIN} + + \end{INNER_BOUNDARIES} + +\end{MODEL} +\end{FILE} + diff --git a/previews/PR1693/tutorials/out/ice_cream_straight_sides.mesh b/previews/PR1693/tutorials/out/ice_cream_straight_sides.mesh new file mode 100644 index 00000000000..2650c3fae30 --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_straight_sides.mesh @@ -0,0 +1,1722 @@ + ISM-V2 + 296 548 252 4 + -8.0000000000000000 -8.0000000000000000 0.0000000000000000 + -7.0000000000000000 -8.0000000000000000 0.0000000000000000 + -6.0000000000000000 -8.0000000000000000 0.0000000000000000 + -5.0000000000000000 -8.0000000000000000 0.0000000000000000 + -4.0000000000000000 -8.0000000000000000 0.0000000000000000 + -3.0000000000000000 -8.0000000000000000 0.0000000000000000 + -2.0000000000000000 -8.0000000000000000 0.0000000000000000 + -1.0000000000000000 -8.0000000000000000 0.0000000000000000 + 0.0000000000000000 -8.0000000000000000 0.0000000000000000 + 1.0000000000000000 -8.0000000000000000 0.0000000000000000 + 2.0000000000000000 -8.0000000000000000 0.0000000000000000 + 3.0000000000000000 -8.0000000000000000 0.0000000000000000 + 4.0000000000000000 -8.0000000000000000 0.0000000000000000 + 5.0000000000000000 -8.0000000000000000 0.0000000000000000 + 6.0000000000000000 -8.0000000000000000 0.0000000000000000 + 7.0000000000000000 -8.0000000000000000 0.0000000000000000 + 8.0000000000000000 -8.0000000000000000 0.0000000000000000 + -8.0000000000000000 -7.0000000000000000 0.0000000000000000 + -6.9999650574820480 -6.9999679261182877 0.0000000000000000 + -5.9998665632941011 -6.9998724565097961 0.0000000000000000 + -4.9996213184978222 -6.9996097515900049 0.0000000000000000 + -3.9991854607018733 -6.9990475318617795 0.0000000000000000 + -2.9986952242321481 -6.9981269410719644 0.0000000000000000 + -1.9985140781988169 -6.9969986109118514 0.0000000000000000 + -0.99897849037601483 -6.9960383675970457 0.0000000000000000 + 4.7989409883115671E-012 -6.9956585147354131 0.0000000000000000 + 0.99897849038591502 -6.9960383675859896 0.0000000000000000 + 1.9985140782087694 -6.9969986108947824 0.0000000000000000 + 2.9986952242406435 -6.9981269410555944 0.0000000000000000 + 3.9991854607075754 -6.9990475318504446 0.0000000000000000 + 4.9996213185007372 -6.9996097515841544 0.0000000000000000 + 5.9998665632952193 -6.9998724565075419 0.0000000000000000 + 6.9999650574823553 -6.9999679261176624 0.0000000000000000 + 8.0000000000000000 -7.0000000000000000 0.0000000000000000 + -8.0000000000000000 -6.0000000000000000 0.0000000000000000 + -6.9998976699211699 -5.9999122764402735 0.0000000000000000 + -5.9996135291753685 -5.9996633062377125 0.0000000000000000 + -4.9989226436212064 -5.9990208119514659 0.0000000000000000 + -3.9977653337150905 -5.9977581248894900 0.0000000000000000 + -2.9966204896079378 -5.9958717654755365 0.0000000000000000 + -1.9964039837778744 -5.9937267870813304 0.0000000000000000 + -0.99766406647423933 -5.9919797466297764 0.0000000000000000 + 2.4090097191669961E-011 -5.9913000293311889 0.0000000000000000 + 0.99766406652596806 -5.9919797465642901 0.0000000000000000 + 1.9964039838329390 -5.9937267869811102 0.0000000000000000 + 2.9966204896556343 -5.9958717653815992 0.0000000000000000 + 3.9977653337461323 -5.9977581248272331 0.0000000000000000 + 4.9989226436360692 -5.9990208119214286 0.0000000000000000 + 5.9996135291805706 -5.9996633062271050 0.0000000000000000 + 6.9998976699224684 -5.9999122764375885 0.0000000000000000 + 8.0000000000000000 -6.0000000000000000 0.0000000000000000 + -8.0000000000000000 -5.0000000000000000 0.0000000000000000 + -6.9997501274902012 -4.9998034408089786 0.0000000000000000 + -5.9990675728612679 -4.9992697388441112 0.0000000000000000 + -4.9973858232938344 -4.9979740837677751 0.0000000000000000 + -3.9945964688979139 -4.9957899032377453 0.0000000000000000 + -2.9923152259971646 -4.9934053345787692 0.0000000000000000 + -1.9929564366212700 -4.9916256720553269 0.0000000000000000 + -0.99625966749685468 -4.9904887766265009 0.0000000000000000 + 8.7516607876472420E-011 -4.9900352567664603 0.0000000000000000 + 0.99625966770123564 -4.9904887763239962 0.0000000000000000 + 1.9929564368609574 -4.9916256715941776 0.0000000000000000 + 2.9923152262075878 -4.9934053341572957 0.0000000000000000 + 3.9945964690280817 -4.9957899029737884 0.0000000000000000 + 4.9973858233507853 -4.9979740836508393 0.0000000000000000 + 5.9990675728791238 -4.9992697388066452 0.0000000000000000 + 6.9997501274942060 -4.9998034408002647 0.0000000000000000 + 8.0000000000000000 -5.0000000000000000 0.0000000000000000 + -8.0000000000000000 -4.0000000000000000 0.0000000000000000 + -6.9994442810297537 -3.9996092645441159 0.0000000000000000 + -5.9979747892447062 -3.9985815423292643 0.0000000000000000 + -4.9942895414925133 -3.9961147104828689 0.0000000000000000 + -3.9872884982575028 -3.9920749153444808 0.0000000000000000 + -2.9807287305762533 -3.9900738967481790 0.0000000000000000 + -1.9852784719276839 -3.9938575615448597 0.0000000000000000 + -0.99708909504304877 -3.9973734973237129 0.0000000000000000 + 2.1033866962410606E-010 -3.9974440103039064 0.0000000000000000 + 0.99708909566634052 -3.9973734962049221 0.0000000000000000 + 1.9852784727951609 -3.9938575598154191 0.0000000000000000 + 2.9807287313302866 -3.9900738952156258 0.0000000000000000 + 3.9872884986834030 -3.9920749144641170 0.0000000000000000 + 4.9942895416564230 -3.9961147101336323 0.0000000000000000 + 5.9979747892902688 -3.9985815422265709 0.0000000000000000 + 6.9994442810389081 -3.9996092645214816 0.0000000000000000 + 8.0000000000000000 -4.0000000000000000 0.0000000000000000 + -8.0000000000000000 -3.0000000000000000 0.0000000000000000 + -6.9988707545318789 -2.9993214807930388 0.0000000000000000 + -5.9959723250282675 -2.9975703581842250 0.0000000000000000 + -4.9889296386581075 -2.9933466877064818 0.0000000000000000 + -3.9746774455653884 -2.9854293504387881 0.0000000000000000 + -2.9486314200342503 -2.9764998162463585 0.0000000000000000 + -1.9503942149316469 -3.0021256138813035 0.0000000000000000 + -1.0261614729009205 -3.0312104940798901 0.0000000000000000 + 1.0261614745493584 -3.0312104908158548 0.0000000000000000 + 1.9503942176787044 -3.0021256083069598 0.0000000000000000 + 2.9486314222736021 -2.9764998116137829 0.0000000000000000 + 3.9746774466049950 -2.9854293481972203 0.0000000000000000 + 4.9889296390019764 -2.9933466869030068 0.0000000000000000 + 5.9959723251123087 -2.9975703579581028 0.0000000000000000 + 6.9988707545467523 -2.9993214807434820 0.0000000000000000 + 8.0000000000000000 -3.0000000000000000 0.0000000000000000 + -8.0000000000000000 -2.0000000000000000 0.0000000000000000 + -6.9979591237819632 -1.9990110686940572 0.0000000000000000 + -5.9927227618739725 -1.9964483151530883 0.0000000000000000 + -4.9801080557894242 -1.9901770532049168 0.0000000000000000 + -3.9576959349815479 -1.9783015452963999 0.0000000000000000 + -2.9197320667969913 -1.9542226531228222 0.0000000000000000 + -1.7464656898511224 -1.8918471048105712 0.0000000000000000 + -1.0538136609635054 -2.3225159630485046 0.0000000000000000 + 1.0538136634211011 -2.3225159580901482 0.0000000000000000 + 1.7464656992760117 -1.8918470856151424 0.0000000000000000 + 2.9197320715976618 -1.9542226428284530 0.0000000000000000 + 3.9576959367463562 -1.9783015410469320 0.0000000000000000 + 4.9801080562838553 -1.9901770517309758 0.0000000000000000 + 5.9927227619766033 -1.9964483147281369 0.0000000000000000 + 6.9979591237966705 -1.9990110685977320 0.0000000000000000 + 8.0000000000000000 -2.0000000000000000 0.0000000000000000 + -8.0000000000000000 -1.0000000000000000 0.0000000000000000 + -6.9968317675017770 -0.99886259715705294 0.0000000000000000 + -5.9885538594769985 -0.99581599636441842 0.0000000000000000 + -4.9678071326527107 -0.98792038864408005 0.0000000000000000 + -3.9258196694477046 -0.97144892599683563 0.0000000000000000 + -2.9029530084938924 -0.95956909177122207 0.0000000000000000 + -1.9915356039925562 -0.87186063981735284 0.0000000000000000 + 1.9915356222472387 -0.87186060209166283 0.0000000000000000 + 2.9029530147562950 -0.95956907678113346 0.0000000000000000 + 3.9258196712523956 -0.97144891979974901 0.0000000000000000 + 4.9678071330492370 -0.98792038628267198 0.0000000000000000 + 5.9885538595330425 -0.99581599564497181 0.0000000000000000 + 6.9968317675030942 -0.99886259698874036 0.0000000000000000 + 8.0000000000000000 -1.0000000000000000 0.0000000000000000 + -8.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.9958722740070352 9.2605842887460131E-004 0.0000000000000000 + -5.9849442010567895 3.5673767964436867E-003 0.0000000000000000 + -4.9568386769387480 1.1004836478173498E-002 0.0000000000000000 + -3.8951308919991683 2.9902496021364251E-002 0.0000000000000000 + -2.7032673839116930 9.0361097440859073E-002 0.0000000000000000 + -2.0571891363329842 -0.24562578581377828 0.0000000000000000 + 2.0571891499716477 -0.24562575669779302 0.0000000000000000 + 2.7032673869204902 9.0361111129516711E-002 0.0000000000000000 + 3.8951308924034209 2.9902504788020891E-002 0.0000000000000000 + 4.9568386769148196 1.1004839991627878E-002 0.0000000000000000 + 5.9849442010018254 3.5673778782903827E-003 0.0000000000000000 + 6.9958722739839931 9.2605868315656019E-004 0.0000000000000000 + 8.0000000000000000 0.0000000000000000 0.0000000000000000 + -8.0000000000000000 1.0000000000000000 0.0000000000000000 + -6.9955326960520150 1.0003662482577591 0.0000000000000000 + -5.9837177157599681 1.0016260315303323 0.0000000000000000 + -4.9534382883740049 1.0055660842008067 0.0000000000000000 + -3.8899281210667138 1.0153264300994280 0.0000000000000000 + -2.8576269259239067 1.0332611206083833 0.0000000000000000 + 2.8576269206180700 1.0332611487718453 0.0000000000000000 + 3.8899281199071547 1.0153264422760757 0.0000000000000000 + 4.9534382879928192 1.0055660886453257 0.0000000000000000 + 5.9837177156175274 1.0016260328696145 0.0000000000000000 + 6.9955326960100548 1.0003662485715008 0.0000000000000000 + 8.0000000000000000 1.0000000000000000 0.0000000000000000 + -8.0000000000000000 2.0000000000000000 0.0000000000000000 + -6.9960066511840280 1.9997507013087121 0.0000000000000000 + -5.9856229332322686 1.9994091100965983 0.0000000000000000 + -4.9595830937353638 1.9990558628265500 0.0000000000000000 + -3.9045581869999268 1.9973598907135701 0.0000000000000000 + -2.7368541689106971 1.9740722869324492 0.0000000000000000 + -2.1263404894339657 2.2948900365574501 0.0000000000000000 + 2.1263405099846904 2.2948900432082628 0.0000000000000000 + 2.7368541668551467 1.9740723203179147 0.0000000000000000 + 3.9045581868167778 1.9973599020749815 0.0000000000000000 + 4.9595830935518537 1.9990558669341754 0.0000000000000000 + 5.9856229331196342 1.9994091113584684 0.0000000000000000 + 6.9960066511449766 1.9997507016103995 0.0000000000000000 + 8.0000000000000000 2.0000000000000000 0.0000000000000000 + -8.0000000000000000 3.0000000000000000 0.0000000000000000 + -6.9970741145254109 2.9994054140824691 0.0000000000000000 + -5.9897519210034096 2.9981360157242580 0.0000000000000000 + -4.9724862257635190 2.9954390224920608 0.0000000000000000 + -3.9404681650821662 2.9905143469756337 0.0000000000000000 + -2.9327419944795010 2.9950483993160772 0.0000000000000000 + -1.9277593203701284 2.9288827058393201 0.0000000000000000 + -1.2934382299147573 3.1270574946750189 0.0000000000000000 + 1.2934382981899317 3.1270574584627195 0.0000000000000000 + 1.9277593629377268 2.9288826795836580 0.0000000000000000 + 2.9327420063368876 2.9950484011603677 0.0000000000000000 + 3.9404681675772051 2.9905143520853521 0.0000000000000000 + 4.9724862261650982 2.9954390249429101 0.0000000000000000 + 5.9897519210122363 2.9981360165754762 0.0000000000000000 + 6.9970741145083171 2.9994054143006470 0.0000000000000000 + 8.0000000000000000 3.0000000000000000 0.0000000000000000 + -8.0000000000000000 4.0000000000000000 0.0000000000000000 + -6.9982592393987968 3.9994059470511574 0.0000000000000000 + -5.9941718412117382 3.9980597406816538 0.0000000000000000 + -4.9856339697631320 3.9950007774720344 0.0000000000000000 + -3.9751323492146069 3.9888639093805867 0.0000000000000000 + -2.9708305521947196 3.9715346676422256 0.0000000000000000 + -1.9930387640582898 3.9338224795098449 0.0000000000000000 + -0.96763685658155807 3.7397274668414906 0.0000000000000000 + 3.3429034151622827E-008 3.8724227990342959 0.0000000000000000 + 0.96763691762346205 3.7397274489896106 0.0000000000000000 + 1.9930387926022926 3.9338224677871469 0.0000000000000000 + 2.9708305639402397 3.9715346636992050 0.0000000000000000 + 3.9751323526676017 3.9888639097163923 0.0000000000000000 + 4.9856339705045638 3.9950007782744765 0.0000000000000000 + 5.9941718413174092 3.9980597410666165 0.0000000000000000 + 6.9982592394038319 3.9994059471655752 0.0000000000000000 + 8.0000000000000000 4.0000000000000000 0.0000000000000000 + -8.0000000000000000 5.0000000000000000 0.0000000000000000 + -6.9991633741456480 4.9995936517804571 0.0000000000000000 + -5.9973416427807713 4.9986235063327511 0.0000000000000000 + -4.9939474927689487 4.9961691895174090 0.0000000000000000 + -3.9898774621657993 4.9900396721612950 0.0000000000000000 + -2.9882983865581152 4.9754672684598420 0.0000000000000000 + -1.9884726792358567 4.9414046357118258 0.0000000000000000 + -0.99054764142862672 4.9076265219014017 0.0000000000000000 + 1.5044633229432108E-008 4.8977197323029209 0.0000000000000000 + 0.99054766715027320 4.9076265171995406 0.0000000000000000 + 1.9884726950216143 4.9414046308491191 0.0000000000000000 + 2.9882983935721197 4.9754672660048422 0.0000000000000000 + 3.9898774645940622 4.9900396715407211 0.0000000000000000 + 4.9939474933945487 4.9961691895653884 0.0000000000000000 + 5.9973416428964281 4.9986235064339004 0.0000000000000000 + 6.9991633741594397 4.9995936518214812 0.0000000000000000 + 8.0000000000000000 5.0000000000000000 0.0000000000000000 + -8.0000000000000000 6.0000000000000000 0.0000000000000000 + -6.9996739984196390 5.9997893596429419 0.0000000000000000 + -5.9989986118848257 5.9992529007592390 0.0000000000000000 + -4.9977434317195026 5.9977709675596005 0.0000000000000000 + -3.9960992156787842 5.9940404411235333 0.0000000000000000 + -2.9946713951079547 5.9858782583382260 0.0000000000000000 + -1.9942453640855442 5.9731438824671530 0.0000000000000000 + -0.99595680588594671 5.9611672784475598 0.0000000000000000 + 5.4895336706131739E-009 5.9564095944048683 0.0000000000000000 + 0.99595681544617021 5.9611672771802988 0.0000000000000000 + 1.9942453703764043 5.9731438809327670 0.0000000000000000 + 2.9946713982270148 5.9858782573487614 0.0000000000000000 + 3.9960992168542182 5.9940404407363950 0.0000000000000000 + 4.9977434320589262 5.9977709674807409 0.0000000000000000 + 5.9989986119578065 5.9992529007644064 0.0000000000000000 + 6.9996739984307244 5.9997893596515759 0.0000000000000000 + 8.0000000000000000 6.0000000000000000 0.0000000000000000 + -8.0000000000000000 7.0000000000000000 0.0000000000000000 + -6.9999004989624796 6.9999196928494865 0.0000000000000000 + -5.9996945336645995 6.9997036786799463 0.0000000000000000 + -4.9992926804199769 6.9990875647356665 0.0000000000000000 + -3.9986895202660464 6.9975750738144677 0.0000000000000000 + -2.9980654465831940 6.9946658241746293 0.0000000000000000 + -1.9978514474788915 6.9906409012147579 0.0000000000000000 + -0.99851861799346908 6.9869919193812402 0.0000000000000000 + 1.5699479313662187E-009 6.9855176655399553 0.0000000000000000 + 0.99851862076110953 6.9869919190879317 0.0000000000000000 + 1.9978514493699755 6.9906409008314814 0.0000000000000000 + 2.9980654475797910 6.9946658238941168 0.0000000000000000 + 3.9986895206695174 6.9975750736809648 0.0000000000000000 + 4.9992926805452846 6.9990875646946797 0.0000000000000000 + 5.9996945336942300 6.9997036786734528 0.0000000000000000 + 6.9999004989676070 6.9999196928498879 0.0000000000000000 + 8.0000000000000000 7.0000000000000000 0.0000000000000000 + -8.0000000000000000 8.0000000000000000 0.0000000000000000 + -7.0000000000000000 8.0000000000000000 0.0000000000000000 + -6.0000000000000000 8.0000000000000000 0.0000000000000000 + -5.0000000000000000 8.0000000000000000 0.0000000000000000 + -4.0000000000000000 8.0000000000000000 0.0000000000000000 + -3.0000000000000000 8.0000000000000000 0.0000000000000000 + -2.0000000000000000 8.0000000000000000 0.0000000000000000 + -1.0000000000000000 8.0000000000000000 0.0000000000000000 + 0.0000000000000000 8.0000000000000000 0.0000000000000000 + 1.0000000000000000 8.0000000000000000 0.0000000000000000 + 2.0000000000000000 8.0000000000000000 0.0000000000000000 + 3.0000000000000000 8.0000000000000000 0.0000000000000000 + 4.0000000000000000 8.0000000000000000 0.0000000000000000 + 5.0000000000000000 8.0000000000000000 0.0000000000000000 + 6.0000000000000000 8.0000000000000000 0.0000000000000000 + 7.0000000000000000 8.0000000000000000 0.0000000000000000 + 8.0000000000000000 8.0000000000000000 0.0000000000000000 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + 0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 0.84062499397195267 -1.3187500120560947 0.0000000000000000 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + 1.5593750060280469 0.11875001205609381 0.0000000000000000 + 1.8406249939719526 0.68124998794390512 0.0000000000000000 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + 1.9234528539428934 1.5480229180052039 0.0000000000000000 + 1.7577069153495042 1.9541836299856183 0.0000000000000000 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + 0.95418362998561834 2.7577069153495040 0.0000000000000000 + 0.54802294711610822 2.9234528456487245 0.0000000000000000 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + -0.54802270862631064 2.9234529135983243 0.0000000000000000 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + -1.7577069153495022 1.9541836299856215 0.0000000000000000 + -1.9234529135983240 1.5480227086263110 0.0000000000000000 + -2.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + -1.5593750060280471 0.11875001205609437 0.0000000000000000 + -1.2000000031251037 -0.59999999374979263 0.0000000000000000 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 1 2 1 0 1 0 + 2 19 1 2 2 4 + 18 19 1 17 3 1 + 1 18 1 0 4 0 + 2 3 2 0 1 0 + 3 20 2 3 2 4 + 19 20 2 18 3 1 + 3 4 3 0 1 0 + 4 21 3 4 2 4 + 20 21 3 19 3 1 + 4 5 4 0 1 0 + 5 22 4 5 2 4 + 21 22 4 20 3 1 + 5 6 5 0 1 0 + 6 23 5 6 2 4 + 22 23 5 21 3 1 + 6 7 6 0 1 0 + 7 24 6 7 2 4 + 23 24 6 22 3 1 + 7 8 7 0 1 0 + 8 25 7 8 2 4 + 24 25 7 23 3 1 + 8 9 8 0 1 0 + 9 26 8 9 2 4 + 25 26 8 24 3 1 + 9 10 9 0 1 0 + 10 27 9 10 2 4 + 26 27 9 25 3 1 + 10 11 10 0 1 0 + 11 28 10 11 2 4 + 27 28 10 26 3 1 + 11 12 11 0 1 0 + 12 29 11 12 2 4 + 28 29 11 27 3 1 + 12 13 12 0 1 0 + 13 30 12 13 2 4 + 29 30 12 28 3 1 + 13 14 13 0 1 0 + 14 31 13 14 2 4 + 30 31 13 29 3 1 + 14 15 14 0 1 0 + 15 32 14 15 2 4 + 31 32 14 30 3 1 + 15 16 15 0 1 0 + 16 33 15 16 2 4 + 32 33 15 31 3 1 + 16 17 16 0 1 0 + 17 34 16 0 2 0 + 33 34 16 32 3 1 + 19 36 17 18 2 4 + 35 36 17 33 3 1 + 18 35 17 0 4 0 + 20 37 18 19 2 4 + 36 37 18 34 3 1 + 21 38 19 20 2 4 + 37 38 19 35 3 1 + 22 39 20 21 2 4 + 38 39 20 36 3 1 + 23 40 21 22 2 4 + 39 40 21 37 3 1 + 24 41 22 23 2 4 + 40 41 22 38 3 1 + 25 42 23 24 2 4 + 41 42 23 39 3 1 + 26 43 24 25 2 4 + 42 43 24 40 3 1 + 27 44 25 26 2 4 + 43 44 25 41 3 1 + 28 45 26 27 2 4 + 44 45 26 42 3 1 + 29 46 27 28 2 4 + 45 46 27 43 3 1 + 30 47 28 29 2 4 + 46 47 28 44 3 1 + 31 48 29 30 2 4 + 47 48 29 45 3 1 + 32 49 30 31 2 4 + 48 49 30 46 3 1 + 33 50 31 32 2 4 + 49 50 31 47 3 1 + 34 51 32 0 2 0 + 50 51 32 48 3 1 + 36 53 33 34 2 4 + 52 53 33 49 3 1 + 35 52 33 0 4 0 + 37 54 34 35 2 4 + 53 54 34 50 3 1 + 38 55 35 36 2 4 + 54 55 35 51 3 1 + 39 56 36 37 2 4 + 55 56 36 52 3 1 + 40 57 37 38 2 4 + 56 57 37 53 3 1 + 41 58 38 39 2 4 + 57 58 38 54 3 1 + 42 59 39 40 2 4 + 58 59 39 55 3 1 + 43 60 40 41 2 4 + 59 60 40 56 3 1 + 44 61 41 42 2 4 + 60 61 41 57 3 1 + 45 62 42 43 2 4 + 61 62 42 58 3 1 + 46 63 43 44 2 4 + 62 63 43 59 3 1 + 47 64 44 45 2 4 + 63 64 44 60 3 1 + 48 65 45 46 2 4 + 64 65 45 61 3 1 + 49 66 46 47 2 4 + 65 66 46 62 3 1 + 50 67 47 48 2 4 + 66 67 47 63 3 1 + 51 68 48 0 2 0 + 67 68 48 64 3 1 + 53 70 49 50 2 4 + 69 70 49 65 3 1 + 52 69 49 0 4 0 + 54 71 50 51 2 4 + 70 71 50 66 3 1 + 55 72 51 52 2 4 + 71 72 51 67 3 1 + 56 73 52 53 2 4 + 72 73 52 68 3 1 + 57 74 53 54 2 4 + 73 74 53 69 3 1 + 58 75 54 55 2 4 + 74 75 54 70 3 1 + 59 76 55 56 2 4 + 75 76 55 71 3 1 + 60 77 56 57 2 4 + 76 77 56 227 3 2 + 61 78 57 58 2 4 + 77 78 57 228 3 2 + 62 79 58 59 2 4 + 78 79 58 72 3 1 + 63 80 59 60 2 4 + 79 80 59 73 3 1 + 64 81 60 61 2 4 + 80 81 60 74 3 1 + 65 82 61 62 2 4 + 81 82 61 75 3 1 + 66 83 62 63 2 4 + 82 83 62 76 3 1 + 67 84 63 64 2 4 + 83 84 63 77 3 1 + 68 85 64 0 2 0 + 84 85 64 78 3 1 + 70 87 65 66 2 4 + 86 87 65 79 3 1 + 69 86 65 0 4 0 + 71 88 66 67 2 4 + 87 88 66 80 3 1 + 72 89 67 68 2 4 + 88 89 67 81 3 1 + 73 90 68 69 2 4 + 89 90 68 82 3 1 + 74 91 69 70 2 4 + 90 91 69 83 3 1 + 75 92 70 71 2 4 + 91 92 70 84 3 1 + 76 93 71 227 2 -1 + 92 93 71 85 3 1 + 79 95 72 73 2 4 + 94 95 72 86 3 1 + 78 94 72 228 4 -3 + 80 96 73 74 2 4 + 95 96 73 87 3 1 + 81 97 74 75 2 4 + 96 97 74 88 3 1 + 82 98 75 76 2 4 + 97 98 75 89 3 1 + 83 99 76 77 2 4 + 98 99 76 90 3 1 + 84 100 77 78 2 4 + 99 100 77 91 3 1 + 85 101 78 0 2 0 + 100 101 78 92 3 1 + 87 103 79 80 2 4 + 102 103 79 93 3 1 + 86 102 79 0 4 0 + 88 104 80 81 2 4 + 103 104 80 94 3 1 + 89 105 81 82 2 4 + 104 105 81 95 3 1 + 90 106 82 83 2 4 + 105 106 82 96 3 1 + 91 107 83 84 2 4 + 106 107 83 97 3 1 + 92 108 84 85 2 4 + 107 108 84 98 3 1 + 93 109 85 252 2 -1 + 108 109 85 251 3 1 + 95 111 86 87 2 4 + 110 111 86 230 3 1 + 94 110 86 229 4 1 + 96 112 87 88 2 4 + 111 112 87 99 3 1 + 97 113 88 89 2 4 + 112 113 88 100 3 1 + 98 114 89 90 2 4 + 113 114 89 101 3 1 + 99 115 90 91 2 4 + 114 115 90 102 3 1 + 100 116 91 92 2 4 + 115 116 91 103 3 1 + 101 117 92 0 2 0 + 116 117 92 104 3 1 + 103 119 93 94 2 4 + 118 119 93 105 3 1 + 102 118 93 0 4 0 + 104 120 94 95 2 4 + 119 120 94 106 3 1 + 105 121 95 96 2 4 + 120 121 95 107 3 1 + 106 122 96 97 2 4 + 121 122 96 108 3 1 + 107 123 97 98 2 4 + 122 123 97 109 3 1 + 108 124 98 250 2 -1 + 123 124 98 110 3 1 + 112 126 99 100 2 4 + 125 126 99 111 3 1 + 111 125 99 231 4 1 + 113 127 100 101 2 4 + 126 127 100 112 3 1 + 114 128 101 102 2 4 + 127 128 101 113 3 1 + 115 129 102 103 2 4 + 128 129 102 114 3 1 + 116 130 103 104 2 4 + 129 130 103 115 3 1 + 117 131 104 0 2 0 + 130 131 104 116 3 1 + 119 133 105 106 2 4 + 132 133 105 117 3 1 + 118 132 105 0 4 0 + 120 134 106 107 2 4 + 133 134 106 118 3 1 + 121 135 107 108 2 4 + 134 135 107 119 3 1 + 122 136 108 109 2 4 + 135 136 108 120 3 1 + 123 137 109 110 2 4 + 136 137 109 121 3 1 + 124 138 110 249 2 -1 + 137 138 110 248 3 1 + 126 140 111 112 2 4 + 139 140 111 233 3 1 + 125 139 111 232 4 1 + 127 141 112 113 2 4 + 140 141 112 122 3 1 + 128 142 113 114 2 4 + 141 142 113 123 3 1 + 129 143 114 115 2 4 + 142 143 114 124 3 1 + 130 144 115 116 2 4 + 143 144 115 125 3 1 + 131 145 116 0 2 0 + 144 145 116 126 3 1 + 133 147 117 118 2 4 + 146 147 117 127 3 1 + 132 146 117 0 4 0 + 134 148 118 119 2 4 + 147 148 118 128 3 1 + 135 149 119 120 2 4 + 148 149 119 129 3 1 + 136 150 120 121 2 4 + 149 150 120 130 3 1 + 137 151 121 247 2 -1 + 150 151 121 131 3 1 + 141 153 122 123 2 4 + 152 153 122 132 3 1 + 140 152 122 234 4 1 + 142 154 123 124 2 4 + 153 154 123 133 3 1 + 143 155 124 125 2 4 + 154 155 124 134 3 1 + 144 156 125 126 2 4 + 155 156 125 135 3 1 + 145 157 126 0 2 0 + 156 157 126 136 3 1 + 147 159 127 128 2 4 + 158 159 127 137 3 1 + 146 158 127 0 4 0 + 148 160 128 129 2 4 + 159 160 128 138 3 1 + 149 161 129 130 2 4 + 160 161 129 139 3 1 + 150 162 130 131 2 4 + 161 162 130 140 3 1 + 151 163 131 246 2 -1 + 162 163 131 141 3 1 + 153 167 132 133 2 4 + 166 167 132 144 3 1 + 152 166 132 235 4 1 + 154 168 133 134 2 4 + 167 168 133 145 3 1 + 155 169 134 135 2 4 + 168 169 134 146 3 1 + 156 170 135 136 2 4 + 169 170 135 147 3 1 + 157 171 136 0 2 0 + 170 171 136 148 3 1 + 159 173 137 138 2 4 + 172 173 137 149 3 1 + 158 172 137 0 4 0 + 160 174 138 139 2 4 + 173 174 138 150 3 1 + 161 175 139 140 2 4 + 174 175 139 151 3 1 + 162 176 140 141 2 4 + 175 176 140 152 3 1 + 163 177 141 142 2 4 + 176 177 141 153 3 1 + 163 164 142 245 1 -1 + 164 178 142 244 2 -1 + 177 178 142 154 3 1 + 165 166 143 236 1 -1 + 166 182 143 144 2 4 + 181 182 143 157 3 1 + 165 181 143 237 4 1 + 167 183 144 145 2 4 + 182 183 144 158 3 1 + 168 184 145 146 2 4 + 183 184 145 159 3 1 + 169 185 146 147 2 4 + 184 185 146 160 3 1 + 170 186 147 148 2 4 + 185 186 147 161 3 1 + 171 187 148 0 2 0 + 186 187 148 162 3 1 + 173 189 149 150 2 4 + 188 189 149 163 3 1 + 172 188 149 0 4 0 + 174 190 150 151 2 4 + 189 190 150 164 3 1 + 175 191 151 152 2 4 + 190 191 151 165 3 1 + 176 192 152 153 2 4 + 191 192 152 166 3 1 + 177 193 153 154 2 4 + 192 193 153 167 3 1 + 178 194 154 155 2 4 + 193 194 154 168 3 1 + 178 179 155 243 1 -1 + 179 195 155 242 2 -1 + 194 195 155 169 3 1 + 180 181 156 238 1 -1 + 181 198 156 157 2 4 + 197 198 156 172 3 1 + 180 197 156 239 4 1 + 182 199 157 158 2 4 + 198 199 157 173 3 1 + 183 200 158 159 2 4 + 199 200 158 174 3 1 + 184 201 159 160 2 4 + 200 201 159 175 3 1 + 185 202 160 161 2 4 + 201 202 160 176 3 1 + 186 203 161 162 2 4 + 202 203 161 177 3 1 + 187 204 162 0 2 0 + 203 204 162 178 3 1 + 189 206 163 164 2 4 + 205 206 163 179 3 1 + 188 205 163 0 4 0 + 190 207 164 165 2 4 + 206 207 164 180 3 1 + 191 208 165 166 2 4 + 207 208 165 181 3 1 + 192 209 166 167 2 4 + 208 209 166 182 3 1 + 193 210 167 168 2 4 + 209 210 167 183 3 1 + 194 211 168 169 2 4 + 210 211 168 184 3 1 + 195 212 169 170 2 4 + 211 212 169 185 3 1 + 195 196 170 241 1 -1 + 196 213 170 171 2 4 + 212 213 170 186 3 1 + 196 197 171 240 1 -1 + 197 214 171 172 2 4 + 213 214 171 187 3 1 + 198 215 172 173 2 4 + 214 215 172 188 3 1 + 199 216 173 174 2 4 + 215 216 173 189 3 1 + 200 217 174 175 2 4 + 216 217 174 190 3 1 + 201 218 175 176 2 4 + 217 218 175 191 3 1 + 202 219 176 177 2 4 + 218 219 176 192 3 1 + 203 220 177 178 2 4 + 219 220 177 193 3 1 + 204 221 178 0 2 0 + 220 221 178 194 3 1 + 206 223 179 180 2 4 + 222 223 179 195 3 1 + 205 222 179 0 4 0 + 207 224 180 181 2 4 + 223 224 180 196 3 1 + 208 225 181 182 2 4 + 224 225 181 197 3 1 + 209 226 182 183 2 4 + 225 226 182 198 3 1 + 210 227 183 184 2 4 + 226 227 183 199 3 1 + 211 228 184 185 2 4 + 227 228 184 200 3 1 + 212 229 185 186 2 4 + 228 229 185 201 3 1 + 213 230 186 187 2 4 + 229 230 186 202 3 1 + 214 231 187 188 2 4 + 230 231 187 203 3 1 + 215 232 188 189 2 4 + 231 232 188 204 3 1 + 216 233 189 190 2 4 + 232 233 189 205 3 1 + 217 234 190 191 2 4 + 233 234 190 206 3 1 + 218 235 191 192 2 4 + 234 235 191 207 3 1 + 219 236 192 193 2 4 + 235 236 192 208 3 1 + 220 237 193 194 2 4 + 236 237 193 209 3 1 + 221 238 194 0 2 0 + 237 238 194 210 3 1 + 223 240 195 196 2 4 + 239 240 195 211 3 1 + 222 239 195 0 4 0 + 224 241 196 197 2 4 + 240 241 196 212 3 1 + 225 242 197 198 2 4 + 241 242 197 213 3 1 + 226 243 198 199 2 4 + 242 243 198 214 3 1 + 227 244 199 200 2 4 + 243 244 199 215 3 1 + 228 245 200 201 2 4 + 244 245 200 216 3 1 + 229 246 201 202 2 4 + 245 246 201 217 3 1 + 230 247 202 203 2 4 + 246 247 202 218 3 1 + 231 248 203 204 2 4 + 247 248 203 219 3 1 + 232 249 204 205 2 4 + 248 249 204 220 3 1 + 233 250 205 206 2 4 + 249 250 205 221 3 1 + 234 251 206 207 2 4 + 250 251 206 222 3 1 + 235 252 207 208 2 4 + 251 252 207 223 3 1 + 236 253 208 209 2 4 + 252 253 208 224 3 1 + 237 254 209 210 2 4 + 253 254 209 225 3 1 + 238 255 210 0 2 0 + 254 255 210 226 3 1 + 240 257 211 212 2 4 + 256 257 211 0 3 0 + 239 256 211 0 4 0 + 241 258 212 213 2 4 + 257 258 212 0 3 0 + 242 259 213 214 2 4 + 258 259 213 0 3 0 + 243 260 214 215 2 4 + 259 260 214 0 3 0 + 244 261 215 216 2 4 + 260 261 215 0 3 0 + 245 262 216 217 2 4 + 261 262 216 0 3 0 + 246 263 217 218 2 4 + 262 263 217 0 3 0 + 247 264 218 219 2 4 + 263 264 218 0 3 0 + 248 265 219 220 2 4 + 264 265 219 0 3 0 + 249 266 220 221 2 4 + 265 266 220 0 3 0 + 250 267 221 222 2 4 + 266 267 221 0 3 0 + 251 268 222 223 2 4 + 267 268 222 0 3 0 + 252 269 223 224 2 4 + 268 269 223 0 3 0 + 253 270 224 225 2 4 + 269 270 224 0 3 0 + 254 271 225 226 2 4 + 270 271 225 0 3 0 + 255 272 226 0 2 0 + 271 272 226 0 3 0 + 273 77 227 228 3 1 + 93 273 227 252 4 2 + 273 94 228 229 4 -4 + 110 274 229 230 2 4 + 273 274 229 0 3 0 + 111 275 230 231 2 4 + 274 275 230 0 3 0 + 125 276 231 232 2 4 + 275 276 231 0 3 0 + 139 277 232 233 2 4 + 276 277 232 0 3 0 + 140 278 233 234 2 4 + 277 278 233 0 3 0 + 152 279 234 235 2 4 + 278 279 234 0 3 0 + 166 280 235 236 2 4 + 279 280 235 0 3 0 + 165 281 236 237 2 4 + 280 281 236 0 3 0 + 181 282 237 238 2 4 + 281 282 237 0 3 0 + 180 283 238 239 2 4 + 282 283 238 0 3 0 + 197 284 239 240 2 4 + 283 284 239 0 3 0 + 196 285 240 241 2 4 + 284 285 240 0 3 0 + 195 286 241 242 2 4 + 285 286 241 0 3 0 + 179 287 242 243 2 4 + 286 287 242 0 3 0 + 178 288 243 244 2 4 + 287 288 243 0 3 0 + 164 289 244 245 2 4 + 288 289 244 0 3 0 + 163 290 245 246 2 4 + 289 290 245 0 3 0 + 151 291 246 247 2 4 + 290 291 246 0 3 0 + 137 292 247 248 2 4 + 291 292 247 0 3 0 + 138 293 248 249 2 4 + 292 293 248 0 3 0 + 124 294 249 250 2 4 + 293 294 249 0 3 0 + 108 295 250 251 2 4 + 294 295 250 0 3 0 + 109 296 251 252 2 4 + 295 296 251 0 3 0 + 296 273 252 0 3 0 + 1 2 19 18 + 0 0 0 0 + Bottom --- --- Left + 2 3 20 19 + 0 0 0 0 + Bottom --- --- --- + 3 4 21 20 + 0 0 0 0 + Bottom --- --- --- + 4 5 22 21 + 0 0 0 0 + Bottom --- --- --- + 5 6 23 22 + 0 0 0 0 + Bottom --- --- --- + 6 7 24 23 + 0 0 0 0 + Bottom --- --- --- + 7 8 25 24 + 0 0 0 0 + Bottom --- --- --- + 8 9 26 25 + 0 0 0 0 + Bottom --- --- --- + 9 10 27 26 + 0 0 0 0 + Bottom --- --- --- + 10 11 28 27 + 0 0 0 0 + Bottom --- --- --- + 11 12 29 28 + 0 0 0 0 + Bottom --- --- --- + 12 13 30 29 + 0 0 0 0 + Bottom --- --- --- + 13 14 31 30 + 0 0 0 0 + Bottom --- --- --- + 14 15 32 31 + 0 0 0 0 + Bottom --- --- --- + 15 16 33 32 + 0 0 0 0 + Bottom --- --- --- + 16 17 34 33 + 0 0 0 0 + Bottom Right --- --- + 18 19 36 35 + 0 0 0 0 + --- --- --- Left + 19 20 37 36 + 0 0 0 0 + --- --- --- --- + 20 21 38 37 + 0 0 0 0 + --- --- --- --- + 21 22 39 38 + 0 0 0 0 + --- --- --- --- + 22 23 40 39 + 0 0 0 0 + --- --- --- --- + 23 24 41 40 + 0 0 0 0 + --- --- --- --- + 24 25 42 41 + 0 0 0 0 + --- --- --- --- + 25 26 43 42 + 0 0 0 0 + --- --- --- --- + 26 27 44 43 + 0 0 0 0 + --- --- --- --- + 27 28 45 44 + 0 0 0 0 + --- --- --- --- + 28 29 46 45 + 0 0 0 0 + --- --- --- --- + 29 30 47 46 + 0 0 0 0 + --- --- --- --- + 30 31 48 47 + 0 0 0 0 + --- --- --- --- + 31 32 49 48 + 0 0 0 0 + --- --- --- --- + 32 33 50 49 + 0 0 0 0 + --- --- --- --- + 33 34 51 50 + 0 0 0 0 + --- Right --- --- + 35 36 53 52 + 0 0 0 0 + --- --- --- Left + 36 37 54 53 + 0 0 0 0 + --- --- --- --- + 37 38 55 54 + 0 0 0 0 + --- --- --- --- + 38 39 56 55 + 0 0 0 0 + --- --- --- --- + 39 40 57 56 + 0 0 0 0 + --- --- --- --- + 40 41 58 57 + 0 0 0 0 + --- --- --- --- + 41 42 59 58 + 0 0 0 0 + --- --- --- --- + 42 43 60 59 + 0 0 0 0 + --- --- --- --- + 43 44 61 60 + 0 0 0 0 + --- --- --- --- + 44 45 62 61 + 0 0 0 0 + --- --- --- --- + 45 46 63 62 + 0 0 0 0 + --- --- --- --- + 46 47 64 63 + 0 0 0 0 + --- --- --- --- + 47 48 65 64 + 0 0 0 0 + --- --- --- --- + 48 49 66 65 + 0 0 0 0 + --- --- --- --- + 49 50 67 66 + 0 0 0 0 + --- --- --- --- + 50 51 68 67 + 0 0 0 0 + --- Right --- --- + 52 53 70 69 + 0 0 0 0 + --- --- --- Left + 53 54 71 70 + 0 0 0 0 + --- --- --- --- + 54 55 72 71 + 0 0 0 0 + --- --- --- --- + 55 56 73 72 + 0 0 0 0 + --- --- --- --- + 56 57 74 73 + 0 0 0 0 + --- --- --- --- + 57 58 75 74 + 0 0 0 0 + --- --- --- --- + 58 59 76 75 + 0 0 0 0 + --- --- --- --- + 59 60 77 76 + 0 0 0 0 + --- --- --- --- + 60 61 78 77 + 0 0 0 0 + --- --- --- --- + 61 62 79 78 + 0 0 0 0 + --- --- --- --- + 62 63 80 79 + 0 0 0 0 + --- --- --- --- + 63 64 81 80 + 0 0 0 0 + --- --- --- --- + 64 65 82 81 + 0 0 0 0 + --- --- --- --- + 65 66 83 82 + 0 0 0 0 + --- --- --- --- + 66 67 84 83 + 0 0 0 0 + --- --- --- --- + 67 68 85 84 + 0 0 0 0 + --- Right --- --- + 69 70 87 86 + 0 0 0 0 + --- --- --- Left + 70 71 88 87 + 0 0 0 0 + --- --- --- --- + 71 72 89 88 + 0 0 0 0 + --- --- --- --- + 72 73 90 89 + 0 0 0 0 + --- --- --- --- + 73 74 91 90 + 0 0 0 0 + --- --- --- --- + 74 75 92 91 + 0 0 0 0 + --- --- --- --- + 75 76 93 92 + 0 0 0 0 + --- --- --- --- + 78 79 95 94 + 0 0 0 0 + --- --- --- --- + 79 80 96 95 + 0 0 0 0 + --- --- --- --- + 80 81 97 96 + 0 0 0 0 + --- --- --- --- + 81 82 98 97 + 0 0 0 0 + --- --- --- --- + 82 83 99 98 + 0 0 0 0 + --- --- --- --- + 83 84 100 99 + 0 0 0 0 + --- --- --- --- + 84 85 101 100 + 0 0 0 0 + --- Right --- --- + 86 87 103 102 + 0 0 0 0 + --- --- --- Left + 87 88 104 103 + 0 0 0 0 + --- --- --- --- + 88 89 105 104 + 0 0 0 0 + --- --- --- --- + 89 90 106 105 + 0 0 0 0 + --- --- --- --- + 90 91 107 106 + 0 0 0 0 + --- --- --- --- + 91 92 108 107 + 0 0 0 0 + --- --- --- --- + 92 93 109 108 + 0 0 0 0 + --- --- --- --- + 94 95 111 110 + 0 0 0 0 + --- --- --- --- + 95 96 112 111 + 0 0 0 0 + --- --- --- --- + 96 97 113 112 + 0 0 0 0 + --- --- --- --- + 97 98 114 113 + 0 0 0 0 + --- --- --- --- + 98 99 115 114 + 0 0 0 0 + --- --- --- --- + 99 100 116 115 + 0 0 0 0 + --- --- --- --- + 100 101 117 116 + 0 0 0 0 + --- Right --- --- + 102 103 119 118 + 0 0 0 0 + --- --- --- Left + 103 104 120 119 + 0 0 0 0 + --- --- --- --- + 104 105 121 120 + 0 0 0 0 + --- --- --- --- + 105 106 122 121 + 0 0 0 0 + --- --- --- --- + 106 107 123 122 + 0 0 0 0 + --- --- --- --- + 107 108 124 123 + 0 0 0 0 + --- --- --- --- + 111 112 126 125 + 0 0 0 0 + --- --- --- --- + 112 113 127 126 + 0 0 0 0 + --- --- --- --- + 113 114 128 127 + 0 0 0 0 + --- --- --- --- + 114 115 129 128 + 0 0 0 0 + --- --- --- --- + 115 116 130 129 + 0 0 0 0 + --- --- --- --- + 116 117 131 130 + 0 0 0 0 + --- Right --- --- + 118 119 133 132 + 0 0 0 0 + --- --- --- Left + 119 120 134 133 + 0 0 0 0 + --- --- --- --- + 120 121 135 134 + 0 0 0 0 + --- --- --- --- + 121 122 136 135 + 0 0 0 0 + --- --- --- --- + 122 123 137 136 + 0 0 0 0 + --- --- --- --- + 123 124 138 137 + 0 0 0 0 + --- --- --- --- + 125 126 140 139 + 0 0 0 0 + --- --- --- --- + 126 127 141 140 + 0 0 0 0 + --- --- --- --- + 127 128 142 141 + 0 0 0 0 + --- --- --- --- + 128 129 143 142 + 0 0 0 0 + --- --- --- --- + 129 130 144 143 + 0 0 0 0 + --- --- --- --- + 130 131 145 144 + 0 0 0 0 + --- Right --- --- + 132 133 147 146 + 0 0 0 0 + --- --- --- Left + 133 134 148 147 + 0 0 0 0 + --- --- --- --- + 134 135 149 148 + 0 0 0 0 + --- --- --- --- + 135 136 150 149 + 0 0 0 0 + --- --- --- --- + 136 137 151 150 + 0 0 0 0 + --- --- --- --- + 140 141 153 152 + 0 0 0 0 + --- --- --- --- + 141 142 154 153 + 0 0 0 0 + --- --- --- --- + 142 143 155 154 + 0 0 0 0 + --- --- --- --- + 143 144 156 155 + 0 0 0 0 + --- --- --- --- + 144 145 157 156 + 0 0 0 0 + --- Right --- --- + 146 147 159 158 + 0 0 0 0 + --- --- --- Left + 147 148 160 159 + 0 0 0 0 + --- --- --- --- + 148 149 161 160 + 0 0 0 0 + --- --- --- --- + 149 150 162 161 + 0 0 0 0 + --- --- --- --- + 150 151 163 162 + 0 0 0 0 + --- --- --- --- + 152 153 167 166 + 0 0 0 0 + --- --- --- --- + 153 154 168 167 + 0 0 0 0 + --- --- --- --- + 154 155 169 168 + 0 0 0 0 + --- --- --- --- + 155 156 170 169 + 0 0 0 0 + --- --- --- --- + 156 157 171 170 + 0 0 0 0 + --- Right --- --- + 158 159 173 172 + 0 0 0 0 + --- --- --- Left + 159 160 174 173 + 0 0 0 0 + --- --- --- --- + 160 161 175 174 + 0 0 0 0 + --- --- --- --- + 161 162 176 175 + 0 0 0 0 + --- --- --- --- + 162 163 177 176 + 0 0 0 0 + --- --- --- --- + 163 164 178 177 + 0 0 0 0 + --- --- --- --- + 165 166 182 181 + 0 0 0 0 + --- --- --- --- + 166 167 183 182 + 0 0 0 0 + --- --- --- --- + 167 168 184 183 + 0 0 0 0 + --- --- --- --- + 168 169 185 184 + 0 0 0 0 + --- --- --- --- + 169 170 186 185 + 0 0 0 0 + --- --- --- --- + 170 171 187 186 + 0 0 0 0 + --- Right --- --- + 172 173 189 188 + 0 0 0 0 + --- --- --- Left + 173 174 190 189 + 0 0 0 0 + --- --- --- --- + 174 175 191 190 + 0 0 0 0 + --- --- --- --- + 175 176 192 191 + 0 0 0 0 + --- --- --- --- + 176 177 193 192 + 0 0 0 0 + --- --- --- --- + 177 178 194 193 + 0 0 0 0 + --- --- --- --- + 178 179 195 194 + 0 0 0 0 + --- --- --- --- + 180 181 198 197 + 0 0 0 0 + --- --- --- --- + 181 182 199 198 + 0 0 0 0 + --- --- --- --- + 182 183 200 199 + 0 0 0 0 + --- --- --- --- + 183 184 201 200 + 0 0 0 0 + --- --- --- --- + 184 185 202 201 + 0 0 0 0 + --- --- --- --- + 185 186 203 202 + 0 0 0 0 + --- --- --- --- + 186 187 204 203 + 0 0 0 0 + --- Right --- --- + 188 189 206 205 + 0 0 0 0 + --- --- --- Left + 189 190 207 206 + 0 0 0 0 + --- --- --- --- + 190 191 208 207 + 0 0 0 0 + --- --- --- --- + 191 192 209 208 + 0 0 0 0 + --- --- --- --- + 192 193 210 209 + 0 0 0 0 + --- --- --- --- + 193 194 211 210 + 0 0 0 0 + --- --- --- --- + 194 195 212 211 + 0 0 0 0 + --- --- --- --- + 195 196 213 212 + 0 0 0 0 + --- --- --- --- + 196 197 214 213 + 0 0 0 0 + --- --- --- --- + 197 198 215 214 + 0 0 0 0 + --- --- --- --- + 198 199 216 215 + 0 0 0 0 + --- --- --- --- + 199 200 217 216 + 0 0 0 0 + --- --- --- --- + 200 201 218 217 + 0 0 0 0 + --- --- --- --- + 201 202 219 218 + 0 0 0 0 + --- --- --- --- + 202 203 220 219 + 0 0 0 0 + --- --- --- --- + 203 204 221 220 + 0 0 0 0 + --- Right --- --- + 205 206 223 222 + 0 0 0 0 + --- --- --- Left + 206 207 224 223 + 0 0 0 0 + --- --- --- --- + 207 208 225 224 + 0 0 0 0 + --- --- --- --- + 208 209 226 225 + 0 0 0 0 + --- --- --- --- + 209 210 227 226 + 0 0 0 0 + --- --- --- --- + 210 211 228 227 + 0 0 0 0 + --- --- --- --- + 211 212 229 228 + 0 0 0 0 + --- --- --- --- + 212 213 230 229 + 0 0 0 0 + --- --- --- --- + 213 214 231 230 + 0 0 0 0 + --- --- --- --- + 214 215 232 231 + 0 0 0 0 + --- --- --- --- + 215 216 233 232 + 0 0 0 0 + --- --- --- --- + 216 217 234 233 + 0 0 0 0 + --- --- --- --- + 217 218 235 234 + 0 0 0 0 + --- --- --- --- + 218 219 236 235 + 0 0 0 0 + --- --- --- --- + 219 220 237 236 + 0 0 0 0 + --- --- --- --- + 220 221 238 237 + 0 0 0 0 + --- Right --- --- + 222 223 240 239 + 0 0 0 0 + --- --- --- Left + 223 224 241 240 + 0 0 0 0 + --- --- --- --- + 224 225 242 241 + 0 0 0 0 + --- --- --- --- + 225 226 243 242 + 0 0 0 0 + --- --- --- --- + 226 227 244 243 + 0 0 0 0 + --- --- --- --- + 227 228 245 244 + 0 0 0 0 + --- --- --- --- + 228 229 246 245 + 0 0 0 0 + --- --- --- --- + 229 230 247 246 + 0 0 0 0 + --- --- --- --- + 230 231 248 247 + 0 0 0 0 + --- --- --- --- + 231 232 249 248 + 0 0 0 0 + --- --- --- --- + 232 233 250 249 + 0 0 0 0 + --- --- --- --- + 233 234 251 250 + 0 0 0 0 + --- --- --- --- + 234 235 252 251 + 0 0 0 0 + --- --- --- --- + 235 236 253 252 + 0 0 0 0 + --- --- --- --- + 236 237 254 253 + 0 0 0 0 + --- --- --- --- + 237 238 255 254 + 0 0 0 0 + --- Right --- --- + 239 240 257 256 + 0 0 0 0 + --- --- Top Left + 240 241 258 257 + 0 0 0 0 + --- --- Top --- + 241 242 259 258 + 0 0 0 0 + --- --- Top --- + 242 243 260 259 + 0 0 0 0 + --- --- Top --- + 243 244 261 260 + 0 0 0 0 + --- --- Top --- + 244 245 262 261 + 0 0 0 0 + --- --- Top --- + 245 246 263 262 + 0 0 0 0 + --- --- Top --- + 246 247 264 263 + 0 0 0 0 + --- --- Top --- + 247 248 265 264 + 0 0 0 0 + --- --- Top --- + 248 249 266 265 + 0 0 0 0 + --- --- Top --- + 249 250 267 266 + 0 0 0 0 + --- --- Top --- + 250 251 268 267 + 0 0 0 0 + --- --- Top --- + 251 252 269 268 + 0 0 0 0 + --- --- Top --- + 252 253 270 269 + 0 0 0 0 + --- --- Top --- + 253 254 271 270 + 0 0 0 0 + --- --- Top --- + 254 255 272 271 + 0 0 0 0 + --- Right Top --- + 93 76 77 273 + 0 0 0 0 + --- --- --- --- + 273 77 78 94 + 0 0 0 0 + --- --- --- --- + 94 110 274 273 + 0 0 1 0 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + 8.1918573019674312E-002 -2.8361628539606514 0.0000000000000000 + 0.27968750301402334 -2.4406249939719533 0.0000000000000000 + 0.47745643300837237 -2.0450871339832553 0.0000000000000000 + 0.55937500602804668 -1.8812499879439066 0.0000000000000000 + --- --- RightSlant --- + 110 111 275 274 + 0 0 1 0 + 0.55937500602804668 -1.8812499879439066 0.0000000000000000 + 0.60056311315811417 -1.7988737736837717 0.0000000000000000 + 0.69999999999999973 -1.6000000000000005 0.0000000000000000 + 0.79943688684188530 -1.4011262263162294 0.0000000000000000 + 0.84062499397195278 -1.3187500120560944 0.0000000000000000 + --- --- RightSlant --- + 111 125 276 275 + 0 0 1 0 + 0.84062499397195278 -1.3187500120560944 0.0000000000000000 + 0.89325425707682937 -1.2134914858463413 0.0000000000000000 + 1.0203125378423255 -0.95937492431534910 0.0000000000000000 + 1.1473708186078211 -0.70525836278435783 0.0000000000000000 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + --- --- RightSlant --- + 125 139 277 276 + 0 0 1 0 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + 1.2526293208844796 -0.49474135823104071 0.0000000000000000 + 1.3796875438703724 -0.24062491225925520 0.0000000000000000 + 1.5067457668562652 1.3491533712530313E-002 0.0000000000000000 + 1.5593750060280467 0.11875001205609337 0.0000000000000000 + --- --- RightSlant --- + 139 140 278 277 + 0 0 1 0 + 1.5593750060280467 0.11875001205609337 0.0000000000000000 + 1.6005631131581151 0.20112622631623012 0.0000000000000000 + 1.6999999999999993 0.39999999999999858 0.0000000000000000 + 1.7994368868418849 0.59887377368376971 0.0000000000000000 + 1.8406249939719528 0.68124998794390557 0.0000000000000000 + --- --- RightSlant --- + 140 152 279 278 + 0 0 1 0 + 1.8406249939719528 0.68124998794390557 0.0000000000000000 + 1.8639649232289370 0.72792984645787406 0.0000000000000000 + 1.9203124969859759 0.84062499397195189 0.0000000000000000 + 1.9766600707430158 0.95332014148603150 0.0000000000000000 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + --- --- RightSlant --- + 152 166 280 279 + 0 0 1 0 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + 1.9983479703871072 1.0812735458173770 0.0000000000000000 + 1.9807707726899886 1.2766715490561058 0.0000000000000000 + 1.9441339362737691 1.4694073261344140 0.0000000000000000 + 1.9234528539428932 1.5480229180052043 0.0000000000000000 + --- --- IceCream --- + 166 165 281 280 + 0 0 1 0 + 1.9234528539428932 1.5480229180052043 0.0000000000000000 + 1.9048209196670516 1.6096369936271651 0.0000000000000000 + 1.8517494276368289 1.7556613376683212 0.0000000000000000 + 1.7875027702478623 1.8971253236623173 0.0000000000000000 + 1.7577069153495042 1.9541836299856179 0.0000000000000000 + --- --- IceCream --- + 165 181 282 281 + 0 0 1 0 + 1.7577069153495042 1.9541836299856179 0.0000000000000000 + 1.7159031169606289 2.0274611881744238 0.0000000000000000 + 1.6025531944504807 2.1965881743342441 0.0000000000000000 + 1.4725959561431350 2.3533148746507173 0.0000000000000000 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + --- --- IceCream --- + 181 180 283 282 + 0 0 1 0 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + 1.3533148446578711 2.4725959837065434 0.0000000000000000 + 1.1965881552143354 2.6025532087268597 0.0000000000000000 + 1.0274611821782322 2.7159031205510731 0.0000000000000000 + 0.95418362998561790 2.7577069153495044 0.0000000000000000 + --- --- IceCream --- + 180 197 284 283 + 0 0 1 0 + 0.95418362998561790 2.7577069153495044 0.0000000000000000 + 0.89712532762418773 2.7875027682594489 0.0000000000000000 + 0.75566135168116888 2.8517494219184703 0.0000000000000000 + 0.60963701823418193 2.9048209117915880 0.0000000000000000 + 0.54802294711610733 2.9234528456487245 0.0000000000000000 + --- --- IceCream --- + 197 196 285 284 + 0 0 1 0 + 0.54802294711610733 2.9234528456487245 0.0000000000000000 + 0.46940735118449745 2.9441339302254752 0.0000000000000000 + 0.27667156381993480 2.9807707706277959 0.0000000000000000 + 8.1273549858423472E-002 2.9983479702227562 0.0000000000000000 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + --- --- IceCream --- + 196 195 286 285 + 0 0 1 0 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + -8.1273514348751255E-002 2.9983479716669477 0.0000000000000000 + -0.27667144147234074 2.9807707877171499 0.0000000000000000 + -0.46940714556157248 2.9441339798727189 0.0000000000000000 + -0.54802270862630975 2.9234529135983243 0.0000000000000000 + --- --- IceCream --- + 195 179 287 286 + 0 0 1 0 + -0.54802270862630975 2.9234529135983243 0.0000000000000000 + -0.60963681664226710 2.9048209763109716 0.0000000000000000 + -0.75566123688154063 2.8517494687658642 0.0000000000000000 + -0.89712529516674266 2.7875027845494351 0.0000000000000000 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + --- --- IceCream --- + 179 178 288 287 + 0 0 1 0 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + -1.0274611529224809 2.7159031380690477 0.0000000000000000 + -1.1965880619272244 2.6025532783821101 0.0000000000000000 + -1.3533146983210931 2.4725961181899434 0.0000000000000000 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + --- --- IceCream --- + 178 164 289 288 + 0 0 1 0 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + -1.4725958216597181 2.3533150209874787 0.0000000000000000 + -1.6025531247952236 2.1965882676213502 0.0000000000000000 + -1.7159030994426530 2.0274612174301749 0.0000000000000000 + -1.7577069153495026 1.9541836299856208 0.0000000000000000 + --- --- IceCream --- + 164 163 290 289 + 0 0 1 0 + -1.7577069153495026 1.9541836299856208 0.0000000000000000 + -1.7875027845494327 1.8971252951667479 0.0000000000000000 + -1.8517494687658640 1.7556612368815410 0.0000000000000000 + -1.9048209763109714 1.6096368166422679 0.0000000000000000 + -1.9234529135983243 1.5480227086263101 0.0000000000000000 + --- --- IceCream --- + 163 151 291 290 + 0 0 1 0 + -1.9234529135983243 1.5480227086263101 0.0000000000000000 + -1.9441339798883621 1.4694071454967825 0.0000000000000000 + -1.9807707877486287 1.2766714412469717 0.0000000000000000 + -1.9983479716827337 1.0812735139606025 0.0000000000000000 + -2.0000000000000000 1.0000000000000002 0.0000000000000000 + --- --- IceCream --- + 151 137 292 291 + 0 0 1 0 + -2.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.9766600707430160 0.95332014148603195 0.0000000000000000 + -1.9203124969859764 0.84062499397195278 0.0000000000000000 + -1.8639649232289368 0.72792984645787362 0.0000000000000000 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + --- --- LeftSlant --- + 137 138 293 292 + 0 0 1 0 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + -1.7994368868418851 0.59887377368377015 0.0000000000000000 + -1.7000000000000000 0.39999999999999991 0.0000000000000000 + -1.6005631131581148 0.20112622631622967 0.0000000000000000 + -1.5593750060280471 0.11875001205609426 0.0000000000000000 + --- --- LeftSlant --- + 138 124 294 293 + 0 0 1 0 + -1.5593750060280471 0.11875001205609426 0.0000000000000000 + -1.5067457553473789 1.3491510694757736E-002 0.0000000000000000 + -1.3796875045765755 -0.24062499084684896 0.0000000000000000 + -1.2526292538057724 -0.49474149238845522 0.0000000000000000 + -1.2000000031251039 -0.59999999374979218 0.0000000000000000 + --- --- LeftSlant --- + 124 108 295 294 + 0 0 1 0 + -1.2000000031251039 -0.59999999374979218 0.0000000000000000 + -1.1473707515291136 -0.70525849694177278 0.0000000000000000 + -1.0203124985485283 -0.95937500290294331 0.0000000000000000 + -0.89325424556794286 -1.2134915088641143 0.0000000000000000 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + --- --- LeftSlant --- + 108 109 296 295 + 0 0 1 0 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + -0.79943688684188507 -1.4011262263162299 0.0000000000000000 + -0.69999999999999996 -1.6000000000000001 0.0000000000000000 + -0.60056311315811484 -1.7988737736837703 0.0000000000000000 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + --- --- LeftSlant --- + 109 93 273 296 + 0 0 1 0 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + -0.47745643300837282 -2.0450871339832544 0.0000000000000000 + -0.27968750301402356 -2.4406249939719529 0.0000000000000000 + -8.1918573019674756E-002 -2.8361628539606505 0.0000000000000000 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + --- --- LeftSlant --- diff --git a/previews/PR1693/tutorials/out/ice_cream_straight_sides.tec b/previews/PR1693/tutorials/out/ice_cream_straight_sides.tec new file mode 100644 index 00000000000..d897fe73036 --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_straight_sides.tec @@ -0,0 +1,550 @@ + VARIABLES = "X", "Y", "Z" + ZONE F=FEPOINT, ET=QUADRILATERAL, N= 296 E= 252 + -8.0000000000000000 -8.0000000000000000 0.0000000000000000 + -7.0000000000000000 -8.0000000000000000 0.0000000000000000 + -6.0000000000000000 -8.0000000000000000 0.0000000000000000 + -5.0000000000000000 -8.0000000000000000 0.0000000000000000 + -4.0000000000000000 -8.0000000000000000 0.0000000000000000 + -3.0000000000000000 -8.0000000000000000 0.0000000000000000 + -2.0000000000000000 -8.0000000000000000 0.0000000000000000 + -1.0000000000000000 -8.0000000000000000 0.0000000000000000 + 0.0000000000000000 -8.0000000000000000 0.0000000000000000 + 1.0000000000000000 -8.0000000000000000 0.0000000000000000 + 2.0000000000000000 -8.0000000000000000 0.0000000000000000 + 3.0000000000000000 -8.0000000000000000 0.0000000000000000 + 4.0000000000000000 -8.0000000000000000 0.0000000000000000 + 5.0000000000000000 -8.0000000000000000 0.0000000000000000 + 6.0000000000000000 -8.0000000000000000 0.0000000000000000 + 7.0000000000000000 -8.0000000000000000 0.0000000000000000 + 8.0000000000000000 -8.0000000000000000 0.0000000000000000 + -8.0000000000000000 -7.0000000000000000 0.0000000000000000 + -6.9999650574820480 -6.9999679261182877 0.0000000000000000 + -5.9998665632941011 -6.9998724565097961 0.0000000000000000 + -4.9996213184978222 -6.9996097515900049 0.0000000000000000 + -3.9991854607018733 -6.9990475318617795 0.0000000000000000 + -2.9986952242321481 -6.9981269410719644 0.0000000000000000 + -1.9985140781988169 -6.9969986109118514 0.0000000000000000 + -0.99897849037601483 -6.9960383675970457 0.0000000000000000 + 4.7989409883115671E-012 -6.9956585147354131 0.0000000000000000 + 0.99897849038591502 -6.9960383675859896 0.0000000000000000 + 1.9985140782087694 -6.9969986108947824 0.0000000000000000 + 2.9986952242406435 -6.9981269410555944 0.0000000000000000 + 3.9991854607075754 -6.9990475318504446 0.0000000000000000 + 4.9996213185007372 -6.9996097515841544 0.0000000000000000 + 5.9998665632952193 -6.9998724565075419 0.0000000000000000 + 6.9999650574823553 -6.9999679261176624 0.0000000000000000 + 8.0000000000000000 -7.0000000000000000 0.0000000000000000 + -8.0000000000000000 -6.0000000000000000 0.0000000000000000 + -6.9998976699211699 -5.9999122764402735 0.0000000000000000 + -5.9996135291753685 -5.9996633062377125 0.0000000000000000 + -4.9989226436212064 -5.9990208119514659 0.0000000000000000 + -3.9977653337150905 -5.9977581248894900 0.0000000000000000 + -2.9966204896079378 -5.9958717654755365 0.0000000000000000 + -1.9964039837778744 -5.9937267870813304 0.0000000000000000 + -0.99766406647423933 -5.9919797466297764 0.0000000000000000 + 2.4090097191669961E-011 -5.9913000293311889 0.0000000000000000 + 0.99766406652596806 -5.9919797465642901 0.0000000000000000 + 1.9964039838329390 -5.9937267869811102 0.0000000000000000 + 2.9966204896556343 -5.9958717653815992 0.0000000000000000 + 3.9977653337461323 -5.9977581248272331 0.0000000000000000 + 4.9989226436360692 -5.9990208119214286 0.0000000000000000 + 5.9996135291805706 -5.9996633062271050 0.0000000000000000 + 6.9998976699224684 -5.9999122764375885 0.0000000000000000 + 8.0000000000000000 -6.0000000000000000 0.0000000000000000 + -8.0000000000000000 -5.0000000000000000 0.0000000000000000 + -6.9997501274902012 -4.9998034408089786 0.0000000000000000 + -5.9990675728612679 -4.9992697388441112 0.0000000000000000 + -4.9973858232938344 -4.9979740837677751 0.0000000000000000 + -3.9945964688979139 -4.9957899032377453 0.0000000000000000 + -2.9923152259971646 -4.9934053345787692 0.0000000000000000 + -1.9929564366212700 -4.9916256720553269 0.0000000000000000 + -0.99625966749685468 -4.9904887766265009 0.0000000000000000 + 8.7516607876472420E-011 -4.9900352567664603 0.0000000000000000 + 0.99625966770123564 -4.9904887763239962 0.0000000000000000 + 1.9929564368609574 -4.9916256715941776 0.0000000000000000 + 2.9923152262075878 -4.9934053341572957 0.0000000000000000 + 3.9945964690280817 -4.9957899029737884 0.0000000000000000 + 4.9973858233507853 -4.9979740836508393 0.0000000000000000 + 5.9990675728791238 -4.9992697388066452 0.0000000000000000 + 6.9997501274942060 -4.9998034408002647 0.0000000000000000 + 8.0000000000000000 -5.0000000000000000 0.0000000000000000 + -8.0000000000000000 -4.0000000000000000 0.0000000000000000 + -6.9994442810297537 -3.9996092645441159 0.0000000000000000 + -5.9979747892447062 -3.9985815423292643 0.0000000000000000 + -4.9942895414925133 -3.9961147104828689 0.0000000000000000 + -3.9872884982575028 -3.9920749153444808 0.0000000000000000 + -2.9807287305762533 -3.9900738967481790 0.0000000000000000 + -1.9852784719276839 -3.9938575615448597 0.0000000000000000 + -0.99708909504304877 -3.9973734973237129 0.0000000000000000 + 2.1033866962410606E-010 -3.9974440103039064 0.0000000000000000 + 0.99708909566634052 -3.9973734962049221 0.0000000000000000 + 1.9852784727951609 -3.9938575598154191 0.0000000000000000 + 2.9807287313302866 -3.9900738952156258 0.0000000000000000 + 3.9872884986834030 -3.9920749144641170 0.0000000000000000 + 4.9942895416564230 -3.9961147101336323 0.0000000000000000 + 5.9979747892902688 -3.9985815422265709 0.0000000000000000 + 6.9994442810389081 -3.9996092645214816 0.0000000000000000 + 8.0000000000000000 -4.0000000000000000 0.0000000000000000 + -8.0000000000000000 -3.0000000000000000 0.0000000000000000 + -6.9988707545318789 -2.9993214807930388 0.0000000000000000 + -5.9959723250282675 -2.9975703581842250 0.0000000000000000 + -4.9889296386581075 -2.9933466877064818 0.0000000000000000 + -3.9746774455653884 -2.9854293504387881 0.0000000000000000 + -2.9486314200342503 -2.9764998162463585 0.0000000000000000 + -1.9503942149316469 -3.0021256138813035 0.0000000000000000 + -1.0261614729009205 -3.0312104940798901 0.0000000000000000 + 1.0261614745493584 -3.0312104908158548 0.0000000000000000 + 1.9503942176787044 -3.0021256083069598 0.0000000000000000 + 2.9486314222736021 -2.9764998116137829 0.0000000000000000 + 3.9746774466049950 -2.9854293481972203 0.0000000000000000 + 4.9889296390019764 -2.9933466869030068 0.0000000000000000 + 5.9959723251123087 -2.9975703579581028 0.0000000000000000 + 6.9988707545467523 -2.9993214807434820 0.0000000000000000 + 8.0000000000000000 -3.0000000000000000 0.0000000000000000 + -8.0000000000000000 -2.0000000000000000 0.0000000000000000 + -6.9979591237819632 -1.9990110686940572 0.0000000000000000 + -5.9927227618739725 -1.9964483151530883 0.0000000000000000 + -4.9801080557894242 -1.9901770532049168 0.0000000000000000 + -3.9576959349815479 -1.9783015452963999 0.0000000000000000 + -2.9197320667969913 -1.9542226531228222 0.0000000000000000 + -1.7464656898511224 -1.8918471048105712 0.0000000000000000 + -1.0538136609635054 -2.3225159630485046 0.0000000000000000 + 1.0538136634211011 -2.3225159580901482 0.0000000000000000 + 1.7464656992760117 -1.8918470856151424 0.0000000000000000 + 2.9197320715976618 -1.9542226428284530 0.0000000000000000 + 3.9576959367463562 -1.9783015410469320 0.0000000000000000 + 4.9801080562838553 -1.9901770517309758 0.0000000000000000 + 5.9927227619766033 -1.9964483147281369 0.0000000000000000 + 6.9979591237966705 -1.9990110685977320 0.0000000000000000 + 8.0000000000000000 -2.0000000000000000 0.0000000000000000 + -8.0000000000000000 -1.0000000000000000 0.0000000000000000 + -6.9968317675017770 -0.99886259715705294 0.0000000000000000 + -5.9885538594769985 -0.99581599636441842 0.0000000000000000 + -4.9678071326527107 -0.98792038864408005 0.0000000000000000 + -3.9258196694477046 -0.97144892599683563 0.0000000000000000 + -2.9029530084938924 -0.95956909177122207 0.0000000000000000 + -1.9915356039925562 -0.87186063981735284 0.0000000000000000 + 1.9915356222472387 -0.87186060209166283 0.0000000000000000 + 2.9029530147562950 -0.95956907678113346 0.0000000000000000 + 3.9258196712523956 -0.97144891979974901 0.0000000000000000 + 4.9678071330492370 -0.98792038628267198 0.0000000000000000 + 5.9885538595330425 -0.99581599564497181 0.0000000000000000 + 6.9968317675030942 -0.99886259698874036 0.0000000000000000 + 8.0000000000000000 -1.0000000000000000 0.0000000000000000 + -8.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.9958722740070352 9.2605842887460131E-004 0.0000000000000000 + -5.9849442010567895 3.5673767964436867E-003 0.0000000000000000 + -4.9568386769387480 1.1004836478173498E-002 0.0000000000000000 + -3.8951308919991683 2.9902496021364251E-002 0.0000000000000000 + -2.7032673839116930 9.0361097440859073E-002 0.0000000000000000 + -2.0571891363329842 -0.24562578581377828 0.0000000000000000 + 2.0571891499716477 -0.24562575669779302 0.0000000000000000 + 2.7032673869204902 9.0361111129516711E-002 0.0000000000000000 + 3.8951308924034209 2.9902504788020891E-002 0.0000000000000000 + 4.9568386769148196 1.1004839991627878E-002 0.0000000000000000 + 5.9849442010018254 3.5673778782903827E-003 0.0000000000000000 + 6.9958722739839931 9.2605868315656019E-004 0.0000000000000000 + 8.0000000000000000 0.0000000000000000 0.0000000000000000 + -8.0000000000000000 1.0000000000000000 0.0000000000000000 + -6.9955326960520150 1.0003662482577591 0.0000000000000000 + -5.9837177157599681 1.0016260315303323 0.0000000000000000 + -4.9534382883740049 1.0055660842008067 0.0000000000000000 + -3.8899281210667138 1.0153264300994280 0.0000000000000000 + -2.8576269259239067 1.0332611206083833 0.0000000000000000 + 2.8576269206180700 1.0332611487718453 0.0000000000000000 + 3.8899281199071547 1.0153264422760757 0.0000000000000000 + 4.9534382879928192 1.0055660886453257 0.0000000000000000 + 5.9837177156175274 1.0016260328696145 0.0000000000000000 + 6.9955326960100548 1.0003662485715008 0.0000000000000000 + 8.0000000000000000 1.0000000000000000 0.0000000000000000 + -8.0000000000000000 2.0000000000000000 0.0000000000000000 + -6.9960066511840280 1.9997507013087121 0.0000000000000000 + -5.9856229332322686 1.9994091100965983 0.0000000000000000 + -4.9595830937353638 1.9990558628265500 0.0000000000000000 + -3.9045581869999268 1.9973598907135701 0.0000000000000000 + -2.7368541689106971 1.9740722869324492 0.0000000000000000 + -2.1263404894339657 2.2948900365574501 0.0000000000000000 + 2.1263405099846904 2.2948900432082628 0.0000000000000000 + 2.7368541668551467 1.9740723203179147 0.0000000000000000 + 3.9045581868167778 1.9973599020749815 0.0000000000000000 + 4.9595830935518537 1.9990558669341754 0.0000000000000000 + 5.9856229331196342 1.9994091113584684 0.0000000000000000 + 6.9960066511449766 1.9997507016103995 0.0000000000000000 + 8.0000000000000000 2.0000000000000000 0.0000000000000000 + -8.0000000000000000 3.0000000000000000 0.0000000000000000 + -6.9970741145254109 2.9994054140824691 0.0000000000000000 + -5.9897519210034096 2.9981360157242580 0.0000000000000000 + -4.9724862257635190 2.9954390224920608 0.0000000000000000 + -3.9404681650821662 2.9905143469756337 0.0000000000000000 + -2.9327419944795010 2.9950483993160772 0.0000000000000000 + -1.9277593203701284 2.9288827058393201 0.0000000000000000 + -1.2934382299147573 3.1270574946750189 0.0000000000000000 + 1.2934382981899317 3.1270574584627195 0.0000000000000000 + 1.9277593629377268 2.9288826795836580 0.0000000000000000 + 2.9327420063368876 2.9950484011603677 0.0000000000000000 + 3.9404681675772051 2.9905143520853521 0.0000000000000000 + 4.9724862261650982 2.9954390249429101 0.0000000000000000 + 5.9897519210122363 2.9981360165754762 0.0000000000000000 + 6.9970741145083171 2.9994054143006470 0.0000000000000000 + 8.0000000000000000 3.0000000000000000 0.0000000000000000 + -8.0000000000000000 4.0000000000000000 0.0000000000000000 + -6.9982592393987968 3.9994059470511574 0.0000000000000000 + -5.9941718412117382 3.9980597406816538 0.0000000000000000 + -4.9856339697631320 3.9950007774720344 0.0000000000000000 + -3.9751323492146069 3.9888639093805867 0.0000000000000000 + -2.9708305521947196 3.9715346676422256 0.0000000000000000 + -1.9930387640582898 3.9338224795098449 0.0000000000000000 + -0.96763685658155807 3.7397274668414906 0.0000000000000000 + 3.3429034151622827E-008 3.8724227990342959 0.0000000000000000 + 0.96763691762346205 3.7397274489896106 0.0000000000000000 + 1.9930387926022926 3.9338224677871469 0.0000000000000000 + 2.9708305639402397 3.9715346636992050 0.0000000000000000 + 3.9751323526676017 3.9888639097163923 0.0000000000000000 + 4.9856339705045638 3.9950007782744765 0.0000000000000000 + 5.9941718413174092 3.9980597410666165 0.0000000000000000 + 6.9982592394038319 3.9994059471655752 0.0000000000000000 + 8.0000000000000000 4.0000000000000000 0.0000000000000000 + -8.0000000000000000 5.0000000000000000 0.0000000000000000 + -6.9991633741456480 4.9995936517804571 0.0000000000000000 + -5.9973416427807713 4.9986235063327511 0.0000000000000000 + -4.9939474927689487 4.9961691895174090 0.0000000000000000 + -3.9898774621657993 4.9900396721612950 0.0000000000000000 + -2.9882983865581152 4.9754672684598420 0.0000000000000000 + -1.9884726792358567 4.9414046357118258 0.0000000000000000 + -0.99054764142862672 4.9076265219014017 0.0000000000000000 + 1.5044633229432108E-008 4.8977197323029209 0.0000000000000000 + 0.99054766715027320 4.9076265171995406 0.0000000000000000 + 1.9884726950216143 4.9414046308491191 0.0000000000000000 + 2.9882983935721197 4.9754672660048422 0.0000000000000000 + 3.9898774645940622 4.9900396715407211 0.0000000000000000 + 4.9939474933945487 4.9961691895653884 0.0000000000000000 + 5.9973416428964281 4.9986235064339004 0.0000000000000000 + 6.9991633741594397 4.9995936518214812 0.0000000000000000 + 8.0000000000000000 5.0000000000000000 0.0000000000000000 + -8.0000000000000000 6.0000000000000000 0.0000000000000000 + -6.9996739984196390 5.9997893596429419 0.0000000000000000 + -5.9989986118848257 5.9992529007592390 0.0000000000000000 + -4.9977434317195026 5.9977709675596005 0.0000000000000000 + -3.9960992156787842 5.9940404411235333 0.0000000000000000 + -2.9946713951079547 5.9858782583382260 0.0000000000000000 + -1.9942453640855442 5.9731438824671530 0.0000000000000000 + -0.99595680588594671 5.9611672784475598 0.0000000000000000 + 5.4895336706131739E-009 5.9564095944048683 0.0000000000000000 + 0.99595681544617021 5.9611672771802988 0.0000000000000000 + 1.9942453703764043 5.9731438809327670 0.0000000000000000 + 2.9946713982270148 5.9858782573487614 0.0000000000000000 + 3.9960992168542182 5.9940404407363950 0.0000000000000000 + 4.9977434320589262 5.9977709674807409 0.0000000000000000 + 5.9989986119578065 5.9992529007644064 0.0000000000000000 + 6.9996739984307244 5.9997893596515759 0.0000000000000000 + 8.0000000000000000 6.0000000000000000 0.0000000000000000 + -8.0000000000000000 7.0000000000000000 0.0000000000000000 + -6.9999004989624796 6.9999196928494865 0.0000000000000000 + -5.9996945336645995 6.9997036786799463 0.0000000000000000 + -4.9992926804199769 6.9990875647356665 0.0000000000000000 + -3.9986895202660464 6.9975750738144677 0.0000000000000000 + -2.9980654465831940 6.9946658241746293 0.0000000000000000 + -1.9978514474788915 6.9906409012147579 0.0000000000000000 + -0.99851861799346908 6.9869919193812402 0.0000000000000000 + 1.5699479313662187E-009 6.9855176655399553 0.0000000000000000 + 0.99851862076110953 6.9869919190879317 0.0000000000000000 + 1.9978514493699755 6.9906409008314814 0.0000000000000000 + 2.9980654475797910 6.9946658238941168 0.0000000000000000 + 3.9986895206695174 6.9975750736809648 0.0000000000000000 + 4.9992926805452846 6.9990875646946797 0.0000000000000000 + 5.9996945336942300 6.9997036786734528 0.0000000000000000 + 6.9999004989676070 6.9999196928498879 0.0000000000000000 + 8.0000000000000000 7.0000000000000000 0.0000000000000000 + -8.0000000000000000 8.0000000000000000 0.0000000000000000 + -7.0000000000000000 8.0000000000000000 0.0000000000000000 + -6.0000000000000000 8.0000000000000000 0.0000000000000000 + -5.0000000000000000 8.0000000000000000 0.0000000000000000 + -4.0000000000000000 8.0000000000000000 0.0000000000000000 + -3.0000000000000000 8.0000000000000000 0.0000000000000000 + -2.0000000000000000 8.0000000000000000 0.0000000000000000 + -1.0000000000000000 8.0000000000000000 0.0000000000000000 + 0.0000000000000000 8.0000000000000000 0.0000000000000000 + 1.0000000000000000 8.0000000000000000 0.0000000000000000 + 2.0000000000000000 8.0000000000000000 0.0000000000000000 + 3.0000000000000000 8.0000000000000000 0.0000000000000000 + 4.0000000000000000 8.0000000000000000 0.0000000000000000 + 5.0000000000000000 8.0000000000000000 0.0000000000000000 + 6.0000000000000000 8.0000000000000000 0.0000000000000000 + 7.0000000000000000 8.0000000000000000 0.0000000000000000 + 8.0000000000000000 8.0000000000000000 0.0000000000000000 + 0.0000000000000000 -3.0000000000000000 0.0000000000000000 + 0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 0.84062499397195267 -1.3187500120560947 0.0000000000000000 + 1.2000000817126981 -0.59999983657460376 0.0000000000000000 + 1.5593750060280469 0.11875001205609381 0.0000000000000000 + 1.8406249939719526 0.68124998794390512 0.0000000000000000 + 2.0000000000000000 1.0000000000000000 0.0000000000000000 + 1.9234528539428934 1.5480229180052039 0.0000000000000000 + 1.7577069153495042 1.9541836299856183 0.0000000000000000 + 1.4142135455002482 2.4142135792459416 0.0000000000000000 + 0.95418362998561834 2.7577069153495040 0.0000000000000000 + 0.54802294711610822 2.9234528456487245 0.0000000000000000 + -4.5511671064437944E-010 3.0000000000000000 0.0000000000000000 + -0.54802270862631064 2.9234529135983243 0.0000000000000000 + -0.95418362998561812 2.7577069153495044 0.0000000000000000 + -1.4142133808531077 2.4142137438930593 0.0000000000000000 + -1.7577069153495022 1.9541836299856215 0.0000000000000000 + -1.9234529135983240 1.5480227086263110 0.0000000000000000 + -2.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.8406249939719528 0.68124998794390557 0.0000000000000000 + -1.5593750060280471 0.11875001205609437 0.0000000000000000 + -1.2000000031251037 -0.59999999374979263 0.0000000000000000 + -0.84062499397195278 -1.3187500120560944 0.0000000000000000 + -0.55937500602804713 -1.8812499879439057 0.0000000000000000 + 1 2 19 18 + 2 3 20 19 + 3 4 21 20 + 4 5 22 21 + 5 6 23 22 + 6 7 24 23 + 7 8 25 24 + 8 9 26 25 + 9 10 27 26 + 10 11 28 27 + 11 12 29 28 + 12 13 30 29 + 13 14 31 30 + 14 15 32 31 + 15 16 33 32 + 16 17 34 33 + 18 19 36 35 + 19 20 37 36 + 20 21 38 37 + 21 22 39 38 + 22 23 40 39 + 23 24 41 40 + 24 25 42 41 + 25 26 43 42 + 26 27 44 43 + 27 28 45 44 + 28 29 46 45 + 29 30 47 46 + 30 31 48 47 + 31 32 49 48 + 32 33 50 49 + 33 34 51 50 + 35 36 53 52 + 36 37 54 53 + 37 38 55 54 + 38 39 56 55 + 39 40 57 56 + 40 41 58 57 + 41 42 59 58 + 42 43 60 59 + 43 44 61 60 + 44 45 62 61 + 45 46 63 62 + 46 47 64 63 + 47 48 65 64 + 48 49 66 65 + 49 50 67 66 + 50 51 68 67 + 52 53 70 69 + 53 54 71 70 + 54 55 72 71 + 55 56 73 72 + 56 57 74 73 + 57 58 75 74 + 58 59 76 75 + 59 60 77 76 + 60 61 78 77 + 61 62 79 78 + 62 63 80 79 + 63 64 81 80 + 64 65 82 81 + 65 66 83 82 + 66 67 84 83 + 67 68 85 84 + 69 70 87 86 + 70 71 88 87 + 71 72 89 88 + 72 73 90 89 + 73 74 91 90 + 74 75 92 91 + 75 76 93 92 + 78 79 95 94 + 79 80 96 95 + 80 81 97 96 + 81 82 98 97 + 82 83 99 98 + 83 84 100 99 + 84 85 101 100 + 86 87 103 102 + 87 88 104 103 + 88 89 105 104 + 89 90 106 105 + 90 91 107 106 + 91 92 108 107 + 92 93 109 108 + 94 95 111 110 + 95 96 112 111 + 96 97 113 112 + 97 98 114 113 + 98 99 115 114 + 99 100 116 115 + 100 101 117 116 + 102 103 119 118 + 103 104 120 119 + 104 105 121 120 + 105 106 122 121 + 106 107 123 122 + 107 108 124 123 + 111 112 126 125 + 112 113 127 126 + 113 114 128 127 + 114 115 129 128 + 115 116 130 129 + 116 117 131 130 + 118 119 133 132 + 119 120 134 133 + 120 121 135 134 + 121 122 136 135 + 122 123 137 136 + 123 124 138 137 + 125 126 140 139 + 126 127 141 140 + 127 128 142 141 + 128 129 143 142 + 129 130 144 143 + 130 131 145 144 + 132 133 147 146 + 133 134 148 147 + 134 135 149 148 + 135 136 150 149 + 136 137 151 150 + 140 141 153 152 + 141 142 154 153 + 142 143 155 154 + 143 144 156 155 + 144 145 157 156 + 146 147 159 158 + 147 148 160 159 + 148 149 161 160 + 149 150 162 161 + 150 151 163 162 + 152 153 167 166 + 153 154 168 167 + 154 155 169 168 + 155 156 170 169 + 156 157 171 170 + 158 159 173 172 + 159 160 174 173 + 160 161 175 174 + 161 162 176 175 + 162 163 177 176 + 163 164 178 177 + 165 166 182 181 + 166 167 183 182 + 167 168 184 183 + 168 169 185 184 + 169 170 186 185 + 170 171 187 186 + 172 173 189 188 + 173 174 190 189 + 174 175 191 190 + 175 176 192 191 + 176 177 193 192 + 177 178 194 193 + 178 179 195 194 + 180 181 198 197 + 181 182 199 198 + 182 183 200 199 + 183 184 201 200 + 184 185 202 201 + 185 186 203 202 + 186 187 204 203 + 188 189 206 205 + 189 190 207 206 + 190 191 208 207 + 191 192 209 208 + 192 193 210 209 + 193 194 211 210 + 194 195 212 211 + 195 196 213 212 + 196 197 214 213 + 197 198 215 214 + 198 199 216 215 + 199 200 217 216 + 200 201 218 217 + 201 202 219 218 + 202 203 220 219 + 203 204 221 220 + 205 206 223 222 + 206 207 224 223 + 207 208 225 224 + 208 209 226 225 + 209 210 227 226 + 210 211 228 227 + 211 212 229 228 + 212 213 230 229 + 213 214 231 230 + 214 215 232 231 + 215 216 233 232 + 216 217 234 233 + 217 218 235 234 + 218 219 236 235 + 219 220 237 236 + 220 221 238 237 + 222 223 240 239 + 223 224 241 240 + 224 225 242 241 + 225 226 243 242 + 226 227 244 243 + 227 228 245 244 + 228 229 246 245 + 229 230 247 246 + 230 231 248 247 + 231 232 249 248 + 232 233 250 249 + 233 234 251 250 + 234 235 252 251 + 235 236 253 252 + 236 237 254 253 + 237 238 255 254 + 239 240 257 256 + 240 241 258 257 + 241 242 259 258 + 242 243 260 259 + 243 244 261 260 + 244 245 262 261 + 245 246 263 262 + 246 247 264 263 + 247 248 265 264 + 248 249 266 265 + 249 250 267 266 + 250 251 268 267 + 251 252 269 268 + 252 253 270 269 + 253 254 271 270 + 254 255 272 271 + 93 76 77 273 + 273 77 78 94 + 94 110 274 273 + 110 111 275 274 + 111 125 276 275 + 125 139 277 276 + 139 140 278 277 + 140 152 279 278 + 152 166 280 279 + 166 165 281 280 + 165 181 282 281 + 181 180 283 282 + 180 197 284 283 + 197 196 285 284 + 196 195 286 285 + 195 179 287 286 + 179 178 288 287 + 178 164 289 288 + 164 163 290 289 + 163 151 291 290 + 151 137 292 291 + 137 138 293 292 + 138 124 294 293 + 124 108 295 294 + 108 109 296 295 + 109 93 273 296 diff --git a/previews/PR1693/tutorials/out/ice_cream_straight_sides.txt b/previews/PR1693/tutorials/out/ice_cream_straight_sides.txt new file mode 100644 index 00000000000..e41813ce3c2 --- /dev/null +++ b/previews/PR1693/tutorials/out/ice_cream_straight_sides.txt @@ -0,0 +1,258 @@ + + ------------------------ + 2D Mesh Quality Measures + ------------------------ + +Signed Area Aspect Ratio Condition Edge Ratio Jacobian Minimum Angle Maximum Angle Area Sign + 1.0000E+00 1.0000E+00 1.0000E+00 1.0000E+00 1.0000E+00 8.9996E+01 9.0002E+01 1.0000E+00 + 1.0001E+00 1.0001E+00 1.0000E+00 1.0001E+00 1.0000E+00 8.9987E+01 9.0008E+01 1.0000E+00 + 1.0004E+00 1.0002E+00 1.0000E+00 1.0004E+00 1.0001E+00 8.9963E+01 9.0023E+01 1.0000E+00 + 1.0009E+00 1.0005E+00 1.0000E+00 1.0010E+00 1.0004E+00 8.9921E+01 9.0054E+01 1.0000E+00 + 1.0017E+00 1.0010E+00 1.0000E+00 1.0019E+00 1.0010E+00 8.9873E+01 9.0099E+01 1.0000E+00 + 1.0025E+00 1.0017E+00 1.0000E+00 1.0030E+00 1.0019E+00 8.9850E+01 9.0139E+01 1.0000E+00 + 1.0032E+00 1.0023E+00 1.0000E+00 1.0044E+00 1.0025E+00 8.9887E+01 9.0140E+01 1.0000E+00 + 1.0036E+00 1.0025E+00 1.0000E+00 1.0054E+00 1.0029E+00 8.9942E+01 9.0080E+01 1.0000E+00 + 1.0036E+00 1.0025E+00 1.0000E+00 1.0054E+00 1.0029E+00 8.9942E+01 9.0080E+01 1.0000E+00 + 1.0032E+00 1.0023E+00 1.0000E+00 1.0044E+00 1.0025E+00 8.9887E+01 9.0140E+01 1.0000E+00 + 1.0025E+00 1.0017E+00 1.0000E+00 1.0030E+00 1.0019E+00 8.9850E+01 9.0139E+01 1.0000E+00 + 1.0017E+00 1.0010E+00 1.0000E+00 1.0019E+00 1.0010E+00 8.9873E+01 9.0099E+01 1.0000E+00 + 1.0009E+00 1.0005E+00 1.0000E+00 1.0010E+00 1.0004E+00 8.9921E+01 9.0054E+01 1.0000E+00 + 1.0004E+00 1.0002E+00 1.0000E+00 1.0004E+00 1.0001E+00 8.9963E+01 9.0023E+01 1.0000E+00 + 1.0001E+00 1.0001E+00 1.0000E+00 1.0001E+00 1.0000E+00 8.9987E+01 9.0008E+01 1.0000E+00 + 1.0000E+00 1.0000E+00 1.0000E+00 1.0000E+00 1.0000E+00 8.9996E+01 9.0002E+01 1.0000E+00 + 1.0001E+00 1.0001E+00 1.0000E+00 1.0001E+00 1.0000E+00 8.9991E+01 9.0006E+01 1.0000E+00 + 1.0003E+00 1.0001E+00 1.0000E+00 1.0002E+00 1.0002E+00 8.9971E+01 9.0020E+01 1.0000E+00 + 1.0009E+00 1.0003E+00 1.0000E+00 1.0005E+00 1.0005E+00 8.9923E+01 9.0055E+01 1.0000E+00 + 1.0017E+00 1.0004E+00 1.0000E+00 1.0009E+00 1.0010E+00 8.9846E+01 9.0113E+01 1.0000E+00 + 1.0026E+00 1.0010E+00 1.0000E+00 1.0018E+00 1.0018E+00 8.9773E+01 9.0189E+01 1.0000E+00 + 1.0030E+00 1.0018E+00 1.0000E+00 1.0031E+00 1.0024E+00 8.9757E+01 9.0241E+01 1.0000E+00 + 1.0028E+00 1.0027E+00 1.0000E+00 1.0053E+00 1.0020E+00 8.9824E+01 9.0221E+01 1.0000E+00 + 1.0025E+00 1.0031E+00 1.0000E+00 1.0067E+00 1.0017E+00 8.9903E+01 9.0114E+01 1.0000E+00 + 1.0025E+00 1.0031E+00 1.0000E+00 1.0067E+00 1.0017E+00 8.9903E+01 9.0114E+01 1.0000E+00 + 1.0028E+00 1.0027E+00 1.0000E+00 1.0053E+00 1.0020E+00 8.9824E+01 9.0221E+01 1.0000E+00 + 1.0030E+00 1.0018E+00 1.0000E+00 1.0031E+00 1.0024E+00 8.9757E+01 9.0241E+01 1.0000E+00 + 1.0026E+00 1.0010E+00 1.0000E+00 1.0018E+00 1.0018E+00 8.9773E+01 9.0189E+01 1.0000E+00 + 1.0017E+00 1.0004E+00 1.0000E+00 1.0009E+00 1.0010E+00 8.9846E+01 9.0113E+01 1.0000E+00 + 1.0009E+00 1.0003E+00 1.0000E+00 1.0005E+00 1.0005E+00 8.9923E+01 9.0055E+01 1.0000E+00 + 1.0003E+00 1.0001E+00 1.0000E+00 1.0002E+00 1.0002E+00 8.9971E+01 9.0020E+01 1.0000E+00 + 1.0001E+00 1.0001E+00 1.0000E+00 1.0001E+00 1.0000E+00 8.9991E+01 9.0006E+01 1.0000E+00 + 1.0002E+00 1.0001E+00 1.0000E+00 1.0002E+00 1.0001E+00 8.9980E+01 9.0013E+01 1.0000E+00 + 1.0007E+00 1.0003E+00 1.0000E+00 1.0006E+00 1.0004E+00 8.9938E+01 9.0046E+01 1.0000E+00 + 1.0019E+00 1.0007E+00 1.0000E+00 1.0013E+00 1.0011E+00 8.9838E+01 9.0125E+01 1.0000E+00 + 1.0035E+00 1.0011E+00 1.0000E+00 1.0017E+00 1.0022E+00 8.9694E+01 9.0253E+01 1.0000E+00 + 1.0039E+00 1.0005E+00 1.0000E+00 1.0013E+00 1.0031E+00 8.9618E+01 9.0354E+01 1.0000E+00 + 1.0021E+00 1.0015E+00 1.0000E+00 1.0031E+00 1.0015E+00 8.9631E+01 9.0348E+01 1.0000E+00 + 9.9951E-01 1.0024E+00 1.0000E+00 1.0054E+00 9.9818E-01 8.9703E+01 9.0262E+01 1.0000E+00 + 9.9834E-01 1.0023E+00 1.0000E+00 1.0053E+00 9.9752E-01 8.9881E+01 9.0106E+01 1.0000E+00 + 9.9834E-01 1.0023E+00 1.0000E+00 1.0053E+00 9.9752E-01 8.9881E+01 9.0106E+01 1.0000E+00 + 9.9951E-01 1.0024E+00 1.0000E+00 1.0054E+00 9.9818E-01 8.9703E+01 9.0262E+01 1.0000E+00 + 1.0021E+00 1.0015E+00 1.0000E+00 1.0031E+00 1.0015E+00 8.9631E+01 9.0348E+01 1.0000E+00 + 1.0039E+00 1.0005E+00 1.0000E+00 1.0013E+00 1.0031E+00 8.9618E+01 9.0354E+01 1.0000E+00 + 1.0035E+00 1.0011E+00 1.0000E+00 1.0017E+00 1.0022E+00 8.9694E+01 9.0253E+01 1.0000E+00 + 1.0019E+00 1.0007E+00 1.0000E+00 1.0013E+00 1.0011E+00 8.9838E+01 9.0125E+01 1.0000E+00 + 1.0007E+00 1.0003E+00 1.0000E+00 1.0006E+00 1.0004E+00 8.9938E+01 9.0046E+01 1.0000E+00 + 1.0002E+00 1.0001E+00 1.0000E+00 1.0002E+00 1.0001E+00 8.9980E+01 9.0013E+01 1.0000E+00 + 1.0005E+00 1.0003E+00 1.0000E+00 1.0006E+00 1.0002E+00 8.9960E+01 9.0029E+01 1.0000E+00 + 1.0015E+00 1.0007E+00 1.0000E+00 1.0013E+00 1.0009E+00 8.9879E+01 9.0093E+01 1.0000E+00 + 1.0040E+00 1.0017E+00 1.0000E+00 1.0030E+00 1.0024E+00 8.9682E+01 9.0251E+01 1.0000E+00 + 1.0077E+00 1.0032E+00 1.0001E+00 1.0051E+00 1.0046E+00 8.9353E+01 9.0542E+01 1.0000E+00 + 1.0079E+00 1.0026E+00 1.0001E+00 1.0043E+00 1.0056E+00 8.9224E+01 9.0798E+01 1.0000E+00 + 9.9796E-01 1.0044E+00 1.0001E+00 1.0080E+00 9.9326E-01 8.9236E+01 9.0543E+01 1.0000E+00 + 9.8792E-01 1.0039E+00 1.0001E+00 1.0097E+00 9.8138E-01 8.9494E+01 9.0252E+01 1.0000E+00 + 9.8955E-01 1.0023E+00 1.0000E+00 1.0045E+00 9.8888E-01 8.9948E+01 9.0026E+01 1.0000E+00 + 9.8955E-01 1.0023E+00 1.0000E+00 1.0045E+00 9.8888E-01 8.9948E+01 9.0026E+01 1.0000E+00 + 9.8792E-01 1.0039E+00 1.0001E+00 1.0097E+00 9.8138E-01 8.9494E+01 9.0252E+01 1.0000E+00 + 9.9796E-01 1.0044E+00 1.0001E+00 1.0080E+00 9.9326E-01 8.9236E+01 9.0543E+01 1.0000E+00 + 1.0079E+00 1.0026E+00 1.0001E+00 1.0043E+00 1.0056E+00 8.9224E+01 9.0798E+01 1.0000E+00 + 1.0077E+00 1.0032E+00 1.0001E+00 1.0051E+00 1.0046E+00 8.9353E+01 9.0542E+01 1.0000E+00 + 1.0040E+00 1.0017E+00 1.0000E+00 1.0030E+00 1.0024E+00 8.9682E+01 9.0251E+01 1.0000E+00 + 1.0015E+00 1.0007E+00 1.0000E+00 1.0013E+00 1.0009E+00 8.9879E+01 9.0093E+01 1.0000E+00 + 1.0005E+00 1.0003E+00 1.0000E+00 1.0006E+00 1.0002E+00 8.9960E+01 9.0029E+01 1.0000E+00 + 1.0010E+00 1.0006E+00 1.0000E+00 1.0011E+00 1.0006E+00 8.9928E+01 9.0055E+01 1.0000E+00 + 1.0028E+00 1.0015E+00 1.0000E+00 1.0026E+00 1.0018E+00 8.9785E+01 9.0173E+01 1.0000E+00 + 1.0073E+00 1.0034E+00 1.0001E+00 1.0060E+00 1.0047E+00 8.9453E+01 9.0447E+01 1.0000E+00 + 1.0153E+00 1.0067E+00 1.0002E+00 1.0115E+00 1.0098E+00 8.8835E+01 9.0948E+01 1.0000E+00 + 1.0265E+00 1.0130E+00 1.0009E+00 1.0194E+00 1.0132E+00 8.7688E+01 9.1928E+01 1.0000E+00 + 9.9998E-01 1.0142E+00 1.0006E+00 1.0219E+00 9.8735E-01 8.8404E+01 9.1797E+01 1.0000E+00 + 9.3613E-01 1.0261E+00 1.0029E+00 1.0732E+00 8.9211E-01 8.8073E+01 9.3526E+01 1.0000E+00 + 9.3613E-01 1.0261E+00 1.0029E+00 1.0732E+00 8.9211E-01 8.8073E+01 9.3526E+01 1.0000E+00 + 9.9998E-01 1.0142E+00 1.0006E+00 1.0219E+00 9.8735E-01 8.8404E+01 9.1797E+01 1.0000E+00 + 1.0265E+00 1.0130E+00 1.0009E+00 1.0194E+00 1.0132E+00 8.7688E+01 9.1928E+01 1.0000E+00 + 1.0153E+00 1.0067E+00 1.0002E+00 1.0115E+00 1.0098E+00 8.8835E+01 9.0948E+01 1.0000E+00 + 1.0073E+00 1.0034E+00 1.0001E+00 1.0060E+00 1.0047E+00 8.9453E+01 9.0447E+01 1.0000E+00 + 1.0028E+00 1.0015E+00 1.0000E+00 1.0026E+00 1.0018E+00 8.9785E+01 9.0173E+01 1.0000E+00 + 1.0010E+00 1.0006E+00 1.0000E+00 1.0011E+00 1.0006E+00 8.9928E+01 9.0055E+01 1.0000E+00 + 1.0017E+00 1.0012E+00 1.0000E+00 1.0020E+00 1.0011E+00 8.9891E+01 9.0091E+01 1.0000E+00 + 1.0048E+00 1.0029E+00 1.0000E+00 1.0049E+00 1.0032E+00 8.9668E+01 9.0286E+01 1.0000E+00 + 1.0120E+00 1.0067E+00 1.0002E+00 1.0115E+00 1.0082E+00 8.9141E+01 9.0744E+01 1.0000E+00 + 1.0234E+00 1.0109E+00 1.0005E+00 1.0192E+00 1.0174E+00 8.8369E+01 9.1413E+01 1.0000E+00 + 1.0468E+00 1.0152E+00 1.0014E+00 1.0307E+00 1.0332E+00 8.7052E+01 9.2295E+01 1.0000E+00 + 1.1556E+00 1.0994E+00 1.0290E+00 1.1766E+00 1.0212E+00 7.6549E+01 9.8937E+01 1.0000E+00 + 7.5553E-01 1.3366E+00 1.2195E+00 1.5916E+00 4.7897E-01 6.8536E+01 1.2411E+02 1.0000E+00 + 7.5553E-01 1.3366E+00 1.2195E+00 1.5916E+00 4.7897E-01 6.8536E+01 1.2411E+02 1.0000E+00 + 1.1556E+00 1.0994E+00 1.0290E+00 1.1766E+00 1.0212E+00 7.6549E+01 9.8937E+01 1.0000E+00 + 1.0468E+00 1.0152E+00 1.0014E+00 1.0307E+00 1.0332E+00 8.7052E+01 9.2295E+01 1.0000E+00 + 1.0234E+00 1.0109E+00 1.0005E+00 1.0192E+00 1.0174E+00 8.8369E+01 9.1413E+01 1.0000E+00 + 1.0120E+00 1.0067E+00 1.0002E+00 1.0115E+00 1.0082E+00 8.9141E+01 9.0744E+01 1.0000E+00 + 1.0048E+00 1.0029E+00 1.0000E+00 1.0049E+00 1.0032E+00 8.9668E+01 9.0286E+01 1.0000E+00 + 1.0017E+00 1.0012E+00 1.0000E+00 1.0020E+00 1.0011E+00 8.9891E+01 9.0091E+01 1.0000E+00 + 1.0027E+00 1.0018E+00 1.0000E+00 1.0032E+00 1.0020E+00 8.9870E+01 9.0121E+01 1.0000E+00 + 1.0071E+00 1.0047E+00 1.0001E+00 1.0081E+00 1.0054E+00 8.9588E+01 9.0385E+01 1.0000E+00 + 1.0181E+00 1.0118E+00 1.0004E+00 1.0201E+00 1.0132E+00 8.8854E+01 9.1058E+01 1.0000E+00 + 1.0366E+00 1.0240E+00 1.0017E+00 1.0397E+00 1.0246E+00 8.7281E+01 9.2479E+01 1.0000E+00 + 1.0308E+00 1.0232E+00 1.0020E+00 1.0437E+00 1.0172E+00 8.6858E+01 9.2479E+01 1.0000E+00 + 1.0585E+00 1.1472E+00 1.0235E+00 1.2832E+00 9.0507E-01 7.9533E+01 9.8013E+01 1.0000E+00 + 1.0585E+00 1.1472E+00 1.0235E+00 1.2832E+00 9.0507E-01 7.9533E+01 9.8013E+01 1.0000E+00 + 1.0308E+00 1.0232E+00 1.0020E+00 1.0437E+00 1.0172E+00 8.6858E+01 9.2479E+01 1.0000E+00 + 1.0366E+00 1.0240E+00 1.0017E+00 1.0397E+00 1.0246E+00 8.7281E+01 9.2479E+01 1.0000E+00 + 1.0181E+00 1.0118E+00 1.0004E+00 1.0201E+00 1.0132E+00 8.8854E+01 9.1058E+01 1.0000E+00 + 1.0071E+00 1.0047E+00 1.0001E+00 1.0081E+00 1.0054E+00 8.9588E+01 9.0385E+01 1.0000E+00 + 1.0027E+00 1.0018E+00 1.0000E+00 1.0032E+00 1.0020E+00 8.9870E+01 9.0121E+01 1.0000E+00 + 1.0035E+00 1.0024E+00 1.0000E+00 1.0043E+00 1.0030E+00 8.9892E+01 9.0120E+01 1.0000E+00 + 1.0092E+00 1.0063E+00 1.0001E+00 1.0115E+00 1.0076E+00 8.9643E+01 9.0380E+01 1.0000E+00 + 1.0235E+00 1.0164E+00 1.0006E+00 1.0292E+00 1.0196E+00 8.8956E+01 9.1072E+01 1.0000E+00 + 1.0516E+00 1.0362E+00 1.0029E+00 1.0630E+00 1.0407E+00 8.7225E+01 9.2661E+01 1.0000E+00 + 1.1316E+00 1.1303E+00 1.0354E+00 1.1912E+00 1.0239E+00 7.6328E+01 1.0143E+02 1.0000E+00 + 6.6097E-01 1.3511E+00 1.2114E+00 1.6973E+00 3.8254E-01 7.3292E+01 1.2346E+02 1.0000E+00 + 6.6097E-01 1.3511E+00 1.2114E+00 1.6973E+00 3.8254E-01 7.3292E+01 1.2346E+02 1.0000E+00 + 1.1316E+00 1.1303E+00 1.0354E+00 1.1912E+00 1.0239E+00 7.6328E+01 1.0143E+02 1.0000E+00 + 1.0516E+00 1.0362E+00 1.0029E+00 1.0630E+00 1.0407E+00 8.7225E+01 9.2661E+01 1.0000E+00 + 1.0235E+00 1.0164E+00 1.0006E+00 1.0292E+00 1.0196E+00 8.8956E+01 9.1072E+01 1.0000E+00 + 1.0092E+00 1.0063E+00 1.0001E+00 1.0115E+00 1.0076E+00 8.9643E+01 9.0380E+01 1.0000E+00 + 1.0035E+00 1.0024E+00 1.0000E+00 1.0043E+00 1.0030E+00 8.9892E+01 9.0120E+01 1.0000E+00 + 1.0040E+00 1.0025E+00 1.0000E+00 1.0050E+00 1.0036E+00 8.9947E+01 9.0072E+01 1.0000E+00 + 1.0101E+00 1.0068E+00 1.0001E+00 1.0138E+00 1.0090E+00 8.9831E+01 9.0220E+01 1.0000E+00 + 1.0254E+00 1.0176E+00 1.0006E+00 1.0359E+00 1.0225E+00 8.9515E+01 9.0610E+01 1.0000E+00 + 1.0519E+00 1.0377E+00 1.0031E+00 1.0793E+00 1.0461E+00 8.8784E+01 9.1322E+01 1.0000E+00 + 1.0752E+00 1.1563E+00 1.0312E+00 1.2490E+00 9.7613E-01 8.3607E+01 9.8302E+01 1.0000E+00 + 1.0752E+00 1.1563E+00 1.0312E+00 1.2490E+00 9.7613E-01 8.3607E+01 9.8302E+01 1.0000E+00 + 1.0519E+00 1.0377E+00 1.0031E+00 1.0793E+00 1.0461E+00 8.8784E+01 9.1322E+01 1.0000E+00 + 1.0254E+00 1.0176E+00 1.0006E+00 1.0359E+00 1.0225E+00 8.9515E+01 9.0610E+01 1.0000E+00 + 1.0101E+00 1.0068E+00 1.0001E+00 1.0138E+00 1.0090E+00 8.9831E+01 9.0220E+01 1.0000E+00 + 1.0040E+00 1.0025E+00 1.0000E+00 1.0050E+00 1.0036E+00 8.9947E+01 9.0072E+01 1.0000E+00 + 1.0039E+00 1.0025E+00 1.0000E+00 1.0051E+00 1.0034E+00 8.9979E+01 9.0041E+01 1.0000E+00 + 1.0097E+00 1.0070E+00 1.0001E+00 1.0141E+00 1.0081E+00 8.9953E+01 9.0129E+01 1.0000E+00 + 1.0237E+00 1.0184E+00 1.0007E+00 1.0370E+00 1.0194E+00 8.9865E+01 9.0374E+01 1.0000E+00 + 1.0463E+00 1.0404E+00 1.0032E+00 1.0829E+00 1.0360E+00 8.9554E+01 9.0946E+01 1.0000E+00 + 1.0577E+00 1.1404E+00 1.0277E+00 1.2313E+00 9.6903E-01 8.3827E+01 9.8310E+01 1.0000E+00 + 1.0577E+00 1.1404E+00 1.0277E+00 1.2313E+00 9.6903E-01 8.3827E+01 9.8310E+01 1.0000E+00 + 1.0463E+00 1.0404E+00 1.0032E+00 1.0829E+00 1.0360E+00 8.9554E+01 9.0946E+01 1.0000E+00 + 1.0237E+00 1.0184E+00 1.0007E+00 1.0370E+00 1.0194E+00 8.9865E+01 9.0374E+01 1.0000E+00 + 1.0097E+00 1.0070E+00 1.0001E+00 1.0141E+00 1.0081E+00 8.9953E+01 9.0129E+01 1.0000E+00 + 1.0039E+00 1.0025E+00 1.0000E+00 1.0051E+00 1.0034E+00 8.9979E+01 9.0041E+01 1.0000E+00 + 1.0033E+00 1.0023E+00 1.0000E+00 1.0043E+00 1.0026E+00 8.9925E+01 9.0095E+01 1.0000E+00 + 1.0080E+00 1.0064E+00 1.0001E+00 1.0117E+00 1.0060E+00 8.9744E+01 9.0309E+01 1.0000E+00 + 1.0191E+00 1.0165E+00 1.0005E+00 1.0297E+00 1.0136E+00 8.9238E+01 9.0894E+01 1.0000E+00 + 1.0380E+00 1.0361E+00 1.0025E+00 1.0616E+00 1.0248E+00 8.7837E+01 9.2344E+01 1.0000E+00 + 1.0943E+00 1.1231E+00 1.0293E+00 1.1752E+00 1.0010E+00 7.7997E+01 1.0060E+02 1.0000E+00 + 6.6823E-01 1.3227E+00 1.4180E+00 1.5648E+00 3.2335E-01 7.3140E+01 1.3511E+02 1.0000E+00 + 6.6823E-01 1.3227E+00 1.4180E+00 1.5648E+00 3.2335E-01 7.3140E+01 1.3511E+02 1.0000E+00 + 1.0943E+00 1.1231E+00 1.0293E+00 1.1752E+00 1.0010E+00 7.7997E+01 1.0060E+02 1.0000E+00 + 1.0380E+00 1.0361E+00 1.0025E+00 1.0616E+00 1.0248E+00 8.7837E+01 9.2344E+01 1.0000E+00 + 1.0191E+00 1.0165E+00 1.0005E+00 1.0297E+00 1.0136E+00 8.9238E+01 9.0894E+01 1.0000E+00 + 1.0080E+00 1.0064E+00 1.0001E+00 1.0117E+00 1.0060E+00 8.9744E+01 9.0309E+01 1.0000E+00 + 1.0033E+00 1.0023E+00 1.0000E+00 1.0043E+00 1.0026E+00 8.9925E+01 9.0095E+01 1.0000E+00 + 1.0023E+00 1.0018E+00 1.0000E+00 1.0029E+00 1.0017E+00 8.9898E+01 9.0102E+01 1.0000E+00 + 1.0057E+00 1.0045E+00 1.0000E+00 1.0074E+00 1.0040E+00 8.9675E+01 9.0330E+01 1.0000E+00 + 1.0126E+00 1.0110E+00 1.0003E+00 1.0176E+00 1.0081E+00 8.9094E+01 9.0927E+01 1.0000E+00 + 1.0201E+00 1.0221E+00 1.0013E+00 1.0331E+00 1.0086E+00 8.7738E+01 9.2337E+01 1.0000E+00 + 9.9312E-01 1.0118E+00 1.0020E+00 1.0312E+00 9.8003E-01 8.7023E+01 9.3222E+01 1.0000E+00 + 9.7950E-01 1.0205E+00 1.0086E+00 1.0306E+00 9.5336E-01 8.2517E+01 9.6001E+01 1.0000E+00 + 6.7093E-01 1.3257E+00 1.4243E+00 1.5704E+00 3.2406E-01 7.2716E+01 1.3535E+02 1.0000E+00 + 6.7093E-01 1.3257E+00 1.4243E+00 1.5704E+00 3.2406E-01 7.2716E+01 1.3535E+02 1.0000E+00 + 9.7950E-01 1.0205E+00 1.0086E+00 1.0306E+00 9.5336E-01 8.2517E+01 9.6001E+01 1.0000E+00 + 9.9312E-01 1.0118E+00 1.0020E+00 1.0312E+00 9.8003E-01 8.7023E+01 9.3222E+01 1.0000E+00 + 1.0201E+00 1.0221E+00 1.0013E+00 1.0331E+00 1.0086E+00 8.7738E+01 9.2337E+01 1.0000E+00 + 1.0126E+00 1.0110E+00 1.0003E+00 1.0176E+00 1.0081E+00 8.9094E+01 9.0927E+01 1.0000E+00 + 1.0057E+00 1.0045E+00 1.0000E+00 1.0074E+00 1.0040E+00 8.9675E+01 9.0330E+01 1.0000E+00 + 1.0023E+00 1.0018E+00 1.0000E+00 1.0029E+00 1.0017E+00 8.9898E+01 9.0102E+01 1.0000E+00 + 1.0014E+00 1.0010E+00 1.0000E+00 1.0017E+00 1.0008E+00 8.9914E+01 9.0075E+01 1.0000E+00 + 1.0033E+00 1.0024E+00 1.0000E+00 1.0039E+00 1.0020E+00 8.9742E+01 9.0237E+01 1.0000E+00 + 1.0068E+00 1.0051E+00 1.0001E+00 1.0080E+00 1.0040E+00 8.9350E+01 9.0616E+01 1.0000E+00 + 1.0084E+00 1.0064E+00 1.0003E+00 1.0093E+00 1.0052E+00 8.8808E+01 9.1194E+01 1.0000E+00 + 1.0052E+00 1.0021E+00 1.0006E+00 1.0032E+00 1.0025E+00 8.8015E+01 9.1832E+01 1.0000E+00 + 9.9427E-01 1.0110E+00 1.0019E+00 1.0297E+00 9.8098E-01 8.7052E+01 9.3206E+01 1.0000E+00 + 1.0994E+00 1.1204E+00 1.0282E+00 1.1699E+00 1.0056E+00 7.8158E+01 1.0046E+02 1.0000E+00 + 1.0744E+00 1.1309E+00 1.0230E+00 1.1960E+00 9.9212E-01 8.3315E+01 9.7808E+01 1.0000E+00 + 1.0744E+00 1.1309E+00 1.0230E+00 1.1960E+00 9.9212E-01 8.3315E+01 9.7808E+01 1.0000E+00 + 1.0994E+00 1.1204E+00 1.0282E+00 1.1699E+00 1.0056E+00 7.8158E+01 1.0046E+02 1.0000E+00 + 9.9427E-01 1.0110E+00 1.0019E+00 1.0297E+00 9.8098E-01 8.7052E+01 9.3206E+01 1.0000E+00 + 1.0052E+00 1.0021E+00 1.0006E+00 1.0032E+00 1.0025E+00 8.8015E+01 9.1832E+01 1.0000E+00 + 1.0084E+00 1.0064E+00 1.0003E+00 1.0093E+00 1.0052E+00 8.8808E+01 9.1194E+01 1.0000E+00 + 1.0068E+00 1.0051E+00 1.0001E+00 1.0080E+00 1.0040E+00 8.9350E+01 9.0616E+01 1.0000E+00 + 1.0033E+00 1.0024E+00 1.0000E+00 1.0039E+00 1.0020E+00 8.9742E+01 9.0237E+01 1.0000E+00 + 1.0014E+00 1.0010E+00 1.0000E+00 1.0017E+00 1.0008E+00 8.9914E+01 9.0075E+01 1.0000E+00 + 1.0007E+00 1.0005E+00 1.0000E+00 1.0008E+00 1.0003E+00 8.9947E+01 9.0041E+01 1.0000E+00 + 1.0017E+00 1.0010E+00 1.0000E+00 1.0016E+00 1.0009E+00 8.9850E+01 9.0126E+01 1.0000E+00 + 1.0034E+00 1.0017E+00 1.0000E+00 1.0028E+00 1.0019E+00 8.9643E+01 9.0302E+01 1.0000E+00 + 1.0056E+00 1.0013E+00 1.0001E+00 1.0025E+00 1.0032E+00 8.9295E+01 9.0568E+01 1.0000E+00 + 1.0086E+00 1.0062E+00 1.0003E+00 1.0090E+00 1.0054E+00 8.8805E+01 9.1189E+01 1.0000E+00 + 1.0211E+00 1.0214E+00 1.0013E+00 1.0313E+00 1.0100E+00 8.7728E+01 9.2313E+01 1.0000E+00 + 1.0405E+00 1.0333E+00 1.0022E+00 1.0553E+00 1.0294E+00 8.7767E+01 9.2259E+01 1.0000E+00 + 1.0490E+00 1.0342E+00 1.0023E+00 1.0687E+00 1.0435E+00 8.9427E+01 9.0867E+01 1.0000E+00 + 1.0490E+00 1.0342E+00 1.0023E+00 1.0687E+00 1.0435E+00 8.9427E+01 9.0867E+01 1.0000E+00 + 1.0405E+00 1.0333E+00 1.0022E+00 1.0553E+00 1.0294E+00 8.7767E+01 9.2259E+01 1.0000E+00 + 1.0211E+00 1.0214E+00 1.0013E+00 1.0313E+00 1.0100E+00 8.7728E+01 9.2313E+01 1.0000E+00 + 1.0086E+00 1.0062E+00 1.0003E+00 1.0090E+00 1.0054E+00 8.8805E+01 9.1189E+01 1.0000E+00 + 1.0056E+00 1.0013E+00 1.0001E+00 1.0025E+00 1.0032E+00 8.9295E+01 9.0568E+01 1.0000E+00 + 1.0034E+00 1.0017E+00 1.0000E+00 1.0028E+00 1.0019E+00 8.9643E+01 9.0302E+01 1.0000E+00 + 1.0017E+00 1.0010E+00 1.0000E+00 1.0016E+00 1.0009E+00 8.9850E+01 9.0126E+01 1.0000E+00 + 1.0007E+00 1.0005E+00 1.0000E+00 1.0008E+00 1.0003E+00 8.9947E+01 9.0041E+01 1.0000E+00 + 1.0003E+00 1.0002E+00 1.0000E+00 1.0003E+00 1.0001E+00 8.9975E+01 9.0018E+01 1.0000E+00 + 1.0007E+00 1.0003E+00 1.0000E+00 1.0005E+00 1.0003E+00 8.9929E+01 9.0052E+01 1.0000E+00 + 1.0017E+00 1.0005E+00 1.0000E+00 1.0009E+00 1.0009E+00 8.9827E+01 9.0125E+01 1.0000E+00 + 1.0035E+00 1.0018E+00 1.0000E+00 1.0029E+00 1.0019E+00 8.9639E+01 9.0302E+01 1.0000E+00 + 1.0072E+00 1.0052E+00 1.0001E+00 1.0082E+00 1.0042E+00 8.9340E+01 9.0615E+01 1.0000E+00 + 1.0134E+00 1.0108E+00 1.0003E+00 1.0173E+00 1.0090E+00 8.9068E+01 9.0922E+01 1.0000E+00 + 1.0204E+00 1.0156E+00 1.0005E+00 1.0275E+00 1.0157E+00 8.9170E+01 9.0890E+01 1.0000E+00 + 1.0246E+00 1.0168E+00 1.0005E+00 1.0333E+00 1.0217E+00 8.9726E+01 9.0417E+01 1.0000E+00 + 1.0246E+00 1.0168E+00 1.0005E+00 1.0333E+00 1.0217E+00 8.9726E+01 9.0417E+01 1.0000E+00 + 1.0204E+00 1.0156E+00 1.0005E+00 1.0275E+00 1.0157E+00 8.9170E+01 9.0890E+01 1.0000E+00 + 1.0134E+00 1.0108E+00 1.0003E+00 1.0173E+00 1.0090E+00 8.9068E+01 9.0922E+01 1.0000E+00 + 1.0072E+00 1.0052E+00 1.0001E+00 1.0082E+00 1.0042E+00 8.9340E+01 9.0615E+01 1.0000E+00 + 1.0035E+00 1.0018E+00 1.0000E+00 1.0029E+00 1.0019E+00 8.9639E+01 9.0302E+01 1.0000E+00 + 1.0017E+00 1.0005E+00 1.0000E+00 1.0009E+00 1.0009E+00 8.9827E+01 9.0125E+01 1.0000E+00 + 1.0007E+00 1.0003E+00 1.0000E+00 1.0005E+00 1.0003E+00 8.9929E+01 9.0052E+01 1.0000E+00 + 1.0003E+00 1.0002E+00 1.0000E+00 1.0003E+00 1.0001E+00 8.9975E+01 9.0018E+01 1.0000E+00 + 1.0001E+00 1.0001E+00 1.0000E+00 1.0001E+00 1.0000E+00 8.9990E+01 9.0006E+01 1.0000E+00 + 1.0003E+00 1.0002E+00 1.0000E+00 1.0003E+00 1.0001E+00 8.9970E+01 9.0018E+01 1.0000E+00 + 1.0008E+00 1.0005E+00 1.0000E+00 1.0009E+00 1.0003E+00 8.9924E+01 9.0053E+01 1.0000E+00 + 1.0020E+00 1.0014E+00 1.0000E+00 1.0024E+00 1.0009E+00 8.9838E+01 9.0127E+01 1.0000E+00 + 1.0042E+00 1.0032E+00 1.0000E+00 1.0053E+00 1.0024E+00 8.9723E+01 9.0241E+01 1.0000E+00 + 1.0075E+00 1.0056E+00 1.0001E+00 1.0094E+00 1.0053E+00 8.9647E+01 9.0341E+01 1.0000E+00 + 1.0108E+00 1.0076E+00 1.0001E+00 1.0137E+00 1.0087E+00 8.9707E+01 9.0331E+01 1.0000E+00 + 1.0130E+00 1.0080E+00 1.0001E+00 1.0160E+00 1.0115E+00 8.9915E+01 9.0168E+01 1.0000E+00 + 1.0130E+00 1.0080E+00 1.0001E+00 1.0160E+00 1.0115E+00 8.9915E+01 9.0168E+01 1.0000E+00 + 1.0108E+00 1.0076E+00 1.0001E+00 1.0137E+00 1.0087E+00 8.9707E+01 9.0331E+01 1.0000E+00 + 1.0075E+00 1.0056E+00 1.0001E+00 1.0094E+00 1.0053E+00 8.9647E+01 9.0341E+01 1.0000E+00 + 1.0042E+00 1.0032E+00 1.0000E+00 1.0053E+00 1.0024E+00 8.9723E+01 9.0241E+01 1.0000E+00 + 1.0020E+00 1.0014E+00 1.0000E+00 1.0024E+00 1.0009E+00 8.9838E+01 9.0127E+01 1.0000E+00 + 1.0008E+00 1.0005E+00 1.0000E+00 1.0009E+00 1.0003E+00 8.9924E+01 9.0053E+01 1.0000E+00 + 1.0003E+00 1.0002E+00 1.0000E+00 1.0003E+00 1.0001E+00 8.9970E+01 9.0018E+01 1.0000E+00 + 1.0001E+00 1.0001E+00 1.0000E+00 1.0001E+00 1.0000E+00 8.9990E+01 9.0006E+01 1.0000E+00 + 9.9344E-01 1.0303E+00 1.0018E+00 1.0621E+00 9.6335E-01 8.8258E+01 9.1728E+01 1.0000E+00 + 9.9344E-01 1.0303E+00 1.0018E+00 1.0621E+00 9.6335E-01 8.8258E+01 9.1728E+01 1.0000E+00 + 7.6404E-01 1.4936E+00 1.2992E+00 1.8874E+00 3.6261E-01 6.5177E+01 1.2951E+02 1.0000E+00 + 5.9465E-01 1.4327E+00 1.1525E+00 1.7044E+00 4.0223E-01 6.4192E+01 1.0638E+02 1.0000E+00 + 8.6551E-01 1.1646E+00 1.0567E+00 1.3339E+00 6.6662E-01 7.1190E+01 9.7610E+01 1.0000E+00 + 5.0114E-01 1.2054E+00 1.1575E+00 1.3566E+00 3.3567E-01 7.7029E+01 1.2022E+02 1.0000E+00 + 5.2705E-01 1.4977E+00 1.2088E+00 1.6949E+00 3.8250E-01 6.1886E+01 1.1632E+02 1.0000E+00 + 5.8633E-01 1.4337E+00 1.6529E+00 2.9340E+00 2.6807E-01 6.4887E+01 1.1879E+02 1.0000E+00 + 6.4463E-01 1.2060E+00 1.2013E+00 1.7142E+00 4.7255E-01 6.9670E+01 1.0969E+02 1.0000E+00 + 3.6363E-01 1.6089E+00 1.2913E+00 2.0932E+00 2.0620E-01 5.5366E+01 1.1055E+02 1.0000E+00 + 3.5720E-01 1.2556E+00 1.1503E+00 1.4484E+00 2.8661E-01 6.2329E+01 1.1535E+02 1.0000E+00 + 3.5734E-01 1.2550E+00 1.1494E+00 1.4497E+00 2.8644E-01 6.2412E+01 1.1522E+02 1.0000E+00 + 3.6464E-01 1.6058E+00 1.2900E+00 2.0922E+00 2.0625E-01 5.5209E+01 1.1037E+02 1.0000E+00 + 6.6182E-01 1.2250E+00 1.1978E+00 1.7651E+00 4.7811E-01 7.0603E+01 1.0925E+02 1.0000E+00 + 6.6182E-01 1.2250E+00 1.1978E+00 1.7651E+00 4.7811E-01 7.0603E+01 1.0925E+02 1.0000E+00 + 3.6464E-01 1.6058E+00 1.2900E+00 2.0922E+00 2.0625E-01 5.5209E+01 1.1037E+02 1.0000E+00 + 3.5734E-01 1.2550E+00 1.1494E+00 1.4497E+00 2.8644E-01 6.2412E+01 1.1522E+02 1.0000E+00 + 3.5720E-01 1.2556E+00 1.1503E+00 1.4484E+00 2.8661E-01 6.2329E+01 1.1535E+02 1.0000E+00 + 3.6363E-01 1.6089E+00 1.2913E+00 2.0932E+00 2.0620E-01 5.5366E+01 1.1055E+02 1.0000E+00 + 6.4463E-01 1.2060E+00 1.2013E+00 1.7142E+00 4.7255E-01 6.9670E+01 1.0969E+02 1.0000E+00 + 5.8633E-01 1.4337E+00 1.6529E+00 2.9340E+00 2.6807E-01 6.4887E+01 1.1879E+02 1.0000E+00 + 5.2705E-01 1.4977E+00 1.2088E+00 1.6949E+00 3.8250E-01 6.1886E+01 1.1632E+02 1.0000E+00 + 5.0114E-01 1.2054E+00 1.1575E+00 1.3566E+00 3.3567E-01 7.7029E+01 1.2022E+02 1.0000E+00 + 8.6551E-01 1.1646E+00 1.0567E+00 1.3339E+00 6.6662E-01 7.1190E+01 9.7610E+01 1.0000E+00 + 5.9465E-01 1.4327E+00 1.1525E+00 1.7044E+00 4.0223E-01 6.4192E+01 1.0638E+02 1.0000E+00 + 7.6404E-01 1.4936E+00 1.2992E+00 1.8874E+00 3.6261E-01 6.5177E+01 1.2951E+02 1.0000E+00 diff --git a/previews/PR1693/tutorials/out/mesh.h5 b/previews/PR1693/tutorials/out/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..ae8c51df1eb7204b89b5bda915697dfdfc2488bb GIT binary patch literal 1136 zcmeD5aB<`1lHy_j0S*oZ76t(@6Gr@pf&vzZ2#gPtPk=HQp>zk7Ucm%mFfy<+faD~g z;sQ|f6__Cc0Z@%0L9VVK5t#Wf8meuS8sQ<};p!Lw3W5k|IB-De6VP-9<$}{1hz(W@ z6QqC^gr-;Ybj`zH0XCJHfs26y2pMxzi!gn>Co2q+255}|p;B}JvlC8b5F zDZW5eMlL`}9tH!bel{Q*s6Q_yGq;#Q0O&7>*Bs#bQGAHd#|qI`oLQBMRofr1`7nZq z!2@a^ACi01GILV%5_2JLRs<@5xjDbIL_ae*H9om0H8D3H=>Eja^o)}D;>?uPVm**o f5$@oDxT7GoC^J7LGdZ)Ql0gJ+63}BX7eHtLJ=as7 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/restart_000050.h5 b/previews/PR1693/tutorials/out/restart_000050.h5 new file mode 100644 index 0000000000000000000000000000000000000000..3a67612e10f5779461020c25f3e746d603178706 GIT binary patch literal 11976 zcmeHtc_3C@`|d`@JQFI7l4eqgCbAZxQp%W+40%w7WXu~vL`h|gGGxdsrNIyxk`yH* zDaw=#r3^`fy??jj``&ZTd(I!{_nz;c^FDuA&)&~oYu)RfjbQ%zI`xN|{8UN*zB6?_^}Ffh7mmp`aI#I~{QZT45G5vl6P>)zoE(24*Y6wF zlh5gDtEx`inHqnpo$U5c^Z&UAwyP>>PPky-q#yVu+p0xCkCXkl-UY>@5!2IT1{->$hq6U#9#I777x0vY!Av2>sYcUCf*h z9kF*JgqZ{}4}P3VrL9No930tBPKV5G*{UwKY)93pM`cuC&Z+tNe$Vf4#Ma${ZS|KH zOgRe%|93y$NxMy4%^d&Q@M*s+{r%_P{iaX#W81Rr*!IqU-FGs*;n|J92H+wl*K5ai zvNmyccVPcouMqq=wO&1YCuc{OgU&9FYzqx|3Rd}Nd;i?u@{sNC{=9$cKQXejwcM}i z{xmN)Au{1-=RW@tG%Ie!hnH#r^`$D{*@s0rWw>mxLId*Wf5F=7i6%YXgG^=qUFe4By)CLlTy z+21x1groJ5e~qyHU*GS@!Qv9K?Ujzmrt= zf9v0gLNm28@UMyM+TW}Ad;L4*8MjsYJoYG4sPu;3(rk4Kg={;y@YHS!9aQDo<^k6) zI9J}vRi%(vbe|VNDH1B8TB^wN|bK{S^}whXnQ<9P%@% zCh*fRJs-Jx0?FH8YQqu&zm(p?`$n0-bDt?F z-&;rE(|%!9pE@bTscn>S9sDH{KXa51{L>gynrQ1yq5CuT?M=B$A<1N?jhiurem2aL z4E3bYlUu#FK0Kt5bofiT_?r|O2sBuB8h+oEYP2*G;%ld4l$ZMqaN)_hF^-Qy>+df( zcw2!&pYK@?)yh$*QhuJxB_@m`!q1}sxRLMCTAB>;9FEP`+ZRou%3Xy&>Niq|RW_r0 z-w=f!-J)+v+)Ci)p0;x*ObNV0CDJsNheEaPVu{)>Nz_VuM#ckv93?fK+5sO1i(OqG z=aDFXcy~pp3x#AjOpOX=6L`6%HGT&DCB83%&Pgd{lxqzJ~RHq-QNF$M2-p5@v zfV&y9+zx1XkZ4Ebp4uQT3h^xZapik2g_^ZKDl`}p_?)kJ{k;eR3!LGLy_QMfSbZMa zc3AiB#^|FWnI!UAK42Yqm_*{c=QkRiCDE2y=R|nvqs=iej_de# zkp~2BYxXVq3GrXv*+2dT{J7Lx(B|W35^bGRvj6FE5*_1?XTE{;+3E!|>jNodQkU0e z3wW$(jBkHd0sTZx?cys5Ow&;MBm(#t-0s2u7~&F7T3pgsqmY4lT5NSVi8S={N_+fC zB>Hoi;oD*g9kR8P7Q6&y)NI)nF~H*y#hmA@Aq1W^e*f783j*(KS=vAI5rss(4R^U{ zP{^S(Y`W7q@V9(fQXb^Jm-6dHs<7FSVm#7nDI&1&4s(tD*|5H%MUQ6#&YpdJ`DE=h z0*ekN=nZ>NsOf5C`Yi#dFSiHv?mCd@$@A0i=uj7iJDtvNf#>@-b>&jvhv}(a&6Yj{ zUMQ2#*Yu4-mt|7hjE__3>-hXWZ$u$wu?=(IHj`+YYHKe8a1&N)(w_@>=)Kh(#0&8y zZY?mgg*^K*l$p_HN#Gglhx3aI0H>dLQbfSNjRToQ?$D-ou+_);DU^?WHhZR%sQ=cb z;!GH?+bGv~2Gl1F*MO(t>tS9I-sb&ZDfA&Yt?U)p`Ou?loDK7g(C_eD!nol{)b(0- z3eDR!DsyC%L_bfq+|~m898o`&?0u9((@W;|XncaYb~(>&IGaLc*AL(EmjHje6|(3m z1Wvema(4^ZSzX=SYM=^r!J#Zx`5lG4=c1t;28D8zIK)V(i_24fXf^whXn+3b+N~lK zYCqg@C_J4)RPDILz#xSd7TlT^1?w(WUzD{0aK*KjSB3}TdsA1sY}zu&e^XznFN-K7 zcvJaKvNQNyf9(R!01|BwbE94jlSt&$T|@6p5T7QGhW91}{;AWttzJC zzO*p-@Ld95d^bI28X~Ymzx6)G3c#0ebV;8RiKI_OD=&5=k(5u*dVAo9^-q%RTOlq@ z(_Y=QgZiR4e+zb6L15SRz<$2#1olwWkY*PU*g}-QR&^0_{$5nEMz4EpWM3=eozPGAkQ;Rh~|S9aaR z>Ha5e(SG1V=hCp_6>TIsck$_l z3t%VR&>}jHggkvOE5HZ-vwdS-@e=Aesnuk82kNn&FRI~(dU{MTT{aWy;S@jrziy}Y zO;;v%;_$)0{{H(9&(uDY$uS*-!XYydBTgnVJ(F?>b}Ij=eN~j$Z>#>cebwaV`|sUX zaZdW{e|M7c*Zy3GVPpO4^PltQnq~hze{w_jKkrl7zlS6KUVr|zzt#p$%s%n?>)&NB zOv;Ae5B>A^9}oQFfqy*kj|cu24>T1y6nnvbMZGjb`1KwNCC3=~Nf=PbKPP=nl_rJe z8~40)-$5Y`_t0ETI42OzRbD&>&p&t4>`Q`uikscil3{2C!i?TGT_RD}bsg0h&}l;K z#`y`L1CA%J9-RgHDQ963cgqbDo!;Pl-nW=U5jNbp%xciYUG03j z7I}mI?^@iEt_*r>eGnd8>rLSJ>$iE5P7wHxOepgl+#g+7^;8%3d%Ny$@mc};|MvaQ zn(vDVtYbM>kq!F4`EpKPGF)?46xln%{@gxhtz7RT0;gL@ZZZP>uRHdk@*?Q3X>lVl zd+R{=$DAv-2mLQHI>PrI^#3~9F8eyr|Hkb_L4u&~P6_0&rOtw0Se3Yt5A3|^@rrc< z^nb27hq@!^|E-_e7Bs>-+K-pDIfMSU$r8-mwS>SMOvE12K}T~oupcIa{=eqpL%st2 zFT3QBvo!cAR#8xR9_W8gXQ2;seJJ$fyQ68GAwhC%t~>nY)=nTN36k_$Wi6 zbL{TWe9-^r{Uu&X!@itDdSv<^he&jiVePaEaJ8ogOCR1qA^p|H5j|hv{7H1^swwEM zjDRoM^FVj)O5m7(i;{bS3&}xd1{`7nJ~q|*mN6kNd4*MtA!?vEx=&TT0R8VJvdSwN^uL1r%JR`-3T-=@#j^8gOzxyH|T#orI)&r5HIe*193mO;M~jf%Ia!Q&^x*NZa9Jd zXLl{gCJRIiUYXT*x(HVCRQ@=48Y@!TkSP4o(Om2Gtz*TEU%AV|K0(YLw?9B!Jud&JI&aovFQoD{aGeQ6B9hVCk1U!uJVR_mR z=ymB^2H}u*L7bbdd!U|qNUF4CgZ}SWk+FPTIf1owcjnIl{ZGtRG0%f~lQL-eg$MM1 zors(|8+5rvs%}Iutk>bmx2L*L*ArToItM~rD)nXGhp>S^HqG0z1@u2%;k$zh=>II* zI*B8N1Rh^~b$I?#0(-BVQ6ek|=Y_KcqJ2UC`{-|$Ylr&3cK@Qj2TBQ(uZ~um8uCdE`XiN+w3YsIG}E>FE06dfWWLdKZ-q| zp3f$XNtr{CpVJiHN)}RRt}3_fad`@vpGgigQl-!)gYLy!bttqwuv%+G3vhJw>#GQL z3NdnC$z4*RP{y!T0Tb~0)nX9}R-}-w`mUp)P>;{ko|$&QeW7JJ@s^O^W@(KjYcG;W zi8nW;J`v6x_dP5)p9SaUH(5%lw@I|(Q<{}e39L7_Mf>Ap5*@HTYFG7~M5%(i+Z$d% zU69_{_7?JbO@ZO5!VnTYG$@yS90+wtnR_hEokY5kDNjy-zwUc~-INaXEo4*vDGi9r zJ-6j<%D~H41S;N-!u1Tc+?!ZA?v5N$ulP@^vNwEg$K@A&PkHujnIA| zo@_D$zn6*Vn)CthB$)Z!6`kPa{bEAB;Kxs)N=>tXm*Zjv6gsR3?ECVDu`}@9{Fe6} z8})!MSwAhF*$}uWJjzqko4}UXb59WPvKB+lP!Z1MXC`Fy9|Roh)>z>x;N@?}jCy;3 zhgZ6v*qoL}VEvd8{sG`sbyp9uw~#k9AKpDdPzU>N58U4Vkih&JJVooE9>t}f8F=uF zzP6EQ&qe*FAyU$G9fQJVqr7uINaeF%7Y@x1+GOsLnq6058` zbDLzd3(p|vIX|gH!3gGa5>tJCi@baqr(T_)k zD72cR=GHXe}c&k~sYsm=kvRYQQLIv=0$%vfBN;sF-d7-k}0nX(g zq-ma?VMgGXO?L~Xc@Ws^6K5ee*!l2aU@nzLqMMq#qwfGOYtd-2=YS8h#e8rB?A!Lf zjA5$vQD{7VXy*X%@+&|6-lhoPG4r0d*O>%1^xIRX0_!&9ks5RaUM?JwPkjlvT{W82 zje<#JgbcL(AnyX-r7S)vOJK?V%k31@kJ4*)7CKNr)iUcp|A6?5m}?iNf*+S(V%r=C zUQVi|IZDF$?uBmseip3HrEg7n67cecMT3uZ|`|MOp5j5mXS5)5ufyFuK| zUZ)tn1>D?o#cv0>0iPf9EB63C1m2mCsX(6bUiEBj0=|n_H7oil@TcklIj=^jXP%4M zb!LEP!e6I@3wZhM{f}<~ftRDs@hrOn;}uYAQ-{G{Pg)xKn}C-Ck{GL)WAI+@M^5Zd zuv6#2>t%5;&&6%0W3R!uorQ~p)&nm$r?Z*sM*;tGG4yYMAB(7Dh9A_iFaZq?ug`$9 z4qqAF9GKVI>u9Y6_@_uU;13npw|vjo)&+K2JPr4f240rBe0f^WJ9uxE*_Ag2Jn+rv zQuF&`fCo2k6ETS2s_X5!mxbZ|L|sKhc^ZW-MksjSgmd}bL-g$tuNh34h_2R)&j zT5~E2@N>Z7Jh{CE_~`L=lWSmK+va`CSsWBPX=8l99sF15+p(zzc=>c%cF+;1$HuQB zOw$1`$BW%oWP(l!_@Kj6?@z}cQtN^W66tu>*jm@bR5~6M(G0m5O~*Sgs8h$z(Xpk9 z1dDcxj<-h+Qulo6c-`E6sy|NBv3h2s_gT1a_H3n$xH1ig$(27G-9p3TLklV@cG0ll z25X~Ua~eJqyeQY%m4@4si%SE}(D2ts7tEetp*f%#NdkhUZ4VwO*w{ z!zGG%R@x>SUa#xF!eSl`f7&s$Oo@YrjSuo(SUDny>(gSm=Jg8VH`?ZD^bSE>lYR58 zO`9OzP`Y4cL6;!Tl92Qni)7$<4etw01`OP*Vy%g}7+6synrm+j9ry5-W`BM{$5+lh z4T`9yW09|l;_6X!TpJ!2cv6*)56ynOVwEr*4~g*?Z~P29k|Ap^;W{Qh{d}cfc^VU& zERKo@&0ylygw||YGZR;jNYy>!V&Tja8`X!Qm0Gu6BKIv5M}B!^aJGzz)lRNU^b28O z!&zyZHvTMpidb$C?ZU!mXiY@~TsL*J2whHK;q^wJ-Yt(~;gh}|RrDwp*4I{$xDwBT z_eeJki;`LRo4a4Ym_7@?Hm1GlJIca-C1=$epufe}0wEo^ZaSfv%`=aMbq3R}`hlI# zZ7M7VJiz`td-o1pWnz`~j`2`fhxns6%RVreSh!v|qgA5~bq{vKeK* zfTz;M+_x1x>3GIf>4Dybbo_ZBtc^NA!(M5LgKeFH_?5T+PCdX?pkc0xxeFbyUlymb zq@RJQ?23H~roCgk1+{mprbUYdMo;^57@X$b6GyKdWsuV6>zl|Gr& zAwjIx`B1)tkA`*IkFM!v((#^0Ub|P+GjPn&q{UqMOzg|jJZLWi{?Gr>nS6kSH!7LV z3WjwL>-@pr$)@3K8)wsteS#Rf+dZsUNyB@-j$i6Yr{j}dn&kzDnV9S}dHhw8h2x6N zH7$~P9)%R{*4APM;2a)qn+y@E{?Zl<7`6c_`Uqa(JPQ=QQ6kz zrt@id*KV8XS3DRvTRuza=_VFdH#+^X8St1@bj|bXau#k}Eg57|&BXfi56)bCfr0Dl zW(Q@)({bE(t%kF!Xjrq#vKVcrVYIhtqtav`7TuYs*a|pq#W8cOz|Y}F$nwa!bewc! zjBkM{4RhSyAt(yt1s*Vnijk+`8RvcmR5?Q3`{T*62cH=DlD?SKDA>98R;~C7m`CAd z#YqI?1_dhcdJNOC3crGN=ocCu3+7$2m`=m%KF{}i1MB>9>q}!A#M9{Ykio!y2F_Y^ zLjJA_6Px}_Zt4MC>x(YCn+kTOT+*C*KZuEC2faOQpD?g^h0w{>5_DXKs_e%I8ZHps zVW$Xn@`-PY&!g3J9K}<2_klhG?|hs1`9vQBw^u)Zsh9-yrlv+nBbQ-OMdH`OT+g4{t4>`Xn4_Sr9>adyXqfOqk~Y- zK7P?HOciF~!Ps!eo?sS!9;NJ4bApAxZ1reyKF-9t#%HvD=+p7p)tQ_RC_x-QHZLL@ z#-)Y`+YHEKlkayL(jhK1EnkZgsKdQoUY>`vnE0IO4k0T`7Ops*)tT?f!W}*G@c&y( zeBf}M#(6P1HsMKehz0+x(amL6LS5kc5uhs$d3|5Rb@i4pLA=&WOM!a?{1NM4y&J}p z5U@O(b};_i-G2Daassu2s%DJ7lk`C?4N-B0giuLAzj-d5PUNsfji z`Ev4_foHe^&KcG|rsHo4Icyst7WUP4DY1dPdK+@*q{0~{E)7cwel`R=C_1vXbO9aD zkxY&02mIV9-Wsk`PQzwuuC)Q(f_T(9+bULwj%UB?eGvfuJ1fIywDc+qr)yQKTZTrDAxcTgJd;_H%u|v=C?SU;tlJtl>Xd`5!psBk=S-9(WM;+3fe;=jGt$>PZMP z2x30`Ipa!NZZ7T~HlCgimd-Xh-p)22Ix~+dX~UT_=W|b;@9yU8Z*61uw;aqU3yA-< zk87H53!i-+f6qAkZ%(Ja{@TYov(Lua#>K|f>+knYyEi_*VD_!{cjCpJ$2Y`A-JYEnPz7)Zcct!Sf*}#{e49cGb`J4T>U$VCLiUPlo?i5 zR@UDHxToo{u}mv~NSV~#pC5tg+mjE|%#jTrvE=uEY`-Z@;(H(HZxW)DmYw2>AUy2d z{-m(+&tLzJA2WVuKu%G^{}a(kG|X@@`PaUTynFT=xjRTmNXv)Q-C>;eL3(KxcS^9X!T%hs(5u4}g^OG;fNu)y*M zL?S%5^?je9WHEt%a{at51FKe1Wnk}%2E15_g%qBUEqBT&l(xBP zg(Jx2U0M3cMVX1p=YI>UCz&WVfboz^iHU5xUDbK>nWz$(96K)zdg0UctyCbemDk0~ zHgN5^yyW@quS~SQIfX^SlEBaX*$VuuJ`cEvk>e{y7yX&06UMW>FG86COg~z4GZ2 z?J)%AGuQG90K3?Juazoo0D755C+~v2dAPbC#oqwCizlxYK26|Lk4E-{#}oK|-qtw; z;9$_%XLBUr<4i@)oHbxiCu)t!spGy)xwah9 zz$d?sz&Foa@ihfKN;^z!Z1*Jav6G8EI?|ZPz;Dxy14$IR(C#)b1o$viP&|^-L!m{r zD$*SCO!P44Xm%0Uh1$I&i2{G_dbU=h4E*wZeCUNI2SA<`Z$EU~GSTVLj;d~F3Z0^@ zbL|HGswUPf_Dp3WyTIA0W8fdpbB6Mt1QS@r=P9}9B7wg*C?`GyJ%8yDHIcC<@X?Uu z^VuTcS58t&g^m>ZV(j*|cOw(AS`0~f$r5;hwMu)54S^+_z2+LF)3vXeAICs60 z%RB;btrY&50XSapaXG06Yr02QaW&X!bUf}rBE&0K#geRNS0O&W`ru;eNMPB;7ACIW zm?-|(-6pyU6G_M2S<-!*LS@CLOAcgFXir6_aZNaZn^NBL)Pa2Wq~Fet=K=q&9C}0!M1?l@8y}MAV$nralEG z;@GleDP zP$AmcLkj4b2Ra~#8;wWVgBOE*?eqNZ-0_7t<@L*@%$-8H&hEa+VDH{n6R!D+1ePC> zFwZO{ux3rtL1D0`Hs|J*ZXoZ(A;J095ZBeJl4O6(g?zF&u>A|f-;|D(M^+3{NY}_} z;EOGVMDoV#2N+BgEs@%|Lzlo7B_f7NAg?X2*@F_m{Zi@VDyu65R(|4DCI)udedQWU z&vD3O`)}@Ul>k5I634EeD0HH>|9czoxzqoOl0_I3O^C~68M_hq(9ZGxFO>uqjxbYO z5A?3`E<4`{xS=a66zl{XUk!7wOH3qi(#@5X+`wPJ(VjfL~_P4_tZgKd89n{IgdyCsO+X!sp{X{wDKJ+WC9Ch;d2+US> zfVd8QMt{7>7kzl{o=2GYDX4?(E?U{$g*wUP2tD!<)SZ$RRs~z_2<)?NS;c**6WwK1 zM&<+(IPO)a1~>FA^+L<8*Fc>or)(HE40XR~WNXhe;Iq=PMeGFdvD}=m_X^a7_Sx_4 z26i#g=0@Aa_#hMANoe5AE@Gm=<{RXkY9%To z%W@K!U&i%%A=GR6hI2jipfB&6FZMMN`oma#Z;7!A3ccvZRlo8n)Hrun#mQq7DoD70 z{a6LcM|waw!y4*fqQf<^$FFzr^hPDU|+3efMi`=(GYR>~&E8>YC=Lyr2+g|6{j%(Epon?4xcMQ)nS$->|kR6U~X; zYxWrW{h0CB3f}~n$jEf4X)*M}8~ktW-kZZjR(Z!akkIe@FgF-JTu$IOO?mCOYL~zm^clCx9fXPj4-e+W zh+ZrJyH&h35QP3ea7b$4)vNa z>R^{hVO8Ze=u-@`g`_*d-Yaw>)*4m;-HgocLua54Z@V#$!j-4a$LdJSoLp=g-%>SM(TFOKUi=>R@p#PWEZmHwV zpiq3#LeW3MD7416FZTh|^RM4<+;xKenXDSROQHW?8rhm*8b)9ldqIgzz(;TU&V;db zOmwLGg4oRq6!Nijl6c@sq32%*QaPdj_w>BIdIaPyxwd*`4AAKn3`#o&a&Ix^y?N3d z`0!ozUHCEdXA4d&4Sh(ZMcy-3Punf!$P}9XC}5|J*B3=Wql1J#!x?o(EocR#v~#TQNng%$m{kTwP2lQ<(&nSwUuVSLJ z`T{3!LI2;rqUUuD^v7Mjd?Rnd2^{dcR`Xms$l<)|^&9B_>x$&Aoq)KvC0XQa&oPL* z`=0DLBSm12job321DGfy*-~=*7=`d*HH{0P_iryBUHrrf{pEwm$VW0T=lIlm*$(_t zKt;vj7w|WC{B-_i&{vzp{;nQ>@LOx!4~PbF(jNzY^!?iWX}YIqML3$HN5XQt-3KixezA0A9=2cU`&&^ctz*hjV~G*@mnzO#i3gl}IJTy`aef80cC%bK-|4$1)ojhNdiB$522Kp5Vyv()z`~dX5T;dKb z*MQ!I6%zrU;{h-1-viu0e`O*DmDS)s*4B-xS`dGqe&JxHL;t^l=AOfA4}O%pL@Ahr z`KH{u+|$5c$=SKf>OtNEk2l}!0sSQ$y>MR@>=DYPv55w&P;t&qA&4KN?t&U)(EksH z)DC?ANTHKI?B6y)oHf^2o*e=Gzt#&EjqPp(_APU=uZ8}f+?r9$1$ddb`jpQS{Jr|! zNM8o{Y2%Th^>v9bKN8|pJP7@Nxq|DBoj~V_*YTk9-4Oo`zVZq|T$QG4&Wp%_Jl1Ku zvmN4=%TqPJ0>EKo)oODLbgwNru%Q+7Q0!zG4ewhyIU~Q6d2;8@bT+$@gM&Mixu@D4)eonJ)Sq|VizI=eQ zr_1h_Yqj5%i-;XO`vz4eYqRuA^yDf8)#OCe647tMS8>B3`?pl%!c^p#yzB80CWBg zz6x8@2)t9bhcg%K5*zC}q60WMwM_8ET!=q@5( zR>19BO;x{P!0V1zu{EOLXZhp5hKFIFv48tF38=SLx9(Zl0?)1L`I7tsp0l`C6y^$k zC%0}x=PO6xFFV;!`U?{kkKIa!TCtweE zactcVd0e%oO~n@S*mWh1VZhP0g*Fd56Jd`0_+YUY=uzF@x5^muGV7K{cea3h+a|Jw ze7zvpAaC9@{wjDsnL_vUO{F#5C^W9F_8Uq!R z#)02PN?e+wbQkiX$dLo-keBnD0#y#cTs~8Mc1)iO?7#PG^#jmvipom+++-%IOJ)t* z2mXotdLOvu zU^9iTs;nHH^bb9QKeTmVF8`kQcuc<&fxoH0%$ke?IQ?YsL-7Bv2ATTlpzpSzf`mlC zfl0|a%|7tsn}M>gW&u8~r*E+f0Xv0_MWm`hUOw!UIyWl<;{3y}(qkY8KKrC|8|cMC zz)Wip>~s#vDPD#+MqXK+b`@~=Q7EyI&k^eX)Fsp#$je?qt64I^4~>sL-Ifn|S#oEY z%X7$Ek8;NjPR`{SYlc(UAkJC~gi4-+y!?=(GtK~TRVrkz`{5Y8&!~va5LgUyZ-{Vp z3uK}%zCT?T!(86B&|Dz`^uFWN$`AdlFyAg*u(nqQ=r~+1+XVI==NTL;0{*&+vKH)v zyjL83Vvpkt-Yx1F2S`ZfwrV8A84td$!^qs6`ABFa*n?;9( zGg0Z|>N8H-1RhZyX0?O7e6qghy$<-_ENjoPcEE!oN4d&8X#z(L-?9z|c|#)Riz$G7 zFJgN_)S$n(<-LbI2zj}2u>;=^AttKGpY2U3K_1|Dkx+zubcwwtha31CawOx-;vt@* zbMc=YAb+WswLFHrtX~^#(E)KdQEnvq>_-aKZTuyb34SwXX)#L{@^XT?%-X3k~m|f?)9*A63@wZc^j5W;!8E7OF~YPIM*yyMCUF8b2-;+j_71yy8>y4 zlN1BrK7O&0Rg}aP%0l|t%Sg$g*gxPOa)1qN*(|dW9UNpRTsiak-Jq>po7{3x$p0FBx(f>r+A&pu`{9J$fM~i4zSViuH}dOG{^XGb?*Z6`NMqJ zbw0DYYJd-aRKB}>*Ag0jv&clOB#DMI_ncH)RYSu)X0}$hj??h@mblv;b~L>Im$3WV z%l!D)Q_mx_t@!bt<~Ljc3;8kc9OLh*HvIVHOBvH56FPpMKHA}?#K0#EqxDkvFtBMf zsg|V7z)n2@71}He>~JFF?(y3UOqT9@&3BxEP1dP?=H0=-%l-X~TznZgsy&&1_8e0=zhT<*O+qllZV9kJ5M=i91#mCj1B^@sl90*|LDI-46ZR?g8Es z9<>H0W zY&&~sBPTyT7dW{;)aCIgf@vwSTFOK1JdZ3y-RnED{HYHL!BUl6Y0~*Y7M0 z5-Y!~R$07)fyHGSXAd6c$7xMjS||3 zi>{*KyLmYeEbU2b*X+1(D4xV-y*HXZfP8zdc!h2TJLT;t4A)&l#|yKMT>7X=!^Q7> znN`C6zlg{D(@%hQoXLvAGPNs3X|r57)NYbZZi4pKo0xeh&Cyz82sbW8f5# zWqA${__4O@qCJ{}eE4xsRHioQx28|aI6;YyUq}rMOYkyq6`JoG%}wGr6I|Redq|uk z7%7_uer?*eTK8o$18bxXJzb{CkCBk1XA8&^_&6X%CW#;W+^ly_+Rnh;y(is1fS{r1K3|AP%UzTS$BZ{fJolIT@#rSoE}xZ-Ec!-Sp#zW0QWo@0a!^z{j@g zxL7mrTUzp(Abw5;R{eAo4S_v(XT|Jf1swlStqh2SRlMH9RT}vDK2c_MHk-ulorZj^ zz9e2ILJzEb!oa-7rF5%)I#vw}x4Y`Xk9%KaeR=?T8r#RC^1+aXmE?{p`vcuTu^pFm zK)y|0S4yl2;c)w%Rg6Pc*tUDrcC0S5yM^Z3{Y88Gm336tY*1{m0|j9d6%D2WHtcJES2ByrK_pWPXw3>b>``Te6D+azb$C;_)Nn+1j3wD7MB(6UiQx~;}#1DPVEN#G#1I*4G zZIEYRBcXJcqY!`f?If-kb_0K347MEV;ln!{rFYmb=f`r}Ua<-Te-~b?de$F8;-H7G zADjXGt@-@DSi+Blx;@}h6Yw3Ktkr8NPvS$8AFQ`&F>uYXwz}XR8ny~;pL=eE5Bv0V z=*{Az<2AXGC0zXsET3&SFc3}RssXNV>oNhyVaft0!Jj&;d~&vcpXQG5+A6Ue;?bS> zv)6$?Me|SZw{y^NRN2+}k`HLum*uhKs1f+f`HX$HbpS741zZOqZdrA>Jc|b$s-#5) z4T0ZhQB{kM0)GKt`nm0wF>vI;4%tr7UwrL|DOpv#nlM@sYSL#yGeH H{OP{{!P!u& literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/restart_000150.h5 b/previews/PR1693/tutorials/out/restart_000150.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5cb6a10258f160c92518484b54290b63235b5379 GIT binary patch literal 11976 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 LPdB^idm8>PkxlOy literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/restart_000180.h5 b/previews/PR1693/tutorials/out/restart_000180.h5 new file mode 100644 index 0000000000000000000000000000000000000000..c939f56c74457eeb961ac79b678a3b44f94481d6 GIT binary patch literal 11976 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 R1U(_1I(j6&SK(&i{{mbmyH@}J literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000.pvd b/previews/PR1693/tutorials/out/solution_000.pvd new file mode 100644 index 00000000000..5a8e7dcf8d2 --- /dev/null +++ b/previews/PR1693/tutorials/out/solution_000.pvd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/out/solution_000000.h5 b/previews/PR1693/tutorials/out/solution_000000.h5 new file mode 100644 index 0000000000000000000000000000000000000000..ef22a6555a46b2c094feec13a196a006fe4c3417 GIT binary patch literal 205696 zcmeIyziu2w0Knn7yVyQ#BV8N{2T@p}p+fm%B)T&qMsAQI1QJa!4qmV&pKb2WmeQpR zZvavXN}d2(iWC$O3h2_fLX>#`B(t+KW1DaY1Wp>hEq2$tJF~k#?|q-G-FWNy*%xO+ zT)N$GA@rKvvO3Po-IqJfq4IY*|6$%~aIT46E7bBp**N{_a3@+g0J!uhb0$IaFk*5j&A4>rczd%L4>sTaaa^~v&6 zdUJ2EKdeTh?b|!m>cLJmTrHPgyHVe>+`pUdzrVM0XS4cb;uBnGZrQ9($IayDUO(Iz zPJZw+!_M4qu8ga8szJ3oo;>!qe9QUpdb8IF`F#h~Xls3ZXTNIRccDI6-uJ!T(Rg_9 z(fD9kZN6P!Rlj98bKkS$Ki=L+<7du{k2Alz^;&bgdR)2hRCpnF9&Zn-aB-=B^6y!m z3(Lo~Lgn^pTv?xX>ZI|T<9{&vasPDObE#9j?`T}@PyEM}yTzxNNl%g=C%PGzRx2I2 zpZ*MG+sUp@dZRdQD!y~QZMWOa1l>Ger@W z=XBG*>$}uk_UFEli}GfNSI8^i65+dI{0{o1e7`HEJU39Y!_tl}nL-%1DWr$0m4cIxx-%*CaC z=r(h#gyp%geB5dN2vhaZc)s0kHxqR8e4W;}U!)n29;7SNdLhpe&t1ONuja#2bE4DC zRL`}$F{r|&`X$@-@iapShu1>5*<5$tt9E|g5RRW%(w!#vyuS29evoI^^UDunkr4iE z&)Bl`+^_eaPS44`uHKu9k6tg6&oA#kOsB0CP(T3%{-VJ3X8Eaa8w=>*JMbO&9dLjH z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02RLxP z4g`w=3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Ouy}-wYmoJ$Up>-&P0T zf!_fKIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 N4sd`295{ameg`No{#O71 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000000.vtu b/previews/PR1693/tutorials/out/solution_000000.vtu new file mode 100644 index 0000000000000000000000000000000000000000..d4108f74da1fb70ce3cb6e7d1ce8d79244ba6704 GIT binary patch literal 12687 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
    $2wphS|B06MkhB~ZJrp?}7XQsINo(^ADpr*j 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

    v}th;#DA`0S6u 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�# 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000020.vtu b/previews/PR1693/tutorials/out/solution_000020.vtu new file mode 100644 index 0000000000000000000000000000000000000000..9022a88c39712b664524bd0b962b57250efdbc96 GIT binary patch literal 19000 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 #hkK&`K9c3h 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 Hcd_ArD8Evg literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000030.vtu b/previews/PR1693/tutorials/out/solution_000030.vtu new file mode 100644 index 0000000000000000000000000000000000000000..d8a379027b57c655b5adf4b5500a35c7acdff687 GIT binary patch literal 19045 zcmbTdWmH_ng}YnOPy`9?u7$h1yE_zK$jyyZ&Q_3$m5GIl!o=3d&e+1%OpwaO*_4ro z3Lu0cpr#@%ZeeXg;p|~=B1olb>*Va{V&v@NXkskkXkkqCZwQ7S&L(aaAf>bgV z&d$~*Vz$N>2DVfb<|YPzq;-I21va_*wG;wmW`}4S~vz4Zdg`uc{vw_He zh^d57C@2K}o%L_RKVk(76C)D}ITss46GwSd1v?8{XD2}_4t6%G{}76pSX=**vHu>mh!7yOM-*wN9z zXF)0hdwUaGW0OAtu`@MwGWjE6p<@1vMS%GqDF3nlyIFtj{&@25HvBU@|FFQw&eqn% z$l1cx!r9}$wuAM5vV((%m*YQ8`TrvOhxJbX3m#4`j(>6azu-~*;}y>z;J=6UZ*}m$ zW8wW576In}E0O|#5A)xG`9H+=-}38dZuh@&mYbdZe+=rsvAF(8(O-r7x9a|@g8s+M z@$ho;{6CTWYvKR@C1GXd=J%X}2&wlvNMEw!`t(X6nH38=Ts@nyG z|Jh%E)A^VGDMtghKdr3?^X4BvKf3>WeZl$1-aRuo-9uYe3)(TR-5etN>FX91cUn%A zmEtFw9IS6tNyd^ZR1iF|R>Ei{WO|xkR3dOxli7+EQ`!DbU1z&Dj%CN0P`K~OF`%&P1hXV`?lmQDaH zCU|>neA@C(Lw8_=BhVl&WVgIiatzNpcGwrBPON4&!$>`&wze43&Wv#QG`VK?FJoW5 zGa>Inzoej4GV@tPAOD8!xzk)U^L8yoZ13K)i<6=k7I2gOmDnK5C@HvT<72pj*#k~< zaV=$gMEK#W&2>Fh|EZ^`3VWnu(_3E`e{aB3Q^bQQx(Cv=c3%Y4Sf&NOnMwqcTWY0- z3X(X0vrp5I?}1Fo<*tWeCH+8!vB_~bF|t8ymsZgpPIBf~2B~L$zu5lui^bExdj~9z z#~m6Gbmk|{MK8NLP&x##(zo5-^>5PsGP!7&u-tfZh#YezJt>==+IlIh z)Wm8#Z*>vZ6xtG8_vU1RzQPiAT&c3TE@(|izouYB-fwIQb_)+uS2ZjlA8{Q5qbV$W zR`#gmPs*5wbf2tqdNX?KcBs6B2?pY#d2iJe!k$y}Ym2P*;9|g|a>=}lVQ$a;3PbFt z{2Lu}6&Cp9*z(bXW!{fF5I!|T1HsCMTz5G5g59&Q_-kS2pJXf6~l=}qo zJ~7*}-D8nDiR*9G&^3LWyJwV6oN^lsI%iBT4C0u&`^dePKVwk9OyovQmmoy!!zH!* zPmul|TVe+1zUFJWc~uv9BeTS*Vu1Sx#af@necN{rlHi1`t2{)u&3XbQqOPV@O5mvt zoNo^w;d>-@>1^K>yx_9H&a}4YAyC^oRbL$K_qtFl2O8DoaFeXc@94o4m6!MiM#e&J z8u&kMLItdI*!N+`pIU8ehH7uww_?EMtMug4@b#W+)3M{D;wzAqOg#R5(>F2%UM4Ik z4q2?)^Oe+UZ;H9=yj7t=Z6@Kk#;BD!JKPY!@3+ZkNwD~E(;{_;3*(JyI=v@Zj+GG^ zzi4d2o}*k35VjG%5^5lJ2s6_K?=9E2BY&^O)ZH+BCUYR= z4D1hG;|zRUA}&rmWyhK?%i2f5*XsCAyJ+kp&a~wgx#kfyYlVOtU0l%;L!YzbL208K zHk8Ua;^U1lz|0}ovJL}n8aldNZEivlEqBs)lkEYH2~DXFS=}RZ$V;5WMt1{s>q%LF zuk9EzvQzPOKqvw9knv>W_X}e6Zb2yt4{Mm7xubQ2#ZKUts)mv+8T(VgqZLuen;^|vIt|VCKFD^Q$zH*!R>$wi{`|H#W3N)nZXRu(b0|s2p!fE> zm)`GJ>!#SQOR(IvzeTQ)#k7S_k4182e@T;9wIuWOTvQ2sZXT6yFf{-)A(@8i@vFlX zqe$~YK>C2tvLHx$$P65h@nOPN5L%Dk{`~6ahfCrUMIEQUPEG`e4!)wei6Nv5=b2-E z2X`{>v4`W;d({ zqWI6Z%e&Plo5qNAA$Cqe$7Qoc^YO-LOB$Z9(faSr8Lv zjRQ_Rv3_yb&Ru|S73H&Yoej+UhL`KqTI}&aoy|p&Jxsy?5BtC)7p=^G3}D-*hD~AO zfw_GTyuG$B0*b3w`SstB6y^lCjB?(^xGRcpxmD)k7P<}W+SUn0znlkpx8du#y7>Ec zg_PD7dWAF^YrEiHLI5}77KSR2jCBgI0p!t*4KVr8z`UW>w{Ri6R0h9ayhk2}x^wDU z4x}p1wJjxuZX?HVFTaVzW!UEq^xKu@me*4Xx(^SLu&Vn6|HbL3b8uWjAB3N{SLqX= z=|4mU@%c1w|D0VzzbDoIgUg=Y`yhK#EiKIMExGeAM+GDnnQfE>G5m!S#hG=aweeY!Ls6@=ckk@G?&f zepn*J6jJCysrba!lM$nCt{IF9vkn5=MXDojIXc855ocK;DG?enxvuu!d|zOxKu-?& z`K5an{FMQAzG_;8tT|cL4Q9EM?=UdhVdaxf3ejZtI$XK?TI!;Hn2(zC-E)nu{*)~n zz-pVgCmfOJbiP>{_llcW1bGT{em;Hl28UD;rY4$xGukD_Y z`iCN#H0(;yr`Vv6MjB85(ZiTit(;U|Wauzk78TkOz0%NK%H?oNEP<@_8 zh|TTTbqwxEMiSvF^fGJjy73M<>ebs$k?icQYTjp0OTD|k<)kl^C>@rP>)TZQM$%kj z0pKh@K$tq-my8{J4r)9Ym(v1u_^l14(Rj|KMj~!bI;p2BT=uVh?|)S3d63HoWocIG z9|U%0!T1`HVZ5l7r}l*?--Vvam>9Innih74xpJXpm{sQ8u#GJnIeyh;l-~SubN0h1s5T zYIz)U?>$_U-m5Svm$ZndU$yK;YJ71jD7FpPoGlS1a;wEH8rzhz-QDddIZ-5S!mDSm zpx7d{;S+bW_$>RTCzPkJmSTiFpJ5^8cXhUQb?aqmcj|JMZnfeq3^DM%&xFMCTZn^` z+d(%fiTfIBE>59-mh!2P+bafBP|>v6al?i;u$SA@FdGBYRn{KR{t4ena64d=2sckZ zb9j8lrGec7h=Bv;_~83xr!6h1_0Ayv@e=LER$tM^@iPQtPt`S?@>0aBbGB|p@wPn` z#Dzjww(;&_w`4y)(<*g1xuKS5fz@DortJ}ikOk8NFqT}W8EGvj#YjCOBfe%9%7=JjwSO zY5E5oxOvPUR?d!zLXN+3psb^V$}F)cKlSz0Is-l9P26y!hs`gY!WO_EkTpPW>29RX zaDPtS)hu_U_=*pID%@=5^X+;${Wj14CDr9e<#SZAYQ|XKi$JEFIkxfD?2L#_#=Y*Md#%Io1pzx(O$hNMxTd)#yWkrEKPU!YX zGYFV>PIfzL&k{=`Xj9#Ep-1nrJA&_G4o*2s`&%Wn7cMs}Hp$m>KB`VUeaC?|e$euFl$Ps&a3LxM|yPzzN{n* zlVFtF4Lba{79eG$CD zCH?a8?hL!{YpWa)FW@wJEy~v3#?^QbhH%7p+$#&8A2M70s~fOt+F6B2FS2emN6~J6fwS#RNsJhhM?S+B_JDV2-7qw(%@dvmB7b}b z!OmQ@%Q%DRrrdBlB=A$A-kTJ34zar+!!~DDH=}^jGH*enk`z zm>fCWa2y%!38qMEVAV5p?WN}qM(;O~2N|6PHZ^)@bOuAoABWOtjhHH)Y#b8_G1~FIp8?^psrkgjfNpM>Q9yvgWH3_#k8WJSENR zYY%ooIjdN(6AWmQ0J|W8_V!;l?Fus=v%*Sq3!zWOzDF-ygN*dh<_`sDW(k?ivGcD_ z9&nkoiLRiTXO!w!aK-fDF>{3cjBonWj-k9S+32{|Wlu-$Llx6`Mxnc?Pw;ab1mUJF z>pYia5^XT|VY0pHx^qOFY*fD9oa_B?0@X2h57bmS4O@u=kdt$kV^6h64n@vbq$@Tb z5Quud)@#_B^VNxZPLnhc>~`#hkOp&mW4*vUozZMSMPI@V zI?o>g*L-F}~own0P9PC4ULOU?BOvF=d4%~TvEf(>e1K>014gM(x5t(yQ z0c=@7@G|xaCNkZ)4;eH5;4rBG!c*MB@Epv6k2%E)i6RiElneQrX#i+jJdIi5HFgWo zk@qlI!ic3hA(Kw7c=@^5JI&Z9*d0|7Q~BBc_7?pE!6@b-=tx4lez=nIh9Aj+ugY-x zDXjYyc@Yr2rxCi<@95{ld-nqQe55B=idy*4ulG4X7?R7}&Jsuf*x?H}l1Q?yvt=@w zdJ3C9^7)ttoEP@|-6v0hy{`fg&r!VNjTMU|r^FtgxjzJ%*`uE6fi|A#W5$`5+$a(R zR%E?m!D^Xzp62HjQsXLsoD4!Ss=&PhW`;BmcJoV-KK9vh`^y)>^kb(T}(si!!P zz@vg!Ar{*mFOgyp`xanD4pO7^q|Ijz6u(V|Q~k*S=<7wz{@L*_=cJZlF7UJCA1>htCjR98$1o!YAi=XD zc`tN@_Sa)P&FyX>aNs`g5nD$E4@ZXsFxcb%hhipQu=dW!m_+IM8dOji{i2hGdnt(j z2X7r)>ILu&C30*NzhR%a!-4amWto6p`mdp4UJG5n0x>1;AbN$k9##J_9Yg=;bnKt& z5bR&mG0r*VRIImHZ#G)BZ0crB?bep8m$|r>>ur|nJ;Flm+wDi{9a6jw>~vr3_6$t3 z_A(^ng~Y7KHol9S;)$DZh?}7yvc$0xMM|Y+@oFUDYostP1jF%!Z1ZH{^28_dq$%?x zPxJf~mKj1D=`}3v@w6T+CmG<08g@rB_5P^;HG~Blmz^k)9YL85Uzr_!nvGN>Ej}$Z zO(QkgV5IK^%?xADlx)vLXwM9Wz?hQ26q~>d`G+z64^yHaCcHn)5Y$ZZ)l4|m%+TkI z8Rtw%=gi=^jH$Uyak)(3GpcyCsyLS`8JDXB`75dUtJqtr_`ND=y{fpOmCVp80Fnbs zs6Ab%1CNCL2MGrbGe_iU9v;ffe4z{{o)icV2(>XTvN4soF;wCn_jQX?Xp0zefq@d2 zl{JxtK9QAInT1A~l`|#1Cf>^<2>`Lv-8X7C$p#MZ3^xTZG)0s&g;+Jk95;n$GzDul zMK3o6@;61cG{r(65WqX?Pw7bRaiQ+1>la$U{&SD0evbg!2RPpy=BH%vrCZjPMb@Uq zODEs~^L3XuYac;(heme~Uw0RMZHIAfk92KUaBUw>Xa`qlmtANdwSC9;2~=^Petw@t ze*aJvHbNIQWF9s4E^6?5)F?%tfp(t}%QidAG#jy-J>xWM(qWoEQCfIfTCfIDU%=<# zbn79ElWy$HE(Gmv7wvKMl>yn65yq7vo0YMX&pnQ%y>DHO^Dvsew0ftH{hAOs_%1I)X z`>T!cQ#=HcwFvtgSQ|R&lSSE#zpX|f=A1AZnS2XTq8AJFkd&09Bl!wP<-jIJ^L2pa zh%>p0O-1y>osvV+6mZSubqNGHu{f;*9=FVeZ*E+R(9+MX=@fEp%3RhBbv?XJ;s!R|K~WHLR98+rrQB9qZ^ffe4YnH7$0Lstfqzx_+MCk0t`NT|!DE5XNyc z4d&ic+d1t}j0imm8+2ET-|klWJFG9B5pGeaS7?Cz`wf}C^fU=Ph)c;2q?LSk*N#+x zHV*bURA6Nhj3ou_FdW@y`)(Q=nR+6DNSGx%@b=L3B3R4PACUge+S2E7V*Wj%{Gx1# zt#_Ax@8eu0Xc3JG<;X&+sZZa)CA0{e8FBrVD*=<+@WQKCFIKA?D-CFLKhg&mk285> z^}8RN*8^yD!9XmEK^JueY7jT}?v_+(r=c1DUhqtEEG!RmrEm(r=;Dvv{9bpfj{O zEZmbEgF=0;OT70~q5Y9cc@{rHx*FT#j{UAflz{5%?rzOJ)54%@O}*?JuctYJ;(*m| zH{G9XmSVVWq7XEqXaH@kXV~V&jN<|UP1Z*v&Fz<-by*qk`W5* zKBuo@i{}R3p4Sp)G$+bcPC7zJ$5TEJ)~8vNj%oc*+pB+Okbf>so~3wu0M@DZG+|+5 zVw}x^fJb6m0AcDzibFC$yveIYx5}Ku&3B0qS}} zIB(!Pq}U~j9QYoyp5#VB)m9T3m&{KU+Uy~6#!Hp3WAjubsY{pBFL){; z;5W|lr?45Y;>mHEsl9SE_y`M=D!nv%vQH^&q0MKp-j$3hH&ek>343eq-hNTTyQ-1Ce%Bg=OE#o4{baY4Ik=yH+bz&@q7#B7d2-K9AY>1`XF_;4vdn>Ed0!1ymE! z&8f?yrClkL>x@H5QLZX5Ln`b-cA$mh^}}=|9)MoMPSH7QYphr86M#vvRl%wWbuiz( zD!?_l46fHC{hQZw8{J$q{RAZ7!HH~TM1O(SDfo2|&l?Pt7o8E@@XM0F+JN7AMQS+s z9z(oS;eHwF>>Clv_(3}_fbO=fX;c_yZW#W$@%I~v_K4u1@i%6Yvflpw+`ai4ZhRhW z^gmW70VkYNReJ_$yt?d&Uc+hEi)!o(_rUxG{sH1w0J7ltEhP>kxZi`hCp^P-^~{lp z3ZV{CTy{($zvNZy{l)i;m55oc(`Q@yHWDD8|J}Rjv^Z}Zuida-sL{27 z7mA+{o)h-=o#h~H`qy@%SC*7E_{%D06fexjX+6)4Xw=M-bR&li&diKF7Q<@HYjFE% zXs0{HMX8kQsmX?Nv|+tP%G5__XtA-je%22X;C8>bE~PkyztNE2a?*W<`H zqJd++A9)_0oK&}oO*G~9wwZqMN%#jZx42~$fgOQm*loN|gmgcgQ8YnH!VaG0q5%;c zf#9-)jD`4-4G3BC$$sRYY1ITN5qhh}&4LWy4|ES1FWmtGYNY`ewQHNN#ug@9dDJ^L zC%qet^W@Zq?VI_#4imoM8Azh(SvFEtMg0)w#?x4m5kU@`Zt3|RC>geSYWA%;p@^u| zYj4y9tLRJ;`^UWmtR^+vL2wB{JGW^LV@JxYTOIH~h04)im9E?YE}js)gV_K}NDLnY z{^{2o_jr90(?N{K{GFza*I(&L;aVxwmBgN}`dYD?XMqL^Z5+24fDG%r^ma7dDUCK$ zb>vo1BdOm9uEsjH2j7d3OpyOf6(tnq11`4W#*2&IS^F&zPpm3B{AM7yR?Pr_+N{F1 z`oEnL(*(Y2osrkeLfGdH(Lg457Rj?Y+)C;a5N&qF=XCOuUP;~h)y5g7(7$sTQNmLG zV}B1@bVn;$+bErAg!NPfpBMEe*5^d8p7x$z)1$CGc`L1QAgGKi?z~s4cGe$mEasfK z<*~!7A~PWdLCylj`g+vQeGJ{R-HySpb-&KS1-8Yv!iRBZ7?wZi<*=HsXJh{-)vQCD zM1Ur{-Lnpz+?rwaxh7oi*>O_uj3Cj9VKIZo=SWEl@PaJO#KT22h7Wh;-92^81^j)! z!__(GHP?lP@UP#}nAkt&uq*tO5JR70%Z{HD4P8Y83gC8*>)+d`H8S+hQj17bH28z_ z*pE(f-aV=9WXJcZi8|vU*qR8hP!))>-}6 zMovAW2|;RD%dqb|UKTE!VXhd?95%|ffp}JQl1yALFeHtu+8-tc^u?Xktl^KgB6C;P zQ82SHj$&``{q^e4wP`Ni0i|_6lL{hg(pR@W19KgD=xddAo4M7_GopF{+EW!rgq z7kz#2oWrH5pljT{!6&p9hFr;?rTPo^lDr_RK2y=J>f6|+E$0O-fa&WU>PmMzu4)6; zJ#JQ`=LgKQ5<*kgLy>ibilSsoL{GMDm!*27D_P2Zx=-Y1m{GBF;V>_B(h)^Y9WkkP zi%x?Va^3EsdfJT@HD(q00)U|>A}?i zF}C|64^R%%O!5zVT2y$SZqVV9ilFZX!WDTVtc$O8@YaTKV}bC6{W#6UpJ*T5 z8jI1ED|6P?keO?yOULYuEOi~h#5jVi)k>)h;;Rn&ta%n9{|7G85hqjo!1^i?v>C>J zM$kFGr7)>777&DR7qqsZy!rNAQ5&2qkM$&xg;<9sq<`^Pr7@32RLGx#h$xLhZ+iNT zp&ib{q2)Wf!TYDe8Xtq79wfb>Z(WI~?FyxKB`xen9|G@)1})Wv_4dGpOcrm~i~!gM zK8R0qOI$BXNLxFstSxzP?Y?m!ns6gDCahekhR*Y$%##|U2~4$XL_DkshkDdlY|NQx z*ln2b9`lHb_eksNh*@qrSw)pj2KFm;D&m@Nu%jCohhVWlZAQAUCrE-LT*s+CGQxQW z+Uj1f2BK_$`(_O$(VY|t%K_4X8fI~cWDGd&4<59cP9k(KymP#-2-g)5JJ)423B}f( zfjeBU7D%ywo#;C+Pb&s)uAs zd=$=I)2#4Y5dbE6{2!GLQW~L*){rmiB2_W`w!-U9tzx+f*p1a19j4~a^w-JF+T)`e zNawcF@mH<~v9hc3##y=dSi`?oF^{S&V&Juk6Si>s zWBTld=5X~NpE_!OJP5_^WUup7{W{h`TQT~m=(=OKk(DSnTYxMt+Qo5$K}r`WG~st{ ze=L2F%fS_z{-y0$i}EvzBYb@3%((&4Hkz7L+HEva8;v?|nUP*Ws?jCm7t*VJjolN~ zqR$ZxPaX`oal)4z;PA~nn84>9j!?^utVlKVhsz7H2L$|>gpG#Er+3lT8@scHWfyhy zuQ$2UiPFM$=v>8VHQC2U3d<9e6O*+^_eL%oZ!T+D-Ud5>WTe2HJ+uceDmKK|n9@50 z=-Mlz8-l;31#0{OCl{6SIVrzhEV!R|FkCW9@H(*lgi`A3>hlB2ea(>84>izV;jGc} zmMT}()ScnHjD5%$R@C(sWmgyhj7 zn}qQc3`~sT zl5Ju`M5M@+m@5oc+H9w-S!WUN+h|J;snoR1O_3Jmb5dREg6E5UcQOh!L& z0N;TC9j5$uSisb(6kw#xJ;v-tg_+yQQ4A{ecmZe5vfOH~GLi_oO|fW8&B zW9y0h$>(XGO7O^KAb%mQ^Q0x&fIc4Bj5_NT$nDQ!e>5JxZm1veW0q7n3Pd(-m*-Tr zdOu@;yfqHqvjU^Oj86h;-Sl;5(#`Z%I%^o6j)^;o6UKqhaAU5$t_y)vRv3?@FfHQ( zEu(=h-Q$9bmF~>U==|JGQ594kyRWPSC81}qPl+-djVE&tkguW=gw_VMdgxs z35#PaTmVnB;yf9gTjT{@QY43AJ5>VZ)tGvvh_AnM20A>*UtY~_xIc%;c3r&2vp8BI z+_SH=6_9ycs;r!npm^n|+cLs+W$XbSrwzq0h zWzr#!IZe1G{)BL2C8VSq((e7kgZ}bGsWkO{ixlnS9P) z$>#S|M0QZ~aU9#v?d?2-!=1jkV_iPqbRFt*lZnh_#V^eU#OhMa`5v5+ts?R2!y$0& zok{Yf$I);b;|B~Vcb%r^5mW{f_E-CLY$H~BiW_2gi53h-M`*9NqQAxH8+%28jI9Hn%@I#=SAl#koui9K~uoSa?Ov{emPB}u=N+z{*W(UUmnTjqmf)}Fg&otBv@zYHHup3?SpWc()mwoamz0p56 zy)EGDI-3RR*SvStX9QnbC{%8VGVL-l=34$_G+)(L-a<=H3DTo#JMs24enl^BDW6{D zhPBihRQ23wEqW*l*rx|D20VaS$0zRZhQ;y{Z#RvNE?igJ$TulUV$VzI-5U#Bs!<{6 z0w(>#U&ITvO~@J*>Hs8iogv=kpZ4s+gy2ZWNbSH6X82G$2Qu345;;|FS zzEKw~%1|T=5KF=ApKdv!E8#~5o)b?(G2O>EjHbaG-60n@cVD)1znS3bCqwVlpT3*9 z%B`P$Jn?R)xOCgte~NF|x&Rf|TjyQAX9ZI&?Gpyl&$(Pggnic%oTbz%lXjNNYCN^f zbIXdfLMvYe%>Z@MQ_PPBj=p1XINX(X^uWfNFLwX2+f}t*H*?T`Zc&8*9 z;@(iBJatTS0+DOWv54oEBhdx!Gis{bk4W%rWd{uiB zmYu;Xcm+3IQd_OQKk(Nw>OTV}jm#y;taJCxA9ioKF&P{-SzH4yb>;oX! zo~~k3AcG}!wdvZ7=CsP-iwkHI;k6%Gbo+**UlE0d(6jLTK@aCO!DtJ0kR@CEII?%b zjJ4psOq%BFwTyPLo}|Q=uF*DB3*Y#aNdtw8>hwmAzSRcLp-6vuoX@`3T@_?;R+1jg zCYS6yerq~5+xSP+f_qj(MH|7E_$f^nzS3#^@|XK_#j%ruT0%vi+fbS#i%))ed#1H7 zNw|z^6tjemDI3tx3LX(toLik2wMu3%oio%M@xRmO?|$9Ryg@}T>Z&orZ9gi64f z{`pbRZ^$m=_#qPQ?9vN(9Nat4qX2wu>bu6zf3{n{ZO(8$SjCaME4f?CE(tlZoGG@Q z3XSjo{h?T0p69A1nfXP`*72{AfPcN60R}1GdA&Ybp5&OWqCEY% z%bB^(U@9bCWj}9ve4^##qNOou@5U#_jNb1q13s|`gUk^kAmyMH8w#M#nne4Y=Z2lG zbQjnD`Z8$i%Qr7LYC?tg>KUW{uB`-dJ8{Sv)4xpaED1D812-?#e@5Q`dzcj?B$+`a z_=C3m{G$)zd3g&j##oc3se~s7V?E(7r^BP@nJL~pH?`GY-hxkbZh>2m#+5a?-9IKH zS+XG?#;zJp0#>;-sx)9~v3(Rpp1qUT%-`)!)5V-O5uGMFjErJv6Vs0V_FSjd{2+3p zO~<8^(0C#LlO=)~SII^-^oE-dZ8!exCgpf-S=uL9;~{M=1@Uz_o}zMhR5&&xd)BwB zT!H-N#5Ic#Nv=+mBMVl(z)8*{fCz(dj5fT;z80Q%I!r_Jeh)@Yxck8bN98$YPWUR@Ycf0A~ z%*t2fa+6QAUGO00CFu5u-sti8A+ie#;OHxvc6%_4@LzT8C?apMX6*XBB8~=q?oAYy zjgiJ7)}He|zJ5oygFhqfqcRNO^K&++1bYNr9Wkv5eY<%rnQo`C%&v5eJv0~rO)OYv zN;wScsZYO3sPy#sq26%v55|bhxHZ&aC_iuZ9K|S+&qOs@3O}o9SjFPac57)WGNQ6% z39MTjP@UMx@=Y@c=bJfEr39jsJY0kQUc_;tz(q0T0(-nN=fAmmZ~weZ!$Q=K8lrU{ z)Ts2_Nd50sQqV*<|JMaL_C`!J(Sgy7rQY^z33e4LX>dXv=Ni9T@IMt zKJgTOTxYmvH(Yfr*7C=URTf&6c%Axv?o~uPa9;3o*|8M-IJ;RawjXh*)6`~c`g___3%*_IGe+avW>l8e^9)b z*|nhm;~|(z2i!A>T>n)5S&w$1djG^!N8fj9V?o`(C!&RDn|1)Qpy>T{Q*2xZ)QCnKM?j_%}xPm_+e%1zu$9?0&1eHJj#dXCrkmgq^d>Cz?RH zMZQVpSo0yi_O?}%F2$ibM2roE7~_grueX$~yujbU zHPv}BhFpU969DoFYYme1Piah#de}=qjgV_-Hv1Xu2{qX&-)1V|qo^=121g?5uu4y3 zQ^AlC>QVPI&FKu1R!G6>nxRlZt=$*+?N>N}0gUs1cff7<&jaqC$@}afVSjveh-8Av z=lE~+K|K^+Kc*sZq*g_P`yLtcJ}a6kDK&hSN@DB{OBy8jil?DzE%FIEnh>_WKcaU& z@6^7pG3Ft(FL3wb@mfCRRL>fCw*C#|;21?DnHCg9UlmJqfVYD_*J0b1cOt^U^DJ+k z{?7bZBR?C=VyS?al%mTAu%xIt&AQX5wDKquIj>L*Tt@@AeDH%E34kzO#CjiJbd$d* z$#U7X3a`HqBKI2rD&>5Z@JF(s#m&>jBkvA2doEN?R zE`u~bz39&*H2hoKBYj3XlT^SRH~N(_)~|3Eg%&CM684D?r|5heeEZ>H z923hjB_qgqK91Ti>~qQCgV^-2f&3VEBmPr3hterqUN3PeT&UYSYaUvzQBELE(Srb# zf`tA+145a012?3k;d)3N%=Uc@xlh3P4@xtlwT#?-Re(wKg0 z%Uj9fkWt1omn_+^j01Z%Grhy+xB45H_x#~NeQK&1Ci8rmMRFhW;%S5$y&bY^WvK5% zc>_vsV3l`VT=$0i?%QAODyTWHb}n%Zd!oS#J#Y4drb2{iJ2d^p&_#^r=bM=^z@id& zBfT3`Ed)gb3xVzl{6ig>?547xO9^e5&&2j6O^O7K{kZW&$msm+zCB#e`&|jHh!tn2 z+Tu%Nc_$kH z-d!)4#r8B3w9(gCc%5A%;4U_66m({B;nat;q`sw}%CSrB@!IH!lG=ILkcqTDd^h_& z!FG)8b?Qab27GFFg5Wabd~!CCLf-$o|E#z;W7G@%y9VJ=qPB2+0yB}D7#9yI;xtDi5 zkRdX)x?!~))o!A)|AG|zv)kRZ+kcCg!plD4R_$VQ6gjs)d)c(%cqKc9S?`i#s|Zi9 z+7PubutW?}5da%bNm2_sElC+mify9g50A{A=xVd0%p2F-$11LPF?3Z176&>$tjLW> zf2PxWKuPjlO_RG(P};f zd?Z|s=vf zvD=YgJ%YL%=B)CwannbR>9+BtTD1>;7Eu|)^k-9@0}{@1uCur@*l`wl+}|FY@D$Ui zb#VoM5y64i#%X5{GntCJcGo-iWOS*E8Tv5xeJnRZ=xgS!^^2kmXilf&O>Kw}f4G5G zMLica)cNEemVVDMNj%pL>>6^EokKfVs!(pN(wKFUIt4X#ylCw!&;y#j5)SH7O@%s- zr(AOSBD_20g&u%~7OmgOyZm;_Dyf9y_%>pbeTjqqaUZ^oR^XVpaYMb;KM*w5@1-ES?EXVc2VAfeB{QBrv*>N1y3$E3b)#RJqWr&V_nvr<_>RF%Z?0cO6!`;hm zV}>W`6PD3J4|=pHOpOd7;7Q}t7x6&%AXk)ZwscI5nu6~(OeYy+4tFa&mG=f~n`z#^ zAsJWmkiL1T|0dV-wibs(4*%m%Ip3ew+3iLeiPDc@pA4CQK~#q=$oSvK*oL;Oa@1@|P8-3#bA z)e>jF$FTdV`fbA;_lk`8Vmy<#Z^%J2O(hl|E(5ImN*A4Gn9CEeK$?OUXPf0ilKTKP ze*Ylln>n1Bx|o!5W40bwel)+-phyN{wsiGCZmv*mt&2ZXXZ1!p`~s~@offfoO5G%~ zno9PXd@UrG8K3hS>d@=zwF+{+32m^1axZXdT8`pMH897#$a%W6&f|%lH-NYAUBoiI zmZRWaS^Bik6dlJq;Z7ggR4N{AGpZ%+_DQmq-gWBcjJ|WFZR?eYKIqOWE&K5G+!&mv z&vgpE^EUJ1nVlzfu#15HPD^~V>s74aFLv`|YV8taD{Mn71wFEMKXf+3yOfX&pW76&0K1vMRU#uxi|x zF;R@{s8kw;e)q+TQL_mBehfSVf#ZagRZ-y~$$qS2COB(AkZA%3WSQ z-{5i}3QP58(mju*7VDF+I9v$yv@>~~fIp3pT~7PXe3se%OYohw z?_;MK%NnO0<6+Qd$$jLb^4KfRt7; zxVJDU4lHRft57Bd#VdOrAu^?!1L+aPc6r9yRO&`^tGa37LzwT z&CjG*qE(oqD3J>8@LKy{K13Y2&CCns1vkC*2TiTTD6Pjh=y^HdIH2MaA&vXj$xP!N zDI=VJf3B<5iyC8>x?exE4gc`d4!FK6@nFEZy@t@CXHZ$ci$yo-VT=8&OXj`(@f+AG zshfEqlj6Bgw_yZM^{8e}4}tnS$w$0(uSDgn)(i3>NrnX2ZabA%9g%ZQ(T*wWt@F+F zxm|*K{P|Y#NM7E%@KH6$@3{$dgd}=V!LG~Mpce$rcm|^T5(;zem8KtZW1|$wVxYE& zRZeP*8q*O8(;Ez`GR9z=cY)q=;qC5qVn%>LYw@R~!ko4Gz zgLY<5WfNIy@58p$D6VL>lDYR@MDK5*DuLwB*>R~l*(RTID)p*9SJ%gPK{c+33Dp$r zQ72aSzsnfJCs@wsE#s|8(Vry966C?VN8psHX z#IQ|h$-i?4qWtyAcVc2BE_pIzwA<0zK=VoqBRXcA{3LpV!e`<-;K~#OhJ@dv1R)eY zdC9XvjAW-6JUha@H{t3va;MDByYk(7Dvz;$Q*-2MV884$;&{`It*o))X@<3G#mE-q z_(MTLFKk|Sf7Z*|#>2Z+jjBhKV5eq1~&>A6xRy1efMmR6r)$bw+XK z-IUgSZ0%%2b?x5nkAJ=tJ))xQ-`o`X@jtGT z8+yY>mD!!~RIB^Bt_(~G_`*c5NmN7$Qf(9+Wfkq`zzd)*RX<3T`f&=^SHxstvrM`E z_6D~4H9;PV!*F5wUinu^s(zN9mhYP;ypo@tpm9<_bsKkWV?MYes|_|QBE!12H@me_ ziTg#4sxpr%R9DnlZrpRh1cx$_-owK5p4+Ucj^MC}m$QzmX>~yKYZ@%2;YaxIitKVz z{00lx zBCi=gKK4@g%~%AE8ex=wtbRtVa2n7{S;cxz2z=aY3&xOk7f@TP>SWC5K8m)x_BOqG ztL1pT?kMdj=iT&_%@+$LNB#OW%W6yjuHJiI&B`7o5wt-4(U0LYpB*s~oSTFQa&^Z$AN^<}%e$%@)L1{uacjCZ+ZnRv zi{Fkm%NyR?YPtg4!{5oP!4vU;3@+wpS=LG6IO?CL22*5m;@S3*ZQ4UaPGlGxJSI7q z#C&|L^9J-|$J>A4(7u;Ib2e+iX}4{4ZwO&E#&TJcp*KJayu8gQHq*{$-Es1rGIDv} zw#xAS&addmIO*y-E>oXI^I!tCV~wDirSs_j*pp=d)#X!RO($Y*YohlAE#71 z+{eyx&(U33ExSa|e0bkpqPSz{vsny8tz25*5!$nd`a%x;gY~Rt*yG>gFdHS3zu*Zo za>z}I#Rqf`T`>YJjbqTitsAHW4V%VWVdAV#%GoI-QI_~L9LeEYprl_J3}^b#yVKi( zOiI6PZ|!IplmMqB^?L&`!0+(j?Z@hkZQCVeOmnVzN#aPdjPnM!gHMZPUq}VgA+IW* zmnpNMb^DFjUEP!*sY^m+-Kf!!<~&lofbrLz@tA^mm#h3S_;hi3k0BB_e}8>57yDBl z0xh!hPtPKO-BwO*?r!*GFN>OYsG1&lXGdfV@?+0Nlb@goA7J7?ZbzA(;>P)Cx1BJ0 zs5{Tc40^r%jstVn>=a@~XI_;4KyOF89lHPz&_-NN3b6I$28lhe_P?)qj{z~vnPc|+ z;_hQvHO4LhbG{Q{Z8*^SG{^Q!p8rcnRDO#{2pIA`@T~PY4;b^C)IW=8=Ve#jBvEcU z&f96b?+XE3uzIe95j^W-4x79{AwYDq!7Wv@lJAF!I3L*h#Agb(coX;W^eR)E^_xftX z&j1AXX0yH*LZ%J?rL@?u;C{sM^)hb=&xgl3QcbfV!$aEBa<3q_CrM~e!!#Y8x30^g z?fokcSGT+?`$nkDD3grA>{A=dkLdcY$JyR3EDR$B&LW&5OkEQxPSw$13#;9>mU zZdyCJZ%F?q?aBxNk~Kjei~r`a>|3aPh`=IRr?$4ClR@mZU|ol~G>nuMjWZ+jY;rTu zGrCuVUh}|yn3%r`koVa4MYD-}t79Li4**vk|CWSCX0F{E+s_Qna* zmBl!<`p5oea}I7^#*tP$4~O2JACw8t%Tg6hO9dVi9MT-e5?!tMa-_kY>{tA9HaBoK zjV*C+Cft}v!PwhrW_p_l8ov*FeDkBAnAEx@jp*WuE9)Q3Qe_dq%vf2k#Y3-Uq``^I zr(s)x(Xh7w*NBk6Iu`TLFK_zrU?Gb`ChMiV6&P5v3hzgVt_{U!F569V%f^CLt&wEC z5Ga=fqCXd0@9(T3I3J9BrpBnzNE(`9pgc%&Krf_rklY|r_8l{i;NCg=#r>iohn}P! zc};@#PF%IqdrI=u(Aio8x3v_;_!at_2qL6k*Gg9>eGlDor0Lam zl9vLHO&BnsA-zOvYn~Z{NYBqZTf;~`D(GHZ_nJjemy5@~ehyD|E!J@+@40&?MeFkd z7P8gHM>f?m@LHdJC@X6)}Ml+;b*oby^cn&iSYRdcj0C{&FM%yT98 zIrj0`YIg$$^IG(V9vu_I{O=YdwzK#WY+0&Dbo^!@uw#zmyZZ#kE@R%C!(eb! zWB!@AJTYP}8_&ui{tza=> zG!E_(5ZbIhUpt!U$(7qIC*rYC|MUK*X&j=ZH9D*%SzN8J+g$0&KwsC=NV1|SJXPfgD+LyP}Vj2?m`vn#1*fZ(`` zrY;zBgTsQFK&2m~Zk0ntS_z}Xmv6dCzDOl~u{}RBw^M}eb6Y&CNS`(>jx5ogO2eio z{a|fBjZG(pay><2C?y?sRH)=|S0}WA(-UyyR=D^z!Kt*me7F27k8!CgrJM(c;kABK zGrh&giPvEoN&ZQWr{;MQUYEX4KXjMWYqUhhq>;>Nn5IMQpbrIopGUo66yZV59`lBF zG4}KK)O9*IC>`Tk_mZ5MV>}_ei1=WE$Ml@|bRMU+zJ?Xy+p=5gP1bb`Y@M6#)RA0} zdVYb^B*N!QrK7cOWR-3??zOR*_}5bxMk|2S(=Xsg<~JG@W6p{)iLcOAL5n_;oSpTu zj|wOHGydTBz6z3Ce=JOPX(sy9U7_*%`yv(*>-4Ua=nWNH literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000030_celldata.vtu b/previews/PR1693/tutorials/out/solution_000030_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 zcmbVxc{tR4_diLpWJyT&k!)e?WEm2YB-yePV+k|NjGa*llQmmL+@?^3FxIR?23fLi zW#7gw8v9s&+V1E6KG$>ozTfNl{By2zuJ?JpUgx~e=b!Ud2KlKxPdhx4lZ^O0IxIH?j&mS8%76$kdp!M+C$wvU|={LdUD(w z;c9-{<-rX*gq_CUVSp+PFR${yv;GL4gzvh5?ZLcvyxbpvVfv1Dp)L>vTm>K_Ed}^H zr~!6!JBdmE#QBx<^VlzhpMf8Q>M)p{-|rH&+@N+p#oe)UKdJZ^>^~4sv_T=@pH$KS zUPma*-43Awu=DT$Lma>-4S_m3!oepIAVA^|i?YNol)wF-vi^7{mHfMg-|hLOz#a;L zfb9`3-Yy8g|Expu|EEJnK~d&kQvNrxU+Uri1&^$p%s)#04?M;vRVkbR|7`1zIr#5b z6#v1ZEb%`&sr2IDP2qQlKm0P%um4O{d*YGHxb01XO2&np9$-dB(BcrD57q<4M^cwbQq#ZBxx z1$XY0s0Mr^j&=DDmJE*5HRI%SY!?$Nm08g@W1u%7yhneXq7%@@Yl8OADqL2)w?F@Q zE}nlnA_&A%7h(|4Kc@_SqyT{Monf(!oJD;|->n%?Glku-oN4N^^@%oD;}jk`q(t#g z$2U{qnKtMec62i{?H^GGSQWWCU*fHdFmCMZ_^?CvFmd>HC6Q*M-U$nZ^-HN=&+i7g zbSvWBgKD!@!)M9WBj|`;+}n!1cSH}ZpiJvra7ickb}Ia52!vi2Ax6O>kmKX~q=Q_gb%07Cp6Dst?ZmN874|*`lfXAhH zdFM;*Q@#kcl-ukr7r|FznL6sH0&T5X2%r4THT=Y*@x+hgyYG-@BZ5e>-UJ-aLko1c z3a2OT)oKd$E>b+Hza3rhM=Nfd+(jLt-;};{B~ZlRKHo`F{DSg1Y`NPe zy{a@>KUnC(!o#E=-TFRozl=_(oFR9oBu1kqk;Q)ySa=GE6x}jk;M5qh!p+XyQwPgF z*A>yUQ2oS0eT+uL_EYc{P8-YdG})ZChsf@1be@wI{G`VI=;8#?&r zS@nZrX7n06Bdro9&YGMv4?;Bd-&=uaR@gQ4JFeS37jJCl2^hIb&r9B&8P%6Z88J_h zSogS_>uu*(30&s!8w;O+;_N_b;B#YoTuZBF%|Tai-P}SVg}NKoPh-XjAEF)gz0WA` zG`}5UdvX6XUVBamaxwde8F;F{rY?(;9|A94Uz%_7;vEUGFUyeU9Mhk*A%9np7aS59 zOWdkZx-vylcFT~SC+9h+ft0kBZc9(c;0nfsdHPP5`;Yg|k z!!Uyj(^p31szUt^&%9YqwtCiH8Mfy1Vb^nA-Cg~=Y6XWU%E=l>7%8u#zF*2;?q8n<9<;Cu9VEtxrNm+!WpxE zeD2n$HneO;+>*#Om^~RMUNvxzrv6acUM`w!Xvhz6=BvCfbFt-So*$_2sMIMU7=*X&;Ue;H9y$Ua8GIMqkTYk)zx(wa@xGBjsMHrRW!(m~Sd5>3N{6?Z9~!&5x52SuUG=das<{6=Fjgl<@N-tmeWxwDq>Dz066` z5==gZ7X_mjAmr{7@}xT1#+f*h%H2V2jkDW4sYy87T`<0{ZnP(d2&EV`b2{wgqHdT; ztX*~u@>Bwbl9TRL)Tvo6D6SeI!Bi-}LSR-Yd2F9jP@k!Xpk!TwGJ`aw&E&#=X6 zk_yB5aTyA&gz_)#P+#S1V>DM0W$xscDvmbMrA%ERR#RUz2n=jb{5(RIye!gM=#jM| z6;tXQp9bgsE)Z(flnutdzbU^(b$3u@+CJlAjIV*#v`zdqsZ>(%PZi7{!+7vvOMI|X|?2C85PifP%>DhS(-g-nXcibj{Qw7d@YeYC~s zrBDDBI5#kmb4*n|wA>di_oSrJu=JxzKOc9AL1n%(lvyEt(r$D8hU~OC&Z(8xV9J)?Kvu9mCWArYJ#G`cO3o278PWI*f}h* zw(W&Tfm~-e@XyY$ACEg*#&_v(Z^h5XZ?tA@CC|#UHc%J@>sUqX0^-9_ElR1)0?VTG zs|WE_7~S=}g@bs6`aD~cJf4472QM(A9WhDj@ek=r0de1X^wxn%65CQ9tP^k^P5@omvb~=1k>AcP@@yxM7ZGNHowo+QSt~9|a zUcSp@+(NyNp4!1VpOmx&6(McxE9rw7P*JCz%iIed;n@F z0Iv2?#%9*f!9weks5Inq0-WkTZUu%dHQCH0-)v~aR?SPNpm#R6WrcIJ^V@aqG*21d z;;hPZ0m&9DQ1&j*-;8ZNeEMOb>y8Dc{?T|_ih%zhI`Yg^58M=eccW$ee#^cQe(%m3 zOuBiI?LtUHI(e`?H~o=G0lGQNa3_5AHrTFC&oQSFQt1qCDl1%54&zHraPs! zwRX$TSfHZ>D#5wr8$ye@g4qLeekb2(uP!M+?LOZ?nS7-Np7OYI+_GAmy(G&vzLn#+ zTEc^?cchDfaET(y=2)FePFKVKQL)}6IxZKDiLGUJmP#OxoUZnXW^&}K^YvLuO3+B@ z4!{$#b6wCCBJx#Q1JYCeB!%Wu-VUBOqQl8=i(gq5*KFiBqDRuLiw(BPIgpovy0u5n z5*!%6Jdd?%siQ5 zXU?)sYwzm!s*rX;(w`^ETn<*7txZX+*|Ce;-=N!q*c!OQt`g}9#@^5PHZ%en2FgYa zw(HOsIU2V2lNZ` zHhQ?bRDMXYkD7?DR_u8gsj$8R*_qnjMi*LVWym9|gpe?`i%uMbH)hqeS}`*Xw}kGq z+Q#gWS33nbgz2b(Sg7*hc$+Bu2@iweLNe z`g8DCojDHs^qp7GN$g~H=jpyN63{25s81v}?A#QvslFf&ExPBsuq@{>X*dwHWtt%w zn;ay?Z&M!{{5hadg^vR+T5&2=g-hAjsc9IlZw_=ik4!`bDaA9$bd9HRmp0+@xh@`{ zECMo55h*oaWQZajuPjq%=3VeSGz@e>Y~~oNJYtb=ow-o2+=E+7{wj4Q&3Iw(eGM~_ z=}Bz%xvME2uKI`L3Je`S7ehr>V2%x<%!7$9kMx7Kly?sr;m1W&x?@hRmuP^=Yq}J1 zocBv~h4;==3^BZLMZgkNVXretlAl`*fw44y+1i*ig!spSeVC)$oj2g9VccbEGt60` zEuA&yzj}8{M(UG;wc15;rmC(5e>_^fHKe45c3bSRA4IeH?VEn7Ks+u<{$_H#-jJ3r zpYO1ucdi5oMS9N`A($w{KLCk(iF5^^(5>POlw(6&+Mo-~HFSku%|xAxB!^sj6wYr& zh`^P~Dlxk5L@XxUaYA`z1`5M}y82M>i#Hc6g?*BZ*HW%yrO1#x~`V0SzHX zqe<$V^aaq?y&y#_M(_LMCA(PJGlY+xVvi)ZwfcvL(BCYl5>=J0&URLh#_z0r3~cCC zQ`utXQoFLV#?*Yh<_^0eXfkUNNXf5aj|j#;fJomH-$_zs z9?uUrtj}j54ivv`1dTa1V9y9^Ot=p6);X`Ap9$pSI1`q|(|--McVW@3qHVxZ;aLiX zXa6FRDQygzx<<4`gBPcJ4lbD=JSXj6W_RYA0_i&5wepnyRFIO%h+rf(t}aje#hN#i zX4RV%TA(?uoKeh4ccvQqDrN|#JkJ~QkgGeOyfxKD=DN0BC&;Em}&q$xhe74|JIOGN1R2fsX+eV`xA{kh9x17DxHhZX;pn&W#TDD?0- zk#egx{aYqy4_#~KUQb=+Ww+}&HNz$JexSD`2nguA(Zna#ydmxbxh&r>+I%0n%VAyrzlOhGcqP3R{+kP zOb8E*F#-j%?yxvmzQjPL{R|E_Cj=YZwQxZkD}tXoM%WdKosqMbHZ>#e%YcG<0&#z7 z5;X?Bj6l;a#0#l}?Cvxl`9-nR6C80P(6eM8)CEsxPzoqXDyy%w9RPt=K-5_P~3R?zIVCrjFi zZeXG@7Lcx;!?HC=v)x_7lKW zhu(wdej!WQ$ErZcY=A~CMtT}FdWTqY@4)h!Gg50iiNg3V8Bi0xDrreOzB9o28+_;4 z{Id1efDVfrqxTMzGecE)#tjRu8ZI$eG^EY<#uH*P=AgrS^^MAg1JIeA~p@q!juM$3ur4Dh)md!!CJUC}I&#VlEDIFv#mY(^oSSs^Y# zA;nN3sZZfA_1kT99Ze7N@&0bD1)QH0qS}4w90RY|UJnB@F-x;2NK+b0u^399>yzTr zNQp~9r^hoP=$z;Yj@$&WD#3}I)q#)Ik%`rb`h|n=3rF@BV8s_slqQZWCSX|; zr*nf2VuOxcgH9B34*YVC%yQt1? zQ9fo#$poNqf~2A$P{2@9Hu+^qT!3F9hzPZwx32@gLblJgS3VJ~jL54DbFGY7u6&kS z8ER1(JyIE>R2f-a8B5xu#Lb!>yrlAd9`1{tShqm7eDjNH@p~e;M-e+&x(x`xW?yH#^)(iXPH&!q*do>>t=%wFonA> zzwM^;?CxPv9YRrU&QYBgqgwAredcYpvuw5p&PbE@Npbjii1kS(E~Y$YPkEM-5^BcY z{N!r;OSd-ql}4ttkCc{;UY1?wMnCC|c8HC(xsP_PT*brko6dSW*u=~li90C3fr4;J zc_L7PC<&r10!9`IMPe0ni!SS8W!j6BMT-EUSgE`skv!}**CM&)BJpLcDn}6?2Uaq* zh&{E0(xRBfqU792G1o{5vr-9dbumYE2~|KbTR;g92~I`@W2Azg4ToI}hhNZ!)3v}j zTi~YzVdn+mm$Kn!oM5a@aQb-|_dJ}54Njd5V^4-tn!;F2iTuJgHD-S%{o=2|Ci`Q5 zuYt*Y(^Bin$Z4V&{V5X9kgKeWQWWhFWr$3fG9;-;s0nO_AMf*B} zIT=q;Z_1>RBT1#%elr!T{r}|u<0IfOa+nhh!E|vPlth{#&L5HGbB+GZm79hC4`}mz zJ*X%cX|~%+#)J#xWfWyv$tcOl`YiBT;wPgHzXaE8|HGC4&BInQwqiXMD59SG@)fTB zUQ2!aWZJ6B$aFXbe$QR$>ih2<|Ceh2(w=H_J$G;SCGI}{|Gw^TvB_34gZRJXWyJn2 zarg6_>mRVpo%dH0h0Xn)>f`6{yTZ+Xg|GVpM`)p!GXK)asJZzO!&K!LcBo^`^_$06UZ}so|NmHf zOGw0{)Uij|e~z!RFizC2pTGOEfBRt!gvNL$S_+!K;7%uMlS?>?i++g#8j}qe$yT`bVTfeW|!g{*&_J zCJFnW^qTGePj;I1eu(Y<{%_jH2n)Uy?_M7|N-2OlHxOwzb*wm%0 z*}rDJ=JIC#tLRUiNSn)>{Sdyil(qgxd2>IS%ge;_Jt8d?sjx>&S+o6SePK0985S)5 zlQM~@uO#x#et!|=dqvtsEYA}8Sdk9m11Vv5_&`cnmZZp_* zOs9dCu)t8kfAtK(Ufmb^k`i{he+#bHF^j&mgniVc4}p1MPEl0KPBzdAk+6^qnlV!L z!l9P)2HCARzsE+X_joE;lzS@(?JL9x?Hrg+11Vv@bB=KO%T18$t_2JEE?L39q(c;v zr7X~6HK!ZBpYZYtt=e*alWq>@H~9A8e0uFHEIA3&IsA^xJ3FuEw50bMUS70E1BNB+ z_O)WpPn|rB)92eqaVjHg#OdP{CoCBW8#Ysp*N^*}iGh-^y)WkS@-|~Cc{|EqB|0p%9|l;;ibk~N`i9!qd3mQ}i!rbgb|v5q9G0-w55hUGr2Y*9C}n>N#$rZD zSW1hR-2RQ=2R0^I6;g(RP7@%l8;wqsJK%0k|B z{@?*BkDJx5f#}I~-Q|9x+|0MVnmqWKUHT=Eyt`p=Kn>(YdF?R4q^!f%nw~^wj^54t z{nRKKTatur3;x2t-w(CI2;%43ojgJGRPU~Q{8nnjVq!|zEX&*)q8ArB@cwJOcIN(8 ze#mG~c4L1&RwKHv-!4wuZ_14!ewS}coL!~t=m^D~R6qG~;98;$_tK9LEm^$At{yZu zZ|NfJ-J@|KRw_R9&OP(I%y!()i zQqtR+5zYOcx%UZ|`>d+t^Jith4!plD6{E5BO4$e}Z7c{WD<7S~=b!rX@qE6m=sAjy zlU_{dKC)+_=FR6p%rpL9%&MRfITMu(PF(KW#U$37E`gM~LVt2! zW7J5IQo=^9r9!^L9Rt%1N;XfpfgAe{XruC zS>!Kcwvs$tlyf)9zF3aU0{=?tjYPh=9h%M5&Od2$ zIYo6U=hb2NzoX6L@ZXg;%dshOd(HZs{WtcpNpZdA@f6Z0h=;s_gz?VX1o8i_s@Pb`}Xqs&Ewqs9VuZ#^J9THzO)MypDpU^h`fo&FBI1S-yWfNNR$r{ z^^!z>9ycsy=Azw1vAl^pDq*k0eaMHlQP|lm+SL{H`-;4ssJ~cTcm4Q4Ntm-({+fCJ@dN02hFw}KxXH=r2hHH2}o zyF|U>e0HHTIxJ!31p=O)d)N*iLc*BsZ;oRIo|(q=x(3y7JxkSe&aZIW&h?HQ+r;_s zH?;EtpO}Mywtjt)x1-0RIseADKOB{^3!W6fB}}c|Y%X{7Si|)il`T1c_IRIsDo^UY z4>K3|G@~^JQo=T94Z%#4vNbKPV4x(dqO&DJl9cW5B;hzRcT*m(@4uk|TQl&vWgE;K zDZ8^^3)lN)wiicl3G!NI#hl?OZ@4(3^N(=_0LCT;%{fPaUtHM*V~SApev)IT#3Jz);^E$ z-=w%PSaQHK&e?BCKK9MBXpj}4+oKHP0#5!qKdefgLo_?>fq>Xw2ZlsK;J1!$02 z%>$}eTM@I6@cpt4k#h;($CrigXaqkc(9XFUbld4`*3{nBwgW=Q?#qA?y~*zQl8Xi3 zK_BH$Y$UnW-4?&d-pAj0v#I>jxEEH`kNlvPVJeWndSSMl>=!6RcOrTE#WNRvf*Msl zS5k-E@7kP_JK!7Kd)i(CRXRIu`6tk|)oK1cQGO-u@unN#F9s?nn1Y^d9Byd{c~v{x z20Di_`c~)8A2@16HSC*fD>0adyxM@hyP+?0*Ci>1n`!!6RV2Nh_CTh091fq z&fNwR-L+5U2l?q!_Qitguf25#2Lqh*8m6D8aoHbjXhyvC;25_w&^cEE-Eu)M=jDE+ zcI&!#oT7kw`#9B zKi&I>=t&u0q++BjOWgnqR>BsR81nN{*5Uzk$xqw7qjRbJ#E#4S++%%psXpen>>D2g%j`xcCsi^0WMYqNxua4kSNkZ;CZ1eVK@ck<@;!Yh*p? zr+CdUBRW%CX^s|X>AGR(s6RXMtq;?9cPy=6MgCl`U(~e)sLqgWIb`>X&c)Y6z4{&H z>w8XbD{Q1vHlX4wUx&Tsb_LRuvWo4m_<9`I-mHrB_s^Qc*PpfjK5U#)Hg$Q;I+70> z@ROf+{j@e9qwT@Rvp7m@nKPRoIr-TOP zMOcTHv>py5I?N`&UFPi2BK?wnHhlfBjSK8X_OENK<$ji|d&u`0pBf|X*RoN z6XMvM1A@Iz@A`B7aV>=M(butE!v6BTmA7`X9vaxJ>L9%`&pnY@cQi+36+vX)5Xs66OA) z{yS0L>@PQqdd+?}`}I_;hsB8h{_8oaS&vUElsET}Hv_+#DTmGA4aN5Pv;mJKAh*ju z3;2~He^Bgaa~__5W|Z^k0NO{?o5TlF%7lib?7b*&?w6m~-qz-IAeK)S z<|x#I5kD6r-tHpg*N@+pZX>Bgx?!KQ)x&A^=nn4m~wMEb$_(QPwa;Q0w~1o@xv zMO?nTNYHm1CeYvgzVi0gI`{uXdTLr5xZS|&DlVUT?gi&t$~@umspAk|bO3piVkx(~ z*O6w5l;srm=K7<*kK_F7WwLNs%BGK6gqec;$$B$hu9Nqfm#3s#b9wnsKXefDXPG(o zFJby)Zuj7j5)6=(%~M*){n~S9Dwd9f732oJBl=+b7%U;&Yk2&^Ou+p3`W*)roTJ(r zBM?eitDH-`{>qW9xgS&NDmeasedHCk7SvOCrbl$@?of`iMp(4LmWF(p)nKk?^k94^ z;`b}(RT92kU9$i?4Epn&PMSF9oUla#5b@~XIB(*+=tw^izSwIK!`nMw`N)FG*Hrw) z2~@%~x?ZuN@*Q8DE)x!RdhmB7+1)jBl{e{KjC<)sdj6|lBSk1>V{}435+07)SapH; zsWq=SPPz1W>PEt=XL9CU`9k__?4DJCwm)vMi11vE<8fQUcTFueS`(h%EZKn@Anc=K z{^WHAb!-TFN#%i)`$!1SMJ1TZ6JDQPVu~X<@blmVmn)F}@t=g1101euzflSFP}sst zgu8byzB(`%^!m>>IcgI($7&a1u6d_LlxJpsDZsD0xDD%-Qr9;mwg7I~}cp{Mf-4TGv2J z7OGy|5Babaw&O|9$u@9c1LVGEhQ?)phVPtmDh%@cE{{_D(f+dTZwnv%kubwsi(QIQ ze!#ovL^aAsX}Z`HHDX_{pLksZ@{PYFaW~Ih8Rz-%4lA_%`+deO#`Qi6e^(4_& z4;&Xfg1oDKbr( z8q@rFkUgml+1q%+zW-`ax%#3TZlH~e9Ft0*cmCDbiXza3J6)nwAumxg&7$_kJRBAC z9rVM-tF5LG9X{G>2K4$!Rn|I!I=7z3Xx_&5&-q2`#MJ%U7+Ob>?O#R_J#Z>hpXRar z9*2|UXIksJi+o+WWt9?La4RmJ^r~-HefYN)U)xECuj~HvAF8be|FM(8d>RKC-K*O) zL1VW`e~|rd%dT&y^N8u|5_78WT}2zYlx6gr0%##&o{`7+erYl>oKwp*(?XK}9Ml~F z19_zhlo^+@)hh|0Vm@U``2P8;{UuKGG_`p?W}l@J-+%WijpTNcZsE9!df(DkV#5ZW za#G;=i*AEoaeFiGv_-_0FwKlU0Jz9&U&`a>%V{18F~kR0yyyGdIyZH`e+JhW-X!_N zS~^Go7bOVimI+fZtl(vi3i0i+Iw2eQd$fV;jqTow^MB;9-9r9nH3fF;3$KLpK(xVQ z?vJ|OaxVAGPvz9)pm5%J9(jrL7bM$x92s+P8}C=uDPJ!C)_ESMZn}hAq)e&d;}f!f z+iMyhzxBcQxW1+|7J(S~nI&4hz5aHB|04>7_`Fuc6GsDJ26kR^K#KPQ8#OpTHc#l+ z!3l&2CG3R}%s}s~tDqk+dk>c%+Cacs!VZ@pOrTunH31_DJGflXlUSB;`5-5RA;^C% zLHdcx1BLNekwM54{(sQoe%GFl=lZS-*K>KiA!SmfEbRu4&7gG+mrh19gEXt3IcKLA_@*zAykA0HTp(xj< z&j+~*eQxlzqP~MTAErzYe_K;5!>%SKD zZV~*1-hH4Q(wkx=@B`_14|(%B#9Q>IbCw`CuoAxWdeIM_Zh*eFI6v0M33?5*t-3EOv%4hm8hb4^&Uy`txu zQcjoVeBkoM34)#KZggP7dnx@0US6@o1}A&Gdoe%5<)Jo$A4YqzJ)_;Hzlu3-4;s*g z>shor%=IQ`3;UX%~Zn&LtZoR6FNlrAdlA{l_0eD;ln0g?`^0jI)HOiS_!u| z;7cbM!g#rMtA1w@se zm3$<-$IpG|arkwQ;n=`{Q;)f1Qu)>0rAEZ}vza}D=vtjBj~&Joq|}`|oPB zs3(^3obIGETmv#YAyKc)I{rjIS<}`eRx4p9(>JLshF**8yYFmU;(f@?;!b%LnCEJX zwN*X>HyMqqv&OmN@Ajs^@t|Mlq=m{>;+%L@v)~5WFaJ8mtJEF)d}>#J=~UnV&$l0! z!vC<*hq@Z?K>jhy)aO;SlpXP$@+V!snpL^Qj+(hh%5#%oDg+P*5-nK9zF&R(2f-o4&azvlVTC-u>S`Jjn<(SzSlM?Z4!EnGet=Mhgf z`=Batva4r&w=cLC`sT528~UfSTX*EvT~elbZ?)OSId}*0+ShFb#xEfFp7OUS3EQC| zU$SE({EC}#cgQcC4@_0hJjXZ&Ok!CyU#hh)ryc}<;a8289caist5sX*95-d)!>Q!w zfw*oC(0dzKwr3=$)pX0AbRKEl^f0t9{M=oW{$LQsr{<3T^ZU>r@3?l+JJ{J(?0jM} z^yW`YsU3;$l-=um(@N+)(2n!pgn9v~#|NrFUulu?2{X_`AKcuw?!o!tSoZp{PjUY< z(|^MR^h2|++k{el&wDqb)fF+`c`|y7SHS-B&`potf*u_=vn#C=Ij{X1v>s$j(s0F% zc@}?MHWl>G1I5R*J_4Pcb7=ivns>JktwV#csa~YF@6pc6-QYd8%O9focz)nUo)`Gt z~ooE(;{gS^H54Ew&MKX#oVouBK1j-I4_VtQMtssg_I z(Ncx}cQ7xU=6D;9fc~tFl^S#|J-kxmX*}1OX8o%F9TxQcgJ>`}>&rdCVZ^+Lr2_M^Y{~gkN5WtZqXo2fW zP=gk`d3?E<)|a1OZs`j5%GXrh0SI8<8?=wdr#9=7dEUn>{VMO*oE7>Au*eJ4-{bMF z^O2hf%$OHj!d&T|@WkHNjLO@Nw&v%#^_zzy@FUMK$qfh^`$nh5#iW0$p)!&5!vZez zxYk}et$H{!pKn{9Kt-_?z3U?7x$jhm}v{<&`IfaNbhdz~gt%F5VmmRR1jJ z_`zyzAFkKgpI(??d{$`nC;M(EpL2duN)?Z5m5v#F+@FQW^Kti{)r;4AFo}R9)_FCW z2mQK0z+3vJFc04FfC1MtiWG3p=$jaR$oD=F^hP3z5}$5I30nzM^%C&aM%?a^KXI=F z-dh&Ug7>q>^)zUIlZ{;e<6WWM>7&st$lII;?0}um@q@YFgIhh|@`y2ZT%P;elJi@R z6M)7(R4U-aXd>Vh#Pg9)p};?&<09-jXAA9|9xlk|i|3-{bPPs4WsDBdk_~__&{y6j z)Eg8e$Wsgj-da3w4(li2uSFjPdEyFzW+)2!T6+cl^f>`PZdRj%nuIMFBaDOjMPYoC z3ILBF2PopSCyBxD6>+;ixefk0e`q9OFKO7}-z5>}*U>P8KmI__i&hZmE%97vBi_Hb ziFy3=ae}_{6>0$WbOk<0#QDkRg!)xjVbsaIwbH5(}eQVFNATwWGu8-WYwS7yQU@B(fKCmnco-2V;8bmWVhIaPGUHBxe4W) z-UH6Ue)?JA`)p~-=ltCt6=)Fqrwn~??1QT@ZBQ@XUYHlD507(s*tHGl5b|7uZgIZ< zH*AaG`+q#k`PMz>ao*l*Engq;wZeS7aPlTEANoa@cOhpQd3&K|gKDY0sQWbGkf*yq z2OkOh(2Y)hh<}SL&~XWiPWgk5A%3Lf@OlHLyyWFZ0n>Q-)M#6D2ytW1V*q|BbLf=9 z{d|7N)$e4HE+XQby1C~l-breB0eS#Ht_zV6hwJK(^Ecjdnw zv2h{4H)_C0qCL}nu>ydPmD4^DeL8&$-yg@F)_6nhb8b7+T}XNrgLllK@&f<6&na%~8Fl<*N6;(VWN@OC zva2^EY)HRpfB8W2JF>82FxkzU?Nmnj&EdM98Kifu?KK0k)2k>GO9^@Wzt6f-Tsrc$ zRqa>M!5X(Wlb?TjwL3uXB^-0B(mj;-N;SSm?_%CPeD;;{t&5+$TONpb ze`m37H0A44w#G{d4{Qv0>qPy@da}=bAn4m_nc@{02E zp#z*^H-MifukrQ|=qZg}7by>Xqp0$wC+Nh*Ya{`XpHq=3qI(6E77J@0mgByw*E{8P z@Y7@PkhX=uQFh;T-1-4u1u^;i+dkvH!3{}O#B2DK_Tlp|;FqFy@(j{J3$luT9^sr&zg%y5*Z06XZI1O%UIZMJab;aA_$9aY^QU3JalP6F zbkVBA_wp})7m*I!y~SdwcP;jV-I@Cqp#8Lx7GsO_ao%j4F*WQk{Py&>${StHhH2im zJP}&Q(j9mAOSMA$e>Y*t{TX;SSiMJKfiBLg*$r|nJ!+YqhV*Ox_B!Sse0jM^u!ODp zQ1`{-GVX1*SdDf^KbBQaXcvs}@lM^Gu@~d25cp->etqmeC3&WXlMp9ctIP~2g1r}; zmMjI{UQjwmtpek<^u>0UI+ZGxztOYz2$xQO9PhW7XVAGZD+UOWpGC#9hp>Ib^*!=6q&c|xv9QX3D@#!Dstb=bzsLRH3 zmM{B5JE(O9b1LlI_+oPv`;hRm$2{QR?nY)83NXJ4PQKDN!8pDR%sG1$ejiqk-bm-( zTVJ|$ARO8B@JZ`s7~h8-?zD)5p5MDGlW3j9mHADlbM00;Hh3bay<+s7&@PCZjt9It zVjOZKdi5dujR&sO>!NZG&2RPo~;GW64G)_?& z^E-jIbx_+*>+)&-{7JOlGyAG`p>?zAz?l>Bknb_ybdT1jUdRm@I!~X>nm3X9yQqit zSH6C#0xao1rG3=P%Key!UFSTz(H4B%p$(~Y9=P5A$SlJBN4B1wcN+6{Ys!N2>mi?K zch0X1^t-*86Mhu@^wS@5sC~(nOJ{O$zAd-iF!>nHv-{unnlc~j#mIWXmaQm1lDSMT z19W73Tqp8#;kw!c8ejh|tESLCm9X4yCGAh%MUOa6Te~O5m2kFMltUQpQ^^($h^WYW zxSU)-ddcICPat~qkz!#2W?x2E$+8m0Uyf2+Qbo2`O{cN(U zBG2n&w_YDf`Yv%3r;&bTpH<)KJ~rvq03amfU2?;C90|(0^n&=#^;-6%H%o(FXkfp6 z++-Ylr0nczi9pM-M5muarLp;K4f`wF{g-_Nf=AmRSe5{*L5PoS!JSg!e~z zOEuT;{-+zaJLRl1*L!bHKYWoe-TZyr&#F&{xqSV;w)|YsSS#Ff=sFGtu)#g+hVJ|v z)^j!eKpgqBUrVY;9`of9_xs=qq{YCWQzih4d8CHxchEoI1YEUJ1;yaE*9$o6_`K2F z&(KT|*bAj}Aj&%|67-F<1-(?0BV1l_M>t2gwI*PR{iiPo==UH2_g79W<9-`PFXZxv zKa9EEfhcw ziR*PL6?pIU_0m=X7VOaNnhW)`Ii< zqOt5zfAfMNoHy;zkMl?3>u{n0-aHb_<=geKJitGe&_h7Xmu+`AP7HUASx zja&hXpm*7IH`hDTS``2r_vTwW@_DvqsU63YdN#ZG`Fj3vPreQ#cYe+%yYWA>zmJjCVcID04NR;Cpf=M+_8o&`fx*wu_b4{`4a>}pVzfu%R<@x$bFNr1`bDK(f z%7+tQ(*9?eZn=}%tqsqKBD(bO)hsIS=HAzf>_ktQA5QzFud&=Sy1(z)_&k#IWCz~Z zLwW{tk3C{kh$|d-a6hCWov}j0N>Id-;z1=&n_xPw~O;$OLSxz`x2i zEysaZ%sYB|3+Uw7gzJ?5DeBlt=^@H92dJ>)0g!q+k&NsRBPYG)?fBFE*$2f!+?;yOZkl14FS?Kq4&ia}P z{;Ge1-AwR-$&Z~Z!9Pz6IC2^F%dU3K_yGQN!NW0QKrMTGOB{eW-onVIj^bzNP{qlV z|J!Ad*LDwZ!J$X4Q#6FPY0FNfEV2!8*dKBdf4wet_Rxl zd{)1HF#MYtpXf3Ixa({?d5i+*RaP6Mp&*y##%WPVd$I+u$6d zHh=C8FW~JAt(6f2abCLUnB`c2JoTNE%TEGNo|t8>7jp{Z(6O`J>+#52MSf|TxT%hr zb`Bb{6nOIXtnsgRATO+J*wVG-^C~u`XI-67Xf4a_cRk5{OC3{VtvhygL%uD)*xGz8 z-hEe2S9za}-$NNK>E_;|o~duJznFWqmIa;i+UEJJij6v)Qf&6KiuF1(b@a#~wXEF9 zXVI!j^-NRc#?2u!YT5pm!=r8fO4;38y${Jb)UtKD87W)m)U)I2>UCkK>e&1>eI{R1 zsb{Y*p4)VFSshE-m<#GH!-gX>w|yDh4gdUb5XMc+@_S`}ApTQ3g}!nno+DgAjn0Pm9? z$+vol`53;y?{|NkXPj>vM@<8ce^&popL={2GkdVQ&n(Q3)3T;5O*`V;)@8uq-MKgy zwKJ7Hg>~eTVy1cIVL4Onq!6RyQ^h2Yl@52neCXy{;`s`8pI<-JDIWI+rGJ}F%5C_@ z-Y)8TS^s`HbFwnt`pyOCpAxD3{@&P^4X-;JV7?A$npsuztdu?RGPmv=S;n>&`nIwP zsA4@Tes`S+yxiGIKJ6Xo{_YotEXVmlS9_W3W8lfAS3`O}2cEQ!bKErp?Z!;m*y=T? zht&xCqnPJG^R37J#QMlu&8~mM{9o|p@1D+Bw?{TSxm5u@gQJ_Y>T`gLKM!^B1-{lf zU@u$>Lg3oJcKj`r*lYhwIItFJW4do$K&+Y4iM+f*a3zSHi^QTTgc{K@h}_%+RXtwJ2y-#%n>%|-YV zTxr`t=k4MX9@FWZZxs}|p&Yzdy|Y{s_^7xyhX`jLj52Yc{V%I>*HXgq?^lNw(K$r7 zq-~fX=%#iz+I53GE3R`m-M6LvHPI-8JUeK2A;kgpM}IZ7FkXJAOXGgR|FzR{JC25) z^@GvH)P9~uzXK;h+k~C$br15>-*-0ILGM_@x-@F$akOoo=NAD{TT*96dx2Ez9R9CeQed!S>%^( zk8M0ZopAp5U5XpJrPoH#zJDhBaXH1AhB!53+HlXmu|pEon`RYwhWzY)_`Wgi&vW&H zKhSw#Oi3|6w;ivtz|}wY71xluDbTyLKXwJRfBE-|qZCJEu5>+2aq@`2JkdpnneA<>O|{nMoYXgIgUcj4!OAlHjX$l|-?_Clf>-&?jIob;m`YSxf^T;hcu z#D{$~=j}@sW5<$S{FN<$bf-lgnIrvv&#AI{(Ro8*5iwsAk!o)BFeN|%qvP~|mT&-4@}KCzDW{Nm#l();+jFxi$f|dd1gExL8;KG$6{!ZtA5Jk$K z+`@Ge+M8g8V;=O9K0o2STp{2T_{Fhk7PQR@doEuxus8R2(rO|9JZ?0m0m>)ozT)Mk z3x)bmuCC|ji-;crK7C_?VTaz+BZs+OXA>XJ8$?@i-1gefg7?ofC5p>$za7rM4;woh z02#Pv$SaQLdL=#J?RS_S#_g!|&g0{4tlWX)POI9!(R}=(lz96+hXU@Qe`9PhJ*fR} z0bDO_tfL|Ccjk89{;UiKehvvfE z^)GXOHr}3!35a{52^%vBcN)7`DiW@G;IYJ?^xL?`ji&ObyEb@8g8V^P)(6tF4Rg6b z`{1{gjhdwA(4iGy_ub!Jz=Xm+_NP}X()Wt%Crf#cx$-x|N#47~DMecM-%A$ckY9># zZbfq(JE-Nd9*|Ex8ZS@nPrj}uPq_1%=A|z5Za~gjy_k zXx&}EDK(>a$_Ms_o}3E)gwEN?lowt1Y5ES@XYU8!89?nfobs@ze9F?Ayg73qKmBBW z2fF_cNZMUY`Ofg7g02N9-*!FX0o7Y~xZPs9A63q)tu06V>3QYDcEY0?tvx=Rf?j?! z8*2kTNOA5iAMkZQ8^&oMt{l%DGAIXp%sPqp6YS50cZU@kB5p07x*)R^@_?7MwaVw+ z!oJ;im);n(Kg~IAvNq`OOLhvY33p!3Ss#V_ z;vHUtn))%|1f9%va=Q>8?_A7FF95FY+%s z5Z~uUOldGZ4ZQB5V>`qZ<5kxCo`FgoE5H1_buq=$j*eNrCb)QQcQk#|y8n7qlZj#&=OofL4ao-MeZk>(7%bYSC&J=wrFPdBt} zH}n$TtvYBHS)HwCf5%w4wF<6du~%Pw>~Xo2{hX6jq8C!eChORBx)@r;vNLtRnPEJX za;s(Px+6cArkkP>Qp!%u?b#!>br~CZ$LT_7MJ1bDb7Am^w#cI`xpI3`ALRA#zO~MB zEM>}iSHf=g`No=V&3L@>cm;c5EE!RLjQ0H*-5YhFziO4zIO|eoH~69ME6-9^RolJT z%cPuL8oEBH@5L&%ZkJs|8E{z1`c*sLnwGNjf4v5uFf3*3rtX_?&83XF4ZEO{SXRlZ zU!2_L<&8Xs>m=*%x_A%2^}SOg=23^tO|iasCvw8K#q_SgFX;#04|c$KW#@D;IAD%* z=c=gPQ-B+{eOErMhx5ntMTJ2-@V$4A94Slh7;cCA4)Pu>W%e1ZR8@c@FGT%*AcOC} zeQ)vQxv*m*JGb;W@Y%G|_dgSn&%A#oI5`vJe0SlYKTenh5HzVC*`7X%>WP5b!8j{{%ut*syJFX}-%`x9RL zZ2E00;he|!N4F<@mY~~0pYBbLP78~=4%)kFvP&!I&7U*bmh?s}oGU|i<+4u7Uja2f znijqd^yr=UDYPGsYh!SP_T3{(YV8T1RvOKpegg6z-=lpGfUj+D_k-|g^!Q6>Nnf$` z{w}mnK0I@?Gwq|A%Su#ef36>Y+n4MF+@(LngYUt#0kE*&*!bZmeOM>@A)Z7d8ZP^j zp8bSjJRfqUPrViCIVbK`qyF5yKR2KB+DjH703#kKo_Rxb!N#u(NN+>o*o%bwN|rvu zg+J!QmVE~jdvUvvC&|I);sq+j=YNg4UG((p2m>kl5%FV=vg)1L6W z(a0roJTFu0HHqha44u-%{H7PjePwf%IKF&eJN^LGJF5Mj$7|bDjT}GbZ|~3VF+23n z;d+a!=kWYYuIcwKr2jWKhqu4Vv4+>%vtl#HVS_K6<^BZr!mvYcOqUa!-#=g}=Z75c z!12O?hXNkzQGs+b^nRuR7N9?w$@m=LE5A|9Ia8!wdePGT;OB3TJjhf)IZ{r;QfR=N{c9lz;8Em+P&!5q^&y_Mni@ zgUP?%OR3(E%$B@gKM$YgdF6`pM|mF2_Rg0~Dp$+NUrygIGQywxxy-wYkNfxr;qRr{ zIxBPhH92Q`2I(Epw&(VeFFoetJ7i%jZ?E^49DW`!_j%ow=AFik5F|SBE|P6YBYNaV zmL2(Tacr6z*-4LkaEa~*D%1jFsN7RQ_LIB48kXmtu?QcKCrk0m@Xm|(JE`)P>R}2oP z`x@8H!{3mfC0CB~^|t8t7rdaCFvk>gOQM?&#w63d?a0O>S!8d`s&@V89CfN@w=2Ep z3hi^sl=5T;hqrqd09qe>4?lqfZfGSFPI^w4M&M!_?;5|(y*U_suk6GQ^FWU|9qOSA z8rac(9qot8Yd!`I18-)qeRu=*%ZP1(Jvw1O4}7y`E&cAq(@uVJ2K0VD=^JMZ{zc{o z<89FUdrsxteB`5II}F=ei1Lqptkfxgw$0(B9^KP8U3hnNGx$>zr=_`I|88?A{fi;^ z@P(R(TcCWeTxMz__&Zm3xYB2-*KKAJuAx#hJ z5$}HXAL2OX5pdX=%EKLjUsk_ud-yK)=XoQPRFe>oZuWfg&I9f3=o$DYVm)y3vb~1s z=+AKr|1a&4AMn;^b5cri{<3jZt^ocRW`Xw#d+~dz;V+U~AWr!`?p3l6IB3QO70Vuo zdpl-ynD7vB;H5#rquUi#tY6Y+lLpvReEi2?4E!4J?|;h^aZj=$dX~jDyc;b$WmWJT z=XHxo7i-?*Jx|H=XnQ@J8^7kLAD)0jwelTe(e-VHwRVR9YY;Zb~Nk)4zojZpBb zhuwha#FtOmuBehda(UI;cLsiU*87uJWB*e2wx8S3D!Ec7vo>V4-@0#jr#3Zi%l--$cHaM@ z=fEl!IPR;j#gJ0=@S@DYX>g%hh&+=_dV~Sy%`3~Qm`AuDziw^R zVLj$sn6hML-)>dxd-Y!zYvg^Gy>Cz*hWRwZ&~u1pA-#LWTug~{i9=zVToEhB8 zeGpn+$+U~QU7pn$`T7NI6ePeaMh-eT5wII$9c)yt`;FOH&xul4P|oCHj3y_TNZ8%3 zF=oqvPg_Wyb@+jNufAgWv!72(S&;vVsU9oJSj^7*okvWsVoGN3^;KavbK<7^X~41Z zvHKQP;r=&#oJFuU=JAEXTz@I>OYAG#PIQiX==~w}8)!HGiV+teA8U7~-vsEzcG|r= z66U@;A-mCL_&Kcm;I$sA_p#1K$Nm~S9(wBOGw#QN zPSqR!Y&X`!xS&rVp;*sz(*q5U17A&8vHJUE=&!l&HB$q616NMCR;CO5S#dqf2Irc7 zh5B|9j92HNQ?&i z9pq#^cy%JX?_PH9Q;Wtg%Z|DC|{)R*oQr;bm($nlF;;^m2iGh0oJnMM1) zcdNWqvePN*C(qNpoH=wl*_)hdw(ch6#fj+-)UOolA1z4#?U;?;bdLWVqO+gkS=8XB zq(JcQ(XuB9A6}QXdQSS<7d|bfadWqIMB)T^+gB!#sHJNZ$1m*{_T#u{bi1}ZE;nc( zy#W2wmlAniQQh!e8`75zJ;d=(lscZzf;Sj;f$I&vq_&Xw6Lt@IzRA?wkLNi)xZdWt z>0UQIUQfU1^iuM>@5en{KVkIv1Jq8vlD#(7zxAH}z$Egi$z$;k;Pdp_GU63O1B1BU zICYL&9?8w?O!Cj;WH`<%U9^tlmm%w=9OtOL`@{1qA;s-EUeSz~;dWE)bGg53Zpm_d zrsM9!@lxkbve(Fd+@?QV&*l`;HsBvW6!7F!r)wOae1CjoBgt>}6L912Sx0z&Xw<+} zy#26I6L`D2dA~hKZ`YL@91k7O`o;YkzUw{LyAfE-@ssSvmt#q9+1p(_@072qSxkHf zqZwAzzvR~u{5+xdzHS4}3%QGGNVwsg=+uta-<^1}Cm)|lmB(nF^*4PUL*w?PZ=e?G zO{&7P74Vz(cICKl!rJ|5q?cw_s892*v$AFr*^POz%Y^i7drZOuQrtUCzpF>{`$N`O zRsIgdrI7y})Eka+Hl&w0`M^!mGhSOiiu5M`%-BQgui&g!OTtIb62H7BJay#hMjKk! zsT1$G4gkMn^YBa4KyPbVH&FYBGxxP4{YwXR^y&BB-EKdL|lJ*;mVdYjH!o)zZ;Z6UAm zxlwx$>pyI0<$gM!-bt?BNb8}sZOB%7cOG>}VK?EY(oWCpy`eYUf9s?-khdK5r-K{# z6^4zoBC(ITXx6s5gZRF;ZMx3j7q~~8H+y|K$}RdG`mho-ddhv90_Z7xOsI&$eZ(kD zU#6Ia_u~cf*S}(4*)}l5T>*AW?@f@LgI=F=?X!Gwo;TT5tR;_g^*KF7Z@RbCA35L< z?KdBXUa*(|z2pfR;X9yL*?1u%68meL8`|Z{(93q+;`tDI^}*RIMnNw)d;h@2IQO5} zE_2KV`J+~e`wliBU$i1?%;&av2Q~NR>n`tbk2vA^y^z`v;KfC1H%~pQWjYy3u`1A? zeZ;G@Ko>Z!-=Aq$cHr;&_S8&F&PTt`jL-9*TgQwtyLX<5_g}lJ1N!@Q!|x}S`5f7c zJVD93%&uP-RI?%9-^U~;*ReOhqxW<|dxIWjT}$r-oEqP5Z?|xqBU+eheLh;v?47f( z>^N4(JUZ|FlaBVDxvYs9fVj79o_62$o3L+s`F(v6QO&wf-kUxLxaq|+^_jJ}ce6Qg z&SkNC8QU_?W1qwPD)xDroNEr^b=mhdy;CR;RlH{7@ZY7Zr=HQv_oih`d;J3om2Z`7 z?6A+JA;=e;yDa~6JK8hX`{YrS@QvAy)_d*HyNrdt+-jm?R>?N6*=2Gg9lty3?Q?!N z?3wjEI;Uc28S}kiwA9$Cj7_-OHZ|mR1-qJAbl}BWynAkWSmqSs`LPwBSDf%JW8u1y zyBZgiu@#q=`&ZtsVEc7qE`ImK{4x(L%Ru|KuN2%GF)ll7yU8Xa{vP}_IVBkL$zWG( zttaB;`68E1S1=FX?|yz%8@MHSk$DGK$O|Q%Q+nh6dcN(^ni1gh4?k5MfH*AgW|7>w zKl(lHRDl%tdkd4>Oi+^|-VENeI2ZHbev9tY>!81~AZg4(;1AD7o`1CP&hK8oA)^++ zUf)08yU@AfSbg+{9l%4u7JpvVV|=VXOuJ~<9=~sj+1sEFJicJRroI;DnZJqJ#!Bd& zQ}{L}4Ls9KZXv-u^m;!xrW5S6sXO(VXz>*m8;kPUPk;YNg&%bT95iIGK9Yn-rhAME`x8pn)=xt z_~wqgQ}27=>zlS;`UU+DhCc#5p_jDI)7>(qu;Qa(wupCgMYMs)K01(`N0P7J?5NTI5K1 zmg!b&qv(FC+f%uRl*g$#GHnFyqlK$fTFeJ+y=0(gCa7{3tAVsH8aB*fb zpow1s&4NK^{;o-T1iI*3|76-{C0kpJrt(Xhj9-ym`7)Qolozs7ObDX>w)^xhhV*VE zCK}Q{cQLVI4efKQWAAFxzOQ!DB!~R<{W^xnsbM#Fbs+w+vKo(@??Qf?5>6OuF$BLj z$9?csXMW%CM&6j;ljx1z$>V*S*X!^XbAej}Q|6G~;F5i(X#YL?Fq!9LR2Hd^BD*Hj z55FTnsQvJiNNv})zGajc;{$1lkdUun?s!+Sj z6%Nm$c5-`#a$NU5^T)e?aK9? zHEtu??Y%PFo7Ul+7IX1{5_!a}Nmdf*PqSR7Fa*3Cb~<{0uRs5bUK`lmJ?+%ebntQW zwny1xU)q~F$ZtO4Wl!6bqCbd#IU8D?*n{(eUN=>r?x^3@?Bt?)Pz#v^>r&`FFw!t7YN6m7Ko$=70WGTOa4 z_3BF}v>Vj7LDd&})~hCZtpiT*KQJ$6ANpfEs*6E3=p;?&p)t_w{;+4eixT{Ol+Dkj zj(8VR(J|2Ni!RP<1u{pq5HGte*yy(v@p9dWgP9KwRx_VRPyH3~ete+Q_^~~4zwz!` z_?b=E@1G1bj`l%3?_&`$+NY$N&GY)3q;a&4g{$l~b;mtV&yZ_tu4o{ipPzg7^G^K# z0sQGS$J?leJ(xH!NA+qQ8#DUm*ts~52I$Rf_=a|?W7{lW9gO|yXq&(nrPZwO)2bhB zBz5d+`-qRT5f2mlO|;MjK5)2DF!Lh(>lRbld1H7ri+g)4=yDnIAO>p+5|@{;l)|DX zXA#epdOd%)`DO)EQ)McX5iea@3~%=p@p8oHYc750PXfpSTF;V>yS%o~4h<*gd~~2Fe4<*u+uoowkHku;BK)y7%|NdCDPWhKV}f z^@gl|e`8A-Q|X}>SyjyN^ z2YhcY&mOT7#I=xPLq1o8gJT~s-jT07Zf(ar z=^5etCJggN@$Au1RoI&{*=JEK^uB)8+Bgp9`8yL@6s-Y1xRX}+isrG#$&7W^L3bYw zt!jYXx8J53()+%jR~Jrv4Zq&zEl#3%d49u>V{{MEY0>rs6U^)R$6md(g#33(tIxNf zm)X53Xc_pt>TrG9=La0~y}k;1pSNBZN%=zOKEv;yhhD2q#tQWJd|a3||NZ8@#_X~c z@Uy+&knLuuH@j8Zw!WZshi=@Xxc|xUc+xZQ*Y|ZBy9R!KIh5?_0Xx0Y(j5{Y4}LRQ ziS~o|H?kYggU@Wb@q8<2t2IUEDPC%MZQ=3K-1?6$#VJdRgWD-yes90*4c()3w~{Hj z4SFWzKK_(E;{LIT-$}2_aIZtOkG1b_>An+m(f001*NIn{)0Xy6#V-!Qq<7VC_wPE; z0Xu(>T?3k&I0!#!LtGC{oJ#i8q|X#-JkAeKHKKhiq`1|tRiGIweBz5i1HL#n(m6P3Vh$J_v=WUmdzd0yn4L4u%JbYL8_g84&-tMf<<7MCLk$P0G$IOfT zcSlp*=>LEVaZy(VKm5Y{IvnRre6L++U(x>Er~2LmvUg+F58)izE*cjSct^ke(=5^( zy?jd}oev{xRk*#i=j?fYU)5lCHt7X=_8Lig@edy^BU&F)#@_+7)zsqcwaxV6@i9Ct zhT{moFS48um^zoo$#so*sRlcab0UTF`Qpe#;`=Y#%Ka%UKgVg**bh9e+idJ4#QoQ+ zx&H2pI37d)$}3B*mk~Xc^IoB8oFAgPipTYDId~oey+iox#^k45E2KBT$A9d_dC3#N zBFG!eg?o~UU&1?a-}l$K-skJW?`Tu&u5!K1qS-U4{)}r+`Fo4LYAs;^@87zQ|4ZX_ z`P7vXikD-0?&-iqJzH2|7wE;A5W}G|7$6{V(?3Jg(;G>mO~9C_`k9P$`N;Bn`HyWQYivlA(l>IZ>n#$&j&BGF7Hf z8Vr@0ROSBYp=EUUVH6n?X`zbF3FSi z(Bf4D#(_V3ZWf#eTyyAnzfTzVCSP0-Y>0V!>HD?ohkk&+&*s2(vIEMFjMK3u{zT>O z+rejBd~SF#_6I}`X3DFu4{>dK)slSV^V%+R_8{;txBPx-0&s)S*>aD-zd>C5BLeHF z`;D>w_Yr<%fUghj=Z5c54W)Z4i;7QJ(|tP!m4gG_FitgC*#(mSBP?)MEZG}3z8;aI z^Cg!8r+xkad!Sp<V z?SE2sEa_FFE6#`9zrD7*I_BR8Wh>*m-^DqNc4HzN*W+HspYX=*Hd1EwYVoqmkTa+E zfSccOzpkm3V?qJe>nEm)f}TggPP{zfqC#KvzX#45ekhld{H=$Z0JrF-1$4o@7I6H} z0awgZoA!8xd56JIP-z((hjK-%xzyAN^Fv~5@%6dTZ}eiv0eisr>6hZvy<@Rn47?N) zaazK5|2e!c%1^?aI(aPlen!F?-Ppe9Dlt1hCVQIyR0-3tT@~CtPr|GhuW9|Khm>jf zH8_?yO4!~<;W@3BNLZ13!S1LAF;g)2>t}#-&hu_}Y4|fy%%1G5>t&xKVQvG~toWiS zVZQIeuAkm2VOIO~|N2eCy6Z}}#iv|Q-jWqngKNZWT>GNLXI&+1P~hjN69dF7=X--= z7UuuQ4gW6gDy?DpQ|H>=#lDF|MQi_nkrI}EZ@KUEw{`5L%O!)|c@?aAf3Jq}OxPz! z?+;$?U%^rWe#Z?os$l&;x|Jlgs$f;$jMZ25s$`uz3_siUdj%_6W4}^ z4ze;ohy8*-tx65HRI)3s-P1ImBfr)=Tx{j4n95L1i)`C!c0_5R&tg#}`%)jWXzu1p zwr!k>dHKjnHq0((?6S$#tfbw6!lSoq*mxs{?rR~(>w8~|b2?YBoj>)4cC)T#;oAa- zEJ6L{*Una-)(`hjH+ZiKf_)SE(Q+X>P=WWg_xMG(tzp++CPYWUp84IbB;i+o%qNAN z%2vlzu)Eg={~hRG#j>33Q^fG+M0POAeFZ;BYjcb7i_z|FkJLPUpjpi(4pEi<#rg4B z!*?(32mj9naqNm=Xzx9w3q9X{L;lCox<8GoVaA&;Y7`gXo}*&>+gZqO#_4N+Q?U;- zJL6I6L)awCga*2nTvdMxO_ueCnk6YZQG*R4r}-SyPCyOhqywDax!Y!t$s=eC~s z8U3@#;_B8B=%4!~{a;COp2w>14sRNtcKp(r8w|L}k5-_U1hU}$#@v8^sARoJ=@At_bo0uN>hR(HREHjgYgHK~)8;8p%XMw+y zZVd3CCyIf3p!XSeSTP6q#LeC~Ac6H)H`RhA2$#!QIfmrg+hOpJuLzG;&CjRt{e#sC zU$Rpocfa-g2I!rdnX3cnKd*T<`DrrG^jt*i&n2b7++W~1)+f#r;cwL!_9y_{x+NVi zR^i>sa$`fXLpChCeu3sg?_fKn0Ki-K&bm^#&Y?BMG#>US{xX~J4xX`zG`?G}$Q(f7 zUG~d05Hx#e&gZ?aXD!lco*3oga+UZZ9_ba+xc_75#s#GJABlIPiC%59b}Z5VK3szZ zIo6#$vnS*QD zhXWz-qdJSY9nk-G5{KEIyLh|;I_?aLi}N_xtl) zZ+#ejsS4j!Ipu?b)45B*9$dR$IHyzIb`s~8FBSN+jf^?I@xEXmUbGhU>(*e)!`}|V zaa82Dv@Wlnph^kj?cw>pCS;6zQuiFyslAFnH6)Pz;#$3 zNR>L_hqk(GqIjK)-F?WPB7fJdl)^oW_kAOHp!4=e*1INd-Bt)nLcDX`DcFwM_*bAXk2Z# zjq-oECO(k#R^B;s1*MZ`dUGB5Ygdb2{vms6cfXgO#Miv&HeTApI9wS2jQa7bcBk@4 zALm^XPGkX2^uPUJ1oBUN8<51X9{qJC`L-hLqJir=#@oV-e8W!oH4X*Fn4?^) zOYc^-!Z?4&^xn^_7^g$j#^kJkU9_`nv4;u#@qe%O$=-u}9_Y+S2nF5af$|(R@Hai5 zywnu=)D$lDYJ+=dV?(nGHzNP{x*rql!N0}O_-{SM<+*cDc)%~PNG*7sGweS{m&~WjU}q@~?K)%UJ_*}j ze@5>E(x3A?e`*Tkh?0zaezFkrMa1X2Gq!loK;dZb3$b26tjiClb^oaC}u?xmH4S`#Vj@>y7|CJF&h(Lue{4z z!fJPIww-)Q%$f|;^pppQ*~I*X(HXj8W~rzcqLfm{zP4A13OiZH-reZswb)C{Zf5)W zCnMe5#DxpDe5qqM!?uqsmDaJR7hE)qd~j~ZzP8!~=ZwW>k&XF3aPB5lTkq%3I_BKF zwcntlbu6zj)WHM$W4}+gw_mPZ?)Pl|JOUnC7c1Nzuvl*x5ziTBGLq=AyuN&QRlfP85w7>)F4#!oq(w;NKN8PH~%nc83-z=$OwRdJ*lV4TE z+K_MI}7$?z0JMek&t`LiQb2-uhy`X49ESvDb5j* z7jWNh;h{U53lM0KF?97Rp^~<)hEdl?t{OlTSwok z)_(^4Vi%nbIp0J0?5UoA)4?}qO|>cAy9=_NIBy&JtxASY@Gqouz+l?5IiRbRow`Zs zf4nrS^(;Vz&pC$*0L^lG^?L&PJ@2z`X}meL<4P;CCkL%>T14qj*Lbye8t95sjKG zV~~0UaHvK%en$9R{|f`{}Re=^rDy#qIlcWG4o{4!dLoJf=8o{WIVn1}ebu zf_Q1lj^s~ydVTm9T3-)c+)hmA5w~AXyxs`7(Q&39(HCnixIp9mmp+MnpXK-19|>fS z&NB^dCi?u~ZUt1{t6{CV->T@%H#kb**Y}gOrulV*XvuV%S1Y8e@dX#GH;%XG_p>dP zpXgBdjbO(BI&W}(z>;dRTT>UG%cl6ByI);I^zAD%ya{%EtLj4U=NOIO%@Ojw1q;Nb&&*4gmK(~h1i^7Wz3Al5d zfG>g-Na?#002DsRf^&Nx1l+SH)PnGn^ehMB>vqI8DDcEJ${ZixK0n_VZGRg1jIdv+w5$}muuUo0^rw+#4-u-jyjF!_0n3mjVly@R8mm$Utn zIiJf&Y6!45|DED|&%Lt6#BUVzZ8e2&oG!UYxQ|1*C&9>ZlY7y4;?T<=O9WgYGwc+F z?;94ghxmgR+G1?ea25T7`V)W2%nCd_jQ8!2 zr1ATKj{W&A`xZhr>W(E|Bb@Yr&e7{`d)OS8UgoX?k5#I^N z9CQrWef_@})3{<6E!L*->hoLgaPk8@nmp_hox4g-K9NfA6O4Mg)$S_bt8X9OX#7)e zxBMCHkN)nk%uok-n-7_p&cH9UA7|PD_UykcjlPuslAzf;=$$MfI6t6(o&G|24S8h*;78xHB+L_X%Fr41`E z&xIQLkNN=oa-X0P@|d?zl&ASThW*-9^Dt#1@;@3ltZ)kO* z-x@YMJ8sCzB-rE0X=nmW6h(mfAsVB{5uQ#BiFB;TlyQEKeIjZ z(liI>mY+{LzRtRi1-Hqn*@b;-?dDEORYyO5kVPI7;=ED){7obhk7Cz0HT>*K6Sy z3wzWrrsl*B9|sLICTMjdNzJ#@;rUUh6j;w=UHDERGEdi$oV z!n&?)xX~cfI%Ye>V@t20bu50$^ZUh(up7pdhkcDi`E=KRy5t6Xq@jGvFVtJ?jz_MC zus%`z_pL}C{<~lEf|jUiVSP2k=*bw^Ur$z;=r*7oq@1X#e}VJWU-}dd?)?e#ZLZ3| z`8d~B?y9<|0PDFv85!=2U{|UJjLOQzx@YX9f>~ow{}zU+NwcA!Wmy`oZBQ?1%2Qmd zkpJmk*X%YM;2muf%{JycVZR+_L(DGLu=A=7Ma#5nm{HnS*W%UiR}2|n;A2Mj-W0oB zNyNM}WPW;gCFtkq&HkV9&V-~-`?(*WpTv=w)}Giuf4KeR5fSXc{TeB)x4(pcF2vw` zJnF?DBK3D`?Dr4Yn>%D1{Dld=H};ZUIoZ`!=Pv58e#xBSXJGg4Y1(VrjP^N2$IO`Q zxwv-~M*SfFq8*i8d!wHA2LBL`1OBD^krhn?Ag8@~P(W5SYgf^5O7}`NTjP*8+NQDw zeif~-70Ku?V?B1CPpe^SpO0#fi>zUHjBe{>^u&D^67gJk{ZX>|FG_Qy1F1-UIvToF@{j+zZ+120?X**K`*?(J`Vm%KgL-_F z?z6xZy;3s&vk?o#Luhr$G;%{wpsZ=iSy#_lfw9a$T&JYo_}huNIk2 zc^-@NKM&_7HsD@_IBe?#AJpU1+-|9kXt$4>oA&=hx@m9Za|R&X=<5pae6*K8r@GIY zhJOBhUZJEd`tPBPNAf<9Z+YLof%gD+M_$^|4eNHp4|a))7{{`QJ*%Sgk>?z~v|bIl zo}FBD$OiHh9c3xcfbWj%)8``S3acYOd!wBM-t}5I0#Hx;v5#bH3zE3j+JpHaXkNm`i5m})$P8WRoyrmrB^^dFy32$etFo66{7RyI? z6YNwNvV#06L5kxnY2Hd&w)-{BbN4Fd#9akEblAtm9PruDyRFG?FP%L89jyyImQ~MoJPf7tI(5pDo;9FfTKmd_>~gI|9s!i!G~4O&WS5t1A9$bq8Cvc`dXfF?a%JyU z%5Q?k>$zl?A2_(qm-Lx+Alir075!OiMf1V>Y4v-WUxbWrz|15+R7K)4mc>HFW%vNos#cZ3bzY4b0qjbnZ%=z3jpXxs zqM{zRZ{{a?zyO0^vBZqOA9eARC->(K>|zDO2mMu3`0m(==?2_x9?qP&eRO8?a-NRb zq;A~4v6yGTIQS`oK4A#!yaQrMZFAGa?1M^JEs5BcT78Qpm%nn51zzi`HNn13js36zu2E zvhQCn*Z{SFzvT5~4$b%nJy3794V*viiC`CYhy;rG!LsiI4Nep6Pp?x*9^t+BK^&yB z@wi|Q*VFO_;dT@q;mu6~eid3JTzW*{%co%QNhvzQb*UJ@_mJ5P{1&MVkhDsWPDK#? zy$tUud{JHGCZ8Z~G@L-?B@&m*3=Z}tzQV?io9U(M-P(WaTEb|s}&`H@#h;Y z1aW^kU>r|(&tgyBK5X{968i6UEJHz;E+B1$k~BDPl)helLUR` zDR<+zb?$f$Pku}1{rgUbS9~1lZMB!Li@aK`;{EzT#ez;WZboUZ;p0hxMk4ROF?~1k zai#LDCqHju)YhYd;|7^AC1MwAx&Exdu2lF| z@E)cAs`(bz!{M-v9FB;8&dUyb zb?g?+!vphQpr^o&_ZP)exvpIP{fPKtmd%($=XqLxNq9;AH0iLgbUMF!VSoLKI`|92 zW4ro?z`ozT<3~5L1GEcz-OPtwW&X9-4?XZlWv=c(`{Y}ibmBZg_uqS9`We`BLu!w0 z9SeN>ocz|bzEujk)9o+WH6PulO#$wEUTZDcr48i=a}{Cl-7}crL-YGs`BWuags<6J zGtU+Hv0$CW6yJGKMQk15iwx)PWIsqB=LHu4-Z2_EV*$c5T|Z<`1sQrGEeJi;eVdhnFK6LR~i-N-wz4-GxFx;g@%-DB?%I#0B-q=UL9(is>i zt$Gf5>elM*OaSbu0T@6l#>1BTxGnE`~oKZC#PEj)~w&Lr61@gAO6}E3wUpZ5lM=;5WI0}*ekmTDlK3wktqx-;3eHD5ngUk6`g z|L5(=t~Gd2)+GdTEwNZ?F%tBtVZ+?&unyFUYC1!59&Ah*9R|4bR(f%Nq${5{?))6U zy8I)jX?;E}r+Gced4qX$Cq3^d`dmwPl=IA(TY7*E5hG_(JdZx&Jd(3(-uj^v0e_oK zxswR~%@>BgBRPj1-gV3Zusox`!&>NV$}g*sIk0<_rn?s(ilgnwQbQcmUZT%@ti1#p#)qX*fYD>q9on*e%+vGU0X zcU~@X)(6zyGQx}O-Bug^+$6vEoZvI>i9akp>pI<+{qe?maxwH>F{vVj&Rq<5i0(r7 z=;b2bUzi8JqY@7TS|{&TPO|NUbmDvWn?icOFkY>P4(Pf!Ge-9Y+?&_4w>-idZQQ0k z1r#kiU#*4kfuTP9UVs1gK2OMB-lefbo6f~gZ(~%a4H#$R;PD;dx*<;dUG~1mOp0k7 zycgzIMSh07X{PaaL5~tEZKZvM`y=w-Q~jN6O!Xx`{n@jFsK2hwy_u#4=#tw85h=v`ixKA`dNqKSeJjngm1%2hP(Y-o7(tPF6> zwZCuv0{)EMm`CG_pINp(;SF;q@$q|_Ulty6K>u%4#6?W38wNe)?;KPv8p6l*Au7$> z@2&9DB8AdFUfc6B#TS`hu%YylKVH@#*t^esMsm!0zGX0#XT6)V53Ls*eVs7#;~s!% zDjdf+_qTTMV~SrG=%_$;{nDk8X9*AAw}ac=O2N~TDINKuBz_JvA+!xj&p-_U&>xWC=Fd?+uUQ2>2t8T+mSeYl@6K+_WwB)(si zpU3@lyZi5iVT$wB9qi#5Mn4!X;pskHZm^Z)`k|K3?dYg_Yd)`U%w5ap`A@rW?Gf=T zj2d`4)Bl8XIqo_hGT5iJWhQrA4!ZmBo zJEd~FU7V81`IM!vxm-)^tvTJ$T(DzCEv@17J|#DKI&6|)FHQU>*jpF7z??z;PqUJE z{4eF0hJmjY6b_eLkim?7o@#QuWBwqu0cW(V06f1z@QaJp zzH|ETWFdU+(2#>+(+=*6$P2`Pl~IAl((~1-rdrG;JI}zqx|l=5B#v zAs;;(f$tJle}u>6!Hfc2g0EB%95NQs5YJ+mK-Zz=3c`;pM|C0mO|TGu{U9NHFRW4u zx0OM=eM0_64F&pi**c;6v%pu;NeJg=Cep>Ck;f7r5c z@HH~HT4vuH$n5()Is%{54uLPkU#K@#o&fIO%hGY7YC-yQWb22YTu}6HQZvG1Wqf@3 z2AqG+25a&(3dTKkSv^PA3GE;c zw*e`gPXtbN5DNc|K$9}pGZK=Gq7GMzNSpxeX{jty{ug| z-okJJx(a0n{<+kQ0i9)XZUSLSr9@$Y#$iK1&9@1OY^3Bn$a658|V zbW&I?-Z#WD0pTkyQUOu^r)AO9MZG-S-`xE*3K-YtJ@z5sj zV;Jq`_b+yuH}df29FF?%`oU{CUwnA(T$~_?KL-Zz7l*>UN?O ze61!9+d9;%^KUusd_N%%Sy#!fTCVB;TgW>ZN4Q zbhNzKo%B#*<HXIjS| zv>r240y!5<*RTBqe7a-%!jquS)zJTa1~4+Jy_oJb8NOEQnF{*we+BsR63VNgx|!@i zqvwxu$i90S@_j3vdwaOGq8r&|_l`wNsT>{r=Y68}-Rvg2+q8bW9y8va&J$>9eb=Y* zg@iok`+M_>m37G;bUq+gNA{o66}uy}9t?c9*p=jTbt!U{04@uAAV=$}C!PlbD4h|@ z`%G>C%oQtFlbnt@H+n&jafDub=PPPVosXTlJ$vJNG5jE0BO267S zqz|oQ3Ld1d(z;ba)DA2ZQEv{$eV(QT0Rq{ddE}*9%F`GpD+Lrgq+|$6vnAH5>Tp2*sOR(aoOV zQ3Vf&E<`_`vq}^2cd*VuvU~sRn=zEu>FMKt4WNC^ko^2*l+NW(U+2*|#oPCNKhSzz zKFL^%@(&K0_Ke!+=7-HaNY4FfCiq|#_Vw19T2s8X+wJYBy~r1j-bm%Lcg|}jd7I>V zXp>&U<~DVsb{2YkO%dtENx#;N^x}T5OE&Sp@S8V)>|^t9l3K#M-hE+D{H|rs-xFWn zp?1CKoVB<7*4yU+mtAz-P5G`|l{1U{A97c9t0~>%nc?NsFB**!W>I}?{o?NfG?pk}O9NRMb1`>SGw6l=- zR<)ZFOmfT^Jz*X3>A9-#@#sduks-vFe>CPSE*(v#?`demSh#5zPz`2K_2gh_mS%9(Zy6AJtgweBzgvA>j)#>ZvvEpPce z6lFJvkMpNBoemIPC%X_63-q^b1s|7B4EN#l+aK-qyu5YY{%I0@dxAW-*W1{&!$gO6 zv)hyV?OnY4@qE`Q3{|0U=jIdekcFRf_^AO8C z27jm5<2juC!ko*|-DxG4Gp7DL4{x4nz~Rw-hdKRt*TEcb`$M>=KJ3vIj@Qqc!s*hJ z0)5VGxV?~mRv!@`C+E#_<8pNB{+!P@+Ha?E`uPunePW`BYhK{*x-y)nqgg^09nQ<$ z6w>jHDCD?)CYm|Id&UZO_$cfaQM_Q8KXcztBm;a*D>BS+4`MSJMmT5kTbRdPA49#s zgXkG)q~owafR9WCd%*FR5I;?37se-`TEN%n{E@>&V=-L;pDjC&eh9B66W+I{z*i+F ztS@@B67218+D1Trj`&J4@ts`&6nM8Uf?f3Jw}3Bj02%bV0|opy6$^Z0P6+8l+!5lZ z=nCOYUj_aLGC%j*X{c7jSGE%9eKC7d{O5TBUm{vJ;hD5-1K*6p0`9{NV)(nzswq4b zt6<`5xFEoL++fFeTQ1OTP@6=zB>-54RV>AOQ7J%7o;-XziHq>|GT4dCCg7Ufz=z*V z7EaPo_&th-^o-HV2)Ysg{Kgs34rI8ZjGwGeibtg;$N^xBz5i2|ehbc{Bfb9$sTEOt z&JOrr=`A=}nbZ;^v113v0Sl+IciKL!!}Fz(61Th>eH{5-s+emM%hmh^b_ zA)R~~A73_suErIF^AZI@{3-o~{8S_)80;!ZBZn!x;OIX*W7y+7W1M@DmD6pK5Wkm9 zu2@15zolFcWaZqWFQm_#Ipo3M&iQ7`;(eC2n})|i_)!^ssf><~oO6DahIhYg1UxN>1jTt3Edg(HTi~x9E#P{1U7h4u zC+olch6>}WvYxO%nQK7@{a{b8k3$X6y#N&qWYGI!(lqwr=1>jeo|V5)Pp{SEd3c}= zt~DTh!&YIu-FS~Gx|aQGBlt-|+6(@U($s1mzWgDzQ1}@;QcHq;+9>GJTU$tXOWA1% z3V*h|Apeylfq&~kK@Zm&Y2d{?7C{aU>~lNVLUXWB6mi@acqhv|I7ZOVC*GJ(_`zc@ z?a3Yp3E9B;R~6`^0`YE$&t?v@G{5t8Oq-&s=z6fH|CV#UgML)uus_UwxL%TLX{5q9 zkZ}?t8TRj%%;NZsww9c4q+45#zh62Y0;8Y4zQX14=>C?|S9Yx7^nFWpIDX_oB3d@i zfA_FN!Le@5K6Q}dsf?JQNAeo%nLm^4r_X);`TAteus)cu;5W`}!~JrHd-(1l{GWkb z9L4uBlQSaxZuGoK6kn-p882Vx$ouz+u2XciAJJFa-sXPAof-v+6h7#jH5v}~#}^9s z#Z_-Qy`=E$1bJSL>CzIO&WoMjxPIJ<%2C1CHwwOrkr?OO`j(&t<9ye{b^{4Mc2G~F z_@~ul`jg)_rIlqI`DdRsY;`BUwkY1`JlUlSmi6Lx+QkK0J``_(@t8)k$4W|4{0SO9 zUp<8Ev}3(*y`uEg-kuxJ)1SBEF~MINPH2FzpG&UpB&gJ_kF)-9ecsY99!0n`KMFG$-pjYI$4GoBhQ(d96I%&0SN1ms$?nI^}6pq-lKCfD@q;UP{p~kDIZKI z{pK->=-}|jxxeJ!B_9+v2QC||OLdPNA^M*Q@m!Ab@S$kv`0l~^QaC!W9vU(LALNA{ zeK$0o_)46=^Y$)z=f&&c{0F0{#IHHy;6j22CfUL=fj>|!nfLqn>>0e>nOH65?QHDa zkX%aVeCFL}1QqtB@^$))K_58(+MJ#k>fvv2J#&WSOFb00gVIx4pQl0Lfh$YS5xl7M zZVH8;A8TMj(Dt|OLkfSOsRR!u{O{(%d(eJ8@Ht!He~brn|3C*Rnj!ex1l4hS)M36b zUYzrO!TZ0j+iUJWxYKZj%e&_AdamcX_?>+G8*NLL4gBwF<9YcPE{Nyp8@_JE;fDAwEm!=Er z16Ak!9M8IgXvlxxO97t$K@LIeZ^oYCP-zcYF1SaERV=|AB|$!|*#f?~vo;U!`xNRz zJbNoL7_iTwDA0QjL@|MXn_R%*x!c0LF$%AcQhL4VxCQ9W*!>|`{}{~|aMNo{1AyW+ zf?RtZ3FS8EA>C>t>uO& z=0~a?@L9>|DKdVlEehxEWP3SuyEZ<(jepz<(w`h&`th#HJ>Ly@+*l*~rc3GJJlN2LH zZ#Mk@?VT!_P3g~B-gq}7qgSqI0N$s#)O!UxCMsv+ zCx*?BkNL`Cy2fo?*`|z1zu72zRfBRCPlzOC!xHfCikdzF*>6KlMKp8e|Ii;!~G zJ*F$`-LsrMzLYlAVSX9=)}ZjZ(4dTsb~nAe1@ET^I*wa0vZ#!`P9B>3b4wX(Y%?xP zJEN2xWmg>>f=f|f>5;z!OId|PvyI!cGG=+8XzS~>W$c8N=a93SWoTz{cC9*=v7vX= z=7-|Dg*Bbzu0L;G#vVDV>y(R2*}TWr21?bXZ16PW>D$_sG5e6!6|wjZVxLXPlLyTz zW4a61?p*=6sOa+R<%BELwo_SN#@hT!oS_K)+|}t7KYBzN`*`hJyxq()wvas>eIDP{ z3HY{UmLb9q#htlSY+T0X-95cSX?H0*6w;>unuDdRY-q{S^%14)$@3FuH7}R4p!e4X zOukmivKLG3L)1~Pm41#h@oxO2OzkVRCS`24_F@yu1!YWebI|q^bMRjLB=5L!x@D|( z*{G?xmSxP?Fv}#u0p(s=)=3%f#5dh@iFyP*cksI)dJH+kr+jt0vlQ>cs}`+STv)~& z2fuvN7xgm!!l1HNPGwj(xy%U}j(6Gr`9yaaU557?Lmjn|?(*C1^S_TTV?%n{uYHbk zD}Rd_c=Sdodt5ZD+~`3m^Ir60_{Y>zrdC-0qh~@X)2_?yaJ;CLP0SrLxeR)UJgmCl zJ>*i@)cAfb>ht3VbL+QWW$a?XOLv7zq?(WQ&H)rvBaEi(EoC2}JdkE@S)OY;dVa#Jlr zoQe>C_Nj5hwUf%(=H~97vntEke64khSLjr*TXR<`mssPy-NTKyCd@8p;Z7!+M_tQV z#~FWKxm_=3He)6?JX5P+-CTdRxjVdq{dHLFxBpEU`*Z!`p}k+wuE)J^(-ZwkQE9vC zKF@M?cjx1{TQ|#@S@$g}UGXmPqCcONYi%l+SNfk#YdkSdJn4=8X6?n}c87 z>QKSz9^A>XnOVV77scJ{g!KMawaPAjSiwR*dZmmnYc+an7MGiaWSd6G-4-;%0TpKD_;mGgb z?N?T?vC0#d&v&n278OS<6rw9w!@82l@C$fnC~)+lpB@!#oKN-ul_KzaO|F}R@{e2f zOl{GcN|yInV!j}*lAUS)`1T>(qyJuZ(krZ>f;C-=SP?Cc_mK)Fm94R>WG}0%SME-% zWIAWn?}UG5Ei$@Z_SAs$i?m=0>l_eD`vD=XQS}N6NnXKKK4qGSMx|=Baj7?4OR7U+~2$ z_Tz$9twLcH({X)0FdgqV<)5pyH~3x2jhnhW(^A}I)V44!{v{6 ziM&+Fek+c2obQ^;nI3#{`OnTOHmrZ2F`I8zG4J+0Ru)6fU9b1KPl~{N zYH4(6=y%jxZd3PCiz;^Ral@#oWRM$)6QNEIX24|v%R{G&6A( zQ{Le}aNf#l=5P6U=)Rh2HX*`ro~}s^yJf9<)*5nFhbJi~;QMQen$OL9t5>teWZg`* zvziT89APjwxtis*o@Y79q>B0UXfhoLJ1be+|M-xPRV;Ax+S5PASL1!%b`!GPtJ&ek z{D;0{Ygorg$=?j{e!+k-t3O6=$G*dk9f98ru}`;X`$QjioU6-mv!3Ao z*Yk?#$W&Lnd$an5n;Xu>TIy-dOorX|Q0?RP#4$C@Gu=`9upjR6jgqFibjSUp(+8Tp zU~k?nUwU~y&ZS=czG_uC^fmvd$;}+tOIDqFuKtVfxZKwpx|*a0q$F0e*b$l9^%ga3)2EByuD+^ap^xpy$99F^{``k!?vQh8`q`}I=W$*! zb=P_o#X6?m$$o3h+B&9U;|`(9j&q12hj(hlh-Y{pe4R}l zGo5jz_fP*irWk%SISF!34DZ}aeKg)7Z<;{Y>M!vOc z@I!om_HgTM$)m9EJK5)54+|UFp%(p>A*; zOE1)n-g#;Lvs><{ zI`(9#?^O#Iq;EcRkdAj98&SFcoxdmiN+Bu517q;M^5JWfvcFn2pRAf0IB?Nq}D3*Q<3*Z)kqf;I?>I?_1LKg$`o&YmWPx z%$;I(ryzWvRd2k95V3(3|F?(d{TkMf2X2vxI-4nix zS)%&2>@x-ucE@q%7Mp4@GyOSy)`@FkmS0(@Y4%dgO8Q@~Zv9!z_IXuC>i-b4WW_gL zO94Z7tx(#xTg;4Bb+lR?A!hQSP7c~H#O$nNvRAXbgiRg$(Q}%XgpK;x_<0h_=Me3# zc66|qZJWBw>aVkyt<)H_$#@bLT? zypOo)-?b%pXHkBiwVl;P2`h{{)%Jaqg!voZ>7|+iIX`3_sufA_KCH2GC&=|i&eKXB z`fMy6B6oO_gmpdEw|DhUlzV(thZ~U+Huk}8jqkn^mZXrTz5(U8tnPo?I8(yDj;h;R z1icMAAF^ETx`dVaT$xt4S}S z?5{}}d-5qY2~a&Sslfj^zC-`-tLd(@5++i3^X}Mi$e%jf`^b9<3ky5HK%-Q`KK430 z)w7S31^oQC=Uo8453jOZ+<@=MuRpP{&-V)wHfB+gkt))Y9O$0Vdcka4ayVoo%+a|y?Wn;+>KrVLHOQPMo@v@dmSm;?3z)0W{8x%4VwN%RYk&{ zez^IwaHxb`@@#u+;Rfg_F>JZ6mxL{i^VR$c_;%6>FLezGOWe1#u*p=)bY7frdihq$ zCQo&Ke;VJ_syt(xw)u{ft+4Se(GQg}y$tEJX?Rate&odK;j5)=-G#01>*k>S?b}tR zvtP<)o5`)a0=-^Jyc~85`gm)e6*H!T6z|)F7d*yyx2%lXW;l@<28LZob`=KB!cEmGFyLH#9#?)B_sSEITw zU!?4U!N}4d$ED2s)P@xfC|`FM)2)6_@Le!f=kz!4P~H#!a{H%AS*JG6y1P83tbU`B z!pA@g}{eW*4{qhh9cexKhRX6}zKmPy%Suf)A=E2K;}RIR!=OUlCEoz2y_DrF(I-^I~) zp-;tb;ZYr-uTC9HtUpSa%F)pN$Izbt3@-k%F;mKncKWFFdVzWyzA4?_U4rvsK|f~V z`)gsDGyd7x*R$QdTy6F6-IT3sGR4Nwlf_A|GxrzPGv$nxi;p|hGpWz6xCGXEg7ze{ehRY}{V?8%zh$39)d_ut}LvmDgxo!xOpcTvu5-x3$b z#!FeW=GEU1UZX!G8XUP?C}rQ;Jc{*Cma-9V{h!~yA%*=a%G`i<{oqenyN_rmZ!TV4 z)UCginaw zgLRFzO4%>9u&wE*B<$tUq|6zqV%Em9Uv!X`m=%1}@O*;$*}cWD&xYAjR;*uXeAYw4 zEPm{(j~ymv$K+J3C&F&{xqI8P&z~gh_MgH9lj`xl?9KbDP94CzV!wCE#jgZiL#yoq z*oA6xbPh&NZs%(bRzR-* zJ$=NwS2BJ65BMJq{Er6yM+5((f&X3uV~pu1Vx}_40q_=RA`2fWg971y(?|T5@ZmDt zLIyebkMzdM!dud9iQmHaU-9uW{uXE?!&~@<$?z8WT3}1~|A}v+EMAMe9EF^tWZ`Bq zI8Fvz=q>5B=xeBqZZ3l@>9x>X+sI%~8C)fU+jznv)}r5*bXxSp*&yFr8Gm0H zY$=D13|}vUb9n+HwnB#M%HSLsd@iHEli??2_-+{b2!HP=;5YqA zP!U`Ij%rlIoYxBU$+B{s;))irPj7{Ac3VhqV3H8u(NGA#KU;t!WO68E7$88zw8jej zuId6kf;TV`3lLKVBDTDodX9+QY^0VYV!3((fA^CDeTokiT*O9ukpe}`U7i#uViV2{ z;c$NlDNe-F{M9)8W_%Qap}+2>79e6~?}hR$x+Tc#tH+*iWafqLFak=pxT5Z!+{&$%6UO> z@@3n3L?07+fG7-4uxa=W16}ING`0a41~F2E8qlCzz4{3Ka;w zOzy8sP;o4xI^B6yH@L7<{8s3PJUMMT-c!o_wT8P+^wRe1bb~##|+ME@PV? zuLKFS2Sc1n<0tj`rA9{Q9k7p@%AAaq=;okw?~IWy**uokpTLgn{+=I zmu^~IFD2ccwkE##FURY6`)Sy>j_8g}^A;0aZs-4w=zWq@xEu$6eCGK??SL2vkBvdI z0o-{B%?fbcd|O^Gi^EUwex}!{n1^4z-kn3|NhlupY+p|2{WIVTst@=ZQCrSG?7ct7 z8>f;5Az}{t3+J;mA5AL=UnxuPqbz>Obb)VkqM)}WX9T|a4MKQ_W&sw9(F_p3a=uVL&9_4M zvU07K;k;P?kq*xmIB&Lq-(}_UknwBDV7)Az zhqCe-$n?ageZ)H_!yn7y^Jawb7P&YXc#HfzIpEYg{`e3%^Y6S00W*dlj}ep_Hm{j|u*n+M|YXn@>Y z`VYJ%yhZMocrEqRLT`~DlL&tQJDnE37JappgPVEaBWsHIC(2+8UrRZ{W#K(#u!XOM zzEl>@%|4{FP=>eYZMF=jQG@cakhKG48P2;o!fDnZ`brtx#|w(~C&PKS1Rcf+ei$!g zuu+ztsjQzE%IZZV>&H8I1lSF&g?P>~dP{njW$8G{!YBNq1VwB&SEz{bVH5ZgnLJ}; z>Fu5)r02m4Dq?jq`e9zdBDR=UB@X|^F|Lq~r2g%0O*PTfb=tuJ>ai~DkCGdg)q%aX{@)YumQ3MKn3Zs8SY~-D} z98R3om%~1{VBR5o>ho#{g7rsyDH4F4w?mkR6--I7=$~t;MWUW3sB&oMx{~w9oS+_t zbwQ0F-)=2Zyoil(6yjSb|Kj)qy{;U7k&UBYB7lPLZ`&0dE>+gy>GgO=JwwE{@{TNG zXFEG^d{~EKF4xFDrN{{OaegNhP{i(?zRl@Y?;1GW^4vd8|NeF#h8Ea$DO)*xq})3W zcUWule7qEF(K0cAbS=QpfpQP5fI=}3>{`Lo8LA}MW8Z!AP#_UIknN~RaB}qmlmPZy zw@sWsKP(+B2lj$$85)3yz3VjDg`nL-cPLiGLJzFx{KL=qpn@w8_lzwYbIoY(Ag&OK-50lYlQ4JH%zTh0w9(+W0L z=Sv~U9{yjZ6TklBVxLUuEhFw?i&wDPy+>mS8zpZ(q4eoNM>4g5y^EgBr1ZcYhZKqL zdi%_OOFXbCGVU7j_LACtpNNmQ*M0Ig0zS^tQ=s&5og+5W_g}>J1}*^3T6FNTGw{im zoIHKtXGh>@Qkzz<9|LS#-046(-1>(1jI}@$=h@dZfH`%u zyA*(%E=$kZ2z(b*V84RozfD=jK#v$R-{R^^=|hlP%$HS_0>#ZXY#NC4xy5Sz zr$MeVJQqU!kozEehsNz!uN|pWzo%CkHdF=v&y2<=8i&jV&pg7;J$p20{9gB)>qL5w z4Ad6T_tu{lO3=7u6*;e_{-x<}|4s7K$fi?NPUiVpCG?&4&uxQEfzwW@w<-bW>_7QS z1$b)ym;N+fL*vawNI%r#`jks(=h8=y?CXK+?A1RHMS9&Q?+7Vig!Z>Bi-0W7%=d-* zV!{g&dnIZ9SG6d4P=5K(Tk}Z&{I#n%fa4sWZsSCl?b`byl~;XYZVR37Dkeqsq59Vu zMUSL(zjK+o^xfg)?IAQTmj<&jYk;?F)OXOlTKCbLNaeVRUmj2EZ6Fo8Xod> zFA*Qi_s8!33;DjkzWgEIfAfR83#gq5ukZ4GU6x(I_jSIJGtW2eKM@8OcBRA0jmq;I z9AQQB;fq}yk7WwaVc$F+bNiti*9R^H>-C2@A~{%p*XMN-KD+&REv4s28mSO&>x#Cc zb#-p7{t4mW}Hel9|e7JSG6$2VZ&7NI}#`K-hH_0Zpzm+SVH92?Hn^~<@Qy%9vnL3>BT zqgAk!kT)>+73^!nF0Mb->k!w!suSdg&Zzs@j|NEaxQ0_J}n%r9{82viUJ`&x)6xFbfKpuezx zW+R2=mTwaJN4rl#oFCnnw|iV4VYxEhV|h8%ugOv4ym5ydJ^1M~V$R_IX~OR&o+IXj z`D+o@A3l2kaV|j!Rd%Fn!2b zq5k-8p+DY0YAE*@B?F78n^bR)tku)M_v3`=sx-XF=hFuKU;kxk8A7f!6rwHB6v#h& z%Awsx@?08L;1TRLLZ8h-wCX9}0=tvax6-l&CTI!gA<{=E7t!<~J${G~Lwop_R8Kpl zDH-`NJ{)CNCe(`QW z{?_w7Ha*WTcMu{U7UXZ~8RxQ|@fqAB6Pu#)_;LdBY~cUe721=})sZf2*#Gsx(ulkzQluTUoML3-_c04vzUo_(FO ziB=By1D~M(o2Q?&O_6?S2z3N}X+L!o^VA}&SEk24{O)Pr8wyJyzfD|N?|8n$u>P+I z^|gm18~H|`h4rlnp&5qV>#_g&t-}30;hQjjxtmaKyg&tjPe{@ZtYEQEg!W^OjWL(o zENLZxr;O9*dcQ}~%;J0@Da?1xqJTvOdsw!NBfF4>4k7OP*;)AAT1Ac?Ds{oqD`Rv&32fd8EP#Pd}{=)i;V4DiAZ!g{^;h|3eU4C47BRo>_j zc;(hXwuHyu-{<)=UmxP-l=oZ4+dV{8ji;9!xdV%d_EymW3%odlE4)Q7U&?zf z2DpOV)g8wD`*9axzvl(0^Y3rQ&<+Q0pS=kk0k3Z>$Cd!kpKmjdaK*T_yq!<_*kVFq z|5l7%NvK~pLW6MHHoCw7PiI@?3B&4kW8lF1D(mD3#q^7YkbhsTQo4!c>?(;Ngr_Fy z+7b2(oAr};!pD_odXxOsEr9cJ3ud#9WOK!5{R!u>wdREH`|c4VewXccw2S1ve?NVv z??WebuO|6TPH!hd<8SMuh-dyC>%@7T=sN{9O3&YHl}0#z@Y1Wq&qUu(vSGm9AHooE z1^-Rz-=FxiN3zFk;$y`R3zm``E?)4&0odniunqBYv-u6Zh>sts-0_0S`Tbnx4e^?^ zzMey^fW8Iy=1c&dPFc+F9aN=qj}!ma8X>^VQU%NXnmqg?_-JOsF%#l>;R+$MiAT5G za(OTw_}DsbC-K^L=>&%;po3V!@?p}OCpzr6msNf6{9 z_gM4eKoh4!efl6>=WnLlF<>vHp#8o`-=lFOe>rfu&Ge3WNRN_f7-RyudsA@dUeu#@ z=*zZFq_2Op_NNc<#M)j1Io7(cHy%h8bY_3DvY-PF#7&JoN7C{tp-XEktTzu&)UTpevK zx@i2jK9L-h3*1<}-GR@4@V-P5$p0O2^6f@>pZ1E$(75Wg`!pS?C!?Z&I0n{w99!V{#aBP5Ox4LFkYC?+rR9 zfc;9nUe1I53)ND17WjvnQ#I6%eWF${u(0>JYVaJGpRs}Y%D{siY7MmhKb`#0MdyL1 zdHMXFOl8Ad7;v21`pj5L>-@s*b<1f#MaLeort*eMcWog3q_)P7wEwfK4O`8DMRT(B zEP$%w-*%DSv%hVZsQ*$4w+@m1?BK!Ywb9OR0(YOKkS}di&bI-+i;}9P@)rlKI85W1 z-FSoBwa(h(+zyV=8aIL3^L|DqJa7eTzPFj%MS)4b{Uq;O@{8MT%U~;be(?Bxv$!3W z*rLbntmm!hv((Pa{i-UIUs-C;^W6>TA^`SzlMerGS@`g8)XtgiPq=;jTXv3rFZNV; z&Iz|E8$tG915kIURO9n8n`=ImD9?n}iZ;g~Q^ zQ>SsiSmFWm4_R)b(9b*HMKO@CXJB}M|N7u_Aj=|xjB{}1T#f_&VA>!Xt6|!JyEdR& zpz|$E2Qc*d2rjq8%;xxW8QdDuU6cSo57$E8PSJXy{K-jzr{7YynkfRcP9w@^}SuFw^Bqn&Z{O0`9g}dP=7cj4~A0c&MEG;`=Lr?l* z5+T?0=wBQxls}FVq8ZUTFj);lg|mcOlYhAw6P$gdBhkJ#vetFrCv_q|5ZA$MxU}nogwO2D>0UN&u|vL4J&e z97@v!T+}lk`uajSho%GR%X)Y=f^l44Z!Mh1X+7&AyQlqwXgNc_x1^!u;-o!gXadQJ7wI@c}A=|6C_5 z*95GNqq4Ti6QY z*zPGbfOx;NatjPD&M6+5T+dNl6axeQBSt57#HX!(pd*MsCfqhBEJ$qR-yI(+>`$mO zZ2<7-HY2WQ(zpW$4)8!(iclcVXFxZz;1T7q=m>c8gqQdb?HQAd9fSMph-ziRBlpi> zEn{C6jp6>{O#O|WB%6jM^(Frzukd{l$v+!U@^eA_f)?H$7w2}I)WCa#k{S6;?SCP| zNzOZWj-LvI%e{aaMEi+Fmf*n;I$e}dQH8Prb6kfB|a?k8$={tx&=*lWp` z^u5TR!W$gGHB%Kzvh?LQKj9x=pf6)^5_ze;gn^%ePHc0m6iouGgCe*D)nF9RVP z^@)5q7d+~iT)@+HP0 zy-M-g+GgOywf|ji0xwg2VEIy23->v-+m}9pUgo}o%QKOmJflhTB;-puDj(iMFZS-# zEDe2(-wA`n^Qgb&{k8%-)zt=;Nu^+Y*R5AfOC+Z!i7e4?4!fx68(%|r)>5&NPx$eU2xV-8(zUe z*bPS$XY8Z4CEZ~fxbM-q?6eI0_)kGt|8pqU^?B+30JJ~I@2#A&G2+RuI(%m^d>@?p zb1mwdaZAeTBJvj;+)G7a()Z-T)aBkQ*!SGd)5_tIw%dD7L;Q!)L8yjuG z3m&@$r^&-E-`k?n>$`xR@Y?rmk^Jz{-BU&=bcvED^o>)cO|U z^-q4Q^*)Apw9V@C2mh3_qrM7u7gv`v(?8u7D?fqH6nqfxK>agWRrCP#N76uDbtTRP zXO#k8R3g38z{z|!#`lTbq>ytc*QDz3^g(mc?=QtI&%ysiQ$=1}KtC?6UMuxM8~fYV zdBQ%7_r_Nt{<^ZT7gGc`gT`U}4_rvHKzVL||CV0Ecy*Y$4L{Z!=dZFu+wy$Duax#w z>g=gt!xFdqimKqA^Htf9Fnp)wSAYF}k$^4Pup)Kw%;!wpKe0~sNF^J!G4_X>qkx4x zm~cAiwtxjXbSzzn_SLryZoG_nesAz}=s~o*&1+!wS)@CD?(LBYESC+5Jc@R@sHi3? zB44?rEy4rywmG}mLke=BlxXr$$OHQy__D|l@{@>OkEf>+A?5PoI3IPK4Vv6Lk zQ-1~Q{R;JnCFZ;Tjn0Z_-|^svup{<|D5qrVjdr$wd49VM95HQ!eg2KlClQ~!*QXZTaO z9yx&xq;HfHGo18m3yk530dUyp-}P`VyRZcA zCmc^N*g@$BcKsbf_}uIj_k-8B(Zvbw8ycR#fn&Xl6alfoz1`#HON91sG`W8aYggd@ zb?@ry^C|t&iUCGspDn8IA@Bx!`pK$-(mmg$!BXk*FcGGLtg&D*V43h&=k*XG=(cACX+1p&gj;B*q0Ab907c|JakJ|kz6+@%T{0Q`}U zW&#J%H9zpQ9OwqnZ4HVC)}M&wSk(u#0P>t2Lj7ltF&&VzD9i|~+w+pQ^V~~R16gXS zDaV@Opa+m&c%fS0J9^rQOpP!K#+ zMU3a~8%+&G-0zsM-`<~vL;(FD>cD#@gmeXl0 z)Uys&PGtd}Cj*Bm z3%G2Xr;P;;zM_!9zqhoag@^dj2)ghDU);KcuiFU~lW<~#opKQF2M2%9WXR_hMf3dC z%f^l;`KQV%oUp(bSIVHnxQ|(H%l$ z4|I0${(GD#UrO@HJ!5^TU7E)&aYcnVq2!y}B>Pw8-KYGwy8W?3U_X6~i>SVPhR?mo z-fvsf>kYMYlDUm1<%{`^zDfGa&rM%Ne)U{npOI2P*XRFmSBLZ4p~^?xkJAP%) zKIFq+!=>xNSGqRHCJ$aw!3v`i6~BQ`<+?3VIEQq*h&ba!@T6F!VJFoc;kOI^h6aE? z9({M>Pv80QbH|>Wo2ub_@zk}h)&Oy}&Dmx(o;ZJt?wc2QU%=eVCHs}(`-At(YvjR4 zk3QcqdL{UF)D5khZNNjzjKU;#AfCHpjmv8AA)U{Di}k?k3{5pG29B=4|4ChYTok-p zP??aMp_7&Or zV_eHvM59CezYXQ=`?|vx^5Dz+11IJAfuFy8q;Trm?lLyM@YKJKxJPX3ZTXIw;~p~^ zN9E&FUX?S|!F$w?E(Pz-AGIfE%oEm;vtxpsToD`P(iL(1VG+CX&#>>OWo4|yy!?UF zJpnttYU-}7;FJ5m9Bf*O_2cRwQc;QZqSzYbDi8GB{7j$ri>KWnX9djX0Ph`Uu4qr< zh#A^+Uoj>4zxB_NU;Fp+q(-d!-EmJ0T`mk57Y;IIo|7LUSXNev6)_fAM3qe8Q zFIsSK5#sPX?*NU`SjbDcJ;HV+eGQgzA_d4kuUN+ny^D5SRn&HjiP1qOj z?N$fcA>HDN+;dN$qTN^PH1z+0i&&=@##_7A=wb@y|MaipBXY5B*Q|-_*aZ1tpHck2 zM7=n!dXp34d|Qk?6)`Rzd-mS1LO-tz9D8{j^v*u}s#FY|aV<g|Wo@^B2#UN%}$lw^xzg>J8CGgwyOwk|NR0 zkN;jpk{xVmA9Iz)$uQBnmf{}0r-_2O!M|l@O`-Yp{T_WW47hiSf)0&~>3S7U`tDD~ z>+z$26P#aliK3mmPh|BAfS$UR`J89Z5HD(QDWedpZ|cz0Du4%z+ufD0fz7!Skt z#e|CU296<&8S;VqF}XNvZ;~_CW$<^IE-tS@_%L5}a-6phn4bcs0$#X4$&u`HzFp0G z>Q~pXmfMKr4bmr5DI>Z2T)cPxa5g&EUz%xr$%ei9smfxtO7|AZyk=li=> zw2|JSB>%sZu5V*hO7`ZNMNJd!d(&PHc(@LKTo$WL`)EUG{4vri*SXh5dal}WQe-!; znZ5wwhJPyanM-Z=ol4wC`1Fr^q3z@05P>^^50ZzaC}H{6+24xZJuc0(xdP!%K+Q zrY{Q29SPj?ugqr+u;XgN_dMi_n;C^w!v7rq>(oT~lfHH)DF8ig9b35-DBJCIObL2B zGxC~0La*Pp(^F-TUiHxZx-W2EdwXI5@|Ab_EHZ`MH+JRAbKsM61=`z(Lbhx;B(fLi zHKHjf4tfK9h6a6u-@B7&bVPj)c>ccBcmt$=vCzwjf!?dOygkyuxZi^^G?4ya_CEQm z@CW-UBF?RVU)}p#)NnZBtYeDiz72pM)HVowNAczdd!@tVz!%dl)yTh~`dXKL%Lfnm z$nG0zgAcx(89JvOemu;(`QnTWtb+|H;Rz2IpzucLU`H z-5ilEVCJHE%CitBH1JP&Hy-iIp>u|;>sSc>xO4Tb*1US%<`jv^%^y|@B2iY!*|`W{pkmuF8XSG znX_xje|x0_EMxbeAdx!)HbpdQhk|A$3y&+Xtc}fMp7%{+UtYa|d&(8jqpp^*GyRU~ zyojh|b=y>3vRwqMs@E{5g~^Gm7;Y%qU{sozfjg9m?3ru5+ex1p?OkBDI!v7PGTS!LuFo9x^@MRNE^G z`E10k$PsmaA2G|0bkW_v%UJPYnW9TGA2LBiAE(oI@38|{{!UhZlESw3TJzlN&jS{D z|E6)x=^`en8=-MN@Bw3=AFn)Tn8pOd$3*J?ieYbG`z;+g`7X;l-d(Y>PZk@rRcZB+ zt2u0@)69uZ|B~3WKKHz3rDNEjW?i*0UGa$fiM4w^OJ=L*m?kAPW4@+7xujo@cPRlL zmjzglKXukm`P3KZCb8z|`DQpzwp2g8pIwH(LmU`t0N!mKHqCPSA>5PnA7NJeS-@hZ zRD8(;Zx)-nE?Ysp5Wio(=K5`C8GAIn`D@_~ybmx9=(hmz^C$ z?>6>jgXpcA6*y<9ZyYr2yeZC;CHO1#uoF)=y00g`{_32xtuOZLP3vF#Uwsjw7U|X zhx?lO*}WsOucUtOeSE9YryH{As;yiJ0xTKFb z+F4)zEaeQ!|L9w?k$C&fWy=mP1-|#Fd^rH9Z>@hW2kq2Td7wn+=;G-KrXA3qx+KP9 z6=XZLS}{7WoV9*cJ|F3)&V(ccKz^4x+F%{<%!0E=h5)OkbWEanyY#D>pMGNgPKWI+ zJc;%?4w-*=2F6X-BKzV9r+MI`ZePf^)h;X|{umN|XaxC>aSfR~zFxP^U!D9$mQ+mCAfWH?jzDV1iNXJH zlZ`mQRn;ftPu_buTqi%Zq%n3g`8U%A`U=F?3#!Ft|a^KNl+x*`ze?6 zfaz8EITGaLt0(YshVC>bDnkDON;ZIbzR+D@AK#wuGc$a6_*c;nI=l*J_>q? zfF$}`dV=#kv-ko0yUIWzuhn0D{5Q4df!oF*r1wH`0q0joP3WZu_V<=+d|XbsIy#a3 zJL{7eVZjgjr8we>5zU;pg-@9VA`1VbwNTieUZ7i$9bXCgWcwFKt~d0qkjDqiap(Ca zmxVky#!$xD~6H2(e->|!cE`q^Y7d&=4+9>rtYl@txv7?Gh;}0 zjEk91DB3hZnsCncZT^It8aCY_y@9vx;XwxC9-$jUDg9K=;jgrBJ4!B965k76x03Tl z*_x0p((78D%h&sdPcA$j%EJ0RBi=c3)yeC$@AjXzrvAH0u!@c|F{z`O5fjw4yAd&+RyFQ+5h4a#8$QmeOJqx3QFCJfU7 zI%GRL(Ec~iEX5D5un!;YxE2e&_@ld9$X-r)_hB#bNdwu5UpE6C^-gq6M1F;>!GFJC z_b=w1^Xh~2Ys232`@Ef_zHTIY`X?hN{{!sFS`jZx;=2dGYdAg!W-Ri&G9USO9Cmt9 z9AigopicwzsxpSf)BD@zI|r@l9{A*>@AiJk*OS%r_zl_a>@sz-+i$P@8CnW{X8!e> zCjH({c9FVN8uaYEW}esv*~@mceSg^FLi`EKM8r{2ii>V;LjIui3b{=1$pVpZWiR-z zN%<@NuOS}k+4-&gZ7TY6b%CWa>X+`a+h7m9|FVk@yacao{q8Y&^$N_dkLaoscQBp- zgYT_|-~Lk^Y||fp$>x0f!vd6NFs{ivX&v~a{`*WZ8^mqK)eiXuKi08&$@M<)yT1)e z@8zH!*_$qJHgkggk9U+leMG<>?f7N)0DSaSf!~q?ia58LE&mz`Km6s-KihinjIOZp z%jEpa+1bFjAF>4)ugyUj%Y$)Gy))VSZ?8%=Wn+fr{b%J&*=V_Cjb17{T<|Yo#yR-Q z*&d@Wtq`zT!7s$e@2X^>k1U-oMn7Y}hPm{ay*ipH%e zdnMZywr*?a?*f+Uryd^l{bcSa^?pC6cp`r3V{)vaQ^2xnV_hxMv5sdx9JDnsjg8Hk zCObLXBUju@^Zek8&)Dyx?m>meE1Bb;KNFfP%URH}899$e-(jcamCm$xfOmPlo8@~T znfd=X&=NcE0m~~nmUG*!j6G3y_sGb@`K&U-JN6Env&3zjU|Ry>JD)lZ_j}0F4_~l+c&&^T%pMrvHxzLt-I1w-Kiy`z zngY$w9kzv;{13*x=@jB=}cWyJVFD{GwdnfF`{E za37$$x(V}s%QH|-8|z3pf4+Ise~8!QJn zc2AvAFltyO6S!_Q*?tOq>8Or!%s`y~+$LOg0uP$2y0Ov)>-E)&f5oNNcwgL^?D^(C zc+{8Qlk>1{YOcxjD+7-@X}e>{^r>OCc%0CP-lR8ZW{(tWmRGWchI z#|W+O(3`sUxKR*!Vx%oNt zCaoJ|{2TkZ=)lAIV%Se3wRSJ7N4@&vl==_GzFq0@yh#-0ZoB;SF`a|guCr@h2y_}X zOqTd!QLW)YvbTE|S9TSmU21=}_Wc5VW8+Dkwn)F>J6388&?b0)9PzGGPrfwXhMr)| zk;yU8D^?D?rF8z+Uiu@b14!p1jt_W`tu}8Yoi|5>4FTIzn zGZ1pa_Gb&%p*S|~n!zU)2@~<5XsWJerR=hZp^fVM-bKVrZO>s2!H%!4?g8DP< z*f9_CKN&KHJ4r8d&H)}r2|P6;kMwLZl&ppV`D3io?XK6(_kpBLC6lvGx`Dlhs3Sgpl8njFfl2&a!YT3gN`w}Z zzL*fo@0q}Pb@loMyGS zV&ZII=_IM&lyBUkvzxFZAzYvIQuiO@_pXZvC`M4d%Ki4(8x-qi>}5=+u!LM+1Gri`Ux%uRQYIM!$>lEG{%( z4|`GVx?wHlpHkJVBDnuxXY4dcJ^ENs|D7t zJ|x?~e@vb#XZ2FRhMwx>827S_%@lFi`VW58SS{CU0{p1anPp~^5nuacvw!$d#MO38 zR?E3%@|?YrJ}cEL0PEJ*_U3SD_>+#;7N%%tz`!#Ge&7YZy|b1Ld|bvnk8K!r=>~Xw zxWQKMivs3z%h_#3|4KIE#pc~VRm)jys$AGe<3#q%S=_G9rHsvbS#LSSp^`0a%?(xe zC}(fZPxW}+8pGC@NtMU!OlA?^q@$L9EMtyuomS5*wF`eFR|z}8IWo8S6N@pK70sI#$o!cfHF zM!xyfs2Iog+*0Z={2R-z>x5_a&re`}s*_wk{K;iyU(?mHoeG$`vRqo1;0`O($vd<8 zT^zfyY^L&p&{*~|?5Ewc{}P#YhOC%ON*dEt&3dX9jAH{%GIiom3(jb3D|vhQCwCT>*92E)PaZj?8yG9qD~6W z*rb-`IlcG859+Qf>spNW3X|pS{P1pfr=#QQV3AaIX71V458ofMt*azw7iO0;_u5>+ z*&_IPJFC5m8F-L{&6-;YiEQzG&Aw|U-e*Y#7CNz7ct+s-@Jopld_X9)fk zcH{iunzerj!#=IqP#Ja-{KfLf0rxQMbF~TEUjD(pa1StUJCFTVFg#>7y-QxAS0k&8 z{kZtgCi%_Sui+B&?<~OjHXfC*=XZmEExnXA{j&<%-LI>6B+f$zpAA(P#XfGk1f&@XHG2CYMo)jsO&y9umT__x#@dcBS>((VFgUW$w(|Dn7f|0efC_a*bm zPk0o*SV4Xx^xph>Dd4hSD}CsGMr+2+^W=AKHSNP6NP>U(@844LQ-!O#PR;{H7`!bY zezovLvMuGm`Kcznw|#EDhRW+F_f3z_M()~rsz#)YW2mrwk^m1H8?U^^=^ciZ0npEf@!p+5n zocGkExN<(>;*h9B`s3CZ?4bN3gF851>78q7M6y*$f6hNV3g+G+y^b7n?(b#J9vwmX z)z@Akz=ZQyaRcW~ZI&N+e9bI;-hI*^Cdk=De%j7R0f8RyhrHLkyzaP{{CAxzPJiTa zk<8nNrjTBpz~m(9r6)^s-Zk?4aDLBN-#~u}5AU)9g}-xLspiM|OLFrt&hO%O9Ow6l zFY?6&Ri1!Vg`RGNKhp_VtkqBpYRmM=Vn9-d1(KBTljdKob;Q= z8%?Km@_Cxjdk(K(y&_hUzF*L|+>ZJeBujrF1pK|%@@a&%3I3dq4UURO01fshJme_p z3DR%Wk^K3PQXrv)%gBk;-}76q%%^#^5^Hax`C28Ie}MFVwg~^uRZVsEQPL|7Fdj|o zq1*oUHR31LY6p9h{w}Xssg%F%qX*~FQpsjKUi*H)n2#fozIWh1P13tu9=wb6KFUws zK=p6mdS069one*UPV3mBDcXtjG-B(FN$)hB{T?)Bd3FJ7}Nn*y4>poC>?PqD4^&`O>MHwl>($+eNRI(eGZ=rT$7W zvF6Sj+7EM&$Edr*{><>1k=+J)ky(%z?Ym2(`$p4wDZ2iuE8RmHxVWnh zg8eCw*keTby|Q*U#zMa6XQg`_c0_S|K;Or(uO(lb!ykqtjx3>4YJhTw9sOOs8hSZb zzC6E)xc>pMmW+=$N2fi#>$~na=5Nif8zwliU?e z325hBu}Z~pIRBoEZ&!`CMLgla*C+3gukw4Gdu;^HnNGK?&7%cOuPS}k`8L>xww)h> z5MS}z{m^jw%oJ8HddB>tKfaGn>bh}Kz$8kW9%t)Svdn?CM>Ue3F*bE>URQWLJ7$|H zoe6(5r1(U*{XPLJj9eQAAKWqZJ zlgRGockEwvA)DP=7&)hE^HX-W+hzF0_28GC>X(*5KWgH3x1&u-Y)*S)>-nN|)?1`X zMpf()%e}GNY)ra<8Ln_LpPz;Kp1G>sT{(qW{8TtSKPrt)@4BXT`b#mh3%D&kM?t{+ z*Z#QHa1OuQQB1fo>{|+xoRn^=5s}8$N7zkWw5ymU<@Fl9xe&O?yK30`{az8^|rgTV} zB;q7TS|_Z8o=a}=GQ}CV?~)mj^7bq2b4S?a8=J8%UZ#&S9t!_u{$b$P={P?`MSKfD zoan&ifShk7c;EE;f!|uR!|D5sr6wZ~mpJz0f-A;9j!o#0#JZY4P5jGB^gBZEX{QR- z?S8v2p0iNztuL=1QhcOOnbzbXCa^1KcYnGK*+D)pO%ndHGU#tfIM$)-;%}`NfMeIW zG?2gCp4eynVXVX13&K06L2uG9_xa68Z*w1!G!pe@OZ6T|b|LX~;guKQVI(7TfP)S(J`-b>D> zHz9p`+2y^H%yG_mpe5La_WbmnmHi6kE@$F7U!WJQabU7I(nJ2u`d|e8`fxKCYV1>M zZASj`wAZp9Bsa;quO_>9K2Tsze{aG@GyN&WS*|M=P9?r!vdO!U>|Djp=)Mzy&+Fry z+R&aY-&0hcL;t~of>t``O?=ReKi~&H+rBB6?DL#)QLiWt-gn=>ZS)S~+K1pF%a9(j zLBRjMM$MwOCsgjS#kozy>wFt+G@{ZWN-J6o0U2PxI9E6 zl}JB|O{AxC+P<0k9a-{bD(UIu4B_YcZ6RYLN$)@Z;=QEzpZGHFFLxX==Kk`C#0Bmz z&ph41{pIY(K1WDzg#IudkC4!Lz~dTk2khZ-jPOYXGSt3f%W5Bx-jeErJRWh`TOAi! z@PoE(nuKM|xkl-2k;Zk@|1U$l>&Rb<`K25u zy}HLzlBBm}<*DDKXMgL@Ow#lEqjpIISawnKBk9F%YbqmtSf`~ugW6MCbYw2+>C3p3 z(cd-MYW{m6={@#7y_m{NYz>a2@|@=>-X*=@_w53TC(6dH*u}@k>i~bZ^<+d7j|aU^ z9N3rq{;mOnm$d%>eq2>Y{xYb~2J3l{r)4--lfS&#d+c9*q=z5BVK5MOe%|&?N54U~ z+40fe9Qku^k8Gs+mro9TWQ_EN{Cl@rq38EI=>)wS*O83AWsUriFGq*d`Z<`=@{0I; zx^}N|AK@o=WnL^G-v1>*`x@0NRaa_7^`@0xdNLL1t1c(BJcOO}cfI;t66vNAVG6Wf zV>3qfw*q#058pHodL|#QNmE=WLv`L?1=yjsgwhMKkf&{Sk5GfZv^hOOKN9|O!S!zk zCL`Zrit5=ypn+w#9`$FAUBIsauv_&tOClVWgIB#fZ1o!PgrRpVidA5L=h{7fst3J) z-xZqoK`&vTtXH``?0|W5bh{MV5xiq-xdG-&^Z74v*qsTF_9g6vKOg^gP-rCd^8402 zQ?tPS-`e=P1pPU0=-H>t>O1wipA_54q<(iOe!vbefhk9g2FcZ z9`shuXbZI+mF&`&UYoMEmoTxw+|j+$!5}s1x&@-|K7!~!EBa! zi+C2s#Z^gG?9Cwo3+*iKGVrcsdoC@UFLA1f*_0-{2=P12W^S0H7`+ScO~&6XS>hpJ z{nmQ?odG?K$%BUM9b3vQ>d%C)4miOC(V^jkyHi-B+=0lt$Taqwo!rsKtC(F+8j;og zrJOxZXjm}>ekxrfC9={zmECE4^D|)&?x)Ip&imagLi{eXs$W?-^YK_0eK8Q{>dt%F zUQg4Qcf-cwv92l1%<;<2iN}lBL52yIsQeD_kA@Fj2skPm=ZvDTaMqK1FF;b0#zPZOV>u&tQu3ooS7JkC@yT(R;n% zH=BoFt^5jq>bR&ObVnA}sqwRy3*awZ^Eb*H!e7e8nVk~Bx-csal~#biG`04ex;+K+ z{jNbd|0L|}o5SHNWO1ImP>{YJeo19?m+B?xeVl3+cdiP4%Rpz4)hVQ>1#TWS4ChnF z>+c4jypempeQ-hiZ1sNAIfMTL-x-y9a-AFEoM9EE3#9Qoimn}LA23gT@w)S`!|xyW zl25Gqj(Y;pcgNJMaeq@*KlZc?_QQ!xsad!;`lWZ>R~M)(1ECUqq1JWf9mb9(vZTweb~o&X2=izx;HZx=w~`0mi)P5^~i5j-rs^u7m8zqe;zPc75Q@?J~>PG z6p=8Isr8TaQU7cg2%>Ct5gH@jNo%9}M8PXGJnKqO3)Zae~ zAU)9~h9}6*>s9`mNqQ2i+Pz4xeoreuubz!>=D!o3VU>G>^!iAbpQie4UK|l8Jxzyd zJZJ&WYS{gb@J7NObJA;Q+*eOHFj1Drzpq<9=jBvA`p5mOXaCes)DFj>41Vr5{5w{U zWWj$Mxxef%&*lCyYF%R~rAPbk&@$Xx&qfF&{G;E z!SP|rF^(SDCOltPy_55W&QVe4slQq$#_)RzmpfOQXgvBH?CPX(8Zqh2TjF;|o%ZaY z@_ge?Un1NhurwsS3tsQ95#LHFRl*PN5MLWMj`NBivHNVf-o*F42)E0e-A1TVU@A#| zeBz3ooZoEle8<~$rrVeI^K`S*TGErZou5MGr{Bxq<1TX^eg02cr|G zom>g*WicxD8uVs+OI!ZKJ{&*MVjuBMo5^3=$^VKTu6j!K_>`Vart^1!!gI}qKnb51 ze!tgsZ|Mta&)_~^`90MKk+cxnN9SW)AFTua@st@#^{&f2e~Ng{&bSo(gCE2jCwv@D z_nkLC=O^|8{_QitXA$^>jkMaD9N3eL;Lp8O;4ejIPZl`^e}35Oa%Jzsh?^DOxpE5j zq*f4dRSnL_}sGr7VWCfncmWpPrIdX{>wjhG#}^0 zVI>FM2Z5*jVUY{wRR~zJj^*NCHHbG%);#zP{XeoTRb`7R=EHKv`bDtoGk^Y*AAmS= zNptzTlzZi@)9P_$zqe_4AA9eoyJk8|s@ZPTwlbZ0DzA-vJLw*~<#Ip9{cR=-d3}%l zQ%q$tX|vp_KBTbQmHmqh)pFRc>IV6J2ktSyzGa=`-1AtHjLvFF@T?W%^NptLD`Z(} zb&H+KGTFhw=Qc(~JY=uF+xwqT%w>a~f77_J3-6S7KMlQp3-2N%`dTbBDrBE){O1_C zKVWWt&z-JFm$1n%92Lgn?@4SP{pV=cgGzQ%{c6btaR0<-GUe&UE&D?}%5U#0uFh1(C?! zcn8w@sHEdcY*p8w|`v^V#Hq13qUMEs%hbfydtI(b#qW!&=WSa^vCjlvvA)qH%qbG5aX4! z@%x$O87!wJ+I4vFBR1c5*sLJ%3A@kn6Zbtt{J2#9Y@kIJJN!?gqvC5WQ)xaX@!|VZ z_WGjh?ukcmJ}(uo9D5b}$5g%Fo1YI@et~vBh0qd~uN_f8*%o|ppq%}fE7*T4zi2dI zeSGSgDk5g}n6;m3&TQOU&MeI)FG<~p`^%5!x%%MS`v1bWh7Q2~aGiX!rn8J)9i*wJ zE{=6r^INyp7x8m@mHj&4qnovBo+@C!waa~fsoV;GCKqCM${Oq1v94?{+VA|R_25SE zfzO9-Ua$s#c@^7K^fC{At;-{P2-fRRJlG_Q{M*)vXCu+hDdp3)U+aaq%J$Hy_pxtlYVr;fk3Sss zc04_GWy3&OsB9T*a6Gam7p?8@j2v|~i(8nsPG|106T zT(UpO7=zWW#&R%D-`$V0XYObH{=WXj{pi?I1B$D7`YB70A4XkS${$zvoyQ?^^$Pesh9K@T=Q+zi zeC2#?wrDKp8FL5k;qQ4NjdDPj?r`H4pSsb=PrBIsqC6IYZ|;um7aB8khAiF^($- z;<^X<{qOGPc;!L>=Ue^}s1E5{x`g#F`UQFi`O-nq4q(b)3pX2-b{a(NG&--;<_qy)=zOUy# z&(nN_kdv6(iS!p2?yKPZIii3L0dj7Th$808hJ`DbAF{$Q;sexslQ1z3^P-%qSPGAq z_P-L*c-+R?N1Vj6tp3agoX)t7fBY}ROPKHcgvXnLvU&v0xBsDF2$tRBw>jeYm9cUJ zpZsBx3=Il=^pe|dj3Oh8P!TvEB@0C1_=|5@;g6-T4t5pmVEu^xXWA?Z=r8Bi zQEeffMWyX->@S+LKSBIYR$Og$i36NRLm3Nx%R=~`pH*E_fI$WWFVz9fdu?2C{Mes| ziw9u6Og|)l9?!GmhO1ZO`pGZMfyWu*HF?Tm9(j9izjGYmzT{~ooZq2!EX2K|vQ&G0 zEcZwm!3#2=ynk=+Vf$aPUwd^P)?dCgJI;s+0e^SqTl?D(_9H#X_gP(VFZG~^EY+$#>y|cKH~;PCm;7_6Y@z_mNO9H;aw8u|GOv^m^Z4NVnhOxc>=Q|Bsp_ zaK(c?d!|X@Z$U3&%pHo)gNJtho5Afed85nJ1?>JB@NVG|loQ&~YgXLS4*ccwi-WRV zD6&45q@&P`CPL40MaWd5e3EC?<#!!uF!5S@PJBBm_q}`3w+HuY%U4};;s5;xEsa&ZAwSWF( zjqevUtSdcd27Hw#B)H319M(xS$v;O8;Cb9tr;A6;I+51FivJgaU%)*YC_S^u6U`iyhe5Bq$vC3o6vQCsaT`xR&=$n zGUy?D8!8UEmsqOv3Wdj84xCumi0mE?{9FicK~KNM`86%KqSvu^OtrGx(a43r=Q2ZD zkY;+Jb!ydXG*zuWGpEsvG&pxve-vv+=3aAblYiULVsOU3t0A56oWqraKeGc}dm|j9 z8rO>W@3C5LIM#-C4x2`3GDE%Rlli2<4XNAun4uIZcnbJjK^<~N_cS_i(U&7AvfO)Ht0kz zH9F%y>w$mxUgSrK)OK_+=Aw+_a4QmVBcI(g(}ISb71UP;bRzLcuMt`z@SEv5%ewM* z#P7zI8<kw0yO`ZCta7GOaNm}D^rgpmJCf4j_T8b}fr517xq9Kf2RRoKzFvcNjUIJP zNojtKqNz{xeLmGAhET&{qw6hby}G`flVUq+JaFRn@ZuX(HXLy_;L2;{Gd^bLv9}4m z+Us>cgS#DxMB2)oEbTx}%KG(lMQ_j<>xdoy6}&-}M>L1#1KQ#Hpu8_DVf=iL%}Y$T zg!9#>+%p$F+mUV}N%@Xb2QqtS%()-NQ~pDSU?UCiYd>@07YBax!<|ykRSnM%qaxRp z>%;ou@y<5P3jPmD>C0CIei-X_<*p&%6TyZrY+vAiY|WPiX}~9)$c;90w_u;s7@Tf` z^N%B0cJnG2kL%Qwe%io&u?6KfEVr(~bBcyW9Xpuk{Ic?o%mrXxOWHZ^gLU8^zrcK( z7x?Xp-`e;AZ~Jgyyx$Rc9*?>G;hnIaN%(Bq(FgNArhCDOR~ViLw97?Zg!^&#dh{OR zdt@V0;(^%D9zOqSlOwDTRqeCMRN$jyYt-hWKyN6TDC-3CO4f{}Kn=qGFv@J-3i`dw z+w%FKzo&~gv zQ|-6p` z&f)zm;5Iq!7~mCgjsJ*y0OKyid*#f2V~sA8&ao-nXj80=D7($!^t?%{W|oyNe*@5f8-&m+p;6a2>*x8tfu(O+@+9Ft!ePXBH5qy{BrTW;Ka!V> zJi*I!DDpB`PyVY#@FEWe`n{eB1t&uGcT=LjT5&0t4u2t$j_Z38ft@et{83F1vWIXFhJyqO ztJ8VtI|Dd2fWBOtF6T8u_8{})*Ioe1JO_6gAZhjtfdN_oAa9t5WPssObh*}^p8kw8 zG&|^DY18%RpcS#qAWX;oHFR`up{M@@|IWkVKY(Rn+|5QuJx@ByIRZTdy^Lc$QNNOH ztVI2z&x1P-^yPN-M0nSSST!twCE2rR+wSkN;Zf$joq{sI7aOJys8H-oX^Fy1Ta?ZsqDuTRo> zdON0HrMEXaQbd&RJP>Px>sv<$R{~loQQAo)RjnY#+I#zp<0iGc9MAhTUB6AP0M_mCF!4O+hr`**h_?`N?EoD^|p zuweu{n99@_V{J}06*;3U3}H|-gltmGMg%;px%2g=Mnqw*XJdhHNo!UGJS_nP|shXjL#3K z!TIv&$wd6Wqdh4Oi?|+L4~{Hjdo<#=-n{|-m`mc!y!bxpeT|C+522mM%{))w=fs~~ zANAjcc>2FS1$2O(dpNJz4C1eg5cZFS@S*Oed3Tmh>qh4ubb;)|{D+_#Ted430!`(ezttPt|&8j3xN-*fTAJ9|eJ zKg{oWS22MTa6iLlcGqv!qaK13f6KF~R z{&y@&lTix%*bgHkFU7$9q>Prr*bPvhRb#Cx@ld}v+%=9GV7H4!hL$%E@G&2&=T0`Kj?A1*fF;?>@X zG|TVHdgyl|&Lai^Xa2zR09Ku|HxG3p%72e+q*Oc6i!%?v(+Ir##?!{v=iwZ@mog;_ zc23nLY_5WFxQA)!%r;j7!i}ymh zi^?x%F~2zSp<8qj#;u_B_|I@?|Gkj~d!!*BsnR{ueZcRu)z8i!fcg8SQ>wQf;`@Ki za?IE3ME2`6ni}BwY2DQ64X0+>kx;JNBMJC_;rgu8wM8&bwADko-`s)qeJ1T??FV?@ z+_2kcxrh!lw7Qi`o)!4cfIFv)7MwFz&0kvw<3_^9QMzdxjK>7mIQ(9~27x7+FEB4+ zHfXMDh4vgsdYY>S_~Fnhg(uJt(T7`;r9n14c(zUf+P&Y~O?m|Cbu`&MyA$l)I2^ON z4*I8F<$L`Aj6WNLhc3&|4tW)?+JzzA?%15zV{qT@Sf58@%IGY{*2+tuoQ$RP#Q0Joq~O)s_mdRwC|obBQno`cTa_1oic**YVvQSw7`7! z)1Ou@0ekeE6e7+*d28bK`(wVow6tAa8|LQ|n{S^gA^g2y*bf_!%fl=mc|o`a^8tTx z7+3ZO&n9C3W$QsfBMRjAK~^zp2lTIeg1Dp(=$+5r{df%UiqSWbGteIyB|E;P2*7%W zOndP2ohn-XIxVQ5#eV+m0;oSX`J+P-#PeCKpO}Syc8fo=6`vCtR>$1g1o`|O*YIQn~}=IO7*|DA#pZgy-!u#aJhZ-9k?^SXgywD8p z-Me;d#{Qy;H^Fc*492l+Pw6nmX0~C1mlsEOz#r~_A9$w{ez#+bDFhFZm3Tq$B5~bxg12<39Q}dqS`(G| z8|NoEAY_K~84sx7!YFz@m4tEUx*mdeZ43Q;3d>^$z7YJ&wu^`0J$lz~5xhFSLl>AV z^p_ESQ5l>&l+O@+X!D8tL_AgJ14Oy*_qev>aBD#yBK(fgJtAD-wJag?)b|p6>rZJS z5NhD1wp>Iz+@x3#;s0!GiEyvt5&~sE#i-$U?{0b%c7)1ZC(2>1+eqZA>k8F?aGCnI z1TX9QX-wqfSPpJ!(C@I(CGcbEFGBA!X-cH$jRLnPgfGS&Bk=tw{roX}9q1J3M^(9q z{L2oXB;-VHF#?Sl>E-=MktO7xAEEmoevJUoJ3s>_NCxO|gU*v(M(B39!fgnwPqGF8 zya&C4vHS^LzIz&~2eL7y`GBu64F{Y8){F7VYC3up(9;p07X&?KwK)7Y2Ef{t^vAjA z@;EjV^pCJvfcW%)5v|C126WkKCEdN1aA#~j#QP4tjghvNjMZHqz6Zchkqyi~1TOz9qcz0f(Pmq@S-` zn6QE1FEIzVK49+~Y!LW|FS-%&H$~x&!OszKg}|S+8IC7_tv&SqpFBdJPl8u)1%Ze6 z(a&9G+m#5JsTdmq{o(?zZwK_=ZF?ExvgTbl@B#n56yl5J6kG3)SpM=nXq61$X|Xjh zl7P4UDJSNM29 zhVc~s4L+;_?Gh1k2A`ugRf!UQc?ZLoQ`kRpt9en%1Mr(*F&C~^ZSr?BjBT#R0`R)r znPq(!I9 z#B-P|#ydnk>Ls*R73_R?C05`@UuM8WEkD6zeaXgddb_=|(cu8_O ze1?5cR_~op7wlivvbVX?KwqSqU8@fJx=q=X@;l&h{loTimZ0aCUHgj+IQ)@48SjTz z`Hnde`|a&t>W?A*nyv0%w}JkLsqtoP@52yp;(hoRP14rmecY#r z4a>85e-Pkk5ybU;u~r;u0RDNRk%#vK-3EIj+|Dw0%g6D)v^;R46x)4CWIqMxFBo=u zy%XSg^jxSX@a$RE5C1m8xg|Lx_SkuNo)J1h)nW(!6e(~^MIPSgu*lJ1wi@`z`oa`< zP2ejmfA~I2LjAv)i3P?0UrDGq@`4R`)O^nUpBEwDlh&V086kXByne_V?Di>Va(D!I zOnZ9kZ^(yJJo3NDbf z*i}kx2mXJ6L&0pwXOO>4-7FV{a>8>x*ju-NU-f7^lLnj*wsE3pKPX4KdL+XNcb0O~W=DS=CkZHA za1J(3;JLMh8d^}kwvj-(GGKJQx+`{-|URhEFSlBpMMr(9-^u0=(PZL-e$M0{R#YD_)puS1)NVv z`Q@FCz%N79U%Wd3^{qJ7@OT&Cs%SH5%vXK(WPkb&sN{Rb?>*#W+c9qN5bQd4qyO11 zDCg*>)mi@mQr|}o$N+x!(%Tya$f$O%4v(WSW-*~6z{K!6t$e_xW-YOJKu`9Y-j@Mi z*_7YG_2S{=_LK+wa>I;x-}$%Yc1z65LV~6_4*~|BS#=TnahDcm9OK|zBB#`{H4w(d zKz~8pV+q&?w#p^o|FQ2J@Ne;k`n;THPpE)&hc7Ti4nn*@=K;MqNPqrP_a_DDzh~q7 zj*ddTsQ%YEj)T6eH-CRW#1Af=Z?*z`d;M=Ke7=63S&;b{aFhF`q+AF$xf!T}$BU&+ zf$Kxit2bUs;RM;``A0h&K<(LW|FC?r&c@+0gtItQS|0^@{*x~4Iw0c%h8Ly9i!1EQqvb_iZ`!&DzF>ymWlCyFwZZFxMu+i5rP6noys#8IKtZvt-vw*kj z*&jqec!-%`^%cNF9-noDL0_7&%>~;n;e9{#8t6H%k>QCs@TBL;2e$(b9;)$82E4U8 z(8dw)zeTNTygq!@9gUO(ypc9`M-kBO>^&AkK*q4FIu^j=W#tLtfUJQH*_h`K98~*& z`ztL^=`bEQTnbn21%Yh1-QS)S@BGH${_QE zXdlDlBZJlpf5e1yVJ({+UYBMo#$acM=hfcd(lP!FUuwkbR3bY^AeKWP{JntDQFjM%`nGBK zyCI;$4RvC_o!7rDgk>?IWEmVTnl?=AuSv%OHL(8SS5+VkaNa%aLF|X)tkUp71vvK| z&LHeqZNh#QhnGD(#e;Fe?ko|Hui+K3k51|O=wrR`)GuIqu-^JVC-kR>wZY>I<2nPvG~NPGuagu78xUH`5@3DChmTK_Z<0dK!UMM|g>F zP5mySobd_l2#5K_>O_PyEn%Vz?K69xNKXx;`*%ND7!ctM4+RLU51{ipmDlWq-Ajy? zgr1*Ym_VaaI&Wua0uk~{iKX+ZH&d7(!t=leI?qgeMh{=5feAR=OIoC-rxG6`gnguu zUe4CLU>1be{n|yK;I^NHoqdeZy`bO6M$d1r4>UW->HC0I04|9@vjEDML-PUhZJ_7l z+YBPeUqtD6>^wc6lUtzLpdTxw>+xIZu$;NVYs=2l&mmi8>3YATbo6GSWBhG85}!4J zbnx*d_yNzx<^U3(Z2{!}N4LWYt3f8{HXv?YEN_5T#Yj9B0VIkC)WK>%=@lfh1^IvR zf!q<{nDyg$sw)U&l8|k1v7pDTh!F-Wfs!j|yn-?-<-e1lhaZDkhvPer)9pTjhabpW zPt(sAjkwuC&RjYFz@;@pK8%lnpugNlN8&gIvI`Cd)L5~{f@lEnXL8W>2^b(;cLnk2 zz%u@75yp>(bi}uPu-vwO3(WwQ=?q#$A!8VW@+@Jnd8x-rpV;`9Z~@-%Otp_O?5~ z-xEPDP`!2+<47uRAjXuV?NBhR%ZE=Ac5pT35#^j&br24GuwNbu*2m~x1KSheAMv$B z_@C2s**9?%76_>4^TS&(p6tOB8qRyVxOOJ_znj&HNQp2+8j!VRK6y#3A4VX#kIYW3rI6QX?!m?vyEFqUHiUZPz4R)+-g z63@Zj2H-_c&99?hAU8BrmE4DLbZ<8}qTsnrRF5R)W#ZGD_h6nA$-3}W2r%r}<=I$3 zSMm=5+%5|b#b9NHezpjDg!#{5t;3nPzNROZ2RH!N3jNoK`Aj_H=P%e^_P_cBkMS1u z2M-O@b8cA+pR=@Bv@~(L8SB4ZI9^06`4`4t3a>Da*_wz!Tn1XJO(fh-PMY=05)k0 zycPhIxV1(Y*XO{LS32fT3MP7jIKIFkF<*@RLA$SD9%!|-jTPHrW6rz*^CxDWWa3== zAdQpwAIH|dSD5tzg0Mm>{8;`>E?Za<#mbiO%0FLwft_hzNxadFdl zRXyf~Kg4ZXn??Ud#sa@p`X#c0hjzA8lMuJ+5S1%o_*1wp!!-N0UnL zV>{RXI^>D*0Q*}Ku7{KJKNsANr_M@<%CC0aXXf2 z#X-!tJ{q^*AHw>U!OZ8ly+r@GSz-NB&x{ksK>NvyDu6N~$?n+CE_YEO7xznI5{L3J zz)HVsM85t9^;d7j@fu_o@V#b(9^pPbE`o2(cw)Oe{OyT*E>;15ByoAO7j;i!+?SZY z3EO+VY8Byc**LH_3&(H%@Qv_)?Ejqf3%BcdiZ(d%fIn={hb59m}6u(%25JwcNyd>=bgFALkPge-$7V>y5-4Oe}i|E7RL3THp9jQehDvqVqM%6d|4mMk44&n0Kh!h z7fR&glow5`hqY_^iTocNz#lq+{%4&b!e3Xwatd;qCT0{cU!>qVIG~`L9Bgdx9EjVS z*caINiivQEVETUh$2NtKKQA38>Sx|~m5BExkp6$RM7wk%JfR1=5%LMqTvWkm)fflF z1Ny-I62^e4t?Ja0xuty-8tZx z1K39pNstjV7sy*R*AVze367f}S5hzm#OFk)4xl!CJp&`xPCDOue43tae-Si4=s&!p z^9EflXfBYcd!YLPPyT^w13JSk3yfJXD=?-Uqhll7roghLJG~r%1iHRvBOL?R(y<5s zT@m65|E9~cn6`lYh>ec-uhMZB{(BHA_^}e_`KwBF+)~&?v zTS-q^3C~`UackrFx+{o#7t7`==!UBYG9C>WVGdh)E)GhhJ+{NHoanU(nX zbcpqzSL(TrsL=ndm(of+AY(*4a8?u8jsemU#Q@^d0G9t}m(hysyb}L^>G7z+@dyCK zqaVvAD|jK6Zl_`_UH>qZE+4JIIYT-F`gkwjMh_>hZ-M^PN;&&i&Wqt+>ETjDL&Cj; zm39E950Q`k3Ys_4^B2L>4Dx}OToCwTC4R?>tbLQNcf|nlMpw#vu_BAFq#we|2ZZN1 z(&u%DCw)D+`y5Y1*zbzy_umHWD`DiqdF2OvonaBc0~z?`Fuk5f;B8e{-pRv3AQL?8 z#quV++yRE_(d{<9K$n%6VR-~SOB-FTs-cG`RMX{@9J)LYUq{CA{-)9Oxhw4m52*?L zaseF$h#rFc4)hRqu4beE-#K-18M+Ym5o10u5Z0U1*I}xF|4?fJ3IPA1K5lThH?T&R zz!#&6M0%}rs!%a_j#IBq=)a#6A+TLSoxsA#vjo~FI}-6(P6!fmni-zxaE`r2mu>gb z^Y?R!CGrd7f#?u!bBB&ny!3W6DP$t_W^2m`yY6f#hLH{auF_sO(!>AaJV#Gq6gtqai(z-HUj9EZ2EoBx}L{GIq^Z3 zMEu$H<}ea~*Iid9_A86=S48-r*bgTVErG>ChWcE zJ3xdVRKrhB!Jlxnkif7RHAU=4eExgq6xRDr-c7=MbjzsdRm|%O$}b+nJZy2(hb+AB zdk*S_VLWsCT@a2R^bLQ|0oL8WNgpsDWoIh9i}h>C)-XVUpLgB%1n!435|hMzMaA|?crXX+YuK9o zINfW;BMCVFmeS+jF=mf1FJj!f-_Z@@aZ%;f7`d5qU_ipTa`zNbuKPM}7}2nwS2n@S zhJCy0(G`p)o{udsez%$6!?;nllmla{+vF;Y%jCn%7$Y}@665}%kFgGxGs#{07hx=!gWq2OPAD#Whfa@*OH$k-P!i9?lSpRxh z36@A`w@+t}V(hFlB*qV)=7p13mj9xB3geL7E}~sS+*MhyET?J3hVjni%{3Ug<&JK~ z_$+W2ER@iX6<&rI^@VDQd~{!R=wVsM)dQAxI2XFN67BKIIvpk|%-@j=b9`PX{L%~` z4hLS#!d!vt!KyO79f$8S&MLv_=3Vx|N(1d{=;VakSzSBD4tK5AuQ|4&Ddj%c5fo=4Exqg^ha^=8CWRbUfi?e z#JI|qU?S#+aG^7-T(BNCMuWo?_}D4J7RoavrL2q2+p@_Kk;HrQgb2Z<#6{c zVmuW@MHBK)aePr6_zTB2LT?*BL)g=MGL2YoZpg|L>%;0Zj6}O9oV`M<14{Q8iTUwY z0BAp?XZY4ltOI^Q#l&;-j;!m7KF>jK`|KNRu#r` zdP79HXV<}U2l9z@%mm^2${%P}z?luuEm&@%+nJk7Pd`DXx8FQGMZ)32V$ckLg{PqV z08L`(^1hq&_;pdB2E8rL7VyY=dj4m()5CwRgqOhS5QoR$Z4@v~ksh9WlP)*GD8%|* zxO#wehd4a92d@N{=kL+W{olR+4=}p1-pQAaol*4g>8o_P9A*U$Usk3gyc~m&e=X6= z9pR_Tlel>y-rtpQ16&-)gqs&|GwwD({FP0NZ!iF^#?1uC4XXmieq20Y@Jf2?6&c^g z!un)bMKDruvjgg_#5=W;&(uo$MdHUP5H7t^9@|Pj_^A%oi(vo^UBTrQ6kb8hHgWig z6~wzamceOBAkoYq|1X{ZR)cJ`5)O+pA;V%qAZ(rl!lp#vU#W@H+?NZHi`7@eRZxKf zb=rPzxZH|Pn07dyINFI;-P7B=oC)<48I1Mru10f9Zxhm$YS8l9q59)r8qvh1PR73? z9jN8?EjCj-@Oy+V7^=+GBU`n{B5d(*kddTD;6`c-GI*Bvq6`yuX_XW?d^bYk(U+?_#xC=!Hh=+!!!gCdsC?hq=K~yp9_~iYkN13k6Wxiz^Y_YxJ?KQP`xed2KEn4(hV?qE8Q|Wn z`xMKY{0Z%kjkMtZZ;7nv^9qw<3l?!~uXBB6nv?&AYhsP3+z(gHgTh3uS3L06&dqk442 zQ?B#gz8X}gp~3p?JPpZ*2lG@rmZ5^Z6Z^8@|ATt5cXAV%l9A$+frm_IJ~E}Xutx2w zLe!Rbvo)%Ph^JFVD=#;!@?8Ih2kOhEm0Ndvy>#%Wp=awX@3ELL=A!KVnG6Nx7a%2c2O{rOI^hQ(-z z^uBX(=qZva5Gz#{$V8IrOUvJwvrv1@8jht_u=B0I@wiekqF&-NGtIpV|)(LAKDcS?_!l!qpA55#Vt%R^TfW5u^0%SY2u*CtfQ za*>Q_qs-3ad?d#kAi1G853!Yh6fKF&L6=LnN~CM&Ah-33vEh$$5a*ZTOFp96$TQyg zU`k;&@}3##v^<%Iets;nrR>Z{Yn1NU4+UnT$I;=jt0J?IoXFGKLw9qLrhZ&c@w;5K zbneSVhk{%*t2R8o!zc$m9!t>((#%Co=QmgR?$1M!I$3=O1M|=g6{QxTusp=t1K$~66bZM>L1v?FZ_O{*e^3O$Q$-l0*eaJ@VBZB8+Hp5$251lW(Dp`P}BNME~ z0`ibpC|R%nZXU||>7LSXGzY!AX1$+<^C=1!F53C6IveRdy1`HC%|R+2%|+Q^Iq;p< z@Y!LtT(slqdbh(axk&2mj!U945Pqx9U;0Zniq`r*twDK;9K_v%n9VZaeW=6QmL}eQaKB3l!X(&~r*s$NE+jqY|P zl=rEK#p5#r?4;{vC!)C55eDZuCL*&+W=Qy`G`{${wcYLY|?7 zi4Ql~Rg00wb{>xHekEvQAnTi3(l3y?zx>91_Y0Bt1Vd`;)*>`)E>Vq~V=XB(wRr zw{Jic+Ep;xC7Kd}qz8^Lh>1N$OM?5}OC3r>`}S)Xc{*kz-imX@dOWV^Hv&Ww9u0XTRvR7qhU>)`NQ5eu$jU2x9uC<2u5xrq% zu&jso8=HGiizQh;M^izJmRI7-k)1?)&d%FasO{9cUGwraa32PlUslXU{3)+C3qH?B zE=&XG`uvI!_vz1#mpaQ);jPM~1=cF$1hxQDmh`*L-L@_Qp)vvENqwXy%$vd^)pzyRkB8j>+@ZQa5IlrFN zqN}QhGmLv1P`VbaOYB!Odba6$#2dy|bcE`nwx6#G{Ue<)736q{wlqCe&a`Ym8kG&< zoi|&MixHQd(fT%&(f^}x=2r#E`g`eE!p0h;*CdnN)mD!V%SOK4aW>$Y4|F3( zw+5@CeQl_A=AgYqO*?Wd^f`6>F7SfkFsb1m?@)Q|f9kHAdyvANJ=)d`ok%Q`>-k!> zPPF}C$Y@Y-C;F<=_OH^o6Gb?C)C|aWqSVq2m2Q5W$aL3+7o=aEXvBX*=6mHX^!VoX zi|NO^kkUDqKUN32kX@aA;(Z!mZv8d`#dnCe>-S#f>37KdbI!Xe;3xhE+m05Jx{;9Y z4Ws8^CyCN>Z*jOA-RCMVvYP8bZ>~B>I{}~KFOR5|Wa~pag#XmWvi6{h2ZR0-oa{l$ z{$4aW?LH(W_?@95vL7kz^lgph96-;K#rr;z;5};5X_j-ZJJIaSC6)CKUEoKEA1O2M zLe|o1%*%XTD70WO0Uho_)iqY9_ffl$;e)2;(}wR*VZ()UyN|v@FAs$(`z>^#{QIYk zKJDp7*FG7^MZM}q=?_$+8!q&~`@hu7yf5~k-YfU@cZ>8OwH$+*cYJ-w*2gtp=w2UM zd-IFq(z9O2iE-qd>O@t63L0EX@ElQy)vFfX19x35&bSKRL%wLI zk#p&97n0)I8G8Ip7mAIuGYwq>^?7>8p+5_rZzv@j+=2HqoSPZk^+Bu$z5mv!!1=iw zZQncP8_Lp+x_*x82z7L!c&?)Mql{fhqv5A_CDOt#utxlbN-VN`^G}}L~Hi*vsAO|qb44_@ohev0}`%#{Gt&G;?KEzrQ$-v&%i&z8< zRTh4>qtdsd|LW`7(QBH?P#?XH%5xzHg@vHZ=dT}T6Wq8j~y9j=b#|M4e z;eS}JuRb`nznFs!rp{mU$kgM z${VDAet>y-=w(XtRBZ=3GPe-CCZ-MP^|n20J=2V+Tf`&_sv8k=M5BWojBA(h)#=}J z;kk_7{SHgijwHXR8!er0LDdXTdM~%WMx)x?-uEswApVL?`^NXaLajO()3KH>(dDI+ zs_QGO;5+m80{h^-GNqOY^)GcA(D!v6ZGjE1kl^FaFxj~p^jD-`JteXl`DLjei@i=m z=f1NzNoh7B&N!w}bD4Ui{_4x|> zsn~k-CYK}Gf$Jr5P?i3Q1S`ovZ~NTeF@sGI5Rk(S&DeS9vYove}=AXb&84W%t0Tn zTC|)QO+~+ZrOkaGB%>=M9BS7e6r%ys;T_S_g{Z!iWbD@d6tTIHeMuY{sHCp#`frys z^dD{DWYoz*B-`Kw`EL zilelA^cAkxd=)K#?^W0edX*)k@-DvGjPub*jb`2)z#W3T$i0n>EMaJVf2yaj%p-Kk z+xk$UKpJxMxoxhqB?Zye`*H98cOOL#yzmejzJLm>a-)N7T#$XD+?lcuMJQi%UuO42 z5t0my*LbO1j1E$)PiV-Lpg7-(;Mmy`WMm-bsN`1w_lupz`up+`YsDtv-sU`XTJqQz z9{7$^wA6{FCW&06>*RIBU914D{+t;t6Pu5EH{ZGzd^`^w;yrazR5~B^kA%rJ|H(%` zJ=K^!_dG(BVSNGZo#BP}+Tg{SN9#s}-Gn z5`<3qHhWBw0@3W_)l%<%Fp@-Kp>lG-OXqA{6BeO#i`?IvCA5g9p&Pqj3vWS5 z=;S({vNzmmsJP~a{fo$_XwrZEm!;CDDCp1kWs$wf$cBp{eo;3Q`JT8&mVc3jI`y{} zlq3RA?wm6XWynN&=+nt~l>+oA>7CO#hkTU%HCS7(?J0WsoTW+_zNf+Uyd#2z@hPIc z`P_D}Bo8U)v&z_=g#343k_{FqKp)p~=@@L!N9oD-joe|ofiGrJqJ~;GTFjbl7p&~`J3XR za*%_0|BWV;jeaJ1s@Yn=`EyUP_Sen~bgOSECSWhbt2&rdd?g?4IBug*6qt|pFD@tC ziOGcL!WIAaNF|^foZW(?fDH6rDD=TOu3|KKlhm~FcPVlXPmJ#n$wEi2Xg&}7lZ8IL zUM@Mgn2sjbe-o@vOGVOr7kZQUo}dr;Ls2SB`RHuGTkdTL)`z_b4JxHF>B+n@nsjifQUNv~iCV$UF?f=Q5IoUiU zlIiv-RwWnp>3$FJoXsgkU48h?Xbj!JK-#mQ(w(oS&L4{d3=boq!hziI?NlM3l{R)1Lu9db(ZS^QY zM|VbdPxlp|Q+`F0kr{dL9qJdd(<4-T?Pm&ad-;dFT-M+tR|Z2)+H= zYS`LYhL&oN?7!mo3K{Xhck)iPBkGMpzi)}TD8#4b%N(5hi!NFC&9A1S-+i}_?&zpR z_qN_0yuTIhCkV{%&)HEQZLG`ha)Zurem_5#6 zYjVz2#MLODmPu+L#RMuu+w~NXcDi@Jm@iBtjeXQuf5f1fWH9*lZ})sWX>;J)${*Vs zDqaRQneLsfArXVt)`Ll;4bv=fsl4S{dj>Lv?Qtwipaj@;%3InhE#f}5@qzgPFBW!1KDx&Meb%MX8lGeRQ`F%{M zip0UZv&LuqH|fZ7(qC1>4w7XGd&z+{Wfd`hiaWQOdJpTQbK;SIV zOeo@l5;dYEHRFDD0!!h92$VS*t`&bk6=mNk2o?=ecSzcN@Uq)gcAv$r4#lstjFBsI*@lSG`Tl$U1`e$zySrRLM{es$p>& znSK98yV1g%!a290j z2_kFGPgIR3#Zhl;D=?m@3!y%qx|nkzH=L@jJb(Gv-%zs3i%sKZ5m8jPHd@eI$s{t@ z9sXShV&kdk#@oyL<_gKC+%>uq8?vcZuV;DgBdK$p4_1d_{2$VG94frd`K*G zU94l#G{(P{9%8=FM*HQG691^O%X2~s`TKDfPueAAVYJ#XngSQh0 zZ9Vz5=1p@(N^+r@`tz=N>Sm^N#jNNB@|BI1iT%?|w10)^+3?X3%H#b)1FuPwuJZWRK?!bkSM=jcDW8SbH6JayN=rG?=zDDGx;>r&HNKfgf#@A}f5=2%zxx++ohuip8`bMgd5 zJI5$?@|qeYV^iV#fPeQWW`)6Z{oC(SXgPs4s#Ug>wLE8b>s&fT@z5=ND4=RY;gTD^ zm!9N9+g4=K=5zZV&EEUCV`--=E$aL~$0sKoX*NbDEXAknX*1eCx(_?1)2eN#Mp9PS zXc2$E-iCK%y5Bzu zOUNZt)_-*zuk=Wxv{c*K9{F&T5`RFy^2_3JnuG_#AGg*WG-n4--N(Yxl;7Vg<*)tP zM?0|0=_KTInzH-UQc`f10mU_f73aodtloHweoV- z_%0zO%4KJk7hYPzlw>paI{qzi z&^nhD!-GDEQmWrKB3uyjSruFg#Z+^w3M3bDn zWY*v-N^vn_71*fvlpOjtuGn-qfReUZA~D|LGKHF(Yad%}OtX%UWJYb`w75*Cx3F`a!fqJ7PeD;mWTk`#;*O9g| zC#Z&p<|Z!4T%sN}RDD!#>PNoke%Q&bX_2~a0sWPKGDlTW+s~la+eDVR6*MODx|m7{ zHn93nIfU$@>-+gyk~}5irviDLVT%04E>^yGXn~rz#U^Ki)mQRGieR?@dpkAFf3Q*g z{w?y{zh^^6$|tEiE)*)WrynL?9(3afea%U}W3C?I9)zgd{=B%C@!E$vef3_LfTcNk zRmgP}%h6-hEfym`63^}@C&}IYFqou3mXWxul{4oPt>MBsa|m1qyrXQ%@Lu zV&;9rLH@U`y^&I|o}Al}VW8^EN_BU?lWTa7jXbQNsj};kD!FsS>yuf_PHL7z{>1Fn zY0{EsQN_DW)1-x`#&JcS8>mX#B94rN9i}b>Uc1A$kxbquF142>aVvG5qKt6YhGCMU zA@fNm>8<2REs|Tf=0&PA>ClKuo(a{gnor^WDit!r{Er33Epk+yAPrJfq?*g^aSY zNA_Od=YDM2*|S7OBAa9sg+yiuB{Cu;Gwb`@k5xv9Wbc_Y2-)N9U$~CzhwJ#9=XIXg zbX4RGYrgY{83ix?{O>qHDB4GNx#KI*r^;C6)u%DSW#vJ#5XVA-*P5Qf2{mf$;Zfvh z&xp!LTJ!fK=FlYhal0q)d!EPK_R65!@9rv{@z+Oj_h!A9fKg z*Vhg-j|~%quOG53=B5&}R!9e$c!vqi7rt3_G%_G0^a1L-PE8ZpQD602a8a3 z%5Q|vJ;wQ$-LGR!j)~`c4Y-h83ewgP5=umcbKLaEl^U~ljShJJh!J_2SaB=YB8Rx^ zu6*{sO*`THP^hy1oeIJw*{WW5|2l%8-_0J$tr`NEt~{D4J5HdV*JUKT)J_nV(|19iM^A48N|aU)ptW)yd*4*)s3zXRua1=HUuwj_Yn#--3#5XH4_rVn5!~j z5y9z6{B=*wWTLwDUic4&$ArIJiQlg6)e}3U!b+GFYY96Y@MQLddcu;2c=Yr8WrX1B z|B^#7RYKvd-^YxL$_R48D;%FsejqH+#Ob<9HW19t1V!dJG!XJ%yfsj)sUcps)y(xK z8zQW1oqDsD-$-aoe#@I@Q%C5V8ZQiL+$35Yd1!uOsw1$riVDm;FDG95O?Sdat&k{{ zf*g9ev=ff=X*wmQb0ETv^&7);14NeA8=_RDCk?=# z2Hr+w)yq*NrTsI;s2lYA?C&vT%a$r3%4`#3l-Rl8XS$0Wt#eS7hfQJo)|A38(#DY> z*Hc{Ed2?9#CWX-o`3f>9OgUGew17Fa+=!bsHX@?x zxq>lsa6PFrCI@3~IWKJSEsRCAv+6F(AEb8jSXthsH7p?aw%3&30XDyHDMT`S5z>!z zACMJ^!lVeuUQ!_dR`s}86}H4+#&gBJ$`J(+8@uu6udgU1KIhC>iYI{y1z12UejY^N zR;0;?+%QL^vTeOU0kEGaAQb*JhU>G8g&aa0aOs>xegWqRAlmh5>B>qwX5K~0Iz__( zKmXaV;N~)fxAsn?eV~^FRWx2Nz2~?fH0*OD7GDH$U z)rYU?NlZ~XO<-y0B7!LE!0$hGm3Yc60cl+YvyqH947@Vs%rM~$Gn96QsE)Ki&x5zq z@)O)3I+}*lN74|^wmh|=d-MigdT~EIlH>}skIVJy54#Bxb35kDyKjLg5@J`g)=Nkh z<20AZl?Y!ji@zq%@PIiC0a6V=oxtU%w3KR_@sQ!vb@mydXCQGaw?kF00OZ}}q`6uj z3>LQ?j3$|bp}ei^O@G1XU|X^%)wVGe%2zuYzZEZsA%9et&s9H$JEHw(IfB!{g;UWt z0;$Vj0w0~p$lF}FL8te%CB6w1INF5?(l$Zj$N%Co8LEM=)|+UzS0iw5*zIsmX&!7E zpJ0h4u7bYmq01?hWsrxHJ1*ro1TJI2`|sO2;fcq?kNDd$AS_SzC_r%%K+%c=(Oj0XRw>OLT#WzLjAQx6x2E$*SKnXoBrI(NRc6gU+>$o{W0 z0qj5P64iV@2U-8YTkXG}pjrE(xRF;Q{1B0*|LDnQ@E~WQ(j(^wB#JVq9)G_FF4Jf; z><%A8OBPf2-p;Oq&l#&PI7tp*gKvw(sUMqQ(pZJ9?;{gRu~v1Fh)+YYm>?aFj&Tr4 zpt4+0>jRPHR0k)0-++NPNq-A(tAX#I{^VhviI90QWWr+a-@Goy3g0(ugxk9NTd$+v zLx;FocB$D4cxmhVPUp=$=-In!QY-xhx_#ezew(8J3YvDCLlYw4$&c}+v}gj;ZO;#U zE|ddbzlj>{KvHzEBd+DD-d|87RW8T*;TEtu$LnUw*$b_smCQaDMuV^S^?H>K+F`3t z-CVKQJ}lDkkyonShWD+Ox$dRx!mSrgIof8M(8N&Bbn99YJU%$$F_`iS@ahLjWG8z8 zD_zFA%sUSt6{cuh!xIClT$7sW-@b;g1cL7VCz1~B8qUOi$_WDD`#R%h1J+RaiA@Q4 zb_~Qhor|}ED}jkc_=R9%9MB@4ZecNqgCtK(cKV*(1Kii!MhQuY;NjhG7uw%A!e?g& z%Ab2e@NqraA-!<&OxO(B#h4o=r*vk8*HlrVG z(NzeG#^C7ZaC@qDhxCUKGz5~H-@v0r~aO46owVIhr2&N zmIMYbgDqVjB|y_UQEyXAq=OWcsX*07tbc?7r*>!XoVO=Uv$pKvJUn zo9T@t6qCA|EqCAz8BYsWYa|+i2iEUyT~^`%=X!mFGOj#_U6I{s^iNZPL6Nz<`oJS_ zB&rxyMeYmx(uc?YnCgJl_WjpCUiQIJ?vU)oH*esXW9mdzs{+t6@b=10U<5pwbmYx4 zf+3sgsrF}^a-eEef79p4UkCvgn1M{@7nt2t<196g` z8N+%S&^T53Uoz<+ay4R6vh;Q<))Tw)bets~(L|4L(|(&o&K&UieJJFFo^2tU^|u>-Tyeq;}5AfXh;FQ?UF1N z+X*P{&SDX{5(=4$1U|GotHai`6Rii|RDqS40`@jZ1U?#Lt^aDWh%IHh@`TCGU@ydw zEKb!_Y~~a59>b@2r028AFC)$jted-hD3B%(i8^_(agU`AX??FGaWbM9yViLnMW8Sn ziSCx4zCcXGn)Pj)0+DE}!t!F$p8g;bX{MRfsf;0UnfpH#+bglWU54P)`eMX$!ntT6 z+7o-h@!%`JGX?wzRgw5Ng_w3eMXdhi4&-6^K$+Zs-59UBjiu)6Hl$z9O=neu1Y{rk z8$^F@3Q^CJcaU)Zh47QyW&24vkL{+-X_BOU!p;Rtn}2RCLL>+04ndqY<`zSspH;ts zHP=<;bbfb0qQez5>OMJQbnk4~LTH{~GDj9plnM`!%@@x|MBZ6oDI=ER4HcZ2c}__c zWAb%GcA$&pF7so|RqkEkj$mqkoQN|c`n|$jvV#rPux$E!FIcflOsc>iHCaEi~gHEjXW*k(;tsw!Cd}EGoQL< zjqQ9sP@ACAMl3%Gk3Pv{#Edo!F*)AfM1Aw9YtEOsktL?9OJ9!yG3!hcal3kFY)#vc zok~m>p%<#6VP2ER4vJ-d?v=7*@dLTu?Y_B)^4wdl_a~w-*PN%sK}Kx^t}0cCC}<%Z z@d7E_icT0)TV*9`&V_Kl4Dhg`_)bvSo#$nf86s{7Nwo&a&Jdbe>jAspJ)++u`%J?D z7Hru`qjtS;noyBHPRZ|%5zc?>lWkdTA{uHO0)Nff$~;|W_2U)%0fK|PjA1ENa<`N zh!?BQS{UaOGCJER-=}mEICdwdroz7wpNhzbi#<&w=yx9QRt+~2pK*q|iDl#x{?tud z5(6fQ-$u^XZ7ClSib`Yqg@Qg2=kMisMcp4FI1ee4KINVx8a=1FH|>5Bp{^)Z`NhD3 z1G#d zobulzG>5sqPgYta%FEnZ?1*Q@urDt1*tS1*AO)}I2(ck5=|683a?xPpKmPC*2GS!U zT{pf9uJK`ZgZs%pC%q7!ql}Z+Vwo{xKJsxF4LZbvSR|nJ0Fc1+6?rIS}$YoBPzdh8Te-o%%>L6#K`jFFpFV&tV1~ z=YO3u#hTsanrA;*A&U;|vUflFU}6z%4BFk*$Y%jpXU^&f>@%S;gta*g;Rq8u`K%%e z6L|je6-h=W!WYg(cu<~$R9v=PpuQQ3=$-e}vNyPc=}`*2d8QYF++wbFxZ`mT`}^ML zhQW3m_N9@TD^c$b=F4A0d-A{?Y2HdSG#K~91iFr|-O&ogc--FE81hvi_~bH)i*PoU z_KkfqYD#4-u=o$z|HXFZO*(`I9d5ugXnU+Fj~^2njx0!Q+I%`vd5sUqi<_!cvK z{y{YE-`)Bll(a@qNeK2*nw*lY6#`BSwk&VCr6GxotH*+~7SO%yOk0bK33 zzUiBJ3wjW;qdhcyz_B~uG!nYqA@Ad1Dsy@t&~AS~oA%2Ea+RfYCs zNPT6Ipf*d`LKdxUq~Qrjz64p44n2aFq|C9wy74fX^-ChQ;SD0r4DiIIoFP>R!*5sG?&MB&J|166NW94+hTp&thHr?bP& z`(OU^=CujB-3$hEl)+lAjp4B0>X+ODg(RT(vuajRAQy7F9XtJBH-xH@LXE3WYCyB> z$A|3##qh^!b^m&M3HT-4({qBQ6^b+QvbOIpgD>Z{T%OOrfkbXb^8Vx)U>C3-?e5VB zHA9@2;`5e4-Y&I(I`KECFFelv{YDKan#)z~n}M+H+y<%Z@;I2jJ598ZAAnbk-7S^w ztV2KPa9_{uO8EDsE?wuP4j|%ymIiXq!M}n?wZ_+XFg7qF^q1l;Sa_D?3_Ay5p-0J! z(eDG$Fkp-=RBa4=aef}*(LjM33SHRjyibCEgwBPO_%RfTn`jTsBE|0o3p^9k;zYws zTEs*w8E`s^ORk1`()jfF?fM~|HE^0dPNw+&SjQVd5|a8I27B zAFA$w(#taZA;K4NaNU~r^(kI-Zg}a}(M?gbtnt9Ohx8=cJM)t0o6d)~P7}{MYBNdI!=e2mv+~( z!<9_s22cJ+f&U`vHjuw1!F8+r%5%4lqr_1iOZ!3o%lv4$>oI;fy$Iy0 zCw-q>TZQ{rfV)Z7E*J-G6p+1rQY;^<7`=(U%lsAEs1mTK0({@;L=e5+*mH_(89%JU~ z6~rs#UO3m~UBJ^)GJ+{)nb3EOd$jZ-Uz>yA1I!J0nh2Fu+0!ay4zi1HIk$gC^W(L;7 z>h4n0^}^JnvoxhuP2f87ZqU=_YS6l@TU;}e3Df@aE(&D0fOiF34-fMDAXj$Fxqj_= zsLhox8r#$WJ@~(tDc02jTK}9phHshBjeDeM;|*@Q0komwekJzwh(xM_uUl7_v^4~O6(QQbq%0b#O_8N$ORcMP=J`vM@UUx zZbSWdeekL|RZk>F1-4}%c6>|{@E!H3Ia&TwfPXPlcG!atc)qSa5|H!+DneK7_>!-J z2h5gVw+eWHPE@!s-|`N|;>R3r;-&!GXhO8!2R?_yi^Wnb1))%RACDJJx&(^1hZ8q@ z03Z>WEl9X>1;j8Y1Zhw<1G@%&Bl)N#P%LyhdSxvRuB4p#^s~z!ys%hiOB3+|va;9s zVg+fT&4-{?OyUR|(eZvGVZMvBEQDrJ%FbcOxyyF8@2z1$7cKraR0#p1_Y&Wi&;8ic zfZ)@iksYi=zt7`1LVf82zOUHV6ZIwmHV9M~^{2JBq67_DH7yZAup z{g^i(l(VbMBpSomeFF`REJgT~uIXVmyE6D#q5JK;oeVTcM^0J#FJboL3JN=o!wA8p z;2c$HK2}0b$v$zAjuC&jR>_RlAt^SO!+!WKVb{+zzF&77#!mNpb^?<|WJrJ0Lit${ zcKhrlvN!R0m_$y0(6AsW__lLQm3(;uS?i|%zAW91mG9J^W#nl@x?@{;tS|Z^n<@!6 zlH57q%F5u8Watn=Wko+I9WjQCb(aPI5go-6#{4we*uNq@SNqzCF-q{%3>nMxBnzzO zh=7BCP67YX;al&pL(J#H>!;OJiAYGYkJC(6EwXj8UBi$m5@V%!9H*Ij9kZVyNi(Ln zg@oh6g9a~su*YG8FOQxkV8<`h;0a^Nhz{I3@j}5Bz^wnvadI&Z=f^FsgBBWKKiP4Kzs(HL^cBkH2&sbWMx zYV&0C#g`Z#@OWOS{1jRKVOll;gR%6QnnyRzE+CeIqy<`PQ%J(<8}$JM$KLOad7U~} zh|F5%?rSvVAfMZ_ria>mv2$BJKkEb-kse>@iS@<&eJ zVDhUy61n-${M)96_099YEEhVCJU(wVN3B7I)Z2ZTs`$sn_2#R-j(*p{f(;zk%eYLC z;&)Ks`JMoFltKQ=e&7Uxm`dFePUS~Zn3d?oCS$NAp`fCZXO@>I1=AkW* zvnm$K8{n7!nG@rE^VP|qCK3S~GrJYFi5MO4c7-pQGs3d>GWoTHDkjz2NuKz{9`i~m zi=Lk(M|{@qaY=d{!<<+ROqSV65Utik^kA6`IeW%^a$@f)CaR%pnysBl2&BF|{oU;k zvGn>#z%U>~j@=mxMqdeI_`{d}yjEsN9A|O%-sC2+uQoN(!iWk9`=e-cQ-u*TdG)zy z`#gf2iuam2(6PljrN^3GYR@7p#G}S*`ux}n!IB5ZX(W+*>F*NG1Q=lvCfEFYK1(Bx z@hA7cd;^HuvvcF-tXdd<_p+v~oCy-ZJ9C^;-ygePMRKyBJ`Qos{8LeI-VAa0`|?eF z5)&p1lGFPN&tprjaa5$QjWH>WaHDOWHpG-Ql{~+n16i=AHA>##NBGC6kL;glV1Mh< zi}_*$k#AqW{>_y8x3T7v{I4kNv9qZUKGc>;A%oXV7T7*%BPH?CS&X@lvCT^#PhU2; zj?MUu800C0BF`C8i(iC^B9>Mwgqys6So=)<{RW`|B&nO8$I)&OS$aAh9(5)hDSOn; zn|?YJ>3VG!Bl0~Jvt4MoB}o4PF?puCWT{t*T$d@oyLGD{Is2*A`shbDcDf{h@AdnB zHhShfVm?1cj^aJu9)t~JdeSPN z&V|wdgQ{*>vFR@C{%PTXyAmIfL7Ez&F4jKmk69M+Ue_9O=GMu2tE=pgi>dB|i1->} zaryI){)@jc+E(9{+D~Wg4<=Aprl6h14pyc0 zWq5MEfP~t&l*w!&l6ymBe@1r%b8V#iYn0!HWZo)xD&))xY@^dpg<9J~sd_d)XI6H& zQ7SyF;CLGJZ`MAGaM{DU%F;$T-^oCk(E8tGikCrPOA;KgQUL>^)h9&Fc_6Z~d9v;- z3GBMQ^DEBH8fZ#uKf-Ck!RCyK?ePmHpmWo%f&Z5xB&qul^!|VoIJI}W8aLktlv0PL z83cc5q5iA*!K+|Ee(`&0i)sKQT^g1aeRmHS{T)@e(t7~O_+vFDbJF29zIp!nBP(dc z%+xTcWdhD<@7O1X=)y%cKaHYWA+YmkP3N}ebI@Xm>M|F4z?(m?FvQsn^s=e>RgDEe zwY@7R12fVAmkid}Z}1MDjWy70V9x^FLaI~4vM=D&Jku+xo;=WEOx7}O`yLuBep}I{ zZ2}5+|I>W$k_W^s%ib&emkX!#?;LfnmVv3Gu>i00q~3EP-MgIJuq|L zFI|sFhZJcwg<}yd3qI#c!XnKP>_TvHM94LPm``{_4h-9W2V9V{J6d=$0UB=-Uf3u(VsG zjSj2SO4Tr+W|n5s2c6?q)}G z6i0+(NO6vtr_hA!B$+>v%zd(kQmEq%tJWBE8XXx^&OZZS{mDFmcI7+en zget$83};4nR}`}p(Loima;~pNxQ1c#453XI*L9$EXEjtt8`M(ztTIK>ZyE^Yr5{?j z<$J=j0u~p1_8rx7-yIt?BEe5pY@Y^K{LQtZO~Q`WuAN{f7ruhp`uMrA@Y>*q9nNn< zL+x>YJ&`Uh7CQXu)K9~`a81;^o-^ZPtQ~&0bY5eUppEZie037C*U-j6YfR=mJIWyT z#dPtr8Gd0?skuAl1{yd;!hGoHi8?Kpouud^;4TestM^h^P@%s6K2~WOqZJ!rZLSh~ z@N~_a)8STW_+D%zpFNU-SJHRP4)>7bg&m_chNMv_WexFRBy|>EYH)H*;!PQT%ODTL zp329^Eh&!IKC;IRvnR*7Ybp8tvGWE{J^#nPzT6f(3J?a7@2s%j^O^ zFyeAz{k|Cfb7QLf*H13|1o23sV1fy~KKZDe;u9&F5&8O+yt)<|P#RaHZ>Nafz^N_0 zHA(RtTpbM2(co@Wy>-*QUqDe+((_+GCU$l9=9Brm$4KPM(qXQC+$xeM{}U=t~XDM_Jn8 zXj#(X=Y?t?^a=R_MZCpTe5AV~Gw7NI&i^4kyyQO(G^@|`!A1dr zg6Lq`KXemIgDN7z^jhM;j!D)(($ph_2klt`qX?i~aY`uR}`l#3GJRJ6*!dvxUCj@cj!TA!7=)&kRfSHCZE!lmAlD%F= zBMosNi+Gip$}a}2@W`E+le+>v0#!p=E3ZJGi;eYj5?8?1-I(K|v}0dM(g0T#Y0*JSbx3*s;=u(=Jy5h@p0aK04p6;Rk~Crnls~$>k~?Dv zC^);#g-vC_5^anHK41Y8QdF5wP+jly$0xv#+MiA{F9cfn6b~NfaRuYgN=VBp z&B3_)=XW+CrNHj_#iXW;8c>pVAoV#V33?hQMVR$df{mJWmAlk&pnAK`s$@?O#xkcX z_fuVhTY1j!on0A0X3cN9S^mEX?L;LQ;Ay>c}Bp8H|e+G{An=%UrapH;W_wC zn|nK@o(i-$v?r$j*~dO`%ni5~TSFe#o{6a!EI|2~3U7iR9k_O|_xbh&9n7}QSB#va z0clbP4UtW%pa)4B(3mxZ<5ey^LH%5Syr@GJ!PgPlStP*6kPp6n(4)Vy9uJKF)@U;3 zU40rFdtPz zuIF7PgyFNTTb`c4Lp@WSK^TFUR< zZ6PO)Xa`sC_925=4TZ{%BN&-+W7N%`)5r(gMn8dT`f#9z@NWL>Imn*Huv$n%1;kC4 z>~8%>4tH+HjQrf zsm)x>+%uYyjwcr3-=esjm=%ge4tFoSpHac6#~26Tg*oKPo4~NcFh3;Yu}p`>*)(il zSYAu%+f#(5KWTX8R}|*JsLw)Tat!!SJF01W4;{xe}fqh9yrQYisd-fH)P%f25b;L)czF z?K3=g1$nCTmfNw>1`A@XxWbNyB7L!*RbTuwkk?CdwU6#!Muz%K7S=4CF%}^nk}PR& zWXni}@t`dpqfL6;k#V;Gv$}uauX)TB>9t*tsZ;jEg!L$;?Y0Au!2jyszm$894W_WD z`lKKVuddQboPeHwL1!%t-+>5dhV*Ep6C&dc}l8wC-_ zmVdAFSm86ojB7sTb!suTxm<6h7x5Lblc5-(|JjIH-FjqTul*Y7ed;t%=~9kmcAu1= zzlkH!w=cSSam-*Ij6dJ7UTj8EpC75;w|k4o=ocuoVTDK<3F}w44v4J?BvI|F%ppeA zxr|f47{O$db|o3}1kw^f$4;8ui^*Sb;FdVij~twCe+sTcES<+`h~+FPAnHXF$Z~8T zZ{!nNye_O^IUYeqFXwj=-k2%-S;2GAp51&7nc;vnqXDX?^u8gAYFCfqkzGue(ZL;i zMG3@ZDc`xBl7QJXdGo;~Mj+&V;B0`<7tFn)NsIsaF+g`SZ%@RD25Qdf&w58m1Nwpi zk9+j&pr_Gk`-dJksH*v!sl~zrDVuU7V7nL?&5Hh(Z?6MsH?1a*??{87_7B&@6r=zN zx9t_z3IX_5E!?TgOak=$XfZVQGKRO^z{An}DA2P`JwIW?0P=r7yjgD~3U;Ft`hN#1 z!L69b;t%Yv0x_HTg70*xU=ruKIND$cCSLr$vR}D{bW~g9zVXtA4!I*o4>s-r^+?TM zA`~%j?ek-$^mI+YUlPZ9G;ae79!C%C|5HSdQ>d{~yClM*pP`l!b{6n?Y>hj|J#TP7 zp0|fBLlUTZPgS`8xCs|YX<1^vB!TrHn?Cw`tst$7kzI|np!lW7CP|r$af%hde)JkAVeOCbJ`M9NiOGEhRcER`TS8YFnSO$F|gAIPsDzIFZ zkJqcPFQeCXxNG|6viH=trY z*Y=6?$51Yn4wc83sPLYqp+=zwHdH$>)@0OD1?89RYMbL*17@q)HrgwsIO*vxYxPUC z=*js1^!x3Y@e3P%`NDD%_^PkEGUFLabU6T-T6!=K%yjo|jfx+_w42745=I4ah5c)* zmv_w2v0XiwOq{=n}D?yy9 zX3Xs6=YM*^4+B3Fp?^9-H>K!l9vAettbqEHbQgS~HAJ(Opn}!~i*;^jap5$t(`8VOl|IK6?)mWgPExSnRA`@|IUV|UI zCDCZ9Z2KF!uv(m6M~&%3RTF-Adi5Gx>K)YVZP@h5iCbuPZc~Yos~&#wMQ+)Cj6S}j z3|K40l+m~6-gqoTW}*jv^K3jqDQNC$r_6Ni4U{tbQlL|W9ZsTpE^>)_7tn{dJ(QTO zLXjsDT9l+^=)cGC-X}39OdDTmLFFZ z#4mU~v`=l-!HXEZGV6!&kI&YS?#+ONuDs&MJLB-n=|bh;Q3iC<>q^7ZWOnpLN_^h2OFK~e2Pu;M z{u5j*;Z)uA-U7T-K9x+zuHchi!B!WoR=|BfhA$l@j3}EL>9<$)G`QE8t>+^9DhQlt zyV}!w4fhJ~+I|(LjNkVDf{t~FqCuJiuHKL6@y+MDh4YE$aFgvBJtl+CpyEG|9J1~@ zpnAS!qntDwTI@K4*vm!$?-5gqaMN&Lc>iztucRZ$0Y0#mlCgd(dKd66^o9I*R0cUJH}nl!8(`u@$~%RK8lc9){edi@2wG{I zPa72<0hCL=N(%e|;I0p!eS9AjORrLX1}lJaO_~sr+W@*Q9~Xxc)c9L=-&6}~^9Jp7BA(!gLnSF!;sKcdx!>odVg*Z|t zmGI^^=)2mP07tyavky6g0LN#2Q(7IyijV|STFp)0KKNFkNj?xNys$UbeK-OJw0pk3GkOV*7ms~Tc$oor!%{L2_7cDw z+j3{JxgeNn@9txxtOctH*EH@AA0nNDeGA3O$3Xsn6VK0V9%6PmjZyYj4iT1kJAt1s z48V2Tl~1Bn!ti6Q$}{fL8SFz0vn1EeW1!Kgw2Whc3K~yF8L8hi1b^%qChyv41Ea?q zu}@#~LMzMuUz-C|K*#8w7dd*m>RA`+%`uAOwGafV(;JV#x(bb-@HrH3}d3h-tl#n}#rE$qQ&d{dz* z3FucIhBvRbAeK>{Q*G`Ftu*|$#eHrl*wBS)5@j*gr zyV>PW2V%*s56sg%tdRirpeeTU-^kg4Xg2~3LtN&9Q{|nWVYNw*%m?{jAzAOvtj7q} zVl6gCGR3=H*xT|nhbNI~h_lh}tb4XTn8_CVrrYFWM7tuKGB~aUQy%)1dGhfI&?9a& z{e`*;k#s*MyI5O|R1=on=)GDoVY6yA$4~PJg`$UI?=C&?YJ|-a?+VZI7-0+n46(+Luo#wvfN$*k)1J8s>Y?O&7`AK}huPKE2`h zA55)3Et^sy28(lCNKcl{Bjy@8=br49B6ObuOyBblVJ4Q;VFZSCM1(SN#ARC@+s%uTyf0_DI-L8ka*8RZ=y7GJ$*dv{Q8w_iZx%QmaX`YH z(T@csVbE#vaq|uBW!S}(nfl8gfpu@H{bqQW0YO;DMrw^4`VHK$xqDj@h>9SSlV)Zx zZ<3+^Rf03{e6wSh^Zq>Wp|{uUqT&OQ_F+QHTvE`XK~}i-jslopF&(HpO7+rc z(Fdv@nkdJDbs?8&t&h`ofcg&ST}b&&!8DeWe&&}tG`Q0F z;#Hb4;J1=-uxY#xkGdT8bQ)v`{40UqulFS!? ztwOzT56gfp4)3d3zr6y~uZ%m&Ckvpsf}#gE=K_qU<2OJ1k4JEIOznjIk_AHzOLBw^ zA82ybQYoc47Y3G=x7^R`18;6SOpwc$f_D)qMx`GAIEl2*IiY$7F!nv5)-&}ppyRDz z;r*`}iYw7f76!Ef+f(iDcyikz9a9psB6~k@a*H;WXCwGE z_2@kFBVQ> ze}{2Vgd4YiZo;C?MKiWXJg8;POIuNkY@iz%l9w~m41(x);zj3Y;j3#&1#4VPXvIU9 z(ab(}w4r0{w3F2qID4}<@V3k`{L(U?p%X0)I`7*5PR?5tXLIZD-uXj^OHuQTSB8Cq zJyu7wds5`+V%e!&!$C@1pqu5RrZ@*K%u0dOBv_!AEDqA^zfs{`XMT>JvgSeys}xSN zkBH+1HRkL)qME3SPZ(2(Q6n;u`f;(E+UOAwWwx;B!mrHVf}^Mcjx=r(#I zZ}g=+Q3Exhl~kbBlt#;Mlg_wVtK$jpnwDb}Oi+C`g|RPrZaA&txXwMt2s~zS>#Jps z7)rg!$M{D^8I>cJ;bF;FaGu~(=l%nHXff%2QfGY{`a++#jj=-teem9t@u~49 zo*yhPs_M~%um12oG5zo+s`DvtCLl5ar_fKl$32>WQhwqSb5O6tFFsB_W4GFfi)r$` zF1T!qPlbiFi0^BmgunV6LSN$1g`0`;9F)zts+SKwW{%^uggIG5p?DN4S|^E7dWael zm^*ymSL1iIz6G%uG~w}L7kR4b8*zU+o3|!;>G)3gw0x0NC4SqM=Wo=vCVczbt&bOW z8*mYF7XNYAM*KqMLVCe(i1R3XS-(Hpg!?%vsgcIl;5tT%IVZ}Sa2ESdgVlLNyon-` zp;4n1tr2l`z4ztcJvlqU80+#cpY*~A3%OV#YJu~qP9$36!!NV~-#=|b^SYatiCryd z`uRMUt?M;td#b-;>Ua+N#Bu63&D0Zg{2U{vtJ%kYy-2e*I@K+xt|O8r--i9``#DC& z9r`anX*dxMTxr{P6I-)Z;p| zeo1UFa<%0j-``w2-qeVOkR)^QvP1O7@M65z42IS)slwlCMD%S5@3VWR_PAHFRpNlB zKOV>X)%U`c*3Tw zu-Vjg^y*&Bhuc}2=+!e<3)Xl_QBQH|_`yJ@dSGx~Uy=xh(Z99HA-!A`Sk3|*S#AX=Z{@j2rXBl&s ziC3Y7uf;qrd(Ti_b}`maR}XyNz@3y;&lC3-VU~@bwZM_m8y<9=o}_ZQwMp;2Z5<#rQlxHDh(?~>OQ6TNTHhn z4-Z)Z;Q=n_L$WP8-xHdsO5302fKCFgLzPZ_<;?A184!A@}FZ4_N@yA(dT<@<8KLjb+A6PX$y=!0*i-?{XiRuUyA>0e`~Hb6aP zirR|C|;9K13q=JE;$1CkNJZmuq3Z^pD+xvz+K@myU@E6E3)1*M1D~3uRoIAhP!-&%8tFxCxy z;jEUavml&(C&;^h2_!eBU5UTKjcdQW)7SHCFG+}_uz@iPp14px4qk}iaq)U|R% zo^r5KCHwN_zrPPHNn8D)jXO|jg0|wB+e5&VX(&ogJ_c2Ho{jQJw8H;Hx)l}g7lOt) z*=9jvEaXnxE-?S+*8%!@o{Y#p9irk(7}IJ8oX3un{jAT1mhzfGWHGB zUH4sj(0dHM^T3qY65S1s!3hUz-ZrR?dkiW6X#j+C25+twC&AS)>yfbdNT}qIllIWv z0+Lkfg*mfo0;Pr%`u+QgFuS2pNS>M(7)A9Fm;Z)?6BqBXnG7m{5w^i=I_ zZ-=W?86;O2Wg4pufyukcOsZ2pVEScH8b`uSXfM<5GH_QLd@7loF|#j(iV6NOZYUk9 z#wU7E6a)gk`|0c{_wAugQU;lyg(cZTuON?OP!>RaY4qd>~PqEz}&j3Gdnr;Lk zI~aS^Ya>TTPS7K{0^JTVq)TMrUn6@1;zzPXmomy>8i2F zQ{H4miBcpre8K&^YCke^P+zi3M+SO)gwhlQzaj+Tl6Dx`=a8d*{cE{` zo0z?b#*ll@EcU)TF5bU#8hN>VQe61S3MS2FvUYA~3$f7OeTZwSN>XF=?+6{4FReML-^nnRvs;JjxVs-#~(N7KeH|YSm(k-sjK@2eC z%XO)NM_gcBCtB>RvKsWGlz5Vzjxslz`GN0)-M(;&_LH9d z-c1S?i%jbco=bojVUndE7OL>WLlw&Sp&LN$N~izCuUH^SDerLV>1{x9#{3ukOKb3Y z_eJg({s4HUYn`r=A_sWgG37TAECe=z_T!X4e1IJ>d(=$C3Tj;=8Jz#A0V2(&j`-aI zK{$NkvMTu;*!LOXRb!E$Iv6>$EA@wE4Udi0WqrYyhC=@B4L1-tuGGeOPzBOG^9s9D z6M@dPdw%szPvC9cY+I|gr$8t?r1kLKD@fA&_{a^`!LxZk9i@X3Kzq+1joVBbwBfUt zcvF}UKB?upx9K;*zZwnncc|vzJ7%%&Ro_~0FaF8h+pV8q(qprCA$((?I@(G?sAdNW zDj44kZX?45RHwQ5Khy#<6zalj^|0Ut4Rg|^Hef68ic3-K8?+XOsRq|}0jc?cZog(f zAU_wve5t<&&R+4Szy^i@Mau)GtNMRn={MA0yq_8+RpmWK-P{N`Trg)z;RHYi;!o!# zc)|UuG(UKI14gAD9XZXhq6Sho-+wr^49Vt)=k!JYfGNh~XIh!};N1kTQMpSe&?J{Y zgTj4rbYxaZjx6~E-f%-1i@JRgwHO$yxnd}UyIZ`S%AZG3tvtS{htHhRw2WV?@wES; ziLHgVBpdp{GnK1S`q&AasylU}&r#~1pZI@@&cmI{w+-WF$sVDUE!nGNpAuCv> zJEZu+niF;;U$Yi^MuEA`Pi~r>`vNx3^0OB=^TTIV?;cZyYeBuc$r0<{zoGD(%Kui= z=wQjn{^v9H0yywU{mRL|SDS#XUDbp%wNEJ)*ZO~)3phB;%J7#GvMHTCMYfb~`-hol{@ z;atE>dLcXl@<;tlaxtsKls^Ja^W?VU6H|8o@r^sdalZ?<=xcqkAGN#5ex5!2^m>Ah zow^wt4*qmMq}_%;`K+wuQ{I8vM%qf$rKwn;S&_>sECo^-C7zx6*^XZwon$@2-H1bD z%wEvHYKD*g#hTT0y@XkZU0e+o)1c>3^@{8fAN)J}w7YkR8xCqc!nQx$3|E4!%B#=S z!`PzOpx0xMAX;TATb4c0`;MAE_-EsRx$d|pHXZQpbwRZhy-gF`rY_=du`Gc-i>GZE zTz#RQQV&g{p%Z4?rOc2l#qiXxC>H0}=zzaXA*(<50v440E|vP22p79tp1o?Ng&+22 zJ$UCZT>NWVKhl0+6W7SDyMk-sayDe`Qzc>E--#9@A{biB(Ax7TeKsN23Dp$peZMP3&FO@#Je{KgYhQ1y~o4aN3jMaP)`a*YO) zhxtxfFR@|%B(E>GRrbMZD+NtcP8;}^=N`Jb(T>)@TE6h#SHM4ZoRsWMHj3+aX6+pN z1~g8R&P#MOfnO<`=~wn^P!Rjcs~pCqzF1^M7zsHjow$=`Wz1Ew1{6j~OBfb*JSqqWsIq7pImKD0gx8i_x(zTYoH z<{z=ep?7KMA3v~Q2n_-26)NVwdk$zx?tB|hh#9hNs&AJ3lZkBj-qRk>k3%%h+Z_+z zyMgoB9N(z*uA=4ue~N+SOGxEe3?+}?J>)R0q7v+ujD#sVEK|Ha!7J9kXCDQtqtX+# z)g77F&;+m2n8av1Fo_hP-PgK}XglufWJcXWGWHt6T-Kq0@KS&bh}}T^C({5^&Ot(gUEfpwP|Z6P4rPj5c^B!Z9YecvEQjR zjX4Sg^$E@2zuF)#4XsM*7G>*AAY{h5%<+_Y-I#DqGa>2MvP*eUl9@De!k z`{Ppu!db*DdT~ICT>|NubleN={Y>Z#Yl!G1`A*c&VtxAd;tzri%b^lecRKV@B+=E+ zSpc)5^$}->{(aPN8$+Skx!RLm63xE$M_ZNHGj>E=%rgBP?wQ;Xp+L#GIkbFcKaF;+mU=%J# z#^H2RLv@sSz6yse=mLFCRmENn3zVAJ&S`a!S6~V1VASc-2D-BFwSt}kdd#w$e%wn7 zI4^rLeaOFoy84DIM^a0G)X@|F?WXDimHB&9E30N8T;!s66uAf5@-Y2snzf7_am_0t=Uh#LulK0~__} z;kLLmL^aJD_FCaF__$r<%=NPdnTE8^{a~0wmh1B|oTm4{;FK5Hhd*BEn#VbvxKmz$ zXVoNX)u>Mv zfMu(#_SoA^;9-p|9eYzNVk!xagk1fgpVZIy*6EMPU|p}C0g~X8CzH;fZ+!*g20b$E zTzil=f0M~(`ULP8w7$wo{uAX*D4VM({z7#^Qgjz47m@e7v-?>UU%^a_Lj6?K1}Y~N zYGL`c0Osp$YN@qkA+@b?@X7R1ATe`|TwAgl&|Tx3#3T98h=_|g8sskq> zr|h9k^y3HM`0yf$#{MtzjVk3aU!sFk*>YkI&0<)_RAyu47%#q8?Z!3Jx`T6v}47*ap6_NTbLgP4x%J)4&}4y|=`%4PF~aQ;u@ zU>;vJ825@hm4(R_Dp=?}XRsBAD$n0+6l)3MWMX&Rsb~Mt=}fI7dXx^3WID*tVAT%K zTp+(smZJ>kC?x6M(OtsxV2VnH))WeTnA0%l^v3{BIq@_);n2=f?z{gThi^Flt7EfP zheq;8rh-U~aqY(BRsoA0ocZV1=|r0f9j{*>Pu`P)5qtYCyM=4$Pg3QM{6AexF5JMX zvm5|xIl{+ITR+8x<~hWV2CneB#L<915x#ixq-b5cW+<$A7=GDA_db42)Z3TWY&n<* zE8{;*gu&wt>|PS(DR}U%T)a$K8sy@?mML?;9cROnXQD)!@Y?>z=l&T=IPuRjp5=o3 z5PI@5mJDX$cdwSk-M+WsZNC}ou}2NKvEt>-L~1acpBc-Jnf1jlTSYs5e{9B-86DzD zIS89KlvB>_B0Qku(lh@n8>2YG^%K8pu~YAt@T>@oWB>K2$ptmx6Zt|}Tu%|MbWGMc za;zD@N^PaHaBjdo#7cLIiaKnjE41mp(}e$$?OF9L)nlp91dguV1FpH>%Him34BrqO z_!*09VOr8`jaP3D)KB?)?Kz)6ymYO`?`8{zhptpMP+e$&yQ+zv%Z;z#O@@C@Iju{f z`s&SJ(+7Iz0$*m!_df{IcJ*heKERO1dpU(I5<$O9t?x{l>Y%x3@7VY915WU8$Q^bj z1fzL8CUnmsIGg$-qq-MCq}QoIPumR1xVQcevNu9Q7rA#_ClP$bHh0*04#7X~uQb{p z^b*NmKUSXhy$K3(tNC&;Ho^e$uN2qS{Gm^URUhG^FZSWOOf1o0gxSNJyIfSp2mSzt z&GvY5T4KCg(gK&fr0en=K1jMsQh0Pfeg#L!9mD>`zkpk&-?euR z?)$14|6TLS_s0U7N!JwL8DIzghcstfUO~g=Yb$GUHIU30u8uoq9`s}+eFoR<@Gl?d zbPhf@eEPLQlYEj9=0(H5KamkId;Pz<{!~GDnzDj-><|r}58e=YkOt+M~7BJ|Axet$}c)18;27bW;?FOu}m8@qN88`HXU~5ffDIUmfcT(pnBJg$|lAyDDy+3QQ6EKFhG9b zOwI^;{=_ba#7+YGvY(1d?q-2s4omorHtwVGto2yI)z3g@`&3Tq@@HTseAvIxhZD2( zue-CQ9EZh0lj>@L&(MmPdWf{wca&z)CB6233-sFl+xYTz7zF4#w^6#KfQs5?P_3AR z2HS#6Y>MN+fLhg+rkMc5&U*Prd}a>1PO9;-qQ4g4luGWxmYeAKR_;|5eNXfw?CC-L zCJr>36NQBjzeh*M8~wTXTG2>_a^gB&(ZPFoC9+od9~$*N?N50(79|Y*e7Y_*3vMrQ zvoY=WAhK26YBGk0sA6R{LR7r~khWI@$o_tcfZlW2fcLwAal|G|GqVk>_zA`BHnpIF z)vGs;D%66VA2bbH9LcDX7+*lQ9*+F0ZGtizt&!N%xBn(q)xhHkP}_vgAS;%D3&DBx zh^O9L>H3*iFf3uCkbP4Toya@6Fel&rUB&5R+>#JpCLBB?YeX;UsPIgbBZq96U4aA zY4J5&Ll@~zl+@euf_5H{vgf`}QLOW%QYU>fvgpcst>hd4X0_wLwOQCAQ_Ib;@UWh?MKl2TLj7#XN6UR`IWBS)Q8cdxKZ(Ez^O zarKwm!sy}#efhYk9UzVE?B=~g0>~pj?j%!^BescKYc(;nAe1M-#&k#&)ub>>he=oh zA4Y4*4)JZm^~%qqF)v6^n(go@+i^PZfz5xe&|C&ldXEJUa@YWSj~gQnrPn~C)5#o; zbB2I=zNq1fzc*^#I4bmMJsq5_qX?BeQ4Gqwj(D}rT?Y()gWP`(X(A(UN#ah$0d9%* ziQvWXXz<$FBvnW=2gq{5UpHqxf!MxISPHU7OE#z8syZE*%3Ufyd?fKk_X%U)VrdeA znXIZI$%-?0AX%^)tz(YZrulWQ%3A^pdq-XI8Y9HuHu?P3+5Z6N^=j7NjLslU&McIX z)EJF(Eyfm7TmfBm8qMjqt^>2gzpqLI4M6;r{#$Nm8bPl9(5Pf;Co0tc!{xCt3iyjV zALQNIKq9A8whBWw5&IUWyl?TcoxC_LhAY#^z)R#%D3fD z;2&o%6HD!L5GusH)4)}TzKBexEJ{@Yw#LVE3SuLuU8arn`@nB-wK>#i_gK}zwq|3R zu3U`xawjOR{Hq3e^|blF(J~6udjPpd%>&<9?{WHBIG# zbF8ezG0OHZ@t0`IlA1F{j{kkkT=apy3h~oIlCiiD91 zJsxGZS#PB9fhH_u!F2pd*sfN`BR#$rw;84X5gRu@$l;eh?GCrb|1RDSk+AZDH-kh+ z$yw5I$?u(FSB@8$f$>A)=yM}@I%f~4#2Dh2pKtJQ^xMNHbV@HOh7z#e)sDZ(+J!jW zCXGYIR|-y*_)oLxU&4iTwXwz}CUDPy*VmSK3u_iIh3m;?;+nMHn8$jJ(BEjxBLC1! z*s(l2>2)##w)Yh${#|gwy*lYkspp(9FPnY7Nm?D$KJ@i`S85G(jNpw(IG+P~DSt{a z)#~Bo%K2ttM4A_yEADyZ7wV#Z2A{eWRCAPH8QTABQz;RY#M>5|PwB(haQQh_ zvHM>w@YQeiLLtpsc$W$zNsTj5STLsY@#{nQ6}eF7*~`4xL)+Nh&s`OVWiJpq8C3Cv zW>~lQ10JYBd9hZ&ehb{L4fQAvJb_*5*X}>xyn=h8Bt;Sr6R_zJedPVCr=a*)RWRl6 zZz#;WQPs-s7(PrTQNL>0g8qBG`(d#67>w^wx~?CyfRv;^dHx;zhyuel>^5vSfOpI* zuZlQk%zp36kDrcA2lEg&m&N!~G*Zd`u0M4SePej6%5(64*Ep3h+wzDH8=-It7G{}WxC#JqB8nz%kzl=Uns|7F9Sv z#XOpxF#3bTL6mQ!rtHx0t*lQI8%9W`^_T3PLN?;}x*VMmeFxE)w7ytLa{~*bFIfzz zj8THtg9~lvjFEvsHrc+FC(vM*eK4jMj5^pv^~`m(0A;|nr<97k;AhIE$dG|6$n52Y z+xEw3&}YLWlVk3Q28>F--dLjpIr*bH9{Gx(Jtd|x__ZdAhf81b7{YF(r51KpvPZ%uF>+W6K+IVL}aLJ64T!%HwHi0CpcuexT8w~ z$Vfvd(#**kTz7Qh`<^^UIOXsr@k8kzF(ug~>GK>Fuw@$CIF%)i=xCVcbT1hLi(8s6 z#VMBvv~9J4TK1obyuu3AC(RZJ(NRDD)4Z}ojHqOB2@i7`E6y;yjXl*CH5-1UK(or$Cd(oZ=K#4(53;;WQ3IbAM&8Xy6o%c z;w}Q;)(^{K3HE5m?vGmWeJ5~j&gHQ9Hw*OQQElT>~%QmI@fG_hoPTG6|wbJrs)tp`h)0!be1z#TlF(S3-Cyfkb%`RD?GMfhiM0qL< z9BYujQR#d4gZt6+4Utvm``LhO&0TP>`6-~WF1%E{gc0q_f3g(o3*e3N!?Je%ZS=E~ zdh5>3hv4!ReVVP|dQd{BNp8{{M3ODmag;t=U@6@|;3oAfq7!`X`~C7h(CFxnnHO6? zE@SD}jZRj9-|RnnjJ_Y_R~0+VEcr!nnC_%bsK9HG)%7-O$?qFTR-U{!`I`)%7JIut z#w`wco)yIjF=$||QcN?MzJq4oEL(qB*aDxp9N+UDBf)>%wdDlVj>DJW@MxlgGJd!! zv@Cw&2fAdMt;ux$2V&A%-*?EMgWIJ7zelvB@!<~_rcbp1OtHbE3EWqlUr-uH*2R%vt^Y(A);N`{}WkZLr;v>i8^)z=c zXHiKe_+;|X(Iz?_$ZeJzWkha?{~4#-l`}nnm%FFKf{h+QBh;7^bI%CNCX{qtxnv7{ zs6KJo%zEKB&zZTnOS2*S+IQYj(`r~rHrSSptned=_Q|POcUW2SlTE897?UaY45V7* z!FR!n_%pEqK9w~K&e~3a>vaMl_I@dl*sCfn(Gmqeb+GrSUNt`GrMfxGA*hHI!_TL- zjoyHK|7_n#ZTrD2?$_#*Mpp2oko+Cll0^W&sF@|ZU&ME)-ERP|3>t9zVkT(G-48Dgghf;Z9nMt#4$9xn$8JW-O+b;s5Cq0C6V-I1Xd-2Oo@;Q*y>r^+>HUtLJkDF558$n{# ztx{@%ouDbUp*Z97F<3`rP@78|0$HDFT?*u8ki`(I-aD%?uxOT1Tuf7k=;YpImUalk zU((YOepQq>HZJ?qg~G2$AmTUdS6>I_BR8I$a9l*@&ommXvV`HrH4_VCa|Wz>KOm6S z?kg&-by;i*-U5?xGKnHbzav@Z^0J3{jX)Ww9{>LNC1?*QQ&<{JL78_bUYG9p0;d`t zxrELbuz%vQtrQpnExDdm`M0V->nV}d`jH&uWbE!tA9^2jrm(PuMmd51Rv7f;6*|z> zI|^=hYiiI5hR9w^*HmD4?D*HC2f5R0SWjo_{Vk+F<0{B}cKyI#Gb;4rTpwzZ7dDri zdj$r()f8M6%TQ^x8cK-sLV8x`tktu&5u>*$V=Ma*lKMK(lZslvPYPzvSo8v2m8Q^m za>5_Q=-*&Ef95u5j4P+{)pJ5ws#WK8=vk51*`&c!vPvNAX+rE~_63wpuh1zfXNFK( z+j*jwH#+xPTKbpeMeyV+i3&w4AL3>vEkE&D6&Y0DyW3hHfGnt*$i8Gc0o!Ei;o38T z=tim0o7FU76qVBSOjJz;#Ojp$cNWC~{lKeeRQ*4ov2mlUsm29)l##4yBx`~Q&YveV zQ*40A=^TwkkN`Gols~rd9QXuAy0>L^y%6)!eAZ`Cmw`6eeH3=Z0oaq({32mF0y12g z=)_JQ0-c_LD&wo%=)T%cm8tV(py4aGY<$3JBTsPq!ELxfSZ#Mzzr4T-xI$cH>t6FC zwY7u?WMvnC@qi@tZiG6h9q^2P&y_|DqcJ#t?9m?Kiu(3mrZPDaC)_ypk^L}8k9=}y zc=ifll!^?z8!h_6Y9^}pF<6jB&#EYDZ~7T$0wD@ithk&JMj!l@w?82vqZUicSSu{y@e z&;1+87JlhcXDmTOXI)!MNn1gSJeipb`4E~Lf z*!F~%9(H_=l;q{LZDlvmO>%de52^<~v1cr@>B4!SbR<8Sr1KfNATa|RC%VAE6X$=b z_Uqtj?2Osh(oab0#dr{~X2r{zgA2dOg<(R%%Dbd?U7Y^oJSZi-gk7YMp03nC1Xmo$ z%{2H}@qN4MW6m19ut_fnOYjSUkER%~%5G6}fo`YWZ$R!_KCsU7t6;zQh2EZ>_criU~By{nouLOQ-0E zxcw;)%lP>w=-l8{xH;GY>BihPnO0iiKgG0B)rBmxGRStL) zHqs75bW*bW0~%mPQ{|T)vQ8{1L?ksi)sDq%A6=ApZNWJTyv$b?8gcwi7D4%CJtj7O zOA9aQz=7A^Ea{}Tvt;oW#pO5R#b19q&vtiU+0qNE4zJtr z<>TtlybibGW%?r=UwDc5yX(>Z?_~}6wz+`X$X5G-AAPj_6==goF^Q)9s|Wt+>9B=g zUutm?*Kpu4p$z|IZf!tYZTP3}=P%-dZFp(>r&*j3#?L99KAM=Qz#H>J3O}PVa8S&@ zJUYvI?8R~{!H>BHJAUfp2xNVP?Hr|cYzbyKM5vbSzLO(7WA7-VCDVwxE%Ms64PWAA zA+EkI@+|E1b@va)LnqiZy-IIo;{`KgoqnW+G+^nFEAux(D)3E{!ab7FF#IbxgQ_yh z6Ap+BJlFbm8i$#c`{a=Dm{**_(PKBV!4QzW!S_f8$dml#bKyWDMYM`O5H zk60#VW@;>w4>!P<{_#eHa5_MaGi3j{23um2zjv!#tmW{MX&kNVQCC>UsU_=gsShi@ zRaEeBsp5+hJJy#PPC|8m-Yj(iDJbt6`zQaeH}v|g<5EiliATlEykgb&Kr|<2Q7&IIQFAI{{pJch8WaLlqV? z@E+3Wpu=ftzQAZzd$`f^q)$D3qV(TeYR-W6Tr(#vKU6}0Tv@} zxy8@3kl%8{V&^>{H0_yOxf+=RxL=n&eq#0>uul*C87WLd9#tYU)M{x+a+!50MkX2D z`S0fUi0AjvLk5DJxZE&095}1c@VN@9{H3lvDC=Slf6mYRpDznMM6@@9j=4rmMPZ-TP=My#S3exVRPLd^+1GgA^M8t7i^A-naWMTQElqLoCV%G~SnO+n9Zs%0l7mpKC@kRcl)G7%7cGxtm){e24cnE#_v5e1fr+-8aj&n z(BjvJ-d?uxh*d4ta@y=TvWWaGgfmFddYo=dQ`RxCD^V9UGA@J^I_V_e0 zc32l>0bFCBy_5ar(Gqc>YOGcrg#407zNfrHi1d&Yt(Gq(Fn7_bTj_5Q(@T{9i)57m z%g?8V>1Pgl3~FY@s@&qx#EO^HU4>$}%hcqi)^t2$FVN{xGhMp=WmQ z+>RQ|fQHE<$*lI{sQ6Z0d!#Eb7XA{o|7EfR?FeV=bx99`-jkZ#z6X5RY-Kb0UyVP& z;r)w}|H#Op_bs}ICQ6}TLe@QxLb@8&p)xzdl@1^;MRCJsV+qY(7O=T)y@U*V`*6am z=b%w0M0k-g3bp6b1uK?4K}@rc^v-Y20wq`fnNRJ15pCY7b&v0A7%Z#GHaqIUGkSsL znaO6DA}C>}*O9oz=i~ z^3h64J#Mf*@p!HD3?ux`c)HvD7Z(;6q4s2~6ouD&C$5V3sp9bG6>C4e2w2?6f7We_ z1P9)>;ghx6^z8NQeG z;H)d%*i%?+mdx{w=?&kO^1jb)uYv~{J~CF<7C3oSkM7vP{MGr2O(yeAE9_*G*D)V!hiZbo$6K2_ zVEgO=5m@*jcXhMEr_`ne{#ahwU~FiGvgrj8t@$nRg$BbJ(eRg0Ec1+T!D=()=Xd)s z(bx+4&j>u+6UDGZ_cOyRZ42b6SzFXtOTyW5hfX(g$HCqfd)JbxMi|0Z&>dMsghdR= zoSA9O5DMl#9rF%?pQgC-BsH@zy|Av0ra}pnw4rU>-XlUUajm#R5%sWrdWq|{SQ|F? z{3>SF(1sr;Yvs=4cHH@1?CA98cI@g7bL4)v;pSpX`tYMIcqfn(4 z^L|!h{B7BaN#r)Jyb5T=EF)zK!z{0`b&>Tmo4Q7PFDHT&og(5Ht>@Zn5k#yf*hgh@ zy9wXT8ZLZ6{St5RJ$)o$TZ?r%i@xU`=u|f6NOwEmRbe_Ym+UCtB7CS3dvVWKVWwM^ zv6ku8ScERRV}0}m1|f`vv!C+tzG?MDT1*6vBx=6Fwj|d-5 z9Xq!F`Z*>qYKw#8*_i4$sm`c&EB2}4OecOgcy0y~o-NA;Jj*^6FvgIJs~(so2FtkO z5%bGIV=7IUz2(G{7LPjYOs>q%ay%b%zl;!ABi<{%KT)NG&H1)*OnEL2)N`>Ecag?-jgCisWAlRA{O1EGz%}gS$s^@L)WAcG zNARAYBbMT=<@sIY4zqRpoeG2z*p2g*YYElDBi2mJbf;Ah`sYJaySUYB<#IskS+{W)kq+`=AtqYsmI_{I;FHTb z&Z~@X9`Id$-PMAZ4Mh}bpB%=_p9eR4EZ8yoX1ln7As@V|q3pc6qX`A_+Mn>xNx+I& zwzn(;$1yXl-mg^wQkWwX^@T5t1lDA8X579iabeY#*LIUZtI=|1cj_OAmLz<+`rjOoVfbSmt=I*mqiwllP6$G^_4B#xC%=LM zk11Zkli$$j9q;I9hR+~#Q~uJ3T?f*tK9_cq;xAZC^%1XTSVFmXUEU6Jr66$ypFZi8 zCO}r6994Ft1D(@+F3IZh7ll7Pb2@aPAMuKk>0TD-06h7FPIrpy(F86kcioH!6i-St zMt;o!*4>?M_uE5&L@G_uQu`&kuYXtn?!_EnBoTk^_LB^dC`@=6_9PFiFh))8&UT?g zgF+P5OX*;HJ-zu{l^4*vNbHlQ&OxINp|5K)N6{dR`{;EJp@j23a*XjYF4Z0INQF zdrD%kqr(8OBq2k7q6w;*(y?F+@CJsp&-*0uRM75_mDsZxQn1pY|M>k;Wx!t+(Q|(% z7~IqrRJbBy0FHi3O_3xjp}+sGoGlfS0-frnfnjilaNLuHUdB!b)F?D7JSosXM(YKN zq!r8{iQ%st)L12~bZq#a6*`GZ3V5r7tgMisfuhz!7hZ7Pv~z59ln&TYHV+B?VL+$L zs0o}UG+>$U#k<#|Mqp1uC?)3`GYI-I^_J%}6Efj#yUJoh1vX`_-?_TENqlrxtHNPA zgwXiex8OEOAhBlXnfjIciGLXXg+eV7Fm$q^&J+$_ow)g%b|NtcHX1Q8dg=B5(G>j}4$ zYe_HD*b*J~I-H2Up*-vCz_7Vm86E?ppuMv5JAMZN^ ztq`o{GPk9k{3N#dpyMBJ3xLVWHIup|ZFK0;2;Y0@E#d>w-&+)i*9f+A75|FrcZivv zGQeefW^n7r+t7SVA=GlHA?WzCDuOrtak=w0FNhg7gEv;xS_l>2qbl=VR*6fsv$h|_ znZat<=9FgR3&PC`vM{UaXT;Rdn2{e-WrT#o%v=WXZwP(K`SfoN(WCSIk>tOYM~LT| z&UPNUIz*T`lE!;HW1P4b7)5bH;|t;R?|1sA-?9MK?%=uQO)Aji7v+Y#q>+m6^`8`D zYT)moo7dA_Z=j+J(gua6@`2Y%yMnOmSrk~&;H?!pLTLJPNU6m@9Q@_-C)=;ILrGur zx7^)=Q1(NLFIj3w&>6pkcf4n4K(*#KUC9uRgZ^l#!wHNUAnMN`{aJ4>l;qk!LQ1($ zNZKj9^(tVF_@A}#80UpA1g7)hAHRds=yb!W`G9#BkP$G{S&P09U8sr`j!DoVLCTtt zL;Re8VBIlD_ErvQu%*OI=6NG`A;F&_LZ0A9$Z5`5_E^xi82ZPouK@iYPk(QJ5}d1z ztIB1cL8Das_RM7oXk3xD*XnW#=#%O^w{i6`B5x7-HRVkN4<{EX+qGM#GuhVyWPiOKa5cw+3KqA<$8TO&`@Le$v&Z zh2Xey;(~wseegVY*X?RhE#knL`bH`)NbR0WLho5$@HTjXySpR=rO!nj&0miKOUdqP z#}nE?*Z$pJ)zm?d`Tf6!RP+lC&8w-zy*mO`E`+BCAZg4|nQ+I{Sp)MaIQq=kErDRe zN54iJSCPl0$?pY^U69zm{H$q=5i2V`ANjC&3e(opUNoAoLr!nFW!o3Kz&HUt-G4uZ z$cfG(Uc7$*^I@4DSV{>y&7`MDge%ef6Ty4*w0=mSFz?9CpJm|5$!?X1H(${^{&$S! zzrG;ORQi59(k>u#^mAZGQwMrn=?-MZUW3t)^yR$UrD#sOGk`an3M(Q0=8%N7e5zC_u>qIk_dUdHuC=nnF>S@4@Y#E_4nb z?N!eY-7|)<)aOz>gZ*Hn5AkrxJ$~rK6aIz0PyokZ%hgNU{P4)4h)?ZhZOm}x-1F9A zbsY3Q@R~b28@`%X!WKSv95M*HRH}YHiYFL@Jz1UsxG+L@PxUArZ0uZoqM@+ zVE7KQXx=a0Q{DjQ=7zdnh4bQX&DpdwKeb@$e_pqeA4J0xOJRw%m0WD^{_x4EipQ{d zOgCJqxDC?EQML#qG{an*{V?Yt2l%${)h`Y{J-AcfE*&}wj^B{LkMn{lG}ryxuwo0KfLYXs%f=!|B6JK~E5 zS1RJ|MImj;u#T>*FVxNH{+8l|;C#rPkFxU3kfzR{d33%8=5P%!3FBhuS49%I@Zu3H z%O$Q)c2z^Mdl$amZ>)yQ?rs`X&Cg+?-F+}d_7w73C7tlM%7J5aulUEz4RD!Eb}Ch{ z2jt}*OghkFpcdmhrH3OCa3QFgUUfJKdLZUKLuv#3SLx_t?YaxLyPJI2JK7g-2q^TY zX}MvGhse6_$qs^kAUa+?!3Q?{J*9Qu&lErY6dxrm z8jMR`$kBZX3B{{xDgsFv*YJI+bM)cqSMgd~G@X~njCXmsHXGaa)6&b>?_l=ey*x`z(Zj+ ztq8Y+<*CiZMsyA^nXVw3{L=;+EKFrH3Al=X(YPr|?&#qQpgV};wlMa&n@vHyY>Xua z|CJ(UQ=Fp~$@R}i7N+zrUvv7X4?j$uyLg-V7Um9Nmvp^D3%?T$a($*P z@VS-n$#1gSxC%t}G`{tL2X!ZPKNUO41ypBRDUW)TfUnB)^}pQB%RnW3gv_#igLSf|JH~I!^fX5gCvFUjr;fJzN!Vl?U<{ z5JE+H3GnL6a~_&qbeQBt)ZNcLocNnVR4W-C$J{yR$z_!{p;0=nBI8xK2jlpHc=vBjlGSu$a znJp)mjxufZe0v$EfatxiJ%7swz?mf;Yr2Uv8uF69 z*cJ&4eL8vX{<{ZQ5*Z&{Jn;yvc<4?FF*KuVFAGJPMhei^zE5>)0rB8i`_izGyf3;( zcYh?#_By)APv;--@>Xl@6gR_Xk|EHbT3m6_&%}f4ED-L?=;Dxi_?_=&%<}aL$l^U;xT{oDGd|! zkK>=?PO# z-~xC<9YLuuHzIfRt5Xr-L*vTV`e)U6z=o7KwT}}AItPqZRQK!=<7`It@}-H6@zrUWW<>jLMs1rV77x-=+o6oh?y zq*Z41k#Hs8WDK9KG2pNr_|R}o5ZIGf&&JHNqA4%#NUb~6z}G-fjn1Z@IN0wAc!4zF zqvObSsaPk92gIKlvzQ}>kh#kpmYgG8H<1_;{ys%Cr`(kpB;iG~`SIWM{(K{{MPFjf zl$s$(aU>6gM7$-ozTYd_`Bp-BYb2rVdy@rtOC4EPyR=TQ_%hfEVkU?qY&lC58oh)J zre5?<&b!3RIUl9K_!cqz;+Lp)nqk7Hm|-&gv3g=L)5);X2qMuSgPTdX z%YhhJ+51eP-YA&fSinGmRTb1KA%m1xn@s@(1&Mi`$FOyMN;B|hoS zs0w?*K^SYfo$jhW*(~|u87tGuO0%Mw$^G~9rwH=v*|Z`T{Rx-P9LaQ_=^%dkd^gK$ znMimNd}5iGzn!RmWbn}@Z5!dgHiDN(k{y(1-M3DIH+ ziIP3CMOi`$A=$HsQudwq-m#N?S7^~tW1WcKCbT(-5C&&&9eoQVyHJon!|%X2r7 zi+f_7Dh#h-mw9u2RwZ1KJ?x!ns*eK@PTt);9T}C_Z;8fFslUCjw2OjU)m&YX^C_-w zh2@^uvs3&|9?aJerm^?E&f;Z=@6`n%J=t4`hQ3C#z&Ri6w)EIvx}-qlH2-#W<{gRH zCgF@D$4lz4l|lZU9Lp^Da%G#(g!n9Cd$m@Q`%gRKt5KVD&50g=DIu?*$7qHB8MQe2 zd3*v(xz_iXj$s;!$xhBgwHC2WbJmPG+`MSVh! zxM7C2^@ummktRWpcbMhufiQb%ag-}?hgssjTI{2@H;0gW67qh3(|5V`sfdZ!*Q=)H zt=O)u!Gmho1n^((b2oSIF2uNlQ>$AWnh}$jFV6om2C>4|?=fZk2V!qvl3=lw7yWEF zQuT+^6wKNRM?%cZ*?^%d)6K>TmV7 zJHDe3-(MK7SLs@cN`};If8)`MF7bG27GBrE0sZOfDc#$6L+rx+zLke)&%(ieNtsMs zC$jOzFaB2409nmmW*;xY6X~E4mBont)J?uZ% z5s5#w3SwHEbw(dL{8(pq*%m+MFjA{D=8X2S7I?=G-9`UaXFVC$%qGr7Uf{^@zJ^a{ z#M&r)@I+6&+0yY@@iy*uSx3scFamXxLAI<))}x-YuP&+_UKC@A>s`2yyy5p2_@y?QRoFO$6zmF}V5@`<~suTO@8S#gyXW63PE1fMwFJJ81Ih?ZvSl{?u z%EiAGwmknX9QW!Q%4~N1goes)AowybMlWv;ulZ=`f5G`T{(H05xA81KpiTTg=IXv} zu#XYp-*;FLN+=b`k88VtU-dsTzW=!fLZ05t4*Y8kT8faj_rB?ZTWpBA$U#*Qd6M4w z;9g;Pdh^YOewHQWaq@yY;kZzWN53+c{bqu zAe3db@`QgEY~MWBt23nrC0GjM*jtW4sVAS#4{R2Ke1E?9JZ4~rtu>xQ_xI2NddI*l zMGYP>df%7V{Wc#kTAv&%`RE&dRR2+7?7|E_t;YP;H*XZp5v#dZwwnPQ;#RAc*Jl7{ zFGNJOX$XMLAI!>+_iqCKNP17^idXUE>6G(Y@AzR3S7hpsFhOYk;)#;gD*!jknxEEE zH-ewN9vQH3o&*~?G3pkU@ zPD9@F`$37aZG*I+I1o!-QYv}O0}|&_*^nS9kZ*qC?_V`ypS66HrK)-?|timB(Q#X)yQ9W8?@e+cJOxiHYoC~(Co~_FZAQ*;CQ2B zi|A6=ptlbs-lO3xVC;xm!BteTlOy+6QQce3e(PgN_RBkSi#Coj+)oY*2s3hKdPmXJg4Q+da)+yF{R{Kul-uD^!uS9-8)&DHH z9bv6S-FY4RfBsuU)1q4b_3*Xg{k-(8w^aktCBC;kE6yZTd^+<&?$2_Zo@?ufZRiKw zoKta2yIUSEU((v5Rg#Tv+>{l{DEI_VY)w7Fa77jOrdUl|plhEfP&O z=%Kf=f@h;E&f{-SuPhIAC*#|B&w1__Jb^B|nuJUvmgw{ro~GZc7jP-|G2Xqa8t5qt zmcQ}`GVnUSanbs6Nwg)~0uR_@iEg*8_&N?v@myynbE&6#Xz;4!&bS8`@t=Q}#9!?; zMc0q170KuG0Lpr?BGNg}3T01FXPnw1ivJ5f9<9PAif;PtI4^Y z9(^^pW!veihUmF@*ZPtThfvj&nxMG?5j-bDp=(Pl2kMag^s@NPzlbEO-ku=j96IQp zN>}iEKk8k)C^2CxgtvJtOWO!?q9)5yTrn~)vE@gJ4P_(+^z$F%?;`^ru${X;o-Hr` zh8c!k$G%^mK|C5dzniUm!g{h)1VvDC}qz@%rsK`)32pr z#oQ&`9(vBm@%vSKn*E!QoSjT*&kqzLU|)cr{=q1WcY&!b{OB#@nZA$K*E&~Z*CzId z@%PfPooRPZ>V#)uM(o%3)&%(>7gB7^`!p|M$DbX>ig;bIz1B6_JrC-z_DyO2!PgRy z4})3uE0>Is%XZ$M6j+@xl{WE@jI*A|9KBZjfkGjKFZ<>j$=c1BkPTn+kz6i>S5r@P zkK`_FyXLHMy_qwT&wXjD8vm3^PIFRa=*%b5+sV?6w<8u*I@JQdZc5*X9d8{7dpccM)6^;#yr+!54#%$TA>YQZzR6-hG ziptbCkuFw$L=K&Jry_SDWC)mckysnUuH3KKiF{A|D;j9sND>std&3n(QnAnc^4E-o zr1I=QYQnwR0n$kh$*F9komhywrDBASH*#wFSWu(Rb!_eu{qMhhHxMV0*+mKaAWUM1 z#Ki+SPcb3icd!3KMI_+MVLEFL0ZjJiDUX}kzev}c3uw^N*dWL-S%p-a1XX4?(oY)ymr_UmrL6g8A*&wu&46yq!dCN1tWbVlJGC)xkrFU z6WI}0ka;S^1FB&4nrI#zB|R<(z@1=;oB#L$KD zK1^`Mrg18x8JoJQ6kYjn4?4+mmAxjd9C<0qlTMOs!+!a38YyrNA%PLmY(b;%uzZtFa;3(ZKNvU!)3_u7czH67FFr0ia_f=lRc35zPa zKKfR`fQt?8RekI1?)3sVSHzw?_7B47uYlrLpQm@@NvZZCM;e&WRlTbV37_rID4UD2 z=Y-kNkHeK;Po{|D+e~v@MN|%;kL7ls0-@S?(C%ATRjjY$)~Z2Q9?9gOMWgSy=Hj2C z{7S>nNVh?)dW)+?w6KmWPk*YwZoJ9X^`pc?7q z{z{w)X7>9o#Ui4R^Xbsu1?O@!vM|MKpTsmi|E|Y%H}N?rTKSwD=o>=gzvrjCB;K!U zsqd-`jX92A!m^)w7xbVRUW%{z?{wfFH3W*3d~4BX&b#-$Q2vO9{0p#1{&5>ONfN8O z_^A%p5c_ei&9xPkJ`ojiqGl+plkY_|- zMG&YiS?JLPui(RvuHMn)W`csudpX1`SMYNwsyb2qpYhtB*XRw|cldYLDnVt-kEobo z?_K@%{pgf^z*QM`GF zLTt!VKfa-dV_oT1A<+7OchBk&6t%}ic)MxJ-%c` z4c^@W4L^9wCdcr>*?sMee=Qc!4~BC$%vR@7|8rSYt4u4nn^OL5;gBadyFSZ{29vL- zo}JD)*Y0`rmL+G;qHqH)T&R%$Jn17o``RGuh2VR%t@Air-sDU4W-;S$?emRz9_Ba6 za=io(5McYw5LJ)b9VjAwzdMF!*EeozxHXEGMM#>(OQzwQo-RK))%6VBo7&&`toJ$o zR$-&*{gW+dVp;WTH=`l+g_+l^foC)NZNJrTgG*VsH?fyk#rR{q%{(n;&7E8M0mX4RT_J33Tk%@cW&G9H- z^h1qzYZV4X{?OaJV+0h-?#cUyZyA+E4) z#+Wgy1htb5k4)gqMSYIhiEcUh5YJWg^1ToliW3Xu$)DOqc(&!h$h<1CZ%)<*MV8J- zXxYx>=R19Z@j&OsZMrEBi1J`I_H!k;+4RP(&pku%hOaS8kGt*A)!_KJ`bXFCn%Fbn z1k>cuZ?b^j+~poRqHbTwfq9@QXNMd1(w)cs4>eo$+3TUZL)z*&a&%GYtzko92hZXT zgBMC9#cc8GPDd~6uAD>_;$4o&{n?Lioz!a2^w+{aZgCUWAGwFOpE$E><)?^dbGnUO zKP`_J>Bb+FM~~tq`_-p{{7#{Cs~OABRHN}7(%5N@7DrS@kttzdSr=6^i|0QrdInGH zYPY0w)kl55KaLLAdK&%K_$;>Qpb=W+prrI~-2wbyqA8=1<~3ygadDSVj0`$0Sv(R} zd06iRPJ{>tOjD8L_uziW~<88*b7P;Cv z(L~RxD%5cZ8-Ao**6MT?m6Er8`_gj{+MFQ8&@Lf_Uz><_JW$AqCS6rv<-PwJbAQ9J zJAI!lT4^w{d%MbStad-${n>#@Y%;oTXdTluVja$ez@SgqC$nkCn(y23BS-7k9c_7! z;iAv)iR!#T0;Dy=D&_jI^R@Po_gyOx5y9=-&tKn&YPXPT*>pZ3*1Cf(b`=BI>QlX$ zRn=xBgYA5q*4zg=>tQ|KIKx;_0&n@<<=P5XFY*WUt+J#fxx;3^3d zRygGt!m^CHF4}B;DDoA1@K|Ue(zXK;l72k4FS7)*Bc0sjCS8nWCrhg{-Mc+f@7^|bE(PkvSGh6t8az65%?svq)z9?+; zX|Tm+Q(r{&gVD!X*-J>m)r;qUh2~@TMHC%uD;{I@QDchl3IY(nz-?PsU2L%3d9FwM zWbH7s7g_!(gQeKGathOJr&NSdZYJi@C0)$)V}VSghBc<`p*wMO&I>X4R57Z4BOP0I zetwPnKr%91U?O07#TGNuV(8NLm&Qg~Ta)y+I3uwSv&y#E#vx%98=jr_@I*eo>rQ`t z&kQR#ts_s@bqaCNvZ(4DIe^qo4zPc%I*w_0Mx9boy@-7a{qSK~RvGbNnL5#g@M4AU zQ@r$-_hH_5!cy6lOtH&bmt9-443L-`SIt8mgfSM00K<{rGo-fyddjPH5(t|*>oH$> zFXW4DaA>3dK}iH^Q@_fhnIB_I+a|wrv6yuJ_;|bVXq$@1rW^0IrxI02r;MvF z5cP5#z>9l`y{u0N>JI5#PRH~a4D(2;?04Ym$@o>oP{wA`_HPJ2(IxuRzIY2 zf4j-R{yoVm+(}P;Ek~P32j;>oUvZVI-0`%yDk%A!Wc=gY?wa(Mq_B~B#drK^Bpua7 zu{VLKq?}ZsO*e~^u7wr+JmZlxcM9R8D!=Tb`I{Qn3mPI9jluAJet7meJOK zO~U*~@#8y5DrQF_ou1_3q@KO>s)c78RhkZqn48P-AkrNvtbxwaDvtDNbUYWvNJih3 ze(>jysQf+tOJV=Y0_mcM-LrF{l30ao=F(kj70mQDbM=AnbC?HP$Ffp_GxAKQ*67Pf zG!~wimAOlx5!-lOc3_-d8)Lpa@YAB`IP$Nj;rkhBEzID343_ogGIH{}tL(T?1eUi# z3akGlLLAx}F1J|Dis_io=x&i&BISH|4EC1FA(MJM*6UB)Lg;fp*;hzy!h~yNGg$q; zktF)no(KfBOi0)u-0tfxq|1(@H!@rvoxD`ZkFsqzP4_wtPg&Pb=B}&ja1AaO|!ke2L8M# zpQw*HhQ%Vy?sReM^un-2=^<$an;0ZttM7B+u_g@OryKg>HIFbil({1JwUC?H#ViHC zuVeqXdb+>K-bPFUgGQ!vJTUIamg2*s#5qSNqlauRJ7Gq@IoWQUxPf3}6>6qh!Pw12 z_WfyWvB+F%OW5ntHpD0>MEUQr5F}pF_Mhp6aLgbsIQ*wi9CGQ-GY?bEB1|T6?hU@V z343^=g83ys7wW~h?s0^@AYL-)F~Isj3iYEyO85FI;n4lWILkdJ{FsQjjmM*DrrY!&vu&4N>}D`fn6b2gk#!#}-fE#ru=_ z=|weg-}*BH4SiQ|XB{~&R$E6jM~%5AUtR)jnJ<&+|Na+&Xq4hj1trw(gGkWj2t{17 z$hqje z_M<(KS>h5Jl6cWM`nf0;5j0|?x$YI80e)L%Y(>@VGA@2G|L4ZYAXHxGitR1wa&(Tw z`t2I24ett)Ji&f61AXFYt+TQF5xTAaSC(X@1%B1#vgGlOWR!l9b3V(#8$Y<~;>W;> zKvaW{leK>-pLn0ghW$nXipyb2=2E7&@a^4dx?Bvt=xI2y4$HN{LFNlNu~j!bWBPM| zMDlU;wFzV9zU%hr)kuG}S@6GS)N^fAW=!e99n>7PSG zNmBcM=6j=2I+pyr@AT1Tql$*b`$6a{wMmh!tvTr5Zp{tL+C%uN&y2&A*ChUPlY(+t zGjUE|XMkl#!WjN#n%!`BTs~U0-=x%{F&X_VkeAoBJs$@(d-n>TEWv|3Zd@{G+eMLsQqed68`#hbL6MJ#P7AUuQXhpyG?wbn;FaK6NRQ(=-W2=hoQ-n zFSjPk`V#*ydLlXe#T~u7@?p1o>liM##QA;XeitquU}J#oszb|Kz4VkKcV}d?qb-UtXW{KZ!iXHeO7mZq9WxO306N?^lV=DV}^fv1BtV3U3R~UVq zw%uRUN*6V2a*3B1w?>h7#M>N1UQPc;hKt^VIA?v|h_ z0-hi3>t4jYtgd@iFR7w8-|c!8xkVj){;hc0`sfWDv)Wu^5Tl3w z;2C&+#}37FZWuq9Vcm!q+c70J{yl-#2=S=ier$nmqC@X9!xQM(-_f7{MELMgp_L7r z&k3Uy)j`_>5;vk_hf><#=KVloTV#~$nkDejzu`Gw`xlUR?6Oh%3?GT#pU~~ic*cl3 z%uXNqvr87gaQjH+bTua$sa_*gH{6T4FuJu~7V5%O=he&<8U7-XjS6*%z3M2wXyRtn z%!x8@$w^+39LFwdZ|b{w{SP8)^!&bZ{x7UhVEMD>acxvsQcAw+@K?;U`Pg~+5KcV6 z_4-iJ2pjRaSt0#J%`a^HPeJc*I#%@kNa)mwLMFVyzg*4YK?AZ_-Eu7AM-O83^0rl_ z^*c=8l=$`KAT$2p&3IJonL#95%Nb=FYD5ec*ygiOG-Jo;ndS!H;|R;uSbH76b*T08 zLp-k(W3biQ1tjxtJ=Xbxz1!alM_x9VwKMF_#R{s~HZC2d!;cG8Z*MXj!!nrWMHSLJ zkmki>axWi|uv7iIJo|1YV_};w6z+DT$8Dr}!j2RBmt_P%mYVaC?ed-v7~@nNu?Kn(CId1jKMrLe&%F*mA5edU&HGISXjH5nuZ+Bb5vAJb;JB(@Q^=}7mBqnq9_(orWRwfD!mN&{XCjv_V65Nv z$2ROegvhP>ZM9_+!R~1P`E^orCl>MOmaeQe1GdK~@NajKKBD(zzw>&xpCiS~PVj!&$%TpeeqmAGumNFaoWM%1z9O0a zc+K@hA&KOvBeuM4`?!j2T%LkvE+1m_Gqt9Z{SQg4@f7c&AFV1G(Ls+qMw?Z1226+_ z77dcj8SCB${guH)$6oH@X=qn*yna6SVBe%l{r)&6rPy(jZ?H$`F7s}cYk#ydqI&8e z^Rulh2Z;0Ka(qfG^Uptq$_!ZU%t9zY4iz8~%61U9lYgW{yk}RO`Q{Kiv9H48si3)s zyp<5Iy>>FvBM?3d*l@x)+YjityqoG%X@!PnyS2qco1lb=J=^M!I=C~t_7PuFDKt44 z_E_!TBe=JD!KIXA2-ajSd2WsEfM{0*bLj0#s5LngYWb)X`sN?1Q?bp40$UnwW~#=a z$&LN&XZQ8PGlJj6nZ(QBOPwVCE1(oUxOY2839hhSQ2&$ zy{UnFlzy8A#1=!Vse48huj1fDjB`*A+5;SHN~G^==YXFM^PjJwHvy0GM9y};40vVd zG*nUXhmVI-UEiJ_2A0#OHrY&f0S1$bp%SJ%aKPqtd%AH97~yUi_%3J%k2-QH(#5v` z&o@V^j<3`M&vLV?YNyLUXD!o>T}$a8>ieyfo`KuIXPxL1@k@mtNUn3B3c*7B7+yY|wVm~^%HWTm5=?UD0jllm% z&O|!#zUf7;@BXcYEr9)l2CvH#k&PP~!Lmc7Tg9(I zkjeAt>+MT}An~Ce-MB#qa9vm8^)ILeY_8g%qu0>{>SHI3+0$D=E=bqgqu2?SEXU6* ze&_@??N({`ds_fKXTnSS*k&-o^>BQjL=SvWeysD`_BNMQH-NmKsK&*BS}=7K)hE(-pi6owG--u{PUZSLNuC&B`BY|cDy&j_Cj>kB&;I<%-wej~6hwY^s0ZD-BJ%8| zIMCu`cjI%z!Qt`jS`Z@Ua~- zcH4=8Eyf+YfFll2u^(+qG7yYLi`@#^0Kri!>Ev?aYvLOTKK|#4c$A;#M%>_q;BXrq zyJR8`dU8jFRU0ty-2Av)uow=6wG{94GuHykF?f}=m#|aJ-(f?vFE(X%tY--W$$vI4 z_SqBrz~9iQw|fMEL|CTlws{;_G95#<5&Osg>;2n%$Br0}BTP)4DLAl8_|$WXh|@sI z#Odq<9GLAYCHA=?_Mwle5Of^JL6~7`M*?wOYRbpAzIlU#lLp@4PA?8#%MANmB+_Sb zr-Wbhk8qG7s9v&Mih=Z$31ntF4y4vs&L5V?!Tmk;-2M?buo{xB+Y5>QH7lJ?+=zh_ zH6ctF_TV7ytKYB7fjIDC-hyBN1565cDmRta0N(;hqw0}rP~fL5P8_og&J7CjsWIT- zc$vJ~q6rCnIN+SII9LUuj7FElZd8IrhCpK_QydHwbUc?TCxI1gFAF=dpWbq9)yefQ zNvUYQWBK-A`G+m4nUgr(Iq*mH_5vQ{>RPVsK${ z7?#eH0N;a@3nAgv0NDC}e$`h2m<60pwcafQEZ4Mo&OR#wCjtyjtoo|K2ZqY*Hogkb zXz#n)6JG%KaQ`JOIi!Q$iQvk+>tg`VZkCjLT9rU0*(6kFdl}fg{M_e$Ode1aw`iPy zlm>P;3LC50MuWnwr1i;sC17>-SBGIyAvjZ~C2%r72MnIQTSQt;1heTAYJcBE05&6+ zTgIP@z-42tl@Yf>a5ZqWxNPe)kla_y(=eJ2Os|zYS!|C3RfUR{k;HjS?f+P#le6={ zY>5AAyjK<&*Lo-E#F7HEy}J@zO=Eyx&e=1ZUmt?im~y_T6nDT@b%6VFG_l`Jgi*4X zVG;D+TEBE=q8#4Kn7?Uq{UJD{mB83&Z3U7uaMGtINyP8{pSsv57r-xE>OT&0m%|yx z>|Z4Y&z)a#XsT4z)aO&hectgyGe)UO(D#U@QtkZ?1iN!xTL#7(Dq^}ti5}2CT(*i z)YhEL88@tjCtc{;%ru&y2J4B0UsWwIiF29Lg}oZ8T*kGRe`D~_J)Xn5*Xm*T$e;Dm zEzNL8q#b}hUxKYi2Ju@NR_>^rw!qZOKc%b~xN)dpAo zMf7L%Ho}b4ey@1o!wLSoAhesK>2f_q9;hmHD{(UDp;kT-5mS^^N!fgi_ zSD&V~!K;iMH@`-8LaBw{U#Ba(|F#9W@z>7_r-+3CfM=m zrGKPUC-garwlH&d!k;qw-^+fsLxZfo7r}3c>u`)^-&wO(sC-y6ZTMgh9FiJ#8`@0p zg-BsfN*631eDyk!u;0KK@~d644XTNooH)-_55Mis*G>|xh4LG`Wrp~xpo+TGj6!V* zWRH7%;BrYJ)N>aRxU;JP7S~zN&>7Xi*SEO0bk7o-4oJa&-PcNClk%u)BB=;Izaw>| zCaekOd;s->Sq<fno%Mo_$f$T<-JfF++V4zXp=?UNBfdL=;}2=`;7J}wE|0JA5VSG8aJ16}s${shxRa3EOcH{HH6_?EwZo9vk)c)++M zurV0*9tz+T+H(K4S_4-hDj8&@r zWHLCq;Qyn4Qx1S)7Xz|1OMoATL72CC72x{*_0zumDj*;q%O`dw5yW8(j!VOjf${G* zpIK~+z$)7SL)^a#@XMa=(Fkh|IBCCli#Z??Tx3o(nOI2!Y%AB9p4=@2^UN`CGtw)7 z=I_Kaa~;)S(PEP&^z{RSM|m%Pl}Z7t;~mw%q>BJwXH9%iXcb^MRn)1gh5^Tn7EQrn zeW3ud^Qf42;@v<#jcX*mCXH-pCq&OvMVN($@mh+jTYx{0Zp4-U#UF?=$RH z!N8ZvOAjqyLy%yj5fU0v584^~@hx;HoE{w1Pi{9Q)HGTLH&vRO01rEnr1dw>(d_6-2>>gUifqAaC$A_9vzd-2J9e z74Fdnjtq9%qI+vVq0aquCB8cF81T<<3<`Kz1^)hFl@Q7<0_Uf(^Km65pw_Ws>cK?_KKeyheYr{k4Q2ddO^lVm zv+(Yr*H4OpUiwRi@)w0*WdG=_{O4K_#{D;=v4F^1cdS3-5l{(`#6KZ#h>Tls=){=j z!$MFfe#o*$rvX&fzkiXGQwO5;_xC6g_hFYS??JAU6~JOYnqy7u$C#?2n!S;@zTPs4 z7v$d)@B50CJGXd25Lr4F+IXu92$!AIu1+ooJ*?sf!i&m5!X0L-7psL}yKIBN8IgDp zej~@o-#HL|mSKB$QXvisc&8qJ+gk*@3$ud5lb-^XC%qA-jxj*b!6g)LbcL(IsR4RB z9zv(zl2HSkg<$f#r<^SFGmu>+wZt(O2ad+>w-1Z-fn`=L7iBFUKw*iNTW42GfVA>C zrmZZ6;L9uPy~_znAURK`QQ+S_h_*33ieE{EFDhKOFo>0dfw@5bZsJ^{L4$L{PU~X9 zjq30t-rSKeuD7U1T{an}Pdkd3uaAM;n~wDdE2lyCTu-i1-#q9Xf~}(yEQL~<{9Wyz zE8$bo&sR?>K7=PKM2n@v(_u>7#kUD)KAhVB=k1_V3EWhr_VG_eDKtK`Qh$s$n%F;C z=uNypJoK>DILY?pF}${Z`FY#1LdfFo-D4(L49$eTG#dt`!Q{Wc+Q9r{=yjfLtoKqL zOy1U)yoJ38-jwNP92_WuJw4U?AE+n6Ya3TK|M883s)r3LSf)~7>DGyJ91{6Zp3QsD zw#X7_D2b(fyH^4CjfmAwLriPC@J zUsnl7)d#Nq{8a*_#)2CU68lj)n8?|7D^@|%kdNz~ohqTGkSNEe@k;n*PdE?pRtNmK z;H)~gfWfW__TV!GB)D4i)ZkSr32N4#tCMW1g}ExHtz7gl=z`>OA}S=fq+GZ+b%F%B z^IH_}U4~F>r=3jCX&jb1)oR(9R>45lga0az*TCI$CNmtIIE>_9-&l4KhcjN!Zf;w| zU}EdnV2`tvQ2ElQKD9GdaF@5r9z_I$+hvTHLX#jgX?g!+X@>B7cI6jKQzb09bW(p? zW)-ZQ$+|nR1%tV0?PSdd61=fR_vEcRHBkAA&UOoeGBMK#ccS=#M%0|poN&aM;jtAz^zH^0SU5H3pkiuS12 z!YeEz5x*>J;Z4$d@jdN0jon9rsh4-XpOUYE{uOzrdiyc>!L6gw z>0m9qdT3AFvREB7NWI#6^+GkY;y!3IM^^{O@(aISnO62h1T_wE{xR>Mwq^};Nz=>F)M;yY67)Tgh}R-!Kqpp%;Mg;&<)}E zt1>ZPdI;4oX~Z2)#i6286Q{wxT3D)3!O8zj#3tV!Yise>BF|Lwj*Cu1`n-7=c}8jEOh{(rdE{+iudoNMK4ajyAaEB`Oo;;f?iucmRWUu%BX z{H(>fX1~_{TECvr>i@T$HM=C5KKnm*YwfJnYp|zYhqXA?`oGprI<3A2jj1%&(fD6` z;7Ij1MAPTc*iGZwILFcCHNPKeayX6WXq>)E_2*$n zKxN;*_muMI22^|2&QBD%9c`!3J^CMoX~UO@TWSKBU+JaD_{v8LgUh=pWZU+GLXGEb z6e8QH@$7S5XKLJ9PSkPWO8-pJC#!T&+Ep6KqR2YI zbW}N_m?Gn+MJck+MJ3`v3`m^cJ&MKh)e*xw`rA>esGyl$_?(= zP*~<9N1?Ci9^%oS0Lv|}iARsHH+)Xvd$uHszM`U)($3er95`9;TE4A|%zf_^iAQ?^ zL>EmFQ`ZEs--|v)-@Z|Uc%&x4&B=oMWWLyMO_4jo^J>X5t|^g1=0-0sN?Zbtm*pJ^ z`B&MA405?fKPQPylQQHCnFUVzWn_K(Y2_161h1KqR2e{P~tP0jz$VSWbUX;QX(_u*@;*(i#+TlD zF8fq!lVyWqe`7Mw#VjS0Dedb`Ox+WJJFDa=MSs|SJ=u>i*Ii=jm;kAJ9f&Du0{k&^ z8X)sq>vBJtuWp1blJzsEKev(Pl%nxtWR5DGl_zsjHr0^KEzU-NED6pgC5l@U^p^Cw zZ%43Az&6{S;8E9a@nou*wNmc0r#pU9uiKNSl>25Z=ndt5jAGnDxz2*Q7l^5J0%$3E zQsQ=c;7lo(_|#3g-}WReQ2e~{+WL}gr@WD;iOi&mOv?S&&EiG5-;ye?P{v7^-9nSB z|KUx&-^#UyUyx;$}nSPyTUy3H z6G}YZD~~ATb>BqkN6&aPwI88BDKu4Nr^M;n_m2|yLpOJd9aGL*ivDR!DTO=vk}2cC z@KTVX-|SXFv6ue-o1!ng#zrYOW9Oh;Zxao9j2wps`x9bmodAVuk16)-OgP29l6x0Q zE@$BVbdSt~6|5~}R{C$D#Cv}JH>E!&Osf?8_SX{>eruu5M=6Zd`A`_8&a>?j7)Afl zm^yD6Ia2lflGJ&r)0A3%;Oi2_Zuigtg%xeod31dTRp0o7Dlhs_`*VeRJ*8jsTdD1y zyiIM-?m6{-@VIA089$FQYP~D=)O!AX)Om7dh&qm}z0^3wB&hWlZc^EHiAqCfDtj(b z+KS44b*jH!+IpBmTQ3!9eCtiM<0_&O?WfuoXHsRs6I24)I@ujE zOBoL*4Qlzp9x64wsJt>vt^b;~PP)+6Y0m$w@9{L*n%1u#+Pc4%pIoEq)oA4#X#Vfg z*7F0j@_w3K2dzK1XzQ{ajdy6{vPg?#ibgwGYMd5{)VNn^ZHxcMkFpv6NxeAN5pKU~ZErq;%treDhw*ZdHR38j8Jjg2&WViKm5ujNV6G`S{- zTE31ZulWzA#WO~$PuzTz`fGXWf4Qb#%limpiv3!A#LZ2S*SMBvuGy`X|Cek2*6i2% zxyH5nk+eA1;;N^$w>EBTajfar#(zy-8}~d~y|w=2-gr=9Gkw_j07ZYHuy|r;!8`mP*btaMv zid_SZYvb{jChwq)Z#PX|%hwlZ@@ty@Hf?@MqWRUQ=>=%=6`Jh+fZE;+EuUXcdw$Aj zvau^wAAOI?7c{@4G(9&>UZFkDJ893|XWH{hBo~za#L@IhH2>#l_4R4<*#J%cN{dT8 zkXo;xoyzNw%62&_O>ruNKT)55J0)r!>Z?O7FS{LF=#uZtX`+6{iC`jhsbr`UPZcT?=>pHV-D9G9o&+b@}VD0iS5}=0UMr zjrvL{U$X9?P-B%UUn*>*$ViMag^lwS6u!H)Na2DUb^W|zPF)AwXRcEG#ZD?wxL}k^ zu~XX4Op#g7s8Q&2ubNUmlkP`Zw?nk{Q`Y%t2_@puo&YPX!o)2;0j?GdQ}P(m#(R`{ zeN&wjyB&cSDfJ|KuTboE7EMs}tvucovJ6wlxj{9Y($2S;trUA-gF`K3zji}P6hGZ@ z#Ce*8%rbb6VprsUk|GasGCd%d%VBhs{G~u)x`-?f#2QfYlQ%9=#3M)ed2*7Pzh+f+ zkmV2V_bKfpEDYq5<$e9jV`Orbf1%hNPIn+adQX7qx>m~P0glN6;?bJ`-RrzDaz1*J zFYO4KY)_IW$>rv|E>PmoIA^6nF8ADJG)KBsgqERT(8XahM+CMfp%8+>je8Ut&frO{fagb z4s(K&dmk>4{nTb3!N`7Z%?Z6B+i!gn9&JVNu7PhJIlekDnM?M!*{h6;Y_C-CbeCkL_0Ko>YBMD^x<;vbYe-80&QhrO0=b3tQC)q!6bS0+N3GilC zPKYe))x6w78Lu(7qb`JOV4WsFmVNa;(v#UDwoQsmhn@3}-3XRy=1@K_g&%yBN$ziD zu)H;STv~*giLXM4>vt%LPm-XfvIXC9f;lRsapd--_OhG16J+DL%|LF)ZS&J?AA&3a zw`;Qqn)IlJClmDTWf@2#X#N)7B=^6Rckcvw+#C-(mXhP$<^*TS{@QObM3bp?hM8Cr zCV;lSnj1OJLn8d{_ypk zj@MLvX#F9zTr$3v6qz?dfwr(9T_M1^Dx2u7X<`2$xRV_ zG)~Ef@1*n*52X5kNRLNWJ5pt39|}v`DO|afLbf0Zzted~f-P0{nxs%yk$S(ao2at) z1q$OsDJ2sXUTk_)uh`w@alzjdU>b)NZQ~i|5P|pw3^}kN% zU!`=Oc7|TwO6NUS?5O98>3PnJ^m+$6meA$Z>F>RZ9v>>vc@-E9q7M(f|G-A7tQ$k2 z0e#-|>AbFz{@i*4O3zffd=h>96LcQM89_bYOYaw)AsOfY^Hlibllla@o?yI485So& zFa`wwiwFLj2QXfw9{%|s1gB5Rk#v42O&?!?E)Pzav|pv;V!EE4bopVr{C_<78om4< zkB80nKjZzUmp{E8HWz9CFKz*&Maus@560_%%KyFJfAL2%y`6)u?|*SX8oj=aj&gJ~ zrt5u~UjDDY|Mcjf>u=#jjjKrSH;yh3$+-}~0n_rVbTIa|7X>woh?=jW%4spp*O z?XT$VJL&5~(V1$$PUq7m^m-Qh^BHu$-$~D#*V5ze8xGWSmh|<;M(-z`9`Anfr|e4a zV@j@up7&o=M1QV=+HZ$jsr4x)L)F{FQ+QaD!WnvAAzF~yrzP1`y|_7rF7$cu`b{re zQJ88*$&X&7+r1&G?37LM_P#6%XI4>mOQej-@5p3Q^_MqO{5<9ym5+WD-bKwn-OfI^ zM8zdRg@jIvZLaMZ%3b! z{+jiwh~3xzOZ7i{f=233b3G?`>_!6_uVm$V;x9#iZ720r3Nr-Trl{w>#JwWpB@Qe} z#D1tH?i;12eLbl^TP~6gR#t6^%Ld=e?)c2^L(>2M2|~{YYG3COAD;Wa*5NP ze=u?~9lV9{ecOB`#(nqsiQJZPpFv!HJz1EE`GSGnoi<$lrE(`8&tsS zjSWBdg(=Aj%XRcGO2B-$rTLiv?)P{>;1AsX%pj};^XiHSr~y{bzOQ$O!Q9Js#^KqoJH>oBSF9E;Idk^(A0l zWx1>*w7dG*44wZ9yxFYTWn&l2vk1-8651K>s$QrB{Bmk;^$^I-Ck}n*fO66m#X3!p zXY;r?kNLB>%#6i;z#WEF4N`z}O{=66pnYX)!Co!E^(lg*cpm-gg={whj&0t@?hEy? zl7SvQpMb|EbEK#MI>CQTZVK%NewHj|-@c=fquo3vZNRT@-8&fo~VC zmVoDzh7Rt11NBVV`_nj@fq&lqvod)Ec=p$|CgH>1QR`grQ*MxJ;O%wb1l(%8Vh85Y zdqRJvUjuZC(|K4A$Zg6Ur48*H7s6M!Kw0N_EH91|&UU*>;`yrR5#iMY6dhDLc@p$Y z4$F041LKZwDUp(g`peT5PI!L32UxC#0-o9&#B`t&;v>&?&&M6#QO26g`c&xu(5gqW z%7A{+g|&KsyB3XdTaLl{8#%%Dn+ETdIk?>t>YuI7w=air{P?ZHZa`To;zWBp^c$S^ zWBpY?NymeK4*(`=-3`R+NBGJV6J93+-I^k5fbfmO7><+XILBjs0aIdH1abV87IrM% z8E~)rE3t4uf0kti+JGfnIxFz{DRMz`hT;hw!@nI2X%e3x7B60RH#OLEd0<##A-T)3pgTwGzOJ;v_Y^ zZky&VKfwJ@wNx_VeX{ma4y3+d9?H%W-psK_@&MLzFrs1wj&ruC`-fr7kPF<8oVS_)|$$Y;)8R*MYDe+03ZFnJ{Shrqx1D4 zZZC<@*TwR;*;kT%y_?6jx*znc_haj1jw9EzKE=$It2%CV7pQOIH#*s?w)P>}RWH1F@ecE?y&e zG4LnRSN~2gDS!7rO!|=-UPsQO_H@*m;Big3`@Z9TIl2N!9JWkhoY>_qHC9MP!ur|z zgv6Ke!d-iD`AJg(v2V-ThRM7!+ATVb>-imgh@HRpVwUK`^ZFIRr}ydpEt2wMa-6M1 z&iDc4hw?qCJlV7FRQ}15m#SY>=0^0XiQGl{5!o3>;VljF9ziS-r0jdZh3Kn$Yl^&A zmVhy-zZ15F;JLgrWFE7eN-tnN1GTS^`D;9WkobwR1LsM;XqN#CnNRLn%1_Shr2MlA zoli_3qXC?2M+OU?$ulQg~>f!$rCG#Rn`$fuk zoGCrI>G6{-JwCZ@P4OUEdVFFuK=B}*VhT&>eDCW)O0L0@!i7T=4?5mJ>C4MV)qAH? zXdXZzcV#&lKdp@7L1Kc`e7x92^=~yq$tea?JTOwUmdNj6rTTY$O35vRQ_qLfc_X6p z&ntAE8cye}x^({g^9a?i5Is(Vk3hTWo%%;mR(bt2+QcAv`K5w~n-n%rKlK=1g=RIAYKsx?+f9DFFSD&EQv(WWb zp_l9F@4uIRPPm`m{)Mi`GJ1OnotJ0Q(d9ho z^J$zywSP^Z{w~Ax_)~#Cel%U5w_223cNVqobdOTy^1~GVq>s0Smnx@Rpytaggew1c zo@u$0D!Z6d?JuGzl+&T=*Da@TVl7qQ!APx>tSD-~I4z>|3@E4Mbm(zFs5Q0UUU~_U zed4&5T7Q3bQ|oTM3)McbWQ5F1J6(^To2mC%u%p)T5>;xvj}cTJV{Y49A}=;V?Q64n zisyT(Qu&wVUpynZSIDU`qXUdJisl^fb{d%{w3k{MIOUs4u% zGf4bHhhuszwvXR~sl2!dUnyyyHE|#~e)0jaoAojk5Hf=wbebV~xr%sXLTz;E*!X5kLtV_+rpD3QSZzc8C zn?o^nPTuFjeroZqSWS%H-=7km{W~w3_{pxQb!2?|e-9aPd$ufN~fwRk)B<7pRs`!TQB8*kNu`I{G~ zkSCU(=&l{Y80okp2S0bG*@zFfNBrHDVFmcGc;i-FuW9FZ63acX8tKRV+Bydl|IRm1 zS&eynL8q2CuCK}5M)KAS=VL1{|0r7(X^Hdu!D^{YR{(#9=_cU$k&e0T@ds zfM5JpX=DBtP|WHc3cNgBcip)(kgLwoaJ>&$bFrZa^S&YH6S4O`LSEi0XxA~|wVdTI zMJ;C`j=AD(9Si}tQ^kw@hmFq!oRcD`C=tt1_jA$;% zg((G2gur{u?{dy(1HQb@K~DKM=+U{=^E3xwf=hD6rdHsGrONW(fcID2WBhRl-jh99 zFeLLGlUv3`cncr?-0RI23Rqa+fyiX=gJ=?zbJL)>Sp;s34LH|xE?T7c9j@Ual z{vP7Nm3nuWTi`tsR+iR%fOxNo<^66LUw_d?IUPXl+keh8z&sn(R_zjozo&0Mr`1~M z&-c~p)Q}$FtqzZND0GjfVCO)gPU3r=j8XBKPl2!8riuy2OZbSO42lSp?1m&G^b#L2;W?`duIj8{>GNv z)d*WaaaFq|*ls-SiW9@~%N~owMS`B|tqu;3K)E2nn&btn-sN;-dobD609R+>{ReDK z_&`tLzuuBK9-j}3*ijAjnYle2IDWqUgPR50E#vCoFQ?$|9^)w_FAwV?Ao6&B9>|~K z|JCsx+U=FHw%!CBNDddkacq>P%nod?GRg{vF~0uRK=LO(!y~b{y!H2~GHieR-m?+^ zGabNYi0kiIcZ_39@d{YL$ocv4KWu+kU$S@Oa&__ETx{pgJ&>Hk@5wB}e+<`iJwKC% z<09|+`WHB!91dH$9M^B19Xx@@xylh+hUd>$HhG~7(C>8S5VjYBwI6w~os(;CX2Egd zevXePu|3-)(@El$BSwn|u2N(t{%S_rkoY%U&&>pPoc&Gwi;&D>lK&CSr_Pm?f+I=1 zLA&El{95*rZS7c}^l3v9M{e$2Abu>%@fPuiKeP5#yG5GOgPfo7cAa;=f;jT9pHqx7xOY__f1By~Ho2#21qIb&flV=(%9Ig3NPE z0L24(Zc+Emn9j=*|IQv?K>Vn<5*0VO4w#X8H`YL+U+=fY6b~prOY&QXjoL}SsVPTE z`%}FD(w?wPh?IZqZY1&0a7IB5*0<$-IrE93b`SiqyDA7${y>AyQ20 z=bjnA!tXhD=`fKuFBT>Bmd-{*pG`be9HzC8($j*@XUpjE(HbL4FLas0f7_^W9P%js zd7d5@t=mhrzjCB7>Liultq-R7>nJ_`T2(={Pwb&^I}??mVAIlh!W zMk*BMdQ$y)(DUh=BB*-KtrS|aQF^ttQ+aN+e5(E|o#)>cp~`dXsK4*8^NmFB*%j1t zW&h>>>GwG!k5hVa9W5YoUCh+@ulgu?OLeOKLJP&?-yTsXf4|reO3qf3nm<1^YCe|f z4w8NrJNzVANIw@eGNE`ecLnwLsr7kE+GC&BkaZUvNv#_}!|$Yi_&p`Rw%?DGe~0#x z{c+AKnUp>K_=p~%kFJpN->sCL3410-?5gYp#p`L)H%Yt45$%rZiPUQ`IuPD{&t&6g+}{YF z8QHh@AKWGKX>J^(ztlzxvhNiYzX@ZxPp(PCep+_1kozy~Jtf4BWbtNQ$L-ZWEL^Z1 zps}qXdiMW`BK9!vUOVCO0Wm=|ET?5P@fX`Y|4c_RKg=t=$-aAL7?FzGqZ{nyu)SRK zTVprIb%xKAa6L!!WIV=s=99#)IGb$<$Kx4W==o#+;`@@7-0Kc6k%A*JxIeS+sw^HLVmHKgh-1^Ej3*67z z6{}dW{HmR+xv(F)$;nRqm2!Y$J?6u&dBhLnewuPE-{Ns34BUUdIpeUu zpXWMfig`<{|Gii*@Y_0Fn)~vg{=CuBgED{|hYs1l0rbqjwQMI~Vgtj;6yR0nPWPm6 z{=8a3dQBi;qxz~BxL@s;1&i-PKMd_DWn;j9M14DLFn@AA)+})s(EXj^(J^R$VXU6) z4CDUdsg=qDJ~hOZ$FKp~xtRVoeS-GUg93XFK)cTuvC>?q&s3;AK3WZNk(11AoX55| zQ!AGNex$B{jqwNYrMzgJn=xe&4~*+=Joy;-$m@xtYS5n3xm1@1{TQ9lVE7IAsQBZk z;3MDxQZLQ;g=uJ1Bc%Ki^na#E&tDSwOUM4cxP1e_=W1sw7RKT4rZ_!ccmvi?u7lq? z7?&?l`6L(UYs)H+JRnXeO`NTdE(V@D)7=wk1mAI>p+Ei553k$c#a+P5{~ZX>>;=v|F=a84WG$`BAZa4GmqizAzPe9{#Ql@-1R+gQzHM_{jsO z3G~R+Mfj8(@OQ;3uAx90%1+DU_TqtgDXQT8T|bJp+lgFXkw1Zk+g4r5+z)Zo)XK@A zXc$M-ca=Q6$Iaxqpp(Eq&1Y-2GQoSs9*%sV%mDG zy?>zx-4QI~jdbZpXPelk2krp>-S=9@2-er*tnJ(>z(0Ako*m%?y;r;EXySPGsn^FB zIIrz`Z6nuinBM|DtMk0@cW&@dc-Z;__%-8j{V8b@z-k4@#rS;# zH}VAIbCL3WIYRh6<%&&x4im_qS3I;K4$3c8dStEvCRX?GV%~o$;kW*4h&MHc1%y4| zz0Bj+DqM#73DQ{e_5qYbq6QCR-o8ij*wu9qH{B8VERW+^6lYW02dGD$mO=y z_WT7D(KH&udh#dK+u`{=c4`j?wttGzhcd7oI}?`v9ow-Yp~AvpejJmR>41`x zGikrzeS*k)8U_X6d5juSOvCS`&xIVY{BB|YE{v@Mdk9~hzj&+{#~n4DapZi~KxlyY zN684=-B?Z{)&DSlKC^lz*9@@Wlc)&RbGvEZNjwjNd!sMm^84pZ+p%0{Q~>d_egdzE zKKeR;h<{Z#rS8#QoMs|^Hp(iCE7$-lX1~ah&+;aEq(Ne+!oIlk<%XK_L={F{*wg z=RKZhcEVK_@ZXBAB%c;D(nR`m@TT(jj^|&J{_g8gyjskM;#t~G6pvb@=uY&m;-dJK zUMR)eX*v||>$pPkX5U*rq@T!fDvl8GrTDr~BE`=#4pY4Ubww44XTGy zCz7(~X6n1b5+4onJ|>JzMBlE{`-mQAcBBzGsk_v@X|@d%Ka}}KjdNi;Rqh?6^dID+ z;wi-ds$QCY&QYsI@zZ)HicfmaQ}gjFk>aaNeAGM$NK)k;{M7rm3@VWESJCf-MbfCe zaOX$rJS%O>rxr$gS4meo;m$Wb6O#S_6(V3(?&XY*uvb1~rq#Vq7mOP&`FHFicjf$jv z&XThQuZzk?J5t|ZYeCkX?`3_GZ$0(LoaBky5>EZVa<8uFk#;6cbF!XWxUW&?mllc5 zxSjPu7CDC$J7Y}7|K{6H{?1+%9%LUX&ORmiSx=<<9`C1?bFav{)%s^a`e}S@Lh{N; zO@REpJ@xdSVmY_)TZFGJF5`!z703f9?08G`@oypfFztXuBeq)%aqB65YRK$}+dneg zvB&$Rx-Dflwu29zD(YZ6@Jj!S9&TUA(}trNxZlCTaTLq_b}RG5{jjSZoWkRl%)1jl z$uP1>4cmeA@7!j%pZh1BjBtKp(s!3aJfL;N3wJCZl0mD&{irB7q38@UIJ#;Zx?j} zx$&N&?0U#ERu7{?eo((c>e3NB4=+vP`|yrVLbu$@Abuxh`xq zZ}(_zsgDK!-tzEH2DE?Wx~OLZykXA8vb_-eWs~)}bF3BMhZrm)M@(pFj6u1*s2TKj z;agqz9qyGkj~!hL`QewLd|mF4Pj1)UWt}lgL)ZGU4?2Qh?z-Y!B@YmS*1`YKkcd0^rRuLxW%6jZl6GGX@Pg;j?>T!pH&XeeQ1bL zuOzCiv>#Q-tPPi1I);u)$&5OuPM{)%iMFf`@*vc z6xI6SbKlo7q%l&eZCKQgf+t=t`Owsl48(Yf`;te|8-Yp5YR*ZNyM|%E@TM`;b7&n> z7#To;O;apBcScd%V3YuZ)Fk?`QtV6Zo(XhPP%M4z*9oL%oS8VWVFLN@-4i6_H-Thi zuBXrMoj@<7mVHWGJc+Iby-rjr8%JUK8cFs_y{JGT@ht0^9<)`k$CdR@53)D$i}yLw zkFpg0c2_5WUzRGIUtigS%nQelf2DP!)4o&fs(sz)b!z^>Ht{|r&2m-x+x32AD8QlF zwxI{vjXl`w!`6+swPo+{%XgvL=G8$SIo-&0J59j}`0MHOLVjvN-DsKOY#Z%B7xLM` z@Rqls18uP0BO$@jg*?KddKX%{kn>=RqX}y_iuGx&WSZSJ?o zKk~Ts$k=QV4Sk%Dee;QfhAu2kDrPSPd(j=oECBn+;@6sgDP=v#(^vA>x842dq{_C( zslaR1mG$1Pg?=|iD@wA$I}o$y|dKK!Y>0sAt|w&dav>=!|0A4~k)IfKLdyWo7} z{!_tTe&FSQZ=PishjB}eewrQtzRz6E*%Acu1;%m=IWjcl{P|hu4>-4AdA@Sv!#7}$ zgqw|Xf&c3LSe;b?dcB*ONh<<iS0^jyLUd$1E)HEIfCQ-SGFwb)_|D~1+QH} z&$p!!Lzrh;`Y&5B1gtAzjK2t|yL{gb9EW%`RTlw`NA73bahyBcGq0s@{Pib#p&TG(fZN^SH zJpM_S(Ao2Vjb|s#u%Bdp=FW-r@EM75!}wlxp%;%+bKo2C^Gq7;#DBZZttNaz(3epj z%ay5bA$&l((3$YlEL$zY2Udz2QatX+j3L&u<+DRN?$2D^C=KKBXS~F(KYkZ}7ng&I zWV5l}DgiO|xZg0RcjO$`p-O|~(OWidC*#LxiW%d0$B2c8d=JD{ti1w1Z*y*N5TkPp zJIU*Nw7HW!H}jn%M33u*6i@Xle?s`rqWe_-x*)Qe@J_~M3qm=&S&~3 zL7Jag3hw{vOb_WdY*PZ^MWVl{@97sAuP4u`E@a1Jxxs94!oxp?tRg(;kC!Fse`5JC z$=}6YXd?60eDM~U4{xO|(jRZ}YtqkMB^$z%OrBAEvRH`HcNzV=iZZ92M6VKmiif65 zydY(fzZ8#MFF8ued`z+g-AkHD|B9+vq&#qp%6D$3|6TyAff%V@yVH>9%khumowfpO zM4vqs4@vvVo9P5~wOL7gk&s2nDZUmba=YEBxWGuDkd$qd0!Uu)mh}n3CkJ}xNPSZ< z{)86p|Fvi}Vsuh-Amv~$V&Y3x!X>1MllgYUXe?3Gz{Ug2FMH=@{y=ycJOkd(Nhod%_xD_< z1FrbPeqMK*^z$WE0X}sAzGda&jCtqpgOz=l&vCo$*TQmkx%;(nduL+Ib=>cj&w(CT z?q-RwAGU82gEQTD{IU$r#dtrJz7^NU&sAv{Mq}jd@ejQX`1DZReq8R|+VdF8#f>gx zV!a+*410p@$PTu+q9=eiwKaC*b2hCLjP=-VjF`zR#qqH4*?dCWZm-l_QchtEE8L;$A5Y5%}_ix@S9U_0aFe!@f& z~? z+pHxglOXTmH#*1)&q*W~eBKXo79N3Xuz&OR-5C*51O93KZOe11aF0aW;TYzb%t157 z4?sTmU2c9R^oQmcn4N&XYN$$`-3fk7bX@=GdC(J0PYb_-_hYv4`?M4MQ}MIi82DDXs|&N&ex5?S4G~gprJCiZ}%6M z0FR##Z9FALLti)KDHZ~se6p48tLF_GlF5!MjPV&qR`0IZnu8zWwyn=Y>Tus6CXjtZ zAM$mN41`@{29V_Lc!7Yn2^87*sD9l}8Zr-3^L@!fL+&Dsygr(6F5DP381FocCX1gJ zmF}KGEt4A(WA4&W?aD<G?JcadRUZ+!EH;&Yf1o`?TPa>6_XTJy-)6o25 zhN@i9?-lKU+LjoIKa!4C>v&C~n&oCUU+tejA~U&9Vp=+p_sUsLtEg_IoZK5)>(r0z zlefAJOVN-=qe#pNp@&xzxN1X}c!A_loL8)$Y@q&iaA9_ia4+U=-WLkk^N|c(3JPZQplHacOPUQ>OhQ_F6Z9<+yV3Ob;scGZlvhs zc})IoA97l?^VTH;SYJj45y7G~w8m!5N0%mu2V52ncEdf9rMz{Q?!tWv!S@$*{=wgy z`Gj-htR4-0>2SU#2)uFqQQha)A&==8?(iuL{@x;bx(};>7nweJ5YP$pSJXJ?7zaGk zq1MXT1OEQ|FSRHu01xso@A&r^;+Ny$O}jRZ!n)-UI;I8l$l9>|wtc6*fh0rXi>C>m_9{&WoYSYe_GmA13xwvcS`}s;l?N!TM|{ zeQ=Qt)_q)zO~O^!FUPGs1@QiQUr`kF5B}~h?0zd2!Se|tk&HGVx9JquJ#J|4DP!NX z6rQ);ug}N`W$y=t0ytkUH>UXH1Uy$8D`aX0xIU)jgBQqE%PZ~`2DzAJVI5r4z~B0A zR_nm~Wr#E!_y+4XMl9NU0OZuJtm3E!xnNHDXIVc0ABjGb1Rl#CvQ3W$`%letMcICk zYaB>AB?0sN6xrG0`#CrEI_TNMb7{{-=kPg4Lxk&z!+^b}ImGXW*RQaB4sr(TZ^#%z zeZUGH0n8V#FMmez0rv&hlk=U=aTmU%gIvYIm1Z)~9(z5}BLr}zveX>rks5!uKE=Ff zm%xD+5`gy<(zWM7-Z1WtSTK~=J2LFWcDkUx?w=K4<7Yv)LeMwrbgm35ls)G~AL4$F zAK1Zzf@ z9%~7Bk^As5&sh!Jp=|UusT=zXA>FESTy_hW@G}N%de%?AtFS)5>Hb06dylzo4bv|ETca!+{?k5ike^Dy*C-?UX5AVE<^>MiwMf`f`uVTUn z{MX$j_cEBIyAI-hg_`9_-e+T39N}foCms^s*Z#IQ7e9Y@<5_a=E;l`a_-j|eHo_m1 zLo_OI`$F<#;^(Ee+$7%(B{kHHk@~U6Wc&`ca`K!*uOs1OE9@^5eXi%OBzor#2as~~ zswbq(xLKX>g~!h#NPPtZ3#qqgrT9>!C3XMcWWY0`r-$oaB6nKHmBYw7N!up2l9U$kdc~1sO`)1c+@;t{-ERmab+e7l{ z$Bt*_VEH?z4-=lXx^6ScD=WGMl6>BchfhLqdx|6n;W^uitw?@dF3OF}`(LMbq}(f& zPUi7G$2d8UWq7!p%oEF$I;lS^bDxaoy>u&y2VSTYk@Hx~-G*eoWhLLAz~f|H-$s5v z!R3ca1?DSDF0usR^MQrfOZ#!Vee%#Xj6paElE;Kzl2DgX)YnQ=(Uccsf_rQ_wtzDR z7at`7rb+ur9)|rbn}B^%~FiY4I^m=Brlz0=qM$i1iB7k?+TAu@BQ5Xz2y zU1|b=4*aXH{{U2pH#u_v?8p_#v8fi|FK=0lGh(5hW@X~44Cr@qeO@DAi`4RyqhNLLM&thzsu?s9#wvkRJ*-B^kDPCEzvIp>BNcWMoC7T?Rgr^HcYG1JoNjOCom| zhuh%v(>iRIvZX5?Lj8Q{_gjipU{AL!UKs)9F9|vOPQWJMx|a{}gL$?k#JpM?g405dm5w57TNI;;3G4w&yJH@7grJ%uX7*UW&`1$o9u z2d*&h=Wsu-b0}MN$0T}eq1|YCdIF6&o)~6_ewd$2<*X^_N5;?ByG|<(qWG&4-oiI0 z5i{3)af#_M#I))U>p)OHdQxL+QVG29^^RMM{Weda;w!A1_(LX8*m8};v~%NVPyd&J zhEqeppMp!{mB-OrzBKW%? z8AsJ(-6*ojnrXg(bt(Fd%N^F6&6a~p!Wa6` z{Sni;udr^X?Tjz};-ewU2YXn@44k3hdBk8-o8N+JH(?z_ZucNY@VRhuYw>_M^;Q&)L8VccIDf`MykNcf{5wt=_WhiIR_2T4o}1W+LSP`K?m0F_b>aduY`JE_sf|}VZGaX9XDZt_9yi>B8_05 zzBXJgwg%*MW*k^nUeUEscUHjo(+fN{0zm#@30LqWmk4Ja_k3~9-`|d-$a$!DZj~&d{^my}w zNZ5xKEz(=B!?;mfLmrQVok&%V%@GB?PMNweV!p8G?M{81@7k=g`|>_O4$T#<&LD4+ zk-RG!%B9@TmhJ>JIq}3D$B8feo1C$|?^UQTivm4&E0jOLd9ogwz0(CiTjnd?m@l23 z5fQ`obMC-zn=;^gB0s+WsRn(;%17jB@N+GBv<%iHPQYs|-P{;`q3{g;J_c48h^w=46=0L%;9>nv-` z52LJ^&CUV}mOK^5^A@_&HwO3Dx8-XNMjKfk!e0bi7ZY9-l)y;*d_w^BeMW7^29j6g zc^UZ;>*G0fn)u_Wh&YnRNqtD&Qxjb`AB6jBD7sDZO-pVY6W$=DY*R_z3zO+6q z+7tJuAkIK|R+@(_X&;EA&T$3Hn+PwCd6uGu<=&n8OyrLGnUVa^xy(O=Kb?3pLwHfZ zMO#TMx9~Zf@E@%onM5zwZS6!~iHu+59P*|}G&`32Q<`XlaT$EjfiaJESP9S1&~(yE zyv}lR9bV&g;cDv6i`#GT4-(!e@jd{4G6ML(6$KqE*Zv})9`logkF+){pZ>Ru%{%j`j{7$YWhCQPFK4auhqBMkS6JN`$NSp)NsUl5u5akL zrwDdHQvS?!eD0?|*;S0!gLhq|4c?D!p-NGBf95?+ew6{J`uuBF2w-AQ2n*Kph3vja z9G_W@Fqg~#hIIaWi|?0l4>3htf%5db<90YN%{jVj6JGBQ>|Aa`fXxLq4W=L$#p876 z8kEfq60hR;OHlgwalC&x8jju^20ZC2C&>tM`BLec_`O(m933kLd*EuM(N+v`=C^?b zfdSxE`~yy!p7+7dwq8q&0eQPkfUO)ew**x^ec7C19nL6NU<(3IcUICxmY|(?`=#9y5v%i7dqom3N1ae^p zGsi+fPPOp<+xNhO@_IA|>%rc$*gp8h1bTiSeUrZ#Mi_SqF;#y9_ zbC;!Xj=7MhatipD_#or%Yg|L9Y+Z-kd#efbq|V{5;#4OpR_?L;c)A-|vZZw`-PVs% zC%5ZLf*#kGUr<>F$jBv8^-{JA)g4{;u}`lX9baywm)y{YZZ>@kJqqVpo(8EkwZOmF zSFhdoxTXs&0tTwJr5o+d6MAO40{Bg5=NiRS$h&bmO4S0d%0=HxK+;Z4a+s1MrKC z2~kmKzbl?_#$-Eo?Lty4o_pAM#RqlCG^mus$waS6^iSJmeS48tZlN+`;G@A8@|Y_ff!j z8kGA_<^|mboQ~_W-~zNMH)QI8b$Q@&CCv@wN>!ek=|X)9qh41pV56UWDLddNwp4@}m|bOKp%lJ`%RY2;>eu%OUsi=C(<1oPql0 z;2Jq>FUlDPR$~9UBXH>xTn?wbCg16+o^UAq0CGBs4lFnx;~E(qK9A*Yzdw)jL&A0% zzgz(wR|l6gf}Gey!D=lidl$Ko`?N?}VFAm9rt#CTeVSgyHH5#z5&CiAq#Be>*O;sd z0Q@S{zJS{oRxY`W<@E*a%yC|5mDpD04N%q?OaFoGvHoZOZhSwtY<0B?wqtW0PG7OV z96qi|?iu^Yu2si&T%X}L$@@f~og;qJ%lz94%o8kBEI2VXwJ2#|xs92dh<})znOlbK zd%`BCv)JA)r z8-V3KEV6OC(cLg-mPzn@4fH3IB^mC|3*7bpYMQI#LpY^ zfn3B!CzKLG*#!rxB+6) zRR=)Mo!y6a8suz87%Oi~A4CCrR~rm`1i6dHTTd6meWMrK)|8!i0{zA31-}4)xrsB_Ru=r_mej<~ z^WZP@1fC}5@ed&>cNsTZ;|a9d<&E)(D)^7M?WND*zP5?3&}fz$@WG>uKSYX$kRwwg zv#Rq13gy$huK?!@Nk)YgHNRlLTo4!x^Z>jN?;*d+oor zW(7ra($L#m&jRuJfJM~j`@zqL&=)tx(Dcd))L>=3BWVHleYW@7*Wf>ERJ_)02mK7} z;{A8c3?inF>|$%nC*Yn~n6xk4yI~x0Gm}08=Od2iuNma@qK|ueGBy_oD^Pq{~*cbfW>SXMJWn zx=~qcf=1z)Uc`G$RG;4v{BDwG_}p)>L&ZG55)!)6*N@t3hPb=Y!8bCO&b;YGs@BFG zOt;{?Z(A2l4g7O4YK+Xb??y`E|NaaLcfPlCVXO1W?te=j_38)Cf+{H6Vquu?PNL%-JtxkRwjP{qHy z|7Jk0#_nQ#8>~C?&mSjsKrX4wNr49UTDI)4QrHc=X*5Ca>3iUj=$=*mS?DkREJu13 z$c?OZ8{ei0d9Mxs)~UgJJ+f2|#sH#jf=-#;*2*!vpF znGY6xSAtw}*`sp&9Z32-e>t`%Vn$67*07(Vy&MmuLAx~fev}BPq|Sn{-`~{t!9@e) zRFsp}9|1iDPk!Ir3iI_aZwGPJ%F%L7+l9Bx6l8b z#`ZzZ^?f_GANKc7>f&(=(n`Zw0TWPsiaem?*ctdKd64H^n~Uw6QHzeL6W||mYezbr4+XxdDVXa_p8(2Q_VLtpcB-ka5aWY=7+9Tp013wCpyn)5k0`a%@Yp8Py@xVb6SAXA|Rfqc> zE{r&gapchyiJv8Rsu8`qEng5n%zu=P_}_rjQY4-ieNaaHZEr30JI+QgseA3~dyU9* zMIp?@uQO^>-(kjgQQv!Jh1Zeiz8kG2wx7@{Yw!TyRxPO^SF`{o;$W?OgvV65QIj`F5>*0mv64xmBV*I#cW)EJMj5Wo| z`0pDPo^S@|;Z80|x{dddKigj>9l#4g-|TU_l5RmdKCckWFC%%iQ(V{iOQ2kCeMBY- z_Gf`S`xNe1RG+sMd*YH)in%1%sVh{=@eljw8;wvMk;Jc=%sc0Ol>Gq6b!MgC3iu882-I zUU0#vdi3Tj+`l{I^Scu6UCNy}uX6zWl>qDZyCYgdD4lk0-3a9GRg&EuQYyjjYRc}& z-~u_zINteq`1`&3a9Q;Q4TZJVS?!t|N5hBO^RI!PL#qNBJF0=FB(i*a3-=wYDh;1- z1^`bfyVd-F1^nPiR67gr#jTK)$Og!~!D7B2c*wf%p_8ZJJ33DW`Bw*h!H;h>VDN?a zN}gnJwE@4gsEwV*1$hYChwSkokXxPNlX%^MhLRUaF?A=8p|w(4!a{~)=*BfKuKX)w z=%JPO?bQsU=*cxJw|gH(k(TST?}JOmQAx&5`vUiIwC<3H_>rzrRB`ybZS|*7#O%4O zCRJt>-E%n`P#;1=T7Q;LZ3rAjJP++9UJs3-B(Cb?2?nF+>gTTO>6m+dX&CLg5oBHi_pqgXr&X?3^dlG3C&dxY zLnx}^&vx^GQRKPS_-|{#D{j(^GVB9BvE67q?>O8useIo5?x`;Dj}gxJ zC9As8`T;J?%!H>i64e@9IY59;vLNV%_NQ^CbmLCOzme z^ReaqhCN6#lYb$*3i1g{T5n2*bR*R%2i|^o{->B|?Nmw+N>@02x%zYu5{{RTz0%Z; zv{LwdcxHQ$IPZo0#cF-%OW#rU_QoExsYy=H66E&FE)71ksRw?q+UoN3hCVc}Gs%$@ z-;e6dpH}|c-Hk?_`wmpD>qgJ3K0JRR--qHqi@83A{Sm(U^n^9!dDiV!ZM!MbjqZx7 zzg523jf@#op4bidp|4>RVR^u3VvPBAJ_4Sz^Q`5om5;komCdtDMAn!6e;5o1s*8S-_gRVJjeW;twyTRmRKkBt!c%KJ+G5=-rKo;<2qX1#KEs*Cb z$aPFogZs~m_uZd$eGc)&P*DUo@S^!k>f#$<-OhZJpHl?h<13F&YeRlR>h|)GW;h3V zqP6|Xd*Cmgwd{v&VZ6nY_Y~rR$9&i|pJTlq?hWOP6d>4FH|OtZhBZRF{fetKkU#md z9oe%=+EktGQAuH~T}?sy*3zPF|6?=gtnNQpjig;`77t z3H#)-3)QesEJYMI*unnoUwmK>cR87 zM1oarLfOc<$NCOn0iRnoJK$YiL*>rWfn-9t^4L@tJ-EvsBrbG`=$vE#a_A?^Q z)8}x$_4Mmh)gMp}Y8<$;2XK{s?kSuv;1-E4!u}w5HsStecz-sII+v$V7LaS@&;?wQ zw$cOJIg7jFBwsKg*m|T7^xo>x|IP^N9Tffj&jWg!u=Znq!Nwn9gZ*LQbJ>zk1BA^e<;ss0ZsxC668_@LtwsF0vPYF5uHU=< z6Y7jz za}!?RemaQoibLBeKE$BEnDD_nf2rS9yy`tc+PCLW<&&Y~q|D4tosT%YrM`O$Qm4Md z)89$`4t<|lF_EiyOYu0j4(fY10s8MR=yy~1g0t$W-!sd#qrQ*R)~4jtq^R%RdLFlv zezd!&e%oxQ-$Ult-cNX9Te}$HL&qdjNj_ztOt&k3fB(sUqj+6B(KjS=;Z6F4AAa25 zPWWcV%n34|NeXIzu-w1}>i-eRLmy zBHS>|%N2mf-WkcTfgMqM zT9dsO>{7+3O7mC9U;o&?GWsgCi%Xy~%%8m6rZ-0cDk(SmV7oanS!Y!Yc0aJ`K?v5< zZ|`0eYzOXFjYs4B&*cL}6#>KsD#@IIY?^x!(Sdqsmjmg<0~_AeALfSoLPpeI%YaqGP5 zY4(@kUt9to}S?=q-SmI3*n#rKEQiaw7brG1@OTJ^_}5tplZG>pUSeYo@u#OVWn1f1ncAfH@) z>T#nN4N0WkxTR|_gq#wK*GWL$AWW$3QXu3P8pFPvO@_P-8`IBLyGY3Eq;Pv|TmkEk z3x?uC368&8^O>rL>>RUhgVt%09aK1mbN8$nyb z&Fr*ihT;DSvApTVKaBVSJ|wOHMNO_I`|hvnMN@LRyL*72 z`Lw8cbU*Duf#c+J~H!(eGVR8LUT!=h$W}*xibLd_U`KRnUqAj>$Y|OKL|?^c2K$pkMBP=-%}U_74}L zry|=nv?KSOJf9=w;CzZ&`w{O!unRxaytoMZn|5l+YG1IkDO@Vs=&%p=Hw{WBvY}rE zI{zu=2cG!pL*V;#=wCyJi$ZIF59WFnZ(ZTmjyQc@P3s_>Icgc8Jr(>v9GTf$_6&HL z;C~gZU~l_T9b&mW8P@NEY8#WlzSbSt@xULx-y`qU`s*P5*r?-iJy<^_-(UMz8rE6u zB0cr~u&zv2$(=L|<6Y;b-$Gjy zxg>P^&rS!s*oM>T^KrbWrtp8-FdjH9JF-*=^0~*K>f8t4ZJ)z^&R)<*Q))}Vb13Jp zS&IZNU-?k*%h`ZcW?pP1kWZdG(x49cJyI41O%$2?O8y?}%bd4Ryr)&Yg4W5l-*3*4~B3djY<+8hAb!P3>tCWpTYqoBJ1GyNd6TYyaVJBj41cIDJ)NeKkhE^;^k)%&)kKo;dyNrVVa5 zKFW~(KgMeOL&{fGnn~?9maZI21&Qv;7<5SzmGfNRY{s_ z`bmA<6ImETFH*kamE=lz!;h#q;@{iXtcuv@!s0fOeA66T36E6h`Av9{`Vb%CVO3#< zB>n4RWx}(}O{m@N$t3zeT6KD1Dz0Z>3jKdeX*<2YNn4!yD=6M>L3mX~i8SG}qHQ&# zTs@;tX@Sc;@|8CGm>d#`@mPDfeQrWR|+-^(d?-IT_CQtpH->9bN#4oqM zB69MdQwZ-@k^k7 z%Kik?a^K2PKOH*4RBrXA-=y4)4N;^&yk6Qx-hY6F2YGLAL`*JV{R@I0J;&dR?3GO< z{!57(;h({SqoltnNN_^2oLP5`8pfcx)J|(Tv6?*J>pa@u?ho^mb7{(wEYdEo_kSbx zX9`>*Sf;j@$VVT#LCW`u7;&WFvtIrDr z0q*|KGak#SCA*XJZ~@b}zi>EP@GUR?UYG7WO#ZjcUOJ!XnOq=B^n0;wJ$b(7j79di z{4M*9jIeyk-2k#*K5^^aDqPNL8NrJfz0QQp!*YWYgQW1dQvP<^80OWdXI8IT2e|6> ze%U%ez3IIA*x$f`;RlZMVVrk9(G?j2@dpi)d<_8qOS2Nq2UOcr?2Z3_a}n%Wr`W`|2RV+%~eh%~T z|2|IgF#=qwTexN^pjM&C2^_DvDDM*yEiuZvyaSo+Cqj`2Ri& z#gzf;fnV!4EL@)ocFJjUJAPM#o@E8kAANx5SDl_OJrCw5zeAckj=+4Y8EQJ94)gfF zt7U-?;rXp9rX9rhV7xt;e>4Tcl|EjzOJJTYPxm}^2~c}@#K0f)RFoQQT?XhkJ}iyx zDB*ux;L0&LpXPc!;TYJbRvzoEywVH($#Kwb{g-yMvt&oD!qzUNGTG%wYkM!Mvg_lu zKs{*114HF!a6aj8+q`qBz>{?PCq|fMz`R>=%PS$Y3zhVmtWiDIjao-+TnB+?EHH?X z-3aB*wKXj*hx!gg-0;193)UAZNwL_^Z|;pli4WoV&K3*&Sq8jZ$ETr41^9%G@?!h_ zz_X&XHCs=^I!MUuP53#G3rhGi)BwEaNU*L;6WGN(l?^V}VYye+QiEWh`I4!zSDIii zYE+;7Y=KD+68*Jo`U|mcG%@O@-4TT@l)A)2d1E%5Z+>I;=!1DTs;TNfmuA?FhSPt{ zn_u099%}TjN|)$DGII5TUvj`sHyRU;?cf_cGwuYz`lLjx?qe*hZx$@}aJm8ZM!|`n zs>i@?sBp>uuRquUcS@G_Zh8vq3fZasQF*X_j80*f7X$yZSi5ffYiRGYD>Q^A!@2EW zALHhY!F%~^a;^vL)e#H2azycaKhJrK{o&pI!8O|h^&d$!u!z!t{o0_#2WQ!UUHjFJ znu7D~XpBEL@flw`N;o)aWYa_N%TS{u@WdGGp9y}-E5l*FH@Lw&o868|O7@oj1wRwz z3&j1EKu^I%jcs;+;M|4BCS60YFaFpXaANch_)C}?>8qIn>)-O&CQr~)Nq1U)7o@9~ zNOzurexw@Z=-t`_<0E&D?|tCCOQN0QTtUyscd0^{&owJOU62XySGs1W?QM8Zd(2l$ z3_d>!hh>o#s|ZG$o9+UF2ni6FI&nD zPQZISKj+lR3V84P*_pYAVg0R~cUJW^tQ)cq247Hz{fyLxw5gBbJI`uaJ;@us-?*z^ z9y!AIFE@~8*$b##StxxT^0n#K2D`yHrti$UItKbDbgREv4SLO1Gk4F2bCk93B_**R z!DB||6P`dm!EH|>xo0{04K~c+CG}bpp2QLOm;%tJF<_^5lmeBsqdU zb}r59@HuwWHsN;y$Qy!VlmS4!H0c-)U{G0ne>v7;YkWZfgjc;YoqYi?IDfkI2Ec@$ z`zGCn^wi47N3or__|%auY)_r3@kGS}Fz1@%ajajwpxZ=jcPdD>ypK^o+j~B?r|4Vm zQOCUg@tt;a%$vK<<%_)pJ=N-$R~+j;g!PPYxJ>-fRUZ^i#Pd_V z%Gb|$9<+!KB>S|2zLuF--&?5zhp-;DarZoMJ>P4`;L1CgH+TIB#rgbWA3VW&+n;{e zg!LJeb|e1vjXtIk9`MN^>I%-6>rqea%&{rPZaDwzq*t*x{<&=c;XMWul524I+DAcK zoL(vNjnvoq`99%CTD*#Ifc1{B)^7~2H`vMN2&kT zcV`3M;rtSxhe`U_jtzu&9NSh*|l#i5OzKOLYa{d;L#NK#K_dMaN`^DM_A5;n4P0|y;P(NlO(^rsm z*^q6doZ#t{cXshnJ9Yklk4gOBTX7`+l}75fqRx!+=ZMMFkDIe8o5=YH9wFr`j8ndt zQAqu!E&D-v;mc{1mw#pM2WnBG{8MuZ<@LQMn@BkdJapZVzMIPLWO#ihb1%vq=AN8; ze<^Ri!tnnHX5GMYqWNAievcKIdvC5X_n{;(_p$6}?qjKC}Q!HfkkY?_aDV$ID5qPq*$a7_xrx8^3vL)~P+6NQTKVDzB3$FrrPA`40cjc%* z#i}J&i2Rrvy$@IDBJKAj5-lYDVLyF7)&ts)HoeFt@i#=Z$oIZ|4PD1|j8pw4GwaLB z7c?Bbqo34&*N*C0p-0Qj%%kmf;3V~Xa#YHW=sUyUCi%X{mU)wLWLbq>7}opVyDaiu zf2s1W$GrJQ*hVs*WM2#;>zC{4CBznH%g8Nz(z#kLC$i5BV%Fr-8UKV}3 z!h^>-vyF!o@H*pH`%~gS^|ZU=aa``IO#u#9ZlqwI&YJG!RX{fe=JwvATfZ~Q7&_W zTJgTbX(78eqcFeTPBdAS1mP`hQ8nQ(pGUr^$X^cg{In-AyfHYR)X^V!p4=FDE!Fb>kdNwHr;O*nA(xZ=_*_Vs^J+Gpmu|~$>%sMuSMR=v_f3*BZHZr% zDjP8lPWQHcu>$L5A3IrT58zxct~{RCGMar{v7UU&8N{Eqgwe;9c%5xOM}9hOwf@-{~2f9s~Nm&%-akn7wtKVYr=^QNYVE*zvU}M;)iUS}&l51^@{R5W#J`%%)_~esA z*WF+}=3PImf#=hhcIoGM-{{>%(^+*OziRp)_dtlZZ-^4c_bc*FdRu|@ZB_B#uoX}= z?7&W0kS`l54|xRgi!PWCM*v>&l$E*m8~A~Pt*a04Y}UnqZT4I^A18C_?;xy~Hd|_T z=fL|AKOrz`0_6mXY-u$IzE*KM-_a7*0TzuVk6S@*m)r9r)xf_vX*I$4o)9gAy5EZc zbu5ZM;{RzBV)Z*`LVeMClglpwYOX1Y`V0C86KULED8s=YPZ

    ! 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000040.vtu b/previews/PR1693/tutorials/out/solution_000040.vtu new file mode 100644 index 0000000000000000000000000000000000000000..790cd7e0b628695883844d6e240148c1b124a812 GIT binary patch literal 19091 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000040_celldata.vtu b/previews/PR1693/tutorials/out/solution_000040_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 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�+XYfJREoTxfIk@o9Z0PumE|zDx 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

  1. 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

    -|GHdWBuO(N#mlgcR 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

    VH18Gsu~W*TC{_YXD{neI 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 bdJRSe4*QXia}TNZ0rcU-@t;%MppX9x+9Lpy literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000120.vtu b/previews/PR1693/tutorials/out/solution_000120.vtu new file mode 100644 index 0000000000000000000000000000000000000000..9039479218d35e1e02b4fc2cffa8717587362633 GIT binary patch literal 19147 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000120_celldata.vtu b/previews/PR1693/tutorials/out/solution_000120_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000130.vtu b/previews/PR1693/tutorials/out/solution_000130.vtu new file mode 100644 index 0000000000000000000000000000000000000000..7790c1588964210e996a5f0739758db1bbb0ee5d GIT binary patch literal 19172 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 GY-K)<$&riz literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000140_celldata.vtu b/previews/PR1693/tutorials/out/solution_000140_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 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 bAM#Hm=TcGqyO+IVaQ~@n)9jXqbMQX^sf9$% literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000150.vtu b/previews/PR1693/tutorials/out/solution_000150.vtu new file mode 100644 index 0000000000000000000000000000000000000000..9a9f6c1de3dcd430779b2e990666b7f13a26e7b4 GIT binary patch literal 19176 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 ~*$<@>#a#xkb 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 Ro?#_2Qn_K#NrgH1-vAkAE<*qS literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000160.vtu b/previews/PR1693/tutorials/out/solution_000160.vtu new file mode 100644 index 0000000000000000000000000000000000000000..31118c1d68679597627fb3672856d570d96d5a89 GIT binary patch literal 19165 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

    ?kHlJ3SgN zx3KPO-u2jRJ<%nmW*XJ$?>|Rf?so`)(_93<%N=N^#T0#aM&n!9A}+a`%bju*lb7tD zFHj;=-icjF|1T7#_dzB)No^|fke z2J%iyyY;UHEP;@C;XF}y@XQaogY4-?kC8Ulj{DUZ0+F>33mwVA74q}2vJOwYE$0>q zIVhQBc5>&XDBT0^46)y{s~Ed9_^+7)pP$tfsLtIDSLR4XXD?5>nbR;9vbdJ6Q?42|fo6_=EuW)-aAkWH zOrJTeQm5^DuE8s>y!AWLp|Hkgq~;^3|JYxKo*Gj`@OsD7v;SgX`$)RmYB!54 z%Z5GCf0I7i?Kr-J@F?f%Of?bV%}FiAw?`8Q?<{VOhU>F9aB0q$u|pJ;E$4D?m#(9FA}HN=b(Mu7!JO!X~#yT#c00My1!_U#$Ue;3!|lJ$fS8S zI*tnAU_SY(g(`&;ss@_tKx2Gz(Nql!1{zE3KN)ziP~Ih8e|?z4;t2(hdBXLKPPgVw zZ5%FT-#w70$HKMby!Vn35!%{!PFgaVhK1yT)^Eh0{8(^ASBlKf<^Z$hJ|`$tsie%e zRTDui$Y+1_VljL&{|I!l;&A1aTSFAlWny>q<#F42Jiq-pWA}6p9qC~!P1MB5khvf5 z$9J;#ukSi)5KJLZ#J8;`d~+|KUiX^Jjk-~r@g)-H`}`X@N~GV=V=AyUw+_G^vU)v}b|Kh6WKjY?M=z32z>} zkFXsf^J9L0sNtms1?|$B4iU-Ay>jCdUo{F{haQZ~ze9LFxP5`|B^q+^`tm9dMQFKD z+onFsAj&hpr-keziMv}~Ns;<#98JD5_p=zH+!bp(4m0RdippB1BZ7YQq(?2pKUJKU z&v~$f!n`9wzd}lgGlo5#CkS`{S$Tq0%%relo@e@}B+^gsRpARrKJ*t=wEIH# z!pJ(SdKUQ-&sqIdVyL}37Z>tCgt$9N=L^=+a4c?kwVU*5N`Zy-ToKXZU+3ym)ro)A zF->nIx=Hc~ANC=8NcYY3=xNp**y%6TdzbPkXtpiRCfptq`#!>u_>EmDwlmiauqbRT zO*8csBf@9asS*;$anphEAxmiN-1F2SmiS|1jW?3B2!C~^x~~;jQ1EIy8S6my-A9uS zzei-gKb39&vbK}O-s4>|*QfG0)NiMG^&*eLy^42A^mtfb=AJNpEF{0YeS3!F6B!t| zXoUF8&*#q6NRYYPX1=VTatZ~#pL;WQk^b1(nSEC~LczN^uE}(g2vNx~dVewuMx6|T z-aTZoGUM{{|M+FKv0>1I#5ts>Q{1o4!=73bqDJa=a(!z~#7_nRrq;`4jYQbXSZs-W|02$&g+H>7MCi5H(1W# zF80ipSFPIu6)O4d@A`y4(KORh- zb1vx;shi|DZfJKQctD06MAH_?x?yyTIXF*Fj|2Yj{>9wconOWP4hfobGJ<`JFlkIT!_ zC;3$9t$1cc{JZ|g%6DozTfNl{By2zuJ?JpUgx~e=b!Ud2KlKxPdhx4lZ^O0IxIH?j&mS8%76$kdp!M+C$wvU|={LdUD(w z;c9-{<-rX*gq_CUVSp+PFR${yv;GL4gzvh5?ZLcvyxbpvVfv1Dp)L>vTm>K_Ed}^H zr~!6!JBdmE#QBx<^VlzhpMf8Q>M)p{-|rH&+@N+p#oe)UKdJZ^>^~4sv_T=@pH$KS zUPma*-43Awu=DT$Lma>-4S_m3!oepIAVA^|i?YNol)wF-vi^7{mHfMg-|hLOz#a;L zfb9`3-Yy8g|Expu|EEJnK~d&kQvNrxU+Uri1&^$p%s)#04?M;vRVkbR|7`1zIr#5b z6#v1ZEb%`&sr2IDP2qQlKm0P%um4O{d*YGHxb01XO2&np9$-dB(BcrD57q<4M^cwbQq#ZBxx z1$XY0s0Mr^j&=DDmJE*5HRI%SY!?$Nm08g@W1u%7yhneXq7%@@Yl8OADqL2)w?F@Q zE}nlnA_&A%7h(|4Kc@_SqyT{Monf(!oJD;|->n%?Glku-oN4N^^@%oD;}jk`q(t#g z$2U{qnKtMec62i{?H^GGSQWWCU*fHdFmCMZ_^?CvFmd>HC6Q*M-U$nZ^-HN=&+i7g zbSvWBgKD!@!)M9WBj|`;+}n!1cSH}ZpiJvra7ickb}Ia52!vi2Ax6O>kmKX~q=Q_gb%07Cp6Dst?ZmN874|*`lfXAhH zdFM;*Q@#kcl-ukr7r|FznL6sH0&T5X2%r4THT=Y*@x+hgyYG-@BZ5e>-UJ-aLko1c z3a2OT)oKd$E>b+Hza3rhM=Nfd+(jLt-;};{B~ZlRKHo`F{DSg1Y`NPe zy{a@>KUnC(!o#E=-TFRozl=_(oFR9oBu1kqk;Q)ySa=GE6x}jk;M5qh!p+XyQwPgF z*A>yUQ2oS0eT+uL_EYc{P8-YdG})ZChsf@1be@wI{G`VI=;8#?&r zS@nZrX7n06Bdro9&YGMv4?;Bd-&=uaR@gQ4JFeS37jJCl2^hIb&r9B&8P%6Z88J_h zSogS_>uu*(30&s!8w;O+;_N_b;B#YoTuZBF%|Tai-P}SVg}NKoPh-XjAEF)gz0WA` zG`}5UdvX6XUVBamaxwde8F;F{rY?(;9|A94Uz%_7;vEUGFUyeU9Mhk*A%9np7aS59 zOWdkZx-vylcFT~SC+9h+ft0kBZc9(c;0nfsdHPP5`;Yg|k z!!Uyj(^p31szUt^&%9YqwtCiH8Mfy1Vb^nA-Cg~=Y6XWU%E=l>7%8u#zF*2;?q8n<9<;Cu9VEtxrNm+!WpxE zeD2n$HneO;+>*#Om^~RMUNvxzrv6acUM`w!Xvhz6=BvCfbFt-So*$_2sMIMU7=*X&;Ue;H9y$Ua8GIMqkTYk)zx(wa@xGBjsMHrRW!(m~Sd5>3N{6?Z9~!&5x52SuUG=das<{6=Fjgl<@N-tmeWxwDq>Dz066` z5==gZ7X_mjAmr{7@}xT1#+f*h%H2V2jkDW4sYy87T`<0{ZnP(d2&EV`b2{wgqHdT; ztX*~u@>Bwbl9TRL)Tvo6D6SeI!Bi-}LSR-Yd2F9jP@k!Xpk!TwGJ`aw&E&#=X6 zk_yB5aTyA&gz_)#P+#S1V>DM0W$xscDvmbMrA%ERR#RUz2n=jb{5(RIye!gM=#jM| z6;tXQp9bgsE)Z(flnutdzbU^(b$3u@+CJlAjIV*#v`zdqsZ>(%PZi7{!+7vvOMI|X|?2C85PifP%>DhS(-g-nXcibj{Qw7d@YeYC~s zrBDDBI5#kmb4*n|wA>di_oSrJu=JxzKOc9AL1n%(lvyEt(r$D8hU~OC&Z(8xV9J)?Kvu9mCWArYJ#G`cO3o278PWI*f}h* zw(W&Tfm~-e@XyY$ACEg*#&_v(Z^h5XZ?tA@CC|#UHc%J@>sUqX0^-9_ElR1)0?VTG zs|WE_7~S=}g@bs6`aD~cJf4472QM(A9WhDj@ek=r0de1X^wxn%65CQ9tP^k^P5@omvb~=1k>AcP@@yxM7ZGNHowo+QSt~9|a zUcSp@+(NyNp4!1VpOmx&6(McxE9rw7P*JCz%iIed;n@F z0Iv2?#%9*f!9weks5Inq0-WkTZUu%dHQCH0-)v~aR?SPNpm#R6WrcIJ^V@aqG*21d z;;hPZ0m&9DQ1&j*-;8ZNeEMOb>y8Dc{?T|_ih%zhI`Yg^58M=eccW$ee#^cQe(%m3 zOuBiI?LtUHI(e`?H~o=G0lGQNa3_5AHrTFC&oQSFQt1qCDl1%54&zHraPs! zwRX$TSfHZ>D#5wr8$ye@g4qLeekb2(uP!M+?LOZ?nS7-Np7OYI+_GAmy(G&vzLn#+ zTEc^?cchDfaET(y=2)FePFKVKQL)}6IxZKDiLGUJmP#OxoUZnXW^&}K^YvLuO3+B@ z4!{$#b6wCCBJx#Q1JYCeB!%Wu-VUBOqQl8=i(gq5*KFiBqDRuLiw(BPIgpovy0u5n z5*!%6Jdd?%siQ5 zXU?)sYwzm!s*rX;(w`^ETn<*7txZX+*|Ce;-=N!q*c!OQt`g}9#@^5PHZ%en2FgYa zw(HOsIU2V2lNZ` zHhQ?bRDMXYkD7?DR_u8gsj$8R*_qnjMi*LVWym9|gpe?`i%uMbH)hqeS}`*Xw}kGq z+Q#gWS33nbgz2b(Sg7*hc$+Bu2@iweLNe z`g8DCojDHs^qp7GN$g~H=jpyN63{25s81v}?A#QvslFf&ExPBsuq@{>X*dwHWtt%w zn;ay?Z&M!{{5hadg^vR+T5&2=g-hAjsc9IlZw_=ik4!`bDaA9$bd9HRmp0+@xh@`{ zECMo55h*oaWQZajuPjq%=3VeSGz@e>Y~~oNJYtb=ow-o2+=E+7{wj4Q&3Iw(eGM~_ z=}Bz%xvME2uKI`L3Je`S7ehr>V2%x<%!7$9kMx7Kly?sr;m1W&x?@hRmuP^=Yq}J1 zocBv~h4;==3^BZLMZgkNVXretlAl`*fw44y+1i*ig!spSeVC)$oj2g9VccbEGt60` zEuA&yzj}8{M(UG;wc15;rmC(5e>_^fHKe45c3bSRA4IeH?VEn7Ks+u<{$_H#-jJ3r zpYO1ucdi5oMS9N`A($w{KLCk(iF5^^(5>POlw(6&+Mo-~HFSku%|xAxB!^sj6wYr& zh`^P~Dlxk5L@XxUaYA`z1`5M}y82M>i#Hc6g?*BZ*HW%yrO1#x~`V0SzHX zqe<$V^aaq?y&y#_M(_LMCA(PJGlY+xVvi)ZwfcvL(BCYl5>=J0&URLh#_z0r3~cCC zQ`utXQoFLV#?*Yh<_^0eXfkUNNXf5aj|j#;fJomH-$_zs z9?uUrtj}j54ivv`1dTa1V9y9^Ot=p6);X`Ap9$pSI1`q|(|--McVW@3qHVxZ;aLiX zXa6FRDQygzx<<4`gBPcJ4lbD=JSXj6W_RYA0_i&5wepnyRFIO%h+rf(t}aje#hN#i zX4RV%TA(?uoKeh4ccvQqDrN|#JkJ~QkgGeOyfxKD=DN0BC&;Em}&q$xhe74|JIOGN1R2fsX+eV`xA{kh9x17DxHhZX;pn&W#TDD?0- zk#egx{aYqy4_#~KUQb=+Ww+}&HNz$JexSD`2nguA(Zna#ydmxbxh&r>+I%0n%VAyrzlOhGcqP3R{+kP zOb8E*F#-j%?yxvmzQjPL{R|E_Cj=YZwQxZkD}tXoM%WdKosqMbHZ>#e%YcG<0&#z7 z5;X?Bj6l;a#0#l}?Cvxl`9-nR6C80P(6eM8)CEsxPzoqXDyy%w9RPt=K-5_P~3R?zIVCrjFi zZeXG@7Lcx;!?HC=v)x_7lKW zhu(wdej!WQ$ErZcY=A~CMtT}FdWTqY@4)h!Gg50iiNg3V8Bi0xDrreOzB9o28+_;4 z{Id1efDVfrqxTMzGecE)#tjRu8ZI$eG^EY<#uH*P=AgrS^^MAg1JIeA~p@q!juM$3ur4Dh)md!!CJUC}I&#VlEDIFv#mY(^oSSs^Y# zA;nN3sZZfA_1kT99Ze7N@&0bD1)QH0qS}4w90RY|UJnB@F-x;2NK+b0u^399>yzTr zNQp~9r^hoP=$z;Yj@$&WD#3}I)q#)Ik%`rb`h|n=3rF@BV8s_slqQZWCSX|; zr*nf2VuOxcgH9B34*YVC%yQt1? zQ9fo#$poNqf~2A$P{2@9Hu+^qT!3F9hzPZwx32@gLblJgS3VJ~jL54DbFGY7u6&kS z8ER1(JyIE>R2f-a8B5xu#Lb!>yrlAd9`1{tShqm7eDjNH@p~e;M-e+&x(x`xW?yH#^)(iXPH&!q*do>>t=%wFonA> zzwM^;?CxPv9YRrU&QYBgqgwAredcYpvuw5p&PbE@Npbjii1kS(E~Y$YPkEM-5^BcY z{N!r;OSd-ql}4ttkCc{;UY1?wMnCC|c8HC(xsP_PT*brko6dSW*u=~li90C3fr4;J zc_L7PC<&r10!9`IMPe0ni!SS8W!j6BMT-EUSgE`skv!}**CM&)BJpLcDn}6?2Uaq* zh&{E0(xRBfqU792G1o{5vr-9dbumYE2~|KbTR;g92~I`@W2Azg4ToI}hhNZ!)3v}j zTi~YzVdn+mm$Kn!oM5a@aQb-|_dJ}54Njd5V^4-tn!;F2iTuJgHD-S%{o=2|Ci`Q5 zuYt*Y(^Bin$Z4V&{V5X9kgKeA1Ea}8GldB1 zPe6d+B}9LIo%rC4|25tK}7oG&`=e=g52hSRv7 z`DQ~yiZkJV0>{n%4ga5KV4dM=Gb#n!$MYaCj*rIcXPo?5Yt;9j$`j2022RxLS^i&6 zCj5#Jsy`V#1V14{2oPNE_RelTgeb=KD>U+tQ2v()MF?`-P6!pz&cSQHjjywZyAL5D zN)R$AoM@#r9&VoA4n984wyq9_`&}Kp4JTC94RFng^#y*d@9E(hXz$?ow-HPv3!VRI zH)%X>D?c0WzYm=EXQaPA{@o=cQN&Rtg{bCIMqzGaHdB*4J-|dJ}<)ikD$j#0D z(}BRaKOU~}1Q2Jb-2L$97r1D6@0jf1CIiQL=PeT-DO?LIwKCu7B?{s z(C0veiMoHpDh~8q<+Zd$Tv_43+O>iMdaPybu1Re8ao@)ET{0WI{GwKxoMXc@zNNj( zve~fE#qZIbn{04R=jGpC!G^bCa_Y&c=jFaDvO4aWO@wQCaDAY3uo z@4{&|>~^`vH*}H>^HWa^^7^siJ^Q&?k_Q`VSIECR;>3oXopFW>9oV2%YQD-9k)66g z_n0Fa4m_1!PJ7A$d&RrOnfV-;Q8aC-^)U{dEb9e_HsbOW}aA~EeDD| ze%CO;eVPnLk@hn=uqaL8gw}U9y!%pA@^L>w*3N&EUFt}XQmjskyA}l59_ZRtx1At0 zwx*;W@*v2K5=Q26p#(WcFFR<yNoXgtnMv!+5Gu2P;Cdks6-uLaQ2=d&H)WDZ_ z2+}!VYO8!9L2eG&lJ(?wf*g5z?e3eW1bN=KTOqTSAcw_^8Mhu0r0L?4d46>SNhU8G z&~7Bi1w(?4j4K4`c}r051KR&KL>~-Af5E!-9o_i^xnpQ^?7Wi%dGNk*!!e9=|K^>* z4FowT->AC?X`)C==bI}*!jZ=f^@0R>bP;z%-8_Q4M$b}Ut|rJM5c;-Dg&;32%#Fx? z&w;~E!!B`79GG_6mlnU41G~1$OJqcFV7Ra9c7G)Y{FB$N2*SX0A2|9vqRQpZ~;xW0kTa zt1xbtw~|Ru_7LPOwFf>&g*hO-ee+oPJ2oWOs+A8%v*Bder6rqevEB-0i|!V&;fC$0 zat|L46vUb(&ypla3rKIc-Jk&iMCi*lIuJ zo>DFwIu#ftA}+Z9S4)@$QEWJDyzanz?6Z(MWBzb;tdEdoyKbK&$Thsq(X48MOsuc| zEP?0Wd|K0^81tC<#+NbH&4z;6k;G+;!(7O=n;yxAcH45xprai4F(@l2=}eI9`=ud0 zSZ}-yt>l&(g47YVOfWAZ$S1*d{f>ApFB1z>GO_PhPu`!Gaf%K3?<6;f!rsH@wbGRtm?)- zjTol6Rj05acEr5eK!hNfszW7L$_et;Q1R4gtj}srD+Zcoqt$qQ7^? zFZ9^q+<8|M*ra5HecpZ7X*-<*OrMk8%cgQbKxsCJ1z_IoPOQIklnv8;goY%i;dyMi zp!NGD4m|byeSnX}0psf6bAh<;xr-$-${rA;9wS*pDFx@#_Ey{P3kh;j=qa7)@*J>p zuXwl!=WIcNLun}1r@Hi@e#U1u_?C*!Db(SBXT916d(7in^@`0WBM94CQcfp$a>+e{6i~F|P0=UFPeJ>*vw}GAF?ya0FU~C$_@SAG_o1;t_2zjW*`P4R z@!4Ih8=)G#=>^|#9_c_`A>IeGxhj3VaGsaBH+@mTdt#L9lUzv!){D-MGBccqf4!ss zC%;d;n=ViC*G-^_}%Q6yMOre@AIV=#W%jr z-^(@P#(y^a!_oZP-M=&N?+pAq1OM-2px~pFaQ(MFfC!6?ZruG~Jz9Dsn6DqaUOldm z=IMtu?v^}vxcWihN#pEyL_Z|F-Sz1+rw_R9_WLYF{Fbo%%pkiDczRbhZA86vj_=_N z)T??e%1B3aF?yz3fLN_@C94_rzvj+wtVI3eDtRHwhy~?*YDLW@Y6<4H( zthyae;=axdyBmlj-V(?S(m|A(p{7uT=s9)Dv3%64vhBI#h;|iynKRd+zoT;$KkP*8 zxfB(#81vD2NB-Ukl&`kv4c++z@#d8P_V+%J-&1$O4C%);tIhpTu6KytOhbPwW*mL1 zg7(&;P98!?OW!x1Ux@VKvAKGZh(a^gL<%EjPfkscKqScQ_(rr}#tb}}iFDSyKszzS zkOx!giHH^@j?RJTXYx|x40Y6Nnk=gK0r6F1(D6EySGEVuFGpnQNf}xpUMTE8;EQ>y zDf#VL6w=YX-(}7r_O2sWPeasxC)6*8{_2{?V)D^XQQdH1EAk(xiKQzb?u`|%?Lhwg z2MfX#kq#)Ctt){3whCWVOG7$wO=?dZVpDhL#{l%R`0(2G0!VYk$xZu!I2NE>bP)Lt zwcbI}=x2uA5dK{4gP^iGh7#zf{MH_SI_mw-HtxNPa=9CGB6cFqw3_3(5cxi5r;Kev z{m++mBrTBNGwAY>ThN(P=*~=2=@qD}+9@hHcIY{OlsVqn2m<0aD zK>IV2RbS)LpYz2dlKhBTTAnU%5kI?@8{a@&GDF_C4(q`D207&p`bj)myq4PUq@z~# zZ_!@$cH|QyT(`Kb?KvCQ(=Z^<%AtJZljJUSMEk4HYtvAEYvYioI_l5V+H%W>;;TB@s_7B&usKlb*|7g2x&)+ z9dqOnLxNW;b)x<=gNGiT=vUT*s0ZW=7b#zPg#5~wM39MV&vl)N%E+t>)%eKqW!2tH8&4(r?N-X@2S=zo1JtGXDmAgD{3nwRgsNmjX_enMQN6{FEyNc+k5v!^0m!jU-K--`St{?W`vlX?zZ9$~OAnM()JMK@N+ZTP?E7UwKYmIVWfOaxTMP&-eIgAwB7%l-fna??r+$0}(@YxnGJSHV$0)W`W4wu`iLzKX0j5lN;h4 zuHvYEM9+7Qn>5i++tRttji@&(_K*|R=L-#!=~Tb1p6Tl7i}KyuW(>YV{k>;Oa!QbY zaUdXbJ7P{lV4N_XgVF0*>r|2cF=Gn90qSij;i;XEb}{=3lxHIUg7VusL&Q_c72e{w zkLkwcp`E-qw+b#zQb3w3T4T>5lot!eI#F|C1Gk%08Tu*lSDBKGe0I!2%kPMMX+{$H zsQLgTZrXUnp{5^?byk0;`*B^z&T( z*_R`TTYO3cb1=Sd`VCQ=G2R_Mrmf|OfzMK7sQatcyXfUZoWo4JFm*A+J!xmQhoihP z>-w_8D0dT7i>B_yl$`3H^X>pc???r%6Q233gqnM=0_u2MQNMfV)F)jSx6y5e#FEiI zcv#(4cNQ_$AwKaP73bkA^1c{H*{hwRI}rKH`)*Kmduh&zH}Xhl+H~LEkN&R7-+Ir+ zyu3^AD+xlr=arIc>(Q_M?)x`H_9zd9#$F4YeSRg-p3 zLirxjD)ABeV+p3rxrzQF1h?-9#W+9PFBPWpv8c#ql)B&7=PGS)M!LKuVU{;y#m)3p zV#s%YmpyiZRK_g`IcYix=?)(bxp=)7ShK{MD`6JT7@+i zQvGz@{K+<|@3*S%Z<>Z^%j}OnhVm}o!6i~iv+gQ?6hXa)kWML2#NjZFrQ49dj*AvZ zAd(f%MrV*;XZqYy80kh!=hqcT%epJw=tlHe^(HzF`6f;drc|Dz&Hcm`5t|(MR~n%F z;;NgghY(l$G&QY7{BBs@NzK_S9_>f{5CtWw-%{_q&xaSCru^;Nd?uOdFQE@_Y6397 z)jjJIsdtAxN$631xGCtATQ=%_I&7^YhWm&LZuhiDymnLWegn$y=NDA-qumV6dvRl^ zCu%oRdLEJEp0~dV@$2_v?=?~Hb+ZCbKhlfNhYiOfPCptseG8&f)=Hx|D$lcq`>1)~ z>Af()1u=MNy66C&|G6H^>+RSd_01m~L{aZE|1d)o`D~AMeAIn=`$wYcB=nOcC*%}| z=bYtSX>|cM$bDTmAT` zxp)68xzZB-vGfXCI?*mJX2a8S>jJ)Z-02E1ZS2$Ie-imgqMwYaX{W(gL&k?o;pO)9jo()H_D}`~e?ojs|Ox zv>3#u$Mk8`eZabx!%e;W#P!ORsdw_}CIM^e{aj>T8cNlZ-;e9+)VWHt`fM|h)(Ki3 zK+XHMr;EF+kgvi37(f(hk?s}2IIo)T%Abz(ju^Wq(WqCgINa8Xam>=5+(Ffihp_qC z8sxKQzw==tjtF#IrQR7{#n!4>Xg`>IFE|pBet6GxKIBVw%*~ELJ>w-YG1UDWxrj5?zye9?KF#p0y>k}%3x-SrR1l>bBRia1SCFO27;wD8vS8kC>*soXt``mMqAJH3diy%I9i zJE~38)42n&k6)S|i73F!y?GDfVh{OyfbnZ9?$_%=xUz zPri*?+%gLFN>ix&DtR3_9ESAf;^(|u5Ph{}X7*t`dAt>QURami3#G-WI<4!TIh}?2 zF4sTq)JJTJVL9-lyeD?LKr-5SIwYg>W%Tw`3 zesGphk`eOHR`*_7sszdKeucT`5(l1JZCt08KWQZhM4lH*tZpm@o|-?$DDpJ zvJmsTK<4CkYTmE8{_qlYzrHjddrQ54wk=-Xx#JBTn!R;H(+BAg!F1$XIYtK}vp4E~ z58`HT-|#j%oLXcSZTFfEKYl=7ej^=r?Opb9)GuZ8U&qvfslu z(ZIxH(wx}cG^jH&Tl4t<4OY&3q_z7D4VG-&Bvz0|18e2ya}plYplZllw55#(fmxrr zj`q+%aGS-2s}?knN_%yKdp!;E*B|h?vX};oav!#3^3tGzcKn*yNEg_tO_Aj8?SgF6 z5B!DicaYT~uZ)XM&j0n{@FUCe-pj3Qe2b3rj&V2 zt0B#0QR+3Gfa5xcQ*f4bvJbRWZZse+yl1{mIy!X z=z-Sq7gld$dcZ*WV1u?rH>7WUUvN~J0aqIgPAp>3;gCzEiZvD!D4?fwa zu3=py)@^KK+cJPC%0K^kS~n!$o@3_L#ek>RZ|xx$0E;^)NTv4|smLe<^ZTVFRAHtI6nZX`h)uH{t4PYM_A# zb6~rNKMj(4Jsb_bbiothv2Ixr8f+*Imz-uqhf7sudmF8~Vb#u#$=N1MxM06{XMSKW zF^@lxMkz% z9yp|@CpnPR3(-CyWqX`h;AL&0@#rKAW?p*lei8FH6|{DR&7^~v{DMMTF&eCB>tI|| zp#k@m`itQK4EX)@TXEJUCIn5@&duA)0zWDX)sB9O~VM$4a)afXA}~8LD1!+-?U>a*kJ$my01$wyqSGa zdv632wm9|O(v#{2dheEquOoCQS*_a4N7CTx4OUIHB@I&Kda6fWb%V|}@1D(ApWjTS z6<2-j1(O{jFSuKKfG}En>dlRAa5$yfW8laD{Vk6-((&A0UCoyp{?-L~McgxbTX0^S z$)B~hxd#SSmG{|VU#z~>P3X+*g^-I&;>4o6fvbMr)KD7+>BTnaPwJ)SwMz+1*zZ;JyFRN2`h_~0>TSAV z_s&BFYBqG(qgmaoAV`CoMHw~M6ll=GvM_dYqXW;;7PWH^8Ss3~aZ?fOlm4$8b?LDz zn5FV*uAmzWo~}_Fs5#jSW{QBY( zyMXyQSJ4_KK!fyvr)`_rT@b6(EFFXSi%*hPvchvQ2-1*=f(&#P&WhD8SF~A3}L6 z2Zuj0fq&xsOX;7-{)O;Q!9NIP-Q3JUf4QjO;B5X+OEH+cxL7$^TKx%#v$ZwQ>W_q%f#+`)NuGb9{Kx*EX8pbUL zWr2mWlarN&yPc<p>mNG*<$KD_-0M$kn<72?*C&we|6Csl{O3V(DS|mx*-o`q=b)tLBdXCMk*!Ko- zk1on2_Wph^XeWVjGZG9S?hMvUVBC?k3KV5Eu+)Nli>%+gm?uMxp6j%ge_!`&P+fvZAL~8erjx@ubeM*{t*8;`7=(4GG zcAMsxm8%#B*o}+zIf6S1Pr|m5WFxVm9yB*%lWLp@V`uzxY9ODD<1kv^Zzm^Q6?ZOV zV&(#y+s9Ekzf34um`o~W4Uf28%+dGfeK3Os8$Ztq)Xv^r=dViavXWk^d5KM`TyLco z9Kj!#@%kX?9-bBa_b4d=M#5KTRjN{t~PI zv&lpV?I**uFexfmNbX5G#;reha+T*nc=@2e#^}Tt@*A3;_#W-A`-EtDo;Z~d5`l4p zYv&6m!MCn21@BXI$={+!n(VJ%5E;*npS`~5>B8)ieEDt5i)?U%Ezjz_Y5ddrgKN~N zC-rgV%;e@{NsYnFjbTq;dX+=Lu?RSx5A-~m< z#TLT75Q7@O1WqK@yJoBHh-vZFV}4fp-8W#fHR6@Q>SN{GlZbt0d8?oE`g2|z>{H3l z8AGStgkNjKihh`~98ToAxW?he|O=h>SzO1UU9ix39y` zK;2UGvU`Mnk3=0DyQSJY8fBcghOUES0Cw-4et!%sXfp4fwmvui%H2Ca>$~&{mkw#X zAbP4CC2|irsWWJt`upf252WC!$k5BTuGkNQ_p3H8Wbo&k_J^^6&Yk@vWLbw=ko=ZS zU$A2I<La}EJK$w zi6r){pS>gTwc^Ee&E_+jt6|i6RwmNmrw#woVHH7WiB*%oEdm96M^8RYdQOZyCEsu` zKh~^c+<%5&g(l`_;aN$^Qy)JmtfriM47ph*hvlmH=vzCy zD9Zu?kFL8ar%$1pM4K#2!mS}71ZvSys&T|{OX#Uh^R4T-tfTCubQ7g(xQz*9cd4-x zL+=Nk$+|Uy#+6zqcra{LDENMnvMljL;N@Ip_8um&VV553f~AK7_oi3WDkyr!9)&Qb zthz0hJ%1ZS?`RVKD@|ww?1wVMBPi9jh6HcSTO_Kb!=9z;(R-{Smcpr?`SjlrP-W*3BW(ZaY|}wy8Xv z^24KX2i%)bV>Sts&){X~slY?=y*+v8vo8ie*z^rL2cTPDt#*q~47h6N_Sko9d&@F`G z+9h84b^I6Fx%>2ygsV4=-{{>~g@seTEB??d&v`)j?Xomi0ZJg!lW?7;paP5?AUvtE z>xmT}+dPs%N)vPojmf)zM^4YS$K76d65Y{aWz;HZuT7~}dwIxH38-nJor^&*H2nyU zwG(>t>C=1$6OY%+JG41^RaW9SDWP%{CH=PL;#kf%u)7|ZXD7VT$7M>>eAK-Ed1mT- zqPA4IfAF-H+O?ss|C{A1{l|E9a@zU2Hd5O3FVOeenXs^4T-99L((2maZi&9VB@zR6 zC9E#9lS#tl7#@5tEi%?uBT_Qg&<_* z3LB)$Y2NPEy15%`UPef#!6?blTgOg4ITZXZ$0K9Euu1EY6wwd`h|{_b8f(&bYkhlG zEbwtK-)r9RBv}fNU{w%VA+d2`*x6fBd#SfUcYvNhg8JItp zU95buSGG$Vj?}AR^U`Y4d23u6yDdsG@xX#|s(Y zVfW85MY9~@#N8V3XM><$G*B?doC_kio_$woFh$sf-ETj4LMJ`k8J*TW&rJi3*YdRW z!H>Dh0y1*YX?(hXq4RK2>+#c@Do3Zcf|ZKv^ts#j6+janICk(_p(^wy&S{-Xh%=^v zcrY)_JMj9YhiH{EGtSIR$rD=J+|g8+@aOtotsgx))ATg;nk^N!&V-`b>*iPIuZ1=Z zAT~dVALyS|TFWkp#uA4oLam`C9`u?I{Cyd*y0!)(SV(I*5a%dej7>M!I5f&^d$jkY zAGtkO`mgood8=`fL$hRhXCQK%&*y5V=A4{~>m6Z)5qQ&-{h9|2mg9(6>c^w2knlB=RzAf2J)V2znYlmKk;D zZwSHD;c4cT7iD-gg%VfLwc{4jm5e4YT;glf*>mj|df0EemHM{3x3+apAUzFsbtA-H zqF6Dkq&BdjtxVNgZU+#m+DDl@+It)K6Y-^ae@x9Vrz>#vS30xLY+4lR#sp9|P2*y4 zRd4YAL*JcRQBJl&joE&1cQ#Uh1r6?_PF31Ks1_{jb>HZ@8y0c7{z&;Whv0 zl7*X`375)-%=M`i4=_qq_Esir%!PY?C_8 z8zf493h=n%5<1is=(XRAMdiK9S3po=maTOn?e&Dq{iSru=BR1i&%a;9=VLA|o~Nn{ zpp%0bD7E!@gPgF?EOU5l+M`Lp&L5WmF31!hv)z%N)DAO`zrVn~b~4j+bbAHG-PQJt zpudp!?Vf2^*1YLV%Mr#Ttz0KN-zndV&$Le)PHy@^KF?=9HQjNKM9Pcj8A_ufT)SR) zR90j#$d|)dwks4fKmJ2xPHYMT+SevF@hM95{MZS$adVSaZBm#o;@`^V?Iite|)@d^n_ffdsW`~Jc1{nkvft|hf1e$PH|2h`9v*30y zJj0hGVfb^ZG7aN*z@pL)rA0O@*Ll5my?FG+)C!!}E4^llqbw9>gSWq{syvPJ&U^nz z*kxU727IlX&li^p=4UkR3JLh_TP;OT3FK^g9wJ38>21?L4^%hcwIT3N3I|Ih;0cbc zX43rVhg49LJ%k(j7CeWdyh+LDbPqZ{!YC*waz$wQ*|}epXiEhWi~QUo>XMv*oTe`F zqh@OF&sMe*Lh(Px72~{0cd=JTtcv1|c#(y09J^U}a}v%beS1^~UrXLT^a7u1HdIz@ z>?tsLQ%_Zp3x;i`g_%(7oY2{dd3R=oNQLFGDo#DGv%lwdjXORvcQY?kH3_>45OQ6YA8y?ppE+xXDW2A(+P>Cl z$44og9Ss2;v+Yu6knn6D?{xh*O{|DyP4hB=A5!3Vg}`F>PlPH4+ZB!GFV^igXxH*t zw8tOx2;j|3`ZCiVj!CUfN6ngDH`bi!%j8lbP>fxga`EF3j+3r&F@5n|6zKj||LR_^ zM9}(2&kd(aj?J@t#?3Zw}_{Dd)(>%II%U}ZN@)e&cjCNDbANrZcKq+lb z+q5ytw>$W8Ia!tpx61kF9ayY3NA)u3&^%5Eb+^ZrE0FI-VS0Wp?aXK+Nm|kveY9;k z0e0Nu*F7mCbxlYu!vZ_SACPNTBNqdlB(Fw0xj1@S{zM`j2^e#j`oVpG!YF0o9?;#{UqX9N zjy6GY2HigjyL74z(lnJ*iJWhKb|zE)#9>2 zXxm_2A*mdyq~yfN!MfYX@4gVa^d>&jkDmSPA|W_~R_ZwxC&4Yvei_{%aN7G{>8uvq z)enwtiKKX)Qk*kC4t1q|%1wUE~*v~Q0oHQ=TUv%w!$ z1B`?3-hD(&s)z-+Ks+!{tLL4iKDQ`BJkWA>_ntPKOET}X!z&6(;18AohmXQPx!B>Y zOvR@*37M^Nb59Q-FYNA&=j-(!XseO(22wcKYJ zCEl;WA&9R~l-2x;MQ8{`0oV)`T3{$ zE({B_aEy!vwldox$!NrtY18IxfN?Y;?VaJB+k+psYtDRJMvZg+PR{`mKarq7H7{P3`K4QeL%gvx@w5;wH#ay;B){uO-l2#cMxKJ%sl@VJrYbcJ;$H2i*d}Vz5W(t3y+@3apa5LDN^CWuXN;oxH&$ zfNk;5hl)uK4NlxvlMmrjhhUaM|2bKo?*r;|_TaS)wMn2+sQwbIxJKz;`48;0QBVjj+Pkbv!l{D8pBn9Ic@ za^kLy#TxI4<>bRxQ1D^#lQgf>wy%6yj=&~hSq)nM{=rDx)?eW!8Cg3^5YXS(ntZ63 zFzRc2282cI9hofpju^gPevkMnUFz={PAIa1N1pQmfPjs;4j-H1X&vIw|5nGXtt!5c z-!Ag}mgC&#^Cut)VG?%!orHf>n4sQxCkU2*=xkmU^yc2t4@%68$(&Jt3io(1Gsbj* zOfvo_?g3(9W!Aj=c;=g(691vw!h3w<4@3mUf`FfW-hU{ji==+Qz?M|+ z5m!0IB{7f2>4X*WO*L3W!_1E*ir(;61T4^uQUp`xJH*{>6v36cvbXXD=UTSn)Y6OLcxpcaW zG`gnx?mL@2I`5iWXYXdbjhBAoFuJa%U`?c8C8%J7jmrC#k332#En7@KiC90CYd!>7 zG;~Wen@}`9Q8ZmkG?^N zY*2KpiFK@mbZl^DExBf`sb_7Fg)JF{tqFy#US!mY8P*Cd)o?A`Dz-xHmwE#3%-Y^%oFjrAU7bZnlK^r%WDN#}S%p&OwplB*oGzY8sYgBU@WpkL~ zE#cFqkn|=c>O3bsAs=5NFMA@Nm=-Uy7N1b+xB7TrP!a&@Y_ez3X_f0gygl6VnX@Ib zyd~7WCHAN#BBLe5uq9@xC0L>*s;wmseuo0t)_wSf=KVFyJ8kXU(0}j@6g>#~%zB3$ zu+8(347u>i-n7f!(0}X(+~Ga#h-L4gm~1nf>=K*o;H++Qt?p8jo~a0sV;dsfff%W7kbP?-lE>y>})M2t`JKfiQ`Hn*sY31(zFz1SHm$|~kyUkl7Fmd0A6c#^AUa9Rv<>dM6!%J%1 zL1|}dZj)Z~c)VK*w)~rmACf2 zG|=(HAGNWGYxpNUDsv*XTGSoyOZ|PfkyFv&o)d0BzB<1KdtC>cYj)7=HSLr#j{rK7 zFg=2$^Xa_Fdlwlsz(HkzY}HD`^LEpgd6jmhrLl=GI%sPvUtNU zv7RdpWlAhppN~F+2)xi^ygk{J5G;AdpYfg+O_|&+>hhY6aPzR@+95K8=rI{WsIZ*nUTR z*622XiP+72SzHBifGEzY)dZxR?wHzH~6P8tEc^F{Nq4+IUi{A&1-`q+oR>QwUdedk;#at_+e~KO2YK;v{ zGl(&gTO0mFs=IZMF1xdEPar2X4GV=!vbfV3j=8^Fo5Oe+aDfKbaGh{7y|>C#;nFq% zCyn=FmU%c+VIa(;q(;#9=5vT%3s9k7gP8q(@&%5|%67`_Sj!d9KX|kd!og^)H6(Dy zW`repm0m9KCs~=D;{M?8u(211W{?2zm>3{uJb5fMwu~;Ct?iW2=Q^u7>p6czFyTX(Cngbgql@IsDx?+CQ zml_y#n>BT;65J}0!Ob;!`_<0ak<#<~6%J=TcD;S_^KK(WuK$J(Pq9ROIek6%(n7-w%-CtogJvP+dLU3O=5TjEI%H0t zhvndtJ!n8^;K|M`d-go9(k@CzX(l)JYPXasMwxWeEMu@Cu{SxT>O*`1L;QOI_}W?-v@% zT29wWo0p=sA6yPz1>Zh;F~@oFy%k%&P}zTmJovK?hUz5nHdWN*{aeuw%I(TVUN5c} zMz?}VMs#$V_6Mr3n}zUr~b zo+?k(lt`H*Ie+!)-S~1`d&?}_N4Y{VBd^N0f@*S7*-Qip8$EOdYZCKTw8;9P>bqbV zxx*_Te1XC~^HE>gQH?$9%pKYlE!OGICMUQdkLvSZ( zutYBs*t}#(=~CK?ecjOy*hQONIrk{{;mrmLTDqjD2nWY!i=?3Js{o#(C}_dYshZ69 z)U@Pm=8I;2$1w@|m8lMn7MB>dHN`-J+o@Z{J0TR;-yZ`^0Zs(ij10VFrtqas{s>V|645DavgK5Zl~&QzOjOA2b1t zA)_Z5+TlLU*Fd8K*KPYenJOC4w#AkLVB-OoXw)aC1DxAkh;cqe5 z_j2(FzWGaOdN6Q>5pCu?v;7zl57KLzOEm&f^2re+fOs$RxnEULY85XJ<+dvqJmAcN z>jge-P7`8(+#IYA))Jj>x(Zi2+2mcnz=vs&|`01B1h=xw)fjfoVLkcR@&j2 zsF#IB z+0$KX-lI2(qmt66t@GU9^j6%n@deHhIQ^k|j~Q2+RHDY61!t z$SQ+_{P;xwYL*t%ap_p*Dtwp~5a#XmEPF|CCg5RI6jgwtf4?exTh)#bRY&K_Aqj z3=w>Xfo%;#xL}<#`B!L z3og8D*DUt5Uairl|FJ#sT||eO>P4};<&R{(Gon*BF3v7VG4_x0gok&#&D+CsFUQa- z*1nS(+q_J{Q$tAR!$WCTFhQD%awksAL-5^Rz0y6P_&ifY7$>SS9(G7^ z!uV-Fm4vh4^WJh7RR)>s0O`ez>NxNIXK%_aubN5%xMj!TNE%JwNe;wia03CnjZ*GO138np80HQ62ho#(kT6!);sxa}$kUTJ}0Ekxzuu(+;!I*1S8{E?OM-m9d&#q9|ACGjLNH zDYKr9tIIpe4vk`(*ZY+;{gMs-Uf(UqZw}s0o4WOsK&|2<0lNwof8K{jj2Z<$wA}pc zq`dI^L}x5U3T?$ipRV3`A}iHS)U{>JjeEzhuW;@=z;UgA`<=h0y_RQ!4A^)VYCUE! z(o3EdNr?B+DS0Y=1&q8md7p3k^85+tC0x7PC?J;F-Rb%DMyhkOkThs zm&Db>RZ12roa|)D8R_f6ZiN76ubH0B0Y`z^z|JvH3Y6CDZJ6d>Mf@##J*eG92$qcLG;kI%VgC+Hp8uE4PZ2ZGK9KlcH|qc zBp$f3Kz?>}{qW}39AS;~#0^Uy^&?-#q*=!JA-xg-ELj~Tn`t=>gDF2rkZ8KB)iDF|sY?pxTW-6-MWC4s2(=XN^0~XLE^4AiF zZ&c6I-gyb9&z=O61W>gxIA+P-FVagDS zX|`C;VGe8!DxxyKyDt}HYU<;BT>&j^06SaUO5zb}gFNKcv;${7WD6wAW&hh!$7@-rXUS?M0J|M_WvYwGRMzkcTKl*-b`c4QdCb6)R ze{6uywT5k~6#uYZ@H{@MbMdet6wTF68SHw58-Dca2=PN?P5O!qUC#KAVEtI*xMQL{ zPK3|*zr}wgeD9NWmrg#`8hg{;ROoq>u)5hU>WQ;^Jz#IihRflO z`5Si}arNr>ci1wmdGaL6slKOO6zA~~bXXWDTMAs<%pSLBfsA4)nkcs&94F`A^AA)p zcG#or*81_@Z~U(RrT4^@0pumGJ0#jWL9L)Xop#eMZgs2r@jc{lobpb&H7=Fk`uBF& z)wZ@1Wp_hPh!fUVz+I~9!?~1UQoA}r5rpq%p-bIA_&R`c=NgUhB!E9JV7zKG@fBIo z(9>%e+e&Hq58TW$FZO#m_<7?Zg&b}~rJW>ND6uI-#RKGUJI9lxNYSx2EtfYpV5TGz zNJ@ss%@RyFns$zDj+>M(jrqr$6SF0Yl~NSocFQA(EU7Wt_$p?zC7XFBE&LtzR-^s zfYT3uJALS&s#`%jb<-ZIxS#N(-lvsxc~zcs*>dm>!?yK^qMB{OGmv{p=Q=t~}*8-?1=Yu!eFM+3be7;(KcOnf7FB zH-nZG%2m|mNhqplW`ot&eJF%ZT^2!)F zypT@z61G5h@chuUEGCMoWRxwuMKRDrH^%Kp_jc?i*)LuAw_lS_0ja4wbZC;|M6IqQ zp4-=x3GFr6rfsQ;h^ZExpgdInh_gu83umL@rlL-V1%v&gC=cVHA zBec+%&j&`H1S%xx!KoxCLPb8cwY4r#bX)tUjk$g@NKH<8`D;XxfoMJ97X6KQLe!rD zaDt!8G0dSAPCNt3Y5A#JdKSiB`?&!@&3xG%45xV`bRYrkuQvQV@}R91#5=rgqW3$SA~`d}z~`|4DPc zg*1zdJkT4i%Ep=N9&ja2XsX# z>QL~JA*?JiV9Fl2Asar zW8IeVpWkL#3PVut5n&g}W*7Snnnay84fJ>7dQw%L`My32WH+sSQ6}JO9v54pR2x9wQFBsu|h~>L4 zB~18}Enj>m)un79`p_oiy-?z&LkHs7Z_`y?37QZO{l<_g_f=&|`)a0NIlj6n)^c$x zG^KFD=@VXe<>%@U;f8$J1lDYps1GZ4co|pGZPLB)7aSy#afGJP74?_8!k`F+6e?PJ2QHMq2R+jxh`jYy})>&%)Rb$L~bIQhWCpPKtz% zreEgiNugKDfGPVMtMlIc6laT$TkbboyN8TKx?DgwTL7Ta%UJ#{Z)1BZ0X_Ru*6fe& zdy0cTC6)2~qfm~H;zllWlUn3@KzX^!B)oT_-;DeAmyK(-T8Uk&!{y|WgJpKLQYoOpLpS5NC2I~+1+g%TbZ zPCMf~uP!a$1qJxBeggO1(yydVxu1y{+}j=MH8si{*kdB9ZHvGuh3y}H`e$KT+j$Ba z$~*;#COl#M-|odIe+~P+GpSQRlEjN7gTLL?IjCQgPZqHyq4FDrDTlswOX82(d{a2} zHZ%d9KAkeQL<3zZNjWrQNF#Job@^(9oa4Z%hb-*o)-T7ktNyJ?}V@0YdaXF5x6>EHL zea+NWwIfzf^Y}wwtAWP(p^mlmru41GnG`l?*!^gv{{TNFt!`#guTyi@%Hz!HU}$f9 zQ7|1{|G>)LfaVy7<;bw3%L+i5G1JAf*DTg~j;DU7QjKx<{9eQ{DU00PcyyuQDAN1; ztaDK`K5MMv&B*aIx(e$E+aBtb8)U$ta=mFY*X)PTW`(pUMFWbZgEN%u^Xh|vs|sMB znb=JQ<6d*1w3Kfs*{#iowT31;rusvwJg#TG)B?r;jX<(r*aOTkzsZU|?%lO3J;ao; z0wS43a~do?d~Lyo<>_dbN}wfMwEe9|`FwaGT@ZD1iT$E4JZQk^#Nvm#^dL0HB($Bb zrBR#mZuN_uSm(1bAt+HR1NYkKH35Di<13+V`LmWG-ArI^-IrNIzS}ltv;9@f97v3q?dUrxwG|E6@~Ktu3c&vatg^D*M9$ zOL@Y-2S6sZLlN3vOvR_v-l99iT}W+5c=VCk8x21LQyBhm*I+f)&(CDq&X~GexnZlc zvEM6rxeXerc~95azQC&!+WbVG1r#K4B^N+l>CJUyF9xw5_li927f8;T)`k@1HZ7U< z(Bk59XAc{GxjkB|+)OLTKAd^Da)`HaF+^~AY&RXhx*!Ny3sE0-f7QK2k?#*Oi;!^; z#v3@RD;{n8TxVg8OFZu7&Zn}-7pEyzf2y`$l#p-QVi6!}VsXJdM0n8@vqQ&5&ta4n zBpF(UROCi>#x9X4e?clZA5#6I{}SZJ(`Cy2714*awKs;whQPU#52-wOv71F)*4#pK zZ>5{u`;LAL!f)>UY=K|cvKC`=jcSEpNCoEeuGp4+JDE#&Eo;!*sM~jqIh>K6z+mZ_ z^lFabA~x8+LP2QdDFFj!N$#R)nGho}U>sY@6cy~T8a7&DVVvpj?@W2F%V-}sJE-;Q zC^f<(6Rsn)jO-6CFQS*JE43Aw@x^;u;J_c+QiXlm>B^PRVpLo&{-tyA7z(Q9JN6WP z*0ynwvMe$lug)#()i$m#D0?;56jey%xezif!&^R_B`WzC3b@v zlni;S0^4S(90?V(0q+~B)B>qQFVx3mhq7bVQZ?G0R_pH2>~buJ7hKKE!{P^R4h8P~ zep8y+nA_4@;HoJ`<&eBk-^mW|jJ!~+OX$?!&JnjZkb$mjk;}oK*lO&&>O>y2vSUXHrx?y3f^sa!f<@WbNj@)g4GhazP4}3v6HH`+LJAD)a?=EKN#Jx`G%ZFWe-%pWiBvlu6Twt7K`XmEEi3feEoiFgq_b4aNcE%Q-BupNW0`Gp zPs5jicN#3VGzXpLF!+8CJ#289(V}#Tpl6h#x`}w)=n>ED`e`}9wZE{iQq4psAxe8l z6xNP+DUH4Dn-q%tt<0 z)v<(XW{0%y9CFbOy6%hsU0CwgB1hZ2e6pmkleGl06&Ba!^8juBaa3sXD6E=_(~U;lg2;aYo_ctIGOKO{Xo53$)&_>({vLQQPQQ~ z2jx`tNyQ~eM~Qwr**uJcI>Vz?{UFbf_L2a0FNjbd&|DQbJY|zCC$dzL6a@B!0yHFKXkrv8<)Q4QGJVt$JV3f4i&?vxn21PdNJ`3Mvx?R zOK)oT#QzRq0aovLe8US(3y9(T4Yz1ux#rwL_3z%hQeWSH<5=KJpJXQzc^5{6eb*v8 z+vpw*P(gT%p>#UU8!ingy{8c|bu<=e9ZQE9mjK+0qZhSIr}fFj$uT2w9FKB6-f=7o z<%(~s|F|gZ)Z23_cL*FH-@vFe)8tZA#oW7BQ<+RBy?oQQ=qf(eQxX1+@(MsRB2w&M z^}8cWWv|)i5hy(KyN;$8aTOp;uU3qKw!Qd$wN# ztcG$=-eeK5`&0kj)rKU~pTB6`qTGepZ^yIuv6r7w#1ua^@3{m?-BiCV1Srz@fCiJi z7rjD|=9=7T5{+QQ(*UkLNlo^!l~)02iyVCs+pokn!-3$|!(U<64@drM9_>uXV96#2 z+R7SAD*-baW3(WkPn|+( zmlT|Q5KUv;aAmR2te2UDp)xppV3I5-c(satQC*^*E`)L2{wQcswlxl%;WP>OMqNy0 z^ZD-1FY|UZ>JAFiaUVzUrfx;FAtS1%%X|sENhLZ8hrQ%e&fYp}1U`|ET^{+Q1*mFg zAt40zUhrkj%K0Dno*(4H0;OhZQ6Fg4Id6ylZE>M2BgEi1_3fMPW%fmH?cAXx)!$Q{$Xm z5a05sflAC&W>#^#iuwJfJG7QmGXc9ANQ{EkSm&2)5y3Cid)m59lVpX}i@NUP8s`u4 zmXdT`1K4)=-`@t#40kBhi6VU_fSqKCF$GR)_NRW^dOmGyh>|>{k>*pewfzwV6J>>9 z;DCdu>^>^8eou2;H4E0eoYeEy*TN%8DunieV^U#>jp@%zUV`eto|&NYqqYKes+3>x zdKx3+`4!%0 zo8ixprn0X<@h~YpDiAD9Jwmm{pbF>2+qQbI4b8_Ya*P%^jdLF zKfC!PG4j;rDeqe!Kffw0oWxXu$$=Zeb~s^c#XGwSSWe9&i~8ZQNp04gTHXXKq`Ti8 zGqPHhMAQviA;~0M)r+sB4lAHpH=}zWakpTXNcNhYVjvnp)KltGeMmx%N^c(xYSJcq z>*u5C6*idbGH2EMbNeYH>!h(U21E09v)ZJbgZ`Uj@?_@kFQRExJY}u~jNY>WTPhiE zMC;X@ZQduKyH3H#!Qu>ZL4_nosf^F1dOfBJ(HN+twyhrT%F*Zc4lSS5wXhHRsGX@* z`*JN%m3u&PJD@ZoQp60U0&1pDQO5Xi%>gkb_+ec??zQrZp# z7Le{*zd?Mysu!rIu)2?V`O{^?62Igcipo?jP@@ujH?r;5YV;T(H#Hw5qTaHGte$4P znkDg@$~x@cREyidKM&0iog| zF!@RAK8rcTNLbZM1tHJz27vrg!yIU>l1Ja+T9C8g({DE&e60*HAwmOUgtgWZ;Sz3` zGC8BU*5IUc@_A8)QO6$4Nj|Rgwzw}yh^P0K9O}tpx7a)_w*w!Zh5dL|@aE!3^xerd z7?j*THe=;n9E2TKjI6smZ|lOFmQZ|f)}QzOuD`MnwEaqC)?a7Y#9?`<@eitcyzuhJ%h^|+rf zNaeW?SD6KrNc7F^r>$c8*4-jcOuZs%3mV5-fT&Sb6>+#3LtyTy8>XikvhpXBsXXSF z^nQrbdVLaxX3;yPZ z&oK3|5T0n89NSY49b>}|a9o7CqQ-0@jN3o;#O3pjK9O#G(RTJpUSgsEd*G37JLGlE z6YZZz(8h7b89v<8$v7B&KZ@2T+TJZPq8!RQA20S?u-a@2EC6wxg@O|% z{8!&~qAPs@S~Z>#^fKE=MG5@0q4jq5di^Y9`nvSOmziy(G)w4rnPT8`lW5gK$&eJRW5hhjch{=x5;h~BHRaO#nsRBnDS?14pk4Yw{9(U zSS>%GtE!Kg&Vd-NeBAH3Y6-XQ54pLbV~TPPHmIu}P* zQ7=!aa`GC-ES_6(Pc&6WD?Wfxz0umiVee*x|!(NM-1pU@*L=A#dMO++gA zP5Hj|WB;X!t00qs@5m%A)&=4l{2~LDVcP4*{0wvCg_-rr8E2IKl@q(83X`~LPW;mw zku3Q%e~8YDiD2`%!rbHkCzJ+j`3Qyh-iWCJQkT-RZ!aVd3-IaDj>fr}6!g4lsnex2 zN=Mpr{~~&BY9Uj8uQ&FedsK4GOoNN8<1WIc<7ht60mXk{mIV66Kw|hgsa0n5+GY@Z)&Uv#5G= zQg#xg^SV{3I>{c4Sh*mF16Ch zR+B=&uJ^4D-ZTQ8JQfCcFvwb)88~ad7*c3d?-AMCtXo((C!XGY zSxSt?ppcF4-U(60@0yqTp2lYL4clgV6CYIfzW$?EfFC|xJ;oUnHr{!sYq3lS6PcSP zx?4qP{1W{`jrg*6JXlz~kAvKu%IBekv!Sap?nw|{UVfu;@l!to*Mc(v#&2odmaQ72 z$+_}k$pP~TqECY-%fD}?@Nw99X~9nc&Yd^DyoBVdk(^K|CHsi&&b++SL{Cvx<*SZ4 z(@+d7k6Ua(`qDf4YL*>?{Suw+7Gy5ABXG_chAWBv{lfa+)^rMg*@if8WAn24|mspzp2~qBZtzo8uC~ zSJf+@djl!N2L1DQE8*&z2>C|YJ^?aTxMd%6r11Q;+k*MZ?yJ4l|MM~|Lp%_f|`FfEQ}DTJN6>iF>p4oiJL>Ya<_u>a-J zMMuB0pmsKgC6oEpGIXJObG!(ZfvXi`WEof;%o%SepC-R3XyCO&!8<63!XH?qZ=&HDkRWgE&JsQ+75UkcxxU*W#hLI!|Hc0Cl?EK#Z8fwt z^jVCy8Fc?!FG5t>0Bbj&flhP$y9UyypA$_>hKbH{OKU6=NM8yJU1FY-b7@6{t6?sM zaJiHzwp&E_OQEE0Wxp7EW7K-wlsMeb-`1?dgjZ`>2X z*D33ii2{RqwW}e#1R7maCsYmuQMjICki-!FHk3uov6)R_ri9B&KGF9|6{nPl?+ijK zw5SVZV)WmPO)L4y;%bGeXZJ}Cx0Q9?vo;)xC0=af7P6RWf9V8LM96#X)pPWb5Yy_t zXCE-9QIr2{nitXA9*ZU)qmKe~Etei#Pxep?b>lmChREEL9e4h-fq{D*zeG&<^;@OI z-km>K#K!2m9w$E4tW8|KXdwr2w9DsU5t&!r(+1A#iXc>PmRaOX^fu+~f2YVi6l|*E zRS=y`=J{32cMBj_r>7xH_}`l|@a7otv-B!Q*+Pp4|_kppv=MloYyaD zQn!vH1_PQSEZSEWd*Fx|twos{6{!sV=5O_$TtTCyaj8j;4~3;0^y+>mXS(iDElcu! z5qfa4Q!JT>+~;b`PV)U?sBRc&P3l%HJEY$BmF%ze!O`;_IG9|PS2<7i!zqH(ABOW; z1eUiy^=~EIGj;uKb%PLBdZT7)|Dxbx7i=Cv_7v4Zb^m&ztLC+vPOKn$HhK0}Kn1B= zbYP^~JF;glwwPfQMtonsdsTlj;ZH(b)V;R-98!!{G_NCjU`9r+=WfCudH&@s_X#(5 s`-o>9CUy8fue9fC3LqdnFF|l{Wo~3;WJFozTfNl{By2zuJ?JpUgx~e=b!Ud2KlKxPdhx4lZ^O0IxIH?j&mS8%76$kdp!M+C$wvU|={LdUD(w z;c9-{<-rX*gq_CUVSp+PFR${yv;GL4gzvh5?ZLcvyxbpvVfv1Dp)L>vTm>K_Ed}^H zr~!6!JBdmE#QBx<^VlzhpMf8Q>M)p{-|rH&+@N+p#oe)UKdJZ^>^~4sv_T=@pH$KS zUPma*-43Awu=DT$Lma>-4S_m3!oepIAVA^|i?YNol)wF-vi^7{mHfMg-|hLOz#a;L zfb9`3-Yy8g|Expu|EEJnK~d&kQvNrxU+Uri1&^$p%s)#04?M;vRVkbR|7`1zIr#5b z6#v1ZEb%`&sr2IDP2qQlKm0P%um4O{d*YGHxb01XO2&np9$-dB(BcrD57q<4M^cwbQq#ZBxx z1$XY0s0Mr^j&=DDmJE*5HRI%SY!?$Nm08g@W1u%7yhneXq7%@@Yl8OADqL2)w?F@Q zE}nlnA_&A%7h(|4Kc@_SqyT{Monf(!oJD;|->n%?Glku-oN4N^^@%oD;}jk`q(t#g z$2U{qnKtMec62i{?H^GGSQWWCU*fHdFmCMZ_^?CvFmd>HC6Q*M-U$nZ^-HN=&+i7g zbSvWBgKD!@!)M9WBj|`;+}n!1cSH}ZpiJvra7ickb}Ia52!vi2Ax6O>kmKX~q=Q_gb%07Cp6Dst?ZmN874|*`lfXAhH zdFM;*Q@#kcl-ukr7r|FznL6sH0&T5X2%r4THT=Y*@x+hgyYG-@BZ5e>-UJ-aLko1c z3a2OT)oKd$E>b+Hza3rhM=Nfd+(jLt-;};{B~ZlRKHo`F{DSg1Y`NPe zy{a@>KUnC(!o#E=-TFRozl=_(oFR9oBu1kqk;Q)ySa=GE6x}jk;M5qh!p+XyQwPgF z*A>yUQ2oS0eT+uL_EYc{P8-YdG})ZChsf@1be@wI{G`VI=;8#?&r zS@nZrX7n06Bdro9&YGMv4?;Bd-&=uaR@gQ4JFeS37jJCl2^hIb&r9B&8P%6Z88J_h zSogS_>uu*(30&s!8w;O+;_N_b;B#YoTuZBF%|Tai-P}SVg}NKoPh-XjAEF)gz0WA` zG`}5UdvX6XUVBamaxwde8F;F{rY?(;9|A94Uz%_7;vEUGFUyeU9Mhk*A%9np7aS59 zOWdkZx-vylcFT~SC+9h+ft0kBZc9(c;0nfsdHPP5`;Yg|k z!!Uyj(^p31szUt^&%9YqwtCiH8Mfy1Vb^nA-Cg~=Y6XWU%E=l>7%8u#zF*2;?q8n<9<;Cu9VEtxrNm+!WpxE zeD2n$HneO;+>*#Om^~RMUNvxzrv6acUM`w!Xvhz6=BvCfbFt-So*$_2sMIMU7=*X&;Ue;H9y$Ua8GIMqkTYk)zx(wa@xGBjsMHrRW!(m~Sd5>3N{6?Z9~!&5x52SuUG=das<{6=Fjgl<@N-tmeWxwDq>Dz066` z5==gZ7X_mjAmr{7@}xT1#+f*h%H2V2jkDW4sYy87T`<0{ZnP(d2&EV`b2{wgqHdT; ztX*~u@>Bwbl9TRL)Tvo6D6SeI!Bi-}LSR-Yd2F9jP@k!Xpk!TwGJ`aw&E&#=X6 zk_yB5aTyA&gz_)#P+#S1V>DM0W$xscDvmbMrA%ERR#RUz2n=jb{5(RIye!gM=#jM| z6;tXQp9bgsE)Z(flnutdzbU^(b$3u@+CJlAjIV*#v`zdqsZ>(%PZi7{!+7vvOMI|X|?2C85PifP%>DhS(-g-nXcibj{Qw7d@YeYC~s zrBDDBI5#kmb4*n|wA>di_oSrJu=JxzKOc9AL1n%(lvyEt(r$D8hU~OC&Z(8xV9J)?Kvu9mCWArYJ#G`cO3o278PWI*f}h* zw(W&Tfm~-e@XyY$ACEg*#&_v(Z^h5XZ?tA@CC|#UHc%J@>sUqX0^-9_ElR1)0?VTG zs|WE_7~S=}g@bs6`aD~cJf4472QM(A9WhDj@ek=r0de1X^wxn%65CQ9tP^k^P5@omvb~=1k>AcP@@yxM7ZGNHowo+QSt~9|a zUcSp@+(NyNp4!1VpOmx&6(McxE9rw7P*JCz%iIed;n@F z0Iv2?#%9*f!9weks5Inq0-WkTZUu%dHQCH0-)v~aR?SPNpm#R6WrcIJ^V@aqG*21d z;;hPZ0m&9DQ1&j*-;8ZNeEMOb>y8Dc{?T|_ih%zhI`Yg^58M=eccW$ee#^cQe(%m3 zOuBiI?LtUHI(e`?H~o=G0lGQNa3_5AHrTFC&oQSFQt1qCDl1%54&zHraPs! zwRX$TSfHZ>D#5wr8$ye@g4qLeekb2(uP!M+?LOZ?nS7-Np7OYI+_GAmy(G&vzLn#+ zTEc^?cchDfaET(y=2)FePFKVKQL)}6IxZKDiLGUJmP#OxoUZnXW^&}K^YvLuO3+B@ z4!{$#b6wCCBJx#Q1JYCeB!%Wu-VUBOqQl8=i(gq5*KFiBqDRuLiw(BPIgpovy0u5n z5*!%6Jdd?%siQ5 zXU?)sYwzm!s*rX;(w`^ETn<*7txZX+*|Ce;-=N!q*c!OQt`g}9#@^5PHZ%en2FgYa zw(HOsIU2V2lNZ` zHhQ?bRDMXYkD7?DR_u8gsj$8R*_qnjMi*LVWym9|gpe?`i%uMbH)hqeS}`*Xw}kGq z+Q#gWS33nbgz2b(Sg7*hc$+Bu2@iweLNe z`g8DCojDHs^qp7GN$g~H=jpyN63{25s81v}?A#QvslFf&ExPBsuq@{>X*dwHWtt%w zn;ay?Z&M!{{5hadg^vR+T5&2=g-hAjsc9IlZw_=ik4!`bDaA9$bd9HRmp0+@xh@`{ zECMo55h*oaWQZajuPjq%=3VeSGz@e>Y~~oNJYtb=ow-o2+=E+7{wj4Q&3Iw(eGM~_ z=}Bz%xvME2uKI`L3Je`S7ehr>V2%x<%!7$9kMx7Kly?sr;m1W&x?@hRmuP^=Yq}J1 zocBv~h4;==3^BZLMZgkNVXretlAl`*fw44y+1i*ig!spSeVC)$oj2g9VccbEGt60` zEuA&yzj}8{M(UG;wc15;rmC(5e>_^fHKe45c3bSRA4IeH?VEn7Ks+u<{$_H#-jJ3r zpYO1ucdi5oMS9N`A($w{KLCk(iF5^^(5>POlw(6&+Mo-~HFSku%|xAxB!^sj6wYr& zh`^P~Dlxk5L@XxUaYA`z1`5M}y82M>i#Hc6g?*BZ*HW%yrO1#x~`V0SzHX zqe<$V^aaq?y&y#_M(_LMCA(PJGlY+xVvi)ZwfcvL(BCYl5>=J0&URLh#_z0r3~cCC zQ`utXQoFLV#?*Yh<_^0eXfkUNNXf5aj|j#;fJomH-$_zs z9?uUrtj}j54ivv`1dTa1V9y9^Ot=p6);X`Ap9$pSI1`q|(|--McVW@3qHVxZ;aLiX zXa6FRDQygzx<<4`gBPcJ4lbD=JSXj6W_RYA0_i&5wepnyRFIO%h+rf(t}aje#hN#i zX4RV%TA(?uoKeh4ccvQqDrN|#JkJ~QkgGeOyfxKD=DN0BC&;Em}&q$xhe74|JIOGN1R2fsX+eV`xA{kh9x17DxHhZX;pn&W#TDD?0- zk#egx{aYqy4_#~KUQb=+Ww+}&HNz$JexSD`2nguA(Zna#ydmxbxh&r>+I%0n%VAyrzlOhGcqP3R{+kP zOb8E*F#-j%?yxvmzQjPL{R|E_Cj=YZwQxZkD}tXoM%WdKosqMbHZ>#e%YcG<0&#z7 z5;X?Bj6l;a#0#l}?Cvxl`9-nR6C80P(6eM8)CEsxPzoqXDyy%w9RPt=K-5_P~3R?zIVCrjFi zZeXG@7Lcx;!?HC=v)x_7lKW zhu(wdej!WQ$ErZcY=A~CMtT}FdWTqY@4)h!Gg50iiNg3V8Bi0xDrreOzB9o28+_;4 z{Id1efDVfrqxTMzGecE)#tjRu8ZI$eG^EY<#uH*P=AgrS^^MAg1JIeA~p@q!juM$3ur4Dh)md!!CJUC}I&#VlEDIFv#mY(^oSSs^Y# zA;nN3sZZfA_1kT99Ze7N@&0bD1)QH0qS}4w90RY|UJnB@F-x;2NK+b0u^399>yzTr zNQp~9r^hoP=$z;Yj@$&WD#3}I)q#)Ik%`rb`h|n=3rF@BV8s_slqQZWCSX|; zr*nf2VuOxcgH9B34*YVC%yQt1? zQ9fo#$poNqf~2A$P{2@9Hu+^qT!3F9hzPZwx32@gLblJgS3VJ~jL54DbFGY7u6&kS z8ER1(JyIE>R2f-a8B5xu#Lb!>yrlAd9`1{tShqm7eDjNH@p~e;M-e+&x(x`xW?yH#^)(iXPH&!q*do>>t=%wFonA> zzwM^;?CxPv9YRrU&QYBgqgwAredcYpvuw5p&PbE@Npbjii1kS(E~Y$YPkEM-5^BcY z{N!r;OSd-ql}4ttkCc{;UY1?wMnCC|c8HC(xsP_PT*brko6dSW*u=~li90C3fr4;J zc_L7PC<&r10!9`IMPe0ni!SS8W!j6BMT-EUSgE`skv!}**CM&)BJpLcDn}6?2Uaq* zh&{E0(xRBfqU792G1o{5vr-9dbumYE2~|KbTR;g92~I`@W2Azg4ToI}hhNZ!)3v}j zTi~YzVdn+mm$Kn!oM5a@aQb-|_dJ}54Njd5V^4-tn!;F2iTuJgHD-S%{o=2|Ci`Q5 zuYt*Y(^Bin$Z4V&{V5X9kgKl*LtzV6>WEXNGi>kCbtGnJtJ z`1y&+gy_$&6Ca%MzsE|yG!ycK-Fo~B*EmLv>l|4W5}1UViz6&*3o-qY8{$JyP@n-CWz zh`DH-*h=f%T|K<)y}g}n_uK3F?zi{Sn{ZWKk7G`Z&;M(D5BL26cJ_{cTfs!LF!`Tx zeB*Un`Pq2=ec_XTR{HDX&p3gJIQ#wfuJ&#|e;+%(z0p_mX98|we7>&s-cD9N0Uq{0 z=PQQBiTUnu^Y-!b-RtA)WpB3yy>OO)t@p3-4$k|3#q<3op31D`wDRY0e;JpDm`?TC z$Jy1Mm?i^%ERUK1p~k^7Cx-tO$4^egPxP1jSG=9i|2_JS!J{9ZHt=Vkru^y?HLkah zy~p1!%*|he;U^ct_p6fea;S5Y`s3pIrTF|)B8Um(9zR$AZbpf1RNs}i1Ou#>$ zkDF_}0YnPbyFdQK#?_Rw@NTddB$oWNasSLj@!JObM^Tho*zG(|%zk4oP!~rLzK(|DB4oEK)64F@3fv<6f zo0e|j0H@@NY^Nm$>~7kvPIu)%gOJ6k#6S-41Q&Y*sAuuuZ8yhmq%rzf%vSIPz*Vm(J*f6~*L0Y1k4H5ZmQs(#AVAQJMIDC~2 z@rF+{2Trnq=2n-W9l?g21?%;KBnfh|d{yvDA%a{ZQxiR9kOPITiEm#Ha3Eo~f{nW< zL7Ek)DM~LU$i{$sI?rSYlH+;pnX3pvzTPU6mi?InulE_J&q*T4oG7s|?V|)4WHkBS zh6CuA8(CcuMUcBCy})f!@4?xJSBgiqOgV_pAH(!NYoOfiE!BCBN)F?nMY1D2lIJXN<2#-$i)nY z7Kdzt41fDr)4zxyJ=_=jL^%@Vg7#jyjv#_Gy1eax3f7nETH9h7f%9=Z1?MJ~@% zHqar+Sht0pufK5M^pZD&(vcis@)Vo%`Ej6yxgv?I;(*9x4W}_)g1oZm4tJ&iK~^kS zudG5{8DT*4EZTp*44(%foI>C0(&Cauvx!z%ana=7%*Vvu5Unoxs->; z?dO21X2#kU)wAPrrzWs zL5gQ)I<_Ehe)Dcy(w%VmSjQe`G4$-HA`^3@oXu82(Hb9A0yR{$(W_&v5=xj)k zN2d4OZ9_gyb6e+XL*%|X-5u~5ip*5-RalF~be!JJi2HnzxkKN8} zkZR4377Js;KA-f=RTtQB@lxgzHSCXKwuqa6GWI`$=Jz9pAO)987QV*wrzL7D{W$XO z`aREk5eytRwEcQPD;v&ymrZiU_4JlEaF#-T)TGAOxyP_UeUDY}yhqqq{)aNxV>zJY zT-kkMAFj`#kXC;@-_*uBY_^3GWcM+vd9NOFV5;=?JxP6R5Sr^(eG2Ol^e<7dJq&e@IK)2iLaDD%7(I1dh8jzPsUac`4d>*<)9eH6L?N4YaG3*= zCl)8K*5QEv?wv!@p&XEDR$a7DoCC#Hy6a2*+3;-5^I~_rFV;`3-#br*AVWLt{e>Rj zz39`wBq^RCwRhws#!3)mq%+T?sl^<~cFCW^2!~+^Y~$m;L~1x+?UTE_n+qbPtTXXUfKWX_lbAY8R{jD zf8@{4KR`%cw4D5#(xgsOXXknZcUN?Rn-wp@_`lar>Ww<_PW8a=Cco1C!=HcOFO?{s@p1m%t``arHy4TU~6!2P8IRXtBX@xIDPQRXG_v-l$%^E-Xx(PyyRYKi+Jb5wTlN39l~EY zOh@d0BEE1Y`W0R;HtA&dfo$uP+aegh#M1p2H(?3Xt1Y(~4Cc!uUa9RDk8 zolXtv*K*DMtqrm0vaGBL;^>WLb3sJwA3IL&MSoUsMiD>elNL?)iXH2NxsRG#m_Pbp zO`8yBf3kct1O55MlJ1owMr~PG^BD2ke5>Nkm^W3&ZbTUC zu3ES>eHr?jj!OBsVV~M#zK&#L-U}gHT_2%rC3W-Z3$)jB^E{l2@d1`T#w5nGe`uRo zquxDY#OWf=qsrx+*)_Bq8O%tXjc8b)IZTZ&sASzzg!Nf&srpfZa!%gqBwj>WM>m7{ zm}k{@8S#y1pVlOt`3+@9`&pfah`voTY_A}08T1NWk99VzU(LYQ}`I%{|#qEf~~|8Iy5tO1F9w4WN}=DUix>xi6?FCweGTfqQv zbVuTn3dG4}=kRAFuE$dsIY3OkG;`B3jK8t-sI~~oGi-C__adtKNsr7#eWz^-zbML8 z)e1|!P~PESIYjZNiz7;^V13SfweNmIxq6=e0(r!;=-|dps4xGaqScB04GMc7Ncr_2 ziB&Ja`Clc%7@JW}=-}+jME}ofDgg%(9YeE)*qC3+yyeO~?000Nep@~2TL9c1p&mTK zJTIY4Ed8*E;!U{Ny1RO)KRIR>B!{?nk^*ln=2ce=6yAdNm+<%v?4ZIw=SUeQ$tzBb`tICJVtWE z=wG&bbW;yv-L+R|eNg}Ignr*%^lOfp`jp~r>3y{n&omh>-#6ksKPVo!5`uDg{)Wy>jAI>}+@6Ja?b0%y zSi}`$tG-B}{iUWu_&JRKlAxQp59LjTwu2NdV6S(*h*r$2|zrX)oM+aq4%wDXESe`DaJ_|9xLe7f^(M9NZpcrCv zsQnKH`bU>(zD!1ZMQgt)gL#|Y))PYCyDlndDYrD=#8ZDvNb zW4_QGa^LfCeu-%h-Upy;IbXC;3+;1WewK~ExOMv&H-1MsNICW#HIInit0D;~4-IwY zP&_uu+j{0MBG_-gunO%u7w(vEM?6`v;p!O1FLDXEOU*BwKVS|E^Se7nXj@^Q))wtF zibnZy?VFiJXs`UfyEqQ>c$n+7=pm}ib9cXke$yOA@~QeoUQJbrN4@$YsZCOds>QvR z3UD0e6-K)P-Um~w6{l=Oee}i0N}JFhh<0Z=l#QA_?j|Ejikrq6p#PeUvWnAr`ho8u zkMTj2W4~nvRifQs$I6Y15&f_IUX_94+HJ9j3r1PHyxchqam~5U3@T6Y2hOp6>{n-O zSBwo=NAQZS$LKG`eVu&&X8vex^E zO=)-IhcT|J+E7d!@4ZWxTjx`K5v!b}MWX%yd*m5)?+9bRIq5tu1vH8?{W50Y%=r+XaVm;l@ zn9usThn@za++7}98`LlItr8ALtcx|s-iG-`)6?6JW1f8i(WW=QB0n_);y+=X7GAfR zrD#tmdbgh9*`R}U?kJ*=akRcL&cE^XUak9RzaKH5P3=S9Bf=@vy(;i2R^kH2=j+XP zR7Et|r6iY*e%m`u4Ww}1A3sh~d4+uq8vbyIh4Qnbm7!snx47zf!gP$ckmPM>$NJ_f zy$ChNaX!|WucOY{(`m|n8!%7fRF>ruYCNORQ6Y>^d?6VehFFolQi3{HWNn&<)}a4I z{++Yp5c`6Q3)C>r9&sn95yW8m{D+>XH~YL|Hgz9w{luJJhjRLYg=y0fH(zvbp!i&= zv-^Pz;^k_-6_GgZ$vLfhCMbWuUZ7Erc}z8=#UEk3=(}b2_9M>Q$D>Q}x?RbT-Hd)| zk?PHBQLdV<(Mj=ok(2QV_0C(NduXvT<_nRoZ$OjT!^df)z|Ju)DgB1-i&#AkAy_r#=I|b-W)xNar`HA>Rr(8nkP4;kC?YvII|S} zxL1dYEJC?o=5^(D^tTL3+7pU6>9)q^V~Fx)S#)`{n+0*l4x%jgL)7E|Vy-7W#SHaU z+(|anKFL%PIe#2+{gJ+&Cy3&v%f+aB{IEvIL2CYGr#I}T&fi;4j9Xt~+_|3RW^RaQ z9_QV*L);(v^s+XhX}?Q*I5p4P2|1q;wf34ToW=Rmx3ONcKG1+An}AH6`PXeG*`1~$94paB10RoH{iTDRp+~S2fb=U&%JFo z%Tdo5&OAg=b>1m{-+_9`1q1ceJ-@Ti)T{#QkghSjcm(CE#@^A?xB_h-YN`A4k{s(A zHSX^LCJnPOK2__GD|OD1dhp5(X4Lw(qARV#H*(;qyd zOCmb&&65tn^*FTu{=g?3Z#d_ayB1==#r!MOeGCFiyr_3ULXW|eHHb@Vgq~CD-~apm ztQNFe*Op8x#`q7F?%kX5Jn}Lr)6v2Bb(aRzJrOMzXm5Rqey7@QGgl$zmV7+xhw;hj zntD|K^=>GFRL$ZLpto~r?9uky)Y!iX=m$uosf#O$hovG z(A5RkP95Xt``iT~E^UejN4wz5(`k;|zI4Ij%KYgalW8zK#jrG7oCeYbcZ*F`XmBAt zVaiGi8U#9qD{A`EKw{U|X7~McFu2d>mA;$~38&>{jxlMle8goAZz&C?^JHJ;6w%Q?Y>(-MougW_WD|P9nO8OIL}V`*`YG5u!L7FR_ZR$FV0rzd zrk(~1GNNKjs^xk>Z?oJotFdnQRC_IgaitqJEp+AaTFV66%DU#$4NS-x$-7;Ge6S6- ze)ve82`P=zoYzbyG#OvGai^3CGYifpN5ywTroGcZUH}79Om)^8nlRwbN5k~oZwyc# z2`$x0?FR3$nXRVCuYxlxW#zcLp@X}@zVtC227l;rT)k*8C!;A{?HUQ!o0f9hGQs zqwI{{#ojK6ds%<%W6vzg^ci4u_4f0*7=M3SX5G0JOps634tQ(KfW%%WmD0O( zXglSqCVGbkNhSx2FMaBQoCwG;R>t_qg{!_?po39XnPz4{H~x-P4NUvMgcW=x)-Az3 zFsyk~&C#C$wFf^}r8UtpzML@2qQTHz=7U!qUGO|~?s?-B8f1nI@4Z#Q0H?y#!MrIw z@K7eRh~~lqd()}@#yu>UmA1No3;TFNl&gC5G6PKN1&q_iXb`aQ(Gxz*qu$HWeLjGE zEgjhSrL`L})av4^-C1x~p=vt^^}u|Q=Vw}X^+I_#>!jnpUNAUh-YMA2f)^&5CI@?% zu!B?1lb}(QWz% zSrFclaycuk2bi_bOV4RCVPq0Vtc}BfH9S{VNj#!~(Z=(l3X^CcVY@!%UcK3m>{OUdfHp$kLt>4XWQ@`(UmV$)pw&oI^%FF zf%{k?=F6&&$kS_8rs7AGd*M};b5FxC3-*xVTv>HY*jIY`^cUoz!`gG-^AY`gODhMl zo~3a&?DMPXV9NY`XPplXxS#K_7NmGMWq6tno-` zqK%nr>X{H@zRB+VGA1}(ogU@#m;pLP2K|y^bTBkjXw1cP%~AKxZd)lDh`thcxU&-Z z9vBzxY0Ch==?9~}A&+lJEzepr#Da#epJ%s(vEa!*6>Y_pJz(V@_9B_T8{Slzn9{mv zkT-AgOagf+Gd4@%t`QAfT|(WQR?uPbBR3F1{uXz-BwFG5kqHqC!4J=kX%$PjynBIN z`ancVlm+I?3RRA6?FRGnv6tUHr@!y@$ zxF{p8eEBdFYG%I>8Q9E%dck&eSL9df$-K7Hb}aZBxc)?=MK|c4*AF~Hr-9F!rO~@N zT|gUC^d^z7Uak7MG+dVu;gSdRG8(Mz`#f{&Q3kMwj_mxL-UEI?-xT)#-V3rSSIXv3 zX92zRvYng|-bWXDgluQf;mX5@7J}Y1NObhzvT>)uv(#EWTRs~2E*)$OSxkdBQju}K zVGIy9i8_AGm<8%zP8JN~eEqlY)M&!~`DxD$k$=R1n601h6+WQDbC>?f58WBSFF&&d z9OzK{f~9H5PlL}>LR7!r!uv&~j{9mD6LcjvNm~T=!WQS*NAkm2u!AeV(-7B}hv!q4 z9T(nq;Uuk+@0X=?(W)n)9~fU zJ9F+?GxOa${ZFmhtM>D3?NzncPYmGgU{CF7>FQ?d58^R}`yQPVftA(Yj zIIWVcySu%mtfPgknIkQ=jiuQismVWK6dc_J_-LukogAE9E#2Il{v7vox6@a${q)Yv z-Av{`#IzD<)YM}C&iXguAF-;frMV^bM-PWjmaZyRs!q0!?r!3=e7rog{~?sIw735w z>mh!7yOM-%GK2j_)iz*?48X1Zrn#Rhd&1rNUf-@my0U+`%C@k;0q@ZZDw zw>tRWu?YVQix}ts5lOMXhxu>8{2yZbZ~1k#ar)mlE6B_HKL+*RSUmrv=&wTkTXp|c zLH}dsgoFkD#n=BLqW@0vuZ91AOTx`9C?x#<;)?VC!V_*j0sem}!hiO|edHrc^6NDH4_z7;eRmWVC_G8TP@*x23;BRnXR5(#prDpEHXVvY!o9(c^~cc-jVt#<0S@ze77v% z;k6LGu=>MZz)n2fW;h5y*cPZ3Pq!mx`9+AOpxUJo%9oZsde}PT|IF?J$JWJ>uwyrRdI% zNXU?DefKmf?UxRH6DpaER>3J^8+BChvinwl!P?KW6uGTy*C|$kSxU@HIXj_Vnf<-^ zf&=K&GIn=+s)uJO&jZqTe?x(*$vT$q#!B4bjtxIkW5V5jAAK1hM^rcT_v+nGu-+0Q z_{C&GJJn}{lu&VUm-eiaRMa~#M^c&RL0Cy2Saoz_3{jSH0N11CT{k}!=QFDUT=Yv! z-`e@YN#LCe4&TFf9g_F2!;SaXF9?k0#?Rhe{O&;O5X1Sg<@Kg-gDKncyng)i`lCz4 zs3*noubIisr=kjdoYu1z4>^5_P4P89eh%34OX7}8EgsK#gK@>@WUPq0^$qbZsR6pm z`bE@3fdg<9wJm6QmsaKY7w4eyqkT?KT2JjZt*;bOe{7WSjkanSJSD&8r`;}MboK`37FTRfT@2T(MeM?R^8XEstaVZ9Dskh*I{IK$$J; z?m+p-%PGy0S9E6XHwO=|y5)D69N!c^;d8y5ZfVOyqH}bsIzQa&@t|G`G_TDOBwtb4 zHbMAVR^lHR5d*!h7k#?{6SL3Z-9w;yY;mj}thwRcjBYPmVWygTRp+xh6*D#>w+vlQ zClKAUdZ9$*YsrP?lF4m2S3#%!qFAujPYV{*YWWS{0=*(vHDN~ZQ; zeyl;;sOLD-wIVz%o53Lr9_gtWRfGQXl^WVtfmt!JQy)KZ^m@nxs`M4cc zghei|N5_4c-biFz`ZFl*!X-KDxV zRNWeE<8>=Ir3(drU|;Aef8fI+S#iP%FV5Vr%sn(hgAQHB1q%;3j!mzKRbb?d9TI+2 zad~qzbIvx9#=$sjFok~@H-_rQE-8u+pv_BC*x|tFe2Ci`|*0g6LQr~VJW!~cbJKdt9`ibcA#WseMuOZ z=95t?%o|^IHW7_mA1CCL_p$K7jwIwokbVu5o_<>|bSu_!xA4TEqadO$zxBoFv%-=W zu+?W4E%69K>b!H|N4iow$#YeL<8AmMVwp0!_1n~Fgg};Ls*2WUN*|vE%|Lk5h)TVc z8K4oxD%3<&2eBAUQ5Xs_1%&sqsN{vtMmKh*0skrNj z9v0m&oJLF;a0iXbeo!KzVcO$p$vcT`ZL~CO60_4H)2+Nb#QGN2AP07$eSKf~26=yj&Q~DtmkX`_{7!R_Eh9rDis2*7Gtwc|Ji) zyaXILt?}{NKnEy|+Z9&#Zvn zVR|x&pA^N3>!tCAF%sJm!C_4h*2dqp6$cYnot2k)eM6O&)NXob**(>^JW&L7LR{9f zhL2L9c5WrM9@&9hM7e?yVCwa4l7{=jCz@bOlrUg9S6&T5%#6aEXgW21yeQ=T z)R*HmZ*Y<%j*Yj{aa?f^EMd7kIZF=-$ zC^K&#K4>#KT|m`-yr}dT@Fs_7ca<`dv!A|nEm#56V}qjmuI0)?ZekqQ+4)(cY6<(Y zL%qLT<9G;_IWb_)%oIJNG|wGPg$jJF?$W6FtvyXcS*_MsYU6}2l(}wpb^eZjQ@`DM zfbfy##V;$VC821-umq?Tw8(=-?UAQDEn3G$KNuZh4btuup@X{V>Jo!OmT8BgPW*|( zbEW56cb=;pGbtoPvTLSYn)T&e<&+F%Q<9b!!cwQmL12{2GK*0%$wbx~Vwv}9%7SSa zNZb7uUTthT>Bs}H+al}!hD`FjYGW8bra*Zeza4)ukawNDElAXfsOGO=6n;k=9~#yt zn%2v3#ENzD7~cd@JTKXQjCYsXBkmFGrn^(cX^%HG<@V}^pSeiB zbV%W2?}pX~@}?470Dsv&(&W+J`}H+t3pwOS3j*tD>$jPXUZH>x#TS3yU*7@Xusw~5*mW$G^l%-7LDzzH~ zGB7D+1#yex7Oi(Acy`J+Cbo3lGLe?=QLCnwr>hYZmu#fpP6-RQQ@gBo)0P4eKqLOO{^oqAWG^n=E@ddGzJ_F;+iYsO^#OsH3)?e&nVgkELzOg3T&DU#2 zmy6!&{J^A3WEy>s&}{8%5uzX!9GV@hU&5WtXIrFltP^MPireJ9#%_eit#3G%;mNDf zHW}CQJkwMEDW>0j|JP)Gb16?VwXGjFq;)+^TwM_)~?z_`3pE2dbALoheEdOFHVQdsZ3_m2de z*EME9*E%`eG07kvI+KoI{}JDEaT+o=*7}#h;uK=u);;rXD*9a3c;Lh^kZ3$M-`Hw8 zWlc|eDaD(|FazJ*mrx|x?>VgQ0mnzExg`WHa1B3O_p2f;@h^me16u?gViWDB$%{P5 z>00}q1AXEwz3`)kY%biw z=G*B}^&qdAt`$!4GbV4VmpYRD<%U>_Hkw5Ie?Ogkm=l#uu|JqFpG_eKKIkmey9ZP! zpJ_jzcczyLmRcMuV^(uHfjze?+;I^(8n~d!i5O*o;OnZKFsshE^jTXpk(7GnmbErp zZZd()$adf{(=J6C5$E>tPDjmYLTNZ-ikC6$kQBEg_%?d~guk?}Mc#1!V%>IwYAxrj z*7&0?9;|_0PjcGBA+gEvs6nmc#)|dzGKsh#6m^%fMC3S_<)mX=SWhGi3A(@4v%1$M z8nFJ!bHnl1hjbL$gw=tuBZPW53tg=t7od7<+VVsjnJ>~tyysirGVFJ=S(}&a{bB8N z(=f*{oul0fYl&s20ZF(9;&)A&OdObL+@ccJG^ftdG6)a4e8p{YOSLHthJNMLS4f%D zGO3I3?F@WcPLd+WDsvjR2MJd~lrIAg&0_eGcYnLEf8oB7o1ULbIWycyln^s|J=(k+ ze|!AfuX9pT{2HG^^6l*@Zm)F9M-pMcNz!VhqqBpj#Q*~Fu>Y9-R1L=g5}mlYyMOm5 zM_zS~+awA6)ly%0M=2q6rYgG&uwvC&iOejsW;aXSW^<0W|(TyKWgzK8nEkr1Ro@Kbu=r&h(Kh6~T)xzRF zXmejx9A| z{L#TRff&0@oOPz=P)B?O`yQMNC@gR9hksUB<{!T#to6sJY=3t`_5PSl6=p&^8>qSJ zZxnd1^a(zxDD3at?tyk%KJO&{wNbv^0|m0X_q^d$l>U$zR+?J`d$jOBd=eO7XNEP= z7oJ+jr#HpSJwE~w(-{*yA=7ZQs^|9dse>cVaFuEQACKFgRQxGN#tbgHJ96(UInL6G zyx)O>;jvJp>(=QPKe zc7Y0pnzq1HY|}3m3BNL_-<q8Qi-*`f<2G=3~+-oN{)49}oZ(KDikF$pN$! zsVAmrf6;>`KoPo?1-AO-A)LI+Skvl6yEm~}xD7x4d6@v@1B7pSFvJi63N}#&a(iNY z+l4x#c))7@#Oq8x-S+yArFg^~KhZ6rh2al~<0eoIeznHf=^)n*B0Fa6A6_C6s+%6W z6MpR(vQU{>4^6Xv-2ay9PeHE=HSV4!KrTn^RyamBf{F%rZ2Im1V(pB6Y64k* zWR4!=SoETf7h6{LjcM0TzxA;>D_0oP1mvU<%hCq!7ILzt0(osNWO{jL#+)yn5EFK- z&DXe2EG8dgfq{pG&k|gY+rBcz5Z+C|@<(X3`lF$U4Os3b2~jJ9575)ylyoQ`Kk939 z=63sS@5p%3ci7fZvX}3>}+bYaC+IjHqB$mK8q4ZRdOb zfH-yg{0T^WsHiQt4gZe{J=7cf1pfAKI-6IyU0L@ueWEjCl4lg3!#rNijL}~p5{>`K z`}ZMsK0v%rdD3p^GGq2b9K+2{5xD;@?*Z3HlK{_%4=~W}{fA;YU%ciPWI?VDzk(DN zMLij%;$Mgp{=r+rRd@oxVI;1ta@V}$w|IykMy_$#MZhXL_LaodGZ_2*E!3n4A6WSx z(=p6{PRIVa4!-tY%k%IFY=f!%9fkW+#mDB2?{gQydQk}z69WX4^xy^aF&L!D* z-^uvNY1hmub2sgMoP@0X=(?_)6@i>3pPV%YGFL1&NrXa5rm$Wjp9_`D4qeR=7mgsNXG^zgv-fw-o+vjihZw zsBOuwZH+l=!9Ht6F>8$|U_mEfg)dr3ppt*7f_29Y1faNZg*r2Zx(LZT)62W?S-YZ62?^1p=S!ry2_-{?Am|OT5e+G14WaUP_|KdC z5}Rbm^Q<)Z+}sIV%n97W8e9w--2BNus^ffti2$gR@t%2`Wfpj7d#Ld%Yh!pxV~Aa2 z^ikutw8mhA#;B#nK+(pC=EfM8NM@2L}TkNvzOoVkZ&yv<;|OK7} zYHF|^N$*#-p&#~xSjSzs>A#T-yF3iXFqiw4mxtMx2OXA2kJ-9iOM6~>T9`y{YjRi! zxp6VNaSKAZIHBAC^a`$s3Z{rkA;k)M#Y(=R3Nh9STGmRQk_wiRN)fvXfujnJqe=;~ z3L3IX?z9S$v}z=SDnf&5%%v)drD}Z9YV_tRvgT?O-zs9?YATr93lvuz6t~x*u5Uu! z2;|)``drET++H%e;xW3B7P=u@yAoNuVePq6?z!O-yP+n#k|et!>9`W=K=%En{~QCq@J>(bc!7WxiQ|Kqi2Q<(1Ht?+4a9$H{I#P0bMKw*=H`a@0-^B5 z)L%!x{97COV*J%cgxWx{SUs}V0d*EojS^{gRY{lia3SFtTi;BS@?L z&Az-*17R2}G-m;V?woWdH0CCjhA3Z1MTERVKEJ}6a9FzgWxrRf)^Xj`X{v1}eoTnV z)7FGSmaDx|a$~J8JC_C;!B8(i- zoY(eN)HREq$(?5{5K+~m0_$RXUErRtweMSC@DhbP;;~TJL}sjLfAsUZmHLTB#VZThs4yR1C; zS)RFU&^euz_svbYhYGelh!MGWHt~OIVMP0I*a+cvcZ4#^4}1t5zq&(9+RzI6?#?H1 zcTJXEE5NC_%fWb6Y0{b!&6n-ATecynN;jQbE3Nb~dHhW-lsmvG2(0AhP$BVtKRKH! z`>6DF?GS|1+~LFi=?w93rjw-DZZJgYn&E0>mr8%@ZdG|RRjnQ=J1127P#p`mcuu{! zXq_p0XvNKSstdKX!QkS9xmfn8Pm3I)AS#G`Roo&;rRc-ZWMZ4NG=s+)`$AmA9c7aT z?-omTQmg)haXqRL87Nuh?YD9Mv7HdMi|3~JYQ=|g^K>1>%<1)K20aAxhoqn$@RCvQ&9ga`&Jgs+8l4={GF^mX6qsguOTN3H^EvPcox)!%7@;i^lvLbjqCdHom zigJd>S54mLa^E5Mz(=~gJuNldU&&@{uvT2~LQGIf$^g@^4WO{^E61GOX&Fx8l2UF| z+s`=XE=^YjufeQBb$Bq*9X}zJwzdSThdrl_69VLs{KB6jmXdQdLV(`x-4?41HG1B= zzN&A*#N?k6C=`q4riTvA`%nq%P8^%V;2P}ca7ZaawwJ|nJaRqGVFtO;j~JLxrCl18 z`5HuI1OmbVW;TpIdJpLu$CubVsIQda7nlQa^LtfHg)SX|=yQ+)j01vkou z3(;X!$s2ES5aaU=TcEEL5*cSUdMA+T^c#X$IrWu}y$BG&T9g$phywLB zuK&61mX$O`niSgdk?DPk{jGJyen%|@) z7Ycf?KGB$>%;@aIGDyM|oi4eqOH-!hKI^(rauoU+*g*r^+bAlOqNnb6VMScZpFt8O zB~g9ulLl7>J&5=|gfHRiw_U!QAnk5%Imiw#DDmbP+v9>WV7%?J`vus^GAlDk z>`vH+e1jic;*_(u4R;=z<^r1AvQ{O^bv--NI{OBKM1))VCVdF6#muF7#p6i@3?(Uv zuFf@S!HuwsLFTYfa~`=#?n8{A=*ZsaBo|e|%8t_4(DGs>7eK@+~;9RLL^4@b5&hy^S5y~TTxj7>QiZgIwvic zcdhEz_M13@@_Fpd*Px2Ac;OG9Q=Y#QI@F`M348lEh<%>(LG}uv5XWpH5&Gb_7bhcT z@{5H{=N-5qMlQ2CpkCP{r%h8)+nd_~dBEkbE! z8LDTK$!t=1NV9chtdU*p%!gtHG68_RNa^ExZTOH|z%Z*E79zQ`2i zRuA`(PIEgw#XP_Mk&G|$EP8fByM6kU0&~?@zO%?3CCZr6_T=k;|C!A;<~=dJzXj zhuO=m0H;Wj10-lA^|f0OfJ}sRWH72x`CYv+@K#4BwqhE+W%^ihu@m`-NZ$)IHd%(a zWOI`xaZTJcTtj6m%uGd0&XgN-^0;}I8QkresNATTf+9OiZL}Xm4WI9>JXa;gs5iSC z<1p1R&7#{F#s~-&J zBvcRF4QG$}Ew)H$v#)2qnyhlOPh{5er8}nGck7W%T(^eB;Y&b9{|>zlv0=Mc(ah8K zIwEY&iXQ!*O{}7NC^>MqHQX18YgF($e=$NvIP6Hmc@Z5nRdu|pnCvevj(Pd*DOhBV znT;GSI-5Vv_fsS2ZpTB78?})k9tHMSZ8*joo}Xc@uTPv70|xAQX6ZpJ47yf1F&VC|Ln3aE#Ww%+||=9a=I zvqBOF>B6-1u^Ycns`gJz;*+mkDt$hyP#5ki;?#rA-nu%|3-n*l5yJ)RZT5?jZ&5&6Qg^ z)9AKakivJ;yHJQJyF`ZXb{6^&Ir>%R;v=_PzogJ(4*)gyQ$g zdj_+g-_PwodX%FbiKH}w#1Fp~c=xSKT&aDvBNj`PBflCT`w@(bY!%YxZzwSoF!*J{ zU1XE3E7wFD%LACuUEgBhpHqIUq;V+&$9o+cC;MC9audD1-@QQG3L$ zJVqjx6SHSWY5@_3$tAJ_&>=Im!Nr_>G~%TVEdFP^>{ zA10PLC!$-P9rjRu$M#;B$i>&%AcwhE&u`{HpY$@{!e+OJ_^L}#njUHthuv=3cAX?i zVc>2h8&3bwQB*bMd&#w0P@1GLHlcF@UJ&wB{xbfI_{eE~``O-6{}#}1uJg>_v%k8PF+U_SqN{06IBK3|HM||;%OXW2L@t=#wdTRrpf0^iVyu^#5$ZPW5MxKNxnsh3i7%xF-ID}{!9rT151@x@oGC%0pek73jTrYjewYhdN>Ensza^sf@^P?co7_jw5 zdMkd0^ZJF8wmV4ug?MUyPWXDx_l@Z{o6Cgzt+#J3Wb^3+ECS$<09033h27H7hq@*#G> z-m6uBwwo|9!KSz#ZJ>u*6p$197@s1C(>xs1y_A9-NbO&jypV^UiMO2ZPGAq(s`~cL zZNz&>u(;znRJs=xd;DX`bjS^QYl^SVi;GAjh&V3tmZz^L1}zoq^q#!XhP6dUQBc{*BH9d~`QH_2m?gUpe0Pc+rf8vU7t8O_L;@)Co83pv{dgMYtS5d95n8yiL9?%ygm*?oO3J$EH+dh+N58E8EIS3g)U~3czY`Qn8+T*~y56OZ z&aaLg@q;C$Ns1@a#cO4)Jn1rcRRGuI*F62?D^G;Q!Tm%i1fHT_dC7nEv}c$5o%Cvd zgAc9j86ISmuL!nqlU1GS)Q5X>b?E)RWx67UfNU2d;bo0VcDez64^Glk+2sjn`mI={ zk>c=0@`s!ZtB9NPp`*r~1~gYN4NPUxUuB@_K(K)mGA*AWRYC0kV6!be>t&L$tmp#B zsM0b{cQYmz{_X)d^U8i=xCW+cvcX4vi`*am@A1uBeaff$J z!__k~pF?O*Jc^#>Ra>;2O!ft&>$ zwaJw+<3AZq6pApJe4E{+%BkS6#1)*9fmJY^Uu&#J$OwE0{EC=1^|LMH{#BFL6pV9{ zIk$y8Gt;<0&SNZLlML&btG$|Yw9A-&^!G4{g~@9dBUA|sA9BqcAIGAwyf%ZGA4i-o zKwkOzOe^i+hpm#U3}Ek&GDgLisuHk^p}QpZG2TAHBcYo$6vn?Ckb!ABmmPbTz_m$-B;IfP94{}(cYem+K$SnS&tGzluhRgS#E$Im_ID>lj zDRacO+Yh3?3}+%St*<50^(vg*!@7wGX)2C_hmMgBbygFIjWydt7{|L!<^t{5N6F)rdDt}&yZg|!0a==~p z{OY4n#8u*y*Fw_VD&mMW^p}1XgvjqI;bHT0b}>f3xh$~0N2&A0bQ@voE6M=cKt;h6B(!VV6JIXAt|WjfT;uU@Hosrn*y&GJxix~;7T{j|9!XNNrF=YLI?8^QWgzdm7P{G3;m>Bf>Wghx$99R8C7S+8WxDZ35eT~mL?S;{LKd_^_c`n|!#CsJrC zc;yp*RzO?MCH6kH>za`AnW#LM9Q^f2FyoOs%DNZVugE=>bM1yb7lio(MUSKX05LP3 zr;KsvgKnCJKL()mE#A9(0TMpV;ODqj%ZTq;PBC$z95Zw3Q5H?lGw4fVRI2{rb3kCq zp}97ccf_DBA+2UX@+czTwkNEdtz)$-*l|Zy_yE|N~7u7 zNyNst4UV=$;}?2Uih7)~q2g}X=}S0wi#26vin)o}3&ackYWS=KT~RqN7>IdU94ODD z#Ox!V8!cV>!+kVsQBLIfdt>;UkKsoS=DJ9*j2&(^iG9w)kZ2U3By?|?{JSZ%Swj^2 zOB2nU{1Uf(gx}YEc;~!B8OU;6(b_{VJ-;#kGl8_n^u>N1-448@R&Um*J8B#fg^yyl z%73yEnwgM)H)%U)@_xaQ{R$g#c8^ET zyTv)=EAT{5fB(Zi|9RoYNln^Oca68LNq_|S>z70dZjjj661MI27iH}B<~vge<^#e~ zqnW?Wp+e!pGc4&s?(mGe_h?}slzuVBp6k);lM5CZi?)|C8cd+rT4@{NgLIQMyLMC= zhti<$*DA@8X9m=BP}$Km$KPyF)#;w$8&g__xe4vCx>$Yrd_*yNoDZU3|X?` z0bqk-cy+jJB_`nu8fyh(I~<}6K|**Ghz$dY^n8k3Qlk}xQ-Pm6RL0UJ1<7m!@%2ZFK6nfBTUQ^n^P7S zWYYICCaW&qUw315ixqnX(-kF7W#dShss&PL0-&|WQ{d4LaE7omW;hkdx2L`j!v!Vk zxS6h~ym4el|MzpgySLbkN{LqDnUCuGb2g1vo<198XqPE-g~9gX2maT4OU}vq`}x~D z-HYv z{SS{4d*!!B>B7*|`_Xh^-nINq?YLfYx=58mO3JxyN;5Ixih+aM7TjKurD#}Y))()q zVS3&8oA+-i47CmBtb46^SXfY;j?>I}x{UdqI)#2 zW_9L+PpDU-cN;Atb!xa99BAG!Rur<}*rzWMKal&#h8tTa6{KKwY8zzI>87tb9BN4kr zvP}oJ=d_ehQ{6xw(l>=76UrUkO<#C^?rjSf+h0)+`_YF4Z+aKypKfYxkz7m`uyX&F zZex9AVti?nuS`>N-?ub5-|$D5);_qsz5ZdAEum7UZQ2aOr&%4z!B~lhL@sC5WTh}Q zQYks>b}{T$&?Mgz=|c2feruPct=mx{wp1#5@DhF2(XGYj4Ke46q_i>8r@B*-a-@{8 zUGg#&FS7_gzl#1hM`uNNkB#ULSOYr#*a0gfQmKw_LhFyE&$t#v#iB3Udj0$u(rIld z^vzA2+9NM&iF8MQ1%Jf!|Luc%zGNZ4fV%IdV-myB+W_nvE@q!-?+~a`Li8cbK0d?F zhFBHfjpNvJ#@O(5H5uJsY=U1dQnlWjJqm6L@2wC=^m$)$AHj3DGaDYd_g;t}CrK{!BT%)*Qvn(s$tk(5y8}Ey^*b|JUFMrBc9%S zcWU%N8_!mAG~GaiEpuzX_|j5p{zCx3C_l^1KJ?FXb$=D~>FF5p4x*KshxzE4iFj>Q zLC9Fvua^1!LOHca=2pgS6^t24w+>w+lC9X~gu|r)oXaRpst& zte19tcDY(h+=g@q-nV% KXaqMNg;!L+({7So&oGdQZ#e?gFg-l;csw~sf-o3p# zvntd5830wIb?bxE9tQ|El_=u)56ar&pE%LTUt^i8T9`Jd6M>%@qBwUt;MnO#U{wh# zAm6ZhTP8d4V2HRV?zThNy*MVZwhc0j5nx$J)3(^Y`-}C8al88&jHVxEC5U87X&&NJ zjcmhNv_@Eo-(pAxZ$>`W;!d**aP+INLa!}!+=|$c^n+MD=Z=_;$J{Tl?L&Sn`ANRn zngzJB6oT|VReSZ~J`7zRr3&x&*&j|W273J9C*p8N+R;D}EncUp69dIu4FYf5ospK_ zrWhBlL)gKTLLc^azvv0fBo$wLKkH195Bhk;DwvE6@Zclr6 z$kC&wqAxJMkLo1AmQ3!gI2EpgfVy@M=O%@Et!nu5_Pd9~McY(|P&y?Y#$) zlCzk9`h&G0ZfgVb2~CgUl!fhcxk$u(=bDa7d0Oy2f%|8X<-(>TCpS9W8_c9-DfxM^ zk$Q~}ox6+hh^=v_uv^z_gK-&ezaw*DUJhrcOS zc5cSg!ajz_AT;(}BFtZeRRVB5qHyTBK5)#XeQ%NiK%hz%omv z^wYh%;09In=0U{y=<3uuP&3r3jOt428S|b-duP60d{?wQqYL~^eBD${oKmR0H*og$ zRbgi=2h#-XZiu3ZifvQKIMCl=pvfbnHxBbr0Y*_4Tg!|PS!B1?N(2XTRHkYYe`vi+ z8Z&$PIuM`#{k*==cu*WQ9E~~5E8A$n$7m9(!X@i_@?}<`bp8?Iu7~{;gB(FhBh+q5 zViASmpxADGd`PwK}p?d6D0bRQC$Mn`z3maw`#u<(It$ z)z6Ix9J&sRQujY`3O=2__`se-=n?2|(h$2%J0J521gh%L)cWade7^KM4Vc!s1pkc? zaj=rT2L3);8?gHHispQH=@%wc>YiTknY!31Ek2ENT$oI7<$(;osIf}|$ZHys5Yzgw zXMe`XfynhvPbu!SaigjY+uf19jtVUcWW1(3C+A}sj5Jw@Tj;Y7!~#L4W;=;QRH7eJ zedNa_gurt#r(2&6fb7feWA#-YAr+KxVq}bH+Eban)6Y$PzM47$tvMoAkkJAcTDpQU z$ATtzJyi`9455PjQVgP|YR#uC6V4JLQ5;W)6IG%a?pggMJY#1M_9ksrPE#QFTj@VHS3odhHlWAs&q1M z?ymCsoaY(EaeJsd?-s?k6)4^cX*hD=-?mv(sWVC}@CrXQ4|p{^$Io-O55DuLyH-?{ zI1xEsokm%rudghjIIhrLRJi?O;x_?#H~wq>fvnZ-D3?NIvI*njR)jScvSl-F+?1?c zax@ONTJaGxqq))WP;Bj=KHq*3{um+iXWVNxC}1?G zSmwsK(`x%f_VUDmxqW)KehQ3bQJDnVsGlk)#(SllWKNeH$SptJg4E&Cmuk|a3#miw zJ?pDjW&E9Ux8JI9J;TvP37#Pl7v|n?FmPJ13A(n!IW|*Lm*|gP&GH~Uk9{-rV(k}| zqFdJWPw$HFmz@T_d|6m7CyfKWO8Xg*wBgK-r*J`ZS(i`#Q79jYfqjtg+8x6@fjEQg*TQJ7OgsMRdMF}_5-bz5#aJRcCwmYpVA%f1&S4=Od=?$ z2B+>EcWA*iG1z4ot_Z(&d)Xg4`hpn+8)UqC`1|q*y2ZC@iB?9wpT?l=r{A`S zhZ0foPJInv^s;@zjwe9l$+6gfcVW)^&ktMvT$r_&h=9c8E3R}!;%#C3ie zhQDPXiI+yC{qW70P?`WwjWki3gvBk9kA|-ibCUWj6qUf?}qV0m}l!A0TTyh1PZbL4JYsl|@ zr?sw6PO7gzj<EK^T!%LsHm zK=OCF<(XVn$d+n>c;MGz>9V)q(tQWMQ#J)H(`_{u>1K2bkH>R=C-D|aT*U3 zaZhiidY@Yw3RrK7lRG)1Q+d>$+FxAwM68%;{l4krHE=?g*`0L|d3^q<1a#+ULW*2{ z-HUE#BXo<6dO<1QW$k7hLilaTGssA<2Z2Z({kfH)731`kCEU@COn$6CB81&OnamW=M*$BGH9%RiiJ3-s3S=$tXNoR(5J6W)>~)Y37=n zM7|%0uagJdaoxA6ymgz{TK75K9bc3n@^@fc0mw%OZf>RI*1jdD_0+uy>2@w!wNFl6 z95hqAzqf941Nx~+d`_=U?K>oQDXC?Q@&Az2SH`_P@!4*H7BbdpY03Avb{@MtHt*FP zjG{C>G@Eu_QF#=9OFwo2otBFn+%nVO$Zs%I?x^7^`=t2g%TdCtZ`ulRMX#J$`>+=R z-54}Obo(6>Iclkb4Y70I(xh8p^L#$9`Sb_Lwflu_#Eio zwJa?TVN82qA3 z3%vu)X@4{1j_~2h9{+5|xfzqfE!<4uaWla!FA2Z8#ty4M9lMQV*h}}S8_*8N&93=f z1x5AVj!p47bk(v3TzZF;NL@gQpgntc=QO?p45HjF=>T7q}$ z7azvYx!2a*tQs_&5G(Sz>b2;Omewxhl{dMe%M#uD7tb+|N@Og^py{47nR$ z;a*sktta)LC|#V7wb_OfH_UPtxfW}K)>mHMk!#vqHdXD?#*NA$!_EXE(W`4ZiGH)x}TtNvUi@yf@K$&aida)hN z@?VRHgQR~l^^7D6T%-3AkS^?PwTl&0h%zwRII%@_UPMNc9t{0X#H_;_V4KzKUO=+u zIu|QHB63gd6$dij>XkEzsV+unx}i};k)Be}iwRL0O+2Q@Z|+=i5)X$tj)AlcFV-o8 zlY7!~-^xvlbHMbs$%ogqA3EPb@!39UAD!5}g{SI%;`M{6Bhww1hOku>s98hhp4m3u z$=fxSUcW}$vUHQV!&WC4+QVuVP5(W+R08{u!}O-jKR3ZiWvlcgK}p6Jc_W(YqX4Wb z7AoZg!W&?{K6miIJ#e!gSsR;+^+gwK8Ly)D)AhTkjROQTvM@88z|~uHK=uA_HqsX} zff=wpwf9CXiqX%KG{CM!1viQDeQt~-68;~uMU9W+eK&cI-_vplV=la{hf1A3P{U34 zNjz?m1Fb*)xlf)JY<%LaT$Pl*bR+>nKSKz7@r&)2gqdH(aEs>5s_H)FUymjEPv|I_Q&8I1W0>kn(6(;fN{}+G;fBCB9rFas+PrkN;!jGJMxl6kU-#y25C^s@t)3>NP z?abk0E3M%8ACLMMK~Zr;&o>fM&wCveas1VYj02?ac19vZV-bU>e{>8dHB%UL`?h?K z5(RTBNt-W;|Iqwex2!`HRw!-1?wC*GYk~ib-OE{g_i+!3?&ILzlmDh*kAS0b1(*6= zMYLr__hggv4f3S@he&@HhAF%`N&4ua%3H>U%%#R}r6u##DHy3I)drII7cI{V)J~<) zV2~KUbC8DDyqO*TH7o+R^w%s+=26gkCtB&JfVt6vTQ=cD?D*@xvGYYZ2%`so5*<}n zP72{D2HQteYw%+pZa zKZ_M8_;a6ajLB*-T{mmK8jUxWrfHrugU0%O(*_6!);L9N46GDTe^>SQtauUY20otn zgVa@~*=1y2DUbB4XI_*ia4`GV&rE9G1*% zYpr@LPtN_8Fnaw%0};u$LXVCr=CPyv?Aac|ACJYC`?JV;)MnMSJ&_D5b-zD%C%z(D z;|G?Ke22UGM@AV^DBz4=xsWi5gYkz~R+9Xs z8qXf+^c7H=IcBQ!CLY`P$ZbnBIb_~TG%6=LvYxBtJu8#sZ*_LmqEe!>xU?Y@Ik)1b zwa-{mr|Wi?jT$tGe`!eQcypD)ucUY<3CVZzgA%GBlGHt-$8vC=2=kI>o}1bP^!e1L zNk8$}-|y4cOL$dB6@7X?kA-b~AA7x(M&`-?D(zlS=({1ApE-rX!C5obNr(@NDpX!- zrA7SRQuD^!k0^}m*pqULaA=tQf*-#fM4Yj{&>9p==Jaki>vPjYuz$Djr1gpC8+q*> z`-wxvx)oRa+*y>m{yHoBgNECSW3v06Q@AS0?PA7Ja45Q{k>4hTg0x4;oA@&Alb0TgLl2DiQxS@3-PxZ&L5lhQz6@`W$-7Bg$Rt zc#L^HF@}>7F*ekq@m`#WuhK{B3)YEHZ=ZSn8S$`Rw8mz!42Q!@!aOxiSeTD6=upj} zvE@&LomU8d&mBMa=X}yY3&G z6k=YQFMdSs30fAeSdm5{s5s|Jb3ctskBr^#)w1~8URz?BPWtzfYYg*CfQhzm!v^wu zc9>QySD7xNW9qKbKfdr_r!h7*S{y73DV(%mFud->46Xm`vW~jcMfAFSTUhK5GG`qI zWjY69C^*V&(LLQuW1CZU*wZg8TAp8O^La}AVBFqqb7zpe*%$uhOYSMGT_WR7`mM9; zRnagf9#`ij`>7E9$VeJoRpMz3^sksVJb^}7NYy((OA6&H=l1O-FWs#Fs1{7%+?ng}=AU8BHbsAJSeHSq0yxkfNrvcy%~~sXFQb z`v`vo|DC2H@t1!X+-kZ{^rN%P)WePN=cCr1g%b&Xjzw$yvLL?df6pov$qFDKJTF0T ZaAj^}Wn@HQbYVUUJTF#MOGasIWj^xqge3p~ literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000180_celldata.vtu b/previews/PR1693/tutorials/out/solution_000180_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 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 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/parabolic_terms/f848ac8c.svg b/previews/PR1693/tutorials/parabolic_terms/f848ac8c.svg new file mode 100644 index 00000000000..5e6122cb00b --- /dev/null +++ b/previews/PR1693/tutorials/parabolic_terms/f848ac8c.svg @@ -0,0 +1,731 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/parabolic_terms/index.html b/previews/PR1693/tutorials/parabolic_terms/index.html new file mode 100644 index 00000000000..599285aa8e1 --- /dev/null +++ b/previews/PR1693/tutorials/parabolic_terms/index.html @@ -0,0 +1,130 @@ + +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
    +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))
    +
    +boundary_conditions_hyperbolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1 + 0.5 * x[2])),
    +                                    y_neg = boundary_condition_zero_dirichlet,
    +                                    y_pos = boundary_condition_do_nothing,
    +                                    x_pos = boundary_condition_do_nothing)
    +
    +boundary_conditions_parabolic = (; x_neg = BoundaryConditionDirichlet((x, t, equations) -> SVector(1 + 0.5 * x[2])),
    +                                   y_neg = boundary_condition_zero_dirichlet,
    +                                   y_pos = boundary_condition_zero_dirichlet,
    +                                   x_pos = boundary_condition_zero_dirichlet);

    Defining the solver and mesh

    The process of creating the DG solver and mesh is the same as for a purely hyperbolic system of equations.

    solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)
    +coordinates_min = (-1.0, -1.0) # minimum coordinates (min(x), min(y))
    +coordinates_max = ( 1.0,  1.0) # maximum coordinates (max(x), max(y))
    +mesh = TreeMesh(coordinates_min, coordinates_max,
    +                initial_refinement_level=4,
    +                periodicity=false, n_cells_max=30_000) # set maximum capacity of tree data structure
    +
    +initial_condition = (x, t, equations) -> SVector(0.0);

    Semidiscretizing and solving

    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.

    semi = SemidiscretizationHyperbolicParabolic(mesh,
    +                                             (equations_hyperbolic, equations_parabolic),
    +                                             initial_condition, solver;
    +                                             boundary_conditions=(boundary_conditions_hyperbolic,
    +                                                                  boundary_conditions_parabolic))
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ SemidiscretizationHyperbolicParabolic                                                            │
    +│ ═════════════════════════════════════                                                            │
    +│ #spatial dimensions: ………………………… 2                                                                │
    +│ mesh: ………………………………………………………………… TreeMesh{2, Trixi.SerialTree{2}} with length 341                 │
    +│ hyperbolic equations: ……………………… LinearScalarAdvectionEquation2D                                  │
    +│ parabolic equations: ………………………… LaplaceDiffusion2D                                               │
    +│ initial condition: ……………………………… #7                                                               │
    +│ source terms: …………………………………………… nothing                                                          │
    +│ solver: …………………………………………………………… DG                                                               │
    +│ parabolic solver: ………………………………… ViscousFormulationBassiRebay1                                    │
    +│ total #DOFs per field: …………………… 4096                                                             │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    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.

    tspan = (0.0, 1.5)
    +ode = semidiscretize(semi, tspan)
    +callbacks = CallbackSet(SummaryCallback())
    +time_int_tol = 1.0e-6
    +sol = solve(ode, RDPK3SpFSAL49(); abstol=time_int_tol, reltol=time_int_tol,
    +            ode_default_options()..., callback=callbacks);
    
    +████████╗██████╗ ██╗██╗  ██╗██╗
    +╚══██╔══╝██╔══██╗██║╚██╗██╔╝██║
    +   ██║   ██████╔╝██║ ╚███╔╝ ██║
    +   ██║   ██╔══██╗██║ ██╔██╗ ██║
    +   ██║   ██║  ██║██║██╔╝ ██╗██║
    +   ╚═╝   ╚═╝  ╚═╝╚═╝╚═╝  ╚═╝╚═╝
    +
    +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ SemidiscretizationHyperbolicParabolic                                                            │
    +│ ═════════════════════════════════════                                                            │
    +│ #spatial dimensions: ………………………… 2                                                                │
    +│ mesh: ………………………………………………………………… TreeMesh{2, Trixi.SerialTree{2}} with length 341                 │
    +│ hyperbolic equations: ……………………… LinearScalarAdvectionEquation2D                                  │
    +│ parabolic equations: ………………………… LaplaceDiffusion2D                                               │
    +│ initial condition: ……………………………… #7                                                               │
    +│ source terms: …………………………………………… nothing                                                          │
    +│ solver: …………………………………………………………… DG                                                               │
    +│ parabolic solver: ………………………………… ViscousFormulationBassiRebay1                                    │
    +│ total #DOFs per field: …………………… 4096                                                             │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘
    +
    +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ TreeMesh{2, Trixi.SerialTree{2}}                                                                 │
    +│ ════════════════════════════════                                                                 │
    +│ center: …………………………………………………………… [0.0, 0.0]                                                       │
    +│ length: …………………………………………………………… 2.0                                                              │
    +│ periodicity: ……………………………………………… (false, false)                                                   │
    +│ current #cells: ……………………………………… 341                                                              │
    +│ #leaf-cells: ……………………………………………… 256                                                              │
    +│ maximum #cells: ……………………………………… 30000                                                            │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘
    +
    +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ LinearScalarAdvectionEquation2D                                                                  │
    +│ ═══════════════════════════════                                                                  │
    +│ #variables: ………………………………………………… 1                                                                │
    +│ │ variable 1: …………………………………………… scalar                                                           │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘
    +
    +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ DG{Float64}                                                                                      │
    +│ ═══════════                                                                                      │
    +│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
    +│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
    +│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
    +│ │ surface flux: ……………………………………… FluxLaxFriedrichs(max_abs_speed_naive)                           │
    +│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘
    +
    +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ Time integration                                                                                 │
    +│ ════════════════                                                                                 │
    +│ Start time: ………………………………………………… 0.0                                                              │
    +│ Final time: ………………………………………………… 1.5                                                              │
    +│ time integrator: …………………………………… RDPK3SpFSAL49                                                    │
    +│ adaptive: ……………………………………………………… true                                                             │
    +│ abstol: …………………………………………………………… 1.0e-6                                                           │
    +│ reltol: …………………………………………………………… 1.0e-6                                                           │
    +│ controller: ………………………………………………… PIDController(beta=[0.38, -0.18,…iter=default_dt_factor_limiter) │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘
    +┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ Environment information                                                                          │
    +│ ═══════════════════════                                                                          │
    +│ #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
    +versioninfo()
    +
    +using Pkg
    +Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
    +           mode=PKGMODE_MANIFEST)
    Julia Version 1.9.3
    +Commit bed2cd540a1 (2023-08-24 14:43 UTC)
    +Build Info:
    +  Official https://julialang.org/ release
    +Platform Info:
    +  OS: Linux (x86_64-linux-gnu)
    +  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
    +  WORD_SIZE: 64
    +  LIBM: libopenlibm
    +  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
    +  Threads: 1 on 2 virtual cores
    +Environment:
    +  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
    +Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
    +  [1dea7af3] OrdinaryDiffEq v6.58.0
    +  [91a5bcdd] Plots v1.39.0
    +  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

    This page was generated using Literate.jl.

    diff --git a/previews/PR1693/tutorials/scalar_linear_advection_1d/1583df04.svg b/previews/PR1693/tutorials/scalar_linear_advection_1d/1583df04.svg new file mode 100644 index 00000000000..b6984d38dcd --- /dev/null +++ b/previews/PR1693/tutorials/scalar_linear_advection_1d/1583df04.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/scalar_linear_advection_1d/1b24f61e.svg b/previews/PR1693/tutorials/scalar_linear_advection_1d/1b24f61e.svg new file mode 100644 index 00000000000..1c3c1137ba8 --- /dev/null +++ b/previews/PR1693/tutorials/scalar_linear_advection_1d/1b24f61e.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/scalar_linear_advection_1d/79ffa393.svg b/previews/PR1693/tutorials/scalar_linear_advection_1d/79ffa393.svg new file mode 100644 index 00000000000..913aa80f21a --- /dev/null +++ b/previews/PR1693/tutorials/scalar_linear_advection_1d/79ffa393.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/scalar_linear_advection_1d/9a1666e7.svg b/previews/PR1693/tutorials/scalar_linear_advection_1d/9a1666e7.svg new file mode 100644 index 00000000000..b89ba90e10b --- /dev/null +++ b/previews/PR1693/tutorials/scalar_linear_advection_1d/9a1666e7.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/scalar_linear_advection_1d/a25b2fa9.svg b/previews/PR1693/tutorials/scalar_linear_advection_1d/a25b2fa9.svg new file mode 100644 index 00000000000..c37e11e7b80 --- /dev/null +++ b/previews/PR1693/tutorials/scalar_linear_advection_1d/a25b2fa9.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/scalar_linear_advection_1d/f04cc793.svg b/previews/PR1693/tutorials/scalar_linear_advection_1d/f04cc793.svg new file mode 100644 index 00000000000..a7ec5cb8b46 --- /dev/null +++ b/previews/PR1693/tutorials/scalar_linear_advection_1d/f04cc793.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/scalar_linear_advection_1d/index.html b/previews/PR1693/tutorials/scalar_linear_advection_1d/index.html new file mode 100644 index 00000000000..99994063b6e --- /dev/null +++ b/previews/PR1693/tutorials/scalar_linear_advection_1d/index.html @@ -0,0 +1,294 @@ + +1 Introduction to DG methods · Trixi.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
    +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*} +u &= u(x(\xi), t) \\ +u_x &= u_\xi \frac{d\xi}{dx} \\[3pt] +\frac{d\xi}{dx} &= (x_\xi)^{-1} = \frac{2}{dx} =: J^{-1}. \\ +\end{align*}\]

    Here, $J$ is the Jacobian determinant of the transformation.

    Using this transformation, we can transform our equation for each element $Q_l$.

    \[\frac{dx}{2} u_t^{Q_l} + u_\xi^{Q_l} = 0 \text{, for }t\in\mathbb{R}^+,\; \xi\in[-1, 1]\]

    Here, $u_t^{Q_l}$ and $u_\xi^{Q_l}$ denote the time and spatial derivatives of the solution on the element $Q_l$.

    ii. Polynomial approach

    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 $\xi\in[-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.

    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

    \[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)\]

    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.

    \[l_j(\xi_i) = \delta_{i,j} = +\begin{cases} +1, & \text{if } i=j \\ +0, & \text{else.} +\end{cases}\]

    Because of this property, the polynomial coefficients are exact the values of $u^{Q_l}$ at the nodes

    \[u^{Q_l}(\xi_i, t) = \sum_{j=0}^N u_j^{Q_l}(t) \underbrace{l_j(\xi_i)}_{=\delta_{ij}} = u_i^{Q_l}(t).\]

    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.

    using Trixi
    +polydeg = 3 #= polynomial degree = N =#
    +basis = LobattoLegendreBasis(polydeg)
    LobattoLegendreBasis{Float64} with polynomials of degree 3

    The Gauss-Lobatto nodes are

    nodes = basis.nodes
    4-element SVector{4, Float64} with indices SOneTo(4):
    + -1.0
    + -0.4472135954999579
    +  0.4472135954999579
    +  1.0

    with the corresponding weights

    weights = basis.weights
    4-element SVector{4, Float64} with indices SOneTo(4):
    + 0.16666666666666666
    + 0.8333333333333334
    + 0.8333333333333334
    + 0.16666666666666666

    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

    \[\begin{align*} +\int_{-1}^1 f(x) dx &= \int_{-1}^1 \Big( \sum_{j=0}^3 f(\xi_j)l_j(x) \Big) dx += \sum_{j=0}^3 f(\xi_j) \int_{-1}^1 l_j(x)dx \\ +&=: \sum_{j=0}^3 f(\xi_j) w_j += \sum_{j=0}^3 \xi_j^3 w_j +\end{align*}\]

    Let's use our nodes and weights for $N=3$ and plug in

    integral = sum(nodes.^3 .* weights)
    0.0

    Using this polynomial approach leads to the equation

    \[\frac{dx}{2} \dot{u}^{Q_l}(\xi, t) + u^{Q_l}(\xi, t)' = 0\]

    with $\dot{u}=\frac{\partial}{\partial t}u$ and $u'=\frac{\partial}{\partial x}u$. To approximate the solution, we need to get the polynomial coefficients $\{u_j^{Q_l}\}_{j=0}^N$ for every element $Q_l$.

    After defining all nodes, we can implement the spatial coordinate $x$ and its initial value $u0$ for every node.

    x = Matrix{Float64}(undef, length(nodes), n_elements)
    +for element in 1:n_elements
    +    x_l = coordinates_min + (element - 1) * dx + dx/2
    +    for i in 1:length(nodes)
    +        ξ = nodes[i] # nodes in [-1, 1]
    +        x[i, element] = x_l + dx/2 * ξ
    +    end
    +end
    +
    +u0 = initial_condition_sine_wave.(x)
    4×16 Matrix{Float64}:
    + 1.0       0.808658  0.646447  …  1.5      1.46194  1.35355  1.19134
    + 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*} +\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*} +\frac{dx}{2} \int_{-1}^1 \dot{u}(\xi, t) l_i(\xi)d\xi +&\approx \frac{dx}{2} \int_{-1, N}^1 \dot{u}(\xi, t) l_i(\xi)d\xi \\ +&= \frac{dx}{2} \sum_{k=0}^N \underbrace{\dot{u}(\xi_k, t)}_{=\dot{u}_k(t)} \underbrace{l_i(\xi_k)}_{=\delta_{k,i}}w_k \\ +&= \frac{dx}{2} \dot{u}_i(t) w_i +\end{align*}\]

    We define the Legendre-Gauss-Lobatto (LGL) mass matrix $M$ and by the Kronecker property follows:

    \[M_{ij} = \langle l_j, l_i\rangle_N = \delta_{ij} w_j,\; i,j=0,...,N.\]

    using LinearAlgebra
    +M = diagm(weights)
    4×4 StaticArraysCore.SMatrix{4, 4, Float64, 16} with indices SOneTo(4)×SOneTo(4):
    + 0.166667  0.0       0.0       0.0
    + 0.0       0.833333  0.0       0.0
    + 0.0       0.0       0.833333  0.0
    + 0.0       0.0       0.0       0.166667

    Now, we can write the integral with this new matrix.

    \[\frac{dx}{2} \int_{-1, N}^1 \dot{u}(\xi, t) \underline{l}(\xi)d\xi = \frac{dx}{2} M \underline{\dot{u}}(t),\]

    where $\underline{\dot{u}} = (\dot{u}_0, ..., \dot{u}_N)^T$ and $\underline{l}$ respectively.

    Note: Since the LGL quadrature with $N+1$ nodes is exact up to functions of degree $2N-1$ and $\dot{u}(\xi, t) l_i(\xi)$ is of degree $2N$, in general the following holds

    \[\int_{-1}^1 \dot{u}(\xi, t) l_i(\xi) d\xi \neq \int_{-1, N}^1 \dot{u}(\xi, t) l_i(\xi) d\xi.\]

    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.

    Term II:

    We use spatial partial integration for the second term:

    \[\int_{-1}^1 u'(\xi, t) l_i(\xi) d\xi = [u l_i]_{-1}^1 - \int_{-1}^1 u l_i'd\xi\]

    The resulting integral can be solved exactly with LGL quadrature since the polynomial is now of degree $2N-1$.

    Again, we split the calculation in two steps.

    Surface term

    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.

    \[[u l_i]_{-1}^1 = u^*\big|^1 l_i(+1) - u^*\big|_{-1} l_i(-1)\]

    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)$.

    \[[u \underline{l}]_{-1}^1 = u^*\big|^1 \left(\begin{array}{c} 0 \\ \vdots \\ 0 \\ 1 \end{array}\right) +- u^*\big|_{-1} \left(\begin{array}{c} 1 \\ 0 \\ \vdots \\ 0\end{array}\right) += B \underline{u}^*(t)\]

    with the boundary matrix

    \[B = \begin{pmatrix} +-1 & 0 & \cdots & 0\\ +0 & 0 & \cdots & 0\\ +\vdots & \vdots & 0 & 0\\ +0 & \cdots & 0 & 1 +\end{pmatrix} +\qquad\text{and}\qquad +\underline{u}^*(t) = \left(\begin{array}{c} u^*\big|_{-1} \\ 0 \\ \vdots \\ 0 \\ u^*\big|^1\end{array}\right).\]

    B = diagm([-1; zeros(polydeg - 1); 1])
    4×4 Matrix{Float64}:
    + -1.0  0.0  0.0  0.0
    +  0.0  0.0  0.0  0.0
    +  0.0  0.0  0.0  0.0
    +  0.0  0.0  0.0  1.0

    Volume term

    As mentioned before, the new integral can be solved exact since the function inside is of degree $2N-1$.

    \[- \int_{-1}^1 u l_i'd\xi = - \int_{-1, N}^1 u l_i' d\xi += - \sum_{k=0}^N u(\xi_k, t) l_i'(\xi_k) w_k += - \sum_{k=0}^N u_k(t) D_{ki} w_k\]

    where $D$ is the derivative matrix defined by $D_{ki} = l_i'(\xi_k)$ for $i,k=0,...,N$.

    D = basis.derivative_matrix
    4×4 Matrix{Float64}:
    + -3.0        4.04508  -1.54508   0.5
    + -0.809017   0.0       1.11803  -0.309017
    +  0.309017  -1.11803   0.0       0.809017
    + -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) +\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
    +    du .= zero(eltype(du))
    +    flux_numerical = copy(du)
    +
    +    # Calculate interface and boundary fluxes, $u^* = (u^*|_{-1}, 0, ..., 0, u^*|^1)^T$
    +    # Since we use the flux Lax-Friedrichs from Trixi.jl, we have to pass some extra arguments.
    +    # Trixi.jl needs the equation we are dealing with and an additional `1`, that indicates the
    +    # first coordinate direction.
    +    equations = LinearScalarAdvectionEquation1D(1.0)
    +    for element in 2:n_elements-1
    +        # left interface
    +        flux_numerical[1, element] = surface_flux(u[end, element-1], u[1, element], 1, equations)
    +        flux_numerical[end, element-1] = flux_numerical[1, element]
    +        # right interface
    +        flux_numerical[end, element] = surface_flux(u[end, element], u[1, element+1], 1, equations)
    +        flux_numerical[1, element+1] = flux_numerical[end, element]
    +    end
    +    # boundary flux
    +    flux_numerical[1, 1] = surface_flux(u[end, end], u[1, 1], 1, equations)
    +    flux_numerical[end, end] = flux_numerical[1, 1]
    +
    +    # Calculate surface integrals, $- M^{-1} * B * u^*$
    +    for element in 1:n_elements
    +        du[:, element] -= (M \ B) * flux_numerical[:, element]
    +    end
    +
    +    # Calculate volume integral, $+ M^{-1} * D^T * M * u$
    +    for element in 1:n_elements
    +        flux = u[:, element]
    +        du[:, element] += (M \ transpose(D)) * M * flux
    +    end
    +
    +    # Apply Jacobian from mapping to reference element
    +    for element in 1:n_elements
    +        du[:, element] *= 2 / dx
    +    end
    +
    +    return nothing
    +end
    rhs! (generic function with 1 method)

    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.

    using OrdinaryDiffEq
    +tspan = (0.0, 2.0)
    +ode = ODEProblem(rhs!, u0, tspan, x)
    +
    +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
    +equations = LinearScalarAdvectionEquation1D(advection_velocity)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ LinearScalarAdvectionEquation1D                                                                  │
    +│ ═══════════════════════════════                                                                  │
    +│ #variables: ………………………………………………… 1                                                                │
    +│ │ variable 1: …………………………………………… scalar                                                           │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    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.

    solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ DG{Float64}                                                                                      │
    +│ ═══════════                                                                                      │
    +│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
    +│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
    +│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
    +│ │ surface flux: ……………………………………… FluxLaxFriedrichs(max_abs_speed_naive)                           │
    +│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    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.

    coordinates_min = -1.0 # minimum coordinate
    +coordinates_max = 1.0  # maximum coordinate
    +mesh = TreeMesh(coordinates_min, coordinates_max,
    +                initial_refinement_level=4, # number of elements = 2^4
    +                n_cells_max=30_000) # set maximum capacity of tree data structure (only needed for AMR)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ TreeMesh{1, Trixi.SerialTree{1}}                                                                 │
    +│ ════════════════════════════════                                                                 │
    +│ center: …………………………………………………………… [0.0]                                                            │
    +│ length: …………………………………………………………… 2.0                                                              │
    +│ periodicity: ……………………………………………… (true,)                                                          │
    +│ current #cells: ……………………………………… 31                                                               │
    +│ #leaf-cells: ……………………………………………… 16                                                               │
    +│ maximum #cells: ……………………………………… 30000                                                            │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    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.

    initial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))
    +
    +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ SemidiscretizationHyperbolic                                                                     │
    +│ ════════════════════════════                                                                     │
    +│ #spatial dimensions: ………………………… 1                                                                │
    +│ mesh: ………………………………………………………………… TreeMesh{1, Trixi.SerialTree{1}} with length 31                  │
    +│ equations: …………………………………………………… LinearScalarAdvectionEquation1D                                  │
    +│ initial condition: ……………………………… initial_condition_sine_wave                                      │
    +│ boundary conditions: ………………………… Trixi.BoundaryConditionPeriodic                                  │
    +│ source terms: …………………………………………… nothing                                                          │
    +│ solver: …………………………………………………………… DG                                                               │
    +│ total #DOFs per field: …………………… 64                                                               │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    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
    +using Trixi, LinearAlgebra, OrdinaryDiffEq, Plots
    +polydeg = 3 #= polynomial degree =#
    +basis = LobattoLegendreBasis(polydeg)
    +nodes = basis.nodes # Gauss-Lobatto nodes in [-1, 1]
    +D = basis.derivative_matrix
    +M = diagm(basis.weights) # mass matrix
    +B = diagm([-1; zeros(polydeg - 1); 1])
    +
    +# mesh
    +coordinates_min = -1.0 # minimum coordinate
    +coordinates_max = 1.0  # maximum coordinate
    +n_elements      = 16   # number of elements
    +
    +dx = (coordinates_max - coordinates_min) / n_elements # length of one element
    +
    +x = Matrix{Float64}(undef, length(nodes), n_elements)
    +for element in 1:n_elements
    +    x_l = -1 + (element - 1) * dx + dx/2
    +    for i in 1:length(nodes) # basis points in [-1, 1]
    +        ξ = nodes[i]
    +        x[i, element] = x_l + dx/2 * ξ
    +    end
    +end
    +
    +# initial condition
    +initial_condition_sine_wave(x) = 1.0 + 0.5 * sin(pi * x)
    +u0 = initial_condition_sine_wave.(x)
    +
    +plot(vec(x), vec(u0), label="initial condition", legend=:topleft)
    +
    +# flux Lax-Friedrichs
    +surface_flux = flux_lax_friedrichs
    +
    +# rhs! method
    +function rhs!(du, u, x, t)
    +    # reset du
    +    du .= zero(eltype(du))
    +    flux_numerical = copy(du)
    +
    +    # calculate interface and boundary fluxes
    +    equations = LinearScalarAdvectionEquation1D(1.0)
    +    for element in 2:n_elements-1
    +        # left interface
    +        flux_numerical[1, element] = surface_flux(u[end, element-1], u[1, element], 1, equations)
    +        flux_numerical[end, element-1] = flux_numerical[1, element]
    +        # right interface
    +        flux_numerical[end, element] = surface_flux(u[end, element], u[1, element+1], 1, equations)
    +        flux_numerical[1, element+1] = flux_numerical[end, element]
    +    end
    +    # boundary flux
    +    flux_numerical[1, 1] = surface_flux(u[end, end], u[1, 1], 1, equations)
    +    flux_numerical[end, end] = flux_numerical[1, 1]
    +
    +    # calculate surface integrals
    +    for element in 1:n_elements
    +        du[:, element] -= (M \ B) * flux_numerical[:, element]
    +    end
    +
    +    # calculate volume integral
    +    for element in 1:n_elements
    +        flux = u[:, element]
    +        du[:, element] += (M \ transpose(D)) * M * flux
    +    end
    +
    +    # apply Jacobian from mapping to reference element
    +    for element in 1:n_elements
    +        du[:, element] *= 2 / dx
    +    end
    +
    +    return nothing
    +end
    +
    +# create ODE problem
    +tspan = (0.0, 2.0)
    +ode = ODEProblem(rhs!, u0, tspan, x)
    +
    +# 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
    +
    +# equation with a advection_velocity of `1`.
    +advection_velocity = 1.0
    +equations = LinearScalarAdvectionEquation1D(advection_velocity)
    +
    +# create DG solver with flux lax friedrichs and LGL basis
    +solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)
    +
    +# distretize domain with `TreeMesh`
    +coordinates_min = -1.0 # minimum coordinate
    +coordinates_max = 1.0 # maximum coordinate
    +mesh = TreeMesh(coordinates_min, coordinates_max,
    +                initial_refinement_level=4, # number of elements = 2^4
    +                n_cells_max=30_000)
    +
    +# create initial condition and semidiscretization
    +initial_condition_sine_wave(x, t, equations) = SVector(1.0 + 0.5 * sin(pi * sum(x - equations.advection_velocity * t)))
    +
    +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_sine_wave, solver)
    +
    +# solve
    +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()...);
    +
    +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
    +Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
    +           mode=PKGMODE_MANIFEST)
    Julia Version 1.9.3
    +Commit bed2cd540a1 (2023-08-24 14:43 UTC)
    +Build Info:
    +  Official https://julialang.org/ release
    +Platform Info:
    +  OS: Linux (x86_64-linux-gnu)
    +  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
    +  WORD_SIZE: 64
    +  LIBM: libopenlibm
    +  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
    +  Threads: 1 on 2 virtual cores
    +Environment:
    +  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
    +Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
    +  [1dea7af3] OrdinaryDiffEq v6.58.0
    +  [91a5bcdd] Plots v1.39.0
    +  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

    This page was generated using Literate.jl.

    diff --git a/previews/PR1693/tutorials/shock_capturing/784b2b3f.svg b/previews/PR1693/tutorials/shock_capturing/784b2b3f.svg new file mode 100644 index 00000000000..c391aa4695a --- /dev/null +++ b/previews/PR1693/tutorials/shock_capturing/784b2b3f.svg @@ -0,0 +1,4419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/shock_capturing/index.html b/previews/PR1693/tutorials/shock_capturing/index.html new file mode 100644 index 00000000000..a8ad169614e --- /dev/null +++ b/previews/PR1693/tutorials/shock_capturing/index.html @@ -0,0 +1,113 @@ + +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;
    +                                                 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}\\ +\alpha, & \text{if } \alpha_{min}\leq \alpha \leq 1- \alpha_{min}\\ +1, & \text{if } 1-\alpha_{min}<\alpha. +\end{cases}\]

    Moreover, the parameter $\alpha_{max}$ sets a maximal value for $\alpha$ by

    \[\alpha = \min\{\tilde{\alpha}, \alpha_{max}\}.\]

    This allows to control the maximal dissipation.

    To remove numerical artifact the final indicator is smoothed with all the neighboring elements' indicators. This is activated with alpha_smooth=true.

    \[\alpha_{HG} = \max_E \{ \alpha, 0.5 * \alpha_E\},\]

    where $E$ are all elements sharing a face with the current element.

    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.

    This indicator is implemented in Trixi.jl and called IndicatorHennemannGassner with the parameters equations, basis, alpha_max, alpha_min, alpha_smooth and variable.

    indicator_sc = IndicatorHennemannGassner(equations, basis,
    +                                         alpha_max=0.5,
    +                                         alpha_min=0.001,
    +                                         alpha_smooth=true,
    +                                         variable=variable)

    Positivity preserving limiter

    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).

    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.

    \[\underline{u}^{new} = \theta * \underline{u} + (1-\theta) * u_{mean}\]

    where $\underline{u}$ 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

    \[\theta = \frac{value_{mean} - \varepsilon}{value_{mean} - value_{min}},\]

    where $value_{mean}$ is the relevant variable evaluated for the mean value $u_{mean}$.

    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.

    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.

    You can implement the limiter in Trixi.jl using PositivityPreservingLimiterZhangShu with parameters threshold and variables.

    stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=thresholds,
    +                                                     variables=variables)

    Then, the limiter is added to the time integration method in the solve function. For instance, like

    CarpenterKennedy2N54(stage_limiter!, williamson_condition=false)

    or

    SSPRK43(stage_limiter!).

    Simulation with shock capturing and positivity preserving

    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.

    using OrdinaryDiffEq, Trixi
    +
    +equations = CompressibleEulerEquations2D(1.4)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ CompressibleEulerEquations2D                                                                     │
    +│ ════════════════════════════                                                                     │
    +│ #variables: ………………………………………………… 4                                                                │
    +│ │ variable 1: …………………………………………… rho                                                              │
    +│ │ variable 2: …………………………………………… rho_v1                                                           │
    +│ │ variable 3: …………………………………………… rho_v2                                                           │
    +│ │ variable 4: …………………………………………… rho_e                                                            │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    As our initial condition we use the Sedov blast wave setup.

    function initial_condition_sedov_blast_wave(x, t, equations::CompressibleEulerEquations2D)
    +  # Set up polar coordinates
    +  inicenter = SVector(0.0, 0.0)
    +  x_norm = x[1] - inicenter[1]
    +  y_norm = x[2] - inicenter[2]
    +  r = sqrt(x_norm^2 + y_norm^2)
    +
    +  r0 = 0.21875 # = 3.5 * smallest dx (for domain length=4 and max-ref=6)
    +  # r0 = 0.5 # = more reasonable setup
    +  E = 1.0
    +  p0_inner = 3 * (equations.gamma - 1) * E / (3 * pi * r0^2)
    +  p0_outer = 1.0e-5 # = true Sedov setup
    +  # p0_outer = 1.0e-3 # = more reasonable setup
    +
    +  # Calculate primitive variables
    +  rho = 1.0
    +  v1  = 0.0
    +  v2  = 0.0
    +  p   = r > r0 ? p0_outer : p0_inner
    +
    +  return prim2cons(SVector(rho, v1, v2, p), equations)
    +end
    +initial_condition = initial_condition_sedov_blast_wave
    initial_condition_sedov_blast_wave (generic function with 1 method)
    basis = LobattoLegendreBasis(3)
    LobattoLegendreBasis{Float64} with polynomials of degree 3

    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.

    surface_flux = flux_lax_friedrichs
    +volume_flux  = flux_ranocha
    flux_ranocha (generic function with 8 methods)

    Now, we specify the shock capturing indicator $\alpha$.

    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.

    indicator_sc = IndicatorHennemannGassner(equations, basis,
    +                                         alpha_max=0.5,
    +                                         alpha_min=0.001,
    +                                         alpha_smooth=true,
    +                                         variable=density_pressure)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ IndicatorHennemannGassner                                                                        │
    +│ ═════════════════════════                                                                        │
    +│ indicator variable: …………………………… density_pressure                                                 │
    +│ max. α: …………………………………………………………… 0.5                                                              │
    +│ min. α: …………………………………………………………… 0.001                                                            │
    +│ smooth α: ……………………………………………………… yes                                                              │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    Now, we can use the defined fluxes and the indicator to implement the volume integral using shock capturing.

    volume_integral = VolumeIntegralShockCapturingHG(indicator_sc;
    +                                                 volume_flux_dg=volume_flux,
    +                                                 volume_flux_fv=surface_flux)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ VolumeIntegralShockCapturingHG                                                                   │
    +│ ══════════════════════════════                                                                   │
    +│ volume flux DG: ……………………………………… flux_ranocha                                                     │
    +│ volume flux FV: ……………………………………… FluxLaxFriedrichs(max_abs_speed_naive)                           │
    +│ indicator: …………………………………………………… IndicatorHennemannGassner                                        │
    +│ │ indicator variable: ……………………… density_pressure                                                 │
    +│ │ max. α: ……………………………………………………… 0.5                                                              │
    +│ │ min. α: ……………………………………………………… 0.001                                                            │
    +│ │ smooth α: ………………………………………………… yes                                                              │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    We finalize the discretization by implementing Trixi.jl's solver, mesh, semi and ode, while solver now has the extra parameter volume_integral.

    solver = DGSEM(basis, surface_flux, volume_integral)
    +
    +coordinates_min = (-2.0, -2.0)
    +coordinates_max = ( 2.0,  2.0)
    +mesh = TreeMesh(coordinates_min, coordinates_max,
    +                initial_refinement_level=6,
    +                n_cells_max=10_000)
    +
    +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)
    +
    +tspan = (0.0, 1.0)
    +ode = semidiscretize(semi, tspan);

    We add some callbacks to get an solution analysis and use a CFL-based time step size calculation.

    analysis_callback = AnalysisCallback(semi, interval=100)
    +
    +stepsize_callback = StepsizeCallback(cfl=0.8)
    +
    +callbacks = CallbackSet(analysis_callback, stepsize_callback);

    We now run the simulation using the positivity preserving limiter of Zhang and Shu for the variables density and pressure.

    stage_limiter! = PositivityPreservingLimiterZhangShu(thresholds=(5.0e-6, 5.0e-6),
    +                                                     variables=(Trixi.density, pressure))
    +
    +sol = solve(ode, CarpenterKennedy2N54(stage_limiter!, williamson_condition=false),
    +            dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
    +            save_everystep=false, callback=callbacks);
    +
    +using Plots
    +plot(sol)
    Example block output

    Package versions

    These results were obtained using the following versions.

    using InteractiveUtils
    +versioninfo()
    +
    +using Pkg
    +Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
    +           mode=PKGMODE_MANIFEST)
    Julia Version 1.9.3
    +Commit bed2cd540a1 (2023-08-24 14:43 UTC)
    +Build Info:
    +  Official https://julialang.org/ release
    +Platform Info:
    +  OS: Linux (x86_64-linux-gnu)
    +  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
    +  WORD_SIZE: 64
    +  LIBM: libopenlibm
    +  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
    +  Threads: 1 on 2 virtual cores
    +Environment:
    +  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
    +Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
    +  [1dea7af3] OrdinaryDiffEq v6.58.0
    +  [91a5bcdd] Plots v1.39.0
    +  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

    This page was generated using Literate.jl.

    diff --git a/previews/PR1693/tutorials/structured_mesh_mapping/867345ad.svg b/previews/PR1693/tutorials/structured_mesh_mapping/867345ad.svg new file mode 100644 index 00000000000..c5b77a93915 --- /dev/null +++ b/previews/PR1693/tutorials/structured_mesh_mapping/867345ad.svg @@ -0,0 +1,3800 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/structured_mesh_mapping/b29bce5f.svg b/previews/PR1693/tutorials/structured_mesh_mapping/b29bce5f.svg new file mode 100644 index 00000000000..0b4ecd890da --- /dev/null +++ b/previews/PR1693/tutorials/structured_mesh_mapping/b29bce5f.svg @@ -0,0 +1,9475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/structured_mesh_mapping/e29b320e.svg b/previews/PR1693/tutorials/structured_mesh_mapping/e29b320e.svg new file mode 100644 index 00000000000..85da052fd5c --- /dev/null +++ b/previews/PR1693/tutorials/structured_mesh_mapping/e29b320e.svg @@ -0,0 +1,5575 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/previews/PR1693/tutorials/structured_mesh_mapping/index.html b/previews/PR1693/tutorials/structured_mesh_mapping/index.html new file mode 100644 index 00000000000..cff4beef4b5 --- /dev/null +++ b/previews/PR1693/tutorials/structured_mesh_mapping/index.html @@ -0,0 +1,198 @@ + +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
    +using Trixi
    +
    +equations = CompressibleEulerEquations2D(1.4)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ CompressibleEulerEquations2D                                                                     │
    +│ ════════════════════════════                                                                     │
    +│ #variables: ………………………………………………… 4                                                                │
    +│ │ variable 1: …………………………………………… rho                                                              │
    +│ │ variable 2: …………………………………………… rho_v1                                                           │
    +│ │ variable 3: …………………………………………… rho_v2                                                           │
    +│ │ variable 4: …………………………………………… rho_e                                                            │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    We start with a pressure perturbation at (xs, 0.0) as initial condition.

    function initial_condition_pressure_perturbation(x, t, equations::CompressibleEulerEquations2D)
    +  xs = 1.5 # location of the initial disturbance on the x axis
    +  w = 1/8 # half width
    +  p = exp(-log(2) * ((x[1]-xs)^2 + x[2]^2)/w^2) + 1.0
    +  v1 = 0.0
    +  v2 = 0.0
    +  rho = 1.0
    +
    +  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,
    +               volume_integral=VolumeIntegralFluxDifferencing(flux_ranocha))
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ DG{Float64}                                                                                      │
    +│ ═══════════                                                                                      │
    +│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=4)                         │
    +│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=4)                      │
    +│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
    +│ │ surface flux: ……………………………………… FluxLaxFriedrichs(max_abs_speed_naive)                           │
    +│ volume integral: …………………………………… VolumeIntegralFluxDifferencing                                   │
    +│ │ volume flux: ………………………………………… flux_ranocha                                                     │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    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.

    The domain boundary curves with curve parameter in $[-1,1]$ 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.

    In our case we can define the domain boundary curves as follows:

    r0 = 0.5 # inner radius
    +r1 = 5.0 # outer radius
    +f1(xi)  = SVector( r0 + 0.5 * (r1 - r0) * (xi + 1), 0.0) # right line
    +f2(xi)  = SVector(-r0 - 0.5 * (r1 - r0) * (xi + 1), 0.0) # left line
    +f3(eta) = SVector(r0 * cos(0.5 * pi * (eta + 1)), r0 * sin(0.5 * pi * (eta + 1))) # inner circle
    +f4(eta) = SVector(r1 * cos(0.5 * pi * (eta + 1)), r1 * sin(0.5 * pi * (eta + 1))) # outer circle
    f4 (generic function with 1 method)

    We create a curved mesh with 16 x 16 elements. The defined domain boundary curves are passed as a tuple.

    cells_per_dimension = (16, 16)
    +mesh = StructuredMesh(cells_per_dimension, (f1, f2, f3, f4), periodicity=false)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ StructuredMesh{2, Float64}                                                                       │
    +│ ══════════════════════════                                                                       │
    +│ size: ………………………………………………………………… (16, 16)                                                         │
    +│ mapping: …………………………………………………………                                                                  │
    +│ │ line 1: ……………………………………………………… nothing
    +nothing
    +nothing
    +nothing
    +…ng = transfinite_mapping(faces) │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    Then, we define the simulation with endtime T=3 with semi, ode and callbacks.

    semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver,
    +                                    boundary_conditions=boundary_conditions)
    +
    +tspan = (0.0, 3.0)
    +ode = semidiscretize(semi, tspan)
    +
    +analysis_interval = 100
    +analysis_callback = AnalysisCallback(semi, interval=analysis_interval)
    +
    +alive_callback = AliveCallback(analysis_interval=analysis_interval)
    +
    +stepsize_callback = StepsizeCallback(cfl=0.9)
    +
    +callbacks = CallbackSet(analysis_callback,
    +                        alive_callback,
    +                        stepsize_callback);

    Running the simulation

    sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),
    +            dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
    +            save_everystep=false, callback=callbacks);
    +
    +using Plots
    +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
    +using Trixi
    +
    +equations = CompressibleEulerEquations2D(1.4)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ CompressibleEulerEquations2D                                                                     │
    +│ ════════════════════════════                                                                     │
    +│ #variables: ………………………………………………… 4                                                                │
    +│ │ variable 1: …………………………………………… rho                                                              │
    +│ │ variable 2: …………………………………………… rho_v1                                                           │
    +│ │ variable 3: …………………………………………… rho_v2                                                           │
    +│ │ variable 4: …………………………………………… rho_e                                                            │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    As mentioned, this mapping is used for testing free-stream preservation. So, we use a constant initial condition.

    initial_condition = initial_condition_constant
    +
    +solver = DGSEM(polydeg=3, surface_flux=flux_lax_friedrichs)
    ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐
    +│ DG{Float64}                                                                                      │
    +│ ═══════════                                                                                      │
    +│ basis: ……………………………………………………………… LobattoLegendreBasis{Float64}(polydeg=3)                         │
    +│ mortar: …………………………………………………………… LobattoLegendreMortarL2{Float64}(polydeg=3)                      │
    +│ surface integral: ………………………………… SurfaceIntegralWeakForm                                          │
    +│ │ surface flux: ……………………………………… FluxLaxFriedrichs(max_abs_speed_naive)                           │
    +│ volume integral: …………………………………… VolumeIntegralWeakForm                                           │
    +└──────────────────────────────────────────────────────────────────────────────────────────────────┘

    We define the transformation mapping with variables in $[-1, 1]$ as described in Rueda-Ramírez et al. (2021), p.18 (reduced to 2D):

    function mapping(xi_, eta_)
    +  # Transform input variables between -1 and 1 onto [0,3]
    +  xi = 1.5 * xi_ + 1.5
    +  eta = 1.5 * eta_ + 1.5
    +
    +  y = eta + 3/8 * (cos(1.5 * pi * (2 * xi - 3)/3) *
    +                   cos(0.5 * pi * (2 * eta - 3)/3))
    +
    +  x = xi + 3/8 * (cos(0.5 * pi * (2 * xi - 3)/3) *
    +                  cos(2 * pi * (2 * y - 3)/3))
    +
    +  return SVector(x, y)
    +end
    mapping (generic function with 1 method)

    Instead of a tuple of boundary functions, the mesh now has the mapping as its parameter.

    cells_per_dimension = (16, 16)
    +mesh = StructuredMesh(cells_per_dimension, mapping)
    +
    +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition, solver)
    +
    +tspan = (0.0, 1.0)
    +ode = semidiscretize(semi, tspan)
    +
    +analysis_callback = AnalysisCallback(semi, interval=250)
    +
    +stepsize_callback = StepsizeCallback(cfl=0.8)
    +
    +callbacks = CallbackSet(analysis_callback,
    +                        stepsize_callback)
    +
    +sol = solve(ode, CarpenterKennedy2N54(williamson_condition=false),
    +            dt=1.0, # solve needs some value here but it will be overwritten by the stepsize_callback
    +            save_everystep=false, callback=callbacks);
    
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    + Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    + #timesteps:                  0                run time:       6.00000000e-07 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:       3043.362 MiB
    + #elements:                 256
    +
    + Variable:       rho              rho_v1           rho_v2           rho_e
    + L2 error:       7.14879109e-17   1.26068516e-17   2.52137032e-17   1.28610275e-15
    + Linf error:     2.22044605e-16   2.77555756e-17   5.55111512e-17   3.55271368e-15
    + ∑∂S/∂U ⋅ Uₜ :   6.34652923e-17
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    +
    +
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    + Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    + #timesteps:                250                run time:       2.82708992e-01 s
    + Δt:             2.33008558e-03                └── GC time:    0.00000000e+00 s (0.000%)
    + sim. time:      5.82521395e-01 (58.252%)      time/DOF/rhs!:  4.88918730e-08 s
    +                                               PID:            5.49777426e-08 s
    + #DOFs per field:          4096                alloc'd memory:       3043.634 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
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    +
    +
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    + Simulation running 'CompressibleEulerEquations2D' with DGSEM(polydeg=3)
    +────────────────────────────────────────────────────────────────────────────────────────────────────
    + #timesteps:                430                run time:       4.86795620e-01 s
    + Δt:             3.93286656e-04                └── GC time:    0.00000000e+00 s (0.000%)
    + sim. time:      1.00000000e+00 (100.000%)     time/DOF/rhs!:  4.89469115e-08 s
    +                                               PID:            5.50957484e-08 s
    + #DOFs per field:          4096                alloc'd memory:       3043.711 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
    +────────────────────────────────────────────────────────────────────────────────────────────────────

    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
    +pd = ScalarPlotData2D(error_density, semi)
    +
    +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
    +versioninfo()
    +
    +using Pkg
    +Pkg.status(["Trixi", "OrdinaryDiffEq", "Plots"],
    +           mode=PKGMODE_MANIFEST)
    Julia Version 1.9.3
    +Commit bed2cd540a1 (2023-08-24 14:43 UTC)
    +Build Info:
    +  Official https://julialang.org/ release
    +Platform Info:
    +  OS: Linux (x86_64-linux-gnu)
    +  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
    +  WORD_SIZE: 64
    +  LIBM: libopenlibm
    +  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
    +  Threads: 1 on 2 virtual cores
    +Environment:
    +  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
    +Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
    +  [1dea7af3] OrdinaryDiffEq v6.58.0
    +  [91a5bcdd] Plots v1.39.0
    +  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

    This page was generated using Literate.jl.

    diff --git a/previews/PR1693/tutorials/time_stepping/index.html b/previews/PR1693/tutorials/time_stepping/index.html new file mode 100644 index 00000000000..3c88417b79f --- /dev/null +++ b/previews/PR1693/tutorials/time_stepping/index.html @@ -0,0 +1,26 @@ + +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)
    +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
    +      callback=callbacks)

    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.

    Package versions

    These results were obtained using the following versions.

    using InteractiveUtils
    +versioninfo()
    +
    +using Pkg
    +Pkg.status(["Trixi", "OrdinaryDiffEq"],
    +           mode=PKGMODE_MANIFEST)
    Julia Version 1.9.3
    +Commit bed2cd540a1 (2023-08-24 14:43 UTC)
    +Build Info:
    +  Official https://julialang.org/ release
    +Platform Info:
    +  OS: Linux (x86_64-linux-gnu)
    +  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
    +  WORD_SIZE: 64
    +  LIBM: libopenlibm
    +  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
    +  Threads: 1 on 2 virtual cores
    +Environment:
    +  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
    +Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
    +  [1dea7af3] OrdinaryDiffEq v6.58.0
    +  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

    This page was generated using Literate.jl.

    diff --git a/previews/PR1693/tutorials/upwind_fdsbp/index.html b/previews/PR1693/tutorials/upwind_fdsbp/index.html new file mode 100644 index 00000000000..1e4d9a0b155 --- /dev/null +++ b/previews/PR1693/tutorials/upwind_fdsbp/index.html @@ -0,0 +1,65 @@ + +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
    +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 
    +and coefficients of Mattsson, Nordström (2004) 
    +  Summation by parts operators for finite difference approximations of second 
    +    derivatives. 
    +  Journal of Computational Physics 199, pp. 503-540.

    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.

    Matrix(D_SBP)
    11×11 Matrix{Float64}:
    + -10.0  10.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0    0.0   0.0
    +  -5.0   0.0   5.0   0.0   0.0   0.0   0.0   0.0   0.0    0.0   0.0
    +   0.0  -5.0   0.0   5.0   0.0   0.0   0.0   0.0   0.0    0.0   0.0
    +   0.0   0.0  -5.0   0.0   5.0   0.0   0.0   0.0   0.0    0.0   0.0
    +   0.0   0.0   0.0  -5.0   0.0   5.0   0.0   0.0   0.0    0.0   0.0
    +   0.0   0.0   0.0   0.0  -5.0   0.0   5.0   0.0   0.0    0.0   0.0
    +   0.0   0.0   0.0   0.0   0.0  -5.0   0.0   5.0   0.0    0.0   0.0
    +   0.0   0.0   0.0   0.0   0.0   0.0  -5.0   0.0   5.0    0.0   0.0
    +   0.0   0.0   0.0   0.0   0.0   0.0   0.0  -5.0   0.0    5.0   0.0
    +   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  -5.0    0.0   5.0
    +   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  -10.0  10.0

    Upwind SBP operators are a concept introduced in 2017 by Ken Mattsson. You can create them as follows.

    D_upw = upwind_operators(SummationByPartsOperators.Mattsson2017,
    +                         derivative_order=1, accuracy_order=2,
    +                         xmin=0.0, xmax=1.0, N=11)
    Upwind SBP first-derivative operators of order 2 on a grid in [0.0, 1.0] using 11 nodes 
    +and coefficients of Mattsson2017

    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.

    Matrix(D_upw.minus)
    11×11 Matrix{Float64}:
    + -10.0   10.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   0.0
    + -10.0   10.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   0.0
    +   5.0  -20.0   15.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   0.0
    +   0.0    5.0  -20.0   15.0    0.0    0.0    0.0    0.0    0.0    0.0   0.0
    +   0.0    0.0    5.0  -20.0   15.0    0.0    0.0    0.0    0.0    0.0   0.0
    +   0.0    0.0    0.0    5.0  -20.0   15.0    0.0    0.0    0.0    0.0   0.0
    +   0.0    0.0    0.0    0.0    5.0  -20.0   15.0    0.0    0.0    0.0   0.0
    +   0.0    0.0    0.0    0.0    0.0    5.0  -20.0   15.0    0.0    0.0   0.0
    +   0.0    0.0    0.0    0.0    0.0    0.0    5.0  -20.0   15.0    0.0   0.0
    +   0.0    0.0    0.0    0.0    0.0    0.0    0.0    4.0  -16.0   10.0   2.0
    +   0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   20.0  -50.0  30.0

    Analogously, the "plus" variant has a bias towards the right side.

    Matrix(D_upw.plus)
    11×11 Matrix{Float64}:
    + -30.0   50.0  -20.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0   0.0
    +  -2.0  -10.0   16.0   -4.0    0.0    0.0    0.0    0.0    0.0    0.0   0.0
    +   0.0    0.0  -15.0   20.0   -5.0    0.0    0.0    0.0    0.0    0.0   0.0
    +   0.0    0.0    0.0  -15.0   20.0   -5.0    0.0    0.0    0.0    0.0   0.0
    +   0.0    0.0    0.0    0.0  -15.0   20.0   -5.0    0.0    0.0    0.0   0.0
    +   0.0    0.0    0.0    0.0    0.0  -15.0   20.0   -5.0    0.0    0.0   0.0
    +   0.0    0.0    0.0    0.0    0.0    0.0  -15.0   20.0   -5.0    0.0   0.0
    +   0.0    0.0    0.0    0.0    0.0    0.0    0.0  -15.0   20.0   -5.0   0.0
    +   0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0  -15.0   20.0  -5.0
    +   0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0  -10.0  10.0
    +   0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0  -10.0  10.0

    For more information on upwind SBP operators, please refer to the documentation of SummationByPartsOperators.jl and references cited there.

    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

    \[f(u) = f^-(u) + f^+(u)\]

    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

    \[\partial_x f(u) \approx D^+ f^-(u) + D^- f^+(u)\]

    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^-$.

    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.

    Trixi.jl comes with several example setups using upwind SBP methods with flux vector splitting, e.g.,

    Package versions

    These results were obtained using the following versions.

    using InteractiveUtils
    +versioninfo()
    +
    +using Pkg
    +Pkg.status(["Trixi", "SummationByPartsOperators"],
    +           mode=PKGMODE_MANIFEST)
    Julia Version 1.9.3
    +Commit bed2cd540a1 (2023-08-24 14:43 UTC)
    +Build Info:
    +  Official https://julialang.org/ release
    +Platform Info:
    +  OS: Linux (x86_64-linux-gnu)
    +  CPU: 2 × Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz
    +  WORD_SIZE: 64
    +  LIBM: libopenlibm
    +  LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
    +  Threads: 1 on 2 virtual cores
    +Environment:
    +  JULIA_PKG_SERVER_REGISTRY_PREFERENCE = eager
    +Status `~/work/Trixi.jl/Trixi.jl/docs/Manifest.toml`
    +  [9f78cca6] SummationByPartsOperators v0.5.51
    +  [a7f1ee26] Trixi v0.5.48-pre `~/work/Trixi.jl/Trixi.jl`

    This page was generated using Literate.jl.

    diff --git a/previews/PR1693/visualization/index.html b/previews/PR1693/visualization/index.html new file mode 100644 index 00000000000..8c2deaef3b5 --- /dev/null +++ b/previews/PR1693/visualization/index.html @@ -0,0 +1,91 @@ + +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
    +
    +julia> redirect_stdout(devnull) do
    +         # runs the elixir without any output from callbacks etc.
    +         trixi_include(@__MODULE__,
    +           joinpath(examples_dir(), "dgmulti_2d", "elixir_euler_brown_minion_vortex.jl"))
    +       end
    +[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.
    +
    +julia> function compute_vorticity(velocity, mesh, equations::CompressibleEulerEquations2D,
    +                                  dg::DGMulti, cache)
    +         rd = dg.basis
    +         md = mesh.md
    +         @unpack Dr, Ds = rd
    +         @unpack rxJ, sxJ, ryJ, syJ, J = md
    +         v1, v2 = velocity
    +         dv1dy = ryJ .* (Dr * v1) + syJ .* (Ds * v1)
    +         dv2dx = rxJ .* (Dr * v2) + sxJ .* (Ds * v2)
    +         return dv2dx - dv1dy
    +       end;
    +
    +julia> compute_vorticity(velocity, semi) =
    +         compute_vorticity(velocity, Trixi.mesh_equations_solver_cache(semi)...);
    +
    +julia> function get_velocity(sol)
    +         rho, rhou, rhov, E = StructArrays.components(sol.u[end])
    +         v1 = rhou ./ rho
    +         v2 = rhov ./ rho
    +         return v1, v2
    +       end;
    +
    +julia> vorticity = compute_vorticity(get_velocity(sol), semi);
    +
    +julia> plot(ScalarPlotData2D(vorticity, semi;
    +            variable_name = "Vorticity at t = $(sol.prob.tspan[end])"))
    +Plot{Plots.GRBackend() n=1}

    This produces the following plot of vorticity.

    vorticity-example

    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

    julia> trixi_include(joinpath(examples_dir(), "dgmulti_2d", "elixir_euler_BM_vortex.jl"), cells_per_dimension = 32)

    yields the following plot of vorticity:

    vorticity-example-refined

    Note

    When 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.

    ScalarPlotData2D objects can also be used with Makie through iplot. For example, the following code plots two surfaces:

    julia> using Trixi, CairoMakie
    +
    +julia> redirect_stdout(devnull) do
    +         # runs the elixir without any output from callbacks etc.
    +         trixi_include(@__MODULE__,
    +           joinpath(examples_dir(), "unstructured_2d_dgsem", "elixir_euler_wall_bc.jl"))
    +       end
    +[ Info: You just called `trixi_include`. Julia may now compile the code, please be patient.
    +
    +julia> x = view(semi.cache.elements.node_coordinates, 1, :, :, :); # extracts the node x coordinates
    +
    +julia> y = view(semi.cache.elements.node_coordinates, 2, :, :, :); # extracts the node y coordinates
    +
    +julia> fig_ax_plt = iplot(ScalarPlotData2D((@. 1 - .25*(x^2 + y^2)), semi), plot_mesh=true, colormap=:viridis);
    +
    +julia> fig_ax_plt2 = iplot!(fig_ax_plt, ScalarPlotData2D((@. .125*(x+y)), semi), plot_mesh=true, colormap=:blues)
    +FigureAxisPlot()

    This creates the following plot:

    ScalarPlotData2D_example

    Plotting a 3D solution as a 2D plot

    It is possible to plot 2D slices from 3D simulation data using the TreeMesh with the same commands as above:

    julia> plot(sol) # `sol` is from a 3D simulation

    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:

    • slice specifies the plane which is being sliced and can be :xy, :xz, or :yz (default: :xy)
    • point 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)).

    All other attributes for PlotData2D objects apply here as well.

    For example, to plot the velocity field orthogonal to the yz-plane at different x-axis locations, you can execute

    julia> trixi_include(joinpath(examples_dir(), "tree_3d_dgsem", "elixir_euler_taylor_green_vortex.jl"), tspan=(0.0, 1.0))
    +[...]
    +
    +julia> plots = []
    +Any[]
    +
    +julia> for x in range(0, stop=pi/2, length=6)
    +         pd = PlotData2D(sol, slice=:yz, point=(x, 0.0, 0.0))
    +         push!(plots, plot(pd["v1"], clims=(-1,1), title="x = "*string(round(x, digits=2))))
    +       end
    +
    +julia> plot(plots..., layout=(2, 3), size=(750,350))

    which results in a 2x3 grid of slices of the yz-plane:

    plot-v1-0.0-to-0.5pi

    Creating a 1D plot

    When plotting a 1D solution with

    julia> plot(sol) # `sol` is from a 1D simulation

    Trixi.jl automatically creates a PlotData1D object and visualizes it as a line plot: 1d-plot

    To customize your 1D plot, you can create a PlotData1D object manually as follows:

    julia> pd = PlotData1D(sol)
    +julia> pd = PlotData1D(u, semi)

    The behavior is analogous to the PlotData2D behavior.

    In a very similar fashion to PlotData2D, you can customize your plot:

    • plot(pd) creates the same plot as in plot(sol).
    • plot(pd["rho", "p"]) only plots specific variables. In this case rho and p.
    • plot!(getmesh(pd)) adds mesh lines after creating a plot.
    • Any attributes from Plots can be used, e.g., plot(pd, yguide=:temperature).
    • pd = PlotData1D(adapt_to_mesh_level(sol, 4)...) adapts the mesh before plotting (in this example to a mesh with refinement level 4).

    You can also customize the PlotData1D object itself by passing attributes to the PlotData1D constructor:

    • solution_variables specifies the variables to be plotted.
    • nvisnodes sets the amount of nodes per element which the solution then is interpolated on.

    Plotting a 2D or 3D solutions as a 1D plot

    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:

    julia> pd = PlotData1D(sol)

    The plot is then created with:

    julia> plot(pd)

    By default the x-axis is extracted, which can be changed with following attributes:

    • 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)
    • point 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))

    All other attributes for PlotData1D objects apply here as well.

    In the following, is an example for a 2D simulation of the linear scalar advection equation. First, we have the regular 2D heatmap plot:

    2d-plot-for-slice

    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:

    julia> pd = PlotData1D(sol, slice=:y, point=(1.0, 0.0))
    +julia> plot(pd)

    1d-plot-for-slice

    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.

    Let's give an example of this with the basic advection equation from above by creating a plot along the circle marked in green:

    2d-plot-along-circle

    We can write a function like this, that outputs a list of points on a circle:

    function circle(radius, center, n_points)
    +    coordinates = zeros(2, n_points)
    +    for i in 1:n_points
    +        coordinates[:,i] = radius*[cospi(2*i/n_points), sinpi(2*i/n_points)] .+ center
    +    end
    +    return coordinates
    +end

    Then create and plot a PlotData1D object along a circle with radius one, center at (1,1), and 100 points:

    pd = PlotData1D(sol, curve=circle(1.0, (1.0, 1.0), 100))
    +plot(pd)

    This gives you the following plot: 1d-plot-along-circle

    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.

    Visualizing results during a simulation

    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.

    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:

    [...]
    +
    +# Enable in-situ visualization with a new plot generated every 20 time steps
    +# and additional plotting options passed as keyword arguments
    +visualization = VisualizationCallback(interval=20; clims=(0,1))
    +
    +[...]

    The resulting output of the referenced elixir can be seen in the embedded video below:

    +

    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

    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 bUbp^7FZ5%Bne`(wX*9Is)B%@!xm5HY3xqba literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000070.vtu b/previews/PR1693/tutorials/out/solution_000070.vtu new file mode 100644 index 0000000000000000000000000000000000000000..5559dd4939aebbb091cf0da79aa08feb3ace4d80 GIT binary patch literal 19148 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 JpAw{@{{T8;|H1$O literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000080.vtu b/previews/PR1693/tutorials/out/solution_000080.vtu new file mode 100644 index 0000000000000000000000000000000000000000..8bbc6918cc5ce8ef28825e0f0af2eb3746c4b905 GIT binary patch literal 19171 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000080_celldata.vtu b/previews/PR1693/tutorials/out/solution_000080_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 zcmbVxc{tR4_diLpWJyT&k!)e?WEm2YB-yePV+k|NjGa*llQmmL+@?^3FxIR?23fLi zW#7gw8v9s&+V1E6KG$>ozTfNl{By2zuJ?JpUgx~e=b!Ud2KlKxPdhx4lZ^O0IxIH?j&mS8%76$kdp!M+C$wvU|={LdUD(w z;c9-{<-rX*gq_CUVSp+PFR${yv;GL4gzvh5?ZLcvyxbpvVfv1Dp)L>vTm>K_Ed}^H zr~!6!JBdmE#QBx<^VlzhpMf8Q>M)p{-|rH&+@N+p#oe)UKdJZ^>^~4sv_T=@pH$KS zUPma*-43Awu=DT$Lma>-4S_m3!oepIAVA^|i?YNol)wF-vi^7{mHfMg-|hLOz#a;L zfb9`3-Yy8g|Expu|EEJnK~d&kQvNrxU+Uri1&^$p%s)#04?M;vRVkbR|7`1zIr#5b z6#v1ZEb%`&sr2IDP2qQlKm0P%um4O{d*YGHxb01XO2&np9$-dB(BcrD57q<4M^cwbQq#ZBxx z1$XY0s0Mr^j&=DDmJE*5HRI%SY!?$Nm08g@W1u%7yhneXq7%@@Yl8OADqL2)w?F@Q zE}nlnA_&A%7h(|4Kc@_SqyT{Monf(!oJD;|->n%?Glku-oN4N^^@%oD;}jk`q(t#g z$2U{qnKtMec62i{?H^GGSQWWCU*fHdFmCMZ_^?CvFmd>HC6Q*M-U$nZ^-HN=&+i7g zbSvWBgKD!@!)M9WBj|`;+}n!1cSH}ZpiJvra7ickb}Ia52!vi2Ax6O>kmKX~q=Q_gb%07Cp6Dst?ZmN874|*`lfXAhH zdFM;*Q@#kcl-ukr7r|FznL6sH0&T5X2%r4THT=Y*@x+hgyYG-@BZ5e>-UJ-aLko1c z3a2OT)oKd$E>b+Hza3rhM=Nfd+(jLt-;};{B~ZlRKHo`F{DSg1Y`NPe zy{a@>KUnC(!o#E=-TFRozl=_(oFR9oBu1kqk;Q)ySa=GE6x}jk;M5qh!p+XyQwPgF z*A>yUQ2oS0eT+uL_EYc{P8-YdG})ZChsf@1be@wI{G`VI=;8#?&r zS@nZrX7n06Bdro9&YGMv4?;Bd-&=uaR@gQ4JFeS37jJCl2^hIb&r9B&8P%6Z88J_h zSogS_>uu*(30&s!8w;O+;_N_b;B#YoTuZBF%|Tai-P}SVg}NKoPh-XjAEF)gz0WA` zG`}5UdvX6XUVBamaxwde8F;F{rY?(;9|A94Uz%_7;vEUGFUyeU9Mhk*A%9np7aS59 zOWdkZx-vylcFT~SC+9h+ft0kBZc9(c;0nfsdHPP5`;Yg|k z!!Uyj(^p31szUt^&%9YqwtCiH8Mfy1Vb^nA-Cg~=Y6XWU%E=l>7%8u#zF*2;?q8n<9<;Cu9VEtxrNm+!WpxE zeD2n$HneO;+>*#Om^~RMUNvxzrv6acUM`w!Xvhz6=BvCfbFt-So*$_2sMIMU7=*X&;Ue;H9y$Ua8GIMqkTYk)zx(wa@xGBjsMHrRW!(m~Sd5>3N{6?Z9~!&5x52SuUG=das<{6=Fjgl<@N-tmeWxwDq>Dz066` z5==gZ7X_mjAmr{7@}xT1#+f*h%H2V2jkDW4sYy87T`<0{ZnP(d2&EV`b2{wgqHdT; ztX*~u@>Bwbl9TRL)Tvo6D6SeI!Bi-}LSR-Yd2F9jP@k!Xpk!TwGJ`aw&E&#=X6 zk_yB5aTyA&gz_)#P+#S1V>DM0W$xscDvmbMrA%ERR#RUz2n=jb{5(RIye!gM=#jM| z6;tXQp9bgsE)Z(flnutdzbU^(b$3u@+CJlAjIV*#v`zdqsZ>(%PZi7{!+7vvOMI|X|?2C85PifP%>DhS(-g-nXcibj{Qw7d@YeYC~s zrBDDBI5#kmb4*n|wA>di_oSrJu=JxzKOc9AL1n%(lvyEt(r$D8hU~OC&Z(8xV9J)?Kvu9mCWArYJ#G`cO3o278PWI*f}h* zw(W&Tfm~-e@XyY$ACEg*#&_v(Z^h5XZ?tA@CC|#UHc%J@>sUqX0^-9_ElR1)0?VTG zs|WE_7~S=}g@bs6`aD~cJf4472QM(A9WhDj@ek=r0de1X^wxn%65CQ9tP^k^P5@omvb~=1k>AcP@@yxM7ZGNHowo+QSt~9|a zUcSp@+(NyNp4!1VpOmx&6(McxE9rw7P*JCz%iIed;n@F z0Iv2?#%9*f!9weks5Inq0-WkTZUu%dHQCH0-)v~aR?SPNpm#R6WrcIJ^V@aqG*21d z;;hPZ0m&9DQ1&j*-;8ZNeEMOb>y8Dc{?T|_ih%zhI`Yg^58M=eccW$ee#^cQe(%m3 zOuBiI?LtUHI(e`?H~o=G0lGQNa3_5AHrTFC&oQSFQt1qCDl1%54&zHraPs! zwRX$TSfHZ>D#5wr8$ye@g4qLeekb2(uP!M+?LOZ?nS7-Np7OYI+_GAmy(G&vzLn#+ zTEc^?cchDfaET(y=2)FePFKVKQL)}6IxZKDiLGUJmP#OxoUZnXW^&}K^YvLuO3+B@ z4!{$#b6wCCBJx#Q1JYCeB!%Wu-VUBOqQl8=i(gq5*KFiBqDRuLiw(BPIgpovy0u5n z5*!%6Jdd?%siQ5 zXU?)sYwzm!s*rX;(w`^ETn<*7txZX+*|Ce;-=N!q*c!OQt`g}9#@^5PHZ%en2FgYa zw(HOsIU2V2lNZ` zHhQ?bRDMXYkD7?DR_u8gsj$8R*_qnjMi*LVWym9|gpe?`i%uMbH)hqeS}`*Xw}kGq z+Q#gWS33nbgz2b(Sg7*hc$+Bu2@iweLNe z`g8DCojDHs^qp7GN$g~H=jpyN63{25s81v}?A#QvslFf&ExPBsuq@{>X*dwHWtt%w zn;ay?Z&M!{{5hadg^vR+T5&2=g-hAjsc9IlZw_=ik4!`bDaA9$bd9HRmp0+@xh@`{ zECMo55h*oaWQZajuPjq%=3VeSGz@e>Y~~oNJYtb=ow-o2+=E+7{wj4Q&3Iw(eGM~_ z=}Bz%xvME2uKI`L3Je`S7ehr>V2%x<%!7$9kMx7Kly?sr;m1W&x?@hRmuP^=Yq}J1 zocBv~h4;==3^BZLMZgkNVXretlAl`*fw44y+1i*ig!spSeVC)$oj2g9VccbEGt60` zEuA&yzj}8{M(UG;wc15;rmC(5e>_^fHKe45c3bSRA4IeH?VEn7Ks+u<{$_H#-jJ3r zpYO1ucdi5oMS9N`A($w{KLCk(iF5^^(5>POlw(6&+Mo-~HFSku%|xAxB!^sj6wYr& zh`^P~Dlxk5L@XxUaYA`z1`5M}y82M>i#Hc6g?*BZ*HW%yrO1#x~`V0SzHX zqe<$V^aaq?y&y#_M(_LMCA(PJGlY+xVvi)ZwfcvL(BCYl5>=J0&URLh#_z0r3~cCC zQ`utXQoFLV#?*Yh<_^0eXfkUNNXf5aj|j#;fJomH-$_zs z9?uUrtj}j54ivv`1dTa1V9y9^Ot=p6);X`Ap9$pSI1`q|(|--McVW@3qHVxZ;aLiX zXa6FRDQygzx<<4`gBPcJ4lbD=JSXj6W_RYA0_i&5wepnyRFIO%h+rf(t}aje#hN#i zX4RV%TA(?uoKeh4ccvQqDrN|#JkJ~QkgGeOyfxKD=DN0BC&;Em}&q$xhe74|JIOGN1R2fsX+eV`xA{kh9x17DxHhZX;pn&W#TDD?0- zk#egx{aYqy4_#~KUQb=+Ww+}&HNz$JexSD`2nguA(Zna#ydmxbxh&r>+I%0n%VAyrzlOhGcqP3R{+kP zOb8E*F#-j%?yxvmzQjPL{R|E_Cj=YZwQxZkD}tXoM%WdKosqMbHZ>#e%YcG<0&#z7 z5;X?Bj6l;a#0#l}?Cvxl`9-nR6C80P(6eM8)CEsxPzoqXDyy%w9RPt=K-5_P~3R?zIVCrjFi zZeXG@7Lcx;!?HC=v)x_7lKW zhu(wdej!WQ$ErZcY=A~CMtT}FdWTqY@4)h!Gg50iiNg3V8Bi0xDrreOzB9o28+_;4 z{Id1efDVfrqxTMzGecE)#tjRu8ZI$eG^EY<#uH*P=AgrS^^MAg1JIeA~p@q!juM$3ur4Dh)md!!CJUC}I&#VlEDIFv#mY(^oSSs^Y# zA;nN3sZZfA_1kT99Ze7N@&0bD1)QH0qS}4w90RY|UJnB@F-x;2NK+b0u^399>yzTr zNQp~9r^hoP=$z;Yj@$&WD#3}I)q#)Ik%`rb`h|n=3rF@BV8s_slqQZWCSX|; zr*nf2VuOxcgH9B34*YVC%yQt1? zQ9fo#$poNqf~2A$P{2@9Hu+^qT!3F9hzPZwx32@gLblJgS3VJ~jL54DbFGY7u6&kS z8ER1(JyIE>R2f-a8B5xu#Lb!>yrlAd9`1{tShqm7eDjNH@p~e;M-e+&x(x`xW?yH#^)(iXPH&!q*do>>t=%wFonA> zzwM^;?CxPv9YRrU&QYBgqgwAredcYpvuw5p&PbE@Npbjii1kS(E~Y$YPkEM-5^BcY z{N!r;OSd-ql}4ttkCc{;UY1?wMnCC|c8HC(xsP_PT*brko6dSW*u=~li90C3fr4;J zc_L7PC<&r10!9`IMPe0ni!SS8W!j6BMT-EUSgE`skv!}**CM&)BJpLcDn}6?2Uaq* zh&{E0(xRBfqU792G1o{5vr-9dbumYE2~|KbTR;g92~I`@W2Azg4ToI}hhNZ!)3v}j zTi~YzVdn+mm$Kn!oM5a@aQb-|_dJ}54Njd5V^4-tn!;F2iTuJgHD-S%{o=2|Ci`Q5 zuYt*Y(^Bin$Z4V&{V5X9kgK=df|Ee&)#8S|h&C3ePkD1)Q(fRQ6v+ z=It)PRAw107(2EAHr_sFre0*7c={x%Ux7r=N6BpU;$Du#s#Pusq z#J;|MB(J|rjMcBrW)H#f%ab{Gh`vdDn3#Ss#%C!En@5(pzWP@uB1GAUGXpX+GtU~} zoU_NmG#3CYm5AN%AHF#@A-vEQkrrU`vuiA~mWcYcgZL38N@VtzPZ;Lo;`zG;{olX+ z9be|}o$-=i*6{ygl&FSzFNmdi`MKw1?w0+b#Dx9Z;yd@${ZH{-KI`278DFAZ%%3b^ z?cdkQ{)ok&zg;X}R_Oc`!%YT#w?ApZ@Cz~7k}`m=M+I}tn=zbsn*2xy&|AMInbv~g z%1RFMb|CLx>xyq{#qe+*OOEG&L0YeLgKuDX#?dziL`pF{(Bh<4QyGRIQSx_iyN%($ z-RwdMRT%z)g{J8A0K+%rLWDcN1M7|y)npyE?Nw#jBbD0#e#eNsLVnx!f^ zNy$wL!}XT>Id4+NaPe`LsH9C8uAskg-J~9dr{~uibXs8ecW&8(fzBAtJ$fzYsuzY& z9ryR;FQcPd!k03-n&^lgBaV4Y(~-BvYSO+LI8{>b2J$o)Eqvm_KrI#1-agt4w3U2g9f=R( z>B9b4`Ue9Ak14C{>0qE3smoitzcG;Jp68WfS{NR{s(V802!^jbTY3M$DGYB8Va3b> zF??~Jl&6_BhTF3CkRBI7+#A2<1!Q743*V?uTQr8t4B?+Nk}y0u$;CPhU&rQL!Bd0b(di6K59}RH z%sAsvf#J@(&lunK#_&yvj?27rrvcCe>4K=rx2E%-G#pga=`b=*8P>3BF2{Hx2{Z6ybB+!t|li8BL{ zBC>UVX3&u$xOS9|lpP1Uo=@54Zil8NjYY8c*6Kd@`BD~6YDY7p54c^+Gp+S?9xJfD@NSma}PN=W(gGzJ4X zskv9C#lyXDc_#Ltl8$r_9pe1J1^Vk38x=-DJP*vUtJF(Rmw1%AuY{XNtO@j;_fh ziS&RUdf)C%hrs#9JktGN`2c;;p)&UX1IatfcnCsX@gj>p$(;-&_%-bLNH_I^27R8Z2E@H~;T30BsHbByk`1=b7;f63y6{5;+((`- zLTzv_V;C+md%?fBe@m# zVtCjMznHt=uYj@4?tRDUD7m?O-(m32|4r0tFNp2KdSvw-**@4 z$c$}kmMPFY<|1Kn1sMKWBe3xfyfa?D8SCFO=qUG;`eD99bkyhL6ef_vKpFv5?P;h} ziTYy=HEkFk(*5}TA*jET=9EW{5J#>z&s-#-&pF;|whr^e@Ruu|=9oD$(2s`|p{wCN zIO8R>VG{be!1XJ(iO`Rq<#*4tKtGM#{+%lu`p%!<=>N^{^K;WBViJcBKKu8NKkV~! zC@&Ka{7`VUgC8Tl`_~Q3{TzZx<=-_|rAq$t>Tj8=*8OkIRm^ko`oH}rAxxe}EU&m{0G~3)hf4#02H}|vQZ}#RNbN@u(p9uUD zf&X_Rpk(dKlY@OhwiC;^0;fjMG0(L-G$%&TgS4yFnLsa!dvMkA`v@vN^MIRqW&|x@ zM&AC65!5D~<=y72l-;-(?u9yxM$y! zQb0*jLCJ7HVZI!zFQEV1rwtDeg1p7h_WX0O|LJcuVNReY>Pa(|KSq#pA$Hpnn8%A`Q>P@59m*%CEr{Me75@%pVL6E*i@G38PFy@IyOZ>@6VR9)d6|^AGV8L{v1JL znfIfsfKJ}H>*oxh!E|*EGuVlG{4RYR=+TVG?J9uZ_Ep5Z0X(j|3i*PaD+?x_wt{@P z4*tRd@XI?cDRV%RaM3AokXyOZx~~Lig>bRSdXV3CS=U+(F#An{-a%Ne*z4AM1n6kl zCA?pOW~KNE>p?!=F|{m?2E8SvHMc)OUX`7j`t|}nR((Xv08k<&W<@l}?_qlvlK}Xd zZ$ZX)zzu3m9k;-qbWDwpHrPpNbXg+^@^!I8>-GYFP51|w29Qf%THVbL{QIGG`&9wo zb=7tsh4sQ+hV`#tKgJZV#Ur5QRMXy5Ar3SpR=O?NYo$i?eFFW#^QWzgA^ubW)%8C> z|B|ne+INVfLV|}36Udpy1tgdPt-R&-QwprhStUf90@_!`ag2j~(T?^kAD|1)V4^v& z&jNYrM4~>cGWt}tfwo#GAF&VYM1L~5Bl2wo$@i3$uLJq_!q%S_ffRFW&f5ZY!(fO$+3`o5mA)EqsKHKjyNrUxNzjWt*;PbxU#;FPWH%Qm-cni$X$3_f6J|~1;B#HQ{HYiG%yQcELJVkQ zzxRe(fQ8cb(-e@4j~DD>2HGJeQirJL6{$&n1=?R- zl}{UR^H%j;A;6c6;`Lwwyf@i@4+s2t#nYIm4^xN8MiZdr7Dg5=0=&#?8%o^c3cHj1 zqJT>m)prr+j%Zq=NZ7CKw>z;MFe~@)Y<`a0ie9}2>w1A{)24viyU(m5_P4VMFuwsf zbS^+h1>}RjCcl#b+tTiL5#XIDB@uG0_ipS%&R&0$OAJg^)qO zkQ0MJ)qofls7|aG*R?ut1WZcWeseMKncv!fXa*E)E=?!$dsi)YARTC?wuvo7KX6-~ z9`gcd{2=>!qJL#;TPw5yy~Reap%w6v+t$x}fFHSFPrp6jIm`2^O8|A7`g?c)Pg`b? z3A+QEkK9@a^5@Dc8w~)nA1F%*!8yi#UzGX)U8NJ^FbZ;yjIV2pK^@3nqlP^O{#8yZ zNy1L=Hg3aPK#wcwgq{aF?SgGRaX-$zk8y|r%&>g9&=}BFsoaE}sK*_oaTTbeNP*5{ zM1A@0vU?^D>vyT?jfB6^84b^gI8+KbEE5GkG|m?1-37UFuQOW1z*o%>Ul9p@*yz$f z&;j2ojwY)EKi*Nxi0ChmZu4`i0<9o*d*fHa@r)9(Ofth`AFV7*QE11r%V``GR9ae@Q$cQ?&xlqun?@rVg}e$D3f{{oodrG9vo>T^q`h3ZPdN?Q8!4_7+?Z z+TjlJKh`H^7=iqCi+V5O-K{#yh+&65R6IQpd<)`cG2D<*0H}K>OQ8ewOR<;x`9NM= zI`XS9;Gn>=_RoMaJFQI!yF+_V^$!3lND3Ro0rnl5YA4PSB$ATU9j}td*xCH$Dnzq6(0OO06CxwAs@-tSgX0SuP?X&15*m2aV-un=c&f7d% z0CIdh8_op-)(>>$+JJnp^Z42{uzR3k`!*cxW_0oS-GcjKknA+F3GCQl25rQZh<-e}bevNk_7Cji+Gqpxn#?iJCXn|lZ2Wc) z=)je}8XEww_O|D(1irGR;zv86-^Nviv_L${%_Q3bfzNP`jLrl*c-Z371n`UB+a&h} z?6WCjgrArvE_S-n_5y#kSd&r&v%{4%e9Z%ar%yru3TOO%{-1WvTTcSTRgw;Mq0Ka#IzlII)X_VAR zWx!L{R0J^4i*oUv3m0-jV&*h#$e7t4;GBI?o=%Wx(7 z#+OzLQ+=>=$L`Kc9^gkClHXE+)=J%RDh$x@dh+Obh=b`$?7JJtOEq_#IuHDNBBNEB zz%TJ6+vS2@OY4k-9-#W8?JhHfKa^x!qCY>KHr4$NFfTn&G8NGO-bz_6&`(h!2Xz8X z;>ghp0QqKm%nG9K?dr@g8w32&V(@kLefV4$a2#mk(%_9tLGRL*fjlA}W@>khi2GQS zaCNE+_(J}MG~yjiTjMI93ieF9_+tct&(3oEBNzB};dLz6cUbqI`p6*W;L`SyA|;>$ zViR@~@AFrOm$5|OJR6`eyc+1YXdQkPfXFGvkSKC}c%p=zq-)>F^jM41bycCf8 zXZUAA&*rqxSvkPMPCthV&=a(}t~%=%UF+vwpqCxyY#`pzvT((A;@z*OjY|=8W{Yt8 zEn=Qv1ltQs0q%cr>0u4XPxOgwBj%tiTN6)WzA0SpZ1e{FGFOR>&I10)9}ivL14@T# zlZg3JC4Faz5y&0uyjDrfr$sCMwC@1F=i1p@5hD7#P1Xd`|+n|K~8lG zeL4#A@oe`_;h#WD~#pJzT11U*Wh zE;CWL>%~%yi9XbwRYER=bw6j{{29QFn=|v0fp6JZc>E6dZSl^)DHzaj+BsJZ`0M;{ z>AVAatu$L)GxRypPdt)7fEVJo$XLNWcI{Q?;Rd;OvpbOtmlAkG~f!>sUCBXr+(TqR1R|bqwzn9y!jSi z+(Pu3swIOhBv@Zu((|lqW}x@p z%YQ=($kkQR%ZPcY`ZobyVoqA>!IYl?=a-TYd}|B-*VGt}5c3XSbjc>-T-Sd-P45S! z=^fCEIY&cRu&-g)kJC`WgW&4Lp)?fg8o-kX^msgLcv=KtqmhkO3=LtD>eR-wG^FiM zve8eZA#+VWLlwY)_RL+XKd2~aV32DOCk-)u_iD5jqamroOo+6e z!=*cEDCXnQUJr8`iW45&_IW=I&19|Ly4{I}dUsv<(VR1gZh0psBy|m<@r<9ZFRKlq zLN9XnzOW$_ZaA5I=H3w6l=OLJ=GYMOW*zir$A=Mn_v_%u#9@?qSlyGgZWzh9FqiTHE)m3=5{9^d}p} zUcaFrj-yJ}HPQn}%_AsBhun|4j%EdX|JaX$m%skhqrmIxyjHQpi2PLHLDyF*dh>NzwgL_OAAm`FASiCyG9(BMf%DrYR~_mA}> zd7kE$B*=$BjjB~G_C6QY8Y*oqQxslDMW2@$<)7X^ zgmQia2YSj4pa`0K%Zfu}Qcp&oF)sh=;- zuK<7c9EvdIr=npNCWVB)LA0Gg|Cw-zf;xg>`Xlp6TyLt3F$M z2h+$%PtRvzWXb^IQ#jjc5;BOo(|+T1-A6;K242*!jH97`52~fWFcsCAWRGj`4k5#( zhxs=`JtmuJzNZM1QQ_tk&04(ylH>^n3A)`)h3wG&jGTL(L&7szYLBu4q{ti+Hzs*~R-RM*l zAl^37A5KFZ;ta+V^cM?bLH`SSRHW!-K9pBFfDVK>rP+=5Bh#HF?4|A$#7uX0s%H$L z5Urqsr+iRfK~8Qf!)T~(i><38(TCFg--kHUkgk+Ox%{JH6mGCG`kCYaVzDXsA_wHIb399cI`d3jM*7 zG<9{fAF0^3CmxR*MiaZ$EN;kAk$0CbIw=QnADG@v#LIk5@s3h^DoR}>80X4Agi1?g z@}0j?5SLY;np7*)VO@%BjRzS~;`iyUrczMy9p8w(`2%R{o~rV#E<>n8;9G2AG8O*+ zH@#LI;%7R%<-iA9Dsp<2ZY(c6gfvh1*LGM8AWT!JAQkT2_#W0H`EXB?S>olFPV}Sn z+-^46XJpifsbd>945CmO%R?3VRCLd~Nc%C=1vaCa@XV2l=t?;ZwX7kudynjHhYH#^xu<0iR^j&WVGyPWpAAo840+HaSm$^qOH_?_OL{#tCPHOOX0jR zef%vqQ>n;Hr_-dW9s2y{lvTmC!>HH&qn%9U5VE=RvS^Lb0IJN{t#BRe^_{ySw789o zc3W=?Ds~z|@|1?(L}cNdQhw|jkdLOR=42-5Gv>NwRV5^Nw^~)aZF{K5MJU0r3+yrT zXv>uCpddG{8pBCAFE_JF=|Ii^%3QKZ7nh|XZLRuXj$<^GSaBps5Bk=4)Uua+a8HZa zT-D6Lo`eIt`nQL}X!Gi2)pwu{dHUrG)MP=~z9?Q%_~U}vG1 JMIXfNKLB{E0lfeK literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000090.vtu b/previews/PR1693/tutorials/out/solution_000090.vtu new file mode 100644 index 0000000000000000000000000000000000000000..244d423ca833aa56527c484c8a8b4dcfb68bc641 GIT binary patch literal 19175 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 PJ_4Ua#kYDW literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000090_celldata.vtu b/previews/PR1693/tutorials/out/solution_000090_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000100.vtu b/previews/PR1693/tutorials/out/solution_000100.vtu new file mode 100644 index 0000000000000000000000000000000000000000..89db45f786b681a17ccbee99ef70e4d512d8bc60 GIT binary patch literal 19213 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 AumAu6 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000110.vtu b/previews/PR1693/tutorials/out/solution_000110.vtu new file mode 100644 index 0000000000000000000000000000000000000000..8e839ba88bf24ac6d5a242e6808bed8e74ec4333 GIT binary patch literal 19188 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 literal 0 HcmV?d00001 diff --git a/previews/PR1693/tutorials/out/solution_000110_celldata.vtu b/previews/PR1693/tutorials/out/solution_000110_celldata.vtu new file mode 100644 index 0000000000000000000000000000000000000000..e748b0dc7ba4d37111a83cbfbcb89db5c5dc65ce GIT binary patch literal 6739 zcmbVxc{tR4_diLpWJyT&k!)e?WEm2YB-yePV+k|NjGa*llQmmL+@?^3FxIR?23fLi zW#7gw8v9s&+V1E6KG$>ozTfNl{By2zuJ?JpUgx~e=b!Ud2KlKxPdhx4lZ^O0IxIH?j&mS8%76$kdp!M+C$wvU|={LdUD(w z;c9-{<-rX*gq_CUVSp+PFR${yv;GL4gzvh5?ZLcvyxbpvVfv1Dp)L>vTm>K_Ed}^H zr~!6!JBdmE#QBx<^VlzhpMf8Q>M)p{-|rH&+@N+p#oe)UKdJZ^>^~4sv_T=@pH$KS zUPma*-43Awu=DT$Lma>-4S_m3!oepIAVA^|i?YNol)wF-vi^7{mHfMg-|hLOz#a;L zfb9`3-Yy8g|Expu|EEJnK~d&kQvNrxU+Uri1&^$p%s)#04?M;vRVkbR|7`1zIr#5b z6#v1ZEb%`&sr2IDP2qQlKm0P%um4O{d*YGHxb01XO2&np9$-dB(BcrD57q<4M^cwbQq#ZBxx z1$XY0s0Mr^j&=DDmJE*5HRI%SY!?$Nm08g@W1u%7yhneXq7%@@Yl8OADqL2)w?F@Q zE}nlnA_&A%7h(|4Kc@_SqyT{Monf(!oJD;|->n%?Glku-oN4N^^@%oD;}jk`q(t#g z$2U{qnKtMec62i{?H^GGSQWWCU*fHdFmCMZ_^?CvFmd>HC6Q*M-U$nZ^-HN=&+i7g zbSvWBgKD!@!)M9WBj|`;+}n!1cSH}ZpiJvra7ickb}Ia52!vi2Ax6O>kmKX~q=Q_gb%07Cp6Dst?ZmN874|*`lfXAhH zdFM;*Q@#kcl-ukr7r|FznL6sH0&T5X2%r4THT=Y*@x+hgyYG-@BZ5e>-UJ-aLko1c z3a2OT)oKd$E>b+Hza3rhM=Nfd+(jLt-;};{B~ZlRKHo`F{DSg1Y`NPe zy{a@>KUnC(!o#E=-TFRozl=_(oFR9oBu1kqk;Q)ySa=GE6x}jk;M5qh!p+XyQwPgF z*A>yUQ2oS0eT+uL_EYc{P8-YdG})ZChsf@1be@wI{G`VI=;8#?&r zS@nZrX7n06Bdro9&YGMv4?;Bd-&=uaR@gQ4JFeS37jJCl2^hIb&r9B&8P%6Z88J_h zSogS_>uu*(30&s!8w;O+;_N_b;B#YoTuZBF%|Tai-P}SVg}NKoPh-XjAEF)gz0WA` zG`}5UdvX6XUVBamaxwde8F;F{rY?(;9|A94Uz%_7;vEUGFUyeU9Mhk*A%9np7aS59 zOWdkZx-vylcFT~SC+9h+ft0kBZc9(c;0nfsdHPP5`;Yg|k z!!Uyj(^p31szUt^&%9YqwtCiH8Mfy1Vb^nA-Cg~=Y6XWU%E=l>7%8u#zF*2;?q8n<9<;Cu9VEtxrNm+!WpxE zeD2n$HneO;+>*#Om^~RMUNvxzrv6acUM`w!Xvhz6=BvCfbFt-So*$_2sMIMU7=*X&;Ue;H9y$Ua8GIMqkTYk)zx(wa@xGBjsMHrRW!(m~Sd5>3N{6?Z9~!&5x52SuUG=das<{6=Fjgl<@N-tmeWxwDq>Dz066` z5==gZ7X_mjAmr{7@}xT1#+f*h%H2V2jkDW4sYy87T`<0{ZnP(d2&EV`b2{wgqHdT; ztX*~u@>Bwbl9TRL)Tvo6D6SeI!Bi-}LSR-Yd2F9jP@k!Xpk!TwGJ`aw&E&#=X6 zk_yB5aTyA&gz_)#P+#S1V>DM0W$xscDvmbMrA%ERR#RUz2n=jb{5(RIye!gM=#jM| z6;tXQp9bgsE)Z(flnutdzbU^(b$3u@+CJlAjIV*#v`zdqsZ>(%PZi7{!+7vvOMI|X|?2C85PifP%>DhS(-g-nXcibj{Qw7d@YeYC~s zrBDDBI5#kmb4*n|wA>di_oSrJu=JxzKOc9AL1n%(lvyEt(r$D8hU~OC&Z(8xV9J)?Kvu9mCWArYJ#G`cO3o278PWI*f}h* zw(W&Tfm~-e@XyY$ACEg*#&_v(Z^h5XZ?tA@CC|#UHc%J@>sUqX0^-9_ElR1)0?VTG zs|WE_7~S=}g@bs6`aD~cJf4472QM(A9WhDj@ek=r0de1X^wxn%65CQ9tP^k^P5@omvb~=1k>AcP@@yxM7ZGNHowo+QSt~9|a zUcSp@+(NyNp4!1VpOmx&6(McxE9rw7P*JCz%iIed;n@F z0Iv2?#%9*f!9weks5Inq0-WkTZUu%dHQCH0-)v~aR?SPNpm#R6WrcIJ^V@aqG*21d z;;hPZ0m&9DQ1&j*-;8ZNeEMOb>y8Dc{?T|_ih%zhI`Yg^58M=eccW$ee#^cQe(%m3 zOuBiI?LtUHI(e`?H~o=G0lGQNa3_5AHrTFC&oQSFQt1qCDl1%54&zHraPs! zwRX$TSfHZ>D#5wr8$ye@g4qLeekb2(uP!M+?LOZ?nS7-Np7OYI+_GAmy(G&vzLn#+ zTEc^?cchDfaET(y=2)FePFKVKQL)}6IxZKDiLGUJmP#OxoUZnXW^&}K^YvLuO3+B@ z4!{$#b6wCCBJx#Q1JYCeB!%Wu-VUBOqQl8=i(gq5*KFiBqDRuLiw(BPIgpovy0u5n z5*!%6Jdd?%siQ5 zXU?)sYwzm!s*rX;(w`^ETn<*7txZX+*|Ce;-=N!q*c!OQt`g}9#@^5PHZ%en2FgYa zw(HOsIU2V2lNZ` zHhQ?bRDMXYkD7?DR_u8gsj$8R*_qnjMi*LVWym9|gpe?`i%uMbH)hqeS}`*Xw}kGq z+Q#gWS33nbgz2b(Sg7*hc$+Bu2@iweLNe z`g8DCojDHs^qp7GN$g~H=jpyN63{25s81v}?A#QvslFf&ExPBsuq@{>X*dwHWtt%w zn;ay?Z&M!{{5hadg^vR+T5&2=g-hAjsc9IlZw_=ik4!`bDaA9$bd9HRmp0+@xh@`{ zECMo55h*oaWQZajuPjq%=3VeSGz@e>Y~~oNJYtb=ow-o2+=E+7{wj4Q&3Iw(eGM~_ z=}Bz%xvME2uKI`L3Je`S7ehr>V2%x<%!7$9kMx7Kly?sr;m1W&x?@hRmuP^=Yq}J1 zocBv~h4;==3^BZLMZgkNVXretlAl`*fw44y+1i*ig!spSeVC)$oj2g9VccbEGt60` zEuA&yzj}8{M(UG;wc15;rmC(5e>_^fHKe45c3bSRA4IeH?VEn7Ks+u<{$_H#-jJ3r zpYO1ucdi5oMS9N`A($w{KLCk(iF5^^(5>POlw(6&+Mo-~HFSku%|xAxB!^sj6wYr& zh`^P~Dlxk5L@XxUaYA`z1`5M}y82M>i#Hc6g?*BZ*HW%yrO1#x~`V0SzHX zqe<$V^aaq?y&y#_M(_LMCA(PJGlY+xVvi)ZwfcvL(BCYl5>=J0&URLh#_z0r3~cCC zQ`utXQoFLV#?*Yh<_^0eXfkUNNXf5aj|j#;fJomH-$_zs z9?uUrtj}j54ivv`1dTa1V9y9^Ot=p6);X`Ap9$pSI1`q|(|--McVW@3qHVxZ;aLiX zXa6FRDQygzx<<4`gBPcJ4lbD=JSXj6W_RYA0_i&5wepnyRFIO%h+rf(t}aje#hN#i zX4RV%TA(?uoKeh4ccvQqDrN|#JkJ~QkgGeOyfxKD=DN0BC&;Em}&q$xhe74|JIOGN1R2fsX+eV`xA{kh9x17DxHhZX;pn&W#TDD?0- zk#egx{aYqy4_#~KUQb=+Ww+}&HNz$JexSD`2nguA(Zna#ydmxbxh&r>+I%0n%VAyrzlOhGcqP3R{+kP zOb8E*F#-j%?yxvmzQjPL{R|E_Cj=YZwQxZkD}tXoM%WdKosqMbHZ>#e%YcG<0&#z7 z5;X?Bj6l;a#0#l}?Cvxl`9-nR6C80P(6eM8)CEsxPzoqXDyy%w9RPt=K-5_P~3R?zIVCrjFi zZeXG@7Lcx;!?HC=v)x_7lKW zhu(wdej!WQ$ErZcY=A~CMtT}FdWTqY@4)h!Gg50iiNg3V8Bi0xDrreOzB9o28+_;4 z{Id1efDVfrqxTMzGecE)#tjRu8ZI$eG^EY<#uH*P=AgrS^^MAg1JIeA~p@q!juM$3ur4Dh)md!!CJUC}I&#VlEDIFv#mY(^oSSs^Y# zA;nN3sZZfA_1kT99Ze7N@&0bD1)QH0qS}4w90RY|UJnB@F-x;2NK+b0u^399>yzTr zNQp~9r^hoP=$z;Yj@$&WD#3}I)q#)Ik%`rb`h|n=3rF@BV8s_slqQZWCSX|; zr*nf2VuOxcgH9B34*YVC%yQt1? zQ9fo#$poNqf~2A$P{2@9Hu+^qT!3F9hzPZwx32@gLblJgS3VJ~jL54DbFGY7u6&kS z8ER1(JyIE>R2f-a8B5xu#Lb!>yrlAd9`1{tShqm7eDjNH@p~e;M-e+&x(x`xW?yH#^)(iXPH&!q*do>>t=%wFonA> zzwM^;?CxPv9YRrU&QYBgqgwAredcYpvuw5p&PbE@Npbjii1kS(E~Y$YPkEM-5^BcY z{N!r;OSd-ql}4ttkCc{;UY1?wMnCC|c8HC(xsP_PT*brko6dSW*u=~li90C3fr4;J zc_L7PC<&r10!9`IMPe0ni!SS8W!j6BMT-EUSgE`skv!}**CM&)BJpLcDn}6?2Uaq* zh&{E0(xRBfqU792G1o{5vr-9dbumYE2~|KbTR;g92~I`@W2Azg4ToI}hhNZ!)3v}j zTi~YzVdn+mm$Kn!oM5a@aQb-|_dJ}54Njd5V^4-tn!;F2iTuJgHD-S%{o=2|Ci`Q5 zuYt*Y(^Bin$Z4V&{V5X9kgK)!J_f82ZaAN#%6_^fBG^{nS1&1BP-g*?l6Fyh0- zg|TA-zkbetG3P!l>wa_Q>3R8{xgRWZm^z1-SbzUu!9+1aCOXF#nDZ~i_M71|r?=f^ z^JaoG?|&ZW%>D!apJ%{iv!OMSf?acY;F`mhx&E0WfAt#i`#D%=j?bu5$rreB3#3Lg95{_B?1_> z9E9^nX=6}8aHwZkn6I0^=jI51&(O{Ds;Zk{&H44Yey<-KHU`x%qI(+|IKc} zT-+{^uAzS&IQy?ie}DbWj(6V9)88||Gcf$GZRd_R=xY6Pz=qB3H^4K@$0a-_*z?zZ z7lUwqzjlFP;h_=k;Sr&p9u}YlyZrlj|K8rq*Z;Tug1@sTJg@Un|FzuTt;>NeCGs5Z z8{mlvN})f?vw;`ez=Sa8m;Y!rm2S>DS01pR&oA3=dynw{t+lxPAU2LEMYqJIbbYZD88M=}==8Q|=V!{4x`TbqEf0|#ZU$Onq`6b51{LUg( z{&kb=&s6-wkJyAl=@_~SA1n6llR&j20&M)Zu{QK=+X`i6Mn_^et3LZ`r6dgBmA|qiBOSxFF5kUueFnofJ2^(|I*Z}r4^4}_^D#Wr z*4$RD4B{$p*02XZVt03+Y`KNuj+uMzr?)YYbgShbC%-U}hRHLUKM#gS+-*IvlNZDD z#jD#&J~2^t*^;D@8YWu(F?YLL9TRyC`jt5KGtp9SSpxyc)7uKGgkwDnRDVLM`|czI z8Ly6+^$>!*b7;sLjxo@w2g_3wuP{)1567JY`xuBX=#KiqUNF(R%NLd13A^Wjve=BphwO{y>-A(OctT$MKVxLuqVE(fq@EMq#UHY zXCV8X>`8?{ZxyqZepJUmnNx2@$?KS?ovT)1IXe>tm^sR?ddom+F`9be5KrG~hel3E zCaPF7o3N~di6m0+^HIW{Kws{~l0{R%@0ROMKVKsZFKM}^_Anm$O3*6hTm$&AwYm1X6~oJDIXv}H z|A(5L3quT{Z<&h%wP5-$7voiQY=(OB-W`4nael=vOzXR2xSdW1bJ2NN$I55$)l&=) z{V|h9zk%T&uSqm<1!8#2*2|yiU_Ttd8chv^^DwD=$54xj9Cpc;-qC{otoLX7Ib(Rr zbx8$@0t~mwG3SVXj^Pd-qlXq0LmyIaX;vy>_=3bfK0|*d5?4JleW06x@WgeYVr9?= z$-}%EkVm|*KO|Wd!>4CVbnK2}xV7K<3y!d#RUXxf85tP9$zhVA3jH|ohg4*D2LrLZ z6<aWIcv|;$kBfGT%V4ign` z{WPg1h2cRP-B|8IUDOpEk=_#wpXHyxRiM5m19|;Ll?-&)C2Ct%3Ijder=${(Gtnbf z*{KZZyG6DujS^u_(GNSkkAS*6U6nYQ0&_ssB(QtO9mwy}lB3cr7@itfEiHG9fttdC zwwsp1Ig8n4XTKlf7q4-2gmcR7u+@W|$wY@gv)vzGf#KdVgFlx*{qyq~r7{&5Uacy2 zhz0V*dN;E*4e03nM~WdJ{}CzwVjIM{{cflJ{G2GR9iHa=jZ`e@aQQSQYcN2XbqJ0R%o77TMU{b0U+^yg+| z!2ErVzw|;g^6-?wv;5mJaZL_T|vytwI2LzfC4{12o`&I{ms;J( zfcyt^d^f1Ag!(%3t~Gv$;l+IlO_h+(72`)N3*g*YFB}q%BQcQ3BQxE-Fc-~PWN!>Q zFwyCjtPl^Vhu*h661|Y0rXLkb>wKxC za?Gvs*YXXSbALAci=+9EyZ>b1KN2L9j4z|l{8_q<~Lg6JnwMN1i@Ncg$amYb8K z$a!{ar`*p`)Z07MB?J67hn}1j!oHxa>xG>PEMHLc&_YXjz~1}cUB3dqAh*MC?T=B^ zu(g+Rb!HT$TkC|j0X8?X^efGdqTA#2@hb4M?%9$%te}6L{c*M*U~gPdni*iH_@y#o zz`A|@(~97C_*0bkRan2csC-8y@F((_-pc_$ol)49z#K(W^`lX$faAQX+t&iW_SSv3 zN}zQE`GpLCHfpVsI0An9)l=>#1O9P2a4G_jQpj=J8IV&}dnq0C?38wuqyk!yN%KAn)tbtDd+5{ho4D_c-{$hE^FCfd6&4g@ils53^})RRyH8 z>ev%;uN^P_!~^oDk9C}h`WLy|7!vh!XCJ~>fLum6Rwf$iEhK3b;|F?Q18UePAiv1H zh1VbC;lkk_B*qPbvhipcUV9?spnbJiF)e)48Ly$@vBzMRtvI0{`Ah<2ZR0| z>KFI(fM$QFA}i3};^49&18AC>Wm^u|RrPMI*9Q!L&UX0;$m4dzWJ^MSALo4jbs@y# zEqec?Kj896Clfm8C1@mMIDmbm%SD@wfSr$u(>4H#+zupd1C-TFIoAbxv|j%F#o%vh zK{=J^Z-MJoYmWhPHkePffnI}o&e$HH_v>H8;{i`A--ofo5N+yWS4u2XtC@@&SLK_FnFLupbpIYa{ADhBhA{`hI`) zn3X4>h|A}p6<~Mzu~%C@&}5Nt4O!54db-Ed3Q&*rX3PfQn|qV9a{&wU2IKAkCT*Qb z6ah?(&nvVgaQxUwWzhFH)?`Zo6k*4!R|9{;`>)S$LOfclkJ=srtmRG=+79w$cWhG? z;b+4_tPfE6aA1N8-~%>;33fow60Y)W(2qLw&_E3Kaff2+!vcKvjn$&-!M@b~Wylc7 zm*07&C<**Zhf{)Q0PR{vU5I@)-pX?);#1mQl-L4#ogJKmH9)Us<9j6!C~dqtXB7Ob z@?PLV%)6qM56qZAKTuqiqz`nSz1VqvK%M+bQ)1o0%dr)MAeY~LscRG9(V#0`Oz^wM zQevVP=yxe5KSu!heLLMU0G;<08xr$s;E7C^hKox#0jj7>~NC+{;kEHWG+C?S`AKO z{(T>mJ+BD!y@$p1DpB8iGN-r*{gt;gWWWvRGa~N zfeT{AmO~svt-69aAU}UyWeo@5{wus8M7~1|QYT75ubl0msx#mKtIMV=u-`v&%8Tfq z4~K3ICjw^qa*9X*U!}9Z*8tE#XJs^@7bZfv?FaG~SH?be0o_fN2wDfUR?eRNae#GP zK4!!|&%1U6E(E#q_kfNVpmX*V9W@5|%cKwC#ekB9o_UIZdy|!Nn?c_2M{bQJAouBg zgIfSYgGXxK0G{hs!9IYVV$M(30N7W>pzBrQyy$wA3u}Y?)Qtz?2xuvv4OfW!Y8x}1 zp$2$n=E9Cpz=2G+E5ux>r)QZq!5rp}2@ntlJpP1LU;^fdPN?>WUoY;3Uz;@P} zI^}P04=@F%*nmFP`;3#AZ}mD|Z%x5ZzW0=vH^lK_x{K!$(Bg$9YD69nHQlaz2Kr^~ zJl1bOep4!=?+jq{E@2xUxZg9!$wkzuQM60J+d&8BUwvN+Ud4`2Ks@&AKailGYWF^`Ao|Oiwry_##66y|$P{~6Tdx(~q)aSn;Cf%!|y$-zy0Xr~qXBfooVyw+a^u>K|uI5y*XI5U9&<0Ezc==`z zppoYUOFrn+S&mkp20!tt(G#hFsixW$IPjB5_k(mm@7AfNOT@duL%b&DF~pxuJ=fs_ z`+SfjsU-t)7n#+yX@EKE4+n^Oajqh?@D-pMoIngW)m900nnbMZQY&$8Gcy9oR#{E_c133h)hHQAgD{PgxQB_hAkidAkz zzHAL6wF!Uw#rz_#06#oy!8DOizc$n3PeC5)w^sB7*aw>n=7<6|`icm+0>8@X{Jl=l za~4BK2)k_y)_)HI+&SW<`2f&pgLgCW&hgDGeKi33I9+ZZC(vnqoCklvdhz7geK!@hI z6L-KL>qEu|V!m0BuC)q5oIAT5AGQI#@m7Df3(&)-8?(oN9=Yx~9RgS$p<<~Cb~c?B zNyNIWHfw?c0Byr5OjW3>bkx^{;UG^ixLH7gJgRlx_^Jm>Zvy$l$PXx!h z2I794*(En@1N>VzYj?22dgs2x2@&tzRjHi<=YW4H^>8*Zx2Kz)O%m^z_j!{sgMcTt z@4O%dSRLuYMcn^NdU@i+{p930DNWq}rDMVGi2lgZin~a>Uw<%mSBwE)pX=_&U++|% zki7%IZ#{f>YzeHJ=I|qY0nnZ82?O1r7cs^Xb^|bW?Kc79yuB{6a9jd%&Zn6AIIQco zL!CzW8LDQta0O)fve}6QsHODo8gY-FdAr_29I&)l{*FD^yPOp0n}Pi3-}z*v4)l($ zJ{dBg(RYuFhMuk;ChaVJ1Gt$UBP0o$G|`1P)m9jP!S@?YAtG++$;XnH!G zeF|}?Ph03Uf*;e)u~tEl7sTKBN!+i^k<#*?0nfx-Jwx>C`Hs~+D?#4=to$jlj{n(c zHR9c1j%;f505x02Q;Bzo^Xo7_;v9rO!zX5d4i-@0C+?xuTh5&(;+D=nB5?@h{bnTb zn}8*QJB{Q3{c2=d$^g?@T~dj6aAb9t$s^Ej7wKpu*3HT>@p%LBE;RNMA>#A1waWJZ zK8J~CpE1xcC5u9ccTc+NJ~=?TUe;Ks&|xo+Q>SRS68Z4SF^@1=Qyt z$Jl@J5p^;T8#a~)97-zKx*ss$wRy^Q(66n1cb2I8r2e|S#QRp}MrzJ_;P*6Gejx6} z#ilnKh<7AesxgfT{Df0VNk5?N(AJi+RbbM9G>_{qk+BB^J`_qelqr@S~mk; z=h4X~-Y?w7+~whbm4361ME?fg<*Vld+=ss{BxT?U-w>GK5;+F8f7gc-p}S?1{_C#_Be8Qk1^1#a^2xNK#TB7 z-+KylYPgvLQU4cTZD0QYe=mYxs4oLQ4=1hON`YLMOG-fl=B(I(-O9y4?_bxo?Iz%~ z5&y$N&|e>bUoZkXC&8$$9qckBTG@#?ajG}mwF%_4G)X7oUU^rTmar92S$WY$;yqV& zRqG6q-}PUpr>WUw6kH*u^DL5#2G<1ih=q`mnc7Lehlj|h>(yvLS_T<4t1P+Pdzy?m z+AWRVULYe2ulUam`D9eEgfq(IEEy&9Y75CWP>~vq&-mCKDoVVEt(PsPqN`C`6{z7< zlwb5_ccd8=(WBIz%jBr&W^c3G;0y)jP2Nwbe?vjL@?NWrG*i&M@Or`c3_7}}@p*H} zemWZRSFg1Vr=zVt3k?0E=t%$LCgm_+IueW)*3REeNAA(@t(2qwBq&F#pUz?4Sw7_->>f%D~KI}Af%HxdgRSh~Sy(`hUJCTmo z^ot)5K0!mt3y?!5nS!>wrLadsU#BkG^Szs$jHKj)J~=_0?Y?C9CvnivaTQ!S=V{2y z*SP0$0v%b4^&VG*{xE#pea`$M6*(KfI^KJYj4Y=U>KEINpe2+6W&W07G{k4rrc+Nr z&CLh;clc7#j=lpajCva4XM1$s0`_zGa_9F?_kb2y{YWvEf~YUA`lxOgK^E5}M+QET zknSTB*0Kl^YW{Fgs}IhZmp85URT2eFrB>dLu%w~JtMank;Kz|;M9$xphKh1cXN7l> z5i+Rq3I9k!B6_~M&sj(){)6jU`@td9l$6Wj7(IggpRiy1bcBos%1@eX>ZBr$7HYL- zCLJl)NyO}(p(59N?tM)gp`Ta2?rB{_Lf>SIV>j@S(D23v%}I!-p}TqDso4n9m0Xga z7D`5*iJu0SeWs$LW*u&J;Acw?=h$ZrD#|U%PnFgmMp_5uSJn*-p&ci6YLecOP`K)7 z8|nTqDhswV(1gC(QYx^xeH{gzZ6duu88n1zvOV+jry~mqtGIq`3Nq$3m%$E@kf2-K zgpCpjm65k4Qr``umr|OYsk0-f$EPN11@z%5HL;6E&nRf&EB!;$V>Hwzx@+&94RjPA zx3OLJJQ>{+cp3IVgM^~9Ja#AtkX`({MrJpK))~c zvSJA(H5p+{m-OEXVf=r@)-F-r6 zD0AhiMDkHOn$YB+j4h|5H@qvUDMB=K+TA*IQ#2KAug~pn(juYC`;qtKriTzcEKFzN zk0G>NoB#8S&M>MpFjrjA19SZC)C=iI8v6NO!^J(Fjz(5Y4z93)e)o;pHaSW|sR|th z2VsB1pRH7s8b;8QMP<>5eHb;rI+yW^G=w&_OrO^tgMK}ied09C$(L{C{q_gY(D?fx zcSbNB*>9=V{&}2^0{s=_j;Ybn*^cHvB4GYjvHSM!hI10t{5?v$Vi?Vec=R0uf5YEe zKJ;l0BfH?h2(6VA)Zneay-AaXP7ae_#==|>ZN8u)_>G1J-e1yw??p$>d1oK!nbJ{C z!{X?>bri(R3hN2t8b;IBxheKDL+JR2Z(sD;Mv$uRx`8o23VQrFal0nuC-V4US85yN z+q*0)p__`{jfu+12GUVg|IoIxa9 z@xHIIBq>o);HI