From 670502b8c22318808b44e5d9f541019ea46f5b0a Mon Sep 17 00:00:00 2001 From: Dave Goodwin Date: Tue, 27 Nov 2007 13:26:07 +0000 Subject: [PATCH] *** empty log message *** --- Cantera/python/ctml_writer.py | 42 +- Cantera/src/thermo/SemiconductorPhase.cpp | 14 +- Cantera/src/thermo/SemiconductorPhase.h | 1178 ++------------------- 3 files changed, 153 insertions(+), 1081 deletions(-) diff --git a/Cantera/python/ctml_writer.py b/Cantera/python/ctml_writer.py index 032f164a0..aa525d76f 100644 --- a/Cantera/python/ctml_writer.py +++ b/Cantera/python/ctml_writer.py @@ -1448,7 +1448,47 @@ class metal(phase): t = ph.addChild('transport') t['model'] = self._tr k = ph.addChild("kinetics") - k['model'] = 'none' + k['model'] = 'none' + +class semiconductor(phase): + """A semiconductor.""" + def __init__(self, + name = '', + elements = '', + species = '', + density = -1.0, + bandgap = 1.0 * eV, + effectiveMass_e = 1.0 * ElectronMass, + effectiveMass_h = 1.0 * ElectronMass, + transport = 'None', + initial_state = None, + options = []): + + phase.__init__(self, name, 3, elements, species, 'none', + initial_state, options) + self._dens = density + self._pure = 0 + self._tr = transport + self._emass = effectiveMass_e + self._hmass = effectiveMass_h + self._bandgap = bandgap + + def conc_dim(self): + return (1,-3) + + def build(self, p): + ph = phase.build(self, p) + e = ph.addChild("thermo") + e['model'] = 'Semiconductor' + addFloat(e, 'density', self._dens, defunits = _umass+'/'+_ulen+'3') + addFloat(e, 'effectiveMass_e', self._emass, defunits = _umass) + addFloat(e, 'effectiveMass_h', self._hmass, defunits = _umass) + addFloat(e, 'bandgap', self._bandgap, defunits = 'eV') + if self._tr: + t = ph.addChild('transport') + t['model'] = self._tr + k = ph.addChild("kinetics") + k['model'] = 'none' class incompressible_solid(phase): diff --git a/Cantera/src/thermo/SemiconductorPhase.cpp b/Cantera/src/thermo/SemiconductorPhase.cpp index 9be205c89..c48bbe0ab 100644 --- a/Cantera/src/thermo/SemiconductorPhase.cpp +++ b/Cantera/src/thermo/SemiconductorPhase.cpp @@ -10,6 +10,11 @@ namespace Cantera { return log(r) + JD_const1*r - JD_const2*r*r; } + + SemiconductorPhase::SemiconductorPhase(std::string infile, + std::string id) {} + + // doublereal SemiconductorPhase::ionizedDonorConcentration() { // return 1.0/(1.0 + 2.0*exp( fermiLevel() - m_edonor)); //} @@ -47,14 +52,15 @@ namespace Cantera { return 0.0; } + /** + * Energy at the top of the conduction band. By default, energies + * are referenced to this energy, and so this function simply + * returns zero. + */ doublereal SemiconductorPhase::ec() const { return ev() + bandgap(); } - doublereal SemiconductorPhase::bandgap() const { - return m_gap; - } - // private void SemiconductorPhase::initLengths() { diff --git a/Cantera/src/thermo/SemiconductorPhase.h b/Cantera/src/thermo/SemiconductorPhase.h index 7cca66de4..561d7df0b 100644 --- a/Cantera/src/thermo/SemiconductorPhase.h +++ b/Cantera/src/thermo/SemiconductorPhase.h @@ -1,1116 +1,142 @@ /** - * @file SemiconductorPhase.h - * Header file for an ideal semiconductor model * - * This class inherits from the Cantera class ThermoPhase + * @file SemiconductorPhase.h + * */ -/* - * $Author$ +/* $Author$ * $Date$ * $Revision$ + * + * Copyright 2003 California Institute of Technology + * */ -#ifndef CT_SEMICONDUCTOR_H -#define CT_SEMICONDUCTOR_H + +#ifndef CT_SEMICONDPHASE_H +#define CT_SEMICONDPHASE_H #include "mix_defs.h" #include "ThermoPhase.h" -//#include "importCTML.h" -#include "ThermoFactory.h" -#include "SpeciesThermo.h" - +//#include "SpeciesThermo.h" namespace Cantera { - /*! - * @name CONSTANTS - Models for the Standard State of IdealSolidSolnPhase's - */ - //@{ - const int cSemiconductorPhase = 6010; - //@} - - /** - * - * @ingroup thermoprops - */ - class SemiconductorPhase : public ThermoPhase { - - public: + const int cElectron = 0; + const int cHole = 1; /** - * Constructor for SemiconductorPhase. - * The generalized concentrations can have three different forms - * depending on the value of the member attribute m_formGC, which - * is supplied in the constructor or read from the xml data file. - * - * - * - * - * - *
m_formGC GeneralizedConc StandardConc
0 X_k 1.0
1 X_k / V_k 1.0 / V_k
2 X_k / V_N 1.0 / V_N
+ * @ingroup thermoprops + * + * Class SemiconductorPhase represents electrons and holes + * in a semiconductor. * - * @param formCG This parameter initializes the m_formGC variable. The default - * is a value of 0. */ - SemiconductorPhase(int formCG=0); + class SemiconductorPhase : public ThermoPhase { - /** - * Constructor for SemiconductorPhase. - * - * This constructor will also fully initialize the object. - * The generalized concentrations can have three different forms - * depending on the value of the member attribute m_formGC, which - * is supplied in the constructor or read from the xml data file. - * - * - * - * - * - * - *
m_formGC GeneralizedConc StandardConc
0 X_k 1.0
1 X_k / V_k 1.0 / V_k
2 X_k / V_N 1.0 / V_N
- * - * @param infile File name for the XML datafile containing information - * for this phase - * @param id The name of this phase. This is used to look up - * the phase in the XML datafile. - * @param formCG This parameter initializes the m_formGC variable. The default - * is a value of 0. - */ - SemiconductorPhase(std::string infile, std::string id=""); + public: + SemiconductorPhase() {} + SemiconductorPhase(std::string infile, std::string id=""); - /** - * Constructor for SemiconductorPhase. - * This constructor will also fully initialize the object. - * - * The generalized concentrations can have three different forms - * depending on the value of the member attribute m_formGC, which - * is supplied in the constructor and/or read from the data file. - * - * - * - * - * - * - *
m_formGC GeneralizedConc StandardConc
0 X_k 1.0
1 X_k / V_k 1.0 / V_k
2 X_k / V_N 1.0 / V_N
- * - * @param root XML tree containing a description of the phase. - * The tree must be positioned at the XML element - * named phase with id, "id", on input to this routine. - * @param id The name of this phase. This is used to look up - * the phase in the XML datafile. - * @param formCG This parameter initializes the m_formGC variable. The default - * is a value of 0. - */ - SemiconductorPhase(XML_Node& root, std::string id=""); + SemiconductorPhase(const SemiconductorPhase &right) { + *this = operator=(right); + } - /*! - * Copy Constructor - */ - SemiconductorPhase(const SemiconductorPhase &); + SemiconductorPhase& operator=(const SemiconductorPhase &right) { + if (&right != this) { + ThermoPhase::operator=(right); + m_press = right.m_press; + } + return *this; + } - /*! - * Assignment operator - */ - SemiconductorPhase& operator=(const SemiconductorPhase &); + virtual ~SemiconductorPhase() {} - /*! - * Base Class Duplication Function - * -> given a pointer to ThermoPhase, this function can - * duplicate the object. (note has to be a separate function - * not the copy constructor, because it has to be - * a virtual function) - */ - virtual ThermoPhase* duplMyselfAsThermoPhase() const; + //! Duplicator + virtual ThermoPhase *duplMyselfAsThermoPhase() const { + SemiconductorPhase * idg = new SemiconductorPhase(*this); + return (ThermoPhase *) idg; + } + + // Overloaded methods of class ThermoPhase - //! Destructor - virtual ~SemiconductorPhase() {} - - /** - * Equation of state flag. Returns a value depending upon the value of - * m_formGC, which is defined at instantiation. - */ - virtual int eosType() const; - - /** - * @name Molar Thermodynamic Properties of the Solution ------------------------ - * @{ - */ - - /** - * Molar enthalpy of the solution. Units: J/kmol. - * For an ideal, constant partial molar volume solution mixture with - * pure species phases which exhibit zero volume expansivity and - * zero isothermal compressibility: - * \f[ - * \hat h(T,P) = \sum_k X_k \hat h^0_k(T) + (P - P_{ref}) (\sum_k X_k \hat V^0_k) - * \f] - * The reference-state pure-species enthalpies at the reference pressure Pref - * \f$ \hat h^0_k(T) \f$, are computed by the species thermodynamic - * property manager. They are polynomial functions of temperature. - * @see SpeciesThermo - */ - virtual doublereal enthalpy_mole() const; - - /** - * Molar internal energy of the solution. Units: J/kmol. - * For an ideal, constant partial molar volume solution mixture with - * pure species phases which exhibit zero volume expansivity and - * zero isothermal compressibility: - * \f[ - * \hat u(T,X) = \hat h(T,P,X) - p \hat V - * = \sum_k X_k \hat h^0_k(T) - P_{ref} (\sum_k{X_k \hat V^0_k}) - * \f] - * and is a function only of temperature. - * The reference-state pure-species enthalpies - * \f$ \hat h^0_k(T) \f$ are computed by the species thermodynamic - * property manager. - * @see SpeciesThermo - */ - virtual doublereal intEnergy_mole() const; - - /** - * Molar entropy of the solution. Units: J/kmol/K. - * For an ideal, constant partial molar volume solution mixture with - * pure species phases which exhibit zero volume expansivity: - * \f[ - * \hat s(T, P, X_k) = \sum_k X_k \hat s^0_k(T) - \hat R \sum_k X_k log(X_k) - * \f] - * The reference-state pure-species entropies - * \f$ \hat s^0_k(T,p_{ref}) \f$ are computed by the species thermodynamic - * property manager. The pure species entropies are independent of - * temperature since the volume expansivities are equal to zero. - * @see SpeciesThermo - */ - virtual doublereal entropy_mole() const; - - /** - * Molar gibbs free energy of the solution. Units: J/kmol. - * For an ideal, constant partial molar volume solution mixture with - * pure species phases which exhibit zero volume expansivity: - * \f[ - * \hat g(T, P) = \sum_k X_k \hat g^0_k(T,P) + \hat R T \sum_k X_k log(X_k) - * \f] - * The reference-state pure-species gibbs free energies - * \f$ \hat g^0_k(T) \f$ are computed by the species thermodynamic - * property manager, while the standard state gibbs free energies - * \f$ \hat g^0_k(T,P) \f$ are computed by the member function, gibbs_RT(). - * @see SpeciesThermo - */ - virtual doublereal gibbs_mole() const; - - /** - * Molar heat capacity at constant pressure of the solution. - * Units: J/kmol/K. - * For an ideal, constant partial molar volume solution mixture with - * pure species phases which exhibit zero volume expansivity: - * \f[ - * \hat c_p(T,P) = \sum_k X_k \hat c^0_{p,k}(T) . - * \f] - * The heat capacity is independent of pressure. - * The reference-state pure-species heat capacities - * \f$ \hat c^0_{p,k}(T) \f$ are computed by the species thermodynamic - * property manager. - * @see SpeciesThermo - */ - virtual doublereal cp_mole() const; - - /** - * Molar heat capacity at constant volume of the solution. - * Units: J/kmol/K. - * For an ideal, constant partial molar volume solution mixture with - * pure species phases which exhibit zero volume expansivity: - * \f[ \hat c_v(T,P) = \hat c_p(T,P) \f] - * The two heat capacities are equal. - */ - virtual doublereal cv_mole() const { - return cp_mole(); - } - - //@} - /** @name Mechanical Equation of State Properties ------------------------------------ - * - * In this equation of state implementation, the density is a - * function only of the mole fractions. Therefore, it can't be - * an independent variable. Instead, the pressure is used as the - * independent variable. Functions which try to set the thermodynamic - * state by calling setDensity() may cause an exception to be - * thrown. - */ - //@{ - - /** - * Pressure. Units: Pa. - * For this incompressible system, we return the internally storred - * independent value of the pressure. - */ - virtual doublereal pressure() const { - return m_Pcurrent; - } - - /** - * Set the pressure at constant temperature. Units: Pa. - * This method sets a constant within the object. - * The mass density is not a function of pressure. - * - * @param p Input Pressure (Pa) - */ - virtual void setPressure(doublereal p); - - /** - * Calculate the density of the mixture using the partial - * molar volumes and mole fractions as input - * - * The formula for this is - * - * \f[ - * \rho = \frac{\sum_k{X_k W_k}}{\sum_k{X_k V_k}} - * \f] - * - * where \f$X_k\f$ are the mole fractions, \f$W_k\f$ are - * the molecular weights, and \f$V_k\f$ are the pure species - * molar volumes. - * - * Note, the basis behind this formula is that in an ideal - * solution the partial molar volumes are equal to the pure - * species molar volumes. We have additionally specified - * in this class that the pure species molar volumes are - * independent of temperature and pressure. - * - * NOTE: This is a non-virtual function, which is not a - * member of the ThermoPhase base class. - */ - void calcDensity(); - - /** - * Overwritten setDensity() function is necessary because the - * density is not an indendent variable. - * - * This function will now throw an error condition - * - * @internal May have to adjust the strategy here to make - * the eos for these materials slightly compressible, in order - * to create a condition where the density is a function of - * the pressure. - * - * This function will now throw an error condition. - * - * NOTE: This is a virtual function that overwrites the State.h - * class - * - * @param rho Input density - */ - virtual void setDensity(doublereal rho); - - /** - * Overwritten setMolarDensity() function is necessary because the - * density is not an independent variable. - * - * This function will now throw an error condition. - * - * NOTE: This is virtual function that overwrites the State.h - * class - * - * @param rho Input Density - */ - virtual void setMolarDensity(doublereal rho); - - //! Set the mole fractions - /*! - * @param x Input vector of mole fractions. - * Length: m_kk. - */ - virtual void setMoleFractions(const doublereal *x); - - //! Set the mole fractions, but don't normalize them to one. - /*! - * @param x Input vector of mole fractions. - * Length: m_kk. - */ - virtual void setMoleFractions_NoNorm(const doublereal *x); - - //! Set the mass fractions, and normalize them to one. - /*! - * @param y Input vector of mass fractions. - * Length: m_kk. - */ - virtual void setMassFractions(const doublereal *y); - - //! Set the mass fractions, but don't normalize them to one - /*! - * @param y Input vector of mass fractions. - * Length: m_kk. - */ - virtual void setMassFractions_NoNorm(const doublereal *y); - - //! Set the concentration, - /*! - * @param c Input vector of concentrations. - * Length: m_kk. - */ - virtual void setConcentrations(const doublereal *c); - - - //@} - - /** - * @name Chemical Potentials and Activities ----------------------------------------- - * - * The activity of a species is - * related to the chemical potential (quasi-Fermi level) by - * \f[ - * \mu_k(T,P,X_k) = \mu_k^0(T,P) - * + \hat R T \log a_k. - * \f] - * The quantity \f$\mu_k^0(T,P)\f$ is - * the standard state chemical potential at unit activity, also known as "ec" for - * electrons and "ev" for holes. - * - * The activities are related to the generalized - * concentrations, \f$\tilde C_k\f$, and standard - * concentrations, \f$C^0_k\f$, by the following formula: - * - * \f[ - * a_k = \frac{\tilde C_k}{C^0_k} - * \f] - * The generalized concentrations are used in the kinetics classes - * to describe the rates of progress of reactions involving the - * species. Their formulation depends upons the specification - * of the rate constants for reaction, especially the units used - * in specifying the rate constants. The bridge between the - * thermodynamic equilibrium expressions that use a_k and the - * kinetics expressions which use the generalized concentrations - * is provided by the multiplicative factor of the - * standard concentrations. - * @{ - */ - - /** - * This method returns the array of generalized - * concentrations. The generalized concentrations are used - * in the evaluation of the rates of progress for reactions - * involving species in this phase. The generalized - * concentration dividied by the standard concentration is also - * equal to the activity of species. - * - * For this implentation the activity is defined to be the - * mole fraction of the species. The generalized concentration - * is defined to be equal to the mole fraction divided by - * the partial molar volume. The generalized concentrations - * for species in this phase therefore have units of - * kmol m-3. Rate constants must reflect this fact. - * - * On a general note, the following must be true. - * For an ideal solution, the generalized concentration must consist - * of the mole fraction multiplied by a constant. The constant may be - * fairly arbitrarily chosen, with differences adsorbed into the - * reaction rate expression. 1/V_N, 1/V_k, or 1 are equally good, - * as long as the standard concentration is adjusted accordingly. - * However, it must be a constant (and not the concentration, btw, - * which is a function of the mole fractions) in order for the - * ideal solution properties to hold at the same time having the - * standard concentration to be independent of the mole fractions. - * - * In this implementation the form of the generalized concentrations - * depend upon the member attribute, m_formGC: - * - * - * - * - * - * - *
m_formGC GeneralizedConc StandardConc
0 X_k 1.0
1 X_k / V_k 1.0 / V_k
2 X_k / V_N 1.0 / V_N
- * - * HKM Note: We have absorbed the pressure dependence of the pures species - * state into the thermodynamics functions. Therefore the - * standard state on which the activities are based depend - * on both temperature and pressure. If we hadn't, it would have - * appeared in this function in a very awkwards exp[] format. - * - * @param c Pointer to array of doubles of length m_kk, which on exit - * will contain the generalized concentrations. - */ - virtual void getActivityConcentrations(doublereal* c) const; - - /** - * The standard concentration \f$ C^0_k \f$ used to normalize - * the generalized concentration. - * In many cases, this quantity - * will be the same for all species in a phase. - * However, for this case, we will return a distinct concentration - * for each species. This is the inverse of the species molar - * volume. Units for the standard concentration are - * kmol m-3. - * - * @param k Species number: this is a require parameter, - * a change from the ThermoPhase base class, where it was - * an optional parameter. - */ - virtual doublereal standardConcentration(int k) const; - - /** - * The reference (ie standard) concentration \f$ C^0_k \f$ used to normalize - * the generalized concentration. In many cases, this quantity - * will be the same for all species in a phase. - * However, for this case, we will return a distinct concentration - * for each species. (clone of the standard concentration -> - * suggest changing the name). This is the inverse of the species molar - * volume. - * - * @param k Species index. - */ - virtual doublereal referenceConcentration(int k) const; - - /** - * Returns the log of the standard concentration of the kth species - * - * @param k Species number: this is a require parameter, - * a change from the ThermoPhase base class, where it was - * an optional parameter. - */ - virtual doublereal logStandardConc(int k) const; - - /** - * Returns the units of the standard and general concentrations - * Note they have the same units, as their divisor is - * defined to be equal to the activity of the kth species - * in the solution, which is unitless. - * - * This routine is used in print out applications where the - * units are needed. Usually, MKS units are assumed throughout - * the program and in the XML input files. - * - * @param uA Output vector containing the units - * uA[0] = kmol units - default = 1 - * uA[1] = m units - default = -nDim(), the number of spatial - * dimensions in the Phase class. - * uA[2] = kg units - default = 0; - * uA[3] = Pa(pressure) units - default = 0; - * uA[4] = Temperature units - default = 0; - * uA[5] = time units - default = 0 - * @param k species index. Defaults to 0. - * @param sizeUA output int containing the size of the vector. - * Currently, this is equal to 6. - * - * For EOS types other than cSemiconductorPhase0, the default - * kmol/m3 holds for standard concentration units. For - * cSemiconductorPhase0 type, the standard concentrtion is - * unitless. - */ - virtual void getUnitsStandardConc(double *uA, int k = 0, - int sizeUA = 6) const; - - - //! Get the array of species activity coefficients - /*! - * @param ac output vector of activity coefficients. Length: m_kk - */ - virtual void getActivityCoefficients(doublereal * ac) const; - - /** - * Get the species chemical potentials. Units: J/kmol. - * - * This function returns a vector of chemical potentials of the - * species in solution. - * \f[ - * \mu_k = \mu^{ref}_k(T) + V_k * (p - p_o) + R T ln(X_k) - * \f] - * or another way to phrase this is - * \f[ - * \mu_k = \mu^o_k(T,p) + R T ln(X_k) - * \f] - * where \f$ \mu^o_k(T,p) = \mu^{ref}_k(T) + V_k * (p - p_o)\f$ - * - * @param mu Output vector of chemical potentials. - */ - virtual void getChemPotentials(doublereal* mu) const; - - /** - * Get the array of non-dimensional species solution - * chemical potentials at the current T and P - * \f$\mu_k / \hat R T \f$. - * \f[ - * \mu^0_k(T,P) = \mu^{ref}_k(T) + (P - P_{ref}) * V_k + RT ln(X_k) - * \f] - * where \f$V_k\f$ is the molar volume of pure species k. - * \f$ \mu^{ref}_k(T)\f$ is the chemical potential of pure - * species k at the reference pressure, \f$P_{ref}\f$. - * - * @param mu Output vector of dimensionless chemical potentials. Length = m_kk. - */ - virtual void getChemPotentials_RT(doublereal* mu) const; - - //@} - /// @name Partial Molar Properties of the Solution ----------------------------- - //@{ - - /** - * Returns an array of partial molar enthalpies for the species - * in the mixture. - * Units (J/kmol) - * For this phase, the partial molar enthalpies are equal to the - * pure species enthalpies - * \f[ - * \bar h_k(T,P) = \hat h^{ref}_k(T) + (P - P_{ref}) \hat V^0_k - * \f] - * The reference-state pure-species enthalpies, \f$ \hat h^{ref}_k(T) \f$, - * at the reference pressure,\f$ P_{ref} \f$, - * are computed by the species thermodynamic - * property manager. They are polynomial functions of temperature. - * @see SpeciesThermo - * - * @param hbar Output vector containing partial molar enthalpies. - * Length: m_kk. - */ - virtual void getPartialMolarEnthalpies(doublereal* hbar) const; - - /** - * Returns an array of partial molar entropies of the species in the - * solution. Units: J/kmol/K. - * For this phase, the partial molar entropies are equal to the - * pure species entropies plus the ideal solution contribution. - * \f[ - * \bar s_k(T,P) = \hat s^0_k(T) - R log(X_k) - * \f] - * The reference-state pure-species entropies,\f$ \hat s^{ref}_k(T) \f$, - * at the reference pressure, \f$ P_{ref} \f$, are computed by the - * species thermodynamic - * property manager. They are polynomial functions of temperature. - * @see SpeciesThermo - * - * @param sbar Output vector containing partial molar entropies. - * Length: m_kk. - */ - virtual void getPartialMolarEntropies(doublereal* sbar) const; - - /** - * Returns an array of partial molar Heat Capacities at constant - * pressure of the species in the - * solution. Units: J/kmol/K. - * For this phase, the partial molar heat capacities are equal - * to the standard state heat capacities. - * - * @param cpbar Output vector of partial heat capacities. Length: m_kk. - */ - virtual void getPartialMolarCp(doublereal* cpbar) const; - - /** - * returns an array of partial molar volumes of the species - * in the solution. Units: m^3 kmol-1. - * - * For this solution, thepartial molar volumes are equal to the - * constant species molar volumes. - * - * @param vbar Output vector of partial molar volumes. Length: m_kk. - */ - virtual void getPartialMolarVolumes(doublereal* vbar) const; - - //@} - /// @name Properties of the Standard State of the Species in the Solution ------------------------------------- - //@{ - - - /** - * Get the standard state chemical potentials of the species. - * This is the array of chemical potentials at unit activity - * \f$ \mu^0_k(T,P) \f$. - * We define these here as the chemical potentials of the pure - * species at the temperature and pressure of the solution. - * This function is used in the evaluation of the - * equilibrium constant Kc. Therefore, Kc will also depend - * on T and P. This is the norm for liquid and solid systems. - * - * units = J / kmol - * - * @param mu0 Output vector of standard state chemical potentials. - * Length: m_kk. - */ - virtual void getStandardChemPotentials(doublereal* mu0) const { - getPureGibbs(mu0); - } - - - //! Get the array of nondimensional Enthalpy functions for the standard state species - //! at the current T and P of the solution. - /*! - * We assume an incompressible constant partial molar - * volume here: - * \f[ - * h^0_k(T,P) = h^{ref}_k(T) + (P - P_{ref}) * V_k - * \f] - * where \f$V_k\f$ is the molar volume of pure species k. - * \f$ h^{ref}_k(T)\f$ is the enthalpy of the pure - * species k at the reference pressure, \f$P_{ref}\f$. - * - * @param hrt Vector of length m_kk, which on return hrt[k] - * will contain the nondimensional - * standard state enthalpy of species k. - */ - void getEnthalpy_RT(doublereal* hrt) const; - - - //! Get the nondimensional Entropies for the species - //! standard states at the current T and P of the solution. - /*! - * Note, this is equal to the reference state entropies - * due to the zero volume expansivity: - * i.e., (dS/dP)_T = (dV/dT)_P = 0.0 - * - * @param sr Vector of length m_kk, which on return sr[k] - * will contain the nondimensional - * standard state entropy for species k. - */ - void getEntropy_R(doublereal* sr) const; - - /** - * Get the nondimensional gibbs function for the species - * standard states at the current T and P of the solution. - * - * \f[ - * \mu^0_k(T,P) = \mu^{ref}_k(T) + (P - P_{ref}) * V_k - * \f] - * where \f$V_k\f$ is the molar volume of pure species k. - * \f$ \mu^{ref}_k(T)\f$ is the chemical potential of pure - * species k at the reference pressure, \f$P_{ref}\f$. - * - * @param grt Vector of length m_kk, which on return sr[k] - * will contain the nondimensional - * standard state gibbs function for species k. - */ - virtual void getGibbs_RT(doublereal* grt) const; - - /** - * Get the Gibbs functions for the pure species - * at the current T and P of the solution. - * We assume an incompressible constant partial molar - * volume here: - * \f[ - * \mu^0_k(T,P) = \mu^{ref}_k(T) + (P - P_{ref}) * V_k - * \f] - * where \f$V_k\f$ is the molar volume of pure species k. - * \f$ \mu^{ref}_k(T)\f$ is the chemical potential of pure - * species k at the reference pressure, \f$P_{ref}\f$. - * - * @param gpure Output vector of Gibbs functions for species - * Length: m_kk. - */ - virtual void getPureGibbs(doublereal* gpure) const; - - - //! Returns the vector of nondimensional - //! internal Energies of the standard state at the current - //! temperature and pressure of the solution for each species. - /*! - * - * @param urt Output vector of standard state nondimensional internal energies. - * Length: m_kk. - */ - virtual void getIntEnergy_RT(doublereal *urt) const; - - /** - * Get the nondimensional heat capacity at constant pressure - * function for the species - * standard states at the current T and P of the solution. - * \f[ - * Cp^0_k(T,P) = Cp^{ref}_k(T) - * \f] - * where \f$V_k\f$ is the molar volume of pure species k. - * \f$ Cp^{ref}_k(T)\f$ is the constant pressure heat capacity - * of species k at the reference pressure, \f$p_{ref}\f$. - * - * @param cpr Vector of length m_kk, which on return cpr[k] - * will contain the nondimensional - * constant pressure heat capacity for species k. - */ - void getCp_R(doublereal* cpr) const; - - /** - * Get the molar volumes of each species in their standard - * states at the current - * T and P of the solution. - * units = m^3 / kmol - * - * @param vol Output vector of standard state volumes. - * Length: m_kk. - */ - virtual void getStandardVolumes(doublereal *vol) const; - - - //@} - /// @name Thermodynamic Values for the Species Reference States ------ - //@{ - - - /** - * Returns the vector of nondimensional - * enthalpies of the reference state at the current temperature - * of the solution and the reference pressure for the species. - * - * @param hrt Output vector containing reference nondimensional enthalpies. - * Length: m_kk. - */ - virtual void getEnthalpy_RT_ref(doublereal *hrt) const; - - /** - * Returns the vector of nondimensional - * enthalpies of the reference state at the current temperature - * of the solution and the reference pressure for the species. - * - * @param grt Output vector containing reference nondimensional Gibbs free energies. - * Length: m_kk. - */ - virtual void getGibbs_RT_ref(doublereal *grt) const; - - /** - * Returns the vector of the - * gibbs function of the reference state at the current temperature - * of the solution and the reference pressure for the species. - * units = J/kmol - * - * @param g Output vector containing reference Gibbs free energies. - * Length: m_kk. - */ - virtual void getGibbs_ref(doublereal *g) const; - - /** - * Returns the vector of nondimensional - * entropies of the reference state at the current temperature - * of the solution and the reference pressure for the species. - * - * @param er Output vector containing reference nondimensional entropies. - * Length: m_kk. - */ - virtual void getEntropy_R_ref(doublereal *er) const; - - /** - * Returns the vector of nondimensional - * internal Energies of the reference state at the current temperature - * of the solution and the reference pressure for each species. - * - * @param urt Output vector containing reference nondimensional internal energies. - * Length: m_kk. - */ - virtual void getIntEnergy_RT_ref(doublereal *urt) const; - - /** - * Returns the vector of nondimensional - * constant pressure heat capacities of the reference state - * at the current temperature of the solution - * and reference pressure for the species. - * - * @param cprt Output vector containing reference nondimensional heat capacities. - * Length: m_kk. - */ - virtual void getCp_R_ref(doublereal *cprt) const; - - /** - * Returns a reference to the vector of nondimensional - * enthalpies of the reference state at the current temperature. - * Real reason for its existence is that it also checks - * to see if a recalculation of the reference thermodynamics - * functions needs to be done. - */ - const array_fp& enthalpy_RT_ref() const; - - /** - * Returns a reference to the vector of nondimensional - * enthalpies of the reference state at the current temperature. - * Real reason for its existence is that it also checks - * to see if a recalculation of the reference thermodynamics - * functions needs to be done. - */ - const array_fp& gibbs_RT_ref() const { - _updateThermo(); - return m_g0_RT; - } - - /** - * Returns a reference to the vector of nondimensional - * enthalpies of the reference state at the current temperature. - * Real reason for its existence is that it also checks - * to see if a recalculation of the reference thermodynamics - * functions needs to be done. - */ - const array_fp& expGibbs_RT_ref() const; - - /** - * Returns a reference to the vector of nondimensional - * enthalpies of the reference state at the current temperature. - * Real reason for its existence is that it also checks - * to see if a recalculation of the reference thermodynamics - * functions needs to be done. - */ - const array_fp& entropy_R_ref() const; - - /** - * Returns a reference to the vector of nondimensional - * enthalpies of the reference state at the current temperature. - * Real reason for its existence is that it also checks - * to see if a recalculation of the reference thermodynamics - * functions needs to be done. - */ - const array_fp& cp_R_ref() const { - _updateThermo(); - return m_cp0_R; - } - - virtual void setPotentialEnergy(int k, doublereal pe) { - m_pe[k] = pe; - _updateThermo(); - } - - virtual doublereal potentialEnergy(int k) const { - return m_pe[k]; - } - //@} - /// @name Utility Functions ----------------------------------------------- - //@{ + virtual int eosType() const { return cSemiconductor; } + + virtual void setPressure(doublereal pres) { m_press = pres; } + virtual doublereal pressure() const { return m_press; } - /** - * Initialization of an SemiconductorPhase phase using an - * xml file - * - * This routine is a precursor to constructPhaseXML(XML_Node*) - * routine, which does most of the work. - * - * @param infile XML file containing the description of the - * phase - * - * @param id Optional parameter identifying the name of the - * phase. If none is given, the first XML - * phase element will be used. - */ - void constructPhaseFile(std::string infile, std::string id=""); + virtual void setParametersFromXML(const XML_Node& eosdata) { + eosdata._require("model","Semiconductor"); + doublereal rho = getFloat(eosdata, "density", "-"); + setDensity(rho); + doublereal bandgap = getFloat(eosdata, "bandgap", "-"); + doublereal e_mass = getFloat(eosdata, "electron_mass", "-"); + doublereal h_mass = getFloat(eosdata, "hole_mass", "-"); + doublereal e_donor = getFloat(eosdata, "donor_energy", "-"); + doublereal n_donor = getFloat(eosdata, "donor_concentration", "-"); + doublereal e_acceptor = getFloat(eosdata, "acceptor_energy", "-"); + doublereal n_acceptor = getFloat(eosdata, "acceptor_concentration", "-"); + setEffectiveMasses(e_mass, h_mass); + setDonorDoping(n_donor, e_donor); + setAcceptorDoping(n_acceptor, e_acceptor); + m_bandgap = bandgap; + } - /** - * Import and initialize an SemiconductorPhase phase - * specification in an XML tree into the current object. - * Here we read an XML description of the phase. - * We import descriptions of the elements that make up the - * species in a phase. - * We import information about the species, including their - * reference state thermodynamic polynomials. We then freeze - * the state of the species. - * This routine calls importPhase() to do most of its work. - * Then, importPhase() calls initThermoXML() to finish - * off the work. - * - - * @param phaseNode This object must be the phase node of a - * complete XML tree - * description of the phase, including all of the - * species data. In other words while "phase" must - * point to an XML phase object, it must have - * sibling nodes "speciesData" that describe - * the species in the phase. - * @param id ID of the phase. If nonnull, a check is done - * to see if phaseNode is pointing to the phase - * with the correct id. - */ - void constructPhaseXML(XML_Node& phaseNode, std::string id=""); + void setEffectiveMasses(doublereal e_mass, doublereal h_mass) { + m_emass = e_mass; + m_hmass = h_mass; + } - /** - * Initialization of an SemiconductorPhase phase: - * Note this function is pretty much useless because it doesn't - * get the xml tree passed to it. Suggest a change. - */ - virtual void initThermo(); - - /** - * @internal - * Import and initialize a ThermoPhase object - * using an XML tree. - * Here we read extra information about the XML description - * of a phase. Regular information about elements and species - * and their reference state thermodynamic information - * have already been read at this point. - * For example, we do not need to call this function for - * ideal gas equations of state. - * This function is called from importPhase() - * after the elements and the - * species are initialized with default ideal solution - * level data. - * - * @param phaseNode This object must be the phase node of a - * complete XML tree - * description of the phase, including all of the - * species data. In other words while "phase" must - * point to an XML phase object, it must have - * sibling nodes "speciesData" that describe - * the species in the phase. - * @param id ID of the phase. If nonnull, a check is done - * to see if phaseNode is pointing to the phase - * with the correct id. - */ - virtual void initThermoXML(XML_Node& phaseNode, std::string id); + void setDonorDoping(doublereal n_donor, doublereal e_donor) { + m_ndonor = n_donor; + m_edonor = e_donor; + } + void setAcceptorDoping(doublereal n_acceptor, doublereal e_acceptor) { + m_nacceptor = n_acceptor; + m_eacceptor = e_acceptor; + } - /** - * Set mixture to an equilibrium state consistent with specified - * element potentials and the temperature. - * - * @param lambda_RT vector of non-dimensional element potentials - * \f$ \lambda_m/RT \f$. - * - */ - virtual void setToEquilState(const doublereal* lambda_RT); + doublereal effectiveMass_e() const { + return m_emass; + } + doublereal effectiveMass_h() const { + return m_hmass; + } + + doublereal fermiLevel() const { + return m_fermi_level; + } - /** - * Report the molar volume of species k - * - * units - \f$ m^3 kmol^-1 \f$ - * - * @param k species index - */ - double speciesMolarVolume(int k) const; + virtual void getChemPotentials(doublereal* mu) const; + doublereal nc() const; + doublereal nv() const; + doublereal ec() const; + doublereal ev() const; + doublereal bandgap() const { + return m_bandgap; + } - /** - * Fill in a return vector containing the species molar volumes. - * - * units - \f$ m^3 kmol^-1 \f$ - * - * @param smv output vector containing species molar volumes. - * Length: m_kk. - */ - void getSpeciesMolarVolumes(doublereal *smv) const; + protected: - //@} + private: + doublereal m_press; + doublereal m_emass; + doublereal m_hmass; + doublereal m_ndonor; + doublereal m_edonor; + doublereal m_nacceptor; + doublereal m_eacceptor; + doublereal m_fermi_level; + doublereal m_bandgap; + mutable vector_fp m_work; - doublereal nc() const; - doublereal nv() const; - doublereal ec() const; - doublereal ev() const; - doublereal bandgap() const; - doublereal effectiveMass_e() const { - return m_emass; - } - doublereal effectiveMass_h() const { - return m_hmass; - } - - protected: - - /** - * Format for the generalized concentrations - * 0 = C_k = X_k. (default) - * 1 = C_k = X_k / V_k - * 2 = C_k = X_k / V_N - */ - int m_formGC; - /** - * m_mm = Number of distinct elements defined in species in this - * phase - */ - int m_mm; - - /** - * Maximum temperature that this phase can accurately describe - * the thermodynamics. - */ - doublereal m_tmin; - - /** - * Minimum temperature that this phase can accurately describe - * the thermodynamics. - */ - doublereal m_tmax; - /** - * Value of the reference pressure for all species in this phase. - * The T dependent polynomials are evaluated at the reference - * pressure. Note, because this is a single value, all species - * are required to have the same reference pressure. - */ - doublereal m_Pref; - - /** - * m_Pcurrent = The current pressure - * Since the density isn't a function of pressure, but only of the - * mole fractions, we need to independently specify the pressure. - * The density variable which is inherited as part of the State class, - * m_dens, is always kept current whenever T, P, or X[] change. - */ - doublereal m_Pcurrent; - - /** - * Species molar volume \f$ m^3 kmol^-1 \f$ - */ - array_fp m_speciesMolarVolume; - - /** - * Value of the temperature at which the thermodynamics functions - * for the reference state of the species were last evaluated. - */ - mutable doublereal m_tlast; - - /** - * Vector containing the species reference enthalpies at T = m_tlast - */ - mutable array_fp m_h0_RT; - - /** - * Vector containing the species reference constant pressure - * heat capacities at T = m_tlast - */ - mutable array_fp m_cp0_R; - - /** - * Vector containing the species reference Gibbs functions - * at T = m_tlast - */ - mutable array_fp m_g0_RT; - - /** - * Vector containing the species reference entropies - * at T = m_tlast - */ - mutable array_fp m_s0_R; - - /** - * Vector containing the species reference exp(-G/RT) functions - * at T = m_tlast - */ - mutable array_fp m_expg0_RT; - - /** - * Vector of potential energies for the species. - */ - mutable array_fp m_pe; - - /** - * Temporary array used in equilibrium calculations - */ - mutable array_fp m_pp; - - mutable vector_fp m_work; - - doublereal m_gap; - doublereal m_emass; - doublereal m_hmass; - - private: - /// @name Utility Functions ------------------------------------------ - //@{ - /** - * This function gets called for every call to functions in this - * class. It checks to see whether the temperature has changed and - * thus the reference thermodynamics functions for all of the species - * must be recalculated. - * If the temperature has changed, the species thermo manager is called - * to recalculate G, Cp, H, and S at the current temperature. - */ - void _updateThermo() const; - - /** - * This internal function adjusts the lengths of arrays - */ - void initLengths(); - - //@} - }; + void initLengths(); + }; } #endif