LatticePhase.cpp
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 #include "config.h"
00015 #ifdef WITH_LATTICE_SOLID
00016 
00017 #ifdef WIN32
00018 #pragma warning(disable:4786)
00019 #pragma warning(disable:4503)
00020 #endif
00021 
00022 #include "ct_defs.h"
00023 #include "mix_defs.h"
00024 #include "LatticePhase.h"
00025 #include "SpeciesThermo.h"
00026 
00027 #include <cmath>
00028 
00029 namespace Cantera {
00030 
00031   
00032   LatticePhase::LatticePhase() :
00033     m_tlast(0.0) 
00034   {
00035   }
00036   
00037   
00038   
00039 
00040 
00041   LatticePhase::LatticePhase(const LatticePhase &right) :
00042     m_tlast(0.0)
00043   {
00044     *this = operator=(right);
00045   }
00046   
00047   
00048   
00049 
00050 
00051   LatticePhase& LatticePhase::operator=(const LatticePhase& right) {
00052     if (&right != this) {
00053       ThermoPhase::operator=(right);
00054       m_mm         = right.m_mm;
00055       m_tmin       = right.m_tmin;
00056       m_tmax       = right.m_tmax;
00057       m_p0         = right.m_p0;
00058       m_tlast      = right.m_tlast;
00059       m_h0_RT      = right.m_h0_RT;
00060       m_cp0_R      = right.m_cp0_R;
00061       m_g0_RT      = right.m_g0_RT;
00062       m_s0_R       = right.m_s0_R;
00063       m_press      = right.m_press;
00064       m_vacancy    = right.m_vacancy;
00065       m_molar_density = right.m_molar_density;
00066     }
00067     return *this;
00068   }
00069   
00070   
00071   LatticePhase::~LatticePhase() {
00072   }
00073   
00074   
00075   
00076 
00077 
00078 
00079 
00080 
00081 
00082   ThermoPhase *LatticePhase::duplMyselfAsThermoPhase() const {
00083     LatticePhase *igp = new LatticePhase(*this);
00084     return (ThermoPhase *) igp;
00085   }
00086   
00087   
00088   doublereal LatticePhase::
00089   enthalpy_mole() const {
00090     doublereal p0 = m_spthermo->refPressure();
00091     return GasConstant * temperature() * 
00092       mean_X(&enthalpy_RT_ref()[0]) 
00093       + (pressure() - p0)/molarDensity();
00094   }
00095 
00096   doublereal LatticePhase::intEnergy_mole() const {
00097     doublereal p0 = m_spthermo->refPressure();
00098     return GasConstant * temperature() * 
00099       mean_X(&enthalpy_RT_ref()[0]) 
00100       - p0/molarDensity();
00101   }
00102 
00103   doublereal LatticePhase::entropy_mole() const {
00104     return GasConstant * (mean_X(&entropy_R_ref()[0]) -
00105                           sum_xlogx());
00106   }
00107 
00108   doublereal LatticePhase::gibbs_mole() const {
00109     return enthalpy_mole() - temperature() * entropy_mole();
00110   }
00111 
00112   doublereal LatticePhase::cp_mole() const {
00113     return GasConstant * mean_X(&cp_R_ref()[0]);
00114   }
00115 
00116   doublereal LatticePhase::cv_mole() const {
00117     return cp_mole();
00118   }
00119   
00120   
00121 
00122   void LatticePhase::setPressure(doublereal p) {
00123     m_press = p;
00124     setMolarDensity(m_molar_density);
00125   }
00126 
00127   void LatticePhase::getActivityConcentrations(doublereal* c) const {
00128     getMoleFractions(c);
00129   }
00130 
00131   void LatticePhase::getActivityCoefficients(doublereal* ac) const {
00132     for (int k = 0; k < m_kk; k++) {
00133       ac[k] = 1.0;
00134     }
00135   }
00136 
00137   doublereal LatticePhase::standardConcentration(int k) const {
00138     return 1.0;
00139   }
00140 
00141   doublereal LatticePhase::logStandardConc(int k) const {
00142     return 0.0;
00143   }
00144 
00145   void LatticePhase::getChemPotentials(doublereal* mu) const {
00146     doublereal vdp = ((pressure() - m_spthermo->refPressure())/
00147                       molarDensity());
00148     doublereal xx;
00149     doublereal rt = temperature() * GasConstant;
00150     const array_fp& g_RT = gibbs_RT_ref();
00151     for (int k = 0; k < m_kk; k++) {
00152       xx = fmaxx(SmallNumber, moleFraction(k));
00153       mu[k] = rt*(g_RT[k] + log(xx)) + vdp;
00154     }
00155   }
00156 
00157   void LatticePhase::getPartialMolarVolumes(doublereal* vbar) const {
00158     getStandardVolumes(vbar); 
00159   }
00160 
00161   void LatticePhase::getStandardChemPotentials(doublereal* mu0) const {
00162     const array_fp& gibbsrt = gibbs_RT_ref();
00163     scale(gibbsrt.begin(), gibbsrt.end(), mu0, _RT());
00164   }
00165   
00166   void LatticePhase::getPureGibbs(doublereal* gpure) const {
00167     const array_fp& gibbsrt = gibbs_RT_ref();
00168     scale(gibbsrt.begin(), gibbsrt.end(), gpure, _RT());
00169   }
00170 
00171   void LatticePhase::getEnthalpy_RT(doublereal* hrt) const {
00172     const array_fp& _h = enthalpy_RT_ref();
00173     std::copy(_h.begin(), _h.end(), hrt);
00174     doublereal tmp = (pressure() - m_p0) / (molarDensity() * GasConstant * temperature());
00175     for (int k = 0; k < m_kk; k++) {
00176       hrt[k] += tmp;
00177     }
00178   }
00179 
00180   void LatticePhase::getEntropy_R(doublereal* sr) const {
00181     const array_fp& _s = entropy_R_ref();
00182     std::copy(_s.begin(), _s.end(), sr);
00183   }
00184 
00185   void LatticePhase::getGibbs_RT(doublereal* grt) const {
00186     const array_fp& gibbsrt = gibbs_RT_ref();
00187     std::copy(gibbsrt.begin(), gibbsrt.end(), grt);
00188   }
00189 
00190   void LatticePhase::getCp_R(doublereal* cpr) const {
00191     const array_fp& _cpr = cp_R_ref();
00192     std::copy(_cpr.begin(), _cpr.end(), cpr);
00193   }
00194 
00195   void LatticePhase::getStandardVolumes(doublereal* vbar) const {
00196     doublereal vv = 1.0/m_molar_density;
00197     for (int k = 0; k < m_kk; k++) {
00198       vbar[k] = vv;
00199     }
00200   }
00201 
00202   void LatticePhase::initThermo() {
00203     m_kk = nSpecies();
00204     m_mm = nElements();
00205     doublereal tmin = m_spthermo->minTemp();
00206     doublereal tmax = m_spthermo->maxTemp();
00207     if (tmin > 0.0) m_tmin = tmin;
00208     if (tmax > 0.0) m_tmax = tmax;
00209     m_p0 = refPressure();
00210 
00211     int leng = m_kk;
00212     m_h0_RT.resize(leng);
00213     m_g0_RT.resize(leng);
00214     m_cp0_R.resize(leng);
00215     m_s0_R.resize(leng);
00216     setMolarDensity(m_molar_density);
00217   }
00218 
00219 
00220   void LatticePhase::_updateThermo() const {
00221     doublereal tnow = temperature();
00222     if (fabs(molarDensity() - m_molar_density)/m_molar_density > 0.0001) {
00223       throw CanteraError("_updateThermo","molar density changed from "
00224                          +fp2str(m_molar_density)+" to "+fp2str(molarDensity()));
00225     }
00226     if (m_tlast != tnow) {
00227       m_spthermo->update(tnow, &m_cp0_R[0], &m_h0_RT[0], 
00228                          &m_s0_R[0]);
00229       m_tlast = tnow;
00230       int k;
00231       for (k = 0; k < m_kk; k++) {
00232         m_g0_RT[k] = m_h0_RT[k] - m_s0_R[k];
00233       }
00234       m_tlast = tnow;
00235     }
00236   }
00237 
00238   void LatticePhase::setParameters(int n, doublereal* const c) {
00239     m_molar_density = c[0];
00240     setMolarDensity(m_molar_density);
00241   }
00242 
00243   void LatticePhase::getParameters(int &n, doublereal * const c) const {
00244     double d = molarDensity();
00245     c[0] = d;
00246     n = 1;
00247   }
00248 
00249   void LatticePhase::setParametersFromXML(const XML_Node& eosdata) {
00250     eosdata._require("model","Lattice");
00251     m_molar_density = getFloat(eosdata, "site_density", "toSI");
00252     m_vacancy = getChildValue(eosdata, "vacancy_species");
00253   }
00254 }
00255 
00256 #endif