Пример #1
0
  private double[] calc_dudT_dRdT() {
    double[] du_dt_dR_dT = new double[2];
    double delta_T = 1;
    // if-Abfrage nur dann sinnvoll wenn Einfriertemperatur unter 1000K
    // oder wenn Luft als Rauchgas mit sehr gro§em Lambda modelliert wird
    if (T_Zone > 1000 && T_Zone <= 1001) {
      delta_T = -1;
    }
    // Berechnen der kalorischen Daten für Rauchgas
    if (loeseChemGleichgwicht == true && T_Zone >= GG_SOLVER.get_T_Freeze()) {
      GasGemisch zoneGG =
          new GasGemisch(GG_SOLVER.get_GG_molenBrueche(p_Zone, T_Zone, gg_Zone), "zoneGG" + ID);
      GasGemisch rauchgas =
          new GasGemisch(
              GG_SOLVER.get_GG_molenBrueche(p_Zone, T_Zone - delta_T, gg_Zone),
              "rauchgasZone" + ID);

      // ist zwar umstaendlich aber ich hab schon alles mit Java erlebt :-(
      double a = (zoneGG.get_u_mass(T_Zone) - rauchgas.get_u_mass(T_Zone - delta_T));
      du_dt_dR_dT[0] = a / delta_T;

      a = (zoneGG.get_R() - rauchgas.get_R());
      du_dt_dR_dT[1] = a / delta_T;
    } else {
      du_dt_dR_dT[0] =
          gg_Zone.get_cv_mass(T_Zone); // hier ändert sich die Zusammensetzung des Gases nicht mehr
      du_dt_dR_dT[1] = 0;
    }
    return du_dt_dR_dT;
  }
Пример #2
0
  private double[] calc_dudp_dRdp() {
    double[] du_dp_dR_dp = new double[2];

    double delta_p = 5000;
    // Berechnen der kalorischen Daten für Rauchgas
    if (loeseChemGleichgwicht == true && T_Zone >= GG_SOLVER.get_T_Freeze()) {
      GasGemisch zoneGG =
          new GasGemisch(GG_SOLVER.get_GG_molenBrueche(p_Zone, T_Zone, gg_Zone), "zoneGG" + ID);
      GasGemisch rauchgas =
          new GasGemisch(
              GG_SOLVER.get_GG_molenBrueche(p_Zone + delta_p, T_Zone, gg_Zone),
              "rauchgasZone" + ID);

      double a = (rauchgas.get_u_mass(T_Zone) - zoneGG.get_u_mass(T_Zone));
      du_dp_dR_dp[0] = a / delta_p;

      a = (rauchgas.get_R() - zoneGG.get_R());
      du_dp_dR_dp[1] = a / delta_p;

    } else {
      du_dp_dR_dp[0] = 0;
      du_dp_dR_dp[1] = 0;
    }
    return du_dp_dR_dp;
  }
Пример #3
0
  public void set_p_V_T_mi(
      double p_init, double V_init, double T_init, Hashtable<Spezies, Double> mi) {
    this.p_Zone = p_init;
    this.V_Zone = V_init;
    this.T_Zone = T_init;
    if (p_Zone <= 0
        || V_Zone <= 0
        || T_Zone <= 0
        || (((Double) p_Zone).isNaN())
        || (((Double) T_Zone).isNaN())
        || (((Double) V_Zone).isNaN())) {
      try {
        throw new NegativeMassException(
            "Falsche Werte in Zone "
                + this.ID
                + "\n V= "
                + V_Zone
                + "\n p= "
                + p_Zone
                + "\n T= "
                + T_Zone);
      } catch (NegativeMassException nmE) {
        nmE.log_Warning();
      }
    }
    if (CP.get_aktuelle_Rechenzeit() > CP.SYS.WRITE_INTERVAL_SEC) {
      // System.out.println("xsi: "+this.get_xsi());
      //	System.out.println("eta: " +this.get_eta());
    }

    if (T_Zone > T_max_Zone) T_max_Zone = T_Zone;

    // Überprüfen ob die Berechnung der Dissoziation Sinn macht
    if (T_max_Zone >= GG_SOLVER.get_T_Freeze() && burns) loeseChemGleichgwicht = true;

    // Berechnen der Gesamtmasse
    double mGes = 0.0D;
    double mi_;
    Enumeration<Spezies> e = mi.keys();
    Spezies spez;
    while (e.hasMoreElements()) {
      spez = e.nextElement();
      mi_ = mi.get(spez);
      if (mi_ < 0) {
        if (Math.abs(mi_) >= 0.00001 * CP.SYS.MINIMALE_ZONENMASSE) {
          try {
            throw new NegativeMassException(
                spez.get_name()
                    + " in Zone "
                    + this.ID
                    + " hatte eine negative Masse ("
                    + mi_
                    + "kg). Die Masse wurde auf null gesetzt!");
          } catch (NegativeMassException nmE) {
            nmE.log_Warning();
          }
        }
        mi_ = 0;
        mi.put(spez, mi_);
      }
      mGes = mGes + mi_;
    }
    spez = null;
    e = null;
    this.m_Zone = mGes;

    if (this.m_Zone > 0) {
      // Berechnen der Massenbrueche
      Hashtable<Spezies, Double> massenBrueche = new Hashtable<Spezies, Double>();
      e = mi.keys();
      double xi;
      while (e.hasMoreElements()) {
        spez = e.nextElement();
        xi = mi.get(spez) / mGes;
        massenBrueche.put(spez, xi);
      }
      gg_Zone.set_Gasmischung_massenBruch(massenBrueche);
      // Berechnen der Dissoziation
      if (loeseChemGleichgwicht == true)
        gg_Zone.set_Gasmischung_molenBruch(GG_SOLVER.get_GG_molenBrueche(p_Zone, T_Zone, gg_Zone));

    } else {
      Hashtable<Spezies, Double> massenBrueche = new Hashtable<Spezies, Double>();
      Spezies co2 = CP.SPEZIES_FABRIK.get_spezCO2();
      massenBrueche.put(co2, 1D); // TODO irgendwie uncool
      gg_Zone.set_Gasmischung_massenBruch(massenBrueche);
    }

    double pV = p_Zone * V_Zone;
    double mRT = m_Zone * gg_Zone.get_R() * T_Zone;
    // This accounts for inaccuracy during the integration process.
    // The differences in temperature should be very very small!!
    //			if(CP.get_time()>CP.convert_KW2SEC(5.2))
    //				System.out.println();
    if (pV != mRT && m_Zone > 0 && V_Zone > 0) {
      //	System.out.println("(pV-mRT)/pV: "+(pV-mRT)/pV*100);
      double T_temp = pV / m_Zone / gg_Zone.get_R();
      this.T_Zone = T_temp;
      double chkPv = pV - m_Zone * gg_Zone.get_R() * T_temp;
      double chkT = Math.abs((T_Zone - T_temp) / T_temp);
      if (chkT > 7.555e-3 && m_Zone > CP.SYS.MINIMALE_ZONENMASSE) {
        try {
          throw new MiscException(
              "The temperature of  zone  "
                  + this.ID
                  + " had to be adjusted too much! "
                  + "chkT= "
                  + chkT);
        } catch (MiscException me) {
          me.log_Warning();
        }
      }
    }

    dmj_ein = new Hashtable<Spezies, Double>();
    dm_aus = new Hashtable<Spezies, Double>();
    sumdQ = 0;
    sumdH = 0;
    sumdU = 0;
    dudp = this.calc_dudp_dRdp()[0];
    dRdp = this.calc_dudp_dRdp()[1];
    dudT = this.calc_dudT_dRdT()[0];
    dRdT = this.calc_dudT_dRdT()[1];
  }