Path: blob/main/src/callbacks_step/stepsize_dg1d.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: noindent67function max_dt(u, t, mesh::TreeMesh{1},8constant_speed::False, equations, dg::DG, cache)9# to avoid a division by zero if the speed vanishes everywhere,10# e.g. for steady-state linear advection11max_scaled_speed = nextfloat(zero(t))1213@batch reduction=(max, max_scaled_speed) for element in eachelement(dg, cache)14max_lambda1 = zero(max_scaled_speed)15for i in eachnode(dg)16u_node = get_node_vars(u, equations, dg, i, element)17lambda1, = max_abs_speeds(u_node, equations)18max_lambda1 = max(max_lambda1, lambda1)19end20inv_jacobian = cache.elements.inverse_jacobian[element]21max_scaled_speed = max(max_scaled_speed, inv_jacobian * max_lambda1)22end2324return 2 / (nnodes(dg) * max_scaled_speed)25end2627function max_dt(u, t, mesh::TreeMesh{1},28constant_speed::True, equations, dg::DG, cache)29# to avoid a division by zero if the speed vanishes everywhere,30# e.g. for steady-state linear advection31max_scaled_speed = nextfloat(zero(t))3233max_lambda1, = max_abs_speeds(equations)3435@batch reduction=(max, max_scaled_speed) for element in eachelement(dg, cache)36inv_jacobian = cache.elements.inverse_jacobian[element]37max_scaled_speed = max(max_scaled_speed, inv_jacobian * max_lambda1)38end3940return 2 / (nnodes(dg) * max_scaled_speed)41end4243function max_dt(u, t, mesh::StructuredMesh{1},44constant_speed::False, equations, dg::DG, cache)45# to avoid a division by zero if the speed vanishes everywhere,46# e.g. for steady-state linear advection47max_scaled_speed = nextfloat(zero(t))4849@batch reduction=(max, max_scaled_speed) for element in eachelement(dg, cache)50max_lambda1 = zero(max_scaled_speed)5152for i in eachnode(dg)53u_node = get_node_vars(u, equations, dg, i, element)54lambda1, = max_abs_speeds(u_node, equations)5556inv_jacobian = cache.elements.inverse_jacobian[i, element]5758max_lambda1 = max(max_lambda1, inv_jacobian * lambda1)59end6061max_scaled_speed = max(max_scaled_speed, max_lambda1)62end6364return 2 / (nnodes(dg) * max_scaled_speed)65end6667function max_dt(u, t, mesh::StructuredMesh{1},68constant_speed::True, equations, dg::DG, cache)69# to avoid a division by zero if the speed vanishes everywhere,70# e.g. for steady-state linear advection71max_scaled_speed = nextfloat(zero(t))7273max_lambda1, = max_abs_speeds(equations)7475@batch reduction=(max, max_scaled_speed) for element in eachelement(dg, cache)76for i in eachnode(dg)77inv_jacobian = cache.elements.inverse_jacobian[i, element]78max_scaled_speed = max(max_scaled_speed, inv_jacobian * max_lambda1)79end80end8182return 2 / (nnodes(dg) * max_scaled_speed)83end84end # @muladd858687