diff --git a/include/cantera/transport/LiquidTranInteraction.h b/include/cantera/transport/LiquidTranInteraction.h index 75614d755..77f2c17b9 100644 --- a/include/cantera/transport/LiquidTranInteraction.h +++ b/include/cantera/transport/LiquidTranInteraction.h @@ -72,7 +72,6 @@ namespace Cantera */ enum LiquidTranMixingModel { LTI_MODEL_NOTSET=-1, - LTI_MODEL_NONE, LTI_MODEL_SOLVENT, LTI_MODEL_MOLEFRACS, LTI_MODEL_MASSFRACS, @@ -80,7 +79,9 @@ enum LiquidTranMixingModel { LTI_MODEL_PAIRWISE_INTERACTION, LTI_MODEL_STEFANMAXWELL_PPN, LTI_MODEL_STOKES_EINSTEIN, - LTI_MODEL_MOLEFRACS_EXPT + LTI_MODEL_MOLEFRACS_EXPT, + LTI_MODEL_NONE, + LTI_MODEL_MULTIPLE }; //! Base class to handle transport property evaluation in a mixture. diff --git a/include/cantera/transport/LiquidTransportParams.h b/include/cantera/transport/LiquidTransportParams.h index db30c165e..e117e06f5 100644 --- a/include/cantera/transport/LiquidTransportParams.h +++ b/include/cantera/transport/LiquidTransportParams.h @@ -126,6 +126,16 @@ public: * Not yet implemented */ DenseMatrix radius_Aij; + + //! Default composition dependence of the transport properties + /*! + * + * Permissible types of composition dependencies + * 0 - Solvent values (i.e., species 0) contributes only + * 1 - linear combination of mole fractions; + */ + LiquidTranMixingModel compositionDepTypeDefault_; + }; } diff --git a/include/cantera/transport/SimpleTransport.h b/include/cantera/transport/SimpleTransport.h index 951a6c098..dcc83e0a2 100644 --- a/include/cantera/transport/SimpleTransport.h +++ b/include/cantera/transport/SimpleTransport.h @@ -508,16 +508,16 @@ private: //! Composition dependence of the transport properties /*! - * The following coefficients are allowed to have simple - * composition dependencies + * The following coefficients are allowed to have simple composition dependencies + * * mixture viscosity * mixture thermal conductivity * - * Types of composition dependencies + * Permissible types of composition dependencies * 0 - Solvent values (i.e., species 0) contributes only * 1 - linear combination of mole fractions; */ - int compositionDepType_; + enum LiquidTranMixingModel compositionDepType_; //! Boolean indicating whether to use the hydrodynamic radius formulation /*! diff --git a/src/transport/LiquidTransportParams.cpp b/src/transport/LiquidTransportParams.cpp index 04853a776..24f3528b1 100644 --- a/src/transport/LiquidTransportParams.cpp +++ b/src/transport/LiquidTransportParams.cpp @@ -32,7 +32,8 @@ LiquidTransportParams::LiquidTransportParams() : hydroRadius(0), model_viscosity(LTI_MODEL_NOTSET), model_speciesDiffusivity(LTI_MODEL_NOTSET), - model_hydroradius(LTI_MODEL_NOTSET) + model_hydroradius(LTI_MODEL_NOTSET), + compositionDepTypeDefault_(LTI_MODEL_NOTSET) { } @@ -56,7 +57,8 @@ LiquidTransportParams::LiquidTransportParams(const LiquidTransportParams& right) hydroRadius(0), model_viscosity(LTI_MODEL_NOTSET), model_speciesDiffusivity(LTI_MODEL_NOTSET), - model_hydroradius(LTI_MODEL_NOTSET) + model_hydroradius(LTI_MODEL_NOTSET), + compositionDepTypeDefault_(LTI_MODEL_NOTSET) { operator=(right); } @@ -106,6 +108,7 @@ LiquidTransportParams& LiquidTransportParams::operator=(const LiquidTransportPa diff_Dij = right.diff_Dij; model_hydroradius = right.model_hydroradius; radius_Aij = right.radius_Aij; + compositionDepTypeDefault_ = right.compositionDepTypeDefault_; throw CanteraError("LiquidTransportParams(const LiquidTransportParams &right)", "not tested"); diff --git a/src/transport/SimpleTransport.cpp b/src/transport/SimpleTransport.cpp index 55982e90d..038d16365 100644 --- a/src/transport/SimpleTransport.cpp +++ b/src/transport/SimpleTransport.cpp @@ -17,7 +17,7 @@ namespace Cantera SimpleTransport::SimpleTransport(thermo_t* thermo, int ndim) : Transport(thermo, ndim), tempDepType_(0), - compositionDepType_(0), + compositionDepType_(LTI_MODEL_SOLVENT), useHydroRadius_(false), doMigration_(0), m_iStateMF(-1), @@ -39,7 +39,7 @@ SimpleTransport::SimpleTransport(thermo_t* thermo, int ndim) : SimpleTransport::SimpleTransport(const SimpleTransport& right) : Transport(), tempDepType_(0), - compositionDepType_(0), + compositionDepType_(LTI_MODEL_SOLVENT), useHydroRadius_(false), doMigration_(0), m_iStateMF(-1), @@ -172,30 +172,18 @@ bool SimpleTransport::initLiquid(LiquidTransportParams& tr) XML_Node& transportNode = phaseNode.child("transport"); string transportModel = transportNode.attrib("model"); if (transportModel == "Simple") { - /* - * - * or - * - */ - std::string modelName = ""; - if (ctml::getOptionalModel(transportNode, "compositionDependence", - modelName)) { - modelName = lowercase(modelName); - if (modelName == "solvent_only") { - compositionDepType_ = 0; - } else if (modelName == "mixture_averaged") { - compositionDepType_ = 1; - } else { - throw CanteraError("SimpleTransport::initLiquid", "Unknown compositionDependence Model: " + modelName); - } - } - } + + compositionDepType_ = tr.compositionDepTypeDefault_; + + } else { + throw CanteraError("SimpleTransport::initLiquid()", + "transport model isn't the correct type: " + transportModel); + } } // make a local copy of the molecular weights m_mw.resize(m_nsp); - copy(m_thermo->molecularWeights().begin(), - m_thermo->molecularWeights().end(), m_mw.begin()); + copy(m_thermo->molecularWeights().begin(), m_thermo->molecularWeights().end(), m_mw.begin()); /* * Get the input Viscosities @@ -382,13 +370,16 @@ doublereal SimpleTransport::viscosity() updateViscosity_T(); } - if (compositionDepType_ == 0) { + if (compositionDepType_ == LTI_MODEL_SOLVENT) { m_viscmix = m_viscSpecies[0]; - } else if (compositionDepType_ == 1) { + } else if (compositionDepType_ == LTI_MODEL_MOLEFRACS) { m_viscmix = 0.0; for (size_t k = 0; k < m_nsp; k++) { m_viscmix += m_viscSpecies[k] * m_molefracs[k]; } + } else { + throw CanteraError("SimpleTransport::viscosity()", + "Unknowns compositionDepType"); } m_visc_mix_ok = true; return m_viscmix; @@ -474,13 +465,16 @@ doublereal SimpleTransport::thermalConductivity() updateCond_T(); } if (!m_cond_mix_ok) { - if (compositionDepType_ == 0) { + if (compositionDepType_ == LTI_MODEL_SOLVENT) { m_lambda = m_condSpecies[0]; - } else if (compositionDepType_ == 1) { + } else if (compositionDepType_ == LTI_MODEL_MOLEFRACS) { m_lambda = 0.0; for (size_t k = 0; k < m_nsp; k++) { m_lambda += m_condSpecies[k] * m_molefracs[k]; } + } else { + throw CanteraError("SimpleTransport::thermalConductivity()", + "Unknown compositionDepType"); } m_cond_mix_ok = true; } @@ -683,7 +677,7 @@ bool SimpleTransport::update_C() void SimpleTransport::updateCond_T() { - if (compositionDepType_ == 0) { + if (compositionDepType_ == LTI_MODEL_SOLVENT) { m_condSpecies[0] = m_coeffLambda_Ns[0]->getSpeciesTransProp(); } else { for (size_t k = 0; k < m_nsp; k++) { @@ -718,7 +712,7 @@ void SimpleTransport::updateViscosities_C() void SimpleTransport::updateViscosity_T() { - if (compositionDepType_ == 0) { + if (compositionDepType_ == LTI_MODEL_SOLVENT) { m_viscSpecies[0] = m_coeffVisc_Ns[0]->getSpeciesTransProp(); } else { for (size_t k = 0; k < m_nsp; k++) { diff --git a/src/transport/TransportFactory.cpp b/src/transport/TransportFactory.cpp index b632a7f2b..446f9fb7b 100644 --- a/src/transport/TransportFactory.cpp +++ b/src/transport/TransportFactory.cpp @@ -203,7 +203,6 @@ TransportFactory::TransportFactory() : m_LTRmodelMap["exptemp"] = LTP_TD_EXPT; m_LTImodelMap[""] = LTI_MODEL_NOTSET; - m_LTImodelMap["none"] = LTI_MODEL_NONE; m_LTImodelMap["solvent"] = LTI_MODEL_SOLVENT; m_LTImodelMap["moleFractions"] = LTI_MODEL_MOLEFRACS; m_LTImodelMap["massFractions"] = LTI_MODEL_MASSFRACS; @@ -211,6 +210,8 @@ TransportFactory::TransportFactory() : m_LTImodelMap["pairwiseInteraction"] = LTI_MODEL_PAIRWISE_INTERACTION; m_LTImodelMap["stefanMaxwell_PPN"] = LTI_MODEL_STEFANMAXWELL_PPN; m_LTImodelMap["moleFractionsExpT"] = LTI_MODEL_MOLEFRACS_EXPT; + m_LTImodelMap["none"] = LTI_MODEL_NONE; + m_LTImodelMap["multiple"] = LTI_MODEL_MULTIPLE; } void TransportFactory::deleteFactory() @@ -301,10 +302,20 @@ LiquidTranInteraction* TransportFactory::newLTI(const XML_Node& trNode, lti = new LTI_MoleFracs_ExpT(tp_ind); lti->init(trNode, thermo); break; - default: - // throw CanteraError("newLTI","unknown transport model: " + model ); + case LTI_MODEL_NOTSET: + case LTI_MODEL_NONE: + case LTI_MODEL_MULTIPLE: lti = new LiquidTranInteraction(tp_ind); lti->init(trNode, thermo); + break; + default: + // + // @TODO make sure we can throw an error here with existing datasets and tests before changing code + // + lti = new LiquidTranInteraction(tp_ind); + lti->init(trNode, thermo); + // throw CanteraError("TransportFactory::newLTI()", + // "unknown Liquid Transport Interaction submodel: " + model ); } return lti; } @@ -999,9 +1010,9 @@ void TransportFactory::getLiquidSpeciesTransportData(const std::vector &names, - LiquidTransportParams& trParam) + XML_Node& log, + const std::vector &names, + LiquidTransportParams& trParam) { try { @@ -1018,93 +1029,103 @@ void TransportFactory::getLiquidInteractionsTransportData(const XML_Node& transp trParam.selfDiffusion.resize(nsp,0); ThermoPhase* temp_thermo = trParam.thermo; + if (tranTypeNode.name() == "compositionDependence") { + std::string modelName = tranTypeNode.attrib("model"); + std::map::iterator it = m_LTImodelMap.find(modelName); + if (it == m_LTImodelMap.end()) { + throw CanteraError("TransportFactory::getLiquidInteractionsTransportData", + "Unknown compositionDependence string: " + modelName); + } else { + trParam.compositionDepTypeDefault_ = (*it).second; + } + } else { + if (tranTypeNode.hasChild("compositionDependence")) { + //compDepNode contains the interaction model + XML_Node& compDepNode = tranTypeNode.child("compositionDependence"); + switch (m_tranPropMap[nodeName]) { + break; + case TP_VISCOSITY: + trParam.viscosity = newLTI(compDepNode, m_tranPropMap[nodeName], trParam); + break; + case TP_IONCONDUCTIVITY: + trParam.ionConductivity = newLTI(compDepNode, + m_tranPropMap[nodeName], + trParam); + break; + case TP_MOBILITYRATIO: { + for (size_t iSpec = 0; iSpec< nBinInt; iSpec++) { + XML_Node& propSpecNode = compDepNode.child(iSpec); + string specName = propSpecNode.name(); + size_t loc = specName.find(":"); + string firstSpec = specName.substr(0,loc); + string secondSpec = specName.substr(loc+1); + size_t index = temp_thermo->speciesIndex(firstSpec.c_str())+nsp*temp_thermo->speciesIndex(secondSpec.c_str()); + trParam.mobilityRatio[index] = newLTI(propSpecNode, + m_tranPropMap[nodeName], + trParam); + }; + }; + break; + case TP_SELFDIFFUSION: { + for (size_t iSpec = 0; iSpec< nsp; iSpec++) { + XML_Node& propSpecNode = compDepNode.child(iSpec); + string specName = propSpecNode.name(); + size_t index = temp_thermo->speciesIndex(specName.c_str()); + trParam.selfDiffusion[index] = newLTI(propSpecNode, + m_tranPropMap[nodeName], + trParam); + }; + }; + break; + case TP_THERMALCOND: + trParam.thermalCond = newLTI(compDepNode, + m_tranPropMap[nodeName], + trParam); + break; + case TP_DIFFUSIVITY: + trParam.speciesDiffusivity = newLTI(compDepNode, + m_tranPropMap[nodeName], + trParam); + break; + case TP_HYDRORADIUS: + trParam.hydroRadius = newLTI(compDepNode, + m_tranPropMap[nodeName], + trParam); + break; + case TP_ELECTCOND: + trParam.electCond = newLTI(compDepNode, + m_tranPropMap[nodeName], + trParam); + break; + default: + throw CanteraError("getLiquidInteractionsTransportData","unknown transport property: " + nodeName); - if (tranTypeNode.hasChild("compositionDependence")) { - //compDepNode contains the interaction model - XML_Node& compDepNode = tranTypeNode.child("compositionDependence"); - switch (m_tranPropMap[nodeName]) { - break; - case TP_VISCOSITY: - trParam.viscosity = newLTI(compDepNode, m_tranPropMap[nodeName], trParam); - break; - case TP_IONCONDUCTIVITY: - trParam.ionConductivity = newLTI(compDepNode, - m_tranPropMap[nodeName], - trParam); - break; - case TP_MOBILITYRATIO: { - for (size_t iSpec = 0; iSpec< nBinInt; iSpec++) { - XML_Node& propSpecNode = compDepNode.child(iSpec); - string specName = propSpecNode.name(); - size_t loc = specName.find(":"); - string firstSpec = specName.substr(0,loc); - string secondSpec = specName.substr(loc+1); - size_t index = temp_thermo->speciesIndex(firstSpec.c_str())+nsp*temp_thermo->speciesIndex(secondSpec.c_str()); - trParam.mobilityRatio[index] = newLTI(propSpecNode, - m_tranPropMap[nodeName], - trParam); - }; - }; - break; - case TP_SELFDIFFUSION: { - for (size_t iSpec = 0; iSpec< nsp; iSpec++) { - XML_Node& propSpecNode = compDepNode.child(iSpec); - string specName = propSpecNode.name(); - size_t index = temp_thermo->speciesIndex(specName.c_str()); - trParam.selfDiffusion[index] = newLTI(propSpecNode, - m_tranPropMap[nodeName], - trParam); - }; - }; - break; - case TP_THERMALCOND: - trParam.thermalCond = newLTI(compDepNode, - m_tranPropMap[nodeName], - trParam); - break; - case TP_DIFFUSIVITY: - trParam.speciesDiffusivity = newLTI(compDepNode, - m_tranPropMap[nodeName], - trParam); - break; - case TP_HYDRORADIUS: - trParam.hydroRadius = newLTI(compDepNode, - m_tranPropMap[nodeName], - trParam); - break; - case TP_ELECTCOND: - trParam.electCond = newLTI(compDepNode, - m_tranPropMap[nodeName], - trParam); - break; - default: - throw CanteraError("getLiquidInteractionsTransportData","unknown transport property: " + nodeName); - - } - } - /* Allow a switch between mass-averaged, mole-averaged - * and solvent specified reference velocities. - * XML code within the transportProperty node - * (i.e. within ) should read as follows - * - * - * - */ - if (tranTypeNode.hasChild("velocityBasis")) { - std::string velocityBasis = - tranTypeNode.child("velocityBasis").attrib("basis"); - if (velocityBasis == "mass") { - trParam.velocityBasis_ = VB_MASSAVG; - } else if (velocityBasis == "mole") { - trParam.velocityBasis_ = VB_MOLEAVG; - } else if (trParam.thermo->speciesIndex(velocityBasis) > 0) { - trParam.velocityBasis_ = static_cast(trParam.thermo->speciesIndex(velocityBasis)); - } else { - int linenum = __LINE__; - throw TransportDBError(linenum, "Unknown attribute \"" + velocityBasis + "\" for node. "); - } - } - } + } + } + /* Allow a switch between mass-averaged, mole-averaged + * and solvent specified reference velocities. + * XML code within the transportProperty node + * (i.e. within ) should read as follows + * + * + * + */ + if (tranTypeNode.hasChild("velocityBasis")) { + std::string velocityBasis = + tranTypeNode.child("velocityBasis").attrib("basis"); + if (velocityBasis == "mass") { + trParam.velocityBasis_ = VB_MASSAVG; + } else if (velocityBasis == "mole") { + trParam.velocityBasis_ = VB_MOLEAVG; + } else if (trParam.thermo->speciesIndex(velocityBasis) > 0) { + trParam.velocityBasis_ = static_cast(trParam.thermo->speciesIndex(velocityBasis)); + } else { + int linenum = __LINE__; + throw TransportDBError(linenum, "Unknown attribute \"" + velocityBasis + "\" for node. "); + } + } + } + } } catch (CanteraError& err) { std::cout << err.what() << std::endl; } diff --git a/test_problems/simpleTransport/HMW_NaCl_pdss.xml b/test_problems/simpleTransport/HMW_NaCl_pdss.xml index 6e9c6194f..bc77ac981 100644 --- a/test_problems/simpleTransport/HMW_NaCl_pdss.xml +++ b/test_problems/simpleTransport/HMW_NaCl_pdss.xml @@ -86,7 +86,7 @@ - +