From d24cf1d0921aa41d6e25a3b7b2febc68a540ec37 Mon Sep 17 00:00:00 2001 From: Jay Robson Date: Tue, 13 Feb 2024 17:05:57 +1100 Subject: [PATCH] i can now make the core stable! :) --- src/coolant/condenser_secondary.hpp | 8 ++++-- src/coolant/evaporator.cpp | 14 +++++++++ src/coolant/fluid_holder.cpp | 44 ++++++++++++----------------- src/coolant/fluid_holder.hpp | 11 +++++--- src/coolant/pump.cpp | 2 +- src/coolant/valve.cpp | 35 ++++++++++++++++------- src/electric/turbine.cpp | 5 ++-- src/electric/turbine.hpp | 9 ++++-- src/reactor/coolant/vessel.cpp | 4 +-- 9 files changed, 80 insertions(+), 52 deletions(-) diff --git a/src/coolant/condenser_secondary.hpp b/src/coolant/condenser_secondary.hpp index 2976d04..6b3e7de 100644 --- a/src/coolant/condenser_secondary.hpp +++ b/src/coolant/condenser_secondary.hpp @@ -18,7 +18,7 @@ public: condenser_secondary(condenser* primary, evaporator* source, double volume); virtual double add_heat(double m, double t) { return source->add_heat(m, t); } - virtual void add_steam(double amount, double t) { return source->add_steam(amount, t); } + virtual void add_gas(double steam, double gas, double t) { return source->add_gas(steam, gas, t); } virtual double extract_fluid(double amount) { return source->extract_fluid(amount); } virtual double add_fluid(double amount, double heat); @@ -27,11 +27,13 @@ public: virtual double get_level() const { return source->get_level(); } virtual double get_heat() const { return source->get_heat(); } // celsius virtual double get_steam() const { return source->get_steam(); } // grams - virtual double get_steam_volume() const { return source->get_steam_volume(); } // litres + virtual double get_air() const { return source->get_air(); } // grams + virtual double get_gas() const { return source->get_gas(); } // grams + virtual double get_gas_volume() const { return source->get_gas_volume(); } // litres virtual double get_mass() const { return source->get_mass(); } // grams virtual double get_thermal_mass() const { return source->get_thermal_mass(); } // grams virtual double get_pressure() const { return source->get_pressure(); } // pascals - virtual double get_steam_density() const { return source->get_steam_density(); } // g/L + virtual double get_gas_density() const { return source->get_gas_density(); } // g/L void update(double dt); }; diff --git a/src/coolant/evaporator.cpp b/src/coolant/evaporator.cpp index 50f9ac3..7bf7f3a 100644 --- a/src/coolant/evaporator.cpp +++ b/src/coolant/evaporator.cpp @@ -1,5 +1,6 @@ #include "evaporator.hpp" +#include "../util/constants.hpp" #include #include @@ -28,6 +29,19 @@ double evaporator::get_steam_output() void evaporator::update(double dt) { + steam_output = steam / dt; + steam = 0; + + double P = 10000; // Pa + double K = conversions::temperature::c_to_k(heat); // K + double R = sim::constants::R; // J/K/mol + + double n_g = air / constants::M_air; // mol + double V_g = (volume - level) * 0.001; // m^3 + + double n = (P * V_g) / (R * K); // mol + + air = n * constants::M_air; update_base(dt); } diff --git a/src/coolant/fluid_holder.cpp b/src/coolant/fluid_holder.cpp index 00cbed5..252c6d9 100644 --- a/src/coolant/fluid_holder.cpp +++ b/src/coolant/fluid_holder.cpp @@ -6,12 +6,9 @@ #include #include -#include using namespace sim::coolant; -typedef std::complex complex; - fluid_holder::fluid_holder(fluid_t fluid, double volume, double extra_mass) : fluid(fluid), volume(volume), extra_mass(extra_mass) { @@ -72,18 +69,21 @@ double fluid_holder::extract_fluid(double amount) return amount; } -void fluid_holder::add_steam(double m2, double t2) +void fluid_holder::add_gas(double m_s2, double m_a2, double t_2) { - double m1 = get_thermal_mass(); - double t1 = heat; - double m = m1 + m2; + double m_2 = m_a2 + m_s2; + double m_1 = get_thermal_mass(); + double t_1 = heat; + + double m = m_1 + m_2; if(m > 0) { - heat = t1 - (t1 - t2) * m2 / (m1 + m2); + heat = t_1 - (t_1 - t_2) * m_2 / m; } - steam += m2; + steam += m_s2; + air += m_a2; } double fluid_holder::calc_pressure(double heat, double volume, double mol) @@ -102,21 +102,13 @@ double fluid_holder::calc_pressure_mol(double heat, double volume, double pressu double fluid_holder::get_pressure() const { - return calc_pressure(conversions::temperature::c_to_k(heat), get_steam_volume(), fluid.g_to_mol(steam)); + return calc_pressure(conversions::temperature::c_to_k(heat), get_gas_volume(), fluid.g_to_mol(steam) + air / constants::M_air); } -double fluid_holder::get_steam_density() const +double fluid_holder::get_gas_density() const { - double v = get_steam_volume(); - return v > 0 ? steam / v : 0; -} - -constexpr double calc_extra_steam(double K, double P, double L_m, double J_m, double n_g, double n_l, double V_t) -{ - double R = sim::constants::R * 1000; - double n = (P * (V_t - n_l * L_m)) / (R * K) - n_g; - - return n; + double v = get_gas_volume(); + return v > 0 ? get_gas() / v : 0; } void fluid_holder::update_base(double secs) @@ -129,9 +121,9 @@ void fluid_holder::update_base(double secs) double P = fluid.vapor_pressure.calc_p(K); // Pa double R = sim::constants::R; // J/K/mol - double J_m = fluid.jPg * fluid.gPmol; // J/mol - double n_g = fluid.g_to_mol(steam); // mol - double V_g = (volume - level) * 0.001; // m^3 + double J_m = fluid.jPg * fluid.gPmol; // J/mol + double n_g = fluid.g_to_mol(steam) + air / constants::M_air; // mol + double V_g = (volume - level) * 0.001; // m^3 double n = (P * V_g) / (R * K) - n_g; // mol double l = level - fluid.mol_to_l(n); // L @@ -146,8 +138,8 @@ void fluid_holder::update_base(double secs) if(steam < 0) { - l -= fluid.g_to_l(steam); - n += fluid.g_to_mol(steam); + l += fluid.g_to_l(steam); + n -= fluid.g_to_mol(steam); steam = 0; } diff --git a/src/coolant/fluid_holder.hpp b/src/coolant/fluid_holder.hpp index 9dfc432..b328e2b 100644 --- a/src/coolant/fluid_holder.hpp +++ b/src/coolant/fluid_holder.hpp @@ -13,6 +13,7 @@ class fluid_holder double level = 0; // litres double steam = 0; // grams + double air = 0; // grams double heat = 0; // celsius public: @@ -27,18 +28,20 @@ public: virtual double extract_fluid(double amount); virtual double add_fluid(double amount, double heat); - virtual void add_steam(double amount, double t); + virtual void add_gas(double steam, double air, double t); virtual double get_volume() const { return volume; } // litres virtual double get_level() const { return level; } // litres virtual double get_heat() const { return heat; } // celsius virtual double get_heat_k() const { return conversions::temperature::c_to_k(get_heat()); } // kelvin virtual double get_steam() const { return steam; } // grams - virtual double get_steam_volume() const { return get_volume() - get_level(); } // litres - virtual double get_mass() const { return fluid.l_to_g(get_level()) + get_steam(); } // grams + virtual double get_gas() const { return steam + air; } // grams + virtual double get_air() const { return air; } // grams + virtual double get_gas_volume() const { return get_volume() - get_level(); } // litres + virtual double get_mass() const { return fluid.l_to_g(get_level()) + steam + air; } // grams virtual double get_thermal_mass() const { return get_mass() + extra_mass; } // grams virtual double get_pressure() const; // pascals - virtual double get_steam_density() const; // g/L + virtual double get_gas_density() const; // g/L static double calc_pressure(double heat, double pressure, double mol); static double calc_pressure_mol(double heat, double pressure, double volume); diff --git a/src/coolant/pump.cpp b/src/coolant/pump.cpp index 8a2644c..ba4df1e 100644 --- a/src/coolant/pump.cpp +++ b/src/coolant/pump.cpp @@ -71,7 +71,7 @@ void pump::update(double dt) switch(mode) { case mode_t::SRC: - power = pid.calculate(dt, target, src->get_steam_volume()); + power = pid.calculate(dt, target, src->get_gas_volume()); break; case mode_t::DST: power = pid.calculate(dt, target, dst->get_level()); diff --git a/src/coolant/valve.cpp b/src/coolant/valve.cpp index 3e553f6..464e96b 100644 --- a/src/coolant/valve.cpp +++ b/src/coolant/valve.cpp @@ -30,7 +30,7 @@ void valve::update(double dt) if(state > 1) state = 1; if(state < 0) state = 0; - if(src->get_steam_volume() == 0 || dst->get_steam_volume() == 0) + if(src->get_gas_volume() == 0 || dst->get_gas_volume() == 0 || (src->get_gas() == 0 && dst->get_gas() == 0)) { flow = 0; return; @@ -42,27 +42,42 @@ void valve::update(double dt) double m = max * state; double diff = (pressure1 - pressure2); double remove = diff - diff * std::pow(1 - m, dt); - - double mol, mass; + + double ratio_a, ratio_s; + double mass_a, mass_s; + double mol; if(remove < 0) { - mol = fluid_holder::calc_pressure_mol(src->get_heat_k(), src->get_steam_volume(), pressure1 - remove); - mass = src->get_steam() - src->fluid.mol_to_g(mol); + ratio_a = src->get_air() / src->get_gas(); + ratio_s = src->get_steam() / src->get_gas(); + + mol = fluid_holder::calc_pressure_mol(src->get_heat_k(), src->get_gas_volume(), pressure1 - remove); + + mass_a = src->get_air() - mol / constants::M_air; + mass_s = src->get_steam() - src->fluid.mol_to_g(mol); } else { - mol = fluid_holder::calc_pressure_mol(dst->get_heat_k(), dst->get_steam_volume(), pressure2 - remove); - mass = dst->get_steam() - dst->fluid.mol_to_g(mol); + ratio_a = dst->get_air() / dst->get_gas(); + ratio_s = dst->get_steam() / dst->get_gas(); + + mol = fluid_holder::calc_pressure_mol(dst->get_heat_k(), dst->get_gas_volume(), pressure2 - remove); + + mass_a = dst->get_air() - mol / constants::M_air; + mass_s = dst->get_steam() - dst->fluid.mol_to_g(mol); } + mass_a *= ratio_a; + mass_s *= ratio_s; + double heat1 = src->get_heat(); // C double heat2 = dst->get_heat(); - src->add_steam(-mass, heat2); - dst->add_steam(mass, heat1); + src->add_gas(-mass_s, mass_a, heat2); + dst->add_gas(mass_s, mass_a, heat1); - this->flow = mass / dt; + this->flow = (mass_s + mass_a) / dt; } diff --git a/src/electric/turbine.cpp b/src/electric/turbine.cpp index 6e72f7e..4b1c435 100644 --- a/src/electric/turbine.cpp +++ b/src/electric/turbine.cpp @@ -26,9 +26,8 @@ void turbine::update(double secs) } -void turbine::add_steam(double amount, double t) +void turbine::add_gas(double steam, double air, double t) { - condenser->add_steam(amount, t); + condenser->add_gas(steam, air, t); } - diff --git a/src/electric/turbine.hpp b/src/electric/turbine.hpp index e6c0c97..b6ced78 100644 --- a/src/electric/turbine.hpp +++ b/src/electric/turbine.hpp @@ -23,17 +23,20 @@ public: virtual double add_heat(double m, double t) { return condenser->add_heat(m, t); } virtual double extract_fluid(double amount) { return condenser->extract_fluid(amount); } virtual double add_fluid(double amount, double heat) { return condenser->add_fluid(amount, heat); } - virtual void add_steam(double amount, double t); + virtual void add_gas(double steam, double gas, double t); virtual double get_volume() const { return condenser->get_volume(); } virtual double get_level() const { return condenser->get_level(); } virtual double get_heat() const { return condenser->get_heat(); } // celsius + virtual double get_heat_k() const { return condenser->get_heat_k(); } // kelvin virtual double get_steam() const { return condenser->get_steam(); } // grams - virtual double get_steam_volume() const { return condenser->get_steam_volume(); } // litres + virtual double get_gas() const { return condenser->get_gas(); } // grams + virtual double get_air() const { return condenser->get_air(); } // grams + virtual double get_gas_volume() const { return condenser->get_gas_volume(); } // litres virtual double get_mass() const { return condenser->get_mass(); } // grams virtual double get_thermal_mass() const { return condenser->get_thermal_mass(); } // grams virtual double get_pressure() const { return condenser->get_pressure(); } // pascals - virtual double get_steam_density() const { return condenser->get_steam_density(); } // g/L + virtual double get_gas_density() const { return condenser->get_gas_density(); } // g/L }; }; diff --git a/src/reactor/coolant/vessel.cpp b/src/reactor/coolant/vessel.cpp index 87f2649..c1c83e8 100644 --- a/src/reactor/coolant/vessel.cpp +++ b/src/reactor/coolant/vessel.cpp @@ -30,7 +30,7 @@ double vessel::get_steam_suspended() const double vessel::get_void_ratio() const { - double density = get_steam_density(); + double density = get_gas_density(); if(density == 0) { @@ -70,7 +70,7 @@ void vessel::update(double secs) steam_suspended *= reactor::fuel::half_life::get(secs, get_bubble_hl()); } - else + if(hl <= 0 || steam_suspended < 0) { steam_suspended = 0; }