Path: blob/main/src/semidiscretization/semidiscretization_euler_gravity.jl
2055 views
# By default, Julia/LLVM does not use fused multiply-add operations (FMAs).1# Since these FMAs can increase the performance of many numerical algorithms,2# we need to opt-in explicitly.3# See https://ranocha.de/blog/Optimizing_EC_Trixi for further details.4@muladd begin5#! format: noindent67"""8ParametersEulerGravity(; background_density=0.0,9gravitational_constant=1.0,10cfl=1.0,11resid_tol=1.0e-4,12n_iterations_max=10^4,13timestep_gravity=timestep_gravity_erk52_3Sstar!)1415Set up parameters for the gravitational part of a [`SemidiscretizationEulerGravity`](@ref).1617# Arguments18- `background_density<:Real`: Constant background/reference density ρ₀ which is subtracted from the (Euler) density19in the RHS source term computation of the gravity solver.20- `gravitational_constant<:Real`: Gravitational constant G which needs to be in consistent units with the21density and velocity fields.22- `cfl<:Real`: CFL number used for the pseudo-time stepping to advance the hyperbolic diffusion equations into steady state.23- `resid_tol<:Real`: Absolute tolerance for the residual of the hyperbolic diffusion equations which are solved to24(approximately) steady state.25- `n_iterations_max::Int`: Maximum number of iterations of the pseudo-time gravity solver.26If `n_iterations <= 0` the solver will iterate until the residual is less or equal `resid_tol`.27This can cause an infinite loop if the solver does not converge!28- `timestep_gravity`: Function to advance the gravity solver by one pseudo-time step.29There are three optimized methods available:301) `timestep_gravity_erk51_3Sstar!` (first-order),312) `timestep_gravity_erk52_3Sstar!` (second-order),323) `timestep_gravity_erk53_3Sstar!` (third-order).33Additionally, `timestep_gravity_carpenter_kennedy_erk54_2N!` (fourth-order) can be used.34"""35struct ParametersEulerGravity{RealT <: Real, TimestepGravity}36background_density :: RealT # aka rho037gravitational_constant :: RealT # aka G38cfl :: RealT # CFL number for the gravity solver39resid_tol :: RealT # Hyp.-Diff. Eq. steady state tolerance40n_iterations_max :: Int # Max. number of iterations of the pseudo-time gravity solver41timestep_gravity :: TimestepGravity42end4344function ParametersEulerGravity(; background_density = 0.0,45gravitational_constant = 1.0,46cfl = 1.0,47resid_tol = 1.0e-4,48n_iterations_max = 10^4,49timestep_gravity = timestep_gravity_erk52_3Sstar!)50background_density, gravitational_constant, cfl, resid_tol = promote(background_density,51gravitational_constant,52cfl, resid_tol)53ParametersEulerGravity(background_density, gravitational_constant, cfl, resid_tol,54n_iterations_max, timestep_gravity)55end5657function Base.show(io::IO, parameters::ParametersEulerGravity)58@nospecialize parameters # reduce precompilation time5960print(io, "ParametersEulerGravity(")61print(io, "background_density=", parameters.background_density)62print(io, ", gravitational_constant=", parameters.gravitational_constant)63print(io, ", cfl=", parameters.cfl)64print(io, ", n_iterations_max=", parameters.n_iterations_max)65print(io, ", timestep_gravity=", parameters.timestep_gravity)66print(io, ")")67end68function Base.show(io::IO, ::MIME"text/plain", parameters::ParametersEulerGravity)69@nospecialize parameters # reduce precompilation time7071if get(io, :compact, false)72show(io, parameters)73else74setup = [75"background density (ρ₀)" => parameters.background_density,76"gravitational constant (G)" => parameters.gravitational_constant,77"CFL (gravity)" => parameters.cfl,78"max. #iterations" => parameters.n_iterations_max,79"time integrator" => parameters.timestep_gravity80]81summary_box(io, "ParametersEulerGravity", setup)82end83end8485"""86SemidiscretizationEulerGravity8788A struct containing everything needed to describe a spatial semidiscretization89of a the compressible Euler equations with self-gravity, reformulating the90Poisson equation for the gravitational potential as steady-state problem of91the hyperbolic diffusion equations.92- Michael Schlottke-Lakemper, Andrew R. Winters, Hendrik Ranocha, Gregor J. Gassner (2020)93"A purely hyperbolic discontinuous Galerkin approach for self-gravitating gas dynamics"94[arXiv: 2008.10593](https://arXiv.org/abs/2008.10593)95"""96struct SemidiscretizationEulerGravity{SemiEuler, SemiGravity,97Parameters <: ParametersEulerGravity, Cache} <:98AbstractSemidiscretization99semi_euler :: SemiEuler100semi_gravity :: SemiGravity101parameters :: Parameters102performance_counter :: PerformanceCounter103gravity_counter :: PerformanceCounter104cache :: Cache105106function SemidiscretizationEulerGravity{SemiEuler, SemiGravity, Parameters, Cache}(semi_euler::SemiEuler,107semi_gravity::SemiGravity,108parameters::Parameters,109cache::Cache) where {110SemiEuler,111SemiGravity,112Parameters <:113ParametersEulerGravity,114Cache115}116@assert ndims(semi_euler) == ndims(semi_gravity)117@assert typeof(semi_euler.mesh) == typeof(semi_gravity.mesh)118@assert polydeg(semi_euler.solver) == polydeg(semi_gravity.solver)119120performance_counter = PerformanceCounter()121gravity_counter = PerformanceCounter()122123new(semi_euler, semi_gravity, parameters, performance_counter, gravity_counter,124cache)125end126end127128"""129SemidiscretizationEulerGravity(semi_euler::SemiEuler, semi_gravity::SemiGravity, parameters)130131Construct a semidiscretization of the compressible Euler equations with self-gravity.132`parameters` should be given as [`ParametersEulerGravity`](@ref).133"""134function SemidiscretizationEulerGravity(semi_euler::SemiEuler,135semi_gravity::SemiGravity,136parameters) where137{Mesh,138SemiEuler <:139SemidiscretizationHyperbolic{Mesh, <:AbstractCompressibleEulerEquations},140SemiGravity <:141SemidiscretizationHyperbolic{Mesh, <:AbstractHyperbolicDiffusionEquations}}142u_ode = compute_coefficients(zero(real(semi_gravity)), semi_gravity)143du_ode = similar(u_ode)144# Registers for gravity solver, tailored to the 2N and 3S* methods implemented below145u_tmp1_ode = similar(u_ode)146u_tmp2_ode = similar(u_ode)147cache = (; u_ode, du_ode, u_tmp1_ode, u_tmp2_ode)148149SemidiscretizationEulerGravity{typeof(semi_euler), typeof(semi_gravity),150typeof(parameters), typeof(cache)}(semi_euler,151semi_gravity,152parameters, cache)153end154155function remake(semi::SemidiscretizationEulerGravity;156uEltype = real(semi.semi_gravity.solver),157semi_euler = semi.semi_euler,158semi_gravity = semi.semi_gravity,159parameters = semi.parameters)160semi_euler = remake(semi_euler, uEltype = uEltype)161semi_gravity = remake(semi_gravity, uEltype = uEltype)162163# Recreate cache, i.e., registers for u with e.g. AD datatype164u_ode = compute_coefficients(zero(real(semi_gravity)), semi_gravity)165du_ode = similar(u_ode)166u_tmp1_ode = similar(u_ode)167u_tmp2_ode = similar(u_ode)168cache = (; u_ode, du_ode, u_tmp1_ode, u_tmp2_ode)169170SemidiscretizationEulerGravity{typeof(semi_euler), typeof(semi_gravity),171typeof(parameters), typeof(cache)}(semi_euler,172semi_gravity,173parameters, cache)174end175176function Base.show(io::IO, semi::SemidiscretizationEulerGravity)177@nospecialize semi # reduce precompilation time178179print(io, "SemidiscretizationEulerGravity using")180print(io, semi.semi_euler)181print(io, ", ", semi.semi_gravity)182print(io, ", ", semi.parameters)183print(io, ", cache(")184for (idx, key) in enumerate(keys(semi.cache))185idx > 1 && print(io, " ")186print(io, key)187end188print(io, "))")189end190191function Base.show(io::IO, mime::MIME"text/plain", semi::SemidiscretizationEulerGravity)192@nospecialize semi # reduce precompilation time193194if get(io, :compact, false)195show(io, semi)196else197summary_header(io, "SemidiscretizationEulerGravity")198summary_line(io, "semidiscretization Euler",199semi.semi_euler |> typeof |> nameof)200show(increment_indent(io), mime, semi.semi_euler)201summary_line(io, "semidiscretization gravity",202semi.semi_gravity |> typeof |> nameof)203show(increment_indent(io), mime, semi.semi_gravity)204summary_line(io, "parameters", semi.parameters |> typeof |> nameof)205show(increment_indent(io), mime, semi.parameters)206summary_footer(io)207end208end209210# The compressible Euler semidiscretization is considered to be the main semidiscretization.211# The hyperbolic diffusion equations part is only used internally to update the gravitational212# potential during an rhs! evaluation of the flow solver.213@inline function mesh_equations_solver_cache(semi::SemidiscretizationEulerGravity)214mesh_equations_solver_cache(semi.semi_euler)215end216217@inline Base.ndims(semi::SemidiscretizationEulerGravity) = ndims(semi.semi_euler)218219@inline Base.real(semi::SemidiscretizationEulerGravity) = real(semi.semi_euler)220221# computes the coefficients of the initial condition222@inline function compute_coefficients(t, semi::SemidiscretizationEulerGravity)223compute_coefficients!(semi.cache.u_ode, t, semi.semi_gravity)224compute_coefficients(t, semi.semi_euler)225end226227# computes the coefficients of the initial condition and stores the Euler part in `u_ode`228@inline function compute_coefficients!(u_ode, t, semi::SemidiscretizationEulerGravity)229compute_coefficients!(semi.cache.u_ode, t, semi.semi_gravity)230compute_coefficients!(u_ode, t, semi.semi_euler)231end232233@inline function calc_error_norms(func, u, t, analyzer,234semi::SemidiscretizationEulerGravity, cache_analysis)235calc_error_norms(func, u, t, analyzer, semi.semi_euler, cache_analysis)236end237238# Coupled Euler and gravity solver at each Runge-Kutta stage,239# corresponding to Algorithm 2 in Schlottke-Lakemper et al. (2020),240# https://dx.doi.org/10.1016/j.jcp.2021.110467241function rhs!(du_ode, u_ode, semi::SemidiscretizationEulerGravity, t)242@unpack semi_euler, semi_gravity, cache = semi243244u_euler = wrap_array(u_ode, semi_euler)245du_euler = wrap_array(du_ode, semi_euler)246u_gravity = wrap_array(cache.u_ode, semi_gravity)247n_elements = size(u_euler)[end]248249time_start = time_ns()250251# standard semidiscretization of the compressible Euler equations252@trixi_timeit timer() "Euler solver" rhs!(du_ode, u_ode, semi_euler, t)253254# compute gravitational potential and forces255@trixi_timeit timer() "gravity solver" update_gravity!(semi, u_ode)256257# add gravitational source source_terms to the Euler part258if ndims(semi_euler) == 1259@threaded for element in 1:n_elements260@views @. du_euler[2, .., element] -= u_euler[1, .., element] *261u_gravity[2, .., element]262@views @. du_euler[3, .., element] -= u_euler[2, .., element] *263u_gravity[2, .., element]264end265elseif ndims(semi_euler) == 2266@threaded for element in 1:n_elements267@views @. du_euler[2, .., element] -= u_euler[1, .., element] *268u_gravity[2, .., element]269@views @. du_euler[3, .., element] -= u_euler[1, .., element] *270u_gravity[3, .., element]271@views @. du_euler[4, .., element] -= (u_euler[2, .., element] *272u_gravity[2, .., element] +273u_euler[3, .., element] *274u_gravity[3, .., element])275end276elseif ndims(semi_euler) == 3277@threaded for element in 1:n_elements278@views @. du_euler[2, .., element] -= u_euler[1, .., element] *279u_gravity[2, .., element]280@views @. du_euler[3, .., element] -= u_euler[1, .., element] *281u_gravity[3, .., element]282@views @. du_euler[4, .., element] -= u_euler[1, .., element] *283u_gravity[4, .., element]284@views @. du_euler[5, .., element] -= (u_euler[2, .., element] *285u_gravity[2, .., element] +286u_euler[3, .., element] *287u_gravity[3, .., element] +288u_euler[4, .., element] *289u_gravity[4, .., element])290end291else292error("Number of dimensions $(ndims(semi_euler)) not supported.")293end294295runtime = time_ns() - time_start296put!(semi.performance_counter, runtime)297298return nothing299end300301# TODO: Taal refactor, add some callbacks or so within the gravity update to allow investigating/optimizing it302function update_gravity!(semi::SemidiscretizationEulerGravity, u_ode)303@unpack semi_euler, semi_gravity, parameters, gravity_counter, cache = semi304305u_euler = wrap_array(u_ode, semi_euler)306u_gravity = wrap_array(cache.u_ode, semi_gravity)307du_gravity = wrap_array(cache.du_ode, semi_gravity)308309# set up main loop310finalstep = false311@unpack n_iterations_max, cfl, resid_tol, timestep_gravity = parameters312iter = 0313tau = zero(real(semi_gravity.solver)) # Pseudo-time314315# iterate gravity solver until convergence or maximum number of iterations are reached316@unpack equations = semi_gravity317while !finalstep318dtau = @trixi_timeit timer() "calculate dtau" begin319cfl * max_dt(u_gravity, tau, semi_gravity.mesh,320have_constant_speed(equations), equations,321semi_gravity.solver, semi_gravity.cache)322end323324# evolve solution by one pseudo-time step325time_start = time_ns()326timestep_gravity(cache, u_euler, tau, dtau, parameters, semi_gravity)327runtime = time_ns() - time_start328put!(gravity_counter, runtime)329330# update iteration counter331iter += 1332tau += dtau333334# check if we reached the maximum number of iterations335if n_iterations_max > 0 && iter >= n_iterations_max336@warn "Max iterations reached: Gravity solver failed to converge!" residual=maximum(abs,337@views du_gravity[1,338..,339:]) tau=tau dtau=dtau340finalstep = true341end342343# this is an absolute tolerance check344if maximum(abs, @views du_gravity[1, .., :]) <= resid_tol345finalstep = true346end347end348349return nothing350end351352# Integrate gravity solver for 2N-type low-storage schemes353function timestep_gravity_2N!(cache, u_euler, tau, dtau, gravity_parameters,354semi_gravity,355a, b, c)356G = gravity_parameters.gravitational_constant357rho0 = gravity_parameters.background_density358grav_scale = -4.0 * pi * G359360# Note that `u_ode` is `u_gravity` in `rhs!` above361@unpack u_ode, du_ode, u_tmp1_ode = cache362n_elements = size(u_euler)[end]363364u_tmp1_ode .= zero(eltype(u_tmp1_ode))365du_gravity = wrap_array(du_ode, semi_gravity)366367for stage in eachindex(c)368tau_stage = tau + dtau * c[stage]369370# rhs! has the source term for the harmonic problem371# We don't need a `@trixi_timeit timer() "rhs!"` here since that's already372# included in the `rhs!` call.373rhs!(du_ode, u_ode, semi_gravity, tau_stage)374375# Source term: Jeans instability OR coupling convergence test OR blast wave376# put in gravity source term proportional to Euler density377# OBS! subtract off the background density ρ_0 (spatial mean value)378# Note: Adding to `du_gravity` is essentially adding to `du_ode`!379@threaded for element in 1:n_elements380@views @. du_gravity[1, .., element] += grav_scale *381(u_euler[1, .., element] - rho0)382end383384a_stage = a[stage]385b_stage_dtau = b[stage] * dtau386@trixi_timeit timer() "Runge-Kutta step" begin387@threaded for idx in eachindex(u_ode)388u_tmp1_ode[idx] = du_ode[idx] - u_tmp1_ode[idx] * a_stage389u_ode[idx] += u_tmp1_ode[idx] * b_stage_dtau390end391end392end393394return nothing395end396397function timestep_gravity_carpenter_kennedy_erk54_2N!(cache, u_euler, tau, dtau,398gravity_parameters, semi_gravity)399# Coefficients for Carpenter's 5-stage 4th-order low-storage Runge-Kutta method400a = SVector(0.0,401567301805773.0 / 1357537059087.0,4022404267990393.0 / 2016746695238.0,4033550918686646.0 / 2091501179385.0,4041275806237668.0 / 842570457699.0)405b = SVector(1432997174477.0 / 9575080441755.0,4065161836677717.0 / 13612068292357.0,4071720146321549.0 / 2090206949498.0,4083134564353537.0 / 4481467310338.0,4092277821191437.0 / 14882151754819.0)410c = SVector(0.0,4111432997174477.0 / 9575080441755.0,4122526269341429.0 / 6820363962896.0,4132006345519317.0 / 3224310063776.0,4142802321613138.0 / 2924317926251.0)415416timestep_gravity_2N!(cache, u_euler, tau, dtau, gravity_parameters, semi_gravity,417a, b, c)418end419420# Integrate gravity solver for 3S*-type low-storage schemes421function timestep_gravity_3Sstar!(cache, u_euler, tau, dtau, gravity_parameters,422semi_gravity,423gamma1, gamma2, gamma3, beta, delta, c)424G = gravity_parameters.gravitational_constant425rho0 = gravity_parameters.background_density426grav_scale = -4 * G * pi427428# Note that `u_ode` is `u_gravity` in `rhs!` above429@unpack u_ode, du_ode, u_tmp1_ode, u_tmp2_ode = cache430n_elements = size(u_euler)[end]431432u_tmp1_ode .= zero(eltype(u_tmp1_ode))433u_tmp2_ode .= u_ode434du_gravity = wrap_array(du_ode, semi_gravity)435436for stage in eachindex(c)437tau_stage = tau + dtau * c[stage]438439# rhs! has the source term for the harmonic problem440# We don't need a `@trixi_timeit timer() "rhs!"` here since that's already441# included in the `rhs!` call.442rhs!(du_ode, u_ode, semi_gravity, tau_stage)443444# Source term: Jeans instability OR coupling convergence test OR blast wave445# put in gravity source term proportional to Euler density446# OBS! subtract off the background density ρ_0 around which the Jeans instability is perturbed447# Note: Adding to `du_gravity` is essentially adding to `du_ode`!448@threaded for element in 1:n_elements449@views @. du_gravity[1, .., element] += grav_scale *450(u_euler[1, .., element] - rho0)451end452453delta_stage = delta[stage]454gamma1_stage = gamma1[stage]455gamma2_stage = gamma2[stage]456gamma3_stage = gamma3[stage]457beta_stage_dtau = beta[stage] * dtau458@trixi_timeit timer() "Runge-Kutta step" begin459@threaded for idx in eachindex(u_ode)460# See Algorithm 1 (3S* method) in Schlottke-Lakemper et al. (2020)461u_tmp1_ode[idx] += delta_stage * u_ode[idx]462u_ode[idx] = (gamma1_stage * u_ode[idx] +463gamma2_stage * u_tmp1_ode[idx] +464gamma3_stage * u_tmp2_ode[idx] +465beta_stage_dtau * du_ode[idx])466end467end468end469470return nothing471end472473# First-order, 5-stage, 3S*-storage optimized method474function timestep_gravity_erk51_3Sstar!(cache, u_euler, tau, dtau, gravity_parameters,475semi_gravity)476# New 3Sstar coefficients optimized for polynomials of degree polydeg=3477# and examples/parameters_hypdiff_lax_friedrichs.toml478# 5 stages, order 1479gamma1 = SVector(0.0000000000000000E+00, 5.2910412316555866E-01,4802.8433964362349406E-01, -1.4467571130907027E+00,4817.5592215948661057E-02)482gamma2 = SVector(1.0000000000000000E+00, 2.6366970460864109E-01,4833.7423646095836322E-01, 7.8786901832431289E-01,4843.7754129043053775E-01)485gamma3 = SVector(0.0000000000000000E+00, 0.0000000000000000E+00,4860.0000000000000000E+00, 8.0043329115077388E-01,4871.3550099149374278E-01)488beta = SVector(1.9189497208340553E-01, 5.4506406707700059E-02,4891.2103893164085415E-01, 6.8582252490550921E-01,4908.7914657211972225E-01)491delta = SVector(1.0000000000000000E+00, 7.8593091509463076E-01,4921.2639038717454840E-01, 1.7726945920209813E-01,4930.0000000000000000E+00)494c = SVector(0.0000000000000000E+00, 1.9189497208340553E-01, 1.9580448818599061E-01,4952.4241635859769023E-01, 5.0728347557552977E-01)496497timestep_gravity_3Sstar!(cache, u_euler, tau, dtau, gravity_parameters,498semi_gravity,499gamma1, gamma2, gamma3, beta, delta, c)500end501502# Second-order, 5-stage, 3S*-storage optimized method503function timestep_gravity_erk52_3Sstar!(cache, u_euler, tau, dtau, gravity_parameters,504semi_gravity)505# New 3Sstar coefficients optimized for polynomials of degree polydeg=3506# and examples/parameters_hypdiff_lax_friedrichs.toml507# 5 stages, order 2508gamma1 = SVector(0.0000000000000000E+00, 5.2656474556752575E-01,5091.0385212774098265E+00, 3.6859755007388034E-01,510-6.3350615190506088E-01)511gamma2 = SVector(1.0000000000000000E+00, 4.1892580153419307E-01,512-2.7595818152587825E-02, 9.1271323651988631E-02,5136.8495995159465062E-01)514gamma3 = SVector(0.0000000000000000E+00, 0.0000000000000000E+00,5150.0000000000000000E+00, 4.1301005663300466E-01,516-5.4537881202277507E-03)517beta = SVector(4.5158640252832094E-01, 7.5974836561844006E-01,5183.7561630338850771E-01, 2.9356700007428856E-02,5192.5205285143494666E-01)520delta = SVector(1.0000000000000000E+00, 1.3011720142005145E-01,5212.6579275844515687E-01, 9.9687218193685878E-01,5220.0000000000000000E+00)523c = SVector(0.0000000000000000E+00, 4.5158640252832094E-01, 1.0221535725056414E+00,5241.4280257701954349E+00, 7.1581334196229851E-01)525526timestep_gravity_3Sstar!(cache, u_euler, tau, dtau, gravity_parameters,527semi_gravity,528gamma1, gamma2, gamma3, beta, delta, c)529end530531# Third-order, 5-stage, 3S*-storage optimized method532function timestep_gravity_erk53_3Sstar!(cache, u_euler, tau, dtau, gravity_parameters,533semi_gravity)534# New 3Sstar coefficients optimized for polynomials of degree polydeg=3535# and examples/parameters_hypdiff_lax_friedrichs.toml536# 5 stages, order 3537gamma1 = SVector(0.0000000000000000E+00, 6.9362208054011210E-01,5389.1364483229179472E-01, 1.3129305757628569E+00,539-1.4615811339132949E+00)540gamma2 = SVector(1.0000000000000000E+00, 1.3224582239681788E+00,5412.4213162353103135E-01, -3.8532017293685838E-01,5421.5603355704723714E+00)543gamma3 = SVector(0.0000000000000000E+00, 0.0000000000000000E+00,5440.0000000000000000E+00, 3.8306787039991996E-01,545-3.5683121201711010E-01)546beta = SVector(8.4476964977404881E-02, 3.0834660698015803E-01,5473.2131664733089232E-01, 2.8783574345390539E-01,5488.2199204703236073E-01)549delta = SVector(1.0000000000000000E+00, -7.6832695815481578E-01,5501.2497251501714818E-01, 1.4496404749796306E+00,5510.0000000000000000E+00)552c = SVector(0.0000000000000000E+00, 8.4476964977404881E-02, 2.8110631488732202E-01,5535.7093842145029405E-01, 7.2999896418559662E-01)554555timestep_gravity_3Sstar!(cache, u_euler, tau, dtau, gravity_parameters,556semi_gravity,557gamma1, gamma2, gamma3, beta, delta, c)558end559560# TODO: Taal decide, where should specific parts like these be?561@inline function save_solution_file(u_ode, t, dt, iter,562semi::SemidiscretizationEulerGravity,563solution_callback,564element_variables = Dict{Symbol, Any}();565system = "")566# If this is called already as part of a multi-system setup (i.e., system is non-empty),567# we build a combined system name568if !isempty(system)569system_euler = system * "_euler"570system_gravity = system * "_gravity"571else572system_euler = "euler"573system_gravity = "gravity"574end575576u_euler = wrap_array_native(u_ode, semi.semi_euler)577filename_euler = save_solution_file(u_euler, t, dt, iter,578mesh_equations_solver_cache(semi.semi_euler)...,579solution_callback, element_variables,580system = system_euler)581582u_gravity = wrap_array_native(semi.cache.u_ode, semi.semi_gravity)583filename_gravity = save_solution_file(u_gravity, t, dt, iter,584mesh_equations_solver_cache(semi.semi_gravity)...,585solution_callback, element_variables,586system = system_gravity)587588return filename_euler, filename_gravity589end590591@inline function (amr_callback::AMRCallback)(u_ode,592semi::SemidiscretizationEulerGravity,593t, iter; kwargs...)594passive_args = ((semi.cache.u_ode,595mesh_equations_solver_cache(semi.semi_gravity)...),)596has_changed = amr_callback(u_ode, mesh_equations_solver_cache(semi.semi_euler)...,597semi, t, iter;598kwargs..., passive_args = passive_args)599600if has_changed601new_length = length(semi.cache.u_ode)602resize!(semi.cache.du_ode, new_length)603resize!(semi.cache.u_tmp1_ode, new_length)604resize!(semi.cache.u_tmp2_ode, new_length)605end606607return has_changed608end609end # @muladd610611612