saves successfully, doesn't load

This commit is contained in:
Jay Robson 2024-02-14 00:38:28 +11:00
parent 9298143040
commit a439f7668b
45 changed files with 399 additions and 51 deletions

View File

@ -19,6 +19,14 @@ condenser::condenser(fluid_t type, double height, double diameter, double mass,
this->level = level; this->level = level;
} }
condenser::condenser(const Json::Value& node) :
height(node["height"].asDouble()),
diameter(node["diameter"].asDouble()),
fluid_holder(node)
{
}
void condenser::update(double secs) void condenser::update(double secs)
{ {
update_base(secs); update_base(secs);

View File

@ -14,10 +14,11 @@ class condenser : public fluid_holder
public: public:
condenser(fluid_t type, double height, double diameter, double mass, double level); condenser(fluid_t type, double height, double diameter, double mass, double level);
condenser(const Json::Value& node);
void update(double dt); void update(double dt);
virtual operator Json::Value() const; operator Json::Value() const;
}; };
}; };

View File

@ -22,6 +22,14 @@ evaporator::evaporator(fluid_t type, double height, double diameter, double mass
this->level = level; this->level = level;
} }
evaporator::evaporator(const Json::Value& node) :
height(node["height"].asDouble()),
diameter(node["diameter"].asDouble()),
fluid_holder(node)
{
steam_output = node["steam_output"].asDouble();
}
double evaporator::get_steam_output() double evaporator::get_steam_output()
{ {
return steam_output; return steam_output;

View File

@ -16,8 +16,9 @@ class evaporator : public fluid_holder
public: public:
evaporator(fluid_t type, double height, double diameter, double mass, double level); evaporator(fluid_t type, double height, double diameter, double mass, double level);
evaporator(const Json::Value& node);
virtual operator Json::Value() const; operator Json::Value() const;
double get_steam_output(); double get_steam_output();
void update(double dt); void update(double dt);

View File

@ -14,6 +14,14 @@ fluid_holder::fluid_holder(fluid_t fluid, double volume, double extra_mass) : fl
} }
fluid_holder::fluid_holder(const Json::Value& node) : fluid(node["fluid"]), volume(node["volume"].asDouble()), extra_mass(node["extra_mass"].asDouble())
{
level = node["level"].asDouble();
steam = node["steam"].asDouble();
air = node["air"].asDouble();
heat = node["heat"].asDouble();
}
double fluid_holder::add_heat(double m1, double t1) double fluid_holder::add_heat(double m1, double t1)
{ {
double t2 = get_heat(); double t2 = get_heat();

View File

@ -21,6 +21,7 @@ class fluid_holder
public: public:
fluid_holder(fluid_t fluid, double volume, double extra_mass); fluid_holder(fluid_t fluid, double volume, double extra_mass);
fluid_holder(const Json::Value& node);
const fluid_t fluid; const fluid_t fluid;
const double volume; // litres const double volume; // litres
@ -45,7 +46,7 @@ public:
virtual double get_pressure() const; // pascals virtual double get_pressure() const; // pascals
virtual double get_gas_density() const; // g/L virtual double get_gas_density() const; // g/L
virtual operator Json::Value() const; operator Json::Value() const;
static double calc_pressure(double heat, double pressure, double mol); static double calc_pressure(double heat, double pressure, double mol);
static double calc_pressure_mol(double heat, double pressure, double volume); static double calc_pressure_mol(double heat, double pressure, double volume);

View File

@ -23,6 +23,15 @@ struct fluid_t
} }
fluid_t(const Json::Value& node) :
gPl(node["gPl"].asDouble()),
gPmol(node["gPmol"].asDouble()),
jPg(node["jPg"].asDouble()),
vapor_pressure(node["vapor_pressure"])
{
}
operator Json::Value() const operator Json::Value() const
{ {
Json::Value node; Json::Value node;

View File

@ -3,6 +3,7 @@
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
#include <string>
using namespace sim::coolant; using namespace sim::coolant;
@ -104,6 +105,34 @@ void pump::update(double dt)
flow = dst_volume / dt; flow = dst_volume / dt;
} }
static pump::mode_t get_mode(std::string mode)
{
if(mode == "SRC")
return pump::mode_t::SRC;
if(mode == "DST")
return pump::mode_t::DST;
return pump::mode_t::NONE;
}
pump::pump(const Json::Value& node, fluid_holder* src, fluid_holder* dst) :
mode(get_mode(node["mode"].asString())),
mass(node["mass"].asDouble()),
radius(node["radius"].asDouble()),
l_per_rev(node["l_per_rev"].asDouble()),
friction(node["friction"].asDouble()),
max_power(node["max_power"].asDouble()),
target(node["target"].asDouble()),
pid(node["pid"]),
src(src),
dst(dst)
{
flow = node["flow"].asDouble();
velocity = node["velocity"].asDouble();
power = node["power"].asDouble();
powered = node["powered"].asBool();
}
pump::operator Json::Value() const pump::operator Json::Value() const
{ {
Json::Value node; Json::Value node;

View File

@ -39,6 +39,7 @@ public:
bool powered = false; bool powered = false;
pump(fluid_holder* src, fluid_holder* dst, double mass, double radius, double power, double l_per_rev, double friction, mode_t mode, double target); pump(fluid_holder* src, fluid_holder* dst, double mass, double radius, double power, double l_per_rev, double friction, mode_t mode, double target);
pump(const Json::Value& node, fluid_holder* src, fluid_holder* dst);
double get_flow() const; // L/s double get_flow() const; // L/s
double get_flow_target() const; // L/s double get_flow_target() const; // L/s

View File

@ -81,6 +81,13 @@ void valve::update(double dt)
this->flow = (mass_s + mass_a) / dt; this->flow = (mass_s + mass_a) / dt;
} }
valve::valve(const Json::Value& node, fluid_holder* src, fluid_holder* dst) : src(src), dst(dst), max(node["max"].asDouble())
{
speed = node["speed"].asDouble();
state = node["state"].asDouble();
flow = node["flow"].asDouble();
}
valve::operator Json::Value() const valve::operator Json::Value() const
{ {
Json::Value node; Json::Value node;

View File

@ -20,6 +20,7 @@ class valve
public: public:
valve(fluid_holder* src, fluid_holder* dst, double state, double max); valve(fluid_holder* src, fluid_holder* dst, double state, double max);
valve(const Json::Value& node, fluid_holder* src, fluid_holder* dst);
void update(double secs); void update(double secs);
void add_open_speed(double v); void add_open_speed(double v);

View File

@ -15,6 +15,14 @@ double vapor_pressure::calc_t(double p) const
return B / (A - std::log(p) / std::log(10)) - C; return B / (A - std::log(p) / std::log(10)) - C;
} }
vapor_pressure::vapor_pressure(const Json::Value& node) :
A(node["A"].asDouble()),
B(node["B"].asDouble()),
C(node["C"].asDouble())
{
}
vapor_pressure::operator Json::Value() const vapor_pressure::operator Json::Value() const
{ {
Json::Value node; Json::Value node;

View File

@ -12,6 +12,7 @@ struct vapor_pressure
constexpr vapor_pressure(double A, double B, double C) : A(A), B(B), C(C) { } constexpr vapor_pressure(double A, double B, double C) : A(A), B(B), C(C) { }
vapor_pressure(const Json::Value& node);
operator Json::Value() const; operator Json::Value() const;
double calc_p(double t) const; double calc_p(double t) const;

View File

@ -21,6 +21,15 @@ turbine::turbine(coolant::fluid_t type, coolant::condenser* condenser, double le
} }
turbine::turbine(const Json::Value& node, coolant::condenser* condenser) :
condenser(condenser),
length(node["length"].asDouble()),
diameter(node["diameter"].asDouble()),
sim::coolant::fluid_holder(node)
{
velocity = node["velocity"].asDouble();
}
void turbine::update(double dt) void turbine::update(double dt)
{ {

View File

@ -19,6 +19,7 @@ class turbine : public sim::coolant::fluid_holder
public: public:
turbine(coolant::fluid_t type, coolant::condenser* condenser, double length, double diameter, double mass); turbine(coolant::fluid_t type, coolant::condenser* condenser, double length, double diameter, double mass);
turbine(const Json::Value& node, coolant::condenser* condenser);
void update(double dt); void update(double dt);
@ -40,7 +41,7 @@ public:
virtual double get_pressure() const { return condenser->get_pressure(); } // pascals virtual double get_pressure() const { return condenser->get_pressure(); } // pascals
virtual double get_gas_density() const { return condenser->get_gas_density(); } // g/L virtual double get_gas_density() const { return condenser->get_gas_density(); } // g/L
virtual operator Json::Value() const; operator Json::Value() const;
}; };
}; };

View File

@ -47,7 +47,10 @@ static void cb_keypress(GLFWwindow* win, int key, int sc, int action, int mods)
sim::system::active.speed = 43200; // 12 h/s sim::system::active.speed = 43200; // 12 h/s
break; break;
case GLFW_KEY_O: case GLFW_KEY_O:
sim::system::active.save(); sim::system::save();
break;
case GLFW_KEY_L:
sim::system::load();
break; break;
} }
} }

View File

@ -21,6 +21,7 @@ using namespace sim::graphics::widget;
void clock::update(double dt) void clock::update(double dt)
{ {
mesh m; mesh m;
double at = 3600 * 12 + system::active.clock;
glm::vec2 wsize(resize::get_size() / 2); glm::vec2 wsize(resize::get_size() / 2);
std::stringstream ss; std::stringstream ss;
@ -32,7 +33,6 @@ void clock::update(double dt)
ss << std::setfill('0') << std::setw(2) << t_m << ":"; ss << std::setfill('0') << std::setw(2) << t_m << ":";
ss << std::setfill('0') << std::setw(2) << t_s << "\n"; ss << std::setfill('0') << std::setw(2) << t_s << "\n";
ss << "Day: " << std::floor(at / (3600 * 24)) << "\n"; ss << "Day: " << std::floor(at / (3600 * 24)) << "\n";
at += dt * sim::system::active.speed;
m.load_text(ss.str().c_str(), 20); m.load_text(ss.str().c_str(), 20);

View File

@ -8,7 +8,6 @@ namespace sim::graphics::widget
struct clock struct clock
{ {
double at = 3600 * 12;
glmesh data; glmesh data;
void update(double dt); void update(double dt);

View File

@ -37,14 +37,11 @@ int main()
// tests::run(); // tests::run();
// return 0; // return 0;
std::ofstream log("log.csv");
graphics::window::create(); graphics::window::create();
long clock = get_now(); long clock = get_now();
double at = 0; double at = 0;
log << R"("clock","level","steam","heat","pressure")" << "\n";
while(!graphics::window::should_close()) while(!graphics::window::should_close())
{ {
long now = get_now(); long now = get_now();
@ -59,12 +56,6 @@ int main()
graphics::window::update(dt); graphics::window::update(dt);
graphics::focus::update(dt); graphics::focus::update(dt);
graphics::window::render(); graphics::window::render();
log << at << ",";
log << sim::system::active.condenser->get_level() << ",";
log << sim::system::active.condenser->get_steam() << ",";
log << sim::system::active.condenser->get_heat() << ",";
log << sim::system::active.condenser->get_pressure() << "\n";
} }
graphics::window::destroy(); graphics::window::destroy();

View File

@ -1,5 +1,9 @@
#include "builder.hpp" #include "builder.hpp"
#include "control/boron_rod.hpp"
#include "control/graphite_rod.hpp"
#include "coolant/pipe.hpp"
#include "coolant/heater.hpp"
#include <cmath> #include <cmath>
#include <vector> #include <vector>
@ -45,3 +49,24 @@ sim::reactor::reactor sim::reactor::builder(const int W, const int H, const doub
return reactor(&arr[0], W, H, CW, CH); return reactor(&arr[0], W, H, CW, CH);
} }
std::unique_ptr<rod> sim::reactor::load_rod(const Json::Value& node, coolant::vessel* v)
{
int id = node["id"].asInt();
switch(id)
{
case 1:
return std::make_unique<fuel::fuel_rod>(node);
case 2:
return std::make_unique<coolant::pipe>(node, v);
case 3:
return std::make_unique<coolant::heater>(node);
case 4:
return std::make_unique<control::graphite_rod>(node);
case 5:
return std::make_unique<control::boron_rod>(node, v);
}
return std::make_unique<rod>();
}

View File

@ -3,17 +3,16 @@
#include "rod.hpp" #include "rod.hpp"
#include "fuel/fuel_rod.hpp" #include "fuel/fuel_rod.hpp"
#include "control/boron_rod.hpp"
#include "control/graphite_rod.hpp"
#include "coolant/pipe.hpp"
#include "coolant/heater.hpp"
#include "coolant/vessel.hpp" #include "coolant/vessel.hpp"
#include "reactor.hpp" #include "reactor.hpp"
#include <json/json.h>
namespace sim::reactor namespace sim::reactor
{ {
reactor builder(const int W, const int H, const double CW, const double CH, fuel::fuel_rod fr, coolant::vessel* v, const char** lines); reactor builder(const int W, const int H, const double CW, const double CH, fuel::fuel_rod fr, coolant::vessel* v, const char** lines);
std::unique_ptr<rod> load_rod(const Json::Value& node, coolant::vessel* v);
}; };

View File

@ -9,6 +9,20 @@ constexpr double boron_density = 2340000; // g/m^3
constexpr double boron_molar_mass = 10; // g/mol constexpr double boron_molar_mass = 10; // g/mol
constexpr double boron_molar_density = boron_density / boron_molar_mass; // mol/m^3 constexpr double boron_molar_density = boron_density / boron_molar_mass; // mol/m^3
boron_rod::boron_rod(const Json::Value& node, coolant::vessel* v) : coolant::pipe(node, v)
{
inserted = node["inserted"].asDouble();
absorbed = node["absorbed"].asDouble();
}
Json::Value boron_rod::serialize() const
{
Json::Value node(coolant::pipe::serialize());
node["inserted"] = inserted;
node["absorbed"] = absorbed;
return node;
}
boron_rod::boron_rod(coolant::vessel* v) : coolant::pipe(v) boron_rod::boron_rod(coolant::vessel* v) : coolant::pipe(v)
{ {

View File

@ -19,7 +19,9 @@ class boron_rod : public coolant::pipe
public: public:
boron_rod(coolant::vessel* v); boron_rod(coolant::vessel* v);
boron_rod(const Json::Value& node, coolant::vessel* v);
virtual Json::Value serialize() const;
virtual void update(double secs); virtual void update(double secs);
void set_reactivity(double a); void set_reactivity(double a);
double get_inserted() { return inserted; } double get_inserted() { return inserted; }

View File

@ -5,6 +5,18 @@
using namespace sim::reactor::control; using namespace sim::reactor::control;
graphite_rod::graphite_rod(const Json::Value& node) : rod(node)
{
inserted = node["inserted"].asDouble();
}
Json::Value graphite_rod::serialize() const
{
Json::Value node(rod::serialize());
node["inserted"] = inserted;
return node;
}
void graphite_rod::display(std::ostream& o) const void graphite_rod::display(std::ostream& o) const
{ {
o << "Inserted: " << (inserted * 100) << "%\n"; o << "Inserted: " << (inserted * 100) << "%\n";

View File

@ -20,6 +20,11 @@ class graphite_rod : public sim::reactor::rod
public: public:
constexpr graphite_rod() {}
graphite_rod(const Json::Value& node);
virtual Json::Value serialize() const;
virtual void update(double secs); virtual void update(double secs);
void set_reactivity(double a); void set_reactivity(double a);

View File

@ -3,6 +3,18 @@
using namespace sim::reactor::coolant; using namespace sim::reactor::coolant;
heater::heater(const Json::Value& node) : rod(node)
{
rate = node["rate"].asDouble();
}
Json::Value heater::serialize() const
{
Json::Value node(rod::serialize());
node["rate"] = rate;
return node;
}
void heater::update(double secs) void heater::update(double secs)
{ {
update_rod(secs); update_rod(secs);

View File

@ -19,6 +19,11 @@ class heater : public sim::reactor::rod
public: public:
constexpr heater() {}
heater(const Json::Value& node);
virtual Json::Value serialize() const;
virtual void update(double secs); virtual void update(double secs);
virtual bool should_display() const { return true; } virtual bool should_display() const { return true; }
virtual bool should_select() const { return true; } virtual bool should_select() const { return true; }

View File

@ -10,6 +10,18 @@ pipe::pipe(coolant::vessel* v)
this->steam = 0; this->steam = 0;
} }
pipe::pipe(const Json::Value& node, coolant::vessel* v) : vessel(v)
{
steam = node["steam"].asDouble();
}
Json::Value pipe::serialize() const
{
Json::Value node(rod::serialize());
node["steam"] = steam;
return node;
}
double pipe::get_k(val_t type) const double pipe::get_k(val_t type) const
{ {
return vessel->get_level() / vessel->get_volume() * 0.5; return vessel->get_level() / vessel->get_volume() * 0.5;

View File

@ -23,7 +23,9 @@ protected:
public: public:
pipe(coolant::vessel* v); pipe(coolant::vessel* v);
pipe(const Json::Value& node, coolant::vessel* v);
virtual Json::Value serialize() const;
virtual std::unique_ptr<rod> clone() const { return std::make_unique<pipe>(*this); } virtual std::unique_ptr<rod> clone() const { return std::make_unique<pipe>(*this); }
virtual bool should_display() const { return true; } virtual bool should_display() const { return true; }
virtual void update(double secs); virtual void update(double secs);

View File

@ -23,6 +23,15 @@ vessel::vessel(sim::coolant::fluid_t fluid, double height, double diameter, doub
this->level = level; this->level = level;
} }
vessel::vessel(const Json::Value& node) :
sim::coolant::fluid_holder(node),
height(node["height"].asDouble()),
diameter(node["diameter"].asDouble()),
bubble_hl(node["bubble_hl"].asDouble())
{
steam_suspended = node["steam_suspended"].asDouble();
}
double vessel::get_steam_suspended() const double vessel::get_steam_suspended() const
{ {
return steam_suspended; return steam_suspended;

View File

@ -19,13 +19,14 @@ public:
double steam_suspended = 0; // grams double steam_suspended = 0; // grams
vessel(sim::coolant::fluid_t fluid, double height, double diameter, double mass, double level, double bubble_hl); vessel(sim::coolant::fluid_t fluid, double height, double diameter, double mass, double level, double bubble_hl);
vessel(const Json::Value& node);
double get_steam_suspended() const; // grams double get_steam_suspended() const; // grams
double get_void_ratio() const; double get_void_ratio() const;
void update(double secs); void update(double secs);
virtual operator Json::Value() const; operator Json::Value() const;
friend std::ostream& operator<<(std::ostream& o, const vessel& v) friend std::ostream& operator<<(std::ostream& o, const vessel& v)
{ {

View File

@ -15,6 +15,18 @@ fuel_rod::fuel_rod(double fuel) : s(fuel)
} }
fuel_rod::fuel_rod(const Json::Value& node) : s(node["sample"]), rod(node)
{
}
Json::Value fuel_rod::serialize() const
{
Json::Value node(rod::serialize());
node["sample"] = s;
return node;
}
void fuel_rod::display(std::ostream& o) const void fuel_rod::display(std::ostream& o) const
{ {
double mol = fuel_molar_density * get_volume(); double mol = fuel_molar_density * get_volume();

View File

@ -23,7 +23,9 @@ class fuel_rod : public sim::reactor::rod
public: public:
fuel_rod(double fuel); fuel_rod(double fuel);
fuel_rod(const Json::Value& node);
virtual Json::Value serialize() const;
virtual std::unique_ptr<rod> clone() const { return std::make_unique<fuel_rod>(*this); } virtual std::unique_ptr<rod> clone() const { return std::make_unique<fuel_rod>(*this); }
virtual bool should_display() const { return true; } virtual bool should_display() const { return true; }
virtual void update(double secs); virtual void update(double secs);

View File

@ -15,6 +15,41 @@ sample::sample(double fuel)
this->mass = 1; this->mass = 1;
} }
sample::sample(const Json::Value& node) : waste(node["waste"])
{
fuel = node["fuel"].asDouble();
i_135 = node["i_135"].asDouble();
xe_135 = node["xe_135"].asDouble();
te_135 = node["te_135"].asDouble();
u_238 = node["u_238"].asDouble();
mass = node["mass"].asDouble();
energy = node["energy"].asDouble();
fast_neutrons = node["neutrons"]["fast"].asDouble();
slow_neutrons = node["neutrons"]["slow"].asDouble();
efficiency = node["efficiency"].asDouble();
}
sample::operator Json::Value() const
{
Json::Value node;
node["waste"] = waste;
node["fuel"] = fuel;
node["i_135"] = i_135;
node["xe_135"] = xe_135;
node["te_135"] = te_135;
node["u_238"] = u_238;
node["mass"] = mass;
node["energy"] = energy;
node["neutrons"]["fast"] = fast_neutrons;
node["neutrons"]["slow"] = slow_neutrons;
node["efficiency"] = efficiency;
return node;
}
void sample::update(double secs) void sample::update(double secs)
{ {
double m; double m;

View File

@ -33,6 +33,9 @@ class sample
public: public:
sample(double fuel); sample(double fuel);
sample(const Json::Value& node);
operator Json::Value() const;
void update(double secs); void update(double secs);

View File

@ -4,6 +4,40 @@
using namespace sim::reactor::fuel; using namespace sim::reactor::fuel;
waste::waste(const Json::Value& node)
{
const Json::Value& j_ladder = node["ladder"];
for(int i = 0; i < N; i++)
{
high[i] = j_ladder[i][0].asDouble();
low[i] = j_ladder[i][1].asDouble();
}
neutrons = node["neutrons"].asDouble();
energy = node["energy"].asDouble();
}
waste::operator Json::Value() const
{
Json::Value node;
Json::Value j_ladder;
for(int i = 0; i < N; i++)
{
Json::Value j_step;
j_step.append(high[i]);
j_step.append(low[i]);
j_ladder.append(std::move(j_step));
}
node["ladder"] = std::move(j_ladder);
node["neutrons"] = neutrons;
node["energy"] = energy;
return node;
}
void waste::update(double secs) void waste::update(double secs)
{ {
double next[waste::N - 1] = {0}; double next[waste::N - 1] = {0};

View File

@ -1,6 +1,8 @@
#pragma once #pragma once
#include <json/json.h>
namespace sim::reactor::fuel namespace sim::reactor::fuel
{ {
@ -15,6 +17,12 @@ class waste
public: public:
constexpr waste() { };
waste(const Json::Value& node);
operator Json::Value() const;
void update(double secs); void update(double secs);
void add_fissile(double amount); void add_fissile(double amount);
double extract_neutrons(); double extract_neutrons();

View File

@ -1,6 +1,7 @@
#include "reactor.hpp" #include "reactor.hpp"
#include "../util/random.hpp" #include "../util/random.hpp"
#include "builder.hpp"
#include <algorithm> #include <algorithm>
@ -239,6 +240,24 @@ void reactor::get_stats(rod::val_t type, double& min, double& max)
} }
} }
reactor::reactor(const Json::Value& node, coolant::vessel* v) :
cell_width(node["cell_width"].asDouble()),
cell_height(node["cell_height"].asDouble()),
width(node["width"].asDouble()),
height(node["height"].asDouble()),
size(node["size"].asDouble())
{
const Json::Value& j_rods = node["rods"];
rod_speed = node["rod_speed"].asDouble();
cursor = node["cursor"].asInt();
for(int i = 0; i < size; i++)
{
rods.push_back(load_rod(j_rods[i], v));
}
}
reactor::operator Json::Value() const reactor::operator Json::Value() const
{ {
Json::Value node; Json::Value node;
@ -260,14 +279,17 @@ reactor::operator Json::Value() const
if(rods[i]->get_id() == 0) if(rods[i]->get_id() == 0)
{ {
continue; Json::Value j_rod;
j_rod["id"] = 0;
j_rods.append(std::move(j_rod));
} }
Json::Value j_rod(*rods[i]); else
j_rod["pos"]["x"] = x; {
j_rod["pos"]["y"] = y; Json::Value j_rod(rods[i]->serialize());
j_rods.append(std::move(j_rod)); j_rods.append(std::move(j_rod));
} }
}
node["rods"] = std::move(j_rods); node["rods"] = std::move(j_rods);

View File

@ -2,6 +2,7 @@
#pragma once #pragma once
#include "rod.hpp" #include "rod.hpp"
#include "coolant/vessel.hpp"
#include <iostream> #include <iostream>
#include <memory> #include <memory>
@ -24,6 +25,7 @@ struct reactor
int cursor; int cursor;
reactor(std::unique_ptr<rod>* rods, int width, int height, double cell_width, double cell_height); reactor(std::unique_ptr<rod>* rods, int width, int height, double cell_width, double cell_height);
reactor(const Json::Value& node, coolant::vessel* v);
reactor(const reactor& r); reactor(const reactor& r);
reactor(reactor&& r); reactor(reactor&& r);

View File

@ -82,7 +82,20 @@ void rod::update_rod(double secs)
} }
} }
rod::operator Json::Value() const rod::rod(const Json::Value& node)
{
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();
}
}
Json::Value rod::serialize() const
{ {
Json::Value node; Json::Value node;
Json::Value j_vals; Json::Value j_vals;

View File

@ -25,6 +25,9 @@ public:
N_FAST = 2, N_FAST = 2,
}; };
constexpr rod() {};
rod(const Json::Value& node);
virtual ~rod() {}; virtual ~rod() {};
virtual void interact(rod* o, double secs); virtual void interact(rod* o, double secs);
virtual void update(double secs) { } virtual void update(double secs) { }
@ -62,7 +65,7 @@ public:
return o; return o;
} }
operator Json::Value() const; virtual Json::Value serialize() const;
protected: protected:

View File

@ -55,28 +55,31 @@ system::system()
freight_pump = std::make_unique<coolant::pump>(sink.get(), evaporator.get(), 1e5, 1, 1e4, 0.1, 10, coolant::pump::mode_t::DST, 1e6); freight_pump = std::make_unique<coolant::pump>(sink.get(), evaporator.get(), 1e5, 1, 1e4, 0.1, 10, coolant::pump::mode_t::DST, 1e6);
} }
system::system(system&& o) system::system(const Json::Value& node)
{ {
vessel = std::move(o.vessel); clock = node["clock"].asDouble();
reactor = std::move(o.reactor);
condenser = std::move(o.condenser);
turbine = std::move(o.turbine);
sink = std::move(o.sink); vessel = std::make_unique<reactor::coolant::vessel>(node["vessel"]);
condenser_secondary = std::move(o.condenser_secondary); reactor = std::make_unique<reactor::reactor>(node["reactor"], vessel.get());
evaporator = std::move(o.evaporator); condenser = std::make_unique<coolant::condenser>(node["condenser"]);
turbine = std::make_unique<electric::turbine>(node["turbine"], condenser.get());
turbine_bypass_valve = std::move(o.turbine_bypass_valve); evaporator = std::make_unique<coolant::evaporator>(node["evaporator"]);
turbine_inlet_valve = std::move(o.turbine_inlet_valve); sink = std::make_unique<coolant::sink>(evaporator->fluid, 11, 0, 0);
condenser_secondary = std::make_unique<coolant::condenser_secondary>(condenser.get(), evaporator.get(), 1000);
primary_pump = std::move(o.primary_pump); turbine_inlet_valve = std::make_unique<coolant::valve>(node["valve"]["turbine"]["inlet"], vessel.get(), turbine.get());
secondary_pump = std::move(o.secondary_pump); turbine_bypass_valve = std::make_unique<coolant::valve>(node["valve"]["turbine"]["bypass"], vessel.get(), condenser.get());
freight_pump = std::move(o.freight_pump);
primary_pump = std::make_unique<coolant::pump>(node["pump"]["primary"], condenser.get(), vessel.get());
secondary_pump = std::make_unique<coolant::pump>(node["pump"]["secondary"], evaporator.get(), condenser_secondary.get());
freight_pump = std::make_unique<coolant::pump>(node["pump"]["freight"], sink.get(), evaporator.get());
} }
void system::update(double dt) void system::update(double dt)
{ {
dt *= speed; dt *= speed;
clock += dt;
turbine_inlet_valve->update(dt); turbine_inlet_valve->update(dt);
turbine_bypass_valve->update(dt); turbine_bypass_valve->update(dt);
@ -100,20 +103,21 @@ system::operator Json::Value() const
node["turbine"] = *turbine; node["turbine"] = *turbine;
node["condenser"] = *condenser; node["condenser"] = *condenser;
node["evaporator"] = *evaporator; node["evaporator"] = *evaporator;
node["primary_pump"] = *primary_pump; node["pump"]["primary"] = *primary_pump;
node["secondary_pump"] = *secondary_pump; node["pump"]["secondary"] = *secondary_pump;
node["freight_pump"] = *freight_pump; node["pump"]["freight"] = *freight_pump;
node["turbine_inlet_valve"] = *turbine_inlet_valve; node["valve"]["turbine"]["inlet"] = *turbine_inlet_valve;
node["turbine_bypass_valve"] = *turbine_bypass_valve; node["valve"]["turbine"]["bypass"] = *turbine_bypass_valve;
node["camera"] = graphics::camera::serialize();
node["reactor"] = *reactor; node["reactor"] = *reactor;
node["clock"] = clock;
return node; return node;
} }
void system::save() void system::save()
{ {
Json::Value root(*this); Json::Value root(active);
root["camera"] = graphics::camera::serialize();
Json::StreamWriterBuilder builder; Json::StreamWriterBuilder builder;
builder["commentStyle"] = "None"; builder["commentStyle"] = "None";
@ -125,3 +129,15 @@ void system::save()
savefile.close(); savefile.close();
} }
void system::load()
{
Json::Value root;
std::ifstream savefile("savefile.json");
savefile >> root;
savefile.close();
system sys(root);
graphics::camera::load(root["camera"]);
active = std::move(sys);
}

View File

@ -40,13 +40,15 @@ struct system
sim::graphics::mesh scene; sim::graphics::mesh scene;
double speed = 1; double speed = 1;
double clock = 0;
system(); system();
system(system&& o); system(const Json::Value& node);
system(const system& o) = delete;
void update(double dt); void update(double dt);
void save();
static void save();
static void load();
operator Json::Value() const; operator Json::Value() const;
}; };

View File

@ -27,6 +27,17 @@
using namespace std; using namespace std;
using namespace sim::util; using namespace sim::util;
PID::PID(const Json::Value& node) :
_max(node["max"].asDouble()),
_min(node["min"].asDouble()),
_Kp(node["Kp"].asDouble()),
_Kd(node["Kd"].asDouble()),
_Ki(node["Ki"].asDouble()),
_pre_error(node["pre_error"].asDouble()),
_integral(node["integral"].asDouble())
{
}
PID::operator Json::Value() const PID::operator Json::Value() const
{ {

View File

@ -44,6 +44,7 @@ class PID
// pv - current process value // pv - current process value
double calculate( double dt, double sp, double pv ); double calculate( double dt, double sp, double pv );
PID(const Json::Value& node);
operator Json::Value() const; operator Json::Value() const;
private: private: