Cantera  3.1.0a1
PlasmaPhase.h
Go to the documentation of this file.
1 /**
2  * @file PlasmaPhase.h
3  * Header file for class PlasmaPhase.
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 
9 #ifndef CT_PLASMAPHASE_H
10 #define CT_PLASMAPHASE_H
11 
13 #include "cantera/numerics/eigen_sparse.h"
14 
15 namespace Cantera
16 {
17 
18 /**
19  * Base class for a phase with plasma properties. This class manages the
20  * plasma properties such as electron energy distribution function (EEDF).
21  * There are two ways to define the electron distribution and electron
22  * temperature. The first method uses setElectronTemperature() to set
23  * the electron temperature which is used to calculate the electron energy
24  * distribution with isotropic-velocity model. The generalized electron
25  * energy distribution for isotropic-velocity distribution can be
26  * expressed as [1,2],
27  * @f[
28  * f(\epsilon) = c_1 \frac{\sqrt{\epsilon}}{\epsilon_m^{3/2}}
29  * \exp(-c_2 (\frac{\epsilon}{\epsilon_m})^x),
30  * @f]
31  * where @f$ x = 1 @f$ and @f$ x = 2 @f$ correspond to the Maxwellian and
32  * Druyvesteyn (default) electron energy distribution, respectively.
33  * @f$ \epsilon_m = 3/2 T_e @f$ [eV] (mean electron energy). The second
34  * method uses setDiscretizedElectronEnergyDist() to manually set electron
35  * energy distribution and calculate electron temperature from mean electron
36  * energy, which is calculated as [3],
37  * @f[
38  * \epsilon_m = \int_0^{\infty} \epsilon^{3/2} f(\epsilon) d\epsilon,
39  * @f]
40  * which can be calculated using trapezoidal rule,
41  * @f[
42  * \epsilon_m = \sum_i (\epsilon^{5/2}_{i+1} - \epsilon^{5/2}_i)
43  * (f(\epsilon_{i+1}) + f(\epsilon_i)) / 2,
44  * @f]
45  * where @f$ i @f$ is the index of energy levels.
46  *
47  * For references, see Gudmundsson @cite gudmundsson2001; Khalilpour and Foroutan
48  * @cite khalilpour2020; Hagelaar and Pitchford @cite hagelaar2005, and BOLOS
49  * @cite BOLOS.
50  *
51  * @warning This class is an experimental part of %Cantera and may be
52  * changed or removed without notice.
53  * @todo Implement electron Boltzmann equation solver to solve EEDF.
54  * https://github.com/Cantera/enhancements/issues/127
55  * @ingroup phase
56  */
58 {
59 public:
60  //! Construct and initialize a PlasmaPhase object
61  //! directly from an input file. The constructor initializes the electron
62  //! energy distribution to be Druyvesteyn distribution (m_x = 2.0). The initial
63  //! electron energy grid is set to a linear space which starts at 0.01 eV and ends
64  //! at 1 eV with 1000 points.
65  /*!
66  * @param inputFile Name of the input file containing the phase definition
67  * to set up the object. If blank, an empty phase will be
68  * created.
69  * @param id ID of the phase in the input file. Defaults to the
70  * empty string.
71  */
72  explicit PlasmaPhase(const string& inputFile="", const string& id="");
73 
74  string type() const override {
75  return "plasma";
76  }
77 
78  void initThermo() override;
79 
80  //! Set electron energy levels.
81  //! @param levels The vector of electron energy levels (eV).
82  //! Length: #m_nPoints.
83  //! @param length The length of the @c levels.
84  void setElectronEnergyLevels(const double* levels, size_t length);
85 
86  //! Get electron energy levels.
87  //! @param levels The vector of electron energy levels (eV). Length: #m_nPoints
88  void getElectronEnergyLevels(double* levels) const {
89  Eigen::Map<Eigen::ArrayXd>(levels, m_nPoints) = m_electronEnergyLevels;
90  }
91 
92  //! Set discretized electron energy distribution.
93  //! @param levels The vector of electron energy levels (eV).
94  //! Length: #m_nPoints.
95  //! @param distrb The vector of electron energy distribution.
96  //! Length: #m_nPoints.
97  //! @param length The length of the vectors, which equals #m_nPoints.
98  void setDiscretizedElectronEnergyDist(const double* levels,
99  const double* distrb,
100  size_t length);
101 
102  //! Get electron energy distribution.
103  //! @param distrb The vector of electron energy distribution.
104  //! Length: #m_nPoints.
105  void getElectronEnergyDistribution(double* distrb) const {
106  Eigen::Map<Eigen::ArrayXd>(distrb, m_nPoints) = m_electronEnergyDist;
107  }
108 
109  //! Set the shape factor of isotropic electron energy distribution.
110  //! Note that @f$ x = 1 @f$ and @f$ x = 2 @f$ correspond to the
111  //! Maxwellian and Druyvesteyn distribution, respectively.
112  //! @param x The shape factor
113  void setIsotropicShapeFactor(double x);
114 
115  //! The shape factor of isotropic electron energy distribution
116  double isotropicShapeFactor() const {
117  return m_isotropicShapeFactor;
118  }
119 
120  //! Set the internally stored electron temperature of the phase (K).
121  //! @param Te Electron temperature in Kelvin
122  void setElectronTemperature(double Te) override;
123 
124  //! Set mean electron energy [eV]. This method also sets electron temperature
125  //! accordingly.
126  void setMeanElectronEnergy(double energy);
127 
128  //! Get electron energy distribution type
130  return m_distributionType;
131  }
132 
133  //! Set electron energy distribution type
134  void setElectronEnergyDistributionType(const string& type);
135 
136  //! Numerical quadrature method. Method: #m_quadratureMethod
137  string quadratureMethod() const {
138  return m_quadratureMethod;
139  }
140 
141  //! Set numerical quadrature method for integrating electron
142  //! energy distribution function. Method: #m_quadratureMethod
143  void setQuadratureMethod(const string& method) {
144  m_quadratureMethod = method;
145  }
146 
147  //! Mean electron energy [eV]
148  double meanElectronEnergy() const {
149  return 3.0 / 2.0 * electronTemperature() * Boltzmann / ElectronCharge;
150  }
151 
152  //! Set flag of automatically normalize electron energy distribution
153  //! Flag: #m_do_normalizeElectronEnergyDist
156  }
157 
158  //! Flag of automatically normalize electron energy distribution.
159  //! Flag: #m_do_normalizeElectronEnergyDist
162  }
163 
164  bool addSpecies(shared_ptr<Species> spec) override;
165 
166  //! Electron Temperature (K)
167  //! @return The electron temperature of the phase
168  double electronTemperature() const override {
169  return m_electronTemp;
170  }
171 
172  //! Return the Gas Constant multiplied by the current electron temperature
173  /*!
174  * The units are Joules kmol-1
175  */
176  double RTe() const {
177  return electronTemperature() * GasConstant;
178  }
179 
180  /**
181  * Electron pressure. Units: Pa.
182  * @f[P = n_{k_e} R T_e @f]
183  */
184  virtual double electronPressure() const {
187  }
188 
189  //! Number of electron levels
190  size_t nElectronEnergyLevels() const {
191  return m_nPoints;
192  }
193 
194  //! Electron Species Index
195  size_t electronSpeciesIndex() const {
196  return m_electronSpeciesIndex;
197  }
198 
199  //! Return the Molar enthalpy. Units: J/kmol.
200  /*!
201  * For an ideal gas mixture with additional electron,
202  * @f[
203  * \hat h(T) = \sum_{k \neq k_e} X_k \hat h^0_k(T) + X_{k_e} \hat h^0_{k_e}(T_e),
204  * @f]
205  * and is a function only of temperature. The standard-state pure-species
206  * enthalpies @f$ \hat h^0_k(T) @f$ are computed by the species
207  * thermodynamic property manager.
208  *
209  * \see MultiSpeciesThermo
210  */
211  double enthalpy_mole() const override;
212 
213  double cp_mole() const override {
214  throw NotImplementedError("PlasmaPhase::cp_mole");
215  }
216 
217  double entropy_mole() const override {
218  throw NotImplementedError("PlasmaPhase::entropy_mole");
219  }
220 
221  double gibbs_mole() const override {
222  throw NotImplementedError("PlasmaPhase::gibbs_mole");
223  }
224 
225  double intEnergy_mole() const override {
226  throw NotImplementedError("PlasmaPhase::intEnergy_mole");
227  }
228 
229  void getEntropy_R(double* sr) const override;
230 
231  void getGibbs_RT(double* grt) const override;
232 
233  void getGibbs_ref(double* g) const override;
234 
235  void getStandardVolumes_ref(double* vol) const override;
236 
237  void getChemPotentials(double* mu) const override;
238 
239  void getStandardChemPotentials(double* muStar) const override;
240 
241  void getPartialMolarEnthalpies(double* hbar) const override;
242 
243  void getPartialMolarEntropies(double* sbar) const override;
244 
245  void getPartialMolarIntEnergies(double* ubar) const override;
246 
247  void getParameters(AnyMap& phaseNode) const override;
248 
249  void setParameters(const AnyMap& phaseNode,
250  const AnyMap& rootNode=AnyMap()) override;
251 
252 protected:
253  void updateThermo() const override;
254 
255  //! Check the electron energy levels
256  /*!
257  * The values of electron energy levels need to be positive and
258  * monotonically increasing.
259  */
260  void checkElectronEnergyLevels() const;
261 
262  //! Check the electron energy distribution
263  /*!
264  * This method check the electron energy distribution for the criteria
265  * below.
266  *
267  * 1. The values of electron energy distribution cannot be negative.
268  *
269  * 2. If the last value of electron energy distribution is larger
270  * than 0.01, it will raise a warning to suggest using a higher electron
271  * energy levels.
272  */
273  void checkElectronEnergyDistribution() const;
274 
275  //! Update electron energy distribution.
277 
278  //! Set isotropic electron energy distribution
280 
281  //! Update electron temperature (K) From energy distribution.
282  //! #m_electronTemp
284 
285  //! Electron energy distribution norm
287 
288  // Electron energy order in the exponential term
289  double m_isotropicShapeFactor = 2.0;
290 
291  //! Number of points of electron energy levels
292  size_t m_nPoints = 1001;
293 
294  //! electron energy levels [ev]. Length: #m_nPoints
295  Eigen::ArrayXd m_electronEnergyLevels;
296 
297  //! Normalized electron energy distribution vector [-]
298  //! Length: #m_nPoints
299  Eigen::ArrayXd m_electronEnergyDist;
300 
301  //! Index of electron species
303 
304  //! Electron temperature [K]
306 
307  //! Electron energy distribution type
308  string m_distributionType = "isotropic";
309 
310  //! Numerical quadrature method for electron energy distribution
311  string m_quadratureMethod = "simpson";
312 
313  //! Flag of normalizing electron energy distribution
315 };
316 
317 }
318 
319 #endif
ThermoPhase object for the ideal gas equation of state - workhorse for Cantera (see Thermodynamic Pro...
A map of string keys to values whose type can vary at runtime.
Definition: AnyMap.h:427
Class IdealGasPhase represents low-density gases that obey the ideal gas equation of state.
An error indicating that an unimplemented function has been called.
Definition: ctexceptions.h:195
virtual double concentration(const size_t k) const
Concentration of species k.
Definition: Phase.cpp:476
Base class for a phase with plasma properties.
Definition: PlasmaPhase.h:58
void checkElectronEnergyDistribution() const
Check the electron energy distribution.
double meanElectronEnergy() const
Mean electron energy [eV].
Definition: PlasmaPhase.h:148
double enthalpy_mole() const override
Return the Molar enthalpy. Units: J/kmol.
void setQuadratureMethod(const string &method)
Set numerical quadrature method for integrating electron energy distribution function.
Definition: PlasmaPhase.h:143
size_t m_nPoints
Number of points of electron energy levels.
Definition: PlasmaPhase.h:292
void getPartialMolarEnthalpies(double *hbar) const override
Returns an array of partial molar enthalpies for the species in the mixture.
void getChemPotentials(double *mu) const override
Get the species chemical potentials. Units: J/kmol.
void normalizeElectronEnergyDistribution()
Electron energy distribution norm.
Definition: PlasmaPhase.cpp:35
void getStandardChemPotentials(double *muStar) const override
Get the array of chemical potentials at unit activity for the species at their standard states at the...
void updateThermo() const override
Update the species reference state thermodynamic functions.
void setElectronTemperature(double Te) override
Set the internally stored electron temperature of the phase (K).
Definition: PlasmaPhase.cpp:74
string electronEnergyDistributionType() const
Get electron energy distribution type.
Definition: PlasmaPhase.h:129
void getEntropy_R(double *sr) const override
Get the array of nondimensional Entropy functions for the standard state species at the current T and...
string quadratureMethod() const
Numerical quadrature method. Method: m_quadratureMethod.
Definition: PlasmaPhase.h:137
size_t nElectronEnergyLevels() const
Number of electron levels.
Definition: PlasmaPhase.h:190
void getGibbs_ref(double *g) const override
Returns the vector of the Gibbs function of the reference state at the current temperature of the sol...
Eigen::ArrayXd m_electronEnergyDist
Normalized electron energy distribution vector [-] Length: m_nPoints.
Definition: PlasmaPhase.h:299
Eigen::ArrayXd m_electronEnergyLevels
electron energy levels [ev]. Length: m_nPoints
Definition: PlasmaPhase.h:295
void setDiscretizedElectronEnergyDist(const double *levels, const double *distrb, size_t length)
Set discretized electron energy distribution.
void getParameters(AnyMap &phaseNode) const override
Store the parameters of a ThermoPhase object such that an identical one could be reconstructed using ...
string type() const override
String indicating the thermodynamic model implemented.
Definition: PlasmaPhase.h:74
void checkElectronEnergyLevels() const
Check the electron energy levels.
Definition: PlasmaPhase.cpp:92
void initThermo() override
Initialize the ThermoPhase object after all species have been set up.
void updateElectronTemperatureFromEnergyDist()
Update electron temperature (K) From energy distribution.
string m_distributionType
Electron energy distribution type.
Definition: PlasmaPhase.h:308
void getStandardVolumes_ref(double *vol) const override
Get the molar volumes of the species reference states at the current T and P_ref of the solution.
void updateElectronEnergyDistribution()
Update electron energy distribution.
Definition: PlasmaPhase.cpp:25
string m_quadratureMethod
Numerical quadrature method for electron energy distribution.
Definition: PlasmaPhase.h:311
PlasmaPhase(const string &inputFile="", const string &id="")
Construct and initialize a PlasmaPhase object directly from an input file.
Definition: PlasmaPhase.cpp:14
size_t electronSpeciesIndex() const
Electron Species Index.
Definition: PlasmaPhase.h:195
double m_electronTemp
Electron temperature [K].
Definition: PlasmaPhase.h:305
void getElectronEnergyDistribution(double *distrb) const
Get electron energy distribution.
Definition: PlasmaPhase.h:105
double RTe() const
Return the Gas Constant multiplied by the current electron temperature.
Definition: PlasmaPhase.h:176
void setElectronEnergyLevels(const double *levels, size_t length)
Set electron energy levels.
Definition: PlasmaPhase.cpp:84
void getGibbs_RT(double *grt) const override
Get the nondimensional Gibbs functions for the species in their standard states at the current T and ...
double intEnergy_mole() const override
Molar internal energy. Units: J/kmol.
Definition: PlasmaPhase.h:225
double entropy_mole() const override
Molar entropy.
Definition: PlasmaPhase.h:217
bool m_do_normalizeElectronEnergyDist
Flag of normalizing electron energy distribution.
Definition: PlasmaPhase.h:314
bool normalizeElectronEnergyDistEnabled() const
Flag of automatically normalize electron energy distribution.
Definition: PlasmaPhase.h:160
void getPartialMolarIntEnergies(double *ubar) const override
Return an array of partial molar internal energies for the species in the mixture.
double cp_mole() const override
Molar heat capacity at constant pressure.
Definition: PlasmaPhase.h:213
void setIsotropicElectronEnergyDistribution()
Set isotropic electron energy distribution.
Definition: PlasmaPhase.cpp:58
double isotropicShapeFactor() const
The shape factor of isotropic electron energy distribution.
Definition: PlasmaPhase.h:116
double gibbs_mole() const override
Molar Gibbs function. Units: J/kmol.
Definition: PlasmaPhase.h:221
void getElectronEnergyLevels(double *levels) const
Get electron energy levels.
Definition: PlasmaPhase.h:88
bool addSpecies(shared_ptr< Species > spec) override
Add a Species to this Phase.
void setParameters(const AnyMap &phaseNode, const AnyMap &rootNode=AnyMap()) override
Set equation of state parameters from an AnyMap phase description.
void setMeanElectronEnergy(double energy)
Set mean electron energy [eV].
Definition: PlasmaPhase.cpp:79
size_t m_electronSpeciesIndex
Index of electron species.
Definition: PlasmaPhase.h:302
void setElectronEnergyDistributionType(const string &type)
Set electron energy distribution type.
Definition: PlasmaPhase.cpp:47
void getPartialMolarEntropies(double *sbar) const override
Returns an array of partial molar entropies of the species in the solution.
virtual double electronPressure() const
Electron pressure.
Definition: PlasmaPhase.h:184
double electronTemperature() const override
Electron Temperature (K)
Definition: PlasmaPhase.h:168
void setIsotropicShapeFactor(double x)
Set the shape factor of isotropic electron energy distribution.
void enableNormalizeElectronEnergyDist(bool enable)
Set flag of automatically normalize electron energy distribution Flag: m_do_normalizeElectronEnergyDi...
Definition: PlasmaPhase.h:154
const double Boltzmann
Boltzmann constant [J/K].
Definition: ct_defs.h:84
const double GasConstant
Universal Gas Constant [J/kmol/K].
Definition: ct_defs.h:120
const double ElectronCharge
Elementary charge [C].
Definition: ct_defs.h:90
Namespace for the Cantera kernel.
Definition: AnyMap.cpp:564
const size_t npos
index returned by functions to indicate "no position"
Definition: ct_defs.h:180