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;} } } }