| Cantera 3.0.0

Loading...
Searching...
No Matches
IonFlow.h
Go to the documentation of this file.
1//! @file IonFlow.h
2
3// This file is part of Cantera. See License.txt in the top-level directory or
4// at https://cantera.org/license.txt for license and copyright information.
5
6#ifndef CT_IONFLOW_H
7#define CT_IONFLOW_H
8
9#include "cantera/oneD/StFlow.h"
10
11 namespace Cantera
12{
13/**
14 * This class models the ion transportation in a flame. There are three
15 * stages of the simulation.
16 *
17 * The first stage turns off the diffusion of ions due to the fast
18 * diffusion rate of electron without internal electric forces (ambi-
19 * polar diffusion effect).
20 *
21 * The second stage evaluates drift flux from electric field calculated from
22 * Poisson's equation, which is solved together with other equations. Poisson's
23 * equation is coupled because the total charge densities depends on the species'
24 * concentration. See Pedersen and Brown @cite pedersen1993 for details.
25 *
26 * @ingroup flowGroup
27 */
28 class IonFlow : public StFlow
29{
30 public:
31 IonFlow(ThermoPhase* ph = 0, size_t nsp = 1, size_t points = 1);
32
33 //! Create a new flow domain.
34 //! @param sol Solution object used to evaluate all thermodynamic, kinetic, and
35 //! transport properties
36 //! @param id name of flow domain
37 //! @param points initial number of grid points
38 IonFlow(shared_ptr<Solution> sol, const string& id="", size_t points = 1);
39
40 string type() const override;
41
42 size_t getSolvingStage() const override {
43 return m_stage;
44 }
45 void setSolvingStage(const size_t stage) override;
46
47 void resize(size_t components, size_t points) override;
48 bool componentActive(size_t n) const override;
49
50 void _finalize(const double* x) override;
51
52 void solveElectricField(size_t j=npos) override;
53 void fixElectricField(size_t j=npos) override;
54 bool doElectricField(size_t j) const override {
55 return m_do_electric_field[j];
56 }
57
58 /**
59 * Sometimes it is desired to carry out the simulation using a specified
60 * electron transport profile, rather than assuming it as a constant (0.4).
61 * See Bisetti and El Morsli @cite bisetti2012.
62 * If in the future the class GasTransport is improved, this method may
63 * be discarded. This method specifies this profile.
64 */
65 void setElectronTransport(vector<double>& tfix,
66 vector<double>& diff_e,
67 vector<double>& mobi_e);
68
69 protected:
70 /*!
71 * This function overloads the original function. The residual function
72 * of electric field is added.
73 */
74 void evalResidual(double* x, double* rsd, int* diag,
75 double rdt, size_t jmin, size_t jmax) override;
76 void updateTransport(double* x, size_t j0, size_t j1) override;
77 void updateDiffFluxes(const double* x, size_t j0, size_t j1) override;
78 //! Solving phase one: the fluxes of charged species are turned off
79 void frozenIonMethod(const double* x, size_t j0, size_t j1);
80 //! Solving phase two: the electric field equation is added coupled
81 //! by the electrical drift
82 void electricFieldMethod(const double* x, size_t j0, size_t j1);
83 //! flag for solving electric field or not
84 vector<bool> m_do_electric_field;
85
86 //! flag for importing transport of electron
87 bool m_import_electron_transport = false;
88
89 //! electrical properties
90 vector<double> m_speciesCharge;
91
92 //! index of species with charges
93 vector<size_t> m_kCharge;
94
95 //! index of neutral species
96 vector<size_t> m_kNeutral;
97
98 //! coefficients of polynomial fitting of fixed electron transport profile
99 vector<double> m_mobi_e_fix;
100 vector<double> m_diff_e_fix;
101
102 //! mobility
103 vector<double> m_mobility;
104
105 //! solving stage
106 size_t m_stage = 1;
107
108 //! index of electron
109 size_t m_kElectron = npos;
110
111 //! electric field
112 double E(const double* x, size_t j) const {
113 return x[index(c_offset_E, j)];
114 }
115
116 double dEdz(const double* x, size_t j) const {
117 return (E(x,j)-E(x,j-1))/(z(j)-z(j-1));
118 }
119
120 //! number density
121 double ND(const double* x, size_t k, size_t j) const {
122 return Avogadro * m_rho[j] * Y(x,k,j) / m_wt[k];
123 }
124
125 //! total charge density
126 double rho_e(double* x, size_t j) const {
127 double chargeDensity = 0.0;
128 for (size_t k : m_kCharge) {
129 chargeDensity += m_speciesCharge[k] * ElectronCharge * ND(x,k,j);
130 }
131 return chargeDensity;
132 }
133};
134
135}
136
137#endif
StFlow.h
Cantera::IonFlow
This class models the ion transportation in a flame.
Definition IonFlow.h:29
Cantera::IonFlow::m_kCharge
vector< size_t > m_kCharge
index of species with charges
Definition IonFlow.h:93
Cantera::IonFlow::electricFieldMethod
void electricFieldMethod(const double *x, size_t j0, size_t j1)
Solving phase two: the electric field equation is added coupled by the electrical drift.
Definition IonFlow.cpp:155
Cantera::IonFlow::doElectricField
bool doElectricField(size_t j) const override
Retrieve flag indicating whether electric field is solved or not (used by IonFlow specialization)
Definition IonFlow.h:54
Cantera::IonFlow::E
double E(const double *x, size_t j) const
electric field
Definition IonFlow.h:112
Cantera::IonFlow::evalResidual
void evalResidual(double *x, double *rsd, int *diag, double rdt, size_t jmin, size_t jmax) override
Definition IonFlow.cpp:205
Cantera::IonFlow::m_do_electric_field
vector< bool > m_do_electric_field
flag for solving electric field or not
Definition IonFlow.h:84
Cantera::IonFlow::m_kElectron
size_t m_kElectron
index of electron
Definition IonFlow.h:109
Cantera::IonFlow::frozenIonMethod
void frozenIonMethod(const double *x, size_t j0, size_t j1)
Solving phase one: the fluxes of charged species are turned off.
Definition IonFlow.cpp:128
Cantera::IonFlow::resize
void resize(size_t components, size_t points) override
Resize the domain to have nv components and np grid points.
Definition IonFlow.cpp:87
Cantera::IonFlow::setElectronTransport
void setElectronTransport(vector< double > &tfix, vector< double > &diff_e, vector< double > &mobi_e)
Sometimes it is desired to carry out the simulation using a specified electron transport profile,...
Definition IonFlow.cpp:290
Cantera::IonFlow::type
string type() const override
String indicating the domain implemented.
Definition IonFlow.cpp:77
Cantera::IonFlow::rho_e
double rho_e(double *x, size_t j) const
total charge density
Definition IonFlow.h:126
Cantera::IonFlow::getSolvingStage
size_t getSolvingStage() const override
Get the solving stage (used by IonFlow specialization)
Definition IonFlow.h:42
Cantera::IonFlow::ND
double ND(const double *x, size_t k, size_t j) const
number density
Definition IonFlow.h:121
Cantera::IonFlow::updateTransport
void updateTransport(double *x, size_t j0, size_t j1) override
Update the transport properties at grid points in the range from j0 to j1, based on solution x.
Definition IonFlow.cpp:103
Cantera::IonFlow::m_mobility
vector< double > m_mobility
mobility
Definition IonFlow.h:103
Cantera::IonFlow::updateDiffFluxes
void updateDiffFluxes(const double *x, size_t j0, size_t j1) override
Update the diffusive mass fluxes.
Definition IonFlow.cpp:118
Cantera::IonFlow::m_stage
size_t m_stage
solving stage
Definition IonFlow.h:106
Cantera::IonFlow::_finalize
void _finalize(const double *x) override
In some cases, a domain may need to set parameters that depend on the initial solution estimate.
Definition IonFlow.cpp:307
Cantera::IonFlow::setSolvingStage
void setSolvingStage(const size_t stage) override
Solving stage mode for handling ionized species (used by IonFlow specialization)
Definition IonFlow.cpp:193
Cantera::IonFlow::m_import_electron_transport
bool m_import_electron_transport
flag for importing transport of electron
Definition IonFlow.h:87
Cantera::IonFlow::solveElectricField
void solveElectricField(size_t j=npos) override
Set to solve electric field in a point (used by IonFlow specialization)
Definition IonFlow.cpp:240
Cantera::IonFlow::fixElectricField
void fixElectricField(size_t j=npos) override
Set to fix voltage in a point (used by IonFlow specialization)
Definition IonFlow.cpp:265
Cantera::IonFlow::m_kNeutral
vector< size_t > m_kNeutral
index of neutral species
Definition IonFlow.h:96
Cantera::IonFlow::m_mobi_e_fix
vector< double > m_mobi_e_fix
coefficients of polynomial fitting of fixed electron transport profile
Definition IonFlow.h:99
Cantera::IonFlow::componentActive
bool componentActive(size_t n) const override
Returns true if the specified component is an active part of the solver state.
Definition IonFlow.cpp:94
Cantera::IonFlow::m_speciesCharge
vector< double > m_speciesCharge
electrical properties
Definition IonFlow.h:90
Cantera::StFlow
This class represents 1D flow domains that satisfy the one-dimensional similarity solution for chemic...
Definition StFlow.h:45
Cantera::ThermoPhase
Base class for a phase with thermodynamic properties.
Definition ThermoPhase.h:390
Cantera::Avogadro
const double Avogadro
Avogadro's Number [number/kmol].
Definition ct_defs.h:81
Cantera::ElectronCharge
const double ElectronCharge
Elementary charge [C].
Definition ct_defs.h:90
Cantera
Namespace for the Cantera kernel.
Definition AnyMap.cpp:564
Cantera::npos
const size_t npos
index returned by functions to indicate "no position"
Definition ct_defs.h:195
Cantera::c_offset_E
@ c_offset_E
electric poisson's equation
Definition StFlow.h:29