Skip to content

Commit 226e23f

Browse files
committed
add resize
1 parent 4b7f515 commit 226e23f

File tree

3 files changed

+172
-0
lines changed

3 files changed

+172
-0
lines changed

src/TrixiParticles.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ include("general/system.jl")
4040
# `util.jl` needs to be next because of the macros `@trixi_timeit` and `@threaded`
4141
include("util.jl")
4242
include("preprocessing/preprocessing.jl")
43+
include("multi_resolution/multi_resolution.jl")
4344
include("callbacks/callbacks.jl")
4445
include("general/general.jl")
4546
include("setups/setups.jl")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include("resize.jl")

src/multi_resolution/resize.jl

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
function resize!(semi::Semidiscretization, v_ode, u_ode, _v_ode, _u_ode)
2+
# Resize all systems
3+
foreach_system(semi) do system
4+
resize!(system, capacity(system))
5+
end
6+
7+
resize!(v_ode, u_ode, _v_ode, _u_ode, semi)
8+
9+
return semi
10+
end
11+
12+
function deleteat!(semi::Semidiscretization, v_ode, u_ode, _v_ode, _u_ode)
13+
# Delete at specific indices
14+
foreach_system(semi) do system
15+
v = wrap_v(v_ode, system, semi)
16+
u = wrap_u(u_ode, system, semi)
17+
deleteat!(system, v, u)
18+
end
19+
20+
resize!(v_ode, u_ode, _v_ode, _u_ode, semi)
21+
22+
return semi
23+
end
24+
25+
function resize!(v_ode, u_ode, _v_ode, _u_ode, semi::Semidiscretization)
26+
copyto!(_v_ode, v_ode)
27+
copyto!(_u_ode, u_ode)
28+
29+
# Get ranges after resizing the systems
30+
ranges_v_new, ranges_u_new = ranges_vu(semi.systems)
31+
32+
ranges_v_old = semi.ranges_v
33+
ranges_u_old = semi.ranges_u
34+
35+
# Set ranges after resizing the systems
36+
for i in 1:length(semi.systems)
37+
semi.ranges_v[i] = ranges_v_new[i]
38+
semi.ranges_u[i] = ranges_u_new[i]
39+
end
40+
41+
for i in eachindex(ranges_u_old)
42+
length_u = min(length(ranges_u_old[i]), length(ranges_u_new[i]))
43+
for j in 1:length_u
44+
u_ode[ranges_u_new[i][1] + j] = _u_ode[ranges_u_old[i][1] + j]
45+
end
46+
47+
length_v = min(length(ranges_v_old[i]), length(ranges_v_new[i]))
48+
for j in 1:length_v
49+
v_ode[ranges_v_new[i][1] + j] = _v_ode[ranges_v_old[i][1] + j]
50+
end
51+
end
52+
53+
capacity_global = sum(system -> nparticles(system), semi.systems)
54+
55+
resize!(v_ode, capacity_global)
56+
resize!(u_ode, capacity_global)
57+
58+
resize!(_v_ode, capacity_global)
59+
resize!(_u_ode, capacity_global)
60+
61+
# TODO: Do the following in the callback
62+
# resize!(integrator, (length(v_ode), length(u_ode)))
63+
64+
# # Tell OrdinaryDiffEq that u has been modified
65+
# u_modified!(integrator, true)
66+
return v_ode
67+
end
68+
69+
resize!(system, capacity_system) = system
70+
71+
function resize!(system::FluidSystem, capacity_system)
72+
return resize!(system, system.particle_refinement, capacity_system)
73+
end
74+
75+
resize!(system, ::Nothing, capacity_system) = system
76+
77+
function resize!(system::WeaklyCompressibleSPHSystem, refinement, capacity_system::Int)
78+
(; mass, pressure, cache, density_calculator) = system
79+
80+
refinement.n_particles_before_resize = nparticles(system)
81+
82+
resize!(mass, capacity_system)
83+
resize!(pressure, capacity_system)
84+
resize_density!(system, capacity_system, density_calculator)
85+
resize_cache!(system, cache, n)
86+
end
87+
88+
function resize!(system::EntropicallyDampedSPHSystem, refinement, capacity_system::Int)
89+
(; mass, cache, density_calculator) = system
90+
91+
refinement.n_particles_before_resize = nparticles(system)
92+
93+
resize!(mass, capacity_system)
94+
resize_density!(system, capacity_system, density_calculator)
95+
resize_cache!(system, capacity_system)
96+
97+
return system
98+
end
99+
100+
resize_density!(system, n::Int, ::SummationDensity) = resize!(system.cache.density, n)
101+
resize_density!(system, n::Int, ::ContinuityDensity) = system
102+
103+
function resize_cache!(system, n::Int)
104+
resize!(system.cache.smoothing_length, n)
105+
106+
return system
107+
end
108+
109+
function resize_cache!(system::EntropicallyDampedSPHSystem, n)
110+
resize!(system.cache.smoothing_length, n)
111+
resize!(system.cache.pressure_average, n)
112+
resize!(system.cache.neighbor_counter, n)
113+
114+
return system
115+
end
116+
117+
deleteat!(system, v, u) = system
118+
119+
function deleteat!(system::FluidSystem, v, u)
120+
return deleteat!(system, system.particle_refinement, v, u)
121+
end
122+
123+
deleteat!(system, ::Nothing, v, u) = system
124+
125+
function deleteat!(system::FluidSystem, refinement, v, u)
126+
(; delete_candidates) = refinement
127+
128+
delete_counter = 0
129+
130+
for particle in eachparticle(system)
131+
if !iszero(delete_candidates[particle])
132+
# swap particles (keep -> delete)
133+
dump_id = nparticles(system) - delete_counter
134+
135+
vel_keep = current_velocity(v, system, dump_id)
136+
pos_keep = current_coords(u, system, dump_id)
137+
138+
mass_keep = hydrodynamic_mass(system, dump_id)
139+
density_keep = particle_density(system, v, dump_id)
140+
pressure_keep = particle_pressure(system, v, dump_id)
141+
smoothing_length_keep = smoothing_length(system, dump_id)
142+
143+
system.mass[particle] = mass_keep
144+
system.cache.smoothing_length[particle] = smoothing_length_keep
145+
146+
set_particle_pressure!(v, system, particle, pressure_keep)
147+
148+
set_particle_density!(v, system, particle, density_keep)
149+
150+
for dim in 1:ndims(system)
151+
v[dim, particle] = vel_keep[dim]
152+
u[dim, particle] = pos_keep[dim]
153+
end
154+
155+
delete_counter += 1
156+
end
157+
end
158+
159+
resize!(system, nparticles(system) - delete_counter)
160+
161+
return system
162+
end
163+
164+
@inline capacity(system) = capacity(system, system.particle_refinement)
165+
166+
@inline capacity(system, ::Nothing) = nparticles(system)
167+
168+
@inline function capacity(system, particle_refinement)
169+
return particle_refinement.n_new_particles + nparticles(system)
170+
end

0 commit comments

Comments
 (0)