Skip to content

Commit 20da330

Browse files
authored
Merge branch 'main' into inplace-dv
2 parents 6324de7 + 155f9f1 commit 20da330

File tree

7 files changed

+58
-38
lines changed

7 files changed

+58
-38
lines changed

src/general/buffer.jl

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ end
4040
# Dispatch by system type to handle systems that provide a buffer.
4141
@inline buffer(system) = nothing
4242

43-
@inline update_system_buffer!(buffer::Nothing, semi) = buffer
43+
@inline update_system_buffer!(buffer::Nothing) = buffer
4444

4545
# TODO `resize` allocates. Find a non-allocating version
46-
@inline function update_system_buffer!(buffer::SystemBuffer, semi)
46+
@inline function update_system_buffer!(buffer::SystemBuffer)
4747
(; active_particle) = buffer
4848

4949
# TODO: Parallelize (see https://github.com/trixi-framework/TrixiParticles.jl/issues/810)
@@ -64,7 +64,7 @@ end
6464
return view(buffer.eachparticle, 1:buffer.active_particle_count[])
6565
end
6666

67-
@inline function deactivate_particle!(system, particle, u)
67+
@inline function deactivate_particle!(system, particle, v, u)
6868
(; active_particle) = system.buffer
6969

7070
# Set particle far away from simulation domain
@@ -73,6 +73,14 @@ end
7373
u[dim, particle] = eltype(system)(1e16)
7474
end
7575

76+
# To ensure that the velocity of an inactive particle does not dominate the time step
77+
# in adaptive time integrators, set this velocity to zero.
78+
# Additionally, this enables map-reduce operations for `v_max` computation
79+
# without having to distinguish inactive particles.
80+
for dim in 1:ndims(system)
81+
v[dim, particle] = 0
82+
end
83+
7684
# `deactivate_particle!` and `active_particle[particle] = true`
7785
# are never called on the same buffer inside a kernel,
7886
# so we don't have any race conditions on this `active_particle` vector.

src/general/custom_quantities.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ Returns the total kinetic energy of all particles in a system.
66
function kinetic_energy(system, dv_ode, du_ode, v_ode, u_ode, semi, t)
77
v = wrap_v(v_ode, system, semi)
88

9-
# TODO: `current_velocity` should only contain active particles
10-
# (see https://github.com/trixi-framework/TrixiParticles.jl/issues/850)
119
velocity = reinterpret(reshape, SVector{ndims(system), eltype(v)},
1210
view(current_velocity(v, system), :,
1311
each_active_particle(system)))

src/schemes/boundary/open_boundary/dynamical_pressure.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ end
5454
end
5555

5656
@inline function density_calculator(system::OpenBoundarySystem{<:BoundaryModelDynamicalPressureZhang})
57-
return system.cache.density_calculator
57+
return ContinuityDensity()
5858
end
5959

6060
@inline impose_rest_density!(v, system, particle, boundary_model) = v

src/schemes/boundary/open_boundary/rhs.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ function interact!(dv, v_particle_system, u_particle_system,
33
v_neighbor_system, u_neighbor_system,
44
particle_system::OpenBoundarySystem{<:BoundaryModelDynamicalPressureZhang},
55
neighbor_system, semi)
6-
(; fluid_system, cache, boundary_model) = particle_system
6+
(; fluid_system, cache) = particle_system
77

88
sound_speed = system_sound_speed(fluid_system)
99

@@ -59,13 +59,11 @@ function interact!(dv, v_particle_system, u_particle_system,
5959
v_diff = current_velocity(v_particle_system, particle_system, particle) -
6060
current_velocity(v_neighbor_system, neighbor_system, neighbor)
6161

62-
# Continuity equation
63-
@inbounds dv[end, particle] += rho_a / rho_b * m_b * dot(v_diff, grad_kernel)
64-
65-
density_diffusion!(dv, density_diffusion(particle_system),
66-
v_particle_system, particle, neighbor,
67-
pos_diff, distance, m_b, rho_a, rho_b,
68-
particle_system, grad_kernel)
62+
# Propagate `@inbounds` to the continuity equation, which accesses particle data
63+
@inbounds continuity_equation!(dv, particle_system, neighbor_system,
64+
v_particle_system, v_neighbor_system, particle,
65+
neighbor, pos_diff, distance, m_b, rho_a, rho_b,
66+
grad_kernel)
6967

7068
# Open boundary pressure evolution matches the corresponding fluid system:
7169
# - EDAC: Compute pressure evolution like the fluid system

src/schemes/boundary/open_boundary/system.jl

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ function OpenBoundarySystem(boundary_zones::Union{BoundaryZone, Nothing}...;
7575
pressure_acceleration=fluid_system.pressure_acceleration_formulation,
7676
shifting_technique=boundary_model isa
7777
BoundaryModelDynamicalPressureZhang ?
78-
shifting_technique(fluid_system) : nothing)
78+
shifting_technique(fluid_system) : nothing,
79+
density_diffusion=boundary_model isa
80+
BoundaryModelDynamicalPressureZhang ?
81+
density_diffusion(fluid_system) : nothing)
7982
boundary_zones_ = filter(bz -> !isnothing(bz), boundary_zones)
8083

