| 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 |