void ConstPressureReactor::evalEqs(doublereal time, doublereal* y, doublereal* ydot, doublereal* params) { double dmdt = 0.0; // dm/dt (gas phase) double* dYdt = ydot + 2; m_thermo->restoreState(m_state); applySensitivity(params); evalWalls(time); double mdot_surf = evalSurfaces(time, ydot + m_nsp + 2); dmdt += mdot_surf; const vector_fp& mw = m_thermo->molecularWeights(); const doublereal* Y = m_thermo->massFractions(); if (m_chem) { m_kin->getNetProductionRates(&m_wdot[0]); // "omega dot" } for (size_t k = 0; k < m_nsp; k++) { // production in gas phase and from surfaces dYdt[k] = (m_wdot[k] * m_vol + m_sdot[k]) * mw[k] / m_mass; // dilution by net surface mass flux dYdt[k] -= Y[k] * mdot_surf / m_mass; } // external heat transfer double dHdt = - m_Q; // add terms for outlets for (size_t i = 0; i < m_outlet.size(); i++) { double mdot_out = m_outlet[i]->massFlowRate(time); // mass flow out of system dmdt -= mdot_out; dHdt -= mdot_out * m_enthalpy; } // add terms for inlets for (size_t i = 0; i < m_inlet.size(); i++) { double mdot_in = m_inlet[i]->massFlowRate(time); dmdt += mdot_in; // mass flow into system for (size_t n = 0; n < m_nsp; n++) { double mdot_spec = m_inlet[i]->outletSpeciesMassFlowRate(n); // flow of species into system and dilution by other species dYdt[n] += (mdot_spec - mdot_in * Y[n]) / m_mass; } dHdt += mdot_in * m_inlet[i]->enthalpy_mass(); } ydot[0] = dmdt; if (m_energy) { ydot[1] = dHdt; } else { ydot[1] = 0.0; } // reset sensitivity parameters resetSensitivity(params); }
void Reactor::evalEqs(doublereal time, doublereal* y, doublereal* ydot, doublereal* params) { double dmdt = 0.0; // dm/dt (gas phase) double* dYdt = ydot + 3; m_thermo->restoreState(m_state); applySensitivity(params); evalWalls(time); double mdot_surf = evalSurfaces(time, ydot + m_nsp + 3); dmdt += mdot_surf; // mass added to gas phase from surface reations // volume equation ydot[1] = m_vdot; const vector_fp& mw = m_thermo->molecularWeights(); const doublereal* Y = m_thermo->massFractions(); if (m_chem) { m_kin->getNetProductionRates(&m_wdot[0]); // "omega dot" } for (size_t k = 0; k < m_nsp; k++) { // production in gas phase and from surfaces dYdt[k] = (m_wdot[k] * m_vol + m_sdot[k]) * mw[k] / m_mass; // dilution by net surface mass flux dYdt[k] -= Y[k] * mdot_surf / m_mass; } /* * Energy equation. * \f[ * \dot U = -P\dot V + A \dot q + \dot m_{in} h_{in} * - \dot m_{out} h. * \f] */ if (m_energy) { ydot[2] = - m_thermo->pressure() * m_vdot - m_Q; } else { ydot[2] = 0.0; } // add terms for outlets for (size_t i = 0; i < m_outlet.size(); i++) { double mdot_out = m_outlet[i]->massFlowRate(time); dmdt -= mdot_out; // mass flow out of system if (m_energy) { ydot[2] -= mdot_out * m_enthalpy; } } // add terms for inlets for (size_t i = 0; i < m_inlet.size(); i++) { double mdot_in = m_inlet[i]->massFlowRate(time); dmdt += mdot_in; // mass flow into system for (size_t n = 0; n < m_nsp; n++) { double mdot_spec = m_inlet[i]->outletSpeciesMassFlowRate(n); // flow of species into system and dilution by other species dYdt[n] += (mdot_spec - mdot_in * Y[n]) / m_mass; } if (m_energy) { ydot[2] += mdot_in * m_inlet[i]->enthalpy_mass(); } } ydot[0] = dmdt; resetSensitivity(params); }
void IdealGasReactor::evalEqs(doublereal time, doublereal* y, doublereal* ydot, doublereal* params) { double dmdt = 0.0; // dm/dt (gas phase) double mcvdTdt = 0.0; // m * c_v * dT/dt double* dYdt = ydot + 3; m_thermo->restoreState(m_state); applySensitivity(params); m_thermo->getPartialMolarIntEnergies(&m_uk[0]); const vector_fp& mw = m_thermo->molecularWeights(); const doublereal* Y = m_thermo->massFractions(); if (m_chem) { m_kin->getNetProductionRates(&m_wdot[0]); // "omega dot" } evalWalls(time); double mdot_surf = evalSurfaces(time, ydot + m_nsp + 3); dmdt += mdot_surf; // compression work and external heat transfer mcvdTdt += - m_pressure * m_vdot - m_Q; for (size_t n = 0; n < m_nsp; n++) { // heat release from gas phase and surface reations mcvdTdt -= m_wdot[n] * m_uk[n] * m_vol; mcvdTdt -= m_sdot[n] * m_uk[n]; // production in gas phase and from surfaces dYdt[n] = (m_wdot[n] * m_vol + m_sdot[n]) * mw[n] / m_mass; // dilution by net surface mass flux dYdt[n] -= Y[n] * mdot_surf / m_mass; } // add terms for outlets for (size_t i = 0; i < m_outlet.size(); i++) { double mdot_out = m_outlet[i]->massFlowRate(time); dmdt -= mdot_out; // mass flow out of system mcvdTdt -= mdot_out * m_pressure * m_vol / m_mass; // flow work } // add terms for inlets for (size_t i = 0; i < m_inlet.size(); i++) { double mdot_in = m_inlet[i]->massFlowRate(time); dmdt += mdot_in; // mass flow into system mcvdTdt += m_inlet[i]->enthalpy_mass() * mdot_in; for (size_t n = 0; n < m_nsp; n++) { double mdot_spec = m_inlet[i]->outletSpeciesMassFlowRate(n); // flow of species into system and dilution by other species dYdt[n] += (mdot_spec - mdot_in * Y[n]) / m_mass; // In combintion with h_in*mdot_in, flow work plus thermal // energy carried with the species mcvdTdt -= m_uk[n] / mw[n] * mdot_spec; } } ydot[0] = dmdt; ydot[1] = m_vdot; if (m_energy) { ydot[2] = mcvdTdt / (m_mass * m_thermo->cv_mass()); } else { ydot[2] = 0; } resetSensitivity(params); }