added graphite control rod, added speed control

This commit is contained in:
Jay Robson 2024-01-17 18:58:04 +11:00
parent d01de129e0
commit 7e641d244e
6 changed files with 98 additions and 12 deletions

View File

@ -44,15 +44,11 @@ int main()
double secs = 0;
long clock = get_now();
double speed = 10000;
double speed = 1;
int framerate = 100;
int extra = 100;
speed /= extra;
for(;;)
{
std::stringstream ss;
ss << "Reactor Core\n\n";
@ -79,15 +75,25 @@ years: ss << years << "y ";
days: ss << days << "d ";
hours: ss << hours << "h ";
mins: ss << mins << "m ";
secs: ss << s << "s\n\n";
secs: ss << s << "s\n";
ss << "Speed: " << speed << "x\n\n";
}
for(int i = 0; i < extra; i++)
int skip = 1;
while(speed / framerate / skip > 1)
{
reactor.update(speed / framerate);
vessel.update();
secs += speed / framerate;
skip *= 2;
}
for(int i = 0; i < skip; i++)
{
reactor.update(speed / framerate / skip);
vessel.update();
}
secs += speed / framerate;
ss << "Vessel\n" << vessel << "\n";
@ -148,6 +154,12 @@ secs: ss << s << "s\n\n";
case ' ':
reactor.toggle_selected();
break;
case 't':
speed *= 10;
break;
case 'g':
speed /= 10;
break;
}
long now = get_now();

View File

@ -4,6 +4,7 @@
#include "rod.hpp"
#include "fuel/fuel_rod.hpp"
#include "control/control_rod.hpp"
#include "control/graphite_rod.hpp"
#include "coolant/pipe.hpp"
#include "coolant/heater.hpp"
#include "reactor.hpp"
@ -30,6 +31,9 @@ reactor<W, H> builder(fuel::fuel_rod fr, control::control_rod cr, coolant::pipe
case 'C':
r = new control::control_rod(cr);
break;
case 'G':
r = new control::graphite_rod();
break;
case 'H':
r = new coolant::heater();
break;

View File

@ -0,0 +1,41 @@
#include "graphite_rod.hpp"
#include <cmath>
using namespace sim::reactor::control;
void graphite_rod::display(std::ostream& o) const
{
o << "Inserted: " << (inserted * 100) << "%\n";
};
double graphite_rod::get_k(val_t type) const
{
if(type == val_t::HEAT) return 0.5;
return inserted * 0.5;
}
void graphite_rod::set_reactivity(double a)
{
inserted = a;
}
void graphite_rod::update(double secs)
{
update_rod(secs);
double v = vals[val_t::N_FAST];
vals_in[val_t::N_FAST] -= v;
vals_in[val_t::N_SLOW] += v;
}
void graphite_rod::update_selected(double a)
{
inserted += a;
if(inserted > 1) inserted = 1;
if(inserted < 0) inserted = 0;
}

View File

@ -0,0 +1,29 @@
#pragma once
#include "../rod.hpp"
namespace sim::reactor::control
{
class graphite_rod : public sim::reactor::rod
{
double inserted = 0;
virtual double get_k(sim::reactor::rod::val_t type) const;
virtual void display(std::ostream& o) const;
virtual const char* get_name() const { return "Graphite Rod"; }
public:
virtual void update(double secs);
void set_reactivity(double a);
virtual bool should_display() const { return true; }
virtual bool should_select() const { return true; }
virtual void update_selected(double a);
};
}

View File

@ -55,7 +55,7 @@ std::ostream& operator<<(std::ostream& o, const vessel& v)
o << "Level: " << v.get_level() << " L\n";
o << "Steam: " << v.get_steam() << " g\n";
o << "Heat: " << v.get_heat() << " C\n";
o << "Pressure: " << v.get_pressure() << " Pa\n";
o << "Pressure: " << (v.get_pressure() * 0.001) << " kPa\n";
return o;
}

View File

@ -16,7 +16,7 @@ class vessel
public:
const double volume; //litres
const double volume; // litres
const sim::coolant::fluid_t fluid;
vessel(double level, double volume, sim::coolant::fluid_t fluid);