Cantera  4.0.0a1
Loading...
Searching...
No Matches
Transport.h
Go to the documentation of this file.
1/**
2 * @file Transport.h Headers for the Transport object, which is the virtual
3 * base class for all transport property evaluators and also includes the
4 * tranprops group definition (see @ref tranprops and @link
5 * Cantera::Transport Transport @endlink) .
6 */
7
8// This file is part of Cantera. See License.txt in the top-level directory or
9// at https://cantera.org/license.txt for license and copyright information.
10
11/**
12 * @defgroup tranprops Transport Properties
13 *
14 * These classes provide transport properties, including diffusion coefficients,
15 * thermal conductivity, and viscosity.
16 */
17
18#ifndef CT_TRANSPORT_H
19#define CT_TRANSPORT_H
20
23#include "cantera/base/AnyMap.h"
24
25namespace Cantera
26{
27
28class ThermoPhase;
29
30/**
31 * @addtogroup tranprops
32 */
33//! @cond
34
35const int CK_Mode = 10;
36
37//! @endcond
38
39//! Base class for transport property managers.
40/*!
41 * All classes that compute transport properties for a single phase derive from
42 * this class. Class Transport is meant to be used as a base class only. It is
43 * possible to instantiate it, but its methods throw exceptions if called.
44 *
45 * ## Relationship of the Transport class to the ThermoPhase Class
46 *
47 * This section describes how calculations are carried out within the Transport
48 * class. The Transport class and derived classes of the the Transport class
49 * necessarily use the ThermoPhase class to obtain the list of species and the
50 * thermodynamic state of the phase.
51 *
52 * No state information is stored within Transport classes. Queries to the
53 * underlying ThermoPhase object must be made to obtain the state of the system.
54 *
55 * An exception to this however is the state information concerning the the
56 * gradients of variables. This information is not stored within the ThermoPhase
57 * objects. It may be collected within the Transport objects. In fact, the
58 * meaning of const operations within the Transport class refers to calculations
59 * which do not change the state of the system nor the state of the first order
60 * gradients of the system.
61 *
62 * When a const operation is evoked within the Transport class, it is also
63 * implicitly assumed that the underlying state within the ThermoPhase object
64 * has not changed its values.
65 *
66 * @todo Provide a general mechanism to store the gradients of state variables
67 * within the system.
68 *
69 * @ingroup tranprops
70 */
72{
73public:
74 //! Constructor.
75 /*!
76 * New transport managers should be created using TransportFactory, not by
77 * calling the constructor directly.
78 *
79 * @see TransportFactory
80 */
81 Transport() = default;
82
83 virtual ~Transport() {}
84
85 // Transport objects are not copyable or assignable
86 Transport(const Transport&) = delete;
87 Transport& operator=(const Transport&) = delete;
88
89 //! Create a new Transport object using the same transport model and species
90 //! transport properties as this one.
91 //! @param thermo ThermoPhase used to specify the state for the newly cloned
92 //! Transport object. Can be created from the phase used by the current
93 //! Transport object using the ThermoPhase::clone() method.
94 //! @since New in %Cantera 3.2.
95 shared_ptr<Transport> clone(shared_ptr<ThermoPhase> thermo) const;
96
97 //! Identifies the model represented by this Transport object. Each derived class
98 //! should override this method to return a meaningful identifier.
99 //! @since New in %Cantera 3.0. The name returned by this method corresponds
100 //! to the canonical name used in the YAML input format.
101 virtual string transportModel() const {
102 return "none";
103 }
104
105 /**
106 * Phase object. Every transport manager is designed to compute properties
107 * for a specific phase of a mixture, which might be a liquid solution, a
108 * gas mixture, a surface, etc. This method returns a reference to the
109 * object representing the phase itself.
110 */
112 return *m_thermo;
113 }
114
115 //! Check that the specified species index is in range.
116 /*!
117 * @since Starting in %Cantera 3.2, returns the input species index, if valid.
118 * @exception Throws an IndexError if k is greater than #m_nsp.
119 */
120 size_t checkSpeciesIndex(size_t k) const;
121
122 //! @name Transport Properties
123 //! @{
124
125 //! Get the dynamic viscosity [Pa·s]
126 virtual double viscosity() {
127 throw NotImplementedError("Transport::viscosity",
128 "Not implemented for transport model '{}'.", transportModel());
129 }
130
131 //! Get the pure species viscosities [Pa·s].
132 /*!
133 * @param visc Vector of viscosities; length is the number of species
134 */
135 virtual void getSpeciesViscosities(span<double> visc) {
136 throw NotImplementedError("Transport::getSpeciesViscosities",
137 "Not implemented for transport model '{}'.", transportModel());
138 }
139
140 //! The bulk viscosity [Pa·s].
141 /*!
142 * The bulk viscosity is only non-zero in rare cases. Most transport
143 * managers either overload this method to return zero, or do not implement
144 * it, in which case an exception is thrown if called.
145 */
146 virtual double bulkViscosity() {
147 throw NotImplementedError("Transport::bulkViscosity",
148 "Not implemented for transport model '{}'.", transportModel());
149 }
150
151 //! Get the mixture thermal conductivity [W/m/K].
152 virtual double thermalConductivity() {
153 throw NotImplementedError("Transport::thermalConductivity",
154 "Not implemented for transport model '{}'.", transportModel());
155 }
156
157 //! Get the electrical conductivity [siemens/m].
158 virtual double electricalConductivity() {
159 throw NotImplementedError("Transport::electricalConductivity",
160 "Not implemented for transport model '{}'.", transportModel());
161 }
162
163 //! Get the electrical mobilities [m²/V/s].
164 /*!
165 * This function returns the mobilities. In some formulations this is equal
166 * to the normal mobility multiplied by Faraday's constant.
167 *
168 * Frequently, but not always, the mobility is calculated from the diffusion
169 * coefficient using the Einstein relation
170 *
171 * @f[
172 * \mu^e_k = \frac{F D_k}{R T}
173 * @f]
174 *
175 * @param mobil_e Returns the mobilities of the species in array @c
176 * mobil_e. The array must be dimensioned at least as large as
177 * the number of species.
178 */
179 virtual void getMobilities(span<double> mobil_e) {
180 throw NotImplementedError("Transport::getMobilities",
181 "Not implemented for transport model '{}'.", transportModel());
182 }
183
184 //! @}
185
186 //! Get the species diffusive mass fluxes [kg/m²/s] with respect to the specified
187 //! solution averaged velocity, given the mole fraction and temperature gradients.
188 /*!
189 * Usually the specified solution average velocity is the mass averaged velocity.
190 * This is changed in some subclasses, however.
191 *
192 * @param ndim Number of dimensions in the flux expressions
193 * @param[in] grad_T Gradient of the temperature (length `ndim`)
194 * @param ldx Leading dimension of the `grad_X` array (usually equal to the number
195 * of species)
196 * @param[in] grad_X Gradients of the mole fractions; flattened matrix such that
197 * @f$ dX_k/dx_n = \tt{ grad\_X[n*ldx+k]} @f$ is the gradient of species *k*
198 * in dimension *n*. Length is `ldx` * `ndim`.
199 * @param ldf Leading dimension of the `fluxes` array (usually equal to the number
200 * of species)
201 * @param[out] fluxes The diffusive mass fluxes; flattened matrix such that
202 * @f$ j_{kn} = \tt{ fluxes[n*ldf+k]} @f$ is the flux of species *k*
203 * in dimension *n*. Length is `ldf` * `ndim`.
204 */
205 virtual void getSpeciesFluxes(size_t ndim, span<const double> grad_T,
206 size_t ldx, span<const double> grad_X,
207 size_t ldf, span<double> fluxes) {
208 throw NotImplementedError("Transport::getSpeciesFluxes",
209 "Not implemented for transport model '{}'.", transportModel());
210 }
211
212 //! Get the molar fluxes [kmol/m²/s], given the thermodynamic state at two
213 //! nearby points.
214 /*!
215 * @param[in] state1 Array of temperature, density, and mass fractions for
216 * state 1.
217 * @param[in] state2 Array of temperature, density, and mass fractions for
218 * state 2.
219 * @param[in] delta Distance [m] from state 1 to state 2.
220 * @param[out] cfluxes Array containing the diffusive molar fluxes of species from
221 * `state1` to `state2`; Length is number of species.
222 */
223 virtual void getMolarFluxes(span<const double> state1, span<const double> state2,
224 const double delta, span<double> cfluxes) {
225 throw NotImplementedError("Transport::getMolarFluxes",
226 "Not implemented for transport model '{}'.", transportModel());
227 }
228
229 //! Get the mass fluxes [kg/m²/s], given the thermodynamic state at two
230 //! nearby points.
231 /*!
232 * @param[in] state1 Array of temperature, density, and mass
233 * fractions for state 1.
234 * @param[in] state2 Array of temperature, density, and mass fractions for
235 * state 2.
236 * @param[in] delta Distance [m] from state 1 to state 2.
237 * @param[out] mfluxes Array containing the diffusive mass fluxes of species from
238 * `state1` to `state2`; length is number of species.
239 */
240 virtual void getMassFluxes(span<const double> state1, span<const double> state2,
241 double delta, span<double> mfluxes) {
242 throw NotImplementedError("Transport::getMassFluxes",
243 "Not implemented for transport model '{}'.", transportModel());
244 }
245
246 //! Return a vector of thermal diffusion coefficients [kg/m/s].
247 /*!
248 * The thermal diffusion coefficient @f$ D^T_k @f$ is defined so that the
249 * diffusive mass flux of species *k* induced by the local temperature
250 * gradient is given by:
251 *
252 * @f[
253 * \mathbf{j}_k = -D^T_k \frac{\nabla T}{T}.
254 * @f]
255 *
256 * The thermal diffusion coefficient can be either positive or negative.
257 *
258 * @param dt On return, dt will contain the species thermal diffusion coefficients.
259 * Dimension dt at least as large as the number of species.
260 */
261 virtual void getThermalDiffCoeffs(span<double> dt) {
262 throw NotImplementedError("Transport::getThermalDiffCoeffs",
263 "Not implemented for transport model '{}'.", transportModel());
264 }
265
266 //! Returns the matrix of binary diffusion coefficients [m²/s].
267 /*!
268 * @param[in] ld Leading dimension of the flattened array `d` used to store the
269 * diffusion coefficient matrix; usually equal to the number of
270 * species.
271 * @param[out] d Diffusion coefficient matrix stored in column-major (Fortran)
272 * order, such that @f$ \mathcal{D}_{ij} = \tt{d[ld*j + i]} @f$; must
273 * be at least `ld` times the number of species in length.
274 * @see GasTransport::fitDiffCoeffs()
275 */
276 virtual void getBinaryDiffCoeffs(const size_t ld, span<double> d) {
277 throw NotImplementedError("Transport::getBinaryDiffCoeffs",
278 "Not implemented for transport model '{}'.", transportModel());
279 }
280
281 //! Return the multicomponent diffusion coefficients [m²/s].
282 /*!
283 * If the transport manager implements a multicomponent diffusion
284 * model, then this method returns the array of multicomponent
285 * diffusion coefficients. Otherwise it throws an exception.
286 *
287 * @param[in] ld Leading dimension of the flattened array `d` used to store the
288 * diffusion coefficient matrix; usually equal to the number of
289 * species.
290 * @param[out] d Diffusion coefficient matrix stored in column-major (Fortran)
291 * order, such that @f$ D_{ij} = \tt{d[ld*j + i]} @f$ is the
292 * diffusion coefficient for species *i* due to concentration
293 * gradients in species *j*; must be at least `ld` times the number
294 * of species in length.
295 */
296 virtual void getMultiDiffCoeffs(const size_t ld, span<double> d) {
297 throw NotImplementedError("Transport::getMultiDiffCoeffs",
298 "Not implemented for transport model '{}'.", transportModel());
299 }
300
301 //! Return a vector of mixture averaged diffusion coefficients [m²/s].
302 /**
303 * Mixture-averaged diffusion coefficients [m^2/s]. If the transport
304 * manager implements a mixture-averaged diffusion model, then this method
305 * returns the array of mixture-averaged diffusion coefficients. Otherwise
306 * it throws an exception.
307 *
308 * @param d Return vector of mixture averaged diffusion coefficients; length is
309 * the number of species.
310 */
311 virtual void getMixDiffCoeffs(span<double> d) {
312 throw NotImplementedError("Transport::getMixDiffCoeffs",
313 "Not implemented for transport model '{}'.", transportModel());
314 }
315
316 //! Returns a vector of mixture averaged diffusion coefficients [m²/s].
317 virtual void getMixDiffCoeffsMole(span<double> d) {
318 throw NotImplementedError("Transport::getMixDiffCoeffsMole",
319 "Not implemented for transport model '{}'.", transportModel());
320 }
321
322 //! Returns a vector of mixture averaged diffusion coefficients [m²/s].
323 virtual void getMixDiffCoeffsMass(span<double> d) {
324 throw NotImplementedError("Transport::getMixDiffCoeffsMass",
325 "Not implemented for transport model '{}'.", transportModel());
326 }
327
328 //! Return the polynomial fits to the viscosity of species `i`.
329 virtual void getViscosityPolynomial(size_t i, span<double> coeffs) const {
330 throw NotImplementedError("Transport::getViscosityPolynomial",
331 "Not implemented for transport model '{}'.", transportModel());
332 }
333
334 //! Return the temperature fits of the heat conductivity of species `i`.
335 virtual void getConductivityPolynomial(size_t i, span<double> coeffs) const {
336 throw NotImplementedError("Transport::getConductivityPolynomial",
337 "Not implemented for transport model '{}'.", transportModel());
338 }
339
340 //! Return the polynomial fits to the binary diffusivity of species pair (i, j)
341 virtual void getBinDiffusivityPolynomial(size_t i, size_t j, span<double> coeffs) const {
342 throw NotImplementedError("Transport::getBinDiffusivityPolynomial",
343 "Not implemented for transport model '{}'.", transportModel());
344 }
345
346 //! Return the polynomial fits to the collision integral of species pair (i, j)
347 virtual void getCollisionIntegralPolynomial(size_t i, size_t j,
348 span<double> astar_coeffs, span<double> bstar_coeffs,
349 span<double> cstar_coeffs) const
350 {
351 throw NotImplementedError("Transport::getCollisionIntegralPolynomial",
352 "Not implemented for transport model '{}'.", transportModel());
353 }
354
355 //! Modify the polynomial fits to the viscosity of species `i`
356 virtual void setViscosityPolynomial(size_t i, span<double> coeffs) {
357 throw NotImplementedError("Transport::setViscosityPolynomial",
358 "Not implemented for transport model '{}'.", transportModel());
359 }
360
361 //! Modify the temperature fits of the heat conductivity of species `i`
362 virtual void setConductivityPolynomial(size_t i, span<double> coeffs) {
363 throw NotImplementedError("Transport::setConductivityPolynomial",
364 "Not implemented for transport model '{}'.", transportModel());
365 }
366
367 //! Modify the polynomial fits to the binary diffusivity of species pair (i, j)
368 virtual void setBinDiffusivityPolynomial(size_t i, size_t j, span<double> coeffs) {
369 throw NotImplementedError("Transport::setBinDiffusivityPolynomial",
370 "Not implemented for transport model '{}'.", transportModel());
371 }
372
373 //! Modify the polynomial fits to the collision integral of species pair (i, j)
374 virtual void setCollisionIntegralPolynomial(size_t i, size_t j,
375 span<double> astar_coeffs, span<double> bstar_coeffs,
376 span<double> cstar_coeffs, bool flag)
377 {
378 throw NotImplementedError("Transport::setCollisionIntegralPolynomial",
379 "Not implemented for transport model '{}'.", transportModel());
380 }
381
382 //! Return the parameters for a phase definition which are needed to
383 //! reconstruct an identical object using the newTransport() function. This
384 //! excludes the individual species transport properties, which are handled
385 //! separately.
386 AnyMap parameters() const;
387
388 //! Get error metrics about any functional fits calculated for pure species
389 //! transport properties.
390 //!
391 //! See GasTransport::fitDiffCoeffs and GasTransport::fitProperties.
392 //!
393 //! @warning This method is an experimental part of the %Cantera API and may be
394 //! changed or removed without notice.
395 //! @since New in %Cantera 3.1.
397
398 //! @name Transport manager construction
399 //!
400 //! These methods are used during construction.
401 //! @{
402
403 //! Initialize a transport manager
404 /*!
405 * This routine sets up a transport manager. It calculates the collision
406 * integrals and populates species-dependent data structures.
407 *
408 * @param thermo ThermoPhase object determining conditions for which to compute
409 * transport properties.
410 * @param mode Chemkin compatible mode or not. This alters the
411 * specification of the collision integrals. defaults to no.
412 * @since Changed to use `shared_ptr<ThermoPhase>` in %Cantera 3.2.
413 */
414 virtual void init(shared_ptr<ThermoPhase> thermo, int mode=0) {}
415
416 //! Boolean indicating the form of the transport properties polynomial fits.
417 //! Returns true if the Chemkin form is used.
418 virtual bool CKMode() const {
419 throw NotImplementedError("Transport::CK_Mode",
420 "Not implemented for transport model '{}'.", transportModel());
421 }
422
423 //! @}
424
425 //! Invalidate any cached values which are normally updated only when a
426 //! change in state is detected
427 //! @since New in %Cantera 3.1.
428 virtual void invalidateCache() {}
429
430protected:
431 //! pointer to the object representing the phase
432 shared_ptr<ThermoPhase> m_thermo;
433
434 //! Number of species in the phase
435 size_t m_nsp = 0;
436
437 //! Maximum errors associated with fitting pure species transport properties.
439};
440
441}
442
443#endif
A map of string keys to values whose type can vary at runtime.
Definition AnyMap.h:431
An error indicating that an unimplemented function has been called.
Base class for a phase with thermodynamic properties.
Base class for transport property managers.
Definition Transport.h:72
virtual void getThermalDiffCoeffs(span< double > dt)
Return a vector of thermal diffusion coefficients [kg/m/s].
Definition Transport.h:261
virtual void setConductivityPolynomial(size_t i, span< double > coeffs)
Modify the temperature fits of the heat conductivity of species i
Definition Transport.h:362
virtual void getBinaryDiffCoeffs(const size_t ld, span< double > d)
Returns the matrix of binary diffusion coefficients [m²/s].
Definition Transport.h:276
virtual double bulkViscosity()
The bulk viscosity [Pa·s].
Definition Transport.h:146
virtual double electricalConductivity()
Get the electrical conductivity [siemens/m].
Definition Transport.h:158
virtual void getMassFluxes(span< const double > state1, span< const double > state2, double delta, span< double > mfluxes)
Get the mass fluxes [kg/m²/s], given the thermodynamic state at two nearby points.
Definition Transport.h:240
Transport()=default
Constructor.
virtual void init(shared_ptr< ThermoPhase > thermo, int mode=0)
Initialize a transport manager.
Definition Transport.h:414
virtual void getMobilities(span< double > mobil_e)
Get the electrical mobilities [m²/V/s].
Definition Transport.h:179
virtual void setBinDiffusivityPolynomial(size_t i, size_t j, span< double > coeffs)
Modify the polynomial fits to the binary diffusivity of species pair (i, j)
Definition Transport.h:368
virtual void getConductivityPolynomial(size_t i, span< double > coeffs) const
Return the temperature fits of the heat conductivity of species i.
Definition Transport.h:335
virtual string transportModel() const
Identifies the model represented by this Transport object.
Definition Transport.h:101
AnyMap parameters() const
Return the parameters for a phase definition which are needed to reconstruct an identical object usin...
Definition Transport.cpp:29
shared_ptr< ThermoPhase > m_thermo
pointer to the object representing the phase
Definition Transport.h:432
virtual void getSpeciesFluxes(size_t ndim, span< const double > grad_T, size_t ldx, span< const double > grad_X, size_t ldf, span< double > fluxes)
Get the species diffusive mass fluxes [kg/m²/s] with respect to the specified solution averaged veloc...
Definition Transport.h:205
virtual void getViscosityPolynomial(size_t i, span< double > coeffs) const
Return the polynomial fits to the viscosity of species i.
Definition Transport.h:329
virtual void setCollisionIntegralPolynomial(size_t i, size_t j, span< double > astar_coeffs, span< double > bstar_coeffs, span< double > cstar_coeffs, bool flag)
Modify the polynomial fits to the collision integral of species pair (i, j)
Definition Transport.h:374
virtual void getCollisionIntegralPolynomial(size_t i, size_t j, span< double > astar_coeffs, span< double > bstar_coeffs, span< double > cstar_coeffs) const
Return the polynomial fits to the collision integral of species pair (i, j)
Definition Transport.h:347
virtual void getMixDiffCoeffsMole(span< double > d)
Returns a vector of mixture averaged diffusion coefficients [m²/s].
Definition Transport.h:317
virtual double thermalConductivity()
Get the mixture thermal conductivity [W/m/K].
Definition Transport.h:152
virtual bool CKMode() const
Boolean indicating the form of the transport properties polynomial fits.
Definition Transport.h:418
AnyMap fittingErrors() const
Get error metrics about any functional fits calculated for pure species transport properties.
Definition Transport.h:396
size_t m_nsp
Number of species in the phase.
Definition Transport.h:435
virtual void getSpeciesViscosities(span< double > visc)
Get the pure species viscosities [Pa·s].
Definition Transport.h:135
shared_ptr< Transport > clone(shared_ptr< ThermoPhase > thermo) const
Create a new Transport object using the same transport model and species transport properties as this...
Definition Transport.cpp:16
virtual void getBinDiffusivityPolynomial(size_t i, size_t j, span< double > coeffs) const
Return the polynomial fits to the binary diffusivity of species pair (i, j)
Definition Transport.h:341
ThermoPhase & thermo()
Phase object.
Definition Transport.h:111
AnyMap m_fittingErrors
Maximum errors associated with fitting pure species transport properties.
Definition Transport.h:438
virtual void invalidateCache()
Invalidate any cached values which are normally updated only when a change in state is detected.
Definition Transport.h:428
size_t checkSpeciesIndex(size_t k) const
Check that the specified species index is in range.
Definition Transport.cpp:21
virtual double viscosity()
Get the dynamic viscosity [Pa·s].
Definition Transport.h:126
virtual void getMixDiffCoeffsMass(span< double > d)
Returns a vector of mixture averaged diffusion coefficients [m²/s].
Definition Transport.h:323
virtual void getMixDiffCoeffs(span< double > d)
Return a vector of mixture averaged diffusion coefficients [m²/s].
Definition Transport.h:311
virtual void setViscosityPolynomial(size_t i, span< double > coeffs)
Modify the polynomial fits to the viscosity of species i
Definition Transport.h:356
virtual void getMultiDiffCoeffs(const size_t ld, span< double > d)
Return the multicomponent diffusion coefficients [m²/s].
Definition Transport.h:296
virtual void getMolarFluxes(span< const double > state1, span< const double > state2, const double delta, span< double > cfluxes)
Get the molar fluxes [kmol/m²/s], given the thermodynamic state at two nearby points.
Definition Transport.h:223
This file contains definitions of constants, types and terms that are used in internal routines and a...
Definitions for the classes that are thrown when Cantera experiences an error condition (also contain...
Namespace for the Cantera kernel.
Definition AnyMap.cpp:595