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