\(\require{physics}\)
require('particle')
require('fantom')
function container_particle_seeding(water_body, particle_tracking, i, j, x_interval, y_interval, z_interval)
num_particles = 0
eps = 0.01
west_end = water_body:dx()*i+eps
south_end = water_body:dy()*j+eps
nx = water_body:dx()/x_interval
ny = water_body:dy()/y_interval
nz = water_body:thickness()/z_interval
for i=0, nx do
for j=0, ny do
for k=0, nz do
if particle_tracking:add_particle_bool(west_end+i*x_interval, south_end+j*y_interval, k*z_interval)==true then
num_particles = num_particles+1
end
end
end
end
print("particles has been added: ", num_particles)
end
ParticleControl = {}
function ParticleControl.new(timings, time_shift, particle_tracking)
local obj = {timings = timings, time_shift=time_shift, particle_tracking=particle_tracking}
return setmetatable(obj, {__index = ParticleControl})
end
function ParticleControl:set_settling_velocity(time)
particle_diameter = 0.001
particle_density = 1000.0+30*math.sin((time+self.time_shift)/(3600*24)*2.0*math.pi)
for n=0, self.particle_tracking:particles():size()-1 do
ambient_salinity = self.particle_tracking:get_particle_scalar(n, "salinity", time)
ambient_temperature = self.particle_tracking:get_particle_scalar(n, "temperature", time)
ambient_density = fantom.unesco_density(ambient_temperature, ambient_salinity)
stokes_velocity = particle_diameter^2*(particle_density-ambient_density)*9.8/(18.0*0.0001)
self.particle_tracking:particles()[n]:set_additional_velocity(0,0,stokes_velocity)
end
end
function ParticleControl:add_particles(counter, water_body, i, j, x_interval, y_interval, z_interval)
for _,v in pairs(self.timings) do
if v == counter then
container_particle_seeding(water_body, self.particle_tracking, i, j, x_interval, y_interval, z_interval)
break
end
end
end