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