Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hll 2 wave improvements non breaking #1561

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
c6882c7
Add Classical and Naive HLL 2 Wave solver to classic Hyperbolic PDEs
DanielDoehring Jun 20, 2023
0b74c59
Format Code
DanielDoehring Jun 20, 2023
0288814
HLLE wave speeds for SWE
DanielDoehring Jun 21, 2023
1145f9f
Fix typos
DanielDoehring Jun 21, 2023
3ce5b3b
Update tests for HLL
DanielDoehring Jun 21, 2023
2364017
Unit test 1D MHD HLL, HLLE
DanielDoehring Jun 21, 2023
6c64eba
Add example for classical HLL 2 wave
DanielDoehring Jun 21, 2023
9de6fac
remove plots
DanielDoehring Jun 21, 2023
b10b54d
Use lowercase for flux
DanielDoehring Jun 21, 2023
2c14c35
Use einfeldt for mhd
DanielDoehring Jun 21, 2023
85403b1
Use hlle for mhd tets
DanielDoehring Jun 21, 2023
f068fd0
Missing comma causes failing tests
DanielDoehring Jun 21, 2023
d184578
Correct bug in SWE 2D Roe eigval comp, unit tests
DanielDoehring Jun 22, 2023
047a5e7
format
DanielDoehring Jun 23, 2023
3e5c402
Revert "format"
DanielDoehring Jun 23, 2023
ce72be0
format equations
DanielDoehring Jun 23, 2023
f7b2b1e
Add unit tests for HLL naive
DanielDoehring Jun 24, 2023
f1e7f5b
Revert default hll flux
DanielDoehring Jul 3, 2023
5a03dfa
Rename min_max_speed to min_max_speed_davis and reduce documentation
DanielDoehring Jul 4, 2023
36e9c5e
Merge branch 'main' into HLL_2_Wave_Improvements
ranocha Jul 5, 2023
7cfc22c
Update src/equations/shallow_water_1d.jl: Comments
DanielDoehring Jul 6, 2023
ef6d070
Add published resource for Roe averages for SWE
DanielDoehring Jul 6, 2023
c079f2c
Merge branch 'HLL_2_Wave_Improvements' of github.com:DanielDoehring/T…
DanielDoehring Jul 6, 2023
f741306
Add tests for rotation
DanielDoehring Jul 6, 2023
227332e
Remove breaking portionv from PR
DanielDoehring Jul 6, 2023
b575bda
fix copy paste error
DanielDoehring Jul 6, 2023
9f93a4b
Lowercase davis
DanielDoehring Jul 6, 2023
4438a7c
Update src/equations/numerical_fluxes.jl
DanielDoehring Jul 12, 2023
29dcc45
Update src/equations/numerical_fluxes.jl
DanielDoehring Jul 12, 2023
8626d56
Update src/equations/numerical_fluxes.jl
DanielDoehring Jul 12, 2023
1c3a237
Update src/equations/numerical_fluxes.jl
DanielDoehring Jul 12, 2023
ff46046
Update src/equations/numerical_fluxes.jl
DanielDoehring Jul 12, 2023
d849e51
Update src/equations/numerical_fluxes.jl
DanielDoehring Jul 12, 2023
0d5194e
Update test/test_tree_2d_mhd.jl
DanielDoehring Jul 12, 2023
4f88249
Update src/equations/ideal_glm_mhd_1d.jl
DanielDoehring Jul 12, 2023
4cca8fa
Update src/equations/ideal_glm_mhd_2d.jl
DanielDoehring Jul 12, 2023
6606c30
Update src/equations/ideal_glm_mhd_3d.jl
DanielDoehring Jul 12, 2023
579a7ef
Update test/test_tree_3d_mhd.jl
DanielDoehring Jul 12, 2023
747b767
Remove hll_davis test
DanielDoehring Jul 12, 2023
8dff75c
Split consistency checks
DanielDoehring Jul 12, 2023
1cd90eb
Try to resolve conflict with 5ff677c
DanielDoehring Jul 12, 2023
67c318c
Merge branch 'main' into HLL_2_Wave_Improvements_NonBreaking
DanielDoehring Jul 12, 2023
af134d4
Add tests
DanielDoehring Jul 13, 2023
b9e1b74
Merge branch 'HLL_2_Wave_Improvements_NonBreaking' of github.com:Dani…
DanielDoehring Jul 13, 2023
1e8bef9
More tests
DanielDoehring Jul 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/dgmulti_2d/elixir_euler_bilinear.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Quad(), approximation_type = SBP(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))

