From 81d315e562bbbf090315410767653953b4942d94 Mon Sep 17 00:00:00 2001 From: Harry Moffat Date: Wed, 14 Dec 2011 16:03:27 +0000 Subject: [PATCH] Start of a new Tortuosity treatment -> taking it into Cantera in a formal way. --- Cantera/src/transport/Makefile.in | 6 +- Cantera/src/transport/SimpleTransport.cpp | 48 ++++++- Cantera/src/transport/Tortuosity.h | 70 +++++++---- Cantera/src/transport/TortuosityBase.cpp | 96 ++++++++++++++ Cantera/src/transport/TortuosityBase.h | 108 ++++++++++++++++ Cantera/src/transport/TortuosityBruggeman.cpp | 99 +++++++++++++++ Cantera/src/transport/TortuosityBruggeman.h | 114 +++++++++++++++++ Cantera/src/transport/TortuosityMaxwell.cpp | 99 +++++++++++++++ Cantera/src/transport/TortuosityMaxwell.h | 118 ++++++++++++++++++ .../src/transport/TortuosityPercolation.cpp | 105 ++++++++++++++++ Cantera/src/transport/TortuosityPercolation.h | 108 ++++++++++++++++ 11 files changed, 937 insertions(+), 34 deletions(-) create mode 100644 Cantera/src/transport/TortuosityBase.cpp create mode 100644 Cantera/src/transport/TortuosityBase.h create mode 100644 Cantera/src/transport/TortuosityBruggeman.cpp create mode 100644 Cantera/src/transport/TortuosityBruggeman.h create mode 100644 Cantera/src/transport/TortuosityMaxwell.cpp create mode 100644 Cantera/src/transport/TortuosityMaxwell.h create mode 100644 Cantera/src/transport/TortuosityPercolation.cpp create mode 100644 Cantera/src/transport/TortuosityPercolation.h diff --git a/Cantera/src/transport/Makefile.in b/Cantera/src/transport/Makefile.in index 73e74392f..4ec69c96a 100644 --- a/Cantera/src/transport/Makefile.in +++ b/Cantera/src/transport/Makefile.in @@ -37,12 +37,14 @@ CXX_FLAGS = @CXXFLAGS@ $(CXX_OPT) $(PIC_FLAG) $(DEBUG_FLAG) TRAN_OBJ = TransportFactory.o MultiTransport.o MixTransport.o MMCollisionInt.o \ SolidTransport.o DustyGasTransport.o TransportBase.o WaterTransport.o \ SimpleTransport.o LiquidTransportData.o LiquidTransportParams.o LiquidTranInteraction.o \ - TransportParams.o + TransportParams.o \ + TortuosityBase.o TortuosityBruggeman.o TortuosityPercolation.o TortuosityMaxwell.o TRAN_H = TransportFactory.h MultiTransport.h MixTransport.h \ MMCollisionInt.h SolidTransport.h DustyGasTransport.h \ TransportBase.h L_matrix.h TransportParams.h WaterTransport.h \ - SimpleTransport.h LiquidTranInteraction.h Tortuosity.h + SimpleTransport.h LiquidTranInteraction.h Tortuosity.h \ + TortuosityBase.h TortuosityBruggeman.h TortuosityPercolation.h TortuosityMaxwell.h ifeq ($(do_electro),1) do_issp = 1 diff --git a/Cantera/src/transport/SimpleTransport.cpp b/Cantera/src/transport/SimpleTransport.cpp index cfd84f401..817b6527d 100644 --- a/Cantera/src/transport/SimpleTransport.cpp +++ b/Cantera/src/transport/SimpleTransport.cpp @@ -771,10 +771,12 @@ namespace Cantera { const array_fp& mw = m_thermo->molecularWeights(); const doublereal* y = m_thermo->massFractions(); + doublereal concTotal = m_thermo->molarDensity(); + // Unroll wrt ndim - + if (doMigration_) { double FRT = ElectronCharge / (Boltzmann * m_temp); for (n = 0; n < m_nDim; n++) { @@ -795,11 +797,47 @@ namespace Cantera { } } - // Add correction flux to enforce sum to zero - for (n = 0; n < m_nDim; n++) { - for (k = 0; k < m_nsp; k++) { - fluxes[n*ldf + k] -= y[k] * rhoVc[n]; + if (m_velocityBasis == VB_MASSAVG) { + for (n = 0; n < m_nDim; n++) { + rhoVc[n] = 0.0; + for (k = 0; k < m_nsp; k++) { + rhoVc[n] += fluxes[n*ldf + k]; + } } + for (n = 0; n < m_nDim; n++) { + for (k = 0; k < m_nsp; k++) { + fluxes[n*ldf + k] -= y[k] * rhoVc[n]; + } + } + } else if (m_velocityBasis == VB_MOLEAVG) { + for (n = 0; n < m_nDim; n++) { + rhoVc[n] = 0.0; + for (k = 0; k < m_nsp; k++) { + rhoVc[n] += fluxes[n*ldf + k] / mw[k]; + } + } + for (n = 0; n < m_nDim; n++) { + for (k = 0; k < m_nsp; k++) { + fluxes[n*ldf + k] -= m_molefracs[k] * rhoVc[n] * mw[k]; + } + } + } else if (m_velocityBasis >= 0) { + for (n = 0; n < m_nDim; n++) { + rhoVc[n] = - fluxes[n*ldf + m_velocityBasis] / mw[m_velocityBasis]; + for (k = 0; k < m_nsp; k++) { + rhoVc[n] += fluxes[n*ldf + k] / mw[k]; + } + } + for (n = 0; n < m_nDim; n++) { + for (k = 0; k < m_nsp; k++) { + fluxes[n*ldf + k] -= m_molefracs[k] * rhoVc[n] * mw[k]; + } + fluxes[n*ldf + m_velocityBasis] = 0.0; + } + + } else { + throw CanteraError("SimpleTransport::getSpeciesFluxesExt()", + "unknown velocity basis"); } } //================================================================================================ diff --git a/Cantera/src/transport/Tortuosity.h b/Cantera/src/transport/Tortuosity.h index b8b34b5d5..d3b1d4744 100644 --- a/Cantera/src/transport/Tortuosity.h +++ b/Cantera/src/transport/Tortuosity.h @@ -1,38 +1,54 @@ + /** - * @file Tortuosity.h - * Class to compute the increase in diffusive path length associated with - * tortuous path diffusion through, for example, porous media. + * @file TortuosityBruggeman.h + * Class to compute the increase in diffusive path length in porous media + * assuming the Bruggeman exponent relation */ +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ +#ifndef CT_TORTUOSITYBRUGGEMAN_H +#define CT_TORTUOSITYBRUGGEMAN_H + + namespace Cantera { -/** - * Class to compute the increase in diffusive path length associated with - * tortuous path diffusion through, for example, porous media. - * This base class implementation relates tortuosity to volume fraction - * through a power-law relationship that goes back to Bruggemann. The - * exponent is referred to as the Bruggemann exponent. - * - * Note that the total diffusional flux is generally written as - * - * \f[ - * \frac{ \phi C_T D_i \nabla X_i }{ \tau^2 } - * \f] - * - * where \f$ \phi \f$ is the volume fraction of the transported phase, - * \f$ \tau \f$ is referred to as the tortuosity. (Other variables are - * \f$ C_T \f$, the total concentration, \f$ D_i \f$, the diffusion - * coefficient, and \f$ X_i \f$, the mole fraction with Fickian - * transport assumed.) - * - * The tortuosity comes into play in conjunction the the - - */ - class Tortuosity { + //! Specific Class to handle tortuosity corrections for diffusive transport + //! in porous media using the Bruggeman exponent + /*! + * Class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + * This base class implementation relates tortuosity to volume fraction + * through a power-law relationship that goes back to Bruggemann. The + * exponent is referred to as the Bruggemann exponent. + * + * Note that the total diffusional flux is generally written as + * + * \f[ + * \frac{ \phi C_T D_i \nabla X_i }{ \tau^2 } + * \f] + * + * where \f$ \phi \f$ is the volume fraction of the transported phase, + * \f$ \tau \f$ is referred to as the tortuosity. (Other variables are + * \f$ C_T \f$, the total concentration, \f$ D_i \f$, the diffusion + * coefficient, and \f$ X_i \f$, the mole fraction with Fickian + * transport assumed.) + * + * The tortuosity comes into play in conjunction the the + */ + class TortuosityBruggeman { public: //! Default constructor uses Bruggemann exponent of 1.5 - Tortuosity( double setPower = 1.5 ) : expBrug_(setPower) { + TortuosityBruggeman(double setPower = 1.5 ) : expBrug_(setPower) { } //! The tortuosity factor models the effective increase in the diff --git a/Cantera/src/transport/TortuosityBase.cpp b/Cantera/src/transport/TortuosityBase.cpp new file mode 100644 index 000000000..4fe734dbb --- /dev/null +++ b/Cantera/src/transport/TortuosityBase.cpp @@ -0,0 +1,96 @@ +/** + * @file TortuosityBase.cpp + * Base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ + +#include "TortuosityBase.h" +#include "ctexceptions.h" + +#include + +namespace Cantera { + //==================================================================================================================== + static void err(const std::string r) { + throw Cantera::CanteraError("TortuosityBase", "Error calling base class " + r); + } + //==================================================================================================================== + // Default constructor + TortuosityBase::TortuosityBase() + { + } + //==================================================================================================================== + // Copy Constructor + /* + * @param right Object to be copied + */ + TortuosityBase::TortuosityBase(const TortuosityBase &right) + { + *this = right; + } + //==================================================================================================================== + // Default destructor for TortuosityBase + TortuosityBase::~TortuosityBase() { + + } + //==================================================================================================================== + // Assignment operator + /* + * @param right Object to be copied + */ + TortuosityBase & TortuosityBase::operator=(const TortuosityBase &right) { + if (&right == this) { + return *this; + } + return *this; + } + //==================================================================================================================== + // Duplication operator + /* + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + TortuosityBase * TortuosityBase::duplMyselfAsTortuosityBase() const { + TortuosityBase * tb = new TortuosityBase(*this); + return tb; + } + //==================================================================================================================== + // The tortuosity factor models the effective increase in the diffusive transport length. + /* + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + * + */ + doublereal TortuosityBase::tortuosityFactor(doublereal porosity) { + err("tortuosityFactor"); + return 0.0; + } + //==================================================================================================================== + // The McMillan number is the ratio of the flux-like variable to the value it would have without porous flow. + /* + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + doublereal TortuosityBase::McMillanFactor(doublereal porosity) { + err("McMillanFactor"); + return 0.0; + } + //==================================================================================================================== +} diff --git a/Cantera/src/transport/TortuosityBase.h b/Cantera/src/transport/TortuosityBase.h new file mode 100644 index 000000000..5b4c2dacc --- /dev/null +++ b/Cantera/src/transport/TortuosityBase.h @@ -0,0 +1,108 @@ +/** + * @file TortuosityBase.h + * Virtual base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ +#ifndef CT_TORTUOSITYBASE_H +#define CT_TORTUOSITYBASE_H + +#include "ct_defs.h" + + +namespace Cantera { + + //! Base case to handle tortuosity corrections for diffusive transport + //! in porous media + /*! + * Class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + * This base class implementation relates tortuosity to volume fraction + * through a power-law relationship that goes back to Bruggemann. The + * exponent is referred to as the Bruggemann exponent. + * + * Note that the total diffusional flux is generally written as + * + * \f[ + * \frac{ \phi C_T D_i \nabla X_i }{ \tau^2 } + * \f] + * + * where \f$ \phi \f$ is the volume fraction of the transported phase, + * \f$ \tau \f$ is referred to as the tortuosity. (Other variables are + * \f$ C_T \f$, the total concentration, \f$ D_i \f$, the diffusion + * coefficient, and \f$ X_i \f$, the mole fraction with Fickian + * transport assumed.) + * + * The tortuosity comes into play in conjunction the the + */ + class TortuosityBase { + + public: + //! Default constructor uses Bruggemann exponent of 1.5 + TortuosityBase(); + + //! Copy Constructor + /*! + * @param right Object to be copied + */ + TortuosityBase(const TortuosityBase &right); + + //! Default destructor for TortuosityBase + virtual ~TortuosityBase(); + + //! Assignment operator + /*! + * @param right Object to be copied + */ + TortuosityBase & operator=(const TortuosityBase &right); + + //! Duplication operator + /*! + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + virtual TortuosityBase * duplMyselfAsTortuosityBase() const; + + //! The tortuosity factor models the effective increase in the + //! diffusive transport length. + /*! + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + * + */ + virtual doublereal tortuosityFactor(doublereal porosity); + + //! The McMillan number is the ratio of the flux-like + //! variable to the value it would have without porous flow. + /** + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + virtual doublereal McMillanFactor(doublereal porosity); + + protected: + + }; + + + +} + +#endif + diff --git a/Cantera/src/transport/TortuosityBruggeman.cpp b/Cantera/src/transport/TortuosityBruggeman.cpp new file mode 100644 index 000000000..ca88e38cf --- /dev/null +++ b/Cantera/src/transport/TortuosityBruggeman.cpp @@ -0,0 +1,99 @@ +/** + * @file TortuosityBase.cpp + * Base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ + +#include "TortuosityBruggeman.h" +#include "ctexceptions.h" + +#include + +namespace Cantera { + + //==================================================================================================================== + // Default constructor + TortuosityBruggeman::TortuosityBruggeman(doublereal setPower) : + TortuosityBase(), + expBrug_(setPower) + { + } + //==================================================================================================================== + // Copy Constructor + /* + * @param right Object to be copied + */ + TortuosityBruggeman::TortuosityBruggeman(const TortuosityBruggeman &right) : + TortuosityBase(), + expBrug_(right.expBrug_) + { + *this = right; + } + //==================================================================================================================== + // Default destructor for TortuosityBruggeman + TortuosityBruggeman::~TortuosityBruggeman() { + + } + //==================================================================================================================== + // Assignment operator + /* + * @param right Object to be copied + */ + TortuosityBruggeman & TortuosityBruggeman::operator=(const TortuosityBruggeman &right) { + if (&right == this) { + return *this; + } + TortuosityBase::operator=(right); + + expBrug_ = right.expBrug_; + + return *this; + } + //==================================================================================================================== + // Duplication operator + /* + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + TortuosityBase * TortuosityBruggeman::duplMyselfAsTortuosityBase() const { + TortuosityBruggeman * tb = new TortuosityBruggeman(*this); + return dynamic_cast(tb); + } + //==================================================================================================================== + // The tortuosity factor models the effective increase in the diffusive transport length. + /* + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + * + */ + doublereal TortuosityBruggeman::tortuosityFactor(doublereal porosity) { + return pow(porosity, expBrug_ - 1.0); + } + //==================================================================================================================== + // The McMillan number is the ratio of the flux-like variable to the value it would have without porous flow. + /* + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + doublereal TortuosityBruggeman::McMillanFactor(doublereal porosity) { + return pow(porosity, expBrug_); + } + //==================================================================================================================== +} diff --git a/Cantera/src/transport/TortuosityBruggeman.h b/Cantera/src/transport/TortuosityBruggeman.h new file mode 100644 index 000000000..d20e10665 --- /dev/null +++ b/Cantera/src/transport/TortuosityBruggeman.h @@ -0,0 +1,114 @@ +/** + * @file TortuosityBase.h + * Virtual base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ +#ifndef CT_TORTUOSITYBRUGGEMAN_H +#define CT_TORTUOSITYBRUGGEMAN_H + +#include "TortuosityBase.h" + + +namespace Cantera { + + //! Base case to handle tortuosity corrections for diffusive transport + //! in porous media using the Bruggeman exponential approximation + /*! + * Class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + * This base class implementation relates tortuosity to volume fraction + * through a power-law relationship that goes back to Bruggemann. The + * exponent is referred to as the Bruggemann exponent. + * + * Note that the total diffusional flux is generally written as + * + * \f[ + * \frac{ \phi C_T D_i \nabla X_i }{ \tau^2 } + * \f] + * + * where \f$ \phi \f$ is the volume fraction of the transported phase, + * \f$ \tau \f$ is referred to as the tortuosity. (Other variables are + * \f$ C_T \f$, the total concentration, \f$ D_i \f$, the diffusion + * coefficient, and \f$ X_i \f$, the mole fraction with Fickian + * transport assumed.) + * + * The tortuosity comes into play in conjunction the the + */ + class TortuosityBruggeman : public TortuosityBase { + + public: + //! Default constructor uses Bruggemann exponent of 1.5 + /*! + * @param setPower Exponent in the Bruggeman factor. The default is 1.5 + */ + TortuosityBruggeman(doublereal setPower = 1.5); + + //! Copy Constructor + /*! + * @param right Object to be copied + */ + TortuosityBruggeman(const TortuosityBruggeman &right); + + //! Default destructor for TortuosityBruggeman + virtual ~TortuosityBruggeman(); + + //! Assignment operator + /*! + * @param right Object to be copied + */ + TortuosityBruggeman & operator=(const TortuosityBruggeman &right); + + //! Duplication operator + /*! + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + virtual TortuosityBase * duplMyselfAsTortuosityBase() const; + + //! The tortuosity factor models the effective increase in the + //! diffusive transport length. + /*! + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + * + */ + virtual doublereal tortuosityFactor(doublereal porosity); + + //! The McMillan number is the ratio of the flux-like + //! variable to the value it would have without porous flow. + /** + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + virtual doublereal McMillanFactor(doublereal porosity); + + + protected: + //! Bruggemann exponent: power to which the tortuosity depends on the volume fraction + doublereal expBrug_; + + }; + + + +} + +#endif + diff --git a/Cantera/src/transport/TortuosityMaxwell.cpp b/Cantera/src/transport/TortuosityMaxwell.cpp new file mode 100644 index 000000000..782567202 --- /dev/null +++ b/Cantera/src/transport/TortuosityMaxwell.cpp @@ -0,0 +1,99 @@ +/** + * @file TortuosityBase.cpp + * Base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ + +#include "TortuosityMaxwell.h" +#include "ctexceptions.h" + +#include + +namespace Cantera { + + //==================================================================================================================== + // Default constructor + TortuosityMaxwell::TortuosityMaxwell(doublereal relativeConductivities) : + TortuosityBase(), + relativeConductivities_(relativeConductivities) + { + } + //==================================================================================================================== + // Copy Constructor + /* + * @param right Object to be copied + */ + TortuosityMaxwell::TortuosityMaxwell(const TortuosityMaxwell &right) : + TortuosityBase(), + relativeConductivities_(right.relativeConductivities_) + { + *this = right; + } + //==================================================================================================================== + // Default destructor for TortuosityMaxwell + TortuosityMaxwell::~TortuosityMaxwell() { + + } + //==================================================================================================================== + // Assignment operator + /* + * @param right Object to be copied + */ + TortuosityMaxwell & TortuosityMaxwell::operator=(const TortuosityMaxwell &right) { + if (&right == this) { + return *this; + } + TortuosityBase::operator=(right); + + relativeConductivities_ = right.relativeConductivities_; + + return *this; + } + //==================================================================================================================== + // Duplication operator + /* + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + TortuosityBase * TortuosityMaxwell::duplMyselfAsTortuosityBase() const { + TortuosityMaxwell * tb = new TortuosityMaxwell(*this); + return dynamic_cast(tb); + } + //==================================================================================================================== + // The tortuosity factor models the effective increase in the diffusive transport length. + /* + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + */ + doublereal TortuosityMaxwell::tortuosityFactor(doublereal porosity) { + return McMillanFactor(porosity) / porosity; + } + //==================================================================================================================== + // The McMillan number is the ratio of the flux-like variable to the value it would have without porous flow. + /* + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + doublereal TortuosityMaxwell::McMillanFactor(doublereal porosity) { + doublereal tmp = 1 + 3 * ( 1.0 - porosity ) * ( relativeConductivities_ - 1.0 ) / ( relativeConductivities_ + 2 ); + return tmp; + } + //==================================================================================================================== +} diff --git a/Cantera/src/transport/TortuosityMaxwell.h b/Cantera/src/transport/TortuosityMaxwell.h new file mode 100644 index 000000000..861145fad --- /dev/null +++ b/Cantera/src/transport/TortuosityMaxwell.h @@ -0,0 +1,118 @@ +/** + * @file TortuosityBase.h + * Virtual base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ +#ifndef CT_TORTUOSITYBRUGGEMAN_H +#define CT_TORTUOSITYBRUGGEMAN_H + +#include "TortuosityBase.h" + + +namespace Cantera { + + //! Maxwell model for tortuosity + /*! + * + * This class implements transport coefficient corrections + * appropriate for porous media with a dispersed phase. + * This model goes back to Maxwell. The formula for the + * conductivity is expressed in terms of the volume fraction + * of the continuous phase, \f$ \phi \f$, and the relative + * conductivities of the dispersed and continuous phases, + * \f$ r = \kappa_d / \kappa_0 \f$. For dilute particle + * suspensions the effective conductivity is + * + * \f[ + * \kappa / \kappa_0 = 1 + 3 ( 1 - \phi ) ( r - 1 ) / ( r + 2 ) + * + O(\phi^2) + * \f] + * + * The class is derived from the TortuosityBase class. + * + */ + class TortuosityMaxwell : public TortuosityBase { + + public: + //! Default constructor uses Maxwelln exponent of 1.5 + /*! + * @param setPower Exponent in the Maxwell factor. The default is 1.5 + */ + TortuosityMaxwell(double relativeConductivites = 0.0); + + //! Copy Constructor + /*! + * @param right Object to be copied + */ + TortuosityMaxwell(const TortuosityMaxwell &right); + + //! Default destructor for TortuosityMaxwell + virtual ~TortuosityMaxwell(); + + //! Assignment operator + /*! + * @param right Object to be copied + */ + TortuosityMaxwell & operator=(const TortuosityMaxwell &right); + + //! Duplication operator + /*! + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + virtual TortuosityBase * duplMyselfAsTortuosityBase() const; + + //! The tortuosity factor models the effective increase in the + //! diffusive transport length. + /*! + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + * + */ + virtual doublereal tortuosityFactor(doublereal porosity); + + //! The McMillan number is the ratio of the flux-like + //! variable to the value it would have without porous flow. + /** + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + virtual doublereal McMillanFactor(doublereal porosity); + + + protected: + + //! Relative conductivities of the dispersed and continuous phases, + /*! + * + * \f[ + * \code{relativeConductivites_} = \kappa_d / \kappa_0 + * \f] + */ + doublereal relativeConductivities_; + + }; + + + +} + +#endif + diff --git a/Cantera/src/transport/TortuosityPercolation.cpp b/Cantera/src/transport/TortuosityPercolation.cpp new file mode 100644 index 000000000..49f0f4724 --- /dev/null +++ b/Cantera/src/transport/TortuosityPercolation.cpp @@ -0,0 +1,105 @@ +/** + * @file TortuosityPercolation.cpp + * Base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ + +#include "TortuosityPercolation.h" +#include "ctexceptions.h" + +#include + +namespace Cantera { + + //==================================================================================================================== + // Default constructor + TortuosityPercolation::TortuosityPercolation(double percolationThreshold, double conductivityExponent) : + TortuosityBase(), + percolationThreshold_(percolationThreshold), + conductivityExponent_(conductivityExponent) + { + + } + //==================================================================================================================== + // Copy Constructor + /* + * @param right Object to be copied + */ + TortuosityPercolation::TortuosityPercolation(const TortuosityPercolation &right) : + TortuosityBase(), + percolationThreshold_(right.percolationThreshold_), + conductivityExponent_(right.conductivityExponent_) + { + *this = right; + } + //==================================================================================================================== + // Default destructor for TortuosityPercolation + TortuosityPercolation::~TortuosityPercolation() { + + } + //==================================================================================================================== + // Assignment operator + /* + * @param right Object to be copied + */ + TortuosityPercolation & TortuosityPercolation::operator=(const TortuosityPercolation &right) { + if (&right == this) { + return *this; + } + TortuosityBase::operator=(right); + + percolationThreshold_ = right.percolationThreshold_; + conductivityExponent_ = right.conductivityExponent_; + + return *this; + } + //==================================================================================================================== + // Duplication operator + /* + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + TortuosityBase * TortuosityPercolation::duplMyselfAsTortuosityBase() const { + TortuosityPercolation * tb = new TortuosityPercolation(*this); + return dynamic_cast(tb); + } + //==================================================================================================================== + // The tortuosity factor models the effective increase in the diffusive transport length. + /* + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + */ + doublereal TortuosityPercolation::tortuosityFactor(doublereal porosity) { + return McMillanFactor(porosity) / porosity; + } + //==================================================================================================================== + // The McMillan number is the ratio of the flux-like variable to the value it would have without porous flow. + /* + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + doublereal TortuosityPercolation::McMillanFactor(doublereal porosity) { + doublereal tmp = pow(((porosity - percolationThreshold_) + / ( 1.0 - percolationThreshold_ )) , + conductivityExponent_); + return tmp; + } + //==================================================================================================================== +} diff --git a/Cantera/src/transport/TortuosityPercolation.h b/Cantera/src/transport/TortuosityPercolation.h new file mode 100644 index 000000000..fd11f9ec2 --- /dev/null +++ b/Cantera/src/transport/TortuosityPercolation.h @@ -0,0 +1,108 @@ +/** + * @file TortuosityBase.h + * Virtual base class to compute the increase in diffusive path length associated with + * tortuous path diffusion through, for example, porous media. + */ + +/* + * Copywrite (2005) Sandia Corporation. Under the terms of + * Contract DE-AC04-94AL85000 with Sandia Corporation, the + * U.S. Government retains certain rights in this software. + */ + +/* + * $Revision: 572 $ + * $Date: 2010-08-13 20:21:57 -0600 (Fri, 13 Aug 2010) $ + */ +#ifndef CT_TORTUOSITYPERCOLATION_H +#define CT_TORTUOSITYPERCOLATION_H + +#include "TortuosityBase.h" + + +namespace Cantera { + + //! This class implements transport coefficient corrections + //! appropriate for porous media where percollation theory applies. + /*! + * + * + */ + class TortuosityPercolation : public TortuosityBase { + + public: + //! Default constructor uses Percolationn exponent of 1.5 + /*! + * @param setPower Exponent in the Percolation factor. The default is 1.5 + */ + TortuosityPercolation(double percolationThreshold = 0.4, double conductivityExponent = 2.0); + + //! Copy Constructor + /*! + * @param right Object to be copied + */ + TortuosityPercolation(const TortuosityPercolation &right); + + //! Default destructor for TortuosityPercolation + virtual ~TortuosityPercolation(); + + //! Assignment operator + /*! + * @param right Object to be copied + */ + TortuosityPercolation & operator=(const TortuosityPercolation &right); + + //! Duplication operator + /*! + * @return Returns a pointer to a duplicate of the current object given a + * base class pointer + */ + virtual TortuosityBase * duplMyselfAsTortuosityBase() const; + + //! The tortuosity factor models the effective increase in the + //! diffusive transport length. + /*! + * This method returns \f$ 1/\tau^2 \f$ in the description of the flux + * + * \f$ C_T D_i \nabla X_i / \tau^2 \f$. + * + * + */ + virtual doublereal tortuosityFactor(doublereal porosity); + + //! The McMillan number is the ratio of the flux-like + //! variable to the value it would have without porous flow. + /*! + * The McMillan number combines the effect of toruosity + * and volume fraction of the transported phase. The net flux + * observed is then the product of the McMillan number and the + * non-porous transport rate. For a conductivity in a non-porous + * media, \f$ \kappa_0 \f$, the conductivity in the porous media + * would be \f$ \kappa = (\rm McMillan) \kappa_0 \f$. + */ + virtual doublereal McMillanFactor(doublereal porosity); + + + protected: + + //! Critical volume fraction / site density for percolation + double percolationThreshold_; + + //! Conductivity exponent + /*! + * The McMillan number (ratio of effective conductivity to non-porous conductivity) is + * \f[ \kappa/\kappa_0 = ( \phi - \phi_c )^\mu \f] + * where \f$ \mu \f$ is the conductivity exponent (typical values range from 1.6 to 2.0) and \f$ \phi_c \f$ + * is the percolation threshold. + */ + double conductivityExponent_; + + + }; + + + +} + +#endif +