From ab7afb7b248ac50cfb686f52cba7ecbcac613623 Mon Sep 17 00:00:00 2001 From: Jay Robson Date: Wed, 17 Jan 2024 14:14:59 +1100 Subject: [PATCH] tweaked parameters --- src/main.cpp | 55 ++++++++++++--------- src/reactor/coolant/pipe.cpp | 2 +- src/reactor/coolant/vessel.cpp | 2 +- src/reactor/fuel/fuel_rod.cpp | 2 + src/reactor/fuel/sample.cpp | 87 +++++++++++++++++++--------------- src/reactor/fuel/sample.hpp | 10 +++- 6 files changed, 95 insertions(+), 63 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b7bd318..74e6664 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,15 +35,20 @@ int main() sim::reactor::fuel::fuel_rod(2000, 4000), sim::reactor::control::control_rod(10000, 1), sim::reactor::coolant::pipe(vessel), { - "# #", - " FCF ", + "# ##", + "#FCF ", " C C ", - " FCF ", - "# #" + " FCF#", + "## #" }); double secs = 0; long clock = get_now(); + double speed = 10000; + int framerate = 100; + int extra = 100; + + speed /= extra; for(;;) { @@ -53,30 +58,36 @@ int main() { long mins = secs / 60; + long hours = mins / 60; + long days = hours / 24; + long years = days / 365; double s = fmod(secs, 60); - long hours = mins / 60; mins %= 60; - - long days = hours / 24; hours %= 24; - - long years = days / 365; days %= 365; ss << "Time:\n"; - if(years > 0) ss << years << "y "; - if(days > 0) ss << days << "d "; - if(hours > 0) ss << hours << "h "; - if(mins > 0) ss << mins << "m "; - - ss << s << "s\n\n"; + if(years > 0) goto years; + if(days > 0) goto days; + if(hours > 0) goto hours; + if(mins > 0) goto mins; + goto secs; + +years: ss << years << "y "; +days: ss << days << "d "; +hours: ss << hours << "h "; +mins: ss << mins << "m "; +secs: ss << s << "s\n\n"; } - reactor.update(0.01); - vessel.update(); - secs += 0.01; + for(int i = 0; i < extra; i++) + { + reactor.update(speed / framerate); + vessel.update(); + secs += speed / framerate; + } ss << "Vessel\n" << vessel << "\n"; @@ -84,7 +95,7 @@ int main() display::draw_text(1, 0, ss.str().c_str()); const int X = 1, Y = 30; - const int W = 36, H = 10; + const int W = 36, H = 11; for(int x = 0; x < reactor.width; x++) for(int y = 0; y < reactor.height; y++) @@ -141,13 +152,13 @@ int main() long now = get_now(); - while(clock + 10000 > now) + while(clock + 1e6 / framerate > now) { - usleep(clock + 10000 - now); + usleep(clock + 1e6 / framerate - now); now = get_now(); } - clock += 10000; + clock += 1e6 / framerate; } return 0; diff --git a/src/reactor/coolant/pipe.cpp b/src/reactor/coolant/pipe.cpp index cbd2f47..b0edd86 100644 --- a/src/reactor/coolant/pipe.cpp +++ b/src/reactor/coolant/pipe.cpp @@ -11,7 +11,7 @@ pipe::pipe(coolant::vessel& v) double pipe::get_k(val_t type) const { - return vessel->get_level() / vessel->get_volume(); + return vessel->get_level() / vessel->get_volume() * 0.5; } void pipe::update(double secs) diff --git a/src/reactor/coolant/vessel.cpp b/src/reactor/coolant/vessel.cpp index 468bf0b..a2d9a4d 100644 --- a/src/reactor/coolant/vessel.cpp +++ b/src/reactor/coolant/vessel.cpp @@ -33,7 +33,7 @@ double vessel::add_heat(double t1) { double t2 = get_heat(); double t = t1 - t2; - double m1 = 1; + double m1 = 1000; double m2 = level + fluid.g_to_l(steam); double m = m1 + m2; diff --git a/src/reactor/fuel/fuel_rod.cpp b/src/reactor/fuel/fuel_rod.cpp index 8599902..1169061 100644 --- a/src/reactor/fuel/fuel_rod.cpp +++ b/src/reactor/fuel/fuel_rod.cpp @@ -13,6 +13,8 @@ void fuel_rod::display(std::ostream& o) const o << "Fuel: " << s.get_fuel() << " / " << s.get_mass() << " mol\n"; o << "Efficiency: " << (s.get_efficiency() * 100) << " %\n"; o << "Energy: +" << s.get_energy() << " C\n"; + o << "Iodine: " << s.get_i_135() << " mol\n"; + o << "Xenon: " << s.get_xe_135() << " mol\n"; } double fuel_rod::get_k(val_t type) const diff --git a/src/reactor/fuel/sample.cpp b/src/reactor/fuel/sample.cpp index bdc9402..f821f66 100644 --- a/src/reactor/fuel/sample.cpp +++ b/src/reactor/fuel/sample.cpp @@ -12,6 +12,53 @@ sample::sample(double fuel, double mass) this->mass = mass; } +void sample::absorb_fast_neutrons() +{ + double volume = get_volume(); + double neutrons = fast_neutrons; + double neutrons_iodine = neutrons * (i_135 / volume); + double neutrons_xenon = neutrons * ((xe_135 * Xe_135_M) / volume); + double used_total = neutrons * (i_135 + xe_135 * Xe_135_M) / volume; + fast_neutrons -= used_total; + + // deal with these edge cases + if(xe_135 < 0) { fast_neutrons -= xe_135; xe_135 = 0; } + if(i_135 < 0) { fast_neutrons -= i_135; i_135 = 0; } +} + +void sample::absorb_slow_neutrons() +{ + // absorb neutrons + double volume = get_volume(); + double neutrons = slow_neutrons; + double neutrons_fuel = neutrons * (fuel / volume); + double neutrons_iodine = neutrons * (i_135 / volume); + double neutrons_xenon = neutrons * ((xe_135 * Xe_135_M) / volume); + double neutrons_total = neutrons; + slow_neutrons = 0; + + xe_135 -= neutrons_xenon; + i_135 -= neutrons_iodine; + fuel -= neutrons_fuel; + + // do the poison + te_135 += neutrons_fuel * (1.0 / 50.0); + xe_135 -= neutrons_xenon; + i_135 -= neutrons_iodine; + + // deal with these edge cases + if(xe_135 < 0) { slow_neutrons -= xe_135; xe_135 = 0; } + if(i_135 < 0) { slow_neutrons -= i_135; i_135 = 0; } + if(fuel < 0) { slow_neutrons -= fuel; fuel = 0; } + + efficiency = neutrons_fuel / neutrons_total; + + // simulate fuel use + energy += neutrons_fuel; + waste.add_fissile(neutrons_fuel * 6); + +} + void sample::update(double secs) { double m; @@ -34,44 +81,10 @@ void sample::update(double secs) m = half_life::get(secs, half_life::Te_135); i_135 += te_135 * (1 - m); te_135 *= m; - + // absorb neutrons - double volume = get_volume(); - double neutrons = slow_neutrons + NEUTRON_BG * secs; - double neutrons_fuel = neutrons * (fuel / volume); - double neutrons_iodine = neutrons * (i_135 / volume); - double neutrons_xenon = neutrons * ((xe_135 * Xe_135_M) / volume); - slow_neutrons = 0; - - // deal with these edge cases - - if(neutrons_fuel > fuel) - { - slow_neutrons += neutrons_fuel - fuel; - neutrons_fuel = fuel; - } - - if(neutrons_xenon > xe_135) - { - slow_neutrons += neutrons_xenon - xe_135; - neutrons_xenon = xe_135; - } - - if(neutrons_iodine > i_135) - { - slow_neutrons += neutrons_iodine - i_135; - neutrons_iodine = i_135; - } - - // sim::reactor::fuelulate fuel use - fuel -= neutrons_fuel; - energy += neutrons_fuel; - waste.add_fissile(neutrons_fuel * 6); - - // do the poison - te_135 += neutrons_fuel * (1.0 / 8.0); - xe_135 -= neutrons_xenon; - i_135 -= neutrons_iodine; + slow_neutrons += NEUTRON_BG * secs; + absorb_slow_neutrons(); } double sample::extract_energy() diff --git a/src/reactor/fuel/sample.hpp b/src/reactor/fuel/sample.hpp index 4278319..c34b5fb 100644 --- a/src/reactor/fuel/sample.hpp +++ b/src/reactor/fuel/sample.hpp @@ -10,7 +10,7 @@ namespace sim::reactor::fuel class sample { - constexpr static const double Xe_135_M = 1e3; + constexpr static const double Xe_135_M = 1e6; sim::reactor::fuel::waste waste; @@ -23,8 +23,11 @@ class sample double energy = 0; double fast_neutrons = 0; double slow_neutrons = 0; + double efficiency = 0; void display(std::ostream& o) const; + void absorb_fast_neutrons(); + void absorb_slow_neutrons(); public: @@ -39,7 +42,10 @@ public: constexpr double get_mass() const { return mass; } constexpr double get_energy() const { return energy; } constexpr double get_volume() const { return mass + xe_135 * Xe_135_M; } - constexpr double get_efficiency() const { return fuel / get_volume(); } + constexpr double get_efficiency() const { return efficiency; } + constexpr double get_te_135() const { return te_135; } + constexpr double get_i_135() const { return i_135; } + constexpr double get_xe_135() const { return xe_135; } friend std::ostream& operator<<(std::ostream& o, const sample& s) {