equations = CompressibleEulerEquations2D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion examples/dgmulti_2d/elixir_euler_curved.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Quad(), approximation_type = SBP(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))

equations = CompressibleEulerEquations2D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion examples/dgmulti_2d/elixir_euler_triangulate_pkg_mesh.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Tri(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralWeakForm())

equations = CompressibleEulerEquations2D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion examples/dgmulti_2d/elixir_euler_weakform.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Tri(), approximation_type = Polynomial(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralWeakForm())

equations = CompressibleEulerEquations2D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion examples/dgmulti_2d/elixir_euler_weakform_periodic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Tri(), approximation_type = Polynomial(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralWeakForm())

equations = CompressibleEulerEquations2D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion examples/dgmulti_3d/elixir_euler_curved.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Hex(), approximation_type=SBP(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralFluxDifferencing(flux_ranocha))

equations = CompressibleEulerEquations3D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion examples/dgmulti_3d/elixir_euler_weakform.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Tet(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralWeakForm())

equations = CompressibleEulerEquations3D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion examples/dgmulti_3d/elixir_euler_weakform_periodic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Trixi, OrdinaryDiffEq

dg = DGMulti(polydeg = 3, element_type = Tet(), approximation_type = Polynomial(),
surface_integral = SurfaceIntegralWeakForm(FluxHLL()),
surface_integral = SurfaceIntegralWeakForm(flux_hll),
volume_integral = VolumeIntegralWeakForm())

equations = CompressibleEulerEquations3D(1.4)
Expand Down
2 changes: 1 addition & 1 deletion src/Trixi.jl
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ export flux, flux_central, flux_lax_friedrichs, flux_hll, flux_hllc, flux_hlle,
hydrostatic_reconstruction_audusse_etal, flux_nonconservative_audusse_etal,
FluxPlusDissipation, DissipationGlobalLaxFriedrichs, DissipationLocalLaxFriedrichs,
FluxLaxFriedrichs, max_abs_speed_naive,
FluxHLL, min_max_speed_naive,
FluxHLL, min_max_speed_naive, min_max_speed_davis, min_max_speed_einfeldt,
FluxLMARS,
FluxRotated,
flux_shima_etal_turbo, flux_ranocha_turbo,
Expand Down
19 changes: 17 additions & 2 deletions src/equations/compressible_euler_1d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -628,7 +628,7 @@ end
return SVector(f1m, f2m, f3m)
end

# Calculate maximum wave speed for local Lax-Friedrichs-type dissipation as the
# Calculate estimates for maximum wave speed for local Lax-Friedrichs-type dissipation as the
# maximum velocity magnitude plus the maximum speed of sound
@inline function max_abs_speed_naive(u_ll, u_rr, orientation::Integer,
equations::CompressibleEulerEquations1D)
Expand All @@ -648,7 +648,7 @@ end
λ_max = max(v_mag_ll, v_mag_rr) + max(c_ll, c_rr)
end

# Calculate minimum and maximum wave speeds for HLL-type fluxes
# Calculate estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_naive(u_ll, u_rr, orientation::Integer,
equations::CompressibleEulerEquations1D)
rho_ll, v1_ll, p_ll = cons2prim(u_ll, equations)
Expand All @@ -660,6 +660,21 @@ end
return λ_min, λ_max
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, orientation::Integer,
equations::CompressibleEulerEquations1D)
rho_ll, v1_ll, p_ll = cons2prim(u_ll, equations)
rho_rr, v1_rr, p_rr = cons2prim(u_rr, equations)

