From 77f99d7c6f8468c48a2ce6b1b25af95a5485901a Mon Sep 17 00:00:00 2001 From: CompatHelper Julia Date: Sat, 10 Aug 2024 01:28:21 +0000 Subject: [PATCH 1/2] CompatHelper: add new compat entry for SciMLBase at version 2, (keep existing compat) --- Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Project.toml b/Project.toml index 85723c9f..eebb294f 100644 --- a/Project.toml +++ b/Project.toml @@ -16,6 +16,7 @@ TrixiBase = "9a0f1c46-06d5-4909-a5a3-ce25d3fa3284" [compat] BenchmarkTools = "1" CUDA = "5" +SciMLBase = "2" StaticArrays = "1" StrideArrays = "0.1" Trixi = "0.8" From 9c5b6ad4fad2d992f60c78cd7d6b097ffb371bf2 Mon Sep 17 00:00:00 2001 From: huiyuxie Date: Fri, 9 Aug 2024 16:25:34 -1000 Subject: [PATCH 2/2] Simple test for 2D Linear Advection Equation --- .github/workflows/FormatCheck.yml | 2 +- examples/advection_basic_1d.jl | 47 +++++ examples/advection_basic_2d.jl | 39 ++++ out/mesh.h5 | Bin 0 -> 36832 bytes out/solution_000000000.h5 | Bin 0 -> 34816 bytes out/solution_000000018.h5 | Bin 0 -> 34816 bytes out/solution_000000040.h5 | Bin 0 -> 2560 bytes src/TrixiGPU.jl | 14 +- src/solvers/common.jl | 6 +- src/solvers/dg_1d.jl | 69 +++--- src/solvers/dg_2d.jl | 338 ++++++++++++++++++++++++++++++ src/solvers/solvers.jl | 23 ++ test/test_solvers.jl | 57 +++-- 13 files changed, 527 insertions(+), 68 deletions(-) create mode 100644 examples/advection_basic_1d.jl create mode 100644 examples/advection_basic_2d.jl create mode 100644 out/mesh.h5 create mode 100644 out/solution_000000000.h5 create mode 100644 out/solution_000000018.h5 create mode 100644 out/solution_000000040.h5 create mode 100644 src/solvers/dg_2d.jl diff --git a/.github/workflows/FormatCheck.yml b/.github/workflows/FormatCheck.yml index b544da6b..9d2f4424 100644 --- a/.github/workflows/FormatCheck.yml +++ b/.github/workflows/FormatCheck.yml @@ -24,7 +24,7 @@ jobs: - name: Install JuliaFormatter and format run: | julia -e 'using Pkg; Pkg.add(PackageSpec(name = "JuliaFormatter", version="1.0.56"))' - julia -e 'using JuliaFormatter; format(["src", "test", "utils"])' + julia -e 'using JuliaFormatter; format(["examples", "src", "test", "utils"])' - name: Format check run: | julia -e ' diff --git a/examples/advection_basic_1d.jl b/examples/advection_basic_1d.jl new file mode 100644 index 00000000..ba25c0f6 --- /dev/null +++ b/examples/advection_basic_1d.jl @@ -0,0 +1,47 @@ +# 1D Linear Advection Equation +using Trixi, TrixiGPU +using OrdinaryDiffEq + +advection_velocity = 1.0f0 +equations = LinearScalarAdvectionEquation1D(advection_velocity) + +solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) + +coordinates_min = -1.0f0 +coordinates_max = 1.0f0 + +mesh = TreeMesh(coordinates_min, coordinates_max, initial_refinement_level = 4, + n_cells_max = 30_000) + +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, + solver) + +tspan = (0.0f0, 1.0f0) + +# FIXME: Remember to export +ode = TrixiGPU.semidiscretize_gpu(semi, tspan) + +summary_callback = SummaryCallback() + +analysis_interval = 100 +analysis_callback = AnalysisCallback(semi, interval = analysis_interval, + extra_analysis_errors = (:l2_error_primitive, + :linf_error_primitive)) + +alive_callback = AliveCallback(analysis_interval = analysis_interval) + +save_solution = SaveSolutionCallback(interval = 100, + save_initial_solution = true, + save_final_solution = true, + solution_variables = cons2prim) + +stepsize_callback = StepsizeCallback(cfl = 0.8) + +callbacks = CallbackSet(summary_callback, + analysis_callback, alive_callback, + save_solution, + stepsize_callback) + +sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false), + dt = 1.0, save_everystep = false, callback = callbacks); +summary_callback() diff --git a/examples/advection_basic_2d.jl b/examples/advection_basic_2d.jl new file mode 100644 index 00000000..bab60b39 --- /dev/null +++ b/examples/advection_basic_2d.jl @@ -0,0 +1,39 @@ +# 2D Linear Advection Equation +using Trixi, TrixiGPU +using OrdinaryDiffEq + +advection_velocity = (0.2f0, -0.7f0) +equations = LinearScalarAdvectionEquation2D(advection_velocity) + +solver = DGSEM(polydeg = 3, surface_flux = flux_lax_friedrichs) + +coordinates_min = (-1.0f0, -1.0f0) +coordinates_max = (1.0f0, 1.0f0) + +mesh = TreeMesh(coordinates_min, coordinates_max, + initial_refinement_level = 4, + n_cells_max = 30_000) + +semi = SemidiscretizationHyperbolic(mesh, equations, initial_condition_convergence_test, + solver) + +tspan = (0.0f0, 1.0f0) + +# FIXME: Remember to export +ode = TrixiGPU.semidiscretize_gpu(semi, tspan) + +summary_callback = SummaryCallback() + +analysis_callback = AnalysisCallback(semi, interval = 100) + +save_solution = SaveSolutionCallback(interval = 100, + solution_variables = cons2prim) + +stepsize_callback = StepsizeCallback(cfl = 1.6) + +callbacks = CallbackSet(summary_callback, analysis_callback, save_solution, + stepsize_callback) + +sol = solve(ode, CarpenterKennedy2N54(williamson_condition = false), + dt = 1.0, save_everystep = false, callback = callbacks); +summary_callback() diff --git a/out/mesh.h5 b/out/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..e121eda2e52ee474a9a37baf0239763f050d8fb8 GIT binary patch literal 36832 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 Hd;$IwnX#Br literal 0 HcmV?d00001 diff --git a/out/solution_000000000.h5 b/out/solution_000000000.h5 new file mode 100644 index 0000000000000000000000000000000000000000..1cf48619a6b668688ccab260f799cb4d13992a9c GIT binary patch literal 34816 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 literal 0 HcmV?d00001 diff --git a/out/solution_000000018.h5 b/out/solution_000000018.h5 new file mode 100644 index 0000000000000000000000000000000000000000..26c964491c4f766eea11b3b5185726cbf7939fd5 GIT binary patch literal 34816 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 ZYaGV^cV^+gUBdYPr&;*_B`o~^zX5sDY5V{H literal 0 HcmV?d00001 diff --git a/out/solution_000000040.h5 b/out/solution_000000040.h5 new file mode 100644 index 0000000000000000000000000000000000000000..0f18c4428a804c407dd86c76c9e0ce0e6ab85b40 GIT binary patch literal 2560 zcmeD5aB<`1lHy_j0S*oZ76t(@6Gr@p0tSc*1~?z8AOT7OFfit&Wabt#2msv$ahe0%DX^>oR?oxW0oBI^ zR0!0UT3DJ`l9``Z%pfelz#tElgsJz*%u7uy3QkVUNi1?qDN9WTDRYG?H*^6T1GF3F z4i1Pr3i5L*Q&Q8hx&)f%Kspin*rD!^FH0;U>;Z&6ZkWE*oYdUZyb|nsfqnu5gg&Uh zb5n~m;!7$EQo;TPg&EA>Aw{XFzCc+#`qDCUAo|#m^npy&%P<9N1G>!u%wT3{ zb4g}yDubYcJv@3$xEW0T149I6Ekxf3dzgM$xH3cZrq8@`WP@Yk~HdI~Qqn`i<3)tjaza}(%KXQ@N(|AGGA*FA3y2g3*Zs;i5)xVpTvXAZyleSPz5`>n!n znA#t_w0AUX=-2?H?^YjSJ?j6$K07RVPW`W^_H#vymv31A#NMzy)&32To^&+7>Sfzw z`}Nqf#HGu zMyoV6XCN(V^!hOiP`tG;Tge-!j+f`omQz6ed={%j7=ijXI?da65@@bv%|}m`_Q&?G zgI_Uj1loHha