From 33cf246c2563c502d70d656205c499016d814c58 Mon Sep 17 00:00:00 2001 From: John Hewson Date: Wed, 28 Oct 2009 04:02:28 +0000 Subject: [PATCH] LiquidTransportParams.h TransportFactory.cpp Filled out TransportFactory::getLiquidInteractionsTransportData to parse interaction parameters. About 220 lines of XML node extraction added. LiquidTransport.h LiquidTransport.cpp Near the end of LiquidTransport::initLiquid, added the copying of interaction parameters from the LiquidTransportParams object to members: + m_visc_Eij = tr.visc_Eij; + m_visc_Sij = tr.visc_Sij; + m_lambda_Aij = tr.thermalCond_Aij; + m_diff_Dij = tr.diff_Dij; + m_radius_Aij = tr.radius_Aij; Note that the last member was added to allow for hydrodynamic radius mixing rules. --- Cantera/src/transport/LiquidTransport.cpp | 25 +- Cantera/src/transport/LiquidTransport.h | 3 + Cantera/src/transport/LiquidTransportParams.h | 22 +- Cantera/src/transport/TransportFactory.cpp | 236 ++++++++++++++++-- 4 files changed, 248 insertions(+), 38 deletions(-) diff --git a/Cantera/src/transport/LiquidTransport.cpp b/Cantera/src/transport/LiquidTransport.cpp index dbcd6798e..fe61d4d43 100644 --- a/Cantera/src/transport/LiquidTransport.cpp +++ b/Cantera/src/transport/LiquidTransport.cpp @@ -325,37 +325,40 @@ namespace Cantera { } } - - /* - * Read the transport block in the phase XML Node - * It's not an error if this block doesn't exist. Just use the defaults + * Here we get interaction parameters from LiquidTransportParams + * that were filled in TransportFactory::getLiquidInteractionsTransportData */ - - //HERE WE NEED TO GET THINGS FROM - //TransportFactory::getLiquidInteractionsTransportData /* * Viscosity mixing rules */ m_viscMixModel = tr.model_viscosity; m_visc_Eij.resize(m_nsp,m_nsp); m_visc_Sij.resize(m_nsp,m_nsp); - - + m_visc_Eij = tr.visc_Eij; + m_visc_Sij = tr.visc_Sij; /* * Thermal conductivity mixing rules */ - m_lambdaMixModel = tr.model_viscosity; + m_lambdaMixModel = tr.model_thermalCond; m_lambda_Aij.resize(m_nsp,m_nsp); + m_lambda_Aij = tr.thermalCond_Aij; /* * Species Diffusivity binary diffusion coefficients * for Stefan Maxwell equation or "mixing rules" */ - m_diffMixModel = tr.model_viscosity; + m_diffMixModel = tr.model_speciesDiffusivity; m_diff_Dij.resize(m_nsp,m_nsp); + m_diff_Dij = tr.diff_Dij; + /* + * Hydrodynamic radius mixing model rules + */ + m_radiusMixModel = tr.model_radius; + m_radius_Aij.resize(m_nsp,m_nsp); + m_radius_Aij = tr.radius_Aij; diff --git a/Cantera/src/transport/LiquidTransport.h b/Cantera/src/transport/LiquidTransport.h index f570932b9..4af44619b 100644 --- a/Cantera/src/transport/LiquidTransport.h +++ b/Cantera/src/transport/LiquidTransport.h @@ -612,6 +612,9 @@ namespace Cantera { */ LiquidTranMixingModel m_radiusMixModel; + //! Hydrodynamic radius mixing model interaction parameters + DenseMatrix m_radius_Aij; + //! Polynomial coefficients of the binary diffusion coefficients /*! diff --git a/Cantera/src/transport/LiquidTransportParams.h b/Cantera/src/transport/LiquidTransportParams.h index e1790c266..157c372f1 100644 --- a/Cantera/src/transport/LiquidTransportParams.h +++ b/Cantera/src/transport/LiquidTransportParams.h @@ -27,8 +27,8 @@ namespace Cantera { * * * - * LiCl(L) - * KCl(L) + * LiCl(L) + * KCl(L) * -1.0 * 1.0E-1 * @@ -37,18 +37,18 @@ namespace Cantera { * * * - * Li+ - * K+ + * Li+ + * K+ * 1.5 * * - * K+ - * Cl- + * K+ + * Cl- * 1.0 * * - * Li+ - * Cl- + * Li+ + * Cl- * 1.2 * * @@ -140,6 +140,12 @@ namespace Cantera { //! Model for species interaction effects for hydrodynamic radius //! Takes enum LiquidTranMixingModel LiquidTranMixingModel model_hydroradius; + + //! Interaction associated with hydrodynamic radius. + /** + * Not yet implemented + */ + DenseMatrix radius_Aij; }; } diff --git a/Cantera/src/transport/TransportFactory.cpp b/Cantera/src/transport/TransportFactory.cpp index e7cb2dde7..533e08230 100644 --- a/Cantera/src/transport/TransportFactory.cpp +++ b/Cantera/src/transport/TransportFactory.cpp @@ -1124,30 +1124,228 @@ namespace Cantera { LiquidTransportParams& trParam) { - if ( transportNode.hasChild("viscosity")) { - XML_Node& viscosityNode = transportNode.child("viscosity"); - if ( viscosityNode.hasChild("compositionDependence") ) { - XML_Node& compositionNode = viscosityNode.child("compositionDependence"); - std::string compositionModel = compositionNode.attrib("model"); - if ( compositionModel == "" ) { + std::string type; + std::string speciesA; + std::string speciesB; + /* + * Viscosity + */ + if ( transportNode.hasChild("viscosity")) { + XML_Node& viscosityNode = transportNode.child("viscosity"); + if ( viscosityNode.hasChild("compositionDependence") ) { + XML_Node& compositionNode = viscosityNode.child("compositionDependence"); + std::string compositionModel = compositionNode.attrib("model"); + if ( compositionModel == "" ) { throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", "transport::viscosity XML node doesn't have a model string"); - } else if ( compositionModel == "none"){ - trParam.model_viscosity = LTR_MIXMODEL_NONE; - } else if ( compositionModel == "solvent"){ - throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + } else if ( compositionModel == "none"){ + trParam.model_viscosity = LTR_MIXMODEL_NONE; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_NONE interactions not implemented for viscosity"); + } else if ( compositionModel == "solvent"){ + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", "solvent interactions not implemented"); - } else if ( compositionModel == "moleFractions"){ - trParam.model_viscosity = LTR_MIXMODEL_MOLEFRACS; - } else if ( compositionModel == "massFractions"){ - trParam.model_viscosity = LTR_MIXMODEL_MASSFRACS; - } else if ( compositionModel == "logMoleFractions"){ - trParam.model_viscosity = LTR_MIXMODEL_LOG_MOLEFRACS; - } else if ( compositionModel == "pairwiseInteractionEnergy"){ - trParam.model_viscosity = LTR_MIXMODEL_PAIRWISE_INTERACTION; - } + } else if ( compositionModel == "moleFractions"){ + trParam.model_viscosity = LTR_MIXMODEL_MOLEFRACS; + } else if ( compositionModel == "massFractions"){ + trParam.model_viscosity = LTR_MIXMODEL_MASSFRACS; + } else if ( compositionModel == "logMoleFractions"){ + trParam.model_viscosity = LTR_MIXMODEL_LOG_MOLEFRACS; + } else if ( compositionModel == "pairwiseInteractionEnergy"){ + trParam.model_viscosity = LTR_MIXMODEL_PAIRWISE_INTERACTION; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_PAIRWISE_INTERACTION interactions not implemented for viscosity"); + } + int num = compositionNode.nChildren(); + for (int iChild = 0; iChild < num; iChild++) { + XML_Node &xmlChild = compositionNode.child(iChild); + std::string nodeName = lowercase( xmlChild.name() ); + if ( nodeName != "interaction" ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "expected element and got " + nodeName ); + getString( xmlChild, "speciesA", speciesA, type ); + getString( xmlChild, "speciesB", speciesB, type ); + int iSpecies = trParam.thermo->speciesIndex( speciesA ); + if ( iSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesA ); + int jSpecies = trParam.thermo->speciesIndex( speciesB ); + if ( jSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesB ); + trParam.visc_Eij(iSpecies,jSpecies) = getFloat( xmlChild, "Eij", "toSI" ); + trParam.visc_Eij(jSpecies,iSpecies) = trParam.visc_Eij(iSpecies,jSpecies) ; + trParam.visc_Sij(iSpecies,jSpecies) = getFloat( xmlChild, "Sij", "toSI" ); + trParam.visc_Sij(jSpecies,iSpecies) = trParam.visc_Sij(iSpecies,jSpecies) ; } } + } + + + /* + * Thermal conductivity + */ + if ( transportNode.hasChild("thermalConductivity")) { + XML_Node& thermCondNode = transportNode.child("thermalConductivity"); + if ( thermCondNode.hasChild("compositionDependence") ) { + XML_Node& compositionNode = thermCondNode.child("compositionDependence"); + std::string compositionModel = compositionNode.attrib("model"); + if ( compositionModel == "" ) { + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "transport::thermalConductivity XML node doesn't have a model string"); + } else if ( compositionModel == "none"){ + trParam.model_thermalCond = LTR_MIXMODEL_NONE; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_NONE interactions not implemented for thermalConductivity"); + } else if ( compositionModel == "solvent"){ + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "solvent interactions not implemented"); + } else if ( compositionModel == "moleFractions"){ + trParam.model_thermalCond = LTR_MIXMODEL_MOLEFRACS; + } else if ( compositionModel == "massFractions"){ + trParam.model_thermalCond = LTR_MIXMODEL_MASSFRACS; + } else if ( compositionModel == "logMoleFractions"){ + trParam.model_thermalCond = LTR_MIXMODEL_LOG_MOLEFRACS; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_LOG_MOLEFRACS interactions not implemented for thermalConductivity"); + } else if ( compositionModel == "pairwiseInteractionEnergy"){ + trParam.model_thermalCond = LTR_MIXMODEL_PAIRWISE_INTERACTION; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_PAIRWISE_INTERACTION interactions not implemented for thermalConductivity"); + } + int num = compositionNode.nChildren(); + for (int iChild = 0; iChild < num; iChild++) { + XML_Node &xmlChild = compositionNode.child(iChild); + std::string nodeName = lowercase( xmlChild.name() ); + if ( nodeName != "interaction" ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "expected element and got <" + nodeName + ">" ); + getString( xmlChild, "speciesA", speciesA, type ); + getString( xmlChild, "speciesB", speciesB, type ); + int iSpecies = trParam.thermo->speciesIndex( speciesA ); + if ( iSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesA ); + int jSpecies = trParam.thermo->speciesIndex( speciesB ); + if ( jSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesB ); + trParam.thermalCond_Aij(iSpecies,jSpecies) = getFloat( xmlChild, "Aij", "toSI" ); + trParam.thermalCond_Aij(jSpecies,iSpecies) = trParam.thermalCond_Aij(iSpecies,jSpecies) ; + } + } + } + + + /* + * Species Diffusivity + */ + if ( transportNode.hasChild("speciesDiffusivity")) { + XML_Node& diffusivityNode = transportNode.child("speciesDiffusivity"); + if ( diffusivityNode.hasChild("compositionDependence") ) { + XML_Node& compositionNode = diffusivityNode.child("compositionDependence"); + std::string compositionModel = compositionNode.attrib("model"); + if ( compositionModel == "" ) { + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "transport::speciesDiffusivity XML node doesn't have a model string"); + } else if ( compositionModel == "none"){ + trParam.model_speciesDiffusivity = LTR_MIXMODEL_NONE; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_NONE interactions not implemented for speciesDiffusivity"); + } else if ( compositionModel == "solvent"){ + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "solvent interactions not implemented"); + } else if ( compositionModel == "moleFractions"){ + trParam.model_speciesDiffusivity = LTR_MIXMODEL_MOLEFRACS; + } else if ( compositionModel == "massFractions"){ + trParam.model_speciesDiffusivity = LTR_MIXMODEL_MASSFRACS; + } else if ( compositionModel == "logMoleFractions"){ + trParam.model_speciesDiffusivity = LTR_MIXMODEL_LOG_MOLEFRACS; + } else if ( compositionModel == "pairwiseInteractionEnergy"){ + trParam.model_speciesDiffusivity = LTR_MIXMODEL_PAIRWISE_INTERACTION; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_PAIRWISE_INTERACTION interactions not implemented for speciesDiffusivity"); + } + int num = compositionNode.nChildren(); + for (int iChild = 0; iChild < num; iChild++) { + XML_Node &xmlChild = compositionNode.child(iChild); + std::string nodeName = lowercase( xmlChild.name() ); + if ( nodeName != "interaction" ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "expected element and got " + nodeName ); + getString( xmlChild, "speciesA", speciesA, type ); + getString( xmlChild, "speciesB", speciesB, type ); + int iSpecies = trParam.thermo->speciesIndex( speciesA ); + if ( iSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesA ); + int jSpecies = trParam.thermo->speciesIndex( speciesB ); + if ( jSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesB ); + trParam.diff_Dij(iSpecies,jSpecies) = getFloat( xmlChild, "Dij", "toSI" ); + trParam.diff_Dij(jSpecies,iSpecies) = trParam.diff_Dij(iSpecies,jSpecies) ; + } + } + } + + /* + * Hydrodynamic radius + */ + if ( transportNode.hasChild("hydrodynamicRadius")) { + XML_Node& radiusNode = transportNode.child("hydrodynamicRadius"); + if ( radiusNode.hasChild("compositionDependence") ) { + XML_Node& compositionNode = radiusNode.child("compositionDependence"); + std::string compositionModel = compositionNode.attrib("model"); + if ( compositionModel == "" ) { + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "transport::hydrodynamicRadius XML node doesn't have a model string"); + } else if ( compositionModel == "none"){ + trParam.model_thermalCond = LTR_MIXMODEL_NONE; + } else if ( compositionModel == "solvent"){ + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "solvent interactions not implemented"); + } else if ( compositionModel == "moleFractions"){ + trParam.model_thermalCond = LTR_MIXMODEL_MOLEFRACS; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_MOLEFRACS interactions not implemented for hydrodynamicRadius"); + } else if ( compositionModel == "massFractions"){ + trParam.model_thermalCond = LTR_MIXMODEL_MASSFRACS; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_MASSFRACS interactions not implemented for hydrodynamicRadius"); + } else if ( compositionModel == "logMoleFractions"){ + trParam.model_thermalCond = LTR_MIXMODEL_LOG_MOLEFRACS; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_LOG_MOLEFRACS interactions not implemented for hydrodynamicRadius"); + } else if ( compositionModel == "pairwiseInteractionEnergy"){ + trParam.model_thermalCond = LTR_MIXMODEL_PAIRWISE_INTERACTION; + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "LTR_MIXMODEL_PAIRWISE_INTERACTION interactions not implemented for hydrodynamicRadius"); + } + int num = compositionNode.nChildren(); + for (int iChild = 0; iChild < num; iChild++) { + XML_Node &xmlChild = compositionNode.child(iChild); + std::string nodeName = lowercase( xmlChild.name() ); + if ( nodeName != "interaction" ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "expected element and got <" + nodeName + ">" ); + getString( xmlChild, "speciesA", speciesA, type ); + getString( xmlChild, "speciesB", speciesB, type ); + int iSpecies = trParam.thermo->speciesIndex( speciesA ); + if ( iSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesA ); + int jSpecies = trParam.thermo->speciesIndex( speciesB ); + if ( jSpecies < 0 ) + throw CanteraError("LiquidTransport::getLiquidInteractionsTransportData", + "Unknown species " + speciesB ); + trParam.radius_Aij(iSpecies,jSpecies) = getFloat( xmlChild, "Aij", "toSI" ); + trParam.radius_Aij(jSpecies,iSpecies) = trParam.radius_Aij(iSpecies,jSpecies) ; + } + } + } + + } /*********************************************************