97 lines
3.5 KiB
C#
97 lines
3.5 KiB
C#
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;}
|
|
}
|
|
}
|
|
} |