From 77b1af8bd2797ed637df3a797debb8fc06a173db Mon Sep 17 00:00:00 2001 From: Jay Robson Date: Tue, 16 Jan 2024 20:30:22 +1100 Subject: [PATCH] adding vapor pressure stuff --- src/constants.hpp | 8 ++++++ src/conversions/pressure.hpp | 11 ++++++++ src/conversions/temperature.hpp | 11 ++++++++ src/coolant/fluid_t.cpp | 0 src/coolant/fluid_t.hpp | 28 ++++++++++++++++++++ src/coolant/vapor_pressure.cpp | 20 ++++++++++++++ src/coolant/vapor_pressure.hpp | 18 +++++++++++++ src/main.cpp | 7 ++--- src/reactor/coolant/pipe.cpp | 7 +---- src/reactor/coolant/pipe.hpp | 1 - src/reactor/coolant/vessel.cpp | 46 ++++++++++++++++++++++----------- src/reactor/coolant/vessel.hpp | 32 +++++++++++------------ 12 files changed, 147 insertions(+), 42 deletions(-) create mode 100644 src/constants.hpp create mode 100644 src/conversions/pressure.hpp create mode 100644 src/conversions/temperature.hpp create mode 100644 src/coolant/fluid_t.cpp create mode 100644 src/coolant/fluid_t.hpp create mode 100644 src/coolant/vapor_pressure.cpp create mode 100644 src/coolant/vapor_pressure.hpp diff --git a/src/constants.hpp b/src/constants.hpp new file mode 100644 index 0000000..8539250 --- /dev/null +++ b/src/constants.hpp @@ -0,0 +1,8 @@ + +#pragma once + +namespace sim::constants +{ + constexpr const double R = 8.31446261815324; // molar gas constant, J/Kmol +}; + diff --git a/src/conversions/pressure.hpp b/src/conversions/pressure.hpp new file mode 100644 index 0000000..99bf124 --- /dev/null +++ b/src/conversions/pressure.hpp @@ -0,0 +1,11 @@ + +#pragma once + +namespace sim::conversions::pressure +{ + +constexpr double torr_to_pa(double t) { return t * 133.322; } +constexpr double pa_to_torr(double p) { return p / 133.322; } + +}; + diff --git a/src/conversions/temperature.hpp b/src/conversions/temperature.hpp new file mode 100644 index 0000000..cf3efa8 --- /dev/null +++ b/src/conversions/temperature.hpp @@ -0,0 +1,11 @@ + +#pragma once + +namespace sim::conversions::temperature +{ + +constexpr double k_to_c(double k) { return k - 273.15; } +constexpr double c_to_k(double c) { return c + 273.15; } + +}; + diff --git a/src/coolant/fluid_t.cpp b/src/coolant/fluid_t.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/coolant/fluid_t.hpp b/src/coolant/fluid_t.hpp new file mode 100644 index 0000000..b914bd0 --- /dev/null +++ b/src/coolant/fluid_t.hpp @@ -0,0 +1,28 @@ + +#pragma once + +#include "vapor_pressure.hpp" + +namespace sim::coolant +{ + +struct fluid_t +{ + const double gPl; // g/L + const double gPmol; // g/mol + const coolant::vapor_pressure vapor_pressure; + + constexpr fluid_t(double gPl, double gPmol, coolant::vapor_pressure vapor_pressure) : gPl(gPl), gPmol(gPmol), vapor_pressure(vapor_pressure) { } + + constexpr double g_to_mol(double g) const { return g / gPmol; } + constexpr double mol_to_g(double mol) const { return mol * gPmol; } + constexpr double g_to_l(double g) const { return g / gPl; } + constexpr double l_to_g(double l) const { return l * gPl; } + constexpr double mol_to_l(double mol) const { return g_to_l(mol_to_g(mol)); } + constexpr double l_to_mol(double l) const { return g_to_mol(l_to_g(l)); } +}; + +constexpr const fluid_t WATER = fluid_t(1000, 18, {8.07131, 1730.63, 233.426}); + +} + diff --git a/src/coolant/vapor_pressure.cpp b/src/coolant/vapor_pressure.cpp new file mode 100644 index 0000000..b025f46 --- /dev/null +++ b/src/coolant/vapor_pressure.cpp @@ -0,0 +1,20 @@ + +#include "vapor_pressure.hpp" +#include "../conversions/temperature.hpp" +#include "../conversions/pressure.hpp" + +#include + +using namespace sim::coolant; +using namespace sim::conversions; + +double vapor_pressure::calc_p(double t) const +{ + return pressure::torr_to_pa(std::pow(10, A - B / ( C + t ) )); +} + +double vapor_pressure::calc_t(double p) const +{ + return B / ( A - std::log(pressure::pa_to_torr(p)) / std::log(10) ) - C; +} + diff --git a/src/coolant/vapor_pressure.hpp b/src/coolant/vapor_pressure.hpp new file mode 100644 index 0000000..46ceb86 --- /dev/null +++ b/src/coolant/vapor_pressure.hpp @@ -0,0 +1,18 @@ + +#pragma once + +namespace sim::coolant +{ + +struct vapor_pressure +{ + const double A, B, C; + + constexpr vapor_pressure(double A, double B, double C) : A(A), B(B), C(C) { } + + double calc_p(double t) const; + double calc_t(double p) const; +}; + +} + diff --git a/src/main.cpp b/src/main.cpp index b9c5ecb..42e74a0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ #include "reactor/fuel/fuel_rod.hpp" #include "reactor/coolant/pipe.hpp" #include "reactor/coolant/vessel.hpp" +#include "coolant/fluid_t.hpp" #include "display.hpp" #include @@ -20,10 +21,10 @@ int main() nodelay(stdscr, TRUE); curs_set(0); - sim::reactor::coolant::vessel vessel(100, 400); + sim::reactor::coolant::vessel vessel(200, 400, sim::coolant::WATER); sim::reactor::reactor<5, 5> reactor = sim::reactor::builder<5, 5>( - sim::reactor::fuel::fuel_rod(100, 400), - sim::reactor::control::control_rod(1000, 1), + sim::reactor::fuel::fuel_rod(1000, 4000), + sim::reactor::control::control_rod(10000, 1), sim::reactor::coolant::pipe(vessel), { "## ##", "#FCF#", diff --git a/src/reactor/coolant/pipe.cpp b/src/reactor/coolant/pipe.cpp index d3cb57c..7eaa5ad 100644 --- a/src/reactor/coolant/pipe.cpp +++ b/src/reactor/coolant/pipe.cpp @@ -9,11 +9,6 @@ pipe::pipe(coolant::vessel& v) this->steam = 0; } -void pipe::display(std::ostream& o) const -{ - o << "Steam: +" << steam << "\n"; -} - double pipe::get_k(val_t type) const { return vessel->get_level() / vessel->get_volume(); @@ -25,7 +20,7 @@ void pipe::update(double secs) update_rod(secs); - v = vessel->add_steam(vals[val_t::HEAT]); + v = vessel->add_heat(vals[val_t::HEAT]); steam = vals[val_t::HEAT] - v; vals[val_t::HEAT] = v; diff --git a/src/reactor/coolant/pipe.hpp b/src/reactor/coolant/pipe.hpp index a06a186..e0035c2 100644 --- a/src/reactor/coolant/pipe.hpp +++ b/src/reactor/coolant/pipe.hpp @@ -15,7 +15,6 @@ class pipe : public sim::reactor::rod virtual double get_k(sim::reactor::rod::val_t type) const; virtual const char* get_name() const { return "Coolant"; } - virtual void display(std::ostream& o) const; public: diff --git a/src/reactor/coolant/vessel.cpp b/src/reactor/coolant/vessel.cpp index e7bbd7a..ee2d795 100644 --- a/src/reactor/coolant/vessel.cpp +++ b/src/reactor/coolant/vessel.cpp @@ -1,31 +1,37 @@ #include "vessel.hpp" +#include "../../constants.hpp" +#include "../../conversions/temperature.hpp" + +#include using namespace sim::reactor::coolant; -vessel::vessel(double level, double volume) +vessel::vessel(double level, double volume, sim::coolant::fluid_t fluid) : volume(volume), fluid(fluid) { this->level = level; - this->volume = volume; } void vessel::update() { - level += level_in; - steam += steam_in; - level_in = 0; - steam_in = 0; + double vp = fluid.vapor_pressure.calc_p(heat); + double sc = vp * (volume - level) / (constants::R * conversions::temperature::c_to_k(heat)) - steam; + double sc_l = fluid.mol_to_l(sc); + + if(sc_l > level) sc_l = level; + + steam += fluid.l_to_mol(sc_l); + level -= sc_l; } -double vessel::add_steam(double amount) +double vessel::add_heat(double amount) { - double th = get_pressure(); + double th = get_heat(); if(amount > th) { amount -= th; - steam_in += amount; - level_in -= amount; + heat += amount / level; return th; } @@ -33,11 +39,21 @@ double vessel::add_steam(double amount) return amount; } -void vessel::display(std::ostream& o) const +double vessel::get_pressure() const { - o << "Volume: " << volume << "\n"; - o << "Level: " << level << "\n"; - o << "Steam: " << steam << "\n"; - o << "Pressure: " << get_pressure() << "\n"; + return (steam * conversions::temperature::c_to_k(heat) * constants::R) / (volume - level); } +std::ostream& operator<<(std::ostream& o, const vessel& v) +{ + o << "Volume: " << v.get_volume() << " L\n"; + o << "Level: " << v.get_level() << " L\n"; + o << "Steam: " << v.get_steam() << " mol\n"; + o << "Heat: " << v.get_heat() << " C\n"; + o << "Pressure: " << v.get_pressure() << " Pa\n"; + o << "Vapor Pressure: " << v.fluid.vapor_pressure.calc_p(v.get_heat()) << " Pa\n"; + + return o; +} + + diff --git a/src/reactor/coolant/vessel.hpp b/src/reactor/coolant/vessel.hpp index dd0a321..2f70a17 100644 --- a/src/reactor/coolant/vessel.hpp +++ b/src/reactor/coolant/vessel.hpp @@ -3,38 +3,36 @@ #include +#include "../../coolant/fluid_t.hpp" + namespace sim::reactor::coolant { class vessel { - double volume; - double level; - - double steam = 0; - double level_in = 0; - double steam_in = 0; - - void display(std::ostream& o) const; + double level; // litres + double heat = 0; // celcius + double steam = 0; // moles public: + + const double volume; //litres + const sim::coolant::fluid_t fluid; - vessel(double level, double volume); + vessel(double level, double volume, sim::coolant::fluid_t fluid); void update(); - double add_steam(double amount); + double add_heat(double amount); constexpr double get_volume() const { return volume; } constexpr double get_level() const { return level; } + constexpr double get_heat() const { return heat; } constexpr double get_steam() const { return steam; } - constexpr double get_pressure() const { return steam / (volume - level); } - - friend std::ostream& operator<<(std::ostream& o, const vessel& v) - { - v.display(o); - return o; - } + + double get_pressure() const; }; } +std::ostream& operator<<(std::ostream& o, const sim::reactor::coolant::vessel& v); +