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