8184
initial_conditions = union((bz.initial_condition for bz in boundary_zones_)...)
@@ -90,7 +93,8 @@ function OpenBoundarySystem(boundary_zones::Union{BoundaryZone, Nothing}...;
9093
cache = (;
9194
create_cache_shifting(initial_conditions, shifting_technique)...,
9295
create_cache_open_boundary(boundary_model, fluid_system, initial_conditions,
93-
calculate_flow_rate, boundary_zones_)...)
96+
density_diffusion, calculate_flow_rate,
97+
boundary_zones_)...)
9498

9599
if any(pr -> isa(pr, RCRWindkesselModel), cache.pressure_reference_values)
96100
calculate_flow_rate = true
@@ -130,7 +134,7 @@ function initialize!(system::OpenBoundarySystem, semi)
130134
end
131135

132136
function create_cache_open_boundary(boundary_model, fluid_system, initial_condition,
133-
calculate_flow_rate, boundary_zones)
137+
density_diffusion, calculate_flow_rate, boundary_zones)
134138
reference_values = map(bz -> bz.reference_values, boundary_zones)
135139
ELTYPE = eltype(initial_condition)
136140

@@ -174,15 +178,14 @@ function create_cache_open_boundary(boundary_model, fluid_system, initial_condit
174178
# as it was already verified in `allocate_buffer` that the density array is constant.
175179
density_rest = first(initial_condition.density)
176180

177-
dd = density_diffusion(fluid_system)
178-
if dd isa DensityDiffusionAntuono
179-
density_diffusion_ = DensityDiffusionAntuono(initial_condition; delta=dd.delta)
181+
if density_diffusion isa DensityDiffusionAntuono
182+
density_diffusion_ = DensityDiffusionAntuono(initial_condition;
183+
delta=density_diffusion.delta)
180184
else
181-
density_diffusion_ = dd
185+
density_diffusion_ = density_diffusion
182186
end
183187

184-
cache = (; density_calculator=ContinuityDensity(),
185-
density_diffusion=density_diffusion_,
188+
cache = (; density_diffusion=density_diffusion_,
186189
pressure_boundary=pressure_boundary,
187190
density_rest=density_rest, cache...)
188191

@@ -261,6 +264,10 @@ system_sound_speed(system::OpenBoundarySystem) = system_sound_speed(system.fluid
261264

262265
@inline hydrodynamic_mass(system::OpenBoundarySystem, particle) = system.mass[particle]
263266

267+
@propagate_inbounds function current_velocity(v, system::OpenBoundarySystem)
268+
return view(v, 1:ndims(system), :)
269+
end
270+
264271
@inline function current_density(v, system::OpenBoundarySystem)
265272
return system.cache.density
266273
end
@@ -306,6 +313,9 @@ function update_boundary_interpolation!(system::OpenBoundarySystem, v, u, v_ode,
306313
semi, t)
307314
update_boundary_model!(system, system.boundary_model, v, u, v_ode, u_ode, semi, t)
308315
update_shifting!(system, shifting_technique(system), v, u, v_ode, u_ode, semi)
316+
317+
@trixi_timeit timer() "update density diffusion" update!(density_diffusion(system),
318+
v, u, system, semi)
309319
end
310320

311321
# This function is called by the `UpdateCallback`, as the integrator array might be modified
@@ -397,8 +407,8 @@ function check_domain!(system, v, u, v_ode, u_ode, semi)
397407
v, u, v_fluid, u_fluid)
398408
end
399409

400-
update_system_buffer!(system.buffer, semi)
401-
update_system_buffer!(fluid_system.buffer, semi)
410+
update_system_buffer!(system.buffer)
411+
update_system_buffer!(fluid_system.buffer)
402412

403413
fluid_candidates .= false
404414

@@ -428,8 +438,8 @@ function check_domain!(system, v, u, v_ode, u_ode, semi)
428438
v, u, v_fluid, u_fluid)
429439
end
430440

431-
update_system_buffer!(system.buffer, semi)
432-
update_system_buffer!(fluid_system.buffer, semi)
441+
update_system_buffer!(system.buffer)
442+
update_system_buffer!(fluid_system.buffer)
433443

434444
# Since particles have been transferred, the neighborhood searches must be updated
435445
update_nhs!(semi, u_ode)
@@ -453,7 +463,7 @@ end
453463
# to determine if it exited the boundary zone through the free surface (outflow).
454464
if dot(relative_position, boundary_zone.face_normal) < 0
455465
# Particle is outside the fluid domain
456-
deactivate_particle!(system, particle, u)
466+
deactivate_particle!(system, particle, v, u)
457467

458468
return system
459469
end
@@ -475,7 +485,7 @@ end
475485
# Verify the particle remains inside the boundary zone after the reset; deactivate it if not.
476486
particle_coords = current_coords(u, system, particle)
477487
if !is_in_boundary_zone(boundary_zone, particle_coords)
478-
deactivate_particle!(system, particle, u)
488+
deactivate_particle!(system, particle, v, u)
479489

480490
return system
481491
end
@@ -494,7 +504,7 @@ end
494504
transfer_particle!(system, fluid_system, particle, particle_new, v, u, v_fluid, u_fluid)
495505

496506
# Deactivate particle in interior domain
497-
deactivate_particle!(fluid_system, particle, u_fluid)
507+
deactivate_particle!(fluid_system, particle, v_fluid, u_fluid)
498508

499509
return fluid_system
500510
end

src/schemes/fluid/fluid.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,15 @@ end
143143
v_particle_system, v_neighbor_system,
144144
particle, neighbor, pos_diff, distance,
145145
m_b, rho_a, rho_b, grad_kernel)
146+
return continuity_equation!(dv, particle_system, neighbor_system, v_particle_system,
147+
v_neighbor_system, particle, neighbor, pos_diff, distance,
148+
m_b, rho_a, rho_b, grad_kernel)
149+
end
150+
151+
@propagate_inbounds function continuity_equation!(dv, particle_system, neighbor_system,
152+
v_particle_system, v_neighbor_system,
153+
particle, neighbor, pos_diff, distance,
154+
m_b, rho_a, rho_b, grad_kernel)
146155
vdiff = current_velocity(v_particle_system, particle_system, particle) -
147156
current_velocity(v_neighbor_system, neighbor_system, neighbor)
148157

