/// <summary>ゾーンへ流入する空気の状態と体積[m3/h]を取得する</summary> /// <param name="zone">ゾーン</param> /// <param name="airState">空気状態</param> /// <param name="volume">空気体積[m3/h]</param> public void GetExchangeAir(ImmutableZone zone, out ImmutableMoistAir airState, out double volume) { Dictionary<ImmutableZone, double> val = zones[zone]; volume = 0; int cnt = val.Keys.Count; double[] dbt = new double[cnt]; double[] ahd = new double[cnt]; double[] vol = new double[cnt]; int index = 0; foreach (ImmutableZone zn in val.Keys) { dbt[index] = zn.CurrentDrybulbTemperature; ahd[index] = zn.CurrentHumidityRatio; vol[index] = val[zn]; volume += vol[index]; index++; } //混合 airState = MoistAir.BlendAir(dbt, ahd, vol); }
/// <summary>湿り空気の顕熱[kJ/kg]を計算する</summary> /// <param name="mAir">湿り空気</param> /// <returns>顕熱[kJ/kg]</returns> public static double CalculateSensibleHeat(ImmutableMoistAir mAir) { return mAir.DryBulbTemperature * CP_AIR; }
/// <summary>湿り空気の顕熱差[kJ/kg]を計算する</summary> /// <param name="mAir1">比較湿り空気状態</param> /// <param name="mAir2">基準湿り空気状態</param> /// <returns>顕熱差[kJ/kg]</returns> public static double CalculateSensibleHeatDifference(ImmutableMoistAir mAir1, ImmutableMoistAir mAir2) { return (CP_AIR + CP_VAPOR * mAir1.HumidityRatio) * mAir1.DryBulbTemperature - (CP_AIR + CP_VAPOR * mAir2.HumidityRatio) * mAir2.DryBulbTemperature; }
/// <summary>湿り空気の潜熱差[kJ/kg]を計算する</summary> /// <param name="mAir1">比較湿り空気状態</param> /// <param name="mAir2">基準湿り空気状態</param> /// <returns>潜熱差[kJ/kg]</returns> public static double CalculateLatentHeatDifference(ImmutableMoistAir mAir1, ImmutableMoistAir mAir2) { return (mAir1.HumidityRatio - mAir2.HumidityRatio) * HFG; }
/// <summary>湿り空気の顕熱[kJ/kg]および潜熱[kJ/kg]を計算する</summary> /// <param name="mAir">湿り空気状態</param> /// <param name="sensibleHeat">顕熱[kJ/kg]</param> /// <param name="latentHeat">潜熱[kJ/kg]</param> public static void CalculateSensibleAndLatentHeat(ImmutableMoistAir mAir, out double sensibleHeat, out double latentHeat) { sensibleHeat = CalculateSensibleHeat(mAir); latentHeat = CalculateLatentHeat(mAir); }
/// <summary>湿り空気の潜熱[kJ/kg]を計算する</summary> /// <param name="mAir">湿り空気</param> /// <returns>潜熱[kJ/kg]</returns> public static double CalculateLatentHeat(ImmutableMoistAir mAir) { return (CP_VAPOR * mAir.DryBulbTemperature + HFG) * mAir.HumidityRatio; }
/// <summary>湿り空気の顕熱差[kJ/kg]および潜熱差[kJ/kg]を計算する</summary> /// <param name="mAir1">比較湿り空気状態</param> /// <param name="mAir2">基準湿り空気状態</param> /// <param name="sensibleHeat">顕熱差[kJ/kg]</param> /// <param name="latentHeat">潜熱差[kJ/kg]</param> public static void CalculateHeatDifference(ImmutableMoistAir mAir1, ImmutableMoistAir mAir2, out double sensibleHeat, out double latentHeat) { sensibleHeat = CalculateSensibleHeatDifference(mAir1, mAir2); latentHeat = CalculateLatentHeatDifference(mAir1, mAir2); }
/// <summary>空気を混合する</summary> /// <param name="air1">混合空気1</param> /// <param name="air2">混合空気2</param> /// <param name="air1Rate">空気1混合割合</param> /// <param name="air2Rate">空気2混合割合</param> /// <returns>混合空気</returns> public static MoistAir BlendAir(ImmutableMoistAir air1, ImmutableMoistAir air2, double air1Rate, double air2Rate) { if (air1Rate < 0 || air2Rate < 0) throw new Exception("湿空気の混合比率が0以下に設定されています"); double rate = air1Rate + air2Rate; double dbt = (air1.DryBulbTemperature * air1Rate + air2.DryBulbTemperature * air2Rate) / rate; double ahd = (air1.HumidityRatio * air1Rate + air2.HumidityRatio * air2Rate) / rate; return MoistAir.GetAirStateFromDBHR(dbt, ahd); }
/// <summary>空気を混合する</summary> /// <param name="air">混合する空気の配列</param> /// <param name="rate">混合空気の割合</param> /// <returns>混合済み空気</returns> public static MoistAir BlendAir(ImmutableMoistAir[] air, double[] rate) { int airNum = air.Length; if (airNum != rate.Length) throw new Exception("MoistAir Class: BlendAir: 混合する空気の数と割合の数が一致しません"); double rSum = 0.0d; double tSum = 0.0d; double trSum = 0.0d; double hSum = 0.0d; double hrSum = 0.0d; for (int i = 0; i < airNum; i++) { //if (air[i].DryBulbTemperature < -30.0d) air[i].DryBulbTemperature = -30.0d; //if (air[i].DryBulbTemperature > 65.0d) air[i].DryBulbTemperature = 65.0d; //←もう少し上限はあるかも。要確認 //if (air[i].HumidityRatio < 0.0d) air[i].HumidityRatio = 0.0d; //割合を積算 if (rate[i] < 0) throw new Exception("湿空気の混合比率が0以下に設定されています"); rSum += rate[i]; //温度[K]を積算 tSum += air[i].DryBulbTemperature; //温度[K]×割合を積算 trSum += air[i].DryBulbTemperature * rate[i]; //絶対湿度[kg/kg]を積算 hSum += air[i].HumidityRatio; //絶対湿度[kg/kg]×割合を積算 hrSum += air[i].HumidityRatio * rate[i]; } //混合後の乾球温度および絶対湿度を計算 double drybulbTempOut; double absHumidOut; if (rSum >= 1.0e-5d) { drybulbTempOut = trSum / rSum; absHumidOut = hrSum / rSum; } //割合の積算が小さい場合は発散を防ぐために混合空気の数で割る else { drybulbTempOut = tSum / airNum; absHumidOut = hSum / airNum; } //出口空気状態を計算**飽和した場合の処理が必要** return new MoistAir(drybulbTempOut, absHumidOut); }
/// <summary>コピーConstructor</summary> /// <param name="moistAir">コピーする湿り空気状態</param> public MoistAir(ImmutableMoistAir moistAir) { this.AtmosphericPressure = moistAir.AtmosphericPressure; this.dryBulbTemp = moistAir.DryBulbTemperature; this.humidityRatio = moistAir.HumidityRatio; this.relativeHumid = moistAir.RelativeHumidity; this.enthalpy = moistAir.Enthalpy; this.wetBulbTemp = moistAir.WetBulbTemperature; this.specificVolume = moistAir.SpecificVolume; }