• Main Page
  • Classes
  • Files
  • File List

SilicateLiq.h

00001 /* SilicateLiq class header file
00002  * 
00003  * C++ wrapper by Victor Kress
00004  * $Id: SilicateLiq.h,v 1.10 2007/08/05 04:43:17 ghiorso Exp $
00005  * NEEDS TO BE CONVERTED TO MELTS PHASE
00006  */
00007 #ifndef SILICATE_LIQ_H
00008 #define SILICATE_LIQ_H
00009 
00010 #include "Solution.h"
00011 
00012 /*
00013   Structures from silmin.h
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 /* octal for binary 00000000000000000001 */
00036 #define SECOND      00000002 /* octal for binary 00000000000000000010 */
00037 #define THIRD       00000004 /* octal for binary 00000000000000000100 */
00038 #define FOURTH      00000010 /* octal for binary 00000000000000001000 */
00039 #define FIFTH       00000020 /* octal for binary 00000000000000010000 */
00040 #define SIXTH       00000040 /* octal for binary 00000000000000100000 */
00041 #define SEVENTH     00000100 /* octal for binary 00000000000001000000 */
00042 #define EIGHTH      00000200 /* octal for binary 00000000000010000000 */
00043 #define NINTH       00000400 /* octal for binary 00000000000100000000 */
00044 #define TENTH       00001000 /* octal for binary 00000000001000000000 */
00045 #define ELEVENTH    00002000 /* octal for binary 00000000010000000000 */
00046 #define TWELFTH     00004000 /* octal for binary 00000000100000000000 */
00047 #define THIRTEENTH  00010000 /* octal for binary 00000001000000000000 */
00048 #define FOURTEENTH  00020000 /* octal for binary 00000010000000000000 */
00049 #define FIFTEENTH   00040000 /* octal for binary 00000100000000000000 */
00050 #define SIXTEENTH   00100000 /* octal for binary 00001000000000000000 */
00051 #define SEVENTEENTH 00200000 /* octal for binary 00010000000000000000 */
00052 #define EIGHTEENTH  00400000 /* octal for binary 00100000000000000000 */
00053 #define NINETEENTH  01000000 /* octal for binary 01000000000000000000 */
00054 #define TWENTIETH   02000000 /* octal for binary 10000000000000000000 */
00055 
00056 #define R       8.3143   /* gas constant (J/K)                        */
00057 #define TR      298.15   /* reference temperature (K)                 */
00058 #define PR      1.0      /* reference pressure (bars)                 */
00059 
00060 typedef struct _thermoRef {
00061   double h, s, v;        /* enthalpy (J), entropy (J/K), volume (J/bar) */
00062   double k0, k1, k2, k3; /* Berman and Brown (1985) Cp parameters       */
00063   double v1, v2, v3, v4; /* Berman (1988) volume functions              */
00064   double Tt, deltah;     /* Transition temperature (K) and enthalpy (J) */
00065   double l1, l2;         /* lambda Cp funcs (J/K)**1/2                  */
00066 } ThermoRef;
00067 
00068 typedef struct _thermoLiq {
00069   double v, dvdt, dvdp;  /* volume of liquid (0 K), and T,P derivatives   */
00070   double d2vdtp, d2vdp2; /* second derivatives of volume of liquid        */
00071   double tfus, sfus, cp; /* T fusion (K), S fusion (J/K), liquid Cp (J/K) */
00072   double tglass;         /* T glass transition (K)                        */
00073 } ThermoLiq;
00074 
00075 typedef struct _thermoData {
00076   double g, h, s, v, cp; /* gibbs energy (J), enthalpy (J), entropy (J/K) */
00077                          /* volume (J/bar) and heat capacity (J/K)        */
00078   double dcpdt, dvdt, dvdp;       /* various T, P derivatives */
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;   /* label for oxide compositional variables            */
00088   int        type;     /* FEO, FE2O3, OTHER oxide                            */
00089   double     coeff;    /* coefficient if OTHER, for ferrous/ferric calc      */
00090   double     mw;       /* molecular weights of oxides                        */
00091   double     *oxToLiq; /* pointer to an array of length [nc] which converts 
00092                           moles of oxides to moles of liquid components      */
00093   int        *oxToElm; /* pointer to an array of length [106] which converts 
00094                           moles of oxides to moles of elements               */
00095 } BulkSystem;
00096 extern BulkSystem *bulkSystem;
00097 extern int nc;
00098 
00099 typedef struct _liquid {
00100   char       *label;   /* label for the liquid component                    */
00101   double     *liqToOx; /* pointer to an array of length [nc] which converts 
00102                           component moles to moles of oxides                */
00103   ThermoRef  ref;      /* reference properties (solid) at TR, PR            */
00104   ThermoLiq  liq;      /* reference properties (liquid)                     */
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;   /* label for solid phase or solid phase components   */ 
00115   int        type;     /* PHASE or COMPONENT                                */
00116   char       *formula; /* character string formula                          */
00117   double     *solToOx; /* pointer to an array of length [nc] which converts
00118                           COMPONENT moles to moles of oxides                */
00119   double     *solToLiq;/* pointer to an array of length [nc] which converts
00120                           COMPONENT moles to moles of liquid components     */
00121   double     mw;       /* molecular weight pure phase or component          */
00122   /* Defined if type is COMPONENT, else empty                               */
00123   ThermoRef  ref;      /* ref thermodynamic data, constants at TR, PR       */
00124   int        na;       /* if type == PHASE; number of endmember components  */
00125   int        nr;       /* if type == PHASE; number of independent variables */
00126   /* Defined if type is PHASE, else pointers to void. common arguments:
00127      mask  -  bitwise mask for selecting input/output
00128      t     -  Temperature (K)
00129      p     -  Pressure (bars)
00130      *x    -  (pointer to x[]) Array of independent compositional variables
00131   */
00132   /* returns TRUE if values are correct/within bounds, else returns FALSE    */
00133   int (*test) (int mask, double t, double p,
00134      int    na,       /* # of components in solution     BINARY MASK: 000001 */
00135      int    nr,       /* # of indep compos variables     BINARY MASK: 000010 */
00136      char **names,    /* names compon, expected order    BINARY MASK: 000100 */
00137      char **formulas, /* form of compon, expected order  BINARY MASK: 001000 */
00138      double *r,       /* indep compositional variables   BINARY MASK: 010000 */
00139      double *m        /* moles of endmember components   BINARY MASK: 100000 */
00140   );           /* r[] and m[] are tested for bound constraints               */
00141   void (*convert) (int inpMask, int outMask, double t, double p,
00142      double *e,     /* moles of elements               BINARY MASK: 00000001 */
00143      double *m,     /* moles of endmember components   BINARY MASK: 00000010 */
00144      double *r,     /* indep compositional variables   BINARY MASK: 00000100 */
00145      double *x,     /* mole fractions of endmember cmp BINARY MASK: 00001000 */
00146      double **dm,   /* matrix[i][j]: dr[i]/dm[j]       BINARY MASK: 00010000 */
00147      double ***d2m, /* cube[i][j][k]: d2r[i]/dm[j]dm[k]BINARY MASK: 00100000 */
00148      double **dr,   /* matrix[i][j]: dx[i]/dr[j]       BINARY MASK: 01000000 */
00149      double ****d3m /* 4d[i][j][k][l]: d3r[i]/dm[j]dm[k]dm[l] MASK: 10000000 */
00150   );
00151   void (*activity) (int mask, double t, double p, double *x,
00152      double *a,   /* (pointer to a[]) activities           BINARY MASK: 0001 */
00153      double *mu,  /* (pointer to mu[]) chemical potentials BINARY MASK: 0010 */
00154      double **dx  /* (pointer to dx[][]) d(a[])/d(x[])     BINARY MASK: 0100 */
00155   );            /* exclusion applied to activities if:     BINARY MASK: 1000 */
00156   void (*gmix) (int mask, double t, double p, double *x,
00157      double *gmix,  /* Gibbs energy of mixing              BINARY MASK: 0001 */
00158      double *dx,    /* (pointer to dx[]) d(g)/d(x[])       BINARY MASK: 0010 */
00159      double **dx2,  /* (pointer to dx2[][]) d2(g)/d(x[])2  BINARY MASK: 0100 */
00160      double ***dx3  /* (pointer to dx3[][][]) d3(g)/d(x[])3BINARY MASK: 1000 */
00161   );
00162   void (*hmix) (int mask, double t, double p, double *x,
00163      double *hmix  /* Enthalpy of mixing                      BINARY MASK: 1 */
00164   );
00165   void (*smix) (int mask, double t, double p, double *x,
00166      double *smix,  /* Entropy of mixing                    BINARY MASK: 001 */
00167      double *dx,    /* (pointer to dx[]) d(s)/d(x[])        BINARY MASK: 010 */
00168      double **dx2   /* (pointer to dx2[][]) d2(s)/d(x[])2   BINARY MASK: 100 */
00169   );
00170   void (*cpmix) (int mask, double t, double p, double *x,
00171      double *cpmix, /* Heat capacity of mixing              BINARY MASK: 001 */
00172      double *dt,    /* d(cp)/d(t)                           BINARY MASK: 010 */
00173      double *dx     /* d(cp)/d(x[])                         BINARY MASK: 100 */
00174   );
00175   void (*vmix) (int mask, double t, double p, double *x,
00176      double *vmix, /* Volume of mixing               BINARY MASK: 0000000001 */
00177      double *dx,   /* (pointer to dx[]) d(v)/d(x[])  BINARY MASK: 0000000010 */
00178      double **dx2, /* (point dx2[][]) d(v)/d(x[])2   BINARY MASK: 0000000100 */
00179      double *dt,   /* d(v)/d(t)                      BINARY MASK: 0000001000 */
00180      double *dp,   /* d(v)/d(p)                      BINARY MASK: 0000010000 */
00181      double *dt2,  /* d2(v)/d(t)2                    BINARY MASK: 0000100000 */
00182      double *dtdp, /* d2(v)/d(t)d(p)                 BINARY MASK: 0001000000 */
00183      double *dp2,  /* d2(v)/d(p)2                    BINARY MASK: 0010000000 */
00184      double *dxdt, /* d2(v)/d(x[])d(t)               BINARY MASK: 0100000000 */
00185      double *dxdp  /* d2(v)/d(x[])d(p)               BINARY MASK: 1000000000 */
00186   );
00187   void (*display) (int mask, double t, double p, double *x,
00188      char **formula /* Mineral formula for interface display  BINARY MASK: 1 */
00189   );
00190 } Solids;
00191 extern Solids *solids;
00192 extern int npc;
00193 
00194 typedef struct _oxygen {
00195   double     *liqToOx; /* pointer to an array of length [nc] which converts
00196                           moles of liquid components to moles of oxygen      */
00197   double     *solToOx; /* pointer to an array of length [npc] which converts
00198                           moles of solid phase/components to moles of oxygen */
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   // persistent phase properties //////
00243   virtual double getMW(int i);                                    // overrides Solution
00245   virtual const char *getCompName(int i);                         // overrides Solution
00247   virtual const char *getCompFormula(int i);                      // overrides Solution
00249   virtual int getGenericNcomp(void);                              // overrides Phase
00251   virtual char *getGenericCompFormula(int i);                     // overrides Phase
00252 
00253   // setting methods ///////////////////
00255   virtual void setTk(double ltk);                                 // overrides Solution  
00257   virtual void setPa(double lpa);                                 // overrides Solution
00259   virtual void setMoles(double m) throw(PhaseError *);            // overrides Solution
00261   virtual void setMass(double grams);                             // overrides Solution
00263   virtual void setComps(double *rawcomps);                        // overrides Solution
00265   virtual void setGenericCompWts(double *wt) throw(PhaseError *); // overrides Phase
00266 
00267   // getting methods ////////////////////
00269   virtual double getMass();                                       // overrides Solution
00271   virtual void getGenericCompWts(double *wt);                     // overrides Phase
00273   virtual double getMu0(int ispec);                               // overrides Solution  
00275   virtual double getMu(int i);                                    // overrides Solution
00277   virtual double getdMudX(int m,int p);                           // overrides Solution
00279   virtual double getGibbs();                                      // overrides Solution
00281   virtual double getGmix();                                       // overrides Solution
00283   virtual double getEnthalpy();                                   // overrides Solution
00285   virtual double getHmix();                                       // overrides Phase
00287   virtual double getEntropy();                                    // overrides Solution
00289   virtual double getSmix();                                       // overrides Solution
00291   virtual double getCp();                                         // overrides Solution
00293   virtual double getCpmix();                                      // overrides Phase
00295   virtual double getdCpdT();                                      // overrides Solution
00297   virtual double getVolume();                                     // overrides Solution
00299   virtual double getVmix();                                       // overrides Phase
00301   virtual double getdVdT();                                       // overrides Solution
00303   virtual double getdVdP();                                       // overrides Solution
00305   virtual double getd2VdT2();                                     // overrides Solution
00307   virtual double getd2VdTdP();                                    // overrides Solution
00309   virtual double getd2VdP2();                                     // overrides Solution
00310   
00311   
00313   virtual void setlogfo2(double f);  
00315   virtual void setlogfo2(); // turns off redox imposition  
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);  // conversion routine  
00330   virtual void oxidesToComps(double *oxides);  // conversion routine  
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 

Generated on Fri Aug 6 2010 13:30:29 for phases by  doxygen 1.7.1