test/general/buffer.jl

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,22 @@
2828
particle_id = findfirst(==(false), system_buffer.buffer.active_particle)
2929
system_buffer.buffer.active_particle[particle_id] = true
3030

31-
TrixiParticles.update_system_buffer!(system_buffer.buffer,
32-
DummySemidiscretization())
31+
TrixiParticles.update_system_buffer!(system_buffer.buffer)
3332

3433
@test TrixiParticles.each_integrated_particle(system_buffer) == 1:(n_particles + 1)
3534

3635
TrixiParticles.deactivate_particle!(system_buffer, particle_id,
37-
ones(2, particle_id))
36+
zeros(2, particle_id), ones(2, particle_id))
3837

39-
TrixiParticles.update_system_buffer!(system_buffer.buffer,
40-
DummySemidiscretization())
38+
TrixiParticles.update_system_buffer!(system_buffer.buffer)
4139

4240
@test TrixiParticles.each_integrated_particle(system_buffer) == 1:n_particles
4341

4442
particle_id = 5
4543
TrixiParticles.deactivate_particle!(system_buffer, particle_id,
46-
ones(2, particle_id))
44+
zeros(2, particle_id), ones(2, particle_id))
4745

48-
TrixiParticles.update_system_buffer!(system_buffer.buffer,
49-
DummySemidiscretization())
46+
TrixiParticles.update_system_buffer!(system_buffer.buffer)
5047

5148
@test TrixiParticles.each_integrated_particle(system_buffer) ==
5249
setdiff(1:n_particles, particle_id)

0 commit comments

Comments
 (0)