\(\require{physics}\)

底面とのやり取り(拡散)

require('fantom')
BottomDiffusiveFlux = {}

function BottomDiffusiveFlux.new(var_name, bottom_value, diff_coef)
  local obj = {var_name=var_name, bottom_value=bottom_value, diff_coef=diff_coef,  col_nums={}}
  return setmetatable(obj, {__index = BottomDiffusiveFlux})
end
 
function BottomDiffusiveFlux:select_columns(water_body, limit)
	for i=0,water_body:box_columns():size()-1 do
	  local column = water_body:box_columns()[i]
	  if column:bottom_level().present < limit then
		  table.insert(self.col_nums,i)
	  end
  end
end
 
function BottomDiffusiveFlux:apply(water_body)
  for _,n in pairs(self.col_nums) do
	  local column    = water_body:box_columns()[n]
	  local box       = column:get_active_box(0)
	  local box_value = box:var_mean_present_value(self.var_name)
	  local increment = self.diff_coef*(self.bottom_value-box_value)*column:base_area()
		local water_density       = 999.842594
	  local heat_capacity_water = 4.17E03  	
	  box:var(self.var_name):add_increment(increment/(water_density*heat_capacity_water))
  end
end