void MineralEQ3::initThermoXML(XML_Node& phaseNode, const std::string& id_) { /* * Find the Thermo XML node */ if (!phaseNode.hasChild("thermo")) { throw CanteraError("HMWSoln::initThermoXML", "no thermo XML node"); } std::vector<const XML_Node*> xspecies = speciesData(); const XML_Node* xsp = xspecies[0]; XML_Node* aStandardState = 0; if (xsp->hasChild("standardState")) { aStandardState = &xsp->child("standardState"); } else { throw CanteraError("MineralEQ3::initThermoXML", "no standard state mode"); } doublereal volVal = 0.0; string smodel = (*aStandardState)["model"]; if (smodel != "constantVolume") { throw CanteraError("MineralEQ3::initThermoXML", "wrong standard state mode"); } if (aStandardState->hasChild("V0_Pr_Tr")) { XML_Node& aV = aStandardState->child("V0_Pr_Tr"); string Aunits = ""; double Afactor = toSI("cm3/gmol"); if (aV.hasAttrib("units")) { Aunits = aV.attrib("units"); Afactor = toSI(Aunits); } volVal = ctml::getFloat(*aStandardState, "V0_Pr_Tr"); m_V0_pr_tr= volVal; volVal *= Afactor; m_speciesSize[0] = volVal; } else { throw CanteraError("MineralEQ3::initThermoXML", "wrong standard state mode"); } doublereal rho = molecularWeight(0) / volVal; setDensity(rho); const XML_Node& sThermo = xsp->child("thermo"); const XML_Node& MinEQ3node = sThermo.child("MinEQ3"); m_deltaG_formation_pr_tr = ctml::getFloatDefaultUnits(MinEQ3node, "DG0_f_Pr_Tr", "cal/gmol", "actEnergy"); m_deltaH_formation_pr_tr = ctml::getFloatDefaultUnits(MinEQ3node, "DH0_f_Pr_Tr", "cal/gmol", "actEnergy"); m_Entrop_pr_tr = ctml::getFloatDefaultUnits(MinEQ3node, "S0_Pr_Tr", "cal/gmol/K"); m_a = ctml::getFloatDefaultUnits(MinEQ3node, "a", "cal/gmol/K"); m_b = ctml::getFloatDefaultUnits(MinEQ3node, "b", "cal/gmol/K2"); m_c = ctml::getFloatDefaultUnits(MinEQ3node, "c", "cal-K/gmol"); convertDGFormation(); }
doublereal Phase::elementalMassFraction(const size_t m) const { checkElementIndex(m); doublereal Z_m = 0.0; for (size_t k = 0; k != m_kk; ++k) { Z_m += nAtoms(k, m) * atomicWeight(m) / molecularWeight(k) * massFraction(k); } return Z_m; }
/* * setSolvent(): * Utilities for Solvent ID and Molality * Here we also calculate and store the molecular weight * of the solvent and the m_Mnaught parameter. * @param k index of the solvent. */ void MolalityVPSSTP::setSolvent(size_t k) { if (k >= m_kk) { throw CanteraError("MolalityVPSSTP::setSolute ", "bad value"); } m_indexSolvent = k; AssertThrowMsg(m_indexSolvent==0, "MolalityVPSSTP::setSolvent", "Molality-based methods limit solvent id to being 0"); m_weightSolvent = molecularWeight(k); m_Mnaught = m_weightSolvent / 1000.; }
/* * cv_mole(): * * Molar heat capacity at constant volume of the mixture. * Units: J/kmol/K. * * For single species, we go directory to the * general Cp - Cv relation * * Cp = Cv + alpha**2 * V * T / beta * * where * alpha = volume thermal expansion coefficient * beta = isothermal compressibility */ doublereal SingleSpeciesTP::cv_mole() const { doublereal cvbar = cp_mole(); doublereal alpha = thermalExpansionCoeff(); doublereal beta = isothermalCompressibility(); doublereal molecW = molecularWeight(0); doublereal V = molecW/density(); doublereal T = temperature(); if (beta != 0.0) { cvbar -= alpha * alpha * V * T / beta; } return cvbar; }
void MineralEQ3::initThermoXML(XML_Node& phaseNode, const std::string& id_) { // Find the Thermo XML node if (!phaseNode.hasChild("thermo")) { throw CanteraError("HMWSoln::initThermoXML", "no thermo XML node"); } const XML_Node* xsp = speciesData()[0]; XML_Node* aStandardState = 0; if (xsp->hasChild("standardState")) { aStandardState = &xsp->child("standardState"); } else { throw CanteraError("MineralEQ3::initThermoXML", "no standard state mode"); } doublereal volVal = 0.0; if (aStandardState->attrib("model") != "constantVolume") { throw CanteraError("MineralEQ3::initThermoXML", "wrong standard state mode"); } if (aStandardState->hasChild("V0_Pr_Tr")) { XML_Node& aV = aStandardState->child("V0_Pr_Tr"); double Afactor = toSI("cm3/gmol"); if (aV.hasAttrib("units")) { Afactor = toSI(aV.attrib("units")); } volVal = getFloat(*aStandardState, "V0_Pr_Tr"); m_V0_pr_tr= volVal; volVal *= Afactor; } else { throw CanteraError("MineralEQ3::initThermoXML", "wrong standard state mode"); } setDensity(molecularWeight(0) / volVal); const XML_Node& MinEQ3node = xsp->child("thermo").child("MinEQ3"); m_deltaG_formation_pr_tr = getFloat(MinEQ3node, "DG0_f_Pr_Tr", "actEnergy") / actEnergyToSI("cal/gmol"); m_deltaH_formation_pr_tr = getFloat(MinEQ3node, "DH0_f_Pr_Tr", "actEnergy") / actEnergyToSI("cal/gmol"); m_Entrop_pr_tr = getFloat(MinEQ3node, "S0_Pr_Tr", "toSI") / toSI("cal/gmol/K"); m_a = getFloat(MinEQ3node, "a", "toSI") / toSI("cal/gmol/K"); m_b = getFloat(MinEQ3node, "b", "toSI") / toSI("cal/gmol/K2"); m_c = getFloat(MinEQ3node, "c", "toSI") / toSI("cal-K/gmol"); convertDGFormation(); }
doublereal SingleSpeciesTP::cv_mole() const { /* * For single species, we go directory to the general Cp - Cv relation * * Cp = Cv + alpha**2 * V * T / beta * * where * alpha = volume thermal expansion coefficient * beta = isothermal compressibility */ doublereal cvbar = cp_mole(); doublereal alpha = thermalExpansionCoeff(); doublereal beta = isothermalCompressibility(); doublereal V = molecularWeight(0)/density(); doublereal T = temperature(); if (beta != 0.0) { cvbar -= alpha * alpha * V * T / beta; } return cvbar; }
void SingleSpeciesTP::getStandardVolumes(doublereal* vbar) const { vbar[0] = molecularWeight(0) / density(); }
void SingleSpeciesTP::getPartialMolarVolumes(doublereal* vbar) const { vbar[0] = molecularWeight(0) / density(); }
OSOptionalQuantity Gas_Impl::getMolecularWeight(bool returnIP) const { OptionalDouble value = molecularWeight(); return getQuantityFromDouble(OS_WindowMaterial_GasFields::MolecularWeight, value, returnIP); }
/** * Get the molar volumes of each species in their standard * states at the current * <I>T</I> and <I>P</I> of the solution. * units = m^3 / kmol * * We resolve this function at this level, by assigning * the molec weight divided by the phase density */ void SingleSpeciesTP::getStandardVolumes(doublereal* vbar) const { double mw = molecularWeight(0); double dens = density(); vbar[0] = mw / dens; }