c_ll = sqrt(equations.gamma * p_ll / rho_ll)
c_rr = sqrt(equations.gamma * p_rr / rho_rr)

λ_min = min(v1_ll - c_ll, v1_rr - c_rr)
λ_max = max(v1_ll + c_ll, v1_rr + c_rr)

return λ_min, λ_max
end

"""
flux_hllc(u_ll, u_rr, orientation, equations::CompressibleEulerEquations1D)

Expand Down
43 changes: 42 additions & 1 deletion src/equations/compressible_euler_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1032,7 +1032,7 @@ end
return max(abs(v_ll), abs(v_rr)) + max(c_ll, c_rr) * norm(normal_direction)
end

# Calculate minimum and maximum wave speeds for HLL-type fluxes
# Calculate estimate for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_naive(u_ll, u_rr, orientation::Integer,
equations::CompressibleEulerEquations2D)
rho_ll, v1_ll, v2_ll, p_ll = cons2prim(u_ll, equations)
Expand Down Expand Up @@ -1065,6 +1065,47 @@ end
return λ_min, λ_max
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, orientation::Integer,
equations::CompressibleEulerEquations2D)
rho_ll, v1_ll, v2_ll, p_ll = cons2prim(u_ll, equations)
rho_rr, v1_rr, v2_rr, p_rr = cons2prim(u_rr, equations)

c_ll = sqrt(equations.gamma * p_ll / rho_ll)
c_rr = sqrt(equations.gamma * p_rr / rho_rr)

if orientation == 1 # x-direction
λ_min = min(v1_ll - c_ll, v1_rr - c_rr)
λ_max = max(v1_ll + c_ll, v1_rr + c_rr)
else # y-direction
λ_min = min(v2_ll - c_ll, v2_rr - c_rr)
λ_max = max(v2_ll + c_ll, v2_rr + c_rr)
end

return λ_min, λ_max
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, normal_direction::AbstractVector,
equations::CompressibleEulerEquations2D)
rho_ll, v1_ll, v2_ll, p_ll = cons2prim(u_ll, equations)
rho_rr, v1_rr, v2_rr, p_rr = cons2prim(u_rr, equations)

norm_ = norm(normal_direction)

c_ll = sqrt(equations.gamma * p_ll / rho_ll) * norm_
c_rr = sqrt(equations.gamma * p_rr / rho_rr) * norm_

v_normal_ll = v1_ll * normal_direction[1] + v2_ll * normal_direction[2]
v_normal_rr = v1_rr * normal_direction[1] + v2_rr * normal_direction[2]

# The v_normals are already scaled by the norm
λ_min = min(v_normal_ll - c_ll, v_normal_rr - c_rr)
λ_max = max(v_normal_ll + c_ll, v_normal_rr + c_rr)

return λ_min, λ_max
end

# Called inside `FluxRotated` in `numerical_fluxes.jl` so the direction
# has been normalized prior to this rotation of the state vector
@inline function rotate_to_x(u, normal_vector, equations::CompressibleEulerEquations2D)
Expand Down
50 changes: 49 additions & 1 deletion src/equations/compressible_euler_3d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1070,7 +1070,7 @@ end
return max(abs(v_ll), abs(v_rr)) + max(c_ll, c_rr) * norm(normal_direction)
end

# Calculate minimum and maximum wave speeds for HLL-type fluxes
# Calculate estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_naive(u_ll, u_rr, orientation::Integer,
equations::CompressibleEulerEquations3D)
rho_ll, v1_ll, v2_ll, v3_ll, p_ll = cons2prim(u_ll, equations)
Expand Down Expand Up @@ -1108,6 +1108,54 @@ end
return λ_min, λ_max
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, orientation::Integer,
equations::CompressibleEulerEquations3D)
rho_ll, v1_ll, v2_ll, v3_ll, p_ll = cons2prim(u_ll, equations)
rho_rr, v1_rr, v2_rr, v3_rr, p_rr = cons2prim(u_rr, equations)

c_ll = sqrt(equations.gamma * p_ll / rho_ll)
c_rr = sqrt(equations.gamma * p_rr / rho_rr)

if orientation == 1 # x-direction
λ_min = min(v1_ll - c_ll, v1_rr - c_rr)
λ_max = max(v1_ll + c_ll, v1_rr + c_rr)
elseif orientation == 2 # y-direction
λ_min = min(v2_ll - c_ll, v2_rr - c_rr)
λ_max = max(v2_ll + c_ll, v2_rr + c_rr)
else # z-direction
λ_min = min(v3_ll - c_ll, v3_rr - c_rr)
λ_max = max(v3_ll + c_ll, v3_rr + c_rr)
end

return λ_min, λ_max
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, normal_direction::AbstractVector,
equations::CompressibleEulerEquations3D)
rho_ll, v1_ll, v2_ll, v3_ll, p_ll = cons2prim(u_ll, equations)
rho_rr, v1_rr, v2_rr, v3_rr, p_rr = cons2prim(u_rr, equations)

norm_ = norm(normal_direction)

c_ll = sqrt(equations.gamma * p_ll / rho_ll) * norm_
c_rr = sqrt(equations.gamma * p_rr / rho_rr) * norm_

v_normal_ll = v1_ll * normal_direction[1] +
v2_ll * normal_direction[2] +
v3_ll * normal_direction[3]
v_normal_rr = v1_rr * normal_direction[1] +
v2_rr * normal_direction[2] +
v3_rr * normal_direction[3]

# The v_normals are already scaled by the norm
λ_min = min(v_normal_ll - c_ll, v_normal_rr - c_rr)
λ_max = max(v_normal_ll + c_ll, v_normal_rr + c_rr)

return λ_min, λ_max
end

# Rotate normal vector to x-axis; normal, tangent1 and tangent2 need to be orthonormal
# Called inside `FluxRotated` in `numerical_fluxes.jl` so the directions
# has been normalized prior to this rotation of the state vector
Expand Down
24 changes: 22 additions & 2 deletions src/equations/ideal_glm_mhd_1d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -277,13 +277,33 @@ end
λ_max = max(abs(v_ll), abs(v_rr)) + max(cf_ll, cf_rr)
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, orientation::Integer,
equations::IdealGlmMhdEquations1D)
rho_ll, rho_v1_ll, _ = u_ll
rho_rr, rho_v1_rr, _ = u_rr

# Calculate primitive variables
v1_ll = rho_v1_ll / rho_ll
v1_rr = rho_v1_rr / rho_rr

# Approximate the left-most and right-most eigenvalues in the Riemann fan
c_f_ll = calc_fast_wavespeed(u_ll, orientation, equations)
c_f_rr = calc_fast_wavespeed(u_rr, orientation, equations)

λ_min = min(v1_ll - c_f_ll, v1_rr - c_f_rr)
λ_max = max(v1_ll + c_f_ll, v1_rr + c_f_rr)

return λ_min, λ_max
end

"""
min_max_speed_naive(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations1D)
min_max_speed_naive(u_ll, u_rr, orientation::Integer, equations::IdealGlmMhdEquations1D)

