mirror of
https://git.gfz-potsdam.de/naaice/iphreeqc.git
synced 2025-12-15 16:18:22 +01:00
8b97f7b5 Merge commit 'a11ac56700283d1570e045d3fc791f56fef913dd' a11ac567 Squashed 'phreeqcpp/' changes from 83843db..50e4d89 git-subtree-dir: src git-subtree-split: 8b97f7b51ed6af2d64b5df31c0d15c16290e8337
1674 lines
37 KiB
C++
1674 lines
37 KiB
C++
#ifndef _INC_GLOBAL_STRUCTURES_H
|
|
#define _INC_GLOBAL_STRUCTURES_H
|
|
#include "Surface.h"
|
|
#include "GasPhase.h"
|
|
/* ----------------------------------------------------------------------
|
|
* #define DEFINITIONS
|
|
* ---------------------------------------------------------------------- */
|
|
#if !defined(NAN)
|
|
# if defined(_MSC_VER) && (_MSC_VER <= 1700) // VS2012
|
|
// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170
|
|
# include <limits>
|
|
# define NAN std::numeric_limits<double>::signaling_NaN()
|
|
# else
|
|
# define NAN nan("1")
|
|
# endif
|
|
#endif
|
|
#define MISSING -9999.999
|
|
#include "NA.h" /* NA = not available */
|
|
|
|
#define F_C_MOL 96493.5 /* C/mol or joule/volt-eq */
|
|
#define F_KJ_V_EQ 96.4935 /* kJ/volt-eq */
|
|
#define F_KCAL_V_EQ 23.0623 /* kcal/volt-eq */
|
|
#define R_LITER_ATM 0.0820597 /* L-atm/deg-mol */
|
|
#define R_KCAL_DEG_MOL 0.00198726 /* kcal/deg-mol */
|
|
#define R_KJ_DEG_MOL 0.00831470 /* kJ/deg-mol */
|
|
#define EPSILON 78.5 /* dialectric constant, dimensionless. Is calculated as eps_r(P, T) in calc_dielectrics. Update the code?? */
|
|
#define EPSILON_ZERO 8.854e-12 /* permittivity of free space, C/V-m = C**2/m-J */
|
|
#define JOULES_PER_CALORIE 4.1840
|
|
#define PASCAL_PER_ATM 1.01325E5 /* conversion from atm to Pa */
|
|
#define AVOGADRO 6.02252e23 /* atoms / mole */
|
|
#define pi 3.14159265358979
|
|
#define AH2O_FACTOR 0.017
|
|
|
|
#define TRUE 1
|
|
#define FALSE 0
|
|
#define OK 1
|
|
#define ERROR 0
|
|
#define STOP 1
|
|
#define CONTINUE 0
|
|
|
|
#define OPTION_EOF -1
|
|
#define OPTION_KEYWORD -2
|
|
#define OPTION_ERROR -3
|
|
#define OPTION_DEFAULT -4
|
|
#define OPT_1 -5
|
|
|
|
#define DISP 2
|
|
#define STAG 3
|
|
#define NOMIX 4
|
|
#define MIX_BS 5 // mix boundary solutions in electromigration
|
|
|
|
#define CONVERGED 2
|
|
#define MASS_BALANCE 3
|
|
|
|
#define REWRITE 2
|
|
#define INIT -1
|
|
|
|
/* check_line values, plus EMPTY, EOF, OK */
|
|
#define KEYWORD 3
|
|
|
|
/* copy_token values */
|
|
#define EMPTY 2
|
|
#define UPPER 4
|
|
#define LOWER 5
|
|
#define DIGIT 6
|
|
#define UNKNOWN 7
|
|
#define OPTION 8
|
|
|
|
/* species types */
|
|
#define AQ 0
|
|
#define HPLUS 1
|
|
#define H2O 2
|
|
#define EMINUS 3
|
|
#define SOLID 4
|
|
#define EX 5
|
|
#define SURF 6
|
|
#define SURF_PSI 7
|
|
#define SURF_PSI1 8
|
|
#define SURF_PSI2 9
|
|
|
|
/* unknown types */
|
|
#define MB 10
|
|
#define ALK 11
|
|
#define CB 12
|
|
#define SOLUTION_PHASE_BOUNDARY 13
|
|
#define MU 14
|
|
#define AH2O 15
|
|
#define MH 16
|
|
#define MH2O 17
|
|
#define PP 18
|
|
#define EXCH 19
|
|
#define SURFACE 20
|
|
#define SURFACE_CB 21
|
|
#define SURFACE_CB1 22
|
|
#define SURFACE_CB2 23
|
|
#define GAS_MOLES 24
|
|
#define SS_MOLES 25
|
|
#define PITZER_GAMMA 26
|
|
#define SLACK 28
|
|
/* state */
|
|
#define INITIALIZE 0
|
|
#define INITIAL_SOLUTION 1
|
|
#define INITIAL_EXCHANGE 2
|
|
#define INITIAL_SURFACE 3
|
|
#define INITIAL_GAS_PHASE 4
|
|
#define REACTION 5
|
|
#define INVERSE 6
|
|
#define ADVECTION 7
|
|
#define TRANSPORT 8
|
|
#define PHAST 9
|
|
|
|
/* constraints in mass balance */
|
|
#define EITHER 0
|
|
#define DISSOLVE 1
|
|
#define PRECIPITATE -1
|
|
|
|
/* gas phase type */
|
|
#define PRESSURE 1
|
|
#define VOLUME 2
|
|
|
|
#define MAX_PP_ASSEMBLAGE 10 /* default estimate of the number of phase assemblages */
|
|
#define MAX_ADD_EQUATIONS 20 /* maximum number of equations added together to reduce eqn to
|
|
master species */
|
|
#define MAX_ELEMENTS 50 /* default estimate of the number of elements */
|
|
#define MAX_LENGTH 256 /* maximum number of characters component name */
|
|
#define MAX_LINE 4096 /* estimate of maximum line length */
|
|
#define MAX_MASS_BALANCE 10 /* initial guess of number mass balance equations for a solution */
|
|
#define MAX_MASTER 50 /* default estimate of the number of master species */
|
|
#define MAX_ELTS 15 /* default estimate for maximum number of times elements occur in
|
|
an equation */
|
|
#define MAX_PHASES 500 /* initial guess of number of phases defined */
|
|
#define MAX_S 500 /* default estimate for maximum number of species in aqueous model */
|
|
#define MAX_SUM_JACOB0 50 /* list used to calculate jacobian */
|
|
#define MAX_SUM_JACOB1 500 /* list used to calculate jacobian */
|
|
#define MAX_SUM_JACOB2 500 /* list used to calculate jacobian */
|
|
#define MAX_SUM_MB 500 /* list used to calculate mass balance sums */
|
|
#define MAX_TRXN 16 /* default estimate for maximum number of components in an eqn */
|
|
#define MAX_UNKNOWNS 15 /* default estimate for maximum number of unknowns in model */
|
|
#define TOL 1e-9 /* tolerance for comparisons of double numbers */
|
|
#define MAX_LM 3.0 /* maximum log molality allowed in intermediate iterations */
|
|
#define MAX_M 1000.0
|
|
#ifdef USE_DECIMAL128
|
|
// #define MIN_LM -80.0 /* minimum log molality allowed before molality set to zero */
|
|
// #define LOG_ZERO_MOLALITY -80 /* molalities <= LOG_ZERO_MOLALITY are considered equal to zero */
|
|
// #define MIN_TOTAL 1e-60
|
|
// #define MIN_TOTAL_SS MIN_TOTAL/100
|
|
// #define MIN_RELATED_SURFACE MIN_TOTAL*100
|
|
// #define MIN_RELATED_LOG_ACTIVITY -60
|
|
#else
|
|
// #define MIN_LM -30.0 /* minimum log molality allowed before molality set to zero */
|
|
// #define LOG_ZERO_MOLALITY -30 /* molalities <= LOG_ZERO_MOLALITY are considered equal to zero */
|
|
// #define MIN_TOTAL 1e-25
|
|
// #define MIN_TOTAL_SS MIN_TOTAL/100
|
|
// #define MIN_RELATED_SURFACE MIN_TOTAL*100
|
|
// #define MIN_RELATED_LOG_ACTIVITY -30
|
|
#endif
|
|
#define REF_PRES_PASCAL 1.01325E5 /* Reference pressure: 1 atm */
|
|
#define MAX_P_NONLLNL 1500.0
|
|
|
|
//
|
|
// Typedefs and structure definitions
|
|
//
|
|
typedef enum { kcal, cal, kjoules, joules } DELTA_H_UNIT;
|
|
typedef enum { cm3_per_mol, dm3_per_mol, m3_per_mol } DELTA_V_UNIT;
|
|
enum entity_type
|
|
{ Solution, Reaction, Exchange, Surface, Gas_phase, Pure_phase, Ss_phase,
|
|
Kinetics, Mix, Temperature, Pressure, UnKnown
|
|
};
|
|
|
|
typedef enum {
|
|
logK_T0,
|
|
delta_h,
|
|
T_A1,
|
|
T_A2,
|
|
T_A3,
|
|
T_A4,
|
|
T_A5,
|
|
T_A6,
|
|
delta_v, /* set in calc_delta_v: calculated molar volume-change of the reaction */
|
|
vm_tc, /* set in calc_vm: calculated molal volume of the species at tc */
|
|
vm0, /* read: molar volume of a phase */
|
|
vma1, vma2, vma3, vma4, /* read: a1..a4 from supcrt, see calc_vm */
|
|
wref, /* from supcrt */
|
|
b_Av, /* b in z^2 * A_v * log(1 + b * I^0.5) / (2 * b) */
|
|
vmi1, vmi2, vmi3, vmi4, /* ionic strength terms: (i1 + i2/(TK - 228) + i3 * (TK - 228) ) * I^i4 */
|
|
MAX_LOG_K_INDICES /* Keep this definition at the end of the enum */
|
|
} LOG_K_INDICES;
|
|
|
|
typedef struct PHRQMemHeader
|
|
{
|
|
struct PHRQMemHeader *pNext; /* memory allocated just after this one */
|
|
struct PHRQMemHeader *pPrev; /* memory allocated just prior to this one */
|
|
size_t size; /* memory request + sizeof(PHRQMemHeader) */
|
|
#if !defined(NDEBUG)
|
|
char *szFileName; /* file name */
|
|
int nLine; /* line number */
|
|
int dummy; /* alignment */
|
|
#endif
|
|
} PHRQMemHeader;
|
|
|
|
struct Change_Surf
|
|
{
|
|
const char *comp_name;
|
|
LDBLE fraction;
|
|
const char *new_comp_name;
|
|
LDBLE new_Dw;
|
|
int cell_no;
|
|
int next;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* CReaction
|
|
*---------------------------------------------------------------------- */
|
|
class rxn_token
|
|
{
|
|
public:
|
|
~rxn_token() {};
|
|
rxn_token()
|
|
{
|
|
s = NULL;
|
|
coef = 0.0;
|
|
name = NULL;
|
|
}
|
|
class species* s;
|
|
LDBLE coef;
|
|
const char* name;
|
|
};
|
|
class CReaction
|
|
{
|
|
public:
|
|
CReaction(void);
|
|
CReaction(size_t ntoken);
|
|
~CReaction(void) {}
|
|
double* Get_logk(void) { return this->logk; }
|
|
void Set_logk(double* d);
|
|
double* Get_dz(void) { return this->dz; }
|
|
void Set_dz(double* d);
|
|
size_t size() { return token.size(); }
|
|
std::vector<class rxn_token>& Get_tokens(void) { return this->token; }
|
|
void Set_tokens(const std::vector<class rxn_token>& t) { this->token = t; }
|
|
|
|
public:
|
|
double logk[MAX_LOG_K_INDICES];
|
|
double dz[3];
|
|
std::vector<class rxn_token> token;
|
|
};
|
|
class save
|
|
{
|
|
public:
|
|
~save() {};
|
|
save()
|
|
{
|
|
solution = 0;
|
|
n_solution_user = 0;
|
|
n_solution_user_end = 0;
|
|
mix = 0;
|
|
n_mix_user = 0;
|
|
n_mix_user_end = 0;
|
|
reaction = 0;
|
|
n_reaction_user = 0;
|
|
n_reaction_user_end = 0;
|
|
pp_assemblage = 0;
|
|
n_pp_assemblage_user = 0;
|
|
n_pp_assemblage_user_end = 0;
|
|
exchange = 0;
|
|
n_exchange_user = 0;
|
|
n_exchange_user_end = 0;
|
|
kinetics = 0;
|
|
n_kinetics_user = 0;
|
|
n_kinetics_user_end = 0;
|
|
surface = 0;
|
|
n_surface_user = 0;
|
|
n_surface_user_end = 0;
|
|
gas_phase = 0;
|
|
n_gas_phase_user = 0;
|
|
n_gas_phase_user_end = 0;
|
|
ss_assemblage = 0;
|
|
n_ss_assemblage_user = 0;
|
|
n_ss_assemblage_user_end = 0;
|
|
}
|
|
int solution;
|
|
int n_solution_user;
|
|
int n_solution_user_end;
|
|
int mix;
|
|
int n_mix_user;
|
|
int n_mix_user_end;
|
|
int reaction;
|
|
int n_reaction_user;
|
|
int n_reaction_user_end;
|
|
int pp_assemblage;
|
|
int n_pp_assemblage_user;
|
|
int n_pp_assemblage_user_end;
|
|
int exchange;
|
|
int n_exchange_user;
|
|
int n_exchange_user_end;
|
|
int kinetics;
|
|
int n_kinetics_user;
|
|
int n_kinetics_user_end;
|
|
int surface;
|
|
int n_surface_user;
|
|
int n_surface_user_end;
|
|
int gas_phase;
|
|
int n_gas_phase_user;
|
|
int n_gas_phase_user_end;
|
|
int ss_assemblage;
|
|
int n_ss_assemblage_user;
|
|
int n_ss_assemblage_user_end;
|
|
};
|
|
|
|
/*----------------------------------------------------------------------
|
|
* Copy
|
|
*---------------------------------------------------------------------- */
|
|
class copier
|
|
{
|
|
public:
|
|
~copier() {};
|
|
copier()
|
|
{}
|
|
std::vector<int> n_user;
|
|
std::vector<int> start;
|
|
std::vector<int> end;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Inverse
|
|
*---------------------------------------------------------------------- */
|
|
class inv_elts
|
|
{
|
|
public:
|
|
~inv_elts() {};
|
|
inv_elts()
|
|
{
|
|
name = NULL;
|
|
master = NULL;
|
|
row = 0;
|
|
//uncertainties.clear();
|
|
}
|
|
const char* name;
|
|
class master* master;
|
|
size_t row;
|
|
std::vector<double> uncertainties;
|
|
};
|
|
class isotope
|
|
{
|
|
public:
|
|
~isotope() {};
|
|
isotope()
|
|
{
|
|
isotope_number = 0;
|
|
elt_name = NULL;
|
|
isotope_name = NULL;
|
|
total = 0;
|
|
ratio = 0;
|
|
ratio_uncertainty = 0;
|
|
x_ratio_uncertainty = 0;
|
|
master = NULL;
|
|
primary = NULL;
|
|
coef = 0; /* coefficient of element in phase */
|
|
}
|
|
LDBLE isotope_number;
|
|
const char* elt_name;
|
|
const char* isotope_name;
|
|
LDBLE total;
|
|
LDBLE ratio;
|
|
LDBLE ratio_uncertainty;
|
|
LDBLE x_ratio_uncertainty;
|
|
class master* master;
|
|
class master* primary;
|
|
LDBLE coef;
|
|
};
|
|
class inv_isotope
|
|
{
|
|
public:
|
|
~inv_isotope() {};
|
|
inv_isotope()
|
|
{
|
|
isotope_name = NULL;
|
|
isotope_number = 0;
|
|
elt_name = NULL;
|
|
//uncertainties.clear();
|
|
}
|
|
const char* isotope_name;
|
|
LDBLE isotope_number;
|
|
const char* elt_name;
|
|
std::vector<double> uncertainties;
|
|
};
|
|
class inv_phases
|
|
{
|
|
public:
|
|
~inv_phases() {};
|
|
inv_phases()
|
|
{
|
|
name = NULL;
|
|
phase = NULL;
|
|
column = 0;
|
|
constraint = EITHER;
|
|
force = FALSE;
|
|
//isotopes.clear();
|
|
}
|
|
const char* name;
|
|
class phase* phase;
|
|
int column;
|
|
int constraint;
|
|
int force;
|
|
std::vector<class isotope> isotopes;
|
|
};
|
|
class inverse
|
|
{
|
|
public:
|
|
~inverse() {};
|
|
inverse()
|
|
{
|
|
n_user = -1;
|
|
description = NULL;
|
|
new_def = FALSE;
|
|
minimal = FALSE;
|
|
range = FALSE;
|
|
mp = FALSE;
|
|
mp_censor = 1e-20;
|
|
range_max = 1000.0;
|
|
tolerance = 1e-10;
|
|
mp_tolerance = 1e-12;
|
|
//uncertainties.clear();
|
|
//ph_uncertainties.clear();
|
|
water_uncertainty = 0.0;
|
|
mineral_water = TRUE;
|
|
carbon = TRUE;
|
|
//dalk_dph.clear();
|
|
//dalk_dc.clear();
|
|
count_solns = 0;
|
|
//solns.clear();
|
|
//force_solns.clear();
|
|
//elts.clear();
|
|
//phases.clear();
|
|
count_redox_rxns = 0;
|
|
//isotopes.clear();
|
|
//i_u.clear();
|
|
//isotope_unknowns.clear();
|
|
netpath = NULL;
|
|
pat = NULL;
|
|
}
|
|
int n_user;
|
|
char* description;
|
|
int new_def;
|
|
int minimal;
|
|
int range;
|
|
int mp;
|
|
LDBLE mp_censor;
|
|
LDBLE range_max;
|
|
LDBLE tolerance;
|
|
LDBLE mp_tolerance;
|
|
std::vector<double> uncertainties;
|
|
std::vector<double> ph_uncertainties;
|
|
LDBLE water_uncertainty;
|
|
int mineral_water;
|
|
int carbon;
|
|
std::vector<double> dalk_dph;
|
|
std::vector<double> dalk_dc;
|
|
size_t count_solns;
|
|
std::vector<int> solns;
|
|
std::vector<bool> force_solns;
|
|
std::vector<class inv_elts> elts;
|
|
std::vector<class inv_phases> phases;
|
|
size_t count_redox_rxns;
|
|
std::vector<class inv_isotope> isotopes;
|
|
std::vector<class inv_isotope> i_u;
|
|
std::vector<class isotope> isotope_unknowns;
|
|
const char* netpath;
|
|
const char* pat;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Jacobian and Mass balance lists
|
|
*---------------------------------------------------------------------- */
|
|
class Model
|
|
{
|
|
public:
|
|
Model()
|
|
{
|
|
force_prep = true;
|
|
gas_phase_type = cxxGasPhase::GP_UNKNOWN;
|
|
numerical_fixed_volume = false;
|
|
dl_type = cxxSurface::NO_DL;
|
|
surface_type = cxxSurface::UNKNOWN_DL;
|
|
};
|
|
~Model()
|
|
{
|
|
};
|
|
bool force_prep;
|
|
bool numerical_fixed_volume;
|
|
cxxGasPhase::GP_TYPE gas_phase_type;
|
|
std::vector<class phase*> gas_phase;
|
|
std::vector<const char*> ss_assemblage;
|
|
std::vector<class phase*> pp_assemblage;
|
|
std::vector<double> si;
|
|
std::vector<const char*> add_formula;
|
|
cxxSurface::DIFFUSE_LAYER_TYPE dl_type;
|
|
cxxSurface::SURFACE_TYPE surface_type;
|
|
std::vector<const char*> surface_comp;
|
|
std::vector<const char*> surface_charge;
|
|
};
|
|
class name_coef
|
|
{
|
|
public:
|
|
~name_coef() {};
|
|
name_coef()
|
|
{
|
|
name = NULL;
|
|
coef = 0;
|
|
}
|
|
const char* name;
|
|
LDBLE coef;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Species_list
|
|
*---------------------------------------------------------------------- */
|
|
class species_list
|
|
{
|
|
public:
|
|
~species_list() {};
|
|
species_list()
|
|
{
|
|
master_s = NULL;
|
|
s = NULL;
|
|
coef = 0;
|
|
}
|
|
class species* master_s;
|
|
class species* s;
|
|
LDBLE coef;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Jacobian and Mass balance lists
|
|
*---------------------------------------------------------------------- */
|
|
class list0
|
|
{
|
|
public:
|
|
~list0() {};
|
|
list0()
|
|
{
|
|
target = NULL;
|
|
coef = 0;
|
|
}
|
|
LDBLE* target;
|
|
LDBLE coef;
|
|
};
|
|
class list1
|
|
{
|
|
public:
|
|
~list1() {};
|
|
list1()
|
|
{
|
|
source = NULL;
|
|
target = NULL;
|
|
}
|
|
LDBLE* source;
|
|
LDBLE* target;
|
|
};
|
|
class list2
|
|
{
|
|
public:
|
|
~list2() {};
|
|
list2()
|
|
{
|
|
source = NULL;
|
|
target = NULL;
|
|
coef = 0;
|
|
}
|
|
LDBLE* source;
|
|
LDBLE* target;
|
|
LDBLE coef;
|
|
};
|
|
class iso
|
|
{
|
|
public:
|
|
~iso() {};
|
|
iso()
|
|
{
|
|
name = NULL;
|
|
value = 0;
|
|
uncertainty = 0.05;
|
|
}
|
|
const char* name;
|
|
LDBLE value;
|
|
LDBLE uncertainty;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Transport data
|
|
*---------------------------------------------------------------------- */
|
|
class stag_data
|
|
{
|
|
public:
|
|
~stag_data() {};
|
|
stag_data()
|
|
{
|
|
count_stag = 0;
|
|
exch_f = 0;
|
|
th_m = 0;
|
|
th_im = 0;
|
|
}
|
|
int count_stag;
|
|
LDBLE exch_f;
|
|
LDBLE th_m;
|
|
LDBLE th_im;
|
|
};
|
|
class cell_data
|
|
{
|
|
public:
|
|
~cell_data() {};
|
|
cell_data()
|
|
{
|
|
length = 1;
|
|
mid_cell_x = 1.;
|
|
disp = 1.0;
|
|
temp = 25.;
|
|
// free (uncharged) porewater porosities
|
|
por = 0.1;
|
|
// interlayer water porosities
|
|
por_il = 0.01;
|
|
// potential (V)
|
|
potV = 0;
|
|
punch = FALSE;
|
|
print = FALSE;
|
|
same_model = FALSE;
|
|
}
|
|
LDBLE length;
|
|
LDBLE mid_cell_x;
|
|
LDBLE disp;
|
|
LDBLE temp;
|
|
LDBLE por;
|
|
LDBLE por_il;
|
|
LDBLE potV;
|
|
int punch;
|
|
int print;
|
|
int same_model;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Keywords
|
|
*---------------------------------------------------------------------- */
|
|
//class key
|
|
//{
|
|
//public:
|
|
// ~key() {};
|
|
// key()
|
|
// {
|
|
// name = NULL;
|
|
// keycount = 0;
|
|
// }
|
|
// char* name;
|
|
// int keycount = 0;
|
|
// };
|
|
//class const_key
|
|
//{
|
|
//public:
|
|
// ~const_key() {};
|
|
// const_key()
|
|
// {
|
|
// name = NULL;
|
|
// keycount = 0;
|
|
// }
|
|
// const char* name;
|
|
// int keycount;
|
|
//};
|
|
/*----------------------------------------------------------------------
|
|
* Elements
|
|
*---------------------------------------------------------------------- */
|
|
class element
|
|
{
|
|
public:
|
|
~element() {};
|
|
element()
|
|
{
|
|
// element name
|
|
name = NULL;
|
|
/* int in; */
|
|
master = NULL;
|
|
primary = NULL;
|
|
gfw = 0;
|
|
}
|
|
const char* name;
|
|
class master* master;
|
|
class master* primary;
|
|
LDBLE gfw;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Element List
|
|
*---------------------------------------------------------------------- */
|
|
class elt_list
|
|
{
|
|
public:
|
|
~elt_list() {};
|
|
elt_list()
|
|
{ /* list of name and number of elements in an equation */
|
|
elt = NULL; /* pointer to element structure */
|
|
coef = 0.0; /* number of element e's in eqn */
|
|
}
|
|
class element* elt;
|
|
LDBLE coef;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Species
|
|
*---------------------------------------------------------------------- */
|
|
class species
|
|
{
|
|
public:
|
|
~species() {};
|
|
species()
|
|
{ /* all data pertinent to an aqueous species */
|
|
name = NULL; // name of species
|
|
mole_balance = NULL; // formula for mole balance
|
|
in = FALSE; // set internally if species in model
|
|
number = 0;
|
|
// points to master species list, NULL if not primary master
|
|
primary = NULL;
|
|
// points to master species list, NULL if not secondary master
|
|
secondary = NULL;
|
|
gfw = 0; // gram formula wt of species
|
|
z = 0; // charge of species
|
|
dw = 0; // tracer diffusion coefficient in water at 25oC, m2/s
|
|
dw_t = 0; // correct Dw for temperature: Dw(TK) = Dw(298.15) * exp(dw_t / TK - dw_t / 298.15)
|
|
// parms for calc'ng SC = SC0 * exp(-dw_a * z * mu^0.5 / (1 + DH_B * dw_a2 * mu^0.5) / (1 + mu^dw_a3))
|
|
// with DHO: ka = DH_B * dw_a * (1 + DD(V_apparent)^dw_a2 * sqrt_mu, dw_a3 is a switch, see calc_SC in PBasic
|
|
dw_a = 0;
|
|
dw_a2 = 0;
|
|
dw_a3 = 0;
|
|
dw_a_visc = 0; // exponent in viscosity correction of SC
|
|
dw_a_v_dif = 0; // exponent in viscosity correction of D, the diffusion coefficient of the species
|
|
dw_t_SC = 0; // contribution to SC, for calc'ng transport number with BASIC
|
|
dw_t_visc = 0; // contribution to viscosity
|
|
dw_corr = 0; // dw corrected for mu and TK
|
|
erm_ddl = 0; // enrichment factor in DDL
|
|
equiv = 0; // equivalents in exchange species
|
|
alk = 0; // alkalinity of species, used for cec in exchange
|
|
carbon = 0; // stoichiometric coefficient of carbon in species
|
|
co2 = 0; // stoichiometric coefficient of C(4) in species
|
|
h = 0; // stoichiometric coefficient of H in species
|
|
// stoichiometric coefficient of O in species
|
|
o = 0;
|
|
// WATEQ Debye Huckel a and b-dot; active_fraction coef for exchange species
|
|
dha = 0, dhb = 0, a_f = 0;
|
|
lk = 0; // log10 k at working temperature
|
|
// log kt0, delh, 6 coefficients analytical expression + volume terms
|
|
for (size_t i = 0; i < MAX_LOG_K_INDICES; i++) logk[i] = 0;
|
|
// 7 coefficients analytical expression for B, D, anion terms and pressure in Jones_Dole viscosity eqn
|
|
for (size_t i = 0; i < 10; i++) Jones_Dole[i] = 0;
|
|
// regression coefficients to calculate temperature dependent phi_0and b_v of Millero density model
|
|
for (size_t i = 0; i < 7; i++) millero[i] = 0;
|
|
original_units = kjoules; // enum with original delta H units
|
|
//add_logk.clear();
|
|
lg = 0; // log10 activity coefficient, gamma
|
|
lg_pitzer = 0; // log10 activity coefficient, from pitzer calculation
|
|
lm = 0; // log10 molality
|
|
la = 0; // log10 activity
|
|
dg = 0; // gamma term for jacobian
|
|
dg_total_g = 0;
|
|
moles = 0; // moles in solution; moles/mass_water = molality
|
|
type = 0; // flag indicating presence in model and types of equations
|
|
gflag = 0; // flag for preferred activity coef eqn
|
|
exch_gflag = 0; // flag for preferred activity coef eqn
|
|
// vector of elements
|
|
//next_elt.clear();
|
|
//next_secondary.clear();
|
|
//next_sys_total.clear();
|
|
// switch to check equation for charge and element balance
|
|
check_equation = TRUE;
|
|
//CReaction rxn; // data base reaction
|
|
//CReaction rxn_s; // reaction converted to secondary and primary master species
|
|
//CReaction rxn_x; // reaction to be used in model
|
|
// (1 + sum(g)) * moles
|
|
tot_g_moles = 0;
|
|
// sum(moles*g*Ws/Waq)
|
|
tot_dh2o_moles = 0;
|
|
for (size_t i = 0; i < 5; i++) cd_music[i] = 0;
|
|
for (size_t i = 0; i < 3; i++) dz[i] = 0;
|
|
original_deltav_units = cm3_per_mol;
|
|
}
|
|
const char* name;
|
|
const char* mole_balance;
|
|
int in;
|
|
int number;
|
|
class master* primary;
|
|
class master* secondary;
|
|
LDBLE gfw;
|
|
LDBLE z;
|
|
LDBLE dw;
|
|
LDBLE dw_t;
|
|
LDBLE dw_a;
|
|
LDBLE dw_a2;
|
|
LDBLE dw_a3;
|
|
LDBLE dw_a_visc;
|
|
LDBLE dw_a_v_dif;
|
|
LDBLE dw_t_SC;
|
|
LDBLE dw_t_visc;
|
|
LDBLE dw_corr;
|
|
LDBLE erm_ddl;
|
|
LDBLE equiv;
|
|
LDBLE alk;
|
|
LDBLE carbon;
|
|
LDBLE co2;
|
|
LDBLE h;
|
|
LDBLE o;
|
|
LDBLE dha, dhb, a_f;
|
|
LDBLE lk;
|
|
LDBLE logk[MAX_LOG_K_INDICES];
|
|
LDBLE Jones_Dole[10];
|
|
LDBLE millero[7];
|
|
DELTA_H_UNIT original_units;
|
|
std::vector<class name_coef> add_logk;
|
|
LDBLE lg;
|
|
LDBLE lg_pitzer;
|
|
LDBLE lm;
|
|
LDBLE la;
|
|
LDBLE dg;
|
|
LDBLE dg_total_g;
|
|
LDBLE moles;
|
|
int type;
|
|
int gflag;
|
|
int exch_gflag;
|
|
std::vector<class elt_list> next_elt;
|
|
std::vector<class elt_list> next_secondary;
|
|
std::vector<class elt_list> next_sys_total;
|
|
int check_equation;
|
|
CReaction rxn;
|
|
CReaction rxn_s;
|
|
CReaction rxn_x;
|
|
LDBLE tot_g_moles;
|
|
LDBLE tot_dh2o_moles;
|
|
LDBLE cd_music[5];
|
|
LDBLE dz[3];
|
|
DELTA_V_UNIT original_deltav_units;
|
|
};
|
|
class logk
|
|
{
|
|
public:
|
|
~logk() {};
|
|
logk()
|
|
{ /* Named log K's */
|
|
name = NULL; // name of species
|
|
lk = 0.0; // log10 k at working temperature
|
|
// log kt0, delh, 6 coefficients analalytical expression
|
|
for (size_t i = 0; i < MAX_LOG_K_INDICES; i++) log_k[i] = 0;
|
|
// enum with original delta H units
|
|
original_units = kjoules;
|
|
done = FALSE;
|
|
//add_logk.clear();
|
|
// log kt0, delh, 5 coefficients analalytical expression
|
|
for (size_t i = 0; i < MAX_LOG_K_INDICES; i++) log_k_original[i] = 0;
|
|
original_deltav_units = cm3_per_mol;
|
|
}
|
|
const char* name;
|
|
LDBLE lk;
|
|
LDBLE log_k[MAX_LOG_K_INDICES];
|
|
DELTA_H_UNIT original_units;
|
|
int done;
|
|
std::vector<class name_coef> add_logk;
|
|
LDBLE log_k_original[MAX_LOG_K_INDICES];
|
|
DELTA_V_UNIT original_deltav_units;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Phases
|
|
*---------------------------------------------------------------------- */
|
|
class phase
|
|
{
|
|
public:
|
|
~phase() {};
|
|
phase()
|
|
{ /* all data pertinent to a pure solid phase */
|
|
name = NULL; //name of species
|
|
formula = NULL; // chemical formula
|
|
in = FALSE; // species used in model if TRUE
|
|
lk = 0; // log10 k at working temperature
|
|
// log kt0, delh, 6 coefficients analalytical expression
|
|
for (size_t i = 0; i < MAX_LOG_K_INDICES; i++) logk[i] = 0;
|
|
// enum with original delta H units
|
|
original_units = kjoules;
|
|
original_deltav_units = cm3_per_mol;
|
|
//add_logk.clear();
|
|
moles_x = 0;
|
|
delta_max = 0;
|
|
p_soln_x = 0;
|
|
fraction_x = 0;
|
|
log10_lambda = 0;
|
|
log10_fraction_x = 0;
|
|
dn = 0, dnb = 0, dnc = 0;
|
|
gn = 0, gntot = 0;
|
|
gn_n = 0, gntot_n = 0;
|
|
// gas: critical TK, critical P(atm), Pitzer acentric coeff
|
|
t_c = 0, p_c = 0, omega = 0;
|
|
// Peng-Robinson parm's
|
|
pr_a = 0, pr_b = 0, pr_alpha = 0;
|
|
// Temperature (K), Pressure (atm)
|
|
pr_tk = 0, pr_p = 0;
|
|
// fugacity coefficient (-)
|
|
pr_phi = 0;
|
|
// for calculating multicomponent phi
|
|
pr_aa_sum2 = 0;
|
|
// delta_v[0] = [1] + [2]*T + [3]/T + [4]*log10(T) + [5]/T^2 + [6]*T^2 + [7]*P
|
|
for (size_t i = 0; i < 9; i++) delta_v[i] = 0;
|
|
// si adapter: log10(phi) - delta_v[0] * (P - 1) /RT
|
|
pr_si_f = 0;
|
|
// Peng-Robinson in the calc's, or not
|
|
pr_in = false;
|
|
// flag indicating presence in model and types of equations
|
|
type = SOLID;
|
|
// list of elements in phase
|
|
//next_elt.clear();
|
|
//next_sys_total.clear();
|
|
// switch to check equation for charge and element balance
|
|
check_equation = TRUE;
|
|
// data base reaction
|
|
//CReaction rxn;
|
|
// reaction converted to secondary and primary master species
|
|
//CReaction rxn_s;
|
|
// reaction to be used in model
|
|
//CReaction rxn_x;
|
|
// equation contains solids or gases
|
|
replaced = FALSE;
|
|
in_system = FALSE;
|
|
}
|
|
const char* name;
|
|
const char* formula;
|
|
int in;
|
|
LDBLE lk;
|
|
LDBLE logk[MAX_LOG_K_INDICES];
|
|
DELTA_H_UNIT original_units;
|
|
DELTA_V_UNIT original_deltav_units;
|
|
std::vector<class name_coef> add_logk;
|
|
LDBLE moles_x;
|
|
LDBLE delta_max;
|
|
LDBLE p_soln_x;
|
|
LDBLE fraction_x;
|
|
LDBLE log10_lambda;
|
|
LDBLE log10_fraction_x;
|
|
LDBLE dn, dnb, dnc;
|
|
LDBLE gn, gntot;
|
|
LDBLE gn_n, gntot_n;
|
|
LDBLE t_c, p_c, omega;
|
|
LDBLE pr_a, pr_b, pr_alpha;
|
|
LDBLE pr_tk, pr_p;
|
|
LDBLE pr_phi;
|
|
LDBLE pr_aa_sum2;
|
|
LDBLE delta_v[9];
|
|
LDBLE pr_si_f;
|
|
bool pr_in;
|
|
int type;
|
|
std::vector<class elt_list> next_elt;
|
|
std::vector<class elt_list> next_sys_total;
|
|
int check_equation;
|
|
CReaction rxn;
|
|
CReaction rxn_s;
|
|
CReaction rxn_x;
|
|
int replaced;
|
|
int in_system;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Master species
|
|
*---------------------------------------------------------------------- */
|
|
class master
|
|
{
|
|
public:
|
|
~master() {};
|
|
master()
|
|
{
|
|
// TRUE if in model, FALSE if out, REWRITE if other mb eq
|
|
in = 0;
|
|
// sequence number in list of masters
|
|
number = 0;
|
|
// saved to determine if model has changed
|
|
last_model = FALSE;
|
|
// AQ or EX
|
|
type = 0;
|
|
// TRUE if master species is primary
|
|
primary = FALSE;
|
|
// coefficient of element in master species
|
|
coef = 0;
|
|
// total concentration for element or valence state
|
|
total = 0;
|
|
isotope_ratio = 0;
|
|
isotope_ratio_uncertainty = 0;
|
|
isotope = 0;
|
|
total_primary = 0;
|
|
// element structure
|
|
elt = NULL;
|
|
// alkalinity of species
|
|
alk = 0;
|
|
// default gfw for species
|
|
gfw = 1;
|
|
// formula from which to calculate gfw
|
|
gfw_formula = NULL;
|
|
// pointer to unknown structure
|
|
unknown = NULL;
|
|
// pointer to species structure
|
|
s = NULL;
|
|
// reaction writes master species in terms of primary master species
|
|
//CReaction rxn_primary;
|
|
// reaction writes master species in terms of secondary master species
|
|
//CReaction rxn_secondary;
|
|
pe_rxn = NULL;
|
|
minor_isotope = FALSE;
|
|
}
|
|
int in;
|
|
size_t number;
|
|
int last_model;
|
|
int type;
|
|
int primary;
|
|
LDBLE coef;
|
|
LDBLE total;
|
|
LDBLE isotope_ratio;
|
|
LDBLE isotope_ratio_uncertainty;
|
|
int isotope;
|
|
LDBLE total_primary;
|
|
class element* elt;
|
|
LDBLE alk;
|
|
LDBLE gfw;
|
|
const char* gfw_formula;
|
|
class unknown* unknown;
|
|
class species* s;
|
|
CReaction rxn_primary;
|
|
CReaction rxn_secondary;
|
|
const char* pe_rxn;
|
|
int minor_isotope;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Unknowns
|
|
*---------------------------------------------------------------------- */
|
|
class unknown
|
|
{
|
|
public:
|
|
~unknown() {};
|
|
unknown()
|
|
{
|
|
type = 0;
|
|
moles = 0;
|
|
ln_moles = 0;
|
|
f = 0;
|
|
sum = 0;
|
|
delta = 0;
|
|
la = 0;
|
|
number = 0;
|
|
description = NULL;
|
|
//master.clear();
|
|
phase = NULL;
|
|
si = 0;
|
|
n_gas_phase_user = 0;
|
|
s = NULL;
|
|
exch_comp = NULL;
|
|
pp_assemblage_comp_name = NULL;
|
|
pp_assemblage_comp_ptr = NULL;
|
|
ss_name = NULL;
|
|
ss_ptr = NULL;
|
|
ss_comp_name = NULL;
|
|
ss_comp_ptr = NULL;
|
|
ss_comp_number = 0;
|
|
ss_in = FALSE;
|
|
surface_comp = NULL;
|
|
surface_charge = NULL;
|
|
related_moles = 0;
|
|
potential_unknown = NULL;
|
|
potential_unknown1 = NULL;
|
|
potential_unknown2 = NULL;
|
|
// list for CD_MUSIC of comps that contribute to 0 plane mass-balance term
|
|
//comp_unknowns.clear();
|
|
phase_unknown = NULL;
|
|
mass_water = 1;
|
|
dissolve_only = FALSE;
|
|
inert_moles = 0;
|
|
V_m = 0;
|
|
pressure = 1;
|
|
mb_number = 0;
|
|
iteration = 0;
|
|
}
|
|
int type;
|
|
LDBLE moles;
|
|
LDBLE ln_moles;
|
|
LDBLE f;
|
|
LDBLE sum;
|
|
LDBLE delta;
|
|
LDBLE la;
|
|
size_t number;
|
|
const char* description;
|
|
std::vector<class master*> master;
|
|
class phase* phase;
|
|
LDBLE si;
|
|
int n_gas_phase_user;
|
|
class species* s;
|
|
const char* exch_comp;
|
|
const char* pp_assemblage_comp_name;
|
|
void* pp_assemblage_comp_ptr;
|
|
const char* ss_name;
|
|
void* ss_ptr;
|
|
const char* ss_comp_name;
|
|
void* ss_comp_ptr;
|
|
int ss_comp_number;
|
|
int ss_in;
|
|
const char* surface_comp;
|
|
const char* surface_charge;
|
|
LDBLE related_moles;
|
|
class unknown* potential_unknown;
|
|
class unknown* potential_unknown1;
|
|
class unknown* potential_unknown2;
|
|
std::vector<class unknown*> comp_unknowns;
|
|
class unknown* phase_unknown;
|
|
LDBLE mass_water;
|
|
int dissolve_only;
|
|
LDBLE inert_moles;
|
|
LDBLE V_m;
|
|
LDBLE pressure;
|
|
int mb_number;
|
|
int iteration;
|
|
};
|
|
/*----------------------------------------------------------------------
|
|
* Reaction work space
|
|
*---------------------------------------------------------------------- */
|
|
class rxn_token_temp
|
|
{
|
|
public:
|
|
~rxn_token_temp() {};
|
|
rxn_token_temp()
|
|
{ // data for equations, aq. species or minerals
|
|
name = NULL; // pointer to a species name (formula)
|
|
z = 0; // charge on species
|
|
s = NULL;
|
|
unknown = NULL;
|
|
coef = 0; // coefficient of species name
|
|
}
|
|
const char* name;
|
|
LDBLE z;
|
|
class species* s;
|
|
class unknown* unknown;
|
|
LDBLE coef;
|
|
};
|
|
class reaction_temp
|
|
{
|
|
public:
|
|
~reaction_temp() {};
|
|
reaction_temp()
|
|
{
|
|
for (size_t i = 0; i < MAX_LOG_K_INDICES; i++) logk[i] = 0;
|
|
for (size_t i = 0; i < 3; i++) dz[i] = 0;
|
|
//token.clear();
|
|
}
|
|
LDBLE logk[MAX_LOG_K_INDICES];
|
|
LDBLE dz[3];
|
|
std::vector<class rxn_token_temp> token;
|
|
};
|
|
class unknown_list
|
|
{
|
|
public:
|
|
~unknown_list() {};
|
|
unknown_list()
|
|
{
|
|
unknown = NULL;
|
|
source = NULL;
|
|
gamma_source = NULL;
|
|
coef = 0;
|
|
}
|
|
class unknown* unknown;
|
|
LDBLE* source;
|
|
LDBLE* gamma_source;
|
|
LDBLE coef;
|
|
};
|
|
/* ----------------------------------------------------------------------
|
|
* Print
|
|
* ---------------------------------------------------------------------- */
|
|
class prints
|
|
{
|
|
public:
|
|
~prints() {};
|
|
prints()
|
|
{
|
|
all = 0;
|
|
initial_solutions = 0;
|
|
initial_exchangers = 0;
|
|
reactions = 0;
|
|
gas_phase = 0;
|
|
ss_assemblage = 0;
|
|
pp_assemblage = 0;
|
|
surface = 0;
|
|
exchange = 0;
|
|
kinetics = 0;
|
|
totals = 0;
|
|
eh = 0;
|
|
species = 0;
|
|
saturation_indices = 0;
|
|
irrev = 0;
|
|
mix = 0;
|
|
reaction = 0;
|
|
use = 0;
|
|
logfile = 0;
|
|
punch = 0;
|
|
status = 0;
|
|
inverse = 0;
|
|
dump = 0;
|
|
user_print = 0;
|
|
headings = 0;
|
|
user_graph = 0;
|
|
echo_input = 0;
|
|
warnings = 0;
|
|
initial_isotopes = 0;
|
|
isotope_ratios = 0;
|
|
isotope_alphas = 0;
|
|
hdf = 0;
|
|
alkalinity = 0;
|
|
}
|
|
int all;
|
|
int initial_solutions;
|
|
int initial_exchangers;
|
|
int reactions;
|
|
int gas_phase;
|
|
int ss_assemblage;
|
|
int pp_assemblage;
|
|
int surface;
|
|
int exchange;
|
|
int kinetics;
|
|
int totals;
|
|
int eh;
|
|
int species;
|
|
int saturation_indices;
|
|
int irrev;
|
|
int mix;
|
|
int reaction;
|
|
int use;
|
|
int logfile;
|
|
int punch;
|
|
int status;
|
|
int inverse;
|
|
int dump;
|
|
int user_print;
|
|
int headings;
|
|
int user_graph;
|
|
int echo_input;
|
|
int warnings;
|
|
int initial_isotopes;
|
|
int isotope_ratios;
|
|
int isotope_alphas;
|
|
int hdf;
|
|
int alkalinity;
|
|
};
|
|
/* ----------------------------------------------------------------------
|
|
* RATES
|
|
* ---------------------------------------------------------------------- */
|
|
class rate
|
|
{
|
|
public:
|
|
~rate() {};
|
|
rate()
|
|
{
|
|
name = NULL;
|
|
//std::string commands;
|
|
new_def = 0;
|
|
linebase = NULL;
|
|
varbase = NULL;
|
|
loopbase = NULL;
|
|
}
|
|
const char* name;
|
|
std::string commands;
|
|
int new_def;
|
|
void* linebase;
|
|
void* varbase;
|
|
void* loopbase;
|
|
};
|
|
/* ----------------------------------------------------------------------
|
|
* GLOBAL DECLARATIONS
|
|
* ---------------------------------------------------------------------- */
|
|
class spread_row
|
|
{
|
|
public:
|
|
~spread_row() {};
|
|
spread_row()
|
|
{
|
|
count = 0;
|
|
empty = 0, string = 0, number = 0;
|
|
//char_vector.clear();
|
|
//d_vector.clear();
|
|
//type_vector.clear();
|
|
}
|
|
size_t count;
|
|
size_t empty, string, number;
|
|
std::vector<std::string> str_vector;
|
|
std::vector<int> type_vector;
|
|
};
|
|
class defaults
|
|
{
|
|
public:
|
|
~defaults() {};
|
|
defaults()
|
|
{
|
|
temp = 25;
|
|
density = 1;
|
|
calc_density = false;
|
|
units = NULL;
|
|
redox = NULL;
|
|
ph = 7;
|
|
pe = 4;
|
|
water = 1;
|
|
//iso.clear();
|
|
pressure = 1; /* pressure in atm */
|
|
}
|
|
LDBLE temp;
|
|
LDBLE density;
|
|
bool calc_density;
|
|
const char* units;
|
|
const char* redox;
|
|
LDBLE ph;
|
|
LDBLE pe;
|
|
LDBLE water;
|
|
std::vector<class iso> iso;
|
|
LDBLE pressure;
|
|
};
|
|
class spread_sheet
|
|
{
|
|
public:
|
|
~spread_sheet() {};
|
|
spread_sheet()
|
|
{
|
|
heading = NULL;
|
|
units = NULL;
|
|
//class defaults defaults;
|
|
}
|
|
class spread_row* heading;
|
|
class spread_row* units;
|
|
std::vector<class spread_row*> rows;
|
|
class defaults defaults;
|
|
};
|
|
/* ----------------------------------------------------------------------
|
|
* ISOTOPES
|
|
* ---------------------------------------------------------------------- */
|
|
class master_isotope
|
|
{
|
|
public:
|
|
~master_isotope() {};
|
|
master_isotope()
|
|
{
|
|
name = NULL;
|
|
master = NULL;
|
|
elt = NULL;
|
|
units = NULL;
|
|
standard = 0;
|
|
ratio = 0;
|
|
moles = 0;
|
|
total_is_major = 0;
|
|
minor_isotope = 0;
|
|
}
|
|
const char* name;
|
|
class master* master;
|
|
class element* elt;
|
|
const char* units;
|
|
LDBLE standard;
|
|
LDBLE ratio;
|
|
LDBLE moles;
|
|
int total_is_major;
|
|
int minor_isotope;
|
|
};
|
|
class calculate_value
|
|
{
|
|
public:
|
|
~calculate_value() {};
|
|
calculate_value()
|
|
{
|
|
name = NULL;
|
|
value = 0;
|
|
//commands.clear();
|
|
new_def = 0;
|
|
calculated = 0;
|
|
linebase = NULL;
|
|
varbase = NULL;
|
|
loopbase = NULL;
|
|
}
|
|
const char* name;
|
|
LDBLE value;
|
|
std::string commands;
|
|
int new_def;
|
|
int calculated;
|
|
void* linebase;
|
|
void* varbase;
|
|
void* loopbase;
|
|
};
|
|
class isotope_ratio
|
|
{
|
|
public:
|
|
isotope_ratio()
|
|
{
|
|
name = NULL;
|
|
isotope_name = NULL;
|
|
ratio = 0;
|
|
converted_ratio = 0;
|
|
}
|
|
~isotope_ratio() {};
|
|
|
|
const char* name;
|
|
const char* isotope_name;
|
|
LDBLE ratio;
|
|
LDBLE converted_ratio;
|
|
};
|
|
class isotope_alpha
|
|
{
|
|
public:
|
|
isotope_alpha()
|
|
{
|
|
name = NULL;
|
|
named_logk = NULL;
|
|
value = 0;
|
|
}
|
|
~isotope_alpha() {};
|
|
const char* name;
|
|
const char* named_logk;
|
|
LDBLE value;
|
|
};
|
|
class system_species
|
|
{
|
|
public:
|
|
~system_species() {};
|
|
system_species()
|
|
{
|
|
name = NULL;
|
|
type = NULL;
|
|
moles = 0;
|
|
}
|
|
char* name;
|
|
char* type;
|
|
LDBLE moles;
|
|
};
|
|
/* tally.c ------------------------------- */
|
|
class tally_buffer
|
|
{
|
|
public:
|
|
~tally_buffer() {};
|
|
tally_buffer()
|
|
{
|
|
name = NULL;
|
|
master = NULL;
|
|
moles = 0;
|
|
gfw = 0;
|
|
}
|
|
const char* name;
|
|
class master* master;
|
|
LDBLE moles;
|
|
LDBLE gfw;
|
|
};
|
|
class tally
|
|
{
|
|
public:
|
|
~tally() {};
|
|
tally()
|
|
{
|
|
name = NULL;
|
|
type = UnKnown;
|
|
add_formula = NULL;
|
|
moles = 0;
|
|
//formula.clear();
|
|
/*
|
|
* first total is initial
|
|
* second total is final
|
|
* third total is difference (final - initial)
|
|
*/
|
|
for(size_t i = 0; i < 3; i++) total[i]= NULL;
|
|
}
|
|
const char* name;
|
|
enum entity_type type;
|
|
const char* add_formula;
|
|
LDBLE moles;
|
|
std::vector<class elt_list> formula;
|
|
/*
|
|
* first total is initial
|
|
* second total is final
|
|
* third total is difference (final - initial)
|
|
*/
|
|
class tally_buffer* total[3];
|
|
};
|
|
/* transport.c ------------------------------- */
|
|
class spec
|
|
{
|
|
public:
|
|
~spec() {};
|
|
spec()
|
|
{
|
|
// name of species
|
|
name = NULL;
|
|
// name of aqueous species in EX species
|
|
aq_name = NULL;
|
|
// type: AQ or EX
|
|
type = 0;
|
|
// activity
|
|
a = 0;
|
|
// log(concentration)
|
|
lm = 0;
|
|
// log(gamma)
|
|
lg = 0;
|
|
// concentration for AQ, equivalent fraction for EX
|
|
c = 0;
|
|
// charge number
|
|
z = 0;
|
|
// free water diffusion coefficient, m2/s
|
|
Dw = 0;
|
|
// temperature and viscosity corrected free water diffusion coefficient, m2/s
|
|
Dwt = 0;
|
|
// temperature factor for Dw
|
|
dw_t = 0;
|
|
// viscosity factor for Dw
|
|
dw_a_v_dif = 0;
|
|
// enrichment factor in ddl
|
|
erm_ddl = 0;
|
|
}
|
|
const char* name;
|
|
const char* aq_name;
|
|
int type;
|
|
LDBLE a;
|
|
LDBLE lm;
|
|
LDBLE lg;
|
|
LDBLE c;
|
|
LDBLE z;
|
|
LDBLE Dw;
|
|
LDBLE Dwt;
|
|
LDBLE dw_t;
|
|
LDBLE dw_a_v_dif;
|
|
LDBLE erm_ddl;
|
|
};
|
|
|
|
class sol_D
|
|
{
|
|
public:
|
|
~sol_D() {};
|
|
sol_D()
|
|
{
|
|
// number of aqueous + exchange species
|
|
count_spec = 0;
|
|
// number of exchange species
|
|
count_exch_spec = 0;
|
|
// total moles of X-, max X- in transport step in sol_D[1], tk
|
|
exch_total = 0, x_max = 0, tk_x = 0;
|
|
// viscos_0 at I = 0
|
|
viscos_0 = 0;
|
|
// viscosity of solution
|
|
viscos = 0;
|
|
spec = NULL;
|
|
spec_size = 0;
|
|
}
|
|
int count_spec;
|
|
int count_exch_spec;
|
|
LDBLE exch_total, x_max, tk_x;
|
|
LDBLE viscos_0, viscos;
|
|
class spec* spec;
|
|
int spec_size;
|
|
};
|
|
class J_ij
|
|
{
|
|
public:
|
|
~J_ij() {};
|
|
J_ij()
|
|
{
|
|
name = NULL;
|
|
// species change in cells i and j
|
|
tot1 = 0;
|
|
tot2 = 0;
|
|
tot_stag = 0;
|
|
charge = 0;
|
|
}
|
|
const char* name;
|
|
LDBLE tot1, tot2, tot_stag, charge;
|
|
};
|
|
class J_ij_save
|
|
{
|
|
public:
|
|
~J_ij_save() {};
|
|
J_ij_save()
|
|
{
|
|
// species change in cells i and j
|
|
flux_t = 0;
|
|
flux_c = 0;
|
|
}
|
|
double flux_t, flux_c;
|
|
};
|
|
class M_S
|
|
{
|
|
public:
|
|
~M_S() {};
|
|
M_S()
|
|
{
|
|
name = NULL;
|
|
// master species transport in cells i and j
|
|
tot1 = 0;
|
|
tot2 = 0;
|
|
tot_stag = 0;
|
|
charge = 0;
|
|
}
|
|
const char* name;
|
|
LDBLE tot1, tot2, tot_stag, charge;
|
|
};
|
|
// Pitzer definitions
|
|
typedef enum
|
|
{ TYPE_B0, TYPE_B1, TYPE_B2, TYPE_C0, TYPE_THETA, TYPE_LAMBDA, TYPE_ZETA,
|
|
TYPE_PSI, TYPE_ETHETA, TYPE_ALPHAS, TYPE_MU, TYPE_ETA, TYPE_Other,
|
|
TYPE_SIT_EPSILON, TYPE_SIT_EPSILON_MU, TYPE_APHI, TYPE_SIT_EPSILON2
|
|
} pitz_param_type;
|
|
class pitz_param
|
|
{
|
|
public:
|
|
~pitz_param() {};
|
|
pitz_param()
|
|
{
|
|
for(size_t i = 0; i < 3; i++) species[i] = NULL;
|
|
for (size_t i = 0; i < 3; i++) ispec[i] = -1;
|
|
type = TYPE_Other;
|
|
p = 0;
|
|
U.b0 = 0;
|
|
for (size_t i = 0; i < 6; i++) a[i] = 0;
|
|
alpha = 0;
|
|
os_coef = 0;
|
|
for (size_t i = 0; i < 3; i++) ln_coef[i] = 0;
|
|
thetas = NULL;
|
|
}
|
|
const char* species[3];
|
|
int ispec[3];
|
|
pitz_param_type type;
|
|
LDBLE p;
|
|
union
|
|
{
|
|
LDBLE b0;
|
|
LDBLE b1;
|
|
LDBLE b2;
|
|
LDBLE c0;
|
|
LDBLE theta;
|
|
LDBLE lambda;
|
|
LDBLE zeta;
|
|
LDBLE psi;
|
|
LDBLE alphas;
|
|
LDBLE mu;
|
|
LDBLE eta;
|
|
LDBLE eps;
|
|
LDBLE eps1;
|
|
LDBLE aphi;
|
|
LDBLE eps2;
|
|
} U;
|
|
LDBLE a[6];
|
|
LDBLE alpha;
|
|
LDBLE os_coef;
|
|
LDBLE ln_coef[3];
|
|
class theta_param* thetas;
|
|
};
|
|
class theta_param
|
|
{
|
|
public:
|
|
~theta_param() {};
|
|
theta_param()
|
|
{
|
|
zj = 0;
|
|
zk = 0;
|
|
etheta = 0;
|
|
ethetap = 0;
|
|
}
|
|
LDBLE zj;
|
|
LDBLE zk;
|
|
LDBLE etheta;
|
|
LDBLE ethetap;
|
|
};
|
|
class const_iso
|
|
{
|
|
public:
|
|
~const_iso() {};
|
|
const_iso()
|
|
{
|
|
name = NULL;
|
|
value = 0;
|
|
uncertainty = 0;
|
|
}
|
|
const_iso(const char *n, LDBLE v, LDBLE u)
|
|
{
|
|
name = n;
|
|
value = v;
|
|
uncertainty = u;
|
|
}
|
|
const char* name;
|
|
LDBLE value;
|
|
LDBLE uncertainty;
|
|
};
|
|
|
|
#endif /* _INC_GLOBAL_STRUCTURES_H */
|