2024-01-14 16:57:13 +11:00
|
|
|
|
|
|
|
#include "rod.hpp"
|
2024-01-29 01:26:07 +11:00
|
|
|
#include "reactor.hpp"
|
2024-02-16 15:07:33 +11:00
|
|
|
#include "../util/math.hpp"
|
2024-01-14 16:57:13 +11:00
|
|
|
|
2024-01-15 12:45:22 +11:00
|
|
|
#include <cmath>
|
|
|
|
|
2024-01-14 17:07:45 +11:00
|
|
|
using namespace sim::reactor;
|
2024-01-14 16:57:13 +11:00
|
|
|
|
2024-02-02 13:05:28 +11:00
|
|
|
// Avogadro's Number
|
|
|
|
static double N_a = 6.02214076e23;
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
double Rod::get(val_t type) const
|
2024-01-14 16:57:13 +11:00
|
|
|
{
|
|
|
|
return vals[type];
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
void Rod::add(val_t type, double v)
|
2024-01-14 16:57:13 +11:00
|
|
|
{
|
2024-01-18 18:00:39 +11:00
|
|
|
vals[type] += v;
|
2024-01-14 16:57:13 +11:00
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
double Rod::extract(val_t type, double s, double k, double o)
|
2024-01-14 16:57:13 +11:00
|
|
|
{
|
2024-01-15 17:15:08 +11:00
|
|
|
k *= get_k(type);
|
|
|
|
|
|
|
|
double m = 1;
|
2024-01-18 18:00:39 +11:00
|
|
|
k = 1 - k * get_k(type);
|
|
|
|
|
|
|
|
if(k > 0)
|
2024-01-15 17:15:08 +11:00
|
|
|
{
|
2024-01-18 18:00:39 +11:00
|
|
|
m = 1 - std::pow(0.5, s * -std::log2(k));
|
2024-01-15 17:15:08 +11:00
|
|
|
}
|
2024-01-18 18:00:39 +11:00
|
|
|
|
2024-01-15 17:15:08 +11:00
|
|
|
double v = m * 0.5 * (get(type) - o);
|
2024-01-18 18:00:39 +11:00
|
|
|
vals[type] -= v;
|
2024-02-02 13:05:28 +11:00
|
|
|
|
2024-01-14 16:57:13 +11:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
void Rod::interact(Rod* o, double secs)
|
2024-01-14 16:57:13 +11:00
|
|
|
{
|
2024-02-16 16:51:25 +11:00
|
|
|
for(int i = 0; i < Rod::VAL_N; i++)
|
2024-01-14 16:57:13 +11:00
|
|
|
{
|
2024-02-02 13:05:28 +11:00
|
|
|
val_t t = (val_t)i;
|
|
|
|
double v = o->extract(t, secs, get_k(t), get(t));
|
|
|
|
add(t, v);
|
|
|
|
|
|
|
|
double v2 = std::abs(v / secs);
|
|
|
|
o->vals_n[t] += v2;
|
|
|
|
vals_n[t] += v2;
|
2024-01-14 16:57:13 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
glm::vec4 Rod::get_heat_colour() const
|
2024-02-16 15:07:33 +11:00
|
|
|
{
|
|
|
|
double temp = vals[val_t::HEAT];
|
|
|
|
|
|
|
|
if(temp < 0)
|
|
|
|
{
|
|
|
|
temp = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// this should not happen
|
|
|
|
if(std::isnan(temp))
|
|
|
|
{
|
|
|
|
return {1, 0, 1, 1};
|
|
|
|
}
|
|
|
|
|
|
|
|
if(temp < 120)
|
|
|
|
{
|
|
|
|
return {0, util::map(temp, 0, 120, 0, 1), 1, 1};
|
|
|
|
}
|
|
|
|
|
|
|
|
if(temp < 240)
|
|
|
|
{
|
|
|
|
return {0, 1, util::map(temp, 120, 240, 1, 0), 1};
|
|
|
|
}
|
|
|
|
|
|
|
|
if(temp < 280)
|
|
|
|
{
|
|
|
|
return {util::map(temp, 240, 280, 0, 1), 1, 0, 1};
|
|
|
|
}
|
|
|
|
|
|
|
|
if(temp < 320)
|
|
|
|
{
|
|
|
|
return {1, util::map(temp, 280, 320, 1, 0), 0, 1};
|
|
|
|
}
|
|
|
|
|
|
|
|
return {1, 0, 0, 1};
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
double Rod::get_flux() const
|
2024-02-02 13:05:28 +11:00
|
|
|
{
|
|
|
|
return (vals_n[val_t::N_FAST] + vals_n[val_t::N_SLOW]) * N_a / (get_side_area() * 10000) / 4;
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
double Rod::get_volume() const
|
2024-01-29 01:26:07 +11:00
|
|
|
{
|
2024-02-16 16:51:25 +11:00
|
|
|
auto r = (sim::reactor::Reactor*)reactor;
|
2024-01-29 01:26:07 +11:00
|
|
|
return r->cell_width * r->cell_width * r->cell_height;
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
double Rod::get_side_area() const
|
2024-02-02 13:05:28 +11:00
|
|
|
{
|
2024-02-16 16:51:25 +11:00
|
|
|
auto r = (sim::reactor::Reactor*)reactor;
|
2024-02-02 13:05:28 +11:00
|
|
|
return r->cell_width * r->cell_height;
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
void Rod::update_rod(double secs)
|
2024-01-18 18:00:39 +11:00
|
|
|
{
|
2024-01-15 16:30:54 +11:00
|
|
|
// decay the free neutrons
|
|
|
|
double m = std::pow(0.5, secs / 879.4);
|
|
|
|
vals[val_t::N_FAST] *= m;
|
|
|
|
vals[val_t::N_SLOW] *= m;
|
2024-02-02 13:05:28 +11:00
|
|
|
|
|
|
|
// clear data
|
2024-02-16 16:51:25 +11:00
|
|
|
for(int i = 0; i < Rod::VAL_N; i++)
|
2024-02-02 13:05:28 +11:00
|
|
|
{
|
|
|
|
vals_n[(val_t)i] = 0;
|
|
|
|
}
|
2024-01-14 16:57:13 +11:00
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
Rod::Rod(const Json::Value& node)
|
2024-02-14 00:38:28 +11:00
|
|
|
{
|
|
|
|
const Json::Value& j_vals = node["vals"];
|
|
|
|
|
|
|
|
selected = node["selected"].asBool();
|
|
|
|
|
|
|
|
for(int i = 0; i < VAL_N; i++)
|
|
|
|
{
|
|
|
|
vals[i] = j_vals[i][0].asDouble();
|
|
|
|
vals_n[i] = j_vals[i][1].asDouble();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-16 16:51:25 +11:00
|
|
|
Json::Value Rod::serialize() const
|
2024-02-13 22:33:55 +11:00
|
|
|
{
|
|
|
|
Json::Value node;
|
|
|
|
Json::Value j_vals;
|
|
|
|
|
|
|
|
for(int i = 0; i < VAL_N; i++)
|
|
|
|
{
|
|
|
|
Json::Value j_val;
|
|
|
|
|
|
|
|
j_val.append(vals[i]);
|
|
|
|
j_val.append(vals_n[i]);
|
|
|
|
j_vals.append(std::move(j_val));
|
|
|
|
}
|
|
|
|
|
|
|
|
node["selected"] = selected;
|
|
|
|
node["vals"] = std::move(j_vals);
|
|
|
|
node["id"] = get_id();
|
|
|
|
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|