Calculate minimum and maximum wave speeds for HLL-type fluxes as in
- Li (2005)
An HLLC Riemann solver for magneto-hydrodynamics
[DOI: 10.1016/j.jcp.2004.08.020](https://doi.org/10.1016/j.jcp.2004.08.020)
[DOI: 10.1016/j.jcp.2004.08.020](https://doi.org/10.1016/j.jcp.2004.08.020).
"""
@inline function min_max_speed_naive(u_ll, u_rr, orientation::Integer,
equations::IdealGlmMhdEquations1D)
Expand Down
67 changes: 61 additions & 6 deletions src/equations/ideal_glm_mhd_2d.jl
Original file line number Diff line number Diff line change
Expand Up @@ -585,13 +585,70 @@ end
return max(abs(v_ll), abs(v_rr)) + max(cf_ll, cf_rr)
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, orientation::Integer,
equations::IdealGlmMhdEquations2D)
rho_ll, rho_v1_ll, rho_v2_ll, _ = u_ll
rho_rr, rho_v1_rr, rho_v2_rr, _ = u_rr

# Calculate primitive velocity variables
v1_ll = rho_v1_ll / rho_ll
v2_ll = rho_v2_ll / rho_ll

v1_rr = rho_v1_rr / rho_rr
v2_rr = rho_v2_rr / rho_rr

# Approximate the left-most and right-most eigenvalues in the Riemann fan
if orientation == 1 # x-direction
c_f_ll = calc_fast_wavespeed(u_ll, orientation, equations)
c_f_rr = calc_fast_wavespeed(u_rr, orientation, equations)

λ_min = min(v1_ll - c_f_ll, v1_rr - c_f_rr)
λ_max = max(v1_ll + c_f_ll, v1_rr + c_f_rr)
else # y-direction
c_f_ll = calc_fast_wavespeed(u_ll, orientation, equations)
c_f_rr = calc_fast_wavespeed(u_rr, orientation, equations)

λ_min = min(v2_ll - c_f_ll, v2_rr - c_f_rr)
λ_max = max(v2_ll + c_f_ll, v1_rr + c_f_rr)
end

return λ_min, λ_max
end

# More refined estimates for minimum and maximum wave speeds for HLL-type fluxes
@inline function min_max_speed_davis(u_ll, u_rr, normal_direction::AbstractVector,
equations::IdealGlmMhdEquations2D)
rho_ll, rho_v1_ll, rho_v2_ll, _ = u_ll
rho_rr, rho_v1_rr, rho_v2_rr, _ = u_rr

# Calculate primitive velocity variables
v1_ll = rho_v1_ll / rho_ll
v2_ll = rho_v2_ll / rho_ll

v1_rr = rho_v1_rr / rho_rr
v2_rr = rho_v2_rr / rho_rr

v_normal_ll = (v1_ll * normal_direction[1] + v2_ll * normal_direction[2])
v_normal_rr = (v1_rr * normal_direction[1] + v2_rr * normal_direction[2])

c_f_ll = calc_fast_wavespeed(u_ll, normal_direction, equations)
c_f_rr = calc_fast_wavespeed(u_rr, normal_direction, equations)

# Estimate the min/max eigenvalues in the normal direction
λ_min = min(v_normal_ll - c_f_ll, v_normal_rr - c_f_rr)
λ_max = max(v_normal_ll + c_f_ll, v_normal_rr + c_f_rr)

return λ_min, λ_max
end

"""
min_max_speed_naive(u_ll, u_rr, orientation, equations::IdealGlmMhdEquations2D)
min_max_speed_naive(u_ll, u_rr, orientation::Integer, equations::IdealGlmMhdEquations2D)

Calculate minimum and maximum wave speeds for HLL-type fluxes as in
- Li (2005)
An HLLC Riemann solver for magneto-hydrodynamics
[DOI: 10.1016/j.jcp.2004.08.020](https://doi.org/10.1016/j.jcp.2004.08.020)
[DOI: 10.1016/j.jcp.2004.08.020](https://doi.org/10.1016/j.jcp.2004.08.020).
"""
@inline function min_max_speed_naive(u_ll, u_rr, orientation::Integer,
equations::IdealGlmMhdEquations2D)
Expand Down Expand Up @@ -635,10 +692,8 @@ end
v1_rr = rho_v1_rr / rho_rr
v2_rr = rho_v2_rr / rho_rr

v_normal_ll = (v1_ll * normal_direction[1] +
v2_ll * normal_direction[2])
v_normal_rr = (v1_rr * normal_direction[1] +
v2_rr * normal_direction[2])
v_normal_ll = (v1_ll * normal_direction[1] + v2_ll * normal_direction[2])
v_normal_rr = (v1_rr * normal_direction[1] + v2_rr * normal_direction[2])

c_f_ll = calc_fast_wavespeed(u_ll, normal_direction, equations)
c_f_rr = calc_fast_wavespeed(u_rr, normal_direction, equations)
Expand Down
Loading
Loading