Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/src/callbacks_step/lbm_collision.jl
2055 views
1
# By default, Julia/LLVM does not use fused multiply-add operations (FMAs).
2
# Since these FMAs can increase the performance of many numerical algorithms,
3
# we need to opt-in explicitly.
4
# See https://ranocha.de/blog/Optimizing_EC_Trixi for further details.
5
@muladd begin
6
#! format: noindent
7
8
"""
9
LBMCollisionCallback()
10
11
Apply the Lattice-Boltzmann method (LBM) collision operator before each time step.
12
See [`LatticeBoltzmannEquations2D`](@ref) for further details.
13
"""
14
function LBMCollisionCallback()
15
DiscreteCallback(lbm_collision_callback, lbm_collision_callback,
16
save_positions = (false, false),
17
initialize = initialize!)
18
end
19
20
# Always execute collision step after a time step, but not after the last step
21
lbm_collision_callback(u, t, integrator) = !isfinished(integrator)
22
23
function Base.show(io::IO,
24
cb::DiscreteCallback{<:Any, <:typeof(lbm_collision_callback)})
25
@nospecialize cb # reduce precompilation time
26
27
print(io, "LBMCollisionCallback()")
28
end
29
30
function Base.show(io::IO, ::MIME"text/plain",
31
cb::DiscreteCallback{<:Any, <:typeof(lbm_collision_callback)})
32
@nospecialize cb # reduce precompilation time
33
34
if get(io, :compact, false)
35
show(io, cb)
36
else
37
summary_box(io, "LBMCollisionCallback")
38
end
39
end
40
41
# Execute collision step once in the very beginning
42
function initialize!(cb::DiscreteCallback{Condition, Affect!}, u, t,
43
integrator) where {Condition,
44
Affect! <: typeof(lbm_collision_callback)}
45
cb.affect!(integrator)
46
end
47
48
# This method is called as callback after the StepsizeCallback during the time integration.
49
@inline function lbm_collision_callback(integrator)
50
dt = get_proposed_dt(integrator)
51
semi = integrator.p
52
mesh, equations, solver, cache = mesh_equations_solver_cache(semi)
53
@unpack collision_op = equations
54
55
u_ode = integrator.u
56
u = wrap_array(u_ode, mesh, equations, solver, cache)
57
58
@trixi_timeit timer() "LBM collision" apply_collision!(u, dt, collision_op, mesh,
59
equations, solver, cache)
60
61
return nothing
62
end
63
64
include("lbm_collision_dg2d.jl")
65
include("lbm_collision_dg3d.jl")
66
end # @muladd
67
68