Cantera 2.6.0
DustyGasTransport.cpp
Go to the documentation of this file.
1/**
2 * @file DustyGasTransport.cpp
3 * Implementation file for class DustyGasTransport
4 */
5
6// This file is part of Cantera. See License.txt in the top-level directory or
7// at https://cantera.org/license.txt for license and copyright information.
8
13
14using namespace std;
15
16namespace Cantera
17{
19 Transport(thermo),
20 m_temp(-1.0),
21 m_gradP(0.0),
22 m_knudsen_ok(false),
23 m_bulk_ok(false),
24 m_porosity(0.0),
25 m_tortuosity(1.0),
26 m_pore_radius(0.0),
27 m_diam(0.0),
28 m_perm(-1.0)
29{
30}
31
33{
35 m_gastran->setThermo(thermo);
36}
37
39{
40 // constant mixture attributes
41 m_thermo = phase;
43 if (m_gastran.get() != gastr) {
44 m_gastran.reset(gastr);
45 }
46
47 // make a local copy of the molecular weights
49
52 m_dk.resize(m_nsp, 0.0);
53
54 m_x.resize(m_nsp, 0.0);
56
57 // set flags all false
58 m_knudsen_ok = false;
59 m_bulk_ok = false;
60
61 m_spwork.resize(m_nsp);
62 m_spwork2.resize(m_nsp);
63}
64
66{
67 if (m_bulk_ok) {
68 return;
69 }
70
71 // get the gaseous binary diffusion coefficients
72 m_gastran->getBinaryDiffCoeffs(m_nsp, m_d.ptrColumn(0));
73 doublereal por2tort = m_porosity / m_tortuosity;
74 for (size_t n = 0; n < m_nsp; n++) {
75 for (size_t m = 0; m < m_nsp; m++) {
76 m_d(n,m) *= por2tort;
77 }
78 }
79 m_bulk_ok = true;
80}
81
83{
84 if (m_knudsen_ok) {
85 return;
86 }
87 doublereal K_g = m_pore_radius * m_porosity / m_tortuosity;
88 for (size_t k = 0; k < m_nsp; k++) {
89 m_dk[k] = 2.0/3.0 * K_g * sqrt((8.0 * GasConstant * m_temp)/
90 (Pi * m_mw[k]));
91 }
92 m_knudsen_ok = true;
93}
94
96{
99 for (size_t k = 0; k < m_nsp; k++) {
100 // evaluate off-diagonal terms
101 for (size_t j = 0; j < m_nsp; j++) {
102 m_multidiff(k,j) = -m_x[k]/m_d(k,j);
103 }
104
105 // evaluate diagonal term
106 double sum = 0.0;
107 for (size_t j = 0; j < m_nsp; j++) {
108 if (j != k) {
109 sum += m_x[j]/m_d(k,j);
110 }
111 }
112 m_multidiff(k,k) = 1.0/m_dk[k] + sum;
113 }
114}
115
116void DustyGasTransport::getMolarFluxes(const doublereal* const state1,
117 const doublereal* const state2,
118 const doublereal delta,
119 doublereal* const fluxes)
120{
121 // cbar will be the average concentration between the two points
122 doublereal* const cbar = m_spwork.data();
123 doublereal* const gradc = m_spwork2.data();
124 const doublereal t1 = state1[0];
125 const doublereal t2 = state2[0];
126 const doublereal rho1 = state1[1];
127 const doublereal rho2 = state2[1];
128 const doublereal* const y1 = state1 + 2;
129 const doublereal* const y2 = state2 + 2;
130 doublereal c1sum = 0.0, c2sum = 0.0;
131
132 for (size_t k = 0; k < m_nsp; k++) {
133 double conc1 = rho1 * y1[k] / m_mw[k];
134 double conc2 = rho2 * y2[k] / m_mw[k];
135 cbar[k] = 0.5*(conc1 + conc2);
136 gradc[k] = (conc2 - conc1) / delta;
137 c1sum += conc1;
138 c2sum += conc2;
139 }
140
141 // Calculate the pressures at p1 p2 and pbar
142 doublereal p1 = c1sum * GasConstant * t1;
143 doublereal p2 = c2sum * GasConstant * t2;
144 doublereal pbar = 0.5*(p1 + p2);
145 doublereal gradp = (p2 - p1)/delta;
146 doublereal tbar = 0.5*(t1 + t2);
147 m_thermo->setState_TPX(tbar, pbar, cbar);
149
150 // Multiply m_multidiff and gradc together and store the result in fluxes[]
151 multiply(m_multidiff, gradc, fluxes);
152 for (size_t k = 0; k < m_nsp; k++) {
153 cbar[k] /= m_dk[k];
154 }
155
156 // if no permeability has been specified, use result for
157 // close-packed spheres
158 double b = 0.0;
159 if (m_perm < 0.0) {
160 double p = m_porosity;
161 double d = m_diam;
162 double t = m_tortuosity;
163 b = p*p*p*d*d/(72.0*t*(1.0-p)*(1.0-p));
164 } else {
165 b = m_perm;
166 }
167 b *= gradp / m_gastran->viscosity();
168 scale(cbar, cbar + m_nsp, cbar, b);
169
170 // Multiply m_multidiff with cbar and add it to fluxes
171 increment(m_multidiff, cbar, fluxes);
172 scale(fluxes, fluxes + m_nsp, fluxes, -1.0);
173}
174
176{
177 // see if temperature has changed
179
180 // update the mole fractions
183
184 // invert H
185 int ierr = invert(m_multidiff);
186 if (ierr != 0) {
187 throw CanteraError("DustyGasTransport::updateMultiDiffCoeffs",
188 "invert returned ierr = {}", ierr);
189 }
190}
191
192void DustyGasTransport::getMultiDiffCoeffs(const size_t ld, doublereal* const d)
193{
195 for (size_t i = 0; i < m_nsp; i++) {
196 for (size_t j = 0; j < m_nsp; j++) {
197 d[ld*j + i] = m_multidiff(i,j);
198 }
199 }
200}
201
203{
204 if (m_temp == m_thermo->temperature()) {
205 return;
206 }
208 m_knudsen_ok = false;
209 m_bulk_ok = false;
210}
211
213{
215
216 // add an offset to avoid a pure species condition
217 // (check - this may be unnecessary)
218 for (size_t k = 0; k < m_nsp; k++) {
219 m_x[k] = std::max(Tiny, m_x[k]);
220 }
221 // diffusion coeffs depend on Pressure
222 m_bulk_ok = false;
223}
224
225void DustyGasTransport::setPorosity(doublereal porosity)
226{
227 m_porosity = porosity;
228 m_knudsen_ok = false;
229 m_bulk_ok = false;
230}
231
233{
234 m_tortuosity = tort;
235 m_knudsen_ok = false;
236 m_bulk_ok = false;
237}
238
240{
241 m_pore_radius = rbar;
242 m_knudsen_ok = false;
243}
244
246{
247 m_diam = dbar;
248}
249
251{
252 m_perm = B;
253}
254
256{
257 return *m_gastran;
258}
259
260}
Headers for the DustyGasTransport object, which models transport properties in porous media using the...
Header file for class ThermoPhase, the base class for phases with thermodynamic properties,...
doublereal * ptrColumn(size_t j)
Return a pointer to the top of column j, columns are contiguous in memory.
Definition: Array.h:233
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:61
void resize(size_t n, size_t m, doublereal v=0.0)
Resize the matrix.
Definition: DenseMatrix.cpp:70
void setMeanPoreRadius(doublereal rbar)
Set the mean pore radius (m)
virtual void setThermo(ThermoPhase &thermo)
Specifies the ThermoPhase object.
vector_fp m_mw
Local copy of the species molecular weights.
DenseMatrix m_multidiff
Multicomponent diffusion coefficients.
bool m_bulk_ok
Update-to-date variable for Binary diffusion coefficients.
vector_fp m_x
mole fractions
vector_fp m_spwork2
work space of size m_nsp;
std::unique_ptr< Transport > m_gastran
Pointer to the transport object for the gas phase.
virtual void getMultiDiffCoeffs(const size_t ld, doublereal *const d)
Return the Multicomponent diffusion coefficients. Units: [m^2/s].
DustyGasTransport(ThermoPhase *thermo=0)
default constructor
doublereal m_perm
Permeability of the media.
virtual void getMolarFluxes(const doublereal *const state1, const doublereal *const state2, const doublereal delta, doublereal *const fluxes)
Get the molar fluxes [kmol/m^2/s], given the thermodynamic state at two nearby points.
doublereal m_temp
temperature
void setPermeability(doublereal B)
Set the permeability of the media.
void updateTransport_T()
Update temperature-dependent quantities within the object.
bool m_knudsen_ok
Update-to-date variable for Knudsen diffusion coefficients.
void initialize(ThermoPhase *phase, Transport *gastr)
Initialization routine called by TransportFactory.
void updateBinaryDiffCoeffs()
Private routine to update the dusty gas binary diffusion coefficients.
void setTortuosity(doublereal tort)
Set the tortuosity (dimensionless)
void eval_H_matrix()
Calculate the H matrix.
void updateTransport_C()
Update concentration-dependent quantities within the object.
void updateMultiDiffCoeffs()
Update the Multicomponent diffusion coefficients that are used in the approximation.
doublereal m_tortuosity
Tortuosity.
void updateKnudsenDiffCoeffs()
Update the Knudsen diffusion coefficients.
doublereal m_porosity
Porosity.
Transport & gasTransport()
Return a reference to the transport manager used to compute the gas binary diffusion coefficients and...
doublereal m_diam
Particle diameter.
doublereal m_pore_radius
Pore radius (meter)
void setPorosity(doublereal porosity)
Set the porosity (dimensionless)
vector_fp m_dk
Knudsen diffusion coefficients.
vector_fp m_spwork
work space of size m_nsp;
DenseMatrix m_d
binary diffusion coefficients
void setMeanParticleDiameter(doublereal dbar)
Set the mean particle diameter.
size_t nSpecies() const
Returns the number of species in the phase.
Definition: Phase.h:273
const vector_fp & molecularWeights() const
Return a const reference to the internal vector of molecular weights.
Definition: Phase.cpp:509
void getMoleFractions(double *const x) const
Get the species mole fraction vector.
Definition: Phase.cpp:543
doublereal temperature() const
Temperature (K).
Definition: Phase.h:654
Base class for a phase with thermodynamic properties.
Definition: ThermoPhase.h:102
virtual void setState_TPX(doublereal t, doublereal p, const doublereal *x)
Set the temperature (K), pressure (Pa), and mole fractions.
Base class for transport property managers.
virtual void setThermo(ThermoPhase &thermo)
Specifies the ThermoPhase object.
ThermoPhase * m_thermo
pointer to the object representing the phase
size_t m_nsp
Number of species.
ThermoPhase & thermo()
const double Pi
Pi.
Definition: ct_defs.h:52
Namespace for the Cantera kernel.
Definition: AnyMap.h:29
void increment(const DenseMatrix &A, const double *const b, double *const prod)
Multiply A*b and add it to the result in prod. Uses BLAS routine DGEMV.
const double Tiny
Small number to compare differences of mole fractions against.
Definition: ct_defs.h:170
void multiply(const DenseMatrix &A, const double *const b, double *const prod)
Multiply A*b and return the result in prod. Uses BLAS routine DGEMV.
int invert(DenseMatrix &A, size_t nn=npos)
invert A. A is overwritten with A^-1.
void scale(InputIter begin, InputIter end, OutputIter out, S scale_factor)
Multiply elements of an array by a scale factor.
Definition: utilities.h:100
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition: ct_defs.h:113
Contains declarations for string manipulation functions within Cantera.
Various templated functions that carry out common vector operations (see Templated Utility Functions)...