00001 
00002 
00003 
00004 
00005 
00006 
00007 #ifndef SILICATE_LIQ_H
00008 #define SILICATE_LIQ_H
00009 
00010 #include "Solution.h"
00011 
00012 
00013 
00014 
00015 
00016 void conLiq  (int inpMask, int outMask, double t, double p, double *o, 
00017               double *m, double *r, double *x, double **dm, double ***dm2,
00018               double *logfo2);
00019 int testLiq (int mask, double t, double p, int na, int nr, char **names, 
00020              char **formulas, double *r, double *m);
00021 void dispLiq (int mask, double t, double p, double *x, char **formula);
00022 void actLiq  (int mask, double t, double p, double *x, double *a, 
00023               double *mu, double **dx);
00024 void gmixLiq (int mask, double t, double P, double *x, double *gmix, 
00025               double *dx, double **dx2);
00026 void hmixLiq (int mask, double t, double P, double *x, double *hmix);
00027 void smixLiq (int mask, double t, double P, double *x, double *smix, 
00028               double *dx, double **dx2);
00029 void cpmixLiq(int mask, double t, double P, double *x, double *cpmix,
00030               double *dt, double *dx);
00031 void vmixLiq (int mask, double t, double P, double *x, double *vmix,
00032               double *dx, double **dx2, double *dt, double *dp, double *dt2, 
00033               double *dtdp, double *dp2, double *dxdt, double *dxdp);
00034 
00035 #define FIRST       00000001 
00036 #define SECOND      00000002 
00037 #define THIRD       00000004 
00038 #define FOURTH      00000010 
00039 #define FIFTH       00000020 
00040 #define SIXTH       00000040 
00041 #define SEVENTH     00000100 
00042 #define EIGHTH      00000200 
00043 #define NINTH       00000400 
00044 #define TENTH       00001000 
00045 #define ELEVENTH    00002000 
00046 #define TWELFTH     00004000 
00047 #define THIRTEENTH  00010000 
00048 #define FOURTEENTH  00020000 
00049 #define FIFTEENTH   00040000 
00050 #define SIXTEENTH   00100000 
00051 #define SEVENTEENTH 00200000 
00052 #define EIGHTEENTH  00400000 
00053 #define NINETEENTH  01000000 
00054 #define TWENTIETH   02000000 
00055 
00056 #define R       8.3143   
00057 #define TR      298.15   
00058 #define PR      1.0      
00059 
00060 typedef struct _thermoRef {
00061   double h, s, v;        
00062   double k0, k1, k2, k3; 
00063   double v1, v2, v3, v4; 
00064   double Tt, deltah;     
00065   double l1, l2;         
00066 } ThermoRef;
00067 
00068 typedef struct _thermoLiq {
00069   double v, dvdt, dvdp;  
00070   double d2vdtp, d2vdp2; 
00071   double tfus, sfus, cp; 
00072   double tglass;         
00073 } ThermoLiq;
00074 
00075 typedef struct _thermoData {
00076   double g, h, s, v, cp; 
00077                          
00078   double dcpdt, dvdt, dvdp;       
00079   double d2vdt2, d2vdp2, d2vdtdp;
00080 } ThermoData;
00081 
00082 #define FEO   1
00083 #define FE2O3 2
00084 #define OTHER 0
00085 
00086 typedef struct _bulkSystem {
00087   char       *label;   
00088   int        type;     
00089   double     coeff;    
00090   double     mw;       
00091   double     *oxToLiq; 
00092 
00093   int        *oxToElm; 
00094 
00095 } BulkSystem;
00096 extern BulkSystem *bulkSystem;
00097 extern int nc;
00098 
00099 typedef struct _liquid {
00100   char       *label;   
00101   double     *liqToOx; 
00102 
00103   ThermoRef  ref;      
00104   ThermoLiq  liq;      
00105 } Liquid;
00106 extern Liquid *liquid;
00107 extern int nlc;
00108 extern int nls;
00109 
00110 #define PHASE     1
00111 #define COMPONENT 0
00112 
00113 typedef struct _solids {
00114   char       *label;    
00115   int        type;     
00116   char       *formula; 
00117   double     *solToOx; 
00118 
00119   double     *solToLiq;
00120 
00121   double     mw;       
00122   
00123   ThermoRef  ref;      
00124   int        na;       
00125   int        nr;       
00126   
00127 
00128 
00129 
00130 
00131 
00132   
00133   int (*test) (int mask, double t, double p,
00134      int    na,       
00135      int    nr,       
00136      char **names,    
00137      char **formulas, 
00138      double *r,       
00139      double *m        
00140   );           
00141   void (*convert) (int inpMask, int outMask, double t, double p,
00142      double *e,     
00143      double *m,     
00144      double *r,     
00145      double *x,     
00146      double **dm,   
00147      double ***d2m, 
00148      double **dr,   
00149      double ****d3m 
00150   );
00151   void (*activity) (int mask, double t, double p, double *x,
00152      double *a,   
00153      double *mu,  
00154      double **dx  
00155   );            
00156   void (*gmix) (int mask, double t, double p, double *x,
00157      double *gmix,  
00158      double *dx,    
00159      double **dx2,  
00160      double ***dx3  
00161   );
00162   void (*hmix) (int mask, double t, double p, double *x,
00163      double *hmix  
00164   );
00165   void (*smix) (int mask, double t, double p, double *x,
00166      double *smix,  
00167      double *dx,    
00168      double **dx2   
00169   );
00170   void (*cpmix) (int mask, double t, double p, double *x,
00171      double *cpmix, 
00172      double *dt,    
00173      double *dx     
00174   );
00175   void (*vmix) (int mask, double t, double p, double *x,
00176      double *vmix, 
00177      double *dx,   
00178      double **dx2, 
00179      double *dt,   
00180      double *dp,   
00181      double *dt2,  
00182      double *dtdp, 
00183      double *dp2,  
00184      double *dxdt, 
00185      double *dxdp  
00186   );
00187   void (*display) (int mask, double t, double p, double *x,
00188      char **formula 
00189   );
00190 } Solids;
00191 extern Solids *solids;
00192 extern int npc;
00193 
00194 typedef struct _oxygen {
00195   double     *liqToOx; 
00196 
00197   double     *solToOx; 
00198 
00199 } Oxygen;
00200 
00201 extern Oxygen oxygen;
00202 
00203 #define MODE_MELTS        1
00204 #define MODE_pMELTS       2
00205 #define MODE_UNSUPPORTED  0
00206 
00207 extern int calculationMode; 
00208 
00209 void gibbs(double t, double p, char *name, ThermoRef *phase, ThermoLiq *liquid, ThermoData *fusion, ThermoData *result);
00210 void InitComputeDataStruct(void);
00211 
00234 class SilicateLiq: public Solution {
00235  public:
00237   SilicateLiq();
00239   virtual ~SilicateLiq();
00240   
00241   
00243   virtual double getMW(int i);                                    
00245   virtual const char *getCompName(int i);                         
00247   virtual const char *getCompFormula(int i);                      
00249   virtual int getGenericNcomp(void);                              
00251   virtual char *getGenericCompFormula(int i);                     
00252 
00253   
00255   virtual void setTk(double ltk);                                 
00257   virtual void setPa(double lpa);                                 
00259   virtual void setMoles(double m) throw(PhaseError *);            
00261   virtual void setMass(double grams);                             
00263   virtual void setComps(double *rawcomps);                        
00265   virtual void setGenericCompWts(double *wt) throw(PhaseError *); 
00266 
00267   
00269   virtual double getMass();                                       
00271   virtual void getGenericCompWts(double *wt);                     
00273   virtual double getMu0(int ispec);                               
00275   virtual double getMu(int i);                                    
00277   virtual double getdMudX(int m,int p);                           
00279   virtual double getGibbs();                                      
00281   virtual double getGmix();                                       
00283   virtual double getEnthalpy();                                   
00285   virtual double getHmix();                                       
00287   virtual double getEntropy();                                    
00289   virtual double getSmix();                                       
00291   virtual double getCp();                                         
00293   virtual double getCpmix();                                      
00295   virtual double getdCpdT();                                      
00297   virtual double getVolume();                                     
00299   virtual double getVmix();                                       
00301   virtual double getdVdT();                                       
00303   virtual double getdVdP();                                       
00305   virtual double getd2VdT2();                                     
00307   virtual double getd2VdTdP();                                    
00309   virtual double getd2VdP2();                                     
00310   
00311   
00313   virtual void setlogfo2(double f);  
00315   virtual void setlogfo2(); 
00317   virtual double getlogfo2();
00318   
00320   virtual void setWtOx(double *oxides);  
00322   virtual void getWtOx(double *oxides);  
00324   virtual void oxWtToMol(double *oxides);  
00326   virtual void oxMolToWt(double *oxides);  
00328   virtual void compsToOxides(double *oxides);  
00330   virtual void oxidesToComps(double *oxides);  
00331   
00332  private:
00334   int updateMu;  
00336   int imposeRedox;     
00338   void setRedox();     
00340   void calcMu();       
00342   double *mu;          
00344   double **dmudx;      
00346   double **dmudr;      
00348   double pb;           
00350   double logfo2;
00352   double *rx;  
00354   double **rxJ;
00356   static int structInitialize;  
00357   
00358  protected:
00360   void setComps();     
00362   void init();
00364   ThermoData *liquidFus;
00366   ThermoData *liquidCur;
00368   double totalMoles;
00369 };
00370     
00371 #endif  
00372 
00373 
00374 
00375