/** * Mit dieser Methode kann ein Massenelement eines Gases mit der Temperatur T_m der Zone mit der * Temperatur T_Zone zugemischt werden. Die sich ergebende Mischungstemperatur wird für * VERÄNDERLICHE CVs und ein adiabates System nach dem ersten HS berechnet. Das Volumen der Zone * bleibt Konstant --> das zugemischte Massenelement leistet Verschiebearbeit! * * @param m_Zu --> zugemischtes Massenelement [kg] * @param T_Zu --> Temperatur des zugemischten Massenelements [K] * @param s_Zu --> Zusammensetzung des Massenelements */ public void massenElementZumischenKonstVol(double m_Zu, double T_Zu, Spezies s_Zu) { // adiabate Mischungstemperatur nach dem ersten Hauptsatz double Tm = 278.15, U1, U_zu, U1m, U_zum, Cvm1, Cv_zum, F, dF, Tm_buffer; U1 = gg_Zone.get_u_mass(T_Zone) * m_Zone; U_zu = s_Zu.get_u_mass(T_Zu) * m_Zu; int idx = 0; // Newtonverfahren für F(Tm)= U1(T1)+U2(T2)-U1(Tm)-U2(Tm)=0 // mit dF/dT=-m1*Cv1(Tm)-m2*Cv2(Tm) do { Tm_buffer = Tm; U1m = gg_Zone.get_u_mass(Tm) * m_Zone; U_zum = s_Zu.get_u_mass(Tm) * m_Zu; Cvm1 = gg_Zone.get_cv_mass(Tm) * m_Zone; Cv_zum = s_Zu.get_cv_mass(Tm) * m_Zu; F = U1 + U_zu - U1m - U_zum; dF = -Cvm1 - Cv_zum; Tm = Tm - F / dF; idx++; } while (idx < 1000 && Math.abs(Tm - Tm_buffer) > 0.1); if (idx >= 1000) { try { throw new MiscException("t"); } catch (MiscException me) { me.log_Warning("Mangelnde Konvergenz bei der Berechnung der Mischungstemperatur"); } } T_Zone = Tm; // dieser Aufruf muss nach der Temperaturberechnung erfolgen da sich hier die Masse der Zone // ändert massenElementZumischen(m_Zu, s_Zu); }
/** * Mit dieser Methode kann ein Massenelement eines Gases der Zone zugemischt werden. --> es wird * nur die Zusammensetzung und die Gesamtmasse der Zone geändert nicht aber die Temperatur * * @param idx --> Rechenindex * @param mZu --> zugemischtes Massenelement [kg] * @param sZu --> SpeziesObjekt des Massenelements */ public void massenElementZumischen(double mZu, Spezies sZu) { Hashtable<Spezies, Double> massenBruchHash_Zone = gg_Zone.get_speziesMassenBruecheDetail(); Hashtable<Spezies, Double> massenBruchHashNeu = new Hashtable<Spezies, Double>(4); double m_Zone_neu = mZu + m_Zone; if (m_Zone_neu < 0) { try { throw new MiscException( "ERROR: Aus Zone " + ID + " wird mehr Masse entnommen als vorhanden ist"); } catch (MiscException miscE) { miscE.stopBremo(); } } Hashtable<Spezies, Double> einzelMassenHashIn = new Hashtable<Spezies, Double>(); // einzelmassen der zugefuehrten Spezies bestimmen if (mZu < 0) { if (sZu.isGasGemisch()) { einzelMassenHashIn = // enthaelt negative Werte!! this.get_einzelMassenHash(((GasGemisch) sZu).get_speziesMassenBruecheDetail(), mZu); } else { einzelMassenHashIn.put(sZu, mZu); } // einzelmassen der Zone bestimmen Hashtable<Spezies, Double> einzelMassenHashZone = this.get_einzelMassenHash(massenBruchHash_Zone, m_Zone); // Addieren der einzelnen Massen von Zone und sZu Enumeration<Spezies> e = einzelMassenHashZone.keys(); Spezies spez; double mTemp; while (e.hasMoreElements()) { spez = e.nextElement(); mTemp = einzelMassenHashZone.get(spez); if (einzelMassenHashIn.containsKey(spez)) mTemp = mTemp + einzelMassenHashIn.get(spez); // Wert in Hashtable ist negativ double massenBruch = mTemp / m_Zone_neu; massenBruchHashNeu.put(spez, massenBruch); if (massenBruch < 0) { // kommt vor wenn eine Masse entnommen werden soll die gar nicht in der Zone ist! try { throw new MiscException( "ERROR: In einer Zone tritt ein negativer Massenbruch auf \n" + spez.get_name() + ": " + massenBruch); } catch (MiscException miscE) { massenBruchHashNeu.put(spez, 0d); // miscE.stopBremo(); //TODO check mich } } } } else { massenBruchHashNeu.put(gg_Zone, m_Zone / m_Zone_neu); if (massenBruchHashNeu.containsKey( sZu)) { // ==True wenn der Zone eine Masse von sich selbst zugefuehrt wird massenBruchHashNeu.put(gg_Zone, 1D); } else massenBruchHashNeu.put(sZu, mZu / m_Zone_neu); } Hashtable<Spezies, Double> molenBruchHash = new Hashtable<Spezies, Double>(4); molenBruchHash = GasGemisch.Gasmischer.massenBruch2molenBruch(massenBruchHashNeu); GasGemisch gasGemisch = new GasGemisch(molenBruchHash, ""); // würde man hier die gg_Zone.set_Gasmischung_molenBruch(gasGemisch.get_speziesMolenBruecheDetail()); m_Zone = m_Zone_neu; }
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]; }