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; }
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; }
private Hashtable<Spezies, Double> calc_dmj_dp() { Hashtable<Spezies, Double> massenBruchHash_Zone = gg_Zone.get_speziesMassenBruecheDetail(); Hashtable<Spezies, Double> dmj_dp = new Hashtable<Spezies, Double>(); Enumeration<Spezies> e = massenBruchHash_Zone.keys(); Spezies spez; if (loeseChemGleichgwicht == true && burns == true) { double delta_p = 5000; GasGemisch rauchgas = new GasGemisch( GG_SOLVER.get_GG_molenBrueche(p_Zone + delta_p, T_Zone, gg_Zone), "rauchgas_temp_" + ID); Hashtable<Spezies, Double> rgSpezMassenBrueche = rauchgas.get_speziesMassenBruecheDetail(); while (e.hasMoreElements()) { spez = e.nextElement(); dmj_dp.put( spez, (m_Zone * (rgSpezMassenBrueche.get(spez) - massenBruchHash_Zone.get(spez))) / delta_p); } } else { while (e.hasMoreElements()) { spez = e.nextElement(); dmj_dp.put(spez, 0.0); } } return dmj_dp; }
private Hashtable<Spezies, Double> calc_dmj_dT() { Hashtable<Spezies, Double> massenBruchHash_Zone = gg_Zone.get_speziesMassenBruecheDetail(); Hashtable<Spezies, Double> dmj_dT = new Hashtable<Spezies, Double>(); Enumeration<Spezies> e = massenBruchHash_Zone.keys(); Spezies spez; // Berechnen der kalorischen Daten für Rauchgas if (loeseChemGleichgwicht == true && burns == true) { 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; } GasGemisch rauchgas = new GasGemisch( GG_SOLVER.get_GG_molenBrueche(p_Zone, T_Zone - delta_T, gg_Zone), "rauchgas"); Hashtable<Spezies, Double> rgSpezMassenBrueche = rauchgas.get_speziesMassenBruecheDetail(); while (e.hasMoreElements()) { spez = e.nextElement(); dmj_dT.put( spez, (m_Zone * (massenBruchHash_Zone.get(spez) - rgSpezMassenBrueche.get(spez)) / delta_T)); } } else { while (e.hasMoreElements()) { spez = e.nextElement(); dmj_dT.put(spez, 0.0); } } return dmj_dT; }
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]; }