Adding initial Project to git

This commit is contained in:
2025-12-29 19:58:26 +00:00
parent 15f9dce88c
commit b54c9bbb1c
24 changed files with 1396 additions and 0 deletions

97
PressureVessel.cs Normal file
View File

@@ -0,0 +1,97 @@
using System;
namespace BWR_simulator
{
public class PressureVessel
{
public readonly double TOTAL_VOLUME; // Liters
private const double VESSEL_COOLING_COEFF = 1000;
private const double ROD_HEATING_COEFF = 2000;
// fluid density coeffcients to calculate fluid density at different pressures and temps
private readonly double[] FDC =
[
999.83311,
0.0752,
0.0089,
7.36413e-5,
4.74639e-7,
1.34888e-9,
1.36e-11
];
public double HotwellTemp { get; private set; }
public double GasMass { get; private set; }
public double GasVolume { get; private set; }
public double GasDensity { get; private set; }
public double Pressure { get; private set; }
public double FluidMass { get; private set; }
public double FluidDensity { get; private set; }
public double FluidVolume { get; private set; }
public double FluidTemp { get; private set; }
public double FluidBoilingPoint { get; private set; }
public double FeedwaterFlow { get; private set; }
public double ReliefValvePos { get; private set; }
public double InputEnergy { get; private set; }
public PressureVessel(double totalVolume = 9500,
double fluidTemp = 300,
double fluidMass = 6200,
double gasMass = 0)
{
TOTAL_VOLUME = totalVolume;
FluidTemp = fluidTemp;
FluidMass = fluidMass;
GasMass = gasMass;
InputEnergy = 0;
ReliefValvePos = 0;
FeedwaterFlow = 0;
Pressure = 1; // calcualte initial pressure
FluidBoilingPoint = Constants.WATER_BOILING_POINT_NORM; // calculate boiling point givien initial pressure
FluidDensity = 1;
HotwellTemp = 300;
CalculateDensity();
}
private void CalculateDensity()
{
FluidVolume = FluidMass / FluidDensity;
GasVolume = TOTAL_VOLUME - FluidVolume;
GasDensity = GasMass / GasVolume;
}
private void CalculateEnergyInput(double dt)
{
InputEnergy -= VESSEL_COOLING_COEFF * (HotwellTemp - FluidTemp) * dt;
InputEnergy += ROD_HEATING_COEFF * (600 - FluidTemp) * dt;
InputEnergy /= 1e6;
}
public void Step(double dt)
{
CalculateEnergyInput(dt);
FluidVolume += FeedwaterFlow * dt;
FluidBoilingPoint = Math.Pow((1/Constants.WATER_BOILING_POINT_NORM - (8.314 * Math.Log(Pressure))/40700), -1);
FluidTemp += (InputEnergy * 1e6) / (FluidMass * Constants.WATER_HEAT_CAPACITY);
if (FluidTemp > FluidBoilingPoint)
{
InputEnergy = FluidMass * Constants.WATER_HEAT_CAPACITY * FluidTemp - FluidBoilingPoint;
FluidTemp = FluidBoilingPoint;
double d_vapour = InputEnergy / Constants.WATER_LATENT_HEAT;
FluidMass -= d_vapour;
GasMass += d_vapour;
CalculateDensity();
}
Pressure = 1 + ((GasMass/Constants.WATER_MOLAR_MASS) * (Constants.IDEAL_GAS_CONSTANT * FluidTemp / TOTAL_VOLUME - FluidVolume));
if (Pressure < 1) {Pressure = 1;}
GasMass -= (Pressure - 1) * ReliefValvePos * dt;
if (GasMass < 0) {GasMass = 0;}
}
}
}