VolFe 0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3190 @@
1
+ # equilibrium_equations.py
2
+
3
+ import pandas as pd
4
+ import numpy as np
5
+ from scipy import optimize
6
+
7
+ import VolFe.differential_equations as de
8
+ #import differential_equations as de
9
+ import VolFe.melt_gas as mg
10
+ #import melt_gas as mg
11
+ import VolFe.model_dependent_variables as mdv
12
+ #import model_dependent_variables as mdv
13
+
14
+
15
+ def set_system(melt_wf,models):
16
+ xenia = models.loc["xenia","option"]
17
+ wt_H = melt_wf["HT"]
18
+ wt_C = melt_wf["CT"]
19
+ wt_S = melt_wf["ST"]
20
+ wt_X = melt_wf["XT"]
21
+ if wt_H > 0. and wt_C == 0. and wt_S == 0. and wt_X == 0.:
22
+ if xenia == "no":
23
+ sys = "HOFe"
24
+ elif xenia == "yes":
25
+ sys == "HOFe_xenia"
26
+ elif wt_H == 0. and wt_C > 0. and wt_S == 0. and wt_X == 0.:
27
+ sys = "COFe"
28
+ elif wt_H == 0. and wt_C == 0. and wt_S > 0. and wt_X == 0.:
29
+ sys = "SOFe"
30
+ elif wt_H > 0. and wt_C > 0. and wt_S == 0. and wt_X == 0.:
31
+ sys = "CHOFe"
32
+ elif wt_H > 0. and wt_C == 0. and wt_S > 0. and wt_X == 0.:
33
+ sys = "SHOFe"
34
+ elif wt_H == 0. and wt_C > 0. and wt_S > 0. and wt_X == 0.:
35
+ sys = "SCOFe"
36
+ elif wt_H == 0. and wt_C > 0. and wt_S == 0. and wt_X > 0.:
37
+ sys = "COXFe"
38
+ elif wt_H > 0. and wt_C == 0. and wt_S == 0. and wt_X > 0.:
39
+ sys = "HOXFe"
40
+ elif wt_H > 0. and wt_C > 0. and wt_S > 0. and wt_X == 0.:
41
+ sys = "SCHOFe"
42
+ elif wt_H > 0. and wt_C > 0. and wt_S == 0. and wt_X > 0.:
43
+ sys = "CHOXFe"
44
+ elif wt_H > 0. and wt_C > 0. and wt_S > 0. and wt_X > 0.:
45
+ sys = "SCHOXFe"
46
+ return sys
47
+
48
+ def initial_guesses(run,PT,melt_wf,setup,species,models,system): ### CHECK ###
49
+ starting_P = models.loc["starting_P","option"]
50
+ xenia = models.loc["xenia","option"]
51
+ solve_species = models.loc["solve_species","option"]
52
+
53
+ if starting_P == "set":
54
+ guessx = setup.loc[run,"xg_O2"]
55
+ else:
56
+ guessx = mg.xg_O2(PT,melt_wf,species,models)
57
+
58
+ if models.loc["insolubles","option"] == "H2O-CO2 only":
59
+ guessx = mg.xg_CO2(PT,melt_wf,species,models)
60
+
61
+ if system in ["COFe","HOFe","SOFe","CHOFe","COXFe","SHOFe","SCOFe","SCOHFe","SCHOFe","CHOXFe","HOXFe"]:
62
+ guessw = 0.
63
+
64
+ if system in ["COFe","HOFe","SOFe"]:
65
+ guessy = 0.
66
+ guessz = 0.
67
+
68
+ if system in ["COXFe","CHOFe","SHOFe","SCOFe","HOXFe"]:
69
+ guessz = 0.
70
+
71
+ if system in ["CHOFe","COXFe"]:
72
+ if starting_P == "set":
73
+ guessy = setup.loc[run,"xg_CO"]
74
+ elif models.loc["insolubles","option"] == "H2O-CO2 only":
75
+ guessy = 0.
76
+ else:
77
+ guessy = mg.xg_CO(PT,melt_wf,species,models)
78
+ elif system == "SHOFe":
79
+ if starting_P == "set":
80
+ guessy = setup.loc[run,"xg_S2"]
81
+ else:
82
+ guessy = mg.xg_S2(PT,melt_wf,species,models)
83
+ elif system == "HOXFe":
84
+ if starting_P == "set":
85
+ guessy = setup.loc[run,"xg_H2"]
86
+ else:
87
+ guessy = mg.xg_H2(PT,melt_wf,species,models)
88
+ elif system == "SCOFe":
89
+ guessy = mg.xg_S2(PT,melt_wf,species,models)
90
+
91
+ elif system == "CHOXFe":
92
+ if starting_P == "set":
93
+ guessy = setup.loc[run,"xg_CO"]
94
+ guessz = setup.loc[run,"xg_X"]
95
+ else:
96
+ guessy = mg.xg_CO(PT,melt_wf,species,models)
97
+ guessz = mg.xg_X(PT,melt_wf,species,models)
98
+ elif system == "SCHOFe" or system == "SCHOXFe":
99
+ if solve_species in ["OCS","scipy"]:
100
+ if starting_P == "set":
101
+ guessy = setup.loc[run,"xg_CO"]
102
+ guessz = setup.loc[run,"xg_S2"]
103
+ else:
104
+ guessy = mg.xg_CO(PT,melt_wf,species,models)
105
+ guessz = mg.xg_S2(PT,melt_wf,species,models)
106
+ elif solve_species == "OHS":
107
+ if starting_P == "set":
108
+ guessy = setup.loc[run,"xg_H2"]
109
+ guessz = setup.loc[run,"xg_S2"]
110
+ else:
111
+ guessy = mg.xg_H2(PT,melt_wf,species,models)
112
+ guessz = mg.xg_S2(PT,melt_wf,species,models)
113
+ elif solve_species == "OCH":
114
+ if starting_P == "set":
115
+ guessy = setup.loc[run,"xg_CO"]
116
+ guessz = setup.loc[run,"xg_H2"]
117
+ else:
118
+ guessy = mg.xg_CO(PT,melt_wf,species,models)
119
+ guessz = mg.xg_H2(PT,melt_wf,species,models)
120
+ if system == "SCHOXFe":
121
+ if starting_P == "set":
122
+ guessw = setup.loc[run,"xg_X"]
123
+ else:
124
+ guessw = mg.xg_X(run,PT,melt_wf,setup,species,models)
125
+ guesses = {"guessx":guessx, "guessy":guessy, "guessz":guessz, "guessw":guessw}
126
+ return guesses
127
+
128
+ def mg_equilibrium(PT,melt_wf,bulk_wf,species,models,nr_step,nr_tol,guesses): ### CHECK ###
129
+ system = set_system(melt_wf,models)
130
+ solve_species = models.loc["solve_species","option"]
131
+
132
+ if system in ["COFe","SOFe","SCOFe","COXFe"]: # no H
133
+ wt_H_, xg_H2_, xg_H2O_, xg_CH4_, xg_H2S_, xm_H2O_, wm_H2O_, wm_H2_, wm_CH4_, wm_H2S_, wt_g_H = 0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,""
134
+ if system in ["COFe","HOFe","CHOFe","CHOXFe","COXFe","HOXFe"]: # no S
135
+ wt_S_, xg_S2_, xg_SO2_, xg_H2S_, xg_OCS_, wm_S_, wm_SO3_, wm_ST_, wm_H2S_, S62, S6T, wt_g_S = 0.,0.,0.,0.,0.,0.,0.,0.,0.,"","",""
136
+ if system in ["HOFe","SOFe","SHOFe","HOXFe"]: # no C
137
+ wt_C_, xg_CO_, xg_CO2_, xg_CH4_, xg_OCS_, xm_CO2_, wm_CO2_, wm_CO_, wm_CH4_, wt_g_C = 0.,0.,0.,0.,0.,0.,0.,0.,0.,""
138
+ if system in ["COFe","HOFe","SOFe","SHOFe","CHOFe","SCOFe","CHOXFe","SCHOFe"]: # no X
139
+ wt_X_, xg_X_, wm_X_, wt_g_X = 0.,0.,0.,""
140
+ if system in ["COFe","SOFe","HOFe","HOFe_xenia"]: # one component
141
+ guessy,guessz,guessw = "","",""
142
+ solve_species = "O"
143
+ if system in ["SHOFe","CHOFe","SCOFe","COXFe","HOXFe"]: # two components
144
+ guessz,guessw = "",""
145
+ if system in ["CHOXFe","SCHOFe"]: # three components
146
+ guessw = ""
147
+
148
+ if system in ["HOFe","SHOFe","CHOFe","CHOXFe","SCHOFe","HOXFe"]:
149
+ if models.loc["Hspeciation","option"] == "ideal":
150
+ print("not currently possible")
151
+ if models.loc["Hspeciation","option"] == "regular":
152
+ print("not currently possible")
153
+
154
+ if system == "COFe":
155
+ xg_O2_,A,B,C = eq_COFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses) # COFe system
156
+ xg_CO2_, xg_CO_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_ = A
157
+ diff,wt_g_O,wt_g_C = B
158
+ wt_g, wt_O_, wt_C_ = C
159
+ guessx = xg_O2_
160
+ elif system == "HOFe":
161
+ xg_O2_,A,B,C = eq_HOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses) # HOFe system
162
+ xg_H2O_, xg_H2_, xm_H2O_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_ = A
163
+ diff,wt_g_O,wt_g_H = B
164
+ wt_g, wt_O_, wt_H_ = C
165
+ guessx = xg_O2_
166
+ elif system == "HOFe_xenia":
167
+ xg_O2_,A,B,C = eq_HOFe_xenia(PT,bulk_wf,species,models,nr_step,nr_tol,guesses) # HOFe system
168
+ xg_H2O_, xg_H2_, xm_H2Omol_, xm_OH_, xm_H2O_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_ = A
169
+ diff,wt_g_O,wt_g_H = B
170
+ wt_g, wt_O_, wt_H_ = C
171
+ guessx = xg_O2_
172
+ elif system == "SOFe":
173
+ xg_O2_,A,B,C = eq_SOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses) # SOFe system
174
+ xg_SO2_, xg_S2_, Xg_t, Fe32, Fe3T, wm_S_, wm_SO3_, S62, S6T, wm_ST_ = A
175
+ diff,wt_g_O,wt_g_S = B
176
+ wt_g, wt_O_, wt_S_ = C
177
+ guessx = xg_O2_
178
+ Xm_t,= "",
179
+ elif system == "CHOFe":
180
+ if models.loc["insolubles","option"] == "no":
181
+ xg_O2_, xg_CO_, A,B,C = eq_CHOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses) # CHOFe system
182
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_ = A
183
+ mbCO, mbCH, wt_g_O, wt_g_C, wt_g_H = B
184
+ wt_g, wt_O_, wt_C_, wt_H_ = C
185
+ guessx, guessy = xg_O2_,xg_CO_
186
+ solve_species = "OC"
187
+ elif models.loc["insolubles","option"] == "H2O-CO2 only":
188
+ xg_CO2_, A,B,C = eq_CH(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses) # CHOFe system
189
+ xg_CO2_, xg_H2O_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, wm_H2O_, wm_CO2_ = A
190
+ mbCH, wt_g_C, wt_g_H = B
191
+ wt_g, wt_O_, wt_C_, wt_H_ = C
192
+ guessx = xg_CO2_
193
+ xg_O2_, xg_H2_, xg_CO_, xg_CH4_, wm_H2_, wm_CO_, wm_CH4_, wt_g_O = 0.,0.,0.,0.,0.,0.,0.,""
194
+ Fe3T = melt_wf["Fe3FeT"]
195
+ Fe32 = mg.overtotal2ratio(Fe3T)
196
+ elif models.loc["insolubles","option"] == "yes":
197
+ xg_O2_, xg_CO_, A,B,C = eq_CHOFe_2(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses) # CHOFe system
198
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CO_, wm_CH4_ = A
199
+ mbCO, mbCH, wt_g_O, wt_g_C, wt_g_H = B
200
+ wt_g, wt_O_, wt_C_, wt_H_ = C
201
+ guessx, guessy = xg_O2_, xg_CO_
202
+ solve_species = "OC"
203
+ elif system == "SHOFe":
204
+ if models.loc["insolubles","option"] == "no" and models.loc["H2S_m","option"] == "no":
205
+ xg_O2_, xg_S2_, A,B,C, = eq_SHOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses) # SHOFe system
206
+ xg_SO2_, xg_H2O_, xg_H2_, xg_H2S_, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_ = A
207
+ mbSO, mbSH, wt_g_O, wt_g_S, wt_g_H = B
208
+ wt_g, wt_O_, wt_S_, wt_H_ = C
209
+ wm_H2_, wm_H2S_ = 0.,0.
210
+ elif models.loc["insolubles","option"] == "yes" and models.loc["H2S_m","option"] == "yes":
211
+ A,B,C,D = eq_SHOFe_2(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses)
212
+ xg_O2_, xg_H2_, xg_S2_, xg_H2O_, xg_SO2_, xg_H2S_, Xg_t, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_, wm_H2S_, wm_H2_ = B
213
+ mbX, mbZ, wt_g_O, wt_g_H, wt_g_S = C
214
+ wt_g, wt_O_, wt_H_, wt_S_ = D
215
+ elif models.loc["insolubles","option"] == "yes" and models.loc["H2S_m","option"] == "no":
216
+ print("not possible")
217
+ elif models.loc["insolubles","option"] == "no" and models.loc["H2S_m","option"] == "yes":
218
+ print("not possible")
219
+ guessx, guessy = xg_O2_, xg_S2_
220
+ solve_species = "OS"
221
+ elif system == "SCOFe":
222
+ xg_O2_, xg_CO_, A,B,C, = eq_SCOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses)
223
+ xg_SO2_, xg_CO2_, xg_CO_, xg_OCS_, xg_S2_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_CO2_, wm_ST_, wm_CO_ = A
224
+ mbCO, mbCS, wt_g_O, wt_g_S, wt_g_C = B
225
+ wt_g, wt_O_, wt_S_, wt_C_= C
226
+ guessx, guessy = xg_O2_, xg_CO_
227
+ elif system == "COXFe":
228
+ xg_O2_, xg_CO_, A,B,C, = eq_COXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses)
229
+ xg_X_, xg_CO2_, xg_CO_, xm_CO2_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_ = A
230
+ mbCO, mbCX, wt_g_O, wt_g_X, wt_g_C = B
231
+ wt_g, wt_O_, wt_X_, wt_C_= C
232
+ guessx, guessy = xg_O2_, xg_CO_
233
+ elif system == "HOXFe":
234
+ xg_O2_, xg_H2_, A,B,C, = eq_HOXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guessx,guessy)
235
+ xg_X_, xg_H2O_, xg_H2_, xm_H2O_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_ = A
236
+ mbHO, mbHX, wt_g_O, wt_g_X, wt_g_H = B
237
+ wt_g, wt_O_, wt_X_, wt_H_= C
238
+ guessx, guessy = xg_O2_, xg_H2_
239
+ elif system == "SCHOFe":
240
+ if models.loc["insolubles","option"] == "H2O-CO2 only":
241
+ print("change insolubles option to yes or no")
242
+ elif models.loc["insolubles","option"] == "no" and models.loc["H2S_m","option"] == "no":
243
+ A,B,C,D = eq_SCHOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species) # SHOFe system
244
+ if solve_species == "OCS":
245
+ xg_O2_, xg_CO_, xg_S2_ = A
246
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = B
247
+ guessx, guessy, guessz = xg_O2_, xg_CO_, xg_S2_
248
+ elif solve_species == "OHS":
249
+ xg_O2_, xg_H2_, xg_S2_ = A
250
+ xg_CO_, xg_CO2_, xg_H2O_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = B
251
+ guessx, guessy, guessz = xg_O2_, xg_H2_, xg_S2_
252
+ elif solve_species == "OCH":
253
+ xg_O2_, xg_CO_, xg_H2_ = A
254
+ xg_CO2_, xg_H2O_, xg_CH4_, xg_S2_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = B
255
+ guessx, guessy, guessz = xg_O2_, xg_CO_, xg_H2_
256
+ wm_H2_, wm_CO_, wm_CH4_, wm_H2S_ = 0.,0.,0.,0.
257
+ elif models.loc["insolubles","option"] == "yes" and models.loc["H2S_m","option"] == "yes":
258
+ if models.loc["Hspeciation","option"] == "none":
259
+ A,B,C,D = eq_SCHOFe_2(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species)
260
+ elif models.loc["Hspeciation","option"] == "linear":
261
+ A,B,C,D = eq_SCHOFe_3(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species)
262
+ if solve_species == "OCS":
263
+ xg_O2_, xg_CO_, xg_S2_ = A
264
+ guessx, guessy, guessz = xg_O2_, xg_CO_, xg_S2_
265
+ elif solve_species == "OHS":
266
+ xg_O2_, xg_H2_, xg_S2_ = A
267
+ guessx, guessy, guessz = xg_O2_, xg_H2_, xg_S2_
268
+ elif solve_species == "OCH":
269
+ xg_O2_, xg_CO_, xg_H2_ = A
270
+ guessx, guessy, guessz = xg_O2_, xg_CO_, xg_H2_
271
+ xg_O2_, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_ = B
272
+ elif models.loc["insolubles","option"] == "yes" and models.loc["H2S_m","option"] == "no":
273
+ print("not possible")
274
+ mbX, mbY, mbZ, wt_g_O, wt_g_C, wt_g_H, wt_g_S = C
275
+ wt_g, wt_O_, wt_C_, wt_H_, wt_S_ = D
276
+ elif system == "CHOXFe":
277
+ if models.loc["insolubles","option"] == "no":
278
+ print("Not working yet")
279
+ elif models.loc["insolubles","option"] == "yes" :
280
+ A,B,C,D = eq_CHOXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species) # SHOFe system
281
+ xg_O2_, xg_CO_, xg_X_ = A
282
+ guessx, guessy, guessz = xg_O2_, xg_CO_, xg_X_
283
+ xg_O2__, xg_H2_, xg_X__, xg_H2O_, xg_CO__, xg_CO2_, xg_CH4_, Xg_t, xm_H2O_, xm_CO2_, wm_X_, Xm_t, Xm_t_ox, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CH4_, wm_CO_ = B
284
+ mbX, mbY, mbZ, wt_g_O, wt_g_C, wt_g_H, wt_g_X = C
285
+ wt_g, wt_O_, wt_C_, wt_H_, wt_X_ = D
286
+ elif system == "SCHOXFe":
287
+ if models.loc["insolubles","option"] == "no" and models.loc["H2S_m","option"] == "no":
288
+ print("cannot do")
289
+ elif models.loc["insolubles","option"] == "yes" and models.loc["H2S_m","option"] == "yes":
290
+ xg_O2_,xg_CO_,xg_S2_,xg_X_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,wm_X_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T,wt_g = eq_SCHOXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species) # SCHOXFe system
291
+ Xm_t_ox,mbX, mbY, mbZ, wt_g_O, wt_g_C, wt_g_H, wt_g_S, mbW, wt_g_X,wt_O_, wt_C_, wt_H_, wt_S_, wt_X_ = "","","","","","","","","","","","","","",""
292
+
293
+ if system in ["HOFe","HOFe","CHOFe","CHOXFe","SHOFe","SCHOFe","SCHOXFe"]: # contains H
294
+ wm_H2Omol_, wm_OH_ = mg.wm_H2Omol_OH(PT,melt_wf,species,models)
295
+ if system in ["COFe","COXFe","CHOFe","CHOXFe","SCHOFe","SCHOXFe"]: # contains C
296
+ wm_CO2carb_, wm_CO2mol_ = mg.wm_CO32_CO2mol(PT,melt_wf,species,models)
297
+
298
+ wm_S6p_ = (wm_SO3_/species.loc["SO3","M"])*species.loc["S","M"]
299
+
300
+ xg = {"xg_O2":xg_O2_, "xg_H2":xg_H2_, "xg_S2":xg_S2_, "xg_H2O":xg_H2O_, "xg_CO":xg_CO_, "xg_CO2":xg_CO2_, "xg_SO2":xg_SO2_, "xg_CH4":xg_CH4_, "xg_H2S":xg_H2S_, "xg_OCS":xg_OCS_, "xg_X":xg_X_, "Xg_t":Xg_t}
301
+ melt = {"xm_H2O":xm_H2O_, "xm_CO2":xm_CO2_, "Xm_t":Xm_t, "wm_H2O":wm_H2O_, "wm_H2Omol":wm_H2Omol_, "wm_OH":wm_OH_,"wm_H2":wm_H2_, "wm_CO2":wm_CO2_, "wm_CO2carb":wm_CO2carb_, "wm_CO2mol":wm_CO2mol_, "wm_CO":wm_CO_, "wm_CH4":wm_CH4_, "wm_S":wm_S_,"wm_S2m":wm_S_, "wm_SO3":wm_SO3_,"wm_S6p":wm_S6p_, "wm_H2S":wm_H2S_, "wm_ST":wm_ST_, "wm_X":wm_X_, "Fe32":Fe32, "Fe3T":Fe3T, "S62":S62, "S6T":S6T}
302
+ melt_and_gas = {"wt_g_O":wt_g_O, "wt_g_C":wt_g_C, "wt_g_H":wt_g_H, "wt_g_S":wt_g_S, "wt_g_X":wt_g_X, "wt_g":wt_g, "wt_O":wt_O_, "wt_C":wt_C_, "wt_H":wt_H_, "wt_S":wt_S_, "wt_X":wt_X_,}
303
+ guesses["guessx"] = guessx
304
+ guesses["guessy"] = guessy
305
+ guesses["guessz"] = guessz
306
+ guesses["guessw"] = guessw
307
+ return xg, melt, melt_and_gas, guesses
308
+
309
+
310
+ #################################################
311
+ ### specitation of H and C at given P and fO2 ###
312
+ #################################################
313
+
314
+ def eq_C_melt(PT,melt_wf,species,models): # equilibrium partitioning of C in the melt in CO system
315
+
316
+ wt_C = melt_wf['CT'] # weight fraction
317
+ K1 = mdv.KCOg(PT,models)
318
+ K2 = mdv.C_CO3(PT,melt_wf,species,models) # mole fraction
319
+ K3 = (mdv.C_CO(PT,melt_wf,species,models))/1000000. # weight fraction
320
+ M_C = species.loc['C','M']
321
+ M_CO = species.loc['CO','M']
322
+ M_CO2 = species.loc['CO2','M']
323
+ M_m_ = mg.M_m_SO(melt_wf,species)
324
+ fO2 = mdv.f_O2(PT,melt_wf,species,models)
325
+ a = K3*M_C*(M_CO2 - M_m_)
326
+ b = K3*M_m_*M_C + K1*K2*fO2**0.5*M_CO*(M_C - M_CO2*wt_C + M_m_*wt_C)
327
+ c = -wt_C*K1*K2*fO2**0.5*M_CO*M_m_
328
+ xm_CO2_ = (-b + (b**2 - 4.*a*c)**0.5)/(2.*a) # mole fraction CO32-
329
+ wm_CO2_ = (xm_CO2_*M_CO2)/((xm_CO2_*M_CO2) + ((1.-xm_CO2_)*M_m_)) # weight fraction CO32- as CO2
330
+ wm_CO_ = ((wt_C - (wm_CO2_/M_CO2)*M_C)/M_C)*M_CO # weight fraction CO
331
+ check = M_C*((wm_CO2_/M_CO2)+(wm_CO_/M_CO))
332
+ result = {"xm_CO2":xm_CO2_, "wm_CO2":wm_CO2_, "wm_CO":wm_CO_}
333
+ return result
334
+
335
+ def eq_H_melt(PT,melt_wf,species,models,nr_step,nr_tol): # equilibrium partitioning of H in the melt in HO system
336
+ if models.loc["Hspeciation","option"] != "none":
337
+ print("not possible yet")
338
+ wt_H = melt_wf['HT'] # weight fraction
339
+ K1 = mdv.KHOg(PT,models)
340
+ K2 = mdv.C_H2O(PT,melt_wf,species,models) # mole fraction
341
+ K3 = mdv.C_H2(PT,melt_wf,species,models) # ppm
342
+ M_H = species.loc['H','M']
343
+ M_H2 = species.loc['H2','M']
344
+ M_H2O = species.loc['H2O','M']
345
+ M_m_ = mg.M_m_SO(melt_wf,species)
346
+ fO2 = mdv.f_O2(PT,melt_wf,species,models)
347
+ X = ((K1*K2)/K3)*fO2**0.5 # xH2O**2/wH2 with H2O in mole fraction and H2 in ppm
348
+ Y = X/(X+1.) # xH2O**2/(xH2O**2+wH2) with H2O in mole fration and H2 in ppm
349
+ a = Y*M_H2O - Y*M_m_ - M_H2O + M_m_
350
+ b = (Y - 1.)*M_m_
351
+ c = 1000000.*Y*(wt_H*M_H2O - wt_H*M_m_ - 2.*M_H)
352
+ d = 1000000.*Y*wt_H*M_m_
353
+ constants = [a, b, c, d]
354
+ def f(x, constants):
355
+ return a*x**3 + b*x**2 + c*x + d
356
+ def df(x, constants):
357
+ return 3.*a*x**2 + 2.*b*x + c
358
+ def dx(x, constants):
359
+ f_ = f(x, constants)
360
+ result =(abs(0-f_))
361
+ return result
362
+ x0 = mg.xm_H2OT_so(melt_wf,species)
363
+ delta1 = dx(x0, constants)
364
+ while delta1 > nr_tol:
365
+ f_ = f(x0, constants)
366
+ df_ = df(x0, constants)
367
+ x0 = x0 - nr_step*(f_/df_)
368
+ delta1 = dx(x0, constants)
369
+ xm_H2O_ = x0
370
+ wm_H2O_ = (xm_H2O_*M_H2O)/(xm_H2O_*M_H2O + (1.-xm_H2O_)*M_m_) # weight fraction H2O
371
+ wm_H2_ = wt_H - ((wm_H2O_/M_H2O)*(2*M_H)) # weight fraction H2
372
+ result = {"xm_H2O":xm_H2O_, "wm_H2O":wm_H2O_, "wm_H2":wm_H2_}
373
+ return result
374
+
375
+ def eq_S_melt(PT,melt_wf,species,models):
376
+ S6p_ST = mg.S6ST(PT,melt_wf,species,models)
377
+ S2m_ST = 1. - S6p_ST
378
+ wm_S2m_ = S2m_ST*wt_S
379
+ wm_S6p_ = S6p_ST*wt_S
380
+ result = {"wm_S2m":wm_S2m_, "wm_S6p":wm_S6p}
381
+ return result
382
+
383
+ def eq_CH_melt(PT,melt_wf,species,models,nr_step,nr_tol,guesses):
384
+ P = PT["P"]
385
+ wt_C = melt_wf['CT']
386
+ wt_H = melt_wf['HT']
387
+ fO2 = mdv.f_O2(PT,melt_wf,species,models)
388
+ guessx = guesses["guessx"]
389
+ guessy = guesses["guessy"]
390
+
391
+ # equilibrium constants
392
+ K1_ = mdv.KHOg(PT,models)
393
+ K2_ = mdv.KCOg(PT,models)
394
+ K3_ = mdv.KCOHg(PT,models)
395
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models) # mole fraction
396
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models) # mole fraction
397
+ K6_ = mdv.C_H2(PT,melt_wf,species,models) # ppm
398
+ K7_ = mdv.C_CO(PT,melt_wf,species,models) # ppm
399
+ K8_ = mdv.C_CH4(PT,melt_wf,species,models) # ppm
400
+
401
+ # molecular masses
402
+ M_H = species.loc['H','M']
403
+ M_C = species.loc['C','M']
404
+ M_CO = species.loc['CO','M']
405
+ M_H2O = species.loc['H2O','M']
406
+ M_H2 = species.loc['H2','M']
407
+ M_CO2 = species.loc['CO2','M']
408
+ M_CH4 = species.loc['CH4','M']
409
+ M_m_ = mg.M_m_SO(melt_wf,species)
410
+
411
+ constants = [wt_C, wt_H, K1_, K2_, K3_, K4_, K5_, K6_, K7_, K8_, M_C, M_H, M_CO, M_CO2, M_H2, M_H2O, M_CH4, M_m_, fO2]
412
+
413
+ def mg_CH(xm_CO2_,xm_H2O_):
414
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
415
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t # weight fraction
416
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t # weight fraction
417
+ fH2O = (xm_H2O_**2.)/K4_
418
+ fCO2 = xm_CO2_/K5_
419
+ fH2 = fH2O/(K1_*fO2**0.5)
420
+ wm_H2_ = (fH2*K6_)/1000000. # weight fraction
421
+ fCO = fCO2/(K2_*fO2**0.5)
422
+ wm_CO_ = (fCO*K7_)/1000000. # weight fraction
423
+ fCH4 = (fCO2*fH2O**2.)/(K3_*fO2**2.)
424
+ wm_CH4_ = (fCH4*K8_)/1000000. # weight fraction
425
+ return Xm_t, wm_H2O_, wm_CO2_, wm_H2_, wm_CO_, wm_CH4_
426
+
427
+ def f_CH(xm_CO2_,xm_H2O_):
428
+ Xm_t, wm_H2O_, wm_CO2_, wm_H2_, wm_CO_, wm_CH4_ = mg_CH(xm_CO2_,xm_H2O_)
429
+ wt_m_C = M_C*((wm_CO2_/M_CO2) + (wm_CO_/M_CO) + (wm_CH4_/M_CH4))
430
+ wt_m_H = M_H*(2.*(wm_H2O_/M_H2O) + 2.*(wm_H2_/M_H2) + 4.*(wm_CH4_/M_CH4))
431
+ mbC = (wt_C - wt_m_C)
432
+ mbH = (wt_H - wt_m_H)
433
+ return mbC, mbH, wt_m_C, wt_m_H, 0.
434
+
435
+ def df_CH(xm_CO2_,xm_H2O_,constants):
436
+ dmbC_C = -M_C*(xm_CO2_*(-M_CO2 + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 1/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0)) + 1.0e-6*K8_*fO2**(-2.0)*(xm_H2O_**2.0/K4_)**2.0/(K3_*K5_*M_CH4) + 1.0e-6*K7_*fO2**(-0.5)/(K2_*K5_*M_CO))
437
+ dmbC_H = -M_C*(xm_CO2_*(-M_H2O + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 4.0e-6*K8_*fO2**(-2.0)*xm_CO2_*xm_H2O_**(-1.0)*(xm_H2O_**2.0/K4_)**2.0/(K3_*K5_*M_CH4))
438
+ dmbH_C = -M_H*(2.0*xm_H2O_*(-M_CO2 + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 4.0e-6*K8_*fO2**(-2.0)*(xm_H2O_**2.0/K4_)**2.0/(K3_*K5_*M_CH4))
439
+ dmbH_H = -M_H*(2.0*xm_H2O_*(-M_H2O + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 2.0/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0)) + 1.6e-5*K8_*fO2**(-2.0)*xm_CO2_*xm_H2O_**(-1.0)*(xm_H2O_**2.0/K4_)**2.0/(K3_*K5_*M_CH4) + 4.0e-6*K6_*fO2**(-0.5)*xm_H2O_**1.0/(K1_*K4_*M_H2))
440
+ return dmbC_C, dmbC_H, dmbH_C, dmbH_H
441
+
442
+ xm_CO2_,xm_H2O_ = jac_newton(guessx,guessy,constants,f_CH,df_CH,nr_step,nr_tol)
443
+ results1 = mg_CH(xm_CO2_,xm_H2O_)
444
+ results2 = f_CH(xm_CO2_,xm_H2O_)
445
+ return xm_CO2_,xm_H2O_, results1, results2
446
+
447
+ def eq_HS_melt(PT,melt_wf,species,models,nr_step,nr_tol): # not sure this is right?
448
+ wt_S = melt_wf['ST']
449
+ wt_H = melt_wf['HT']
450
+ fO2 = mdv.f_O2(PT,melt_wf,species,models)
451
+
452
+ # equilibrium constants
453
+ K1_ = mdv.KHOSg(PT,models)
454
+ K2_ = mdv.C_H2O(PT,melt_wf,species,models) # mole fraction
455
+ K3_ = mdv.C_S(PT,melt_wf,species,models)/1000000. # weight fraction
456
+ K4_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000. # weight fraction
457
+ K5_ = mdv.C_H2S(PT,melt_wf,species,models)/1000000. # weight fraction
458
+ K6_ = mdv.KHOg(PT,models)
459
+ K7_ = mdv.C_H2(PT,melt_wf,species,models)/1000000. # weight fraction
460
+
461
+ # molecular masses
462
+ M_H = species.loc['H','M']
463
+ M_S = species.loc['S','M']
464
+ M_H2O = species.loc['H2O','M']
465
+ M_H2S = species.loc['H2S','M']
466
+ M_m_ = mg.M_m_SO(melt_wf,species)
467
+
468
+ #constants = [wt_C, wt_H, K1_, K2_, K3_, K4_, K5_, K6_, K7_, K8_, M_C, M_H, M_CO, M_CO2, M_H2, M_H2O, M_CH4, M_m_, fO2]
469
+
470
+ def dx(x):
471
+ f_ = f(x)
472
+ result =(abs(0-f_))
473
+ return result
474
+
475
+ def mg_HS(xm_H2O_):
476
+ Xm_t = xm_H2O_*M_H2O + (1.0-xm_H2O_)*M_m_
477
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t # weight fraction
478
+ fH2O = (xm_H2O_**2.)/K2_
479
+ fH2 = fH2O/(K6_*fO2**0.5)
480
+ if models.loc['insolubles','option'] == 'yes':
481
+ wm_H2_ = fH2*K7_ # weight fraction
482
+ else:
483
+ wm_H2_ = 0.
484
+ wm_S2m_ = wt_S/(1 + (K4_*fO2**2)/K3_ + (K1_*K5_*M_S*xm_H2O_**2)/(K2_*K3_*M_H2S)) # weight fraction
485
+ if models.loc['H2S_m','option'] == 'yes':
486
+ wm_H2S_ = (K1_*K5_*xm_H2O_**2*wm_S2m_)/(K2_*K3_) # weight fraction
487
+ else:
488
+ wm_H2S_ = 0.
489
+ wm_S6p_ = (K4_*fO2**2*wm_S2m_)/K3_ # weight fraction
490
+ return Xm_t, wm_H2O_, wm_H2_, wm_S2m_, wm_S6p_, wm_H2S_
491
+
492
+ def f(xm_H2O_):
493
+ Xm_t, wm_H2O_, wm_H2_, wm_S2m_, wm_S6p_, wm_H2S_ = mg_HS(xm_H2O_)
494
+ result = wm_H2_ + ((2.*M_H*wm_H2S_)/M_H2S) + (2.*M_H*xm_H2O_)/(M_H2O*xm_H2O_ + (1 - xm_H2O_)*M_m_) - wt_H
495
+ return result
496
+
497
+ def df(xm_H2O_):
498
+ result = -4*K1_**2*K5_**2*M_H*M_S*wt_S*xm_H2O_**3/(K2_**2*K3_**2*M_H2S**2*(K1_*K5_*M_S*xm_H2O_**2/(K2_*K3_*M_H2S) + 1 + K4_*fO2**2/K3_)**2) + 4*K1_*K5_*M_H*wt_S*xm_H2O_/(K2_*K3_*M_H2S*(K1_*K5_*M_S*xm_H2O_**2/(K2_*K3_*M_H2S) + 1 + K4_*fO2**2/K3_)) + 2*M_H*xm_H2O_*(-M_H2O + M_m_)/(M_H2O*xm_H2O_ + M_m_*(1 - xm_H2O_))**2 + 2*M_H/(M_H2O*xm_H2O_ + M_m_*(1 - xm_H2O_)) + 2*K7_*fO2**(-0.5)*xm_H2O_/(K2_*K6_)
499
+ return result
500
+
501
+ x0 = mg.xm_H2OT_so(melt_wf,species)
502
+ delta1 = dx(x0)
503
+ while delta1 > nr_tol:
504
+ f_ = f(x0)
505
+ df_ = df(x0)
506
+ x0 = x0 - nr_step*(f_/df_)
507
+ delta1 = dx(x0)
508
+ xm_H2O_ = x0
509
+ Xm_t, wm_H2O_, wm_H2_, wm_S2m_, wm_S6p_, wm_H2S_ = mg_HS(xm_H2O_)
510
+ result = {"xm_H2O":xm_H2O_, "wm_H2O":wm_H2O_, "wm_H2":wm_H2_, "wm_S2m":wm_S2m_, "wm_S6p":wm_S6p_, "wm_H2S":wm_H2S_}
511
+ return
512
+
513
+ def eq_CHS_melt(PT,melt_wf,species,models,nr_step,nr_tol,guesses):
514
+ wt_S = melt_wf['ST']
515
+ wt_H = melt_wf['HT']
516
+ wt_C = melt_wf['CT']
517
+ fO2 = mdv.f_O2(PT,melt_wf,species,models)
518
+ guessx = guesses["guessx"]
519
+ guessy = guesses["guessy"]
520
+ guessz = guesses["guessz"]
521
+
522
+ # equilibrium constants
523
+ K1_ = mdv.KHOSg(PT,models)
524
+ K2_ = mdv.C_H2O(PT,melt_wf,species,models) # mole fraction
525
+ K3_ = mdv.C_S(PT,melt_wf,species,models)/1000000. # weight fraction
526
+ K4_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000. # weight fraction
527
+ K5_ = mdv.C_H2S(PT,melt_wf,species,models)/1000000. # weight fraction
528
+ K6_ = mdv.KHOg(PT,models)
529
+ K7_ = mdv.C_H2(PT,melt_wf,species,models)/1000000. # weight fraction
530
+ K8_ = mdv.KHOg(PT,models)
531
+ K9_ = mdv.KCOg(PT,models)
532
+ K10_ = mdv.KCOHg(PT,models)
533
+ K11_ = mdv.C_CO3(PT,melt_wf,species,models) # mole fraction
534
+ K12_ = mdv.C_CO(PT,melt_wf,species,models)/1000000. # weight fraction
535
+ K13_ = mdv.C_CH4(PT,melt_wf,species,models)/1000000. # weight fraction
536
+
537
+ # molecular masses
538
+ M_H = species.loc['H','M']
539
+ M_S = species.loc['S','M']
540
+ M_H2O = species.loc['H2O','M']
541
+ M_H2S = species.loc['H2S','M']
542
+ M_m_ = mg.M_m_SO(melt_wf,species)
543
+ M_C = species.loc['C','M']
544
+ M_CO = species.loc['CO','M']
545
+ M_H2 = species.loc['H2','M']
546
+ M_CO2 = species.loc['CO2','M']
547
+ M_CH4 = species.loc['CH4','M']
548
+
549
+ constants = [wt_C, wt_H, wt_S, K1_, K2_, K3_, K4_, K5_, K6_, K7_, K8_, K9_, K10_, K11_, K12_, K13_, M_C, M_H, M_S, M_CO, M_CO2, M_H2, M_H2O, M_CH4, M_m_, fO2]
550
+
551
+ def dx(x):
552
+ f_ = f(x)
553
+ result =(abs(0-f_))
554
+ return result
555
+
556
+ def mg_CHS(xm_CO2_,xm_H2O_,wm_S2m_):
557
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
558
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t # weight fraction
559
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t # weight fraction
560
+ if models.loc["Hspeciation","option"] == "none":
561
+ fH2O = (xm_H2O_**2.)/K2_
562
+ elif models.loc["Hspeciation","option"] == "linear":
563
+ fH2O = xm_H2O_/K2_
564
+ fCO2 = xm_CO2_/K11_
565
+ if models.loc["insolubles","option"] == "yes":
566
+ fH2 = fH2O/(K6_*fO2**0.5)
567
+ wm_H2_ = fH2*K7_ # weight fraction
568
+ fCO = fCO2/(K9_*fO2**0.5)
569
+ wm_CO_ = fCO*K12_ # weight fraction
570
+ fCH4 = (fCO2*fH2O**2.)/(K10_*fO2**2.)
571
+ wm_CH4_ = fCH4*K13_ # weight fraction
572
+ else:
573
+ wm_H2_, wm_CO_,wm_CH4 = 0.,0.,0.
574
+ fS2 = (fO2*wm_S2m_**2.)/K3_**2.
575
+ if models.loc["H2S_m","option"] == "yes":
576
+ fH2S = (K1_*fS2**0.5*fH2O)/fO2**0.5
577
+ wm_H2S_ = fH2S*K5_ # weight fraction
578
+ else:
579
+ wm_H2S_ = 0.
580
+ wm_S6p_ = K4_*fS2**0.5*fO2**1.5 # weight fraction
581
+ return Xm_t, wm_H2O_, wm_H2_, wm_CO2_, wm_CO_, wm_CH4_, wm_S2m_, wm_S6p_, wm_H2S_
582
+
583
+ def f_CHS(xm_CO2_,xm_H2O_,wm_S2m_):
584
+ Xm_t, wm_H2O_, wm_H2_, wm_CO2_, wm_CO_, wm_CH4_, wm_S2m_, wm_S6p_, wm_H2S_ = mg_CHS(xm_CO2_,xm_H2O_,wm_S2m_)
585
+ wt_m_C = M_C*((wm_CO2_/M_CO2) + (wm_CO_/M_CO) + (wm_CH4_/M_CH4))
586
+ wt_m_H = M_H*(2.*(wm_H2O_/M_H2O) + 2.*(wm_H2_/M_H2) + 4.*(wm_CH4_/M_CH4) + 2.*(wm_H2S_/M_H2S))
587
+ wt_m_S = M_S*((wm_S2m_/M_S) + (wm_S6p_/M_S) + (wm_H2S_/M_H2S))
588
+ wt_m_O = "na"
589
+ mbC = (wt_C - wt_m_C)
590
+ mbH = (wt_H - wt_m_H)
591
+ mbS = (wt_S - wt_m_S)
592
+ return mbC, mbH, mbS, wt_m_C, wt_m_H, wt_m_S, wt_m_O
593
+
594
+ def df_CHS(xm_CO2_,xm_H2O_,wm_S2m_,constants):
595
+ if models.loc["Hspeciation","option"] == "none":
596
+ dmbC_C = -M_C*(xm_CO2_*(-M_CO2 + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 1/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0)) + K12_*fO2**(-0.5)/(K11_*K9_*M_CO) + K13_*fO2**(-2.0)*(xm_H2O_**2.0/K2_)**2.0/(K10_*K11_*M_CH4))
597
+ dmbC_H = -M_C*(xm_CO2_*(-M_H2O + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 4.0*K13_*fO2**(-2.0)*xm_CO2_*xm_H2O_**(-1.0)*(xm_H2O_**2.0/K2_)**2.0/(K10_*K11_*M_CH4))
598
+ dmbC_S = 0.
599
+ dmbH_C = -M_H*(2.0*xm_H2O_*(-M_CO2 + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 4.0*K13_*fO2**(-2.0)*(xm_H2O_**2.0/K2_)**2.0/(K10_*K11_*M_CH4))
600
+ dmbH_H = -M_H*(4.0*K1_*K5_*fO2**(-0.5)*xm_H2O_**1.0*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S) + 2.0*xm_H2O_*(-M_H2O + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 2.0/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0)) + 4.0*K7_*fO2**(-0.5)*xm_H2O_**1.0/(K2_*K6_*M_H2) + 16.0*K13_*fO2**(-2.0)*xm_CO2_*xm_H2O_**(-1.0)*(xm_H2O_**2.0/K2_)**2.0/(K10_*K11_*M_CH4))
601
+ dmbH_S = -2.0*K1_*K5_*M_H*fO2**(-0.5)*wm_S2m_**(-1.0)*xm_H2O_**2.0*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S)
602
+ dmbS_C = 0.
603
+ dmbS_H = -2.0*K1_*K5_*M_S*fO2**(-0.5)*xm_H2O_**1.0*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S)
604
+ dmbS_S = -M_S*(1.0*K1_*K5_*fO2**(-0.5)*wm_S2m_**(-1.0)*xm_H2O_**2.0*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S) + 1.0*K4_*fO2**1.5*wm_S2m_**(-1.0)*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/M_S + 1/M_S)
605
+ elif models.loc["Hspeciation","option"] == "linear":
606
+ dmbC_C = -M_C*(xm_CO2_*(-M_CO2 + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 1/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0)) + K12_*fO2**(-0.5)/(K11_*K9_*M_CO) + K13_*fO2**(-2.0)*(xm_H2O_/K2_)**2.0/(K10_*K11_*M_CH4))
607
+ dmbC_H = -M_C*(xm_CO2_*(-M_H2O + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 2.0*K13_*fO2**(-2.0)*xm_CO2_*(xm_H2O_/K2_)**2.0/(K10_*K11_*M_CH4*xm_H2O_))
608
+ dmbC_S = 0.
609
+ dmbH_C = -M_H*(2.0*xm_H2O_*(-M_CO2 + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 4.0*K13_*fO2**(-2.0)*(xm_H2O_/K2_)**2.0/(K10_*K11_*M_CH4))
610
+ dmbH_H = -M_H*(2.0*K1_*K5_*fO2**(-0.5)*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S) + 2.0*xm_H2O_*(-M_H2O + M_m_)/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0))**2 + 2.0/(M_CO2*xm_CO2_ + M_H2O*xm_H2O_ + M_m_*(-xm_CO2_ - xm_H2O_ + 1.0)) + 2.0*K7_*fO2**(-0.5)/(K2_*K6_*M_H2) + 8.0*K13_*fO2**(-2.0)*xm_CO2_*(xm_H2O_/K2_)**2.0/(K10_*K11_*M_CH4*xm_H2O_))
611
+ dmbH_S = -2.0*K1_*K5_*M_H*fO2**(-0.5)*wm_S2m_**(-1.0)*xm_H2O_*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S)
612
+ dmbS_C = 0.
613
+ dmbS_H = -K1_*K5_*M_S*fO2**(-0.5)*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S)
614
+ dmbS_S = -M_S*(1.0*K1_*K5_*fO2**(-0.5)*wm_S2m_**(-1.0)*xm_H2O_*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/(K2_*M_H2S) + 1.0*K4_*fO2**1.5*wm_S2m_**(-1.0)*(K3_**(-2.0)*fO2*wm_S2m_**2.0)**0.5/M_S + 1/M_S)
615
+ return dmbC_C, dmbC_H, dmbC_S, dmbH_C, dmbH_H, dmbH_S, dmbS_C, dmbS_H, dmbS_S
616
+
617
+ xm_CO2_,xm_H2O_,wm_S2m_ = jac_newton3(guessx,guessy,guessz,constants,f_CHS,df_CHS,nr_step,nr_tol)
618
+ results1 = mg_CHS(xm_CO2_,xm_H2O_,wm_S2m_)
619
+ results2 = f_CHS(xm_CO2_,xm_H2O_,wm_S2m_)
620
+ return xm_CO2_,xm_H2O_,wm_S2m_, results1, results2
621
+
622
+ def melt_speciation(PT,melt_wf,species,models,nr_step,nr_tol):
623
+ system = set_system(melt_wf,models)
624
+ wt_C = melt_wf['CT']
625
+ wt_H = melt_wf['HT']
626
+ wt_S = melt_wf['ST']
627
+ M_H = species.loc['H','M']
628
+ M_S = species.loc['S','M']
629
+ M_C = species.loc['C','M']
630
+ M_CO = species.loc['CO','M']
631
+ M_H2O = species.loc['H2O','M']
632
+ M_H2 = species.loc['H2','M']
633
+ M_CO2 = species.loc['CO2','M']
634
+ M_CH4 = species.loc['CH4','M']
635
+ M_H2S = species.loc['H2S','M']
636
+
637
+ if system in ["COFe","COXFe","SOFe","SCOFe"]: # no H
638
+ wm_CH4_, wm_H2S_, xm_H2O_, wm_H2O_, wm_H2_ = 0.,0.,0.,0.,0.
639
+ if system in ["HOFe","HOXFe","SOFe","SHOFe"]: # no C
640
+ wm_CH4_, xm_CO2_, wm_CO2_, wm_CO_ = 0.,0.,0.,0.
641
+ if system in ["COFe","COXFe","HOFe","HOXFe","CHOFe","CHOXFe"]: # no S
642
+ wm_H2S_, wm_S2m_, wm_S6p_ = 0.,0.,0.
643
+ if system in ["COFe","SOFe","SCOFe","HOFe","CHOFe","SHOFe"]: # no X
644
+ wm_X_ = 0.
645
+
646
+ if models.loc['insolubles','option'] == 'no':
647
+ wm_CO_, wm_CH4_, wm_H2_ = 0., 0., 0.
648
+ if models.loc['H2S_m','option'] == 'no':
649
+ wm_H2S_ = 0.
650
+
651
+ if system in ["HOFe","HOXFe"]:
652
+ if models.loc['insolubles','option'] == 'yes':
653
+ xm_H2O_, wm_H2O_, wm_H2_ = eq_H_melt(PT,melt_wf,setup,models,nr_step,nr_tol)
654
+ else:
655
+ wm_H2O_, xm_H2O_ = melt_wf["H2OT"], mg.xm_H2O_so(melt_wf,species)
656
+ elif system in ["COFe","COXFe"]:
657
+ if models.loc['insolubles','option'] == 'yes':
658
+ xm_CO2_, wm_CO2_, wm_CO_ = eq_C_melt(PT,melt_wf,species,models)
659
+ else:
660
+ wm_CO2_, xm_CO2_ = melt_wf["CO2"], mg.xm_CO2_so(melt_wf,species)
661
+ elif system == "SOFe":
662
+ wm_S2m_, wm_S6p = eq_S_melt(PT,melt_wf,species,models)
663
+ elif system in ["CHOFe","CHOXFe"]:
664
+ if models.loc['insolubles','option'] == 'yes':
665
+ guesses = {"guessx":mg.xm_CO2_so(melt_wf,species), "guessy":mg.xm_H2OT_so(melt_wf,species)}
666
+ xm_CO2_,xm_H2O_, A, B = eq_CH_melt(PT,melt_wf,species,models,nr_step,nr_tol,guesses)
667
+ Xm_t, wm_H2O_, wm_CO2_, wm_H2_, wm_CO_, wm_CH4_ = A
668
+ else:
669
+ wm_H2O_, xm_H2O_ = melt_wf["H2OT"], mg.xm_H2O_so(melt_wf,species)
670
+ wm_CO2_, xm_CO2_ = melt_wf["CO2"], mg.xm_CO2_so(melt_wf,species)
671
+ elif system == "SHOFe":
672
+ xm_H2O_, wm_H2O_, wm_H2_, wm_S2m_, wm_S6p_, wm_H2S_ = eq_HS_melt(PT,melt_wf,species,models,nr_step,nr_tol)
673
+ elif system == "SCOFe":
674
+ if models.loc['insolubles','option'] == 'yes':
675
+ xm_CO2_, wm_CO2_, wm_CO_ = eq_C_melt(PT,melt_wf,setup,models)
676
+ else:
677
+ wm_CO2_, xm_CO2_ = melt_wf["CO2"], mg.xm_CO2_so(melt_wf,species)
678
+ wm_S2m_, wm_S6p = eq_S_melt(PT,melt_wf,species,models)
679
+ elif system in ["SCHOFe","SCHOXFe"]:
680
+ guesses = {"guessx":mg.xm_CO2_so(melt_wf,species),"guessy":mg.xm_H2OT_so(melt_wf,species),"guessz":wt_S}
681
+ xm_CO2_,xm_H2O_,wm_S2m_, A, B = eq_CHS_melt(PT,melt_wf,species,models,nr_step,nr_tol,guesses)
682
+ Xm_t, wm_H2O_, wm_H2_, wm_CO2_, wm_CO_, wm_CH4_, wm_S2m_, wm_S6p_, wm_H2S_ = A
683
+
684
+ if system in ["HOFe","HOFe","CHOFe","CHOXFe","SHOFe","SCHOFe","SCHOXFe"]: # contains H
685
+ wm_H2Omol_, wm_OH_ = mg.wm_H2Omol_OH(PT,melt_wf,species,models)
686
+ if system in ["COFe","COXFe","CHOFe","CHOXFe","SCHOFe","SCHOXFe"]: # contains C
687
+ wm_CO2carb_, wm_CO2mol_ = mg.wm_CO32_CO2mol(PT,melt_wf,species,models)
688
+
689
+ wm_SO3_ = (wm_S6p_*species.loc["SO3","M"])/species.loc["S","M"]
690
+
691
+ conc = {"xm_H2O":xm_H2O_, "wm_H2O":wm_H2O_, "wm_H2Omol":wm_H2Omol_, "wm_OH":wm_OH_, "xm_CO2":xm_CO2_, "wm_CO2":wm_CO2_, "wm_CO2carb":wm_CO2carb_,"wm_CO2mol":wm_CO2mol_,"wm_H2":wm_H2_, "wm_CO":wm_CO_, "wm_CH4":wm_CH4_, "wm_H2S":wm_H2S_, "wm_S2m":wm_S2m_, "wm_S6p":wm_S6p_, "wm_SO3":wm_SO3_,"ST": wt_S}
692
+ return conc
693
+
694
+ def eq_SOFe_melt(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses): # equilibrium between S and Fe in the melt
695
+ P = PT["P"]
696
+ wt_O = bulk_wf['O']
697
+ wt_S = bulk_wf['S']
698
+ wt_Fe = bulk_wf['Fe']
699
+ wt_H = bulk_wf['H']
700
+ wt_C = bulk_wf['C']
701
+ guess = guesses["guessx"]
702
+
703
+ # equilibrium constants
704
+ K2_ = mdv.C_S(PT,melt_wf,species,models)/1000000.
705
+ K3_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000.
706
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
707
+
708
+ # molecular masses
709
+ M_S = species.loc['S','M']
710
+ M_O = species.loc['O','M']
711
+ M_H = species.loc['H','M']
712
+ M_C = species.loc['C','M']
713
+ M_Fe = species.loc['Fe','M']
714
+ M_O2 = species.loc['O2','M']
715
+ M_FeO15 = species.loc['FeO1.5','M']
716
+ M_FeO = species.loc['FeO','M']
717
+ M_m_ = mg.M_m_ox(melt_wf,species,models)
718
+
719
+ constants = [P, wt_O, wt_S, wt_Fe, wt_H, wt_C, K2_, K3_, KD1_, KD2, y, M_S, M_O, M_Fe, M_O2, M_FeO, M_FeO15, M_m_]
720
+
721
+ def mg_SOFe(fO2):
722
+ Fe32 = ((KD1_*fO2**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*(fO2**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*(fO2**(0.5*y)))
723
+ Fe3T = Fe32/(1+Fe32)
724
+ S62 = (K3_/K2_)*fO2**2.
725
+ S6T = S62/(1+S62)
726
+ return Fe32, Fe3T, S62, S6T
727
+
728
+ def mb_SOFe(fO2):
729
+ return "", '', ''
730
+
731
+ def f_SOFe(fO2):
732
+ Fe32, Fe3T, S62, S6T = mg_SOFe(fO2)
733
+ mb = wt_O - (((wt_H/M_H)/2.)*M_O) - ((wt_C/M_C)*2.*M_O) - (M_O*((wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))) - (((S6T*wt_S)/M_S)*3.*M_O)
734
+ return mb,0.,0.
735
+
736
+ def df_SOFe(fO2,constants):
737
+ result = -wt_Fe*(-0.75*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y*(1.0 - 2.0*y)*(KD1_*fO2**0.25 + 2.0*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y)/(fO2*(KD1_**(2.0*y)*KD2*fO2**(0.5*y)*(1.0 - 2.0*y) + 1.0)**2) + 1.5*(0.25*KD1_*fO2**(-0.75) + 1.0*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y**2/fO2)/(KD1_**(2.0*y)*KD2*fO2**(0.5*y)*(1.0 - 2.0*y) + 1.0))/(M_Fe*((KD1_*fO2**0.25 + 2.0*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y)/(KD1_**(2.0*y)*KD2*fO2**(0.5*y)*(1.0 - 2.0*y) + 1.0) + 1.0)) - wt_Fe*(1.5*(KD1_*fO2**0.25 + 2.0*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y)/(KD1_**(2.0*y)*KD2*fO2**(0.5*y)*(1.0 - 2.0*y) + 1.0) + 1.0)*(0.5*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y*(1.0 - 2.0*y)*(KD1_*fO2**0.25 + 2.0*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y)/(fO2*(KD1_**(2.0*y)*KD2*fO2**(0.5*y)*(1.0 - 2.0*y) + 1.0)**2) - (0.25*KD1_*fO2**(-0.75) + 1.0*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y**2/fO2)/(KD1_**(2.0*y)*KD2*fO2**(0.5*y)*(1.0 - 2.0*y) + 1.0))/(M_Fe*((KD1_*fO2**0.25 + 2.0*KD1_**(2.0*y)*KD2*fO2**(0.5*y)*y)/(KD1_**(2.0*y)*KD2*fO2**(0.5*y)*(1.0 - 2.0*y) + 1.0) + 1.0)**2) - 6.0*K3_*M_O*fO2**1.0*wt_S/(K2_*M_S*(1 + K3_*fO2**2.0/K2_)) + 6.0*K3_**2*M_O*fO2**3.0*wt_S/(K2_**2*M_S*(1 + K3_*fO2**2.0/K2_)**2)
738
+ return result
739
+
740
+ fO2_ = newton_raphson(guessx,constants,nr_tol,nr_step,f_SOFe,df_SOFe)
741
+ result1 = mg_SOFe(fO2_)
742
+ result2 = f_SOFe(fO2_)
743
+ result3 = mb_SOFe(fO2_)
744
+ #print(wt_S, wt_O, xg_O2_, result1, result2, result3)
745
+ return fO2_, result1, result2, result3
746
+
747
+ ##############
748
+ ### solver ###
749
+ ##############
750
+
751
+ def test_f(x,y):
752
+ eq1 = x**2 + y**3 + 7*x*y
753
+ eq2 = x + 2*y**2 + 3*x*y
754
+ return eq1, eq2,0,0,0
755
+
756
+ def test_df(x,y):
757
+ eq1_x = 2*x + 7*y
758
+ eq1_y = 3*y**2 + 7*x
759
+ eq2_x = 1 + 3*y
760
+ eq2_y = 4*y + 3*x
761
+ return eq1_x, eq1_y, eq2_x, eq2_y
762
+
763
+ def test3_f(x,y,z):
764
+ eq1 = x**2 + y**3 + 7*x*y + x*z
765
+ eq2 = x + 2*y**2 + 3*x*y + x*z**3
766
+ eq3 = x + y + z + 3*z**2
767
+ return eq1, eq2, eq3,0,0,0,0
768
+
769
+ def test3_df(x,y,z):
770
+ eq1_x = 2*x + 7*y + z
771
+ eq1_y = 3*y**2 + 7*x
772
+ eq1_z = x
773
+ eq2_x = 1 + 3*y + z**3
774
+ eq2_y = 4*y + 3*x
775
+ eq2_z = 3*x*z**2
776
+ eq3_x = 1
777
+ eq3_y = 1
778
+ eq3_z = 1 + 3*z
779
+ return eq1_x, eq1_y, eq1_z, eq2_x, eq2_y, eq2_z, eq3_x, eq3_y, eq3_z
780
+
781
+ def newton_raphson(x0,constants,e1,step,eqs,deriv):
782
+ # create results table
783
+ results = pd.DataFrame([["guessx","diff","step"]])
784
+ results.to_csv('results_newtraph.csv', index=False, header=False)
785
+
786
+ def dx(x,eqs):
787
+ f_,wtg1,wtg2 = eqs(x)
788
+ result =(abs(0-f_))
789
+ return result
790
+
791
+ delta1 = dx(x0,eqs)
792
+
793
+ results1 = pd.DataFrame([[x0,delta1,step]])
794
+ n = 0.
795
+ results = pd.concat([results, results1], ignore_index=True)
796
+
797
+ while delta1 > e1:
798
+ while x0 < 0.:
799
+ n = n+1.
800
+ results1 = pd.DataFrame([[x0,delta1,step]])
801
+ results = pd.concat([results, results1], ignore_index=True)
802
+ if(i % 50==0):
803
+ results.to_csv('results_newtraph.csv', index=False, header=False)
804
+ step = step/10.
805
+ x0 = x0 - step*(f_/df_)
806
+ n = n+1.
807
+ f_,wtg1,wtg2 = eqs(x0)
808
+ df_ = deriv(x0,constants)
809
+ x0 = x0 - step*(f_/df_)
810
+ delta1 = dx(x0,eqs)
811
+ results1 = pd.DataFrame([[x0,delta1,step]])
812
+ results = pd.concat([results, results1], ignore_index=True)
813
+ if(n % 50==0):
814
+ results.to_csv('results_newtraph.csv', index=False, header=False)
815
+ return x0
816
+
817
+ #jac_newton(1,1,test_f,test_df,1)
818
+
819
+ def jac_newton(x0,y0,constants,eqs,deriv,step,tol,maxiter=1000):
820
+
821
+ # create results table
822
+ results = pd.DataFrame([["guessx","guessy","diff1","diff2","step"]])
823
+ diff1, diff2, wtg1,wtg2,wtg3 = eqs(x0,y0)
824
+ results1 = pd.DataFrame([[x0,y0,diff1,diff2,step]])
825
+ results = pd.concat([results, results1], ignore_index=True)
826
+ n = 0.
827
+
828
+ def F(eqs,x,y):
829
+ a = eqs(x,y)
830
+ return np.array([a[0],a[1]])
831
+
832
+ def x2jac(step,deriv,eqs,guessx,guessy):
833
+ eq1_x, eq1_y, eq2_x, eq2_y = deriv
834
+ Func = F(eqs,guessx,guessy)
835
+ J = np.array([[eq1_x, eq1_y],[eq2_x, eq2_y]])
836
+ det = J[0][0]*J[1][1] - J[0][1]*J[1][0]
837
+ inv_J = (1/det)*np.array(([J[-1][-1],-(J[0][-1])],[-(J[-1][0]),J[0][0]]), dtype=object)
838
+ #inv_J = np.linalg.inv(J)
839
+ new_guess = np.array([guessx, guessy], dtype=object) - step*np.dot(inv_J, Func)
840
+ #new_guess = np.array([guessx,guessy]) - step*np.dot(inv_J,Func)
841
+ return new_guess[0], new_guess[-1], J
842
+
843
+ for iter in range(maxiter):
844
+ n = n+1.
845
+ deriv_ = deriv(x0,y0,constants)
846
+ guessx, guessy, J = x2jac(step,deriv_,eqs,x0, y0)
847
+ while guessx < 0.0 or guessy < 0.0:
848
+ step = step/10.
849
+ guessx, guessy, J = x2jac(step,deriv_,eqs,x0,y0)
850
+ #print(guessx,guessy)
851
+ #print(guessx,guessy,diff1,diff2,wtg1,wtg2,wtg3)
852
+ #if (abs(x0 - guessx)/x0)*100 < tol and (abs(y0-guessy)/y0)*100 < tol: tol = 1e-5
853
+ diff1, diff2, wtg1,wtg2,wtg3 = eqs(guessx,guessy)
854
+ if abs(diff1) < tol and abs(diff2) < tol:
855
+ return guessx, guessy
856
+ elif np.isnan(float(guessx)) or np.isnan(float(guessy)):
857
+ print("nan encountered")
858
+ x0 = guessx
859
+ y0 = guessy
860
+ results1 = pd.DataFrame([[guessx, guessy,diff1,diff2,step]])
861
+ results = pd.concat([results, results1], ignore_index=True)
862
+ if(n % 50==0):
863
+ results.to_csv('results_jacnewton2.csv', index=False, header=False)
864
+
865
+ def jac_newton3(x0,y0,z0,constants,eqs,deriv,step,tol,maxiter=1000):
866
+
867
+ # create results table
868
+ results = pd.DataFrame([["guessx","guessy","guessz","diff1","diff2","diff3","step"]])
869
+ diff1, diff2, diff3, wtg1,wtg2,wtg3,wtg4 = eqs(x0,y0,z0)
870
+ results1 = pd.DataFrame([[x0,y0,z0,diff1,diff2,diff3,step]])
871
+ results = pd.concat([results, results1], ignore_index=True)
872
+ n = 0.
873
+
874
+ def F(eqs,x,y,z):
875
+ a = eqs(x,y,z)
876
+ return np.array([a[0],a[1],a[2]])
877
+
878
+ def x3jac(step,deriv,eqs,guessx,guessy,guessz,constants):
879
+ eq1_x, eq1_y, eq1_z, eq2_x, eq2_y, eq2_z, eq3_x, eq3_y, eq3_z = deriv
880
+ Func = F(eqs,guessx,guessy,guessz)
881
+ J = np.array([[eq1_x, eq1_y, eq1_z],[eq2_x, eq2_y, eq2_z],[eq3_x, eq3_y, eq3_z]])
882
+ m1, m2, m3, m4, m5, m6, m7, m8, m9 = J.ravel()
883
+ determinant = m1*m5*m9 + m4*m8*m3 + m7*m2*m6 - m1*m6*m8 - m3*m5*m7 - m2*m4*m9
884
+ inv_jac = np.array([[m5*m9-m6*m8, m3*m8-m2*m9, m2*m6-m3*m5],
885
+ [m6*m7-m4*m9, m1*m9-m3*m7, m3*m4-m1*m6],
886
+ [m4*m8-m5*m7, m2*m7-m1*m8, m1*m5-m2*m4]])/determinant
887
+ dot = np.dot(inv_jac, Func) # To get the arrays as 2 3x1 columns
888
+ #inv_J = np.linalg.inv(J)
889
+ new_guess = np.array([guessx, guessy, guessz]) - step*dot # Returns a 3x1 array of guessx, guessy, guessz
890
+ #new_guess = np.array([guessx,guessy]) - step*np.dot(inv_J,Func)
891
+ return new_guess[0], new_guess[1], new_guess[2], J # guessx, guessy, guessz, Jacobian
892
+
893
+ x00, y00, z00 = x0, y0, z0
894
+ step0 = step
895
+
896
+ for iter in range(maxiter):
897
+ n = n+1.
898
+ deriv_ = deriv(x0,y0,z0,constants)
899
+ guessx, guessy, guessz, J = x3jac(step,deriv_,eqs,x0,y0,z0,constants)
900
+ while guessx < 0.0 or guessy < 0.0 or guessz < 0.0:
901
+ step = step/10.
902
+ guessx, guessy, guessz, J = x3jac(step,deriv_,eqs,x0,y0,z0,constants)
903
+ diff1, diff2, diff3, wtg1,wtg2,wtg3,wtg4 = eqs(guessx,guessy,guessz)
904
+ if abs(diff1) < tol and abs(diff2) < tol and abs(diff3) < tol:
905
+ return guessx, guessy, guessz
906
+ elif np.isnan(float(guessx)) or np.isnan(float(guessy)) or np.isnan(float(guessz)):
907
+ print("nan encountered")
908
+ x0 = guessx
909
+ y0 = guessy
910
+ z0 = guessz
911
+ results1 = pd.DataFrame([[guessx, guessy,guessz,diff1,diff2,diff3,step]])
912
+ results = pd.concat([results, results1], ignore_index=True)
913
+ if(n % 50==0):
914
+ results.to_csv('results_jacnewton3.csv', index=False, header=False)
915
+
916
+ step = step0/10.
917
+ x0, y0, z0 = x00, y00, z00
918
+ for iter in range(maxiter):
919
+ deriv_ = deriv(x0,y0,z0,constants)
920
+ guessx, guessy, guessz, J = x3jac(step,deriv_,eqs,x0,y0,z0,constants)
921
+ while guessx < 0.0 or guessy < 0.0 or guessz < 0.0:
922
+ step = step/10.
923
+ guessx, guessy, guessz, J = x3jac(step,deriv_,eqs,x0,y0,z0,constants)
924
+ diff1, diff2, diff3, wtg1,wtg2,wtg3,wtg4 = eqs(guessx,guessy,guessz)
925
+ if abs(diff1) < tol and abs(diff2) < tol and abs(diff3) < tol:
926
+ return guessx, guessy, guessz
927
+ elif np.isnan(float(guessx)) or np.isnan(float(guessy)) or np.isnan(float(guessz)):
928
+ print("nan encountered")
929
+ x0 = guessx
930
+ y0 = guessy
931
+ z0 = guessz
932
+ results1 = pd.DataFrame([[guessx, guessy,guessz,diff1,diff2,diff3,step]])
933
+ results = pd.concat([results, results1], ignore_index=True)
934
+ results.to_csv('results_jacnewton3.csv', index=False, header=False)
935
+
936
+ ############
937
+ ### COFe ###
938
+ ############
939
+
940
+ def eq_COFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
941
+ P = PT["P"]
942
+ wt_O = bulk_wf['O']
943
+ wt_C = bulk_wf['C']
944
+ wt_Fe = bulk_wf['Fe']
945
+ guessx = guesses["guessx"]
946
+
947
+ # equilibrium constants
948
+ K1_ = mdv.KCOg(PT,models)
949
+ K2_ = mdv.C_CO3(PT,melt_wf,models)
950
+ K3_ = (mdv.C_CO(PT,melt_wf,models))/1000000.
951
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,models)
952
+
953
+ # fugacity coefficients
954
+ y_CO2_ = mdv.y_CO2(PT,species,models)
955
+ y_O2_ = mdv.y_O2(PT,species,models)
956
+ y_CO_ = mdv.y_CO(PT,species,models)
957
+
958
+ # molecular masses
959
+ M_C = species.loc['C','M']
960
+ M_O = species.loc['O','M']
961
+ M_Fe = species.loc['Fe','M']
962
+ M_O2 = species.loc['O2','M']
963
+ M_CO = species.loc['CO','M']
964
+ M_CO2 = species.loc['CO2','M']
965
+ M_FeO = species.loc['FeO','M']
966
+ M_FeO15 = species.loc['FeO1.5','M']
967
+ M_m_ = mg.M_m_SO(melt_wf,species)
968
+
969
+ constants = [P, wt_O, wt_C, wt_Fe, K1_, K2_, K3_, KD1_, KD2, y, y_CO2_, y_O2_, y_CO_, M_C, M_O, M_Fe, M_O2, M_CO, M_CO2, M_FeO, M_FeO15, M_m_]
970
+
971
+ def mg_COFe(xg_O2_):
972
+ xg_CO2_ = (1.0-xg_O2_)/(1.0 + (y_CO2_/(K1_*y_CO_*(y_O2_*xg_O2_*P)**0.5)))
973
+ xg_CO_ = (y_CO2_*xg_CO2_)/(K1_*y_CO_*(y_O2_*xg_O2_*P)**0.5)
974
+ xm_CO2_ = K2_*y_CO2_*xg_CO2_*P
975
+ Xm_t = xm_CO2_*M_CO2 + (1.0-xm_CO2_)*M_m_
976
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2
977
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
978
+ Fe3T = Fe32/(1+Fe32)
979
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
980
+ if models.loc["insolubles","option"] == "yes":
981
+ wm_CO_ = K3_*y_CO_*xg_CO_*P
982
+ else:
983
+ wm_CO_ = 0.
984
+ return xg_CO2_, xg_CO_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_
985
+
986
+ def mb_COFe(xg_O2_):
987
+ xg_CO2_, xg_CO_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_ = mg_COFe(xg_O2_)
988
+ diff,wt_g_O,wt_g_C = f_COFe(xg_O2_)
989
+ wt_g = (wt_g_O+wt_g_C)/2.
990
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO)))+(xm_CO2_/Xm_t) + (wm_CO_/M_CO))
991
+ wt_O_ = M_O*((wt_g*(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_)/Xg_t)-(2.0*xm_CO2_/Xm_t) - (wm_CO_/M_CO)))+(2.0*xm_CO2_/Xm_t) + (wm_CO_/M_CO) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
992
+ return wt_g, wt_O_, wt_C_
993
+
994
+ def f_COFe(xg_O2_):
995
+ xg_CO2_, xg_CO_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_ = mg_COFe(xg_O2_)
996
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO))
997
+ wt_g_O = ((wt_O/M_O) - (2.0*xm_CO2_/Xm_t) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_)/Xg_t)-(2.0*xm_CO2_/Xm_t) - (wm_CO_/M_CO))
998
+ diff = wt_g_C - wt_g_O
999
+ return diff,wt_g_O,wt_g_C
1000
+
1001
+ def df_COFe(xg_O2_,constants):
1002
+ result = de.COFe_O2(xg_O2_,constants)
1003
+ return result
1004
+
1005
+ xg_O2_ = newton_raphson(guessx,constants,nr_tol,nr_step,f_COFe,df_COFe)
1006
+ result1 = mg_COFe(xg_O2_)
1007
+ result2 = f_COFe(xg_O2_)
1008
+ result3 = mb_COFe(xg_O2_)
1009
+ #print(wm_CO2,xg_O2,xg_CO,xg_CO2,F_,wt_g_C,wt_g_O)
1010
+ return xg_O2_, result1, result2, result3
1011
+
1012
+
1013
+ ############
1014
+ ### HOFe ###
1015
+ ############
1016
+
1017
+ def eq_HOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1018
+ P = PT["P"]
1019
+ wt_O = bulk_wf['O']
1020
+ wt_H = bulk_wf['H']
1021
+ wt_Fe = bulk_wf['Fe']
1022
+ guessx = guesses["guessx"]
1023
+
1024
+ # equilibrium constants
1025
+ K1_ = mdv.KHOg(PT,models)
1026
+ K2_ = mdv.C_H2O(PT,melt_wf,species,models)
1027
+ K3_ = mdv.C_H2(PT,melt_wf,species,models)/1000000.
1028
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1029
+
1030
+ # fugacity coefficients
1031
+ y_H2O_ = mdv.y_H2O(PT,species,models)
1032
+ y_O2_ = mdv.y_O2(PT,species,models)
1033
+ y_H2_ = mdv.y_H2(PT,species,models)
1034
+
1035
+ # molecular masses
1036
+ M_H = species.loc['H','M']
1037
+ M_O = species.loc['O','M']
1038
+ M_Fe = species.loc['Fe','M']
1039
+ M_O2 = species.loc['O2','M']
1040
+ M_H2 = species.loc['H2','M']
1041
+ M_H2O = species.loc['H2O','M']
1042
+ M_FeO = species.loc['FeO','M']
1043
+ M_FeO15 = species.loc['FeO1.5','M']
1044
+ M_m_ = mg.M_m_SO(melt_wf,species)
1045
+
1046
+ constants = [P, wt_O, wt_H, wt_Fe, K1_, K2_, K3_, KD1_, KD2, y, y_H2O_, y_O2_, y_H2_, M_H, M_O, M_Fe, M_O2, M_H2, M_H2O, M_FeO, M_FeO15, M_m_]
1047
+
1048
+ def mg_HOFe(xg_O2_):
1049
+ xg_H2O_ = (1.0-xg_O2_)/(1.0 + (y_H2O_/(K1_*y_H2_*y_O2_**0.5*xg_O2_**0.5*P**0.5)))
1050
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
1051
+ xm_H2O_ = (K2_*y_H2O_*xg_H2O_*P)**0.5
1052
+ Xm_t = xm_H2O_*M_H2O + (1.0-xm_H2O_)*M_m_
1053
+ Xg_t = xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_O2_*M_O2
1054
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1055
+ Fe3T = Fe32/(1.0+Fe32)
1056
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
1057
+ if models.loc["insolubles","option"] == "yes":
1058
+ wm_H2_ = K3_*y_H2_*xg_H2_*P
1059
+ else:
1060
+ wm_H2_ = 0.
1061
+ return xg_H2O_, xg_H2_, xm_H2O_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_
1062
+
1063
+ def mb_HOFe(xg_O2_):
1064
+ xg_H2O_, xg_H2_, xm_H2O_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_ = mg_HOFe(xg_O2_)
1065
+ diff,wt_g_O,wt_g_H = f_HOFe(xg_O2_)
1066
+ wt_g = (wt_g_O+wt_g_H)/2
1067
+ wt_H_ = 2.0*M_H*((wt_g*(((xg_H2O_+xg_H2_)/Xg_t) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2)))+(xm_H2O_/Xm_t) + (wm_H2_/M_H2))
1068
+ wt_O_ = M_O*((wt_g*(((xg_H2O_ + 2.0*xg_O2_)/Xg_t)-(xm_H2O_/Xm_t)))+(xm_H2O_/Xm_t) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1069
+ return wt_g, wt_O_, wt_H_
1070
+
1071
+ def f_HOFe(xg_O2_):
1072
+ xg_H2O_, xg_H2_, xm_H2O_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_,wm_H2_ = mg_HOFe(xg_O2_)
1073
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2))/(((xg_H2O_+xg_H2_)/Xg_t) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2))
1074
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((xg_H2O_ + 2.0*xg_O2_)/Xg_t)-(xm_H2O_/Xm_t))
1075
+ diff = wt_g_H - wt_g_O
1076
+ return diff,wt_g_O,wt_g_H
1077
+
1078
+ def df_HOFe(xg_O2_,constants):
1079
+ if models.loc["insolubles","option"] == "no":
1080
+ result = de.HOFe_O2(xg_O2_,constants)
1081
+ else:
1082
+ result = de.HOFe_O2_2(xg_O2_,constants)
1083
+ return result
1084
+
1085
+ xg_O2_ = newton_raphson(guessx,constants,nr_tol,nr_step,f_HOFe,df_HOFe)
1086
+ result1 = mg_HOFe(xg_O2_)
1087
+ result2 = f_HOFe(xg_O2_)
1088
+ result3 = mb_HOFe(xg_O2_)
1089
+ return xg_O2_, result1, result2, result3
1090
+
1091
+
1092
+ ####################
1093
+ ### HOFe - Xenia ###
1094
+ ####################
1095
+
1096
+ def eq_HOFe_xenia(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1097
+ P = PT["P"]
1098
+ wt_O = bulk_wf['O']
1099
+ wt_H = bulk_wf['H']
1100
+ wt_Fe = bulk_wf['Fe']
1101
+ guessx = guesses["guessx"]
1102
+
1103
+ # equilibrium constants
1104
+ K1_ = 1.0/(6.9617e-10) # H2O = H2 + 0.5O2
1105
+ K2_ = gp.exp(-13.869+3890.0/T_K)# H2Og = H2Omol Zhang 1999 eq14 @1bar
1106
+ K3_ = 0.368 # H2O + O = 2OH
1107
+ K4a_ = mdv.C_H2_a()/100. # H2g = H2m, converted to weight fraction
1108
+ K4b_ = mdv.C_H2_b() # power for H2g = H2m
1109
+ K5_ = mdv.PT_KCterm(PT) # PT terms in K&C91
1110
+
1111
+ # fugacity coefficients
1112
+ y_H2O_ = 1.0 #y_H2O(P,T_K,ideal_gas)
1113
+ y_O2_ = 1.0 #y_O2(P,T_K,ideal_gas)
1114
+ y_H2_ = 1.0 #y_H2(P,T_K,ideal_gas)
1115
+
1116
+ # molecular masses
1117
+ M_H = species.loc['H','M']
1118
+ M_O = species.loc['O','M']
1119
+ M_Fe = species.loc['Fe','M']
1120
+ M_O2 = species.loc['O2','M']
1121
+ M_H2 = species.loc['H2','M']
1122
+ M_H2O = species.loc['H2O','M']
1123
+ M_FeO = species.loc['FeO','M']
1124
+ M_FeO15 = species.loc['FeO1.5','M']
1125
+ M_m_ = mg.M_m(melt_wf,species)
1126
+
1127
+ constants = [P, wt_O, wt_H, wt_Fe, K1_, K2_, K3_, K4a_, K4b_, K5_, y_H2O_, y_O2_, y_H2_, M_H, M_O, M_Fe, M_O2, M_H2, M_H2O, M_FeO, M_FeO15, M_m_]
1128
+
1129
+ def mg_HOFe(xg_O2_):
1130
+ xg_H2O_ = (1.0-xg_O2_)/(1.0 + (y_H2O_/(K1_*y_H2_*y_O2_**0.5*xg_O2_**0.5*P**0.5)))
1131
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
1132
+ xm_H2Omol_ = K2_*y_H2O_*xg_H2O_*P
1133
+ a = 4.0
1134
+ b = 2.0*xm_H2Omol_*(K3_ - 4.0)
1135
+ c = xm_H2Omol_*(xm_H2Omol_*(4.0 - K3_) - K3_)
1136
+ xm_H2OT_ = (-b + (b**2.0 - 4*a*c)**0.5)/(2.0*a)
1137
+ xm_OH_ = 2.0*(xm_H2OT_ - xm_H2Omol_)
1138
+ wm_H2_ = K4a_*(y_H2_*xg_H2_*P)**K4b_
1139
+ Xm_t = xm_H2OT_*M_H2O + (1.0-xm_H2OT_)*M_m_
1140
+ Xg_t = xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_O2_*M_O2
1141
+ Fe32 = 2.0*gp.exp(0.196*gp.log(y_O2_*xg_O2_*P)+K5_)
1142
+ Fe3T = Fe32/(1.0+Fe32)
1143
+ wm_H2OT_ = (xm_H2OT_*M_H2O)/Xm_t
1144
+ return xg_H2O_, xg_H2_, xm_H2Omol_, xm_OH_, xm_H2OT_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2OT_, wm_H2_
1145
+
1146
+ def mb_HOFe(xg_O2_):
1147
+ xg_H2O_, xg_H2_, xm_H2Omol_, xm_OH_, xm_H2OT_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2OT_, wm_H2_ = mg_HOFe(xg_O2_)
1148
+ diff,wt_g_O,wt_g_H = f_HOFe(xg_O2_)
1149
+ wt_g = (wt_g_O+wt_g_H)/2
1150
+ wt_H_ = 2.0*M_H*((wt_g*(((xg_H2O_+xg_H2_)/Xg_t) - (xm_H2OT_/Xm_t) - (wm_H2_/M_H2)))+(xm_H2OT_/Xm_t) + (wm_H2_/M_H2))
1151
+ wt_O_ = M_O*((wt_g*(((xg_H2O_ + 2.0*xg_O2_)/Xg_t)-(xm_H2OT_/Xm_t)))+(xm_H2OT_/Xm_t) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1152
+ return wt_g, wt_O_, wt_H_
1153
+
1154
+ def f_HOFe(xg_O2_):
1155
+ xg_H2O_, xg_H2_, xm_H2Omol_, xm_OH_, xm_H2OT_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2OT_, wm_H2_ = mg_HOFe(xg_O2_)
1156
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2OT_/Xm_t) - (wm_H2_/M_H2))/(((xg_H2O_+xg_H2_)/Xg_t) - (xm_H2OT_/Xm_t) - (wm_H2_/M_H2))
1157
+ wt_g_O = ((wt_O/M_O) - (xm_H2OT_/Xm_t) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((xg_H2O_ + 2.0*xg_O2_)/Xg_t)-(xm_H2OT_/Xm_t))
1158
+ diff = wt_g_H - wt_g_O
1159
+ return diff,wt_g_O,wt_g_H
1160
+
1161
+ def df_HOFe(xg_O2_,constants):
1162
+ result = de.HOFe_O2_xenia(xg_O2_,constants)
1163
+ return result
1164
+
1165
+ xg_O2_ = newton_raphson(guessx,nr_tol,nr_step,f_HOFe,df_HOFe)
1166
+ result1 = mg_HOFe(xg_O2_)
1167
+ result2 = f_HOFe(xg_O2_)
1168
+ result3 = mb_HOFe(xg_O2_)
1169
+ #print(wt_H, wt_O, xg_O2_, result1, result2, result3)
1170
+ return xg_O2_, result1, result2, result3
1171
+
1172
+
1173
+ ############
1174
+ ### SOFe ###
1175
+ ############
1176
+
1177
+ def eq_SOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1178
+ P = PT["P"]
1179
+ wt_O = bulk_wf['O']
1180
+ wt_S = bulk_wf['S']
1181
+ wt_Fe = bulk_wf['Fe']
1182
+ guessx = guesses["guessx"]
1183
+
1184
+ # equilibrium constants
1185
+ K1_ = mdv.KOSg(PT,models)
1186
+ K2_ = mdv.C_S(PT,melt_wf,species,models)/1000000.
1187
+ K3_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000.
1188
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1189
+
1190
+ # fugacity coefficients
1191
+ y_SO2_ = mdv.y_SO2(PT,species,models)
1192
+ y_O2_ = mdv.y_O2(PT,species,models)
1193
+ y_S2_ = mdv.y_S2(PT,species,models)
1194
+
1195
+ # molecular masses
1196
+ M_S = species.loc['S','M']
1197
+ M_O = species.loc['O','M']
1198
+ M_Fe = species.loc['Fe','M']
1199
+ M_O2 = species.loc['O2','M']
1200
+ M_S2 = species.loc['S2','M']
1201
+ M_SO2 = species.loc['SO2','M']
1202
+ M_SO3 = species.loc['SO3','M']
1203
+ M_FeO = species.loc['FeO','M']
1204
+ M_FeO15 = species.loc['FeO1.5','M']
1205
+ M_m_ = mg.M_m_ox(melt_wf,species,models)
1206
+
1207
+ constants = [P, wt_O, wt_S, wt_Fe, K1_, K2_, K3_, KD1_, KD2, y, y_SO2_, y_O2_, y_S2_, M_S, M_O, M_Fe, M_O2, M_S2, M_SO2, M_SO3, M_FeO, M_FeO15, M_m_]
1208
+
1209
+ def mg_SOFe(xg_O2_):
1210
+ a = (y_SO2_**2.)/(K1_**2.*y_O2_**2.*xg_O2_**2.*y_S2_*P)
1211
+ b = 1.
1212
+ c = xg_O2_ - 1.
1213
+ xg_SO2_ = (-b + (b**2.-(4.*a*c))**0.5)/(2.*a)
1214
+ xg_S2_ = (((y_SO2_*xg_SO2_)/(K1_*y_O2_*xg_O2_))**2.)/(y_S2_*P)
1215
+ wm_S_ = K2_*(((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5)
1216
+ wm_SO3_ = M_SO3*((((y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)*K3_)/M_S)
1217
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3)
1218
+ Xg_t = xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_O2_*M_O2
1219
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1220
+ Fe3T = Fe32/(1+Fe32)
1221
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
1222
+ S6T = S62/(1+S62)
1223
+ return xg_SO2_, xg_S2_, Xg_t, Fe32, Fe3T, wm_S_, wm_SO3_, S62, S6T, wm_ST_
1224
+
1225
+ def mb_SOFe(xg_O2_):
1226
+ xg_SO2_, xg_S2_, Xg_t, Fe32, Fe3T, wm_S_, wm_SO3_, S62, S6T, wm_ST_ = mg_SOFe(xg_O2_)
1227
+ diff,wt_g_O,wt_g_S = f_SOFe(xg_O2_)
1228
+ wt_g = (wt_g_O+wt_g_S)/2.
1229
+ wt_S_ = M_S*((wt_g*(((xg_SO2_+2.0*xg_S2_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3)))+((wm_S_/M_S) + (wm_SO3_/M_SO3)))
1230
+ wt_O_ = M_O*((wt_g*(((2.0*xg_SO2_ + 2.0*xg_O2_)/Xg_t)-(3.0*wm_SO3_/M_SO3)))+(3.0*wm_SO3_/M_SO3) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1231
+ return wt_g, wt_O_, wt_S_
1232
+
1233
+ def f_SOFe(xg_O2_):
1234
+ xg_SO2_, xg_S2_, Xg_t, Fe32, Fe3T, wm_S_, wm_SO3_, S62, S6T, wm_ST_ = mg_SOFe(xg_O2_)
1235
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3))/(((xg_SO2_+2.0*xg_S2_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))
1236
+ wt_g_O = ((wt_O/M_O) - (3.0*wm_SO3_/M_SO3) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_SO2_ + 2.0*xg_O2_)/Xg_t) - (3.0*wm_SO3_/M_SO3))
1237
+ diff = wt_g_S - wt_g_O
1238
+ return diff,wt_g_O,wt_g_S
1239
+
1240
+ def df_SOFe(xg_O2_,constants):
1241
+ result = de.SOFe_O2(xg_O2_,constants)
1242
+ return result
1243
+
1244
+ xg_O2_ = newton_raphson(guessx,constants,nr_tol,nr_step,f_SOFe,df_SOFe)
1245
+ result1 = mg_SOFe(xg_O2_)
1246
+ result2 = f_SOFe(xg_O2_)
1247
+ result3 = mb_SOFe(xg_O2_)
1248
+ #print(wt_S, wt_O, xg_O2_, result1, result2, result3)
1249
+ return xg_O2_, result1, result2, result3
1250
+
1251
+
1252
+ #############
1253
+ ### SHOFe ###
1254
+ #############
1255
+
1256
+ # no H2S or H2
1257
+ def eq_SHOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1258
+ P = PT["P"]
1259
+ wt_O = bulk_wf['O']
1260
+ wt_S = bulk_wf['S']
1261
+ wt_H = bulk_wf['H']
1262
+ wt_Fe = bulk_wf['Fe']
1263
+ guessx = guesses["guessx"]
1264
+ guessy = guesses["guessy"]
1265
+
1266
+ # fugacity coefficients
1267
+ y_S2_ = mdv.y_S2(PT,species,models)
1268
+ y_O2_ = mdv.y_O2(PT,species,models)
1269
+ y_SO2_ = mdv.y_SO2(PT,species,models)
1270
+ y_H2S_ = mdv.y_H2S(PT,species,models)
1271
+ y_H2O_ = mdv.y_H2O(PT,species,models)
1272
+ y_H2_ = mdv.y_H2(PT,species,models)
1273
+
1274
+ # molecular masses
1275
+ M_H = species.loc['H','M']
1276
+ M_S = species.loc['S','M']
1277
+ M_O = species.loc['O','M']
1278
+ M_Fe = species.loc['Fe','M']
1279
+ M_O2 = species.loc['O2','M']
1280
+ M_H2 = species.loc['H2','M']
1281
+ M_H2O = species.loc['H2O','M']
1282
+ M_S2 = species.loc['S2','M']
1283
+ M_SO2 = species.loc['SO2','M']
1284
+ M_SO3 = species.loc['SO3','M']
1285
+ M_H2S = species.loc['H2S','M']
1286
+ M_FeO = species.loc['FeO','M']
1287
+ M_FeO15 = species.loc['FeO1.5','M']
1288
+ M_m_ = mg.M_m_SO(melt_wf,species)
1289
+
1290
+ # equilibrium constants
1291
+ K1_ = mdv.KHOg(PT,models)
1292
+ K2_ = mdv.KOSg(PT,models)
1293
+ K3_ = mdv.KHOSg(PT,models)
1294
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
1295
+ K5_ = mdv.C_S(PT,melt_wf,species,models)/1000000.0
1296
+ K6_ = (mdv.C_SO4(PT,melt_wf,species,models)/1000000.0)
1297
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1298
+
1299
+ constants = [P, wt_O, wt_S, wt_H, wt_Fe, K1_, K2_, K3_, K4_, K5_, K6_, KD1_, KD2, y, y_S2_, y_O2_, y_SO2_, y_H2S_, y_H2O_, y_H2_, M_H, M_S, M_O, M_Fe, M_O2, M_H2, M_H2O, M_S2, M_SO2, M_SO3, M_H2S, M_FeO, M_FeO15, M_m_]
1300
+
1301
+ def mg_SHOFe(xg_O2_,xg_S2_):
1302
+ xg_SO2_ = (K2_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
1303
+ xg_H2O_ = (1.0 - xg_O2_ - xg_S2_ - xg_SO2_)/(1.0 + ((K3_*(y_S2_*xg_S2_)**0.5*y_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)) + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)))
1304
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
1305
+ xg_H2S_ = (K3_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
1306
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
1307
+ wm_S_ = K5_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
1308
+ wm_SO3_ = ((K6_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
1309
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3)
1310
+ Xm_t = xm_H2O_*M_H2O + (1.0-xm_H2O_)*M_m_
1311
+ Xg_t = xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_H2S_*M_H2S
1312
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1313
+ Fe3T = Fe32/(1.0+Fe32)
1314
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
1315
+ S6T = S62/(1.0+S62)
1316
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
1317
+ return xg_SO2_, xg_H2O_, xg_H2_, xg_H2S_, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_
1318
+
1319
+ def mb_SHOFe(xg_O2_, xg_S2_):
1320
+ xg_SO2_, xg_H2O_, xg_H2_, xg_H2S_, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_ = mg_SHOFe(xg_O2_, xg_S2_)
1321
+ mbSO, mbSH, wt_g_O, wt_g_S, wt_g_H = f_SHOFe(xg_O2_,xg_S2_)
1322
+ wt_g = (wt_g_O+wt_g_H+wt_g_S)/3.0
1323
+ wt_H_ = 2.0*M_H*((wt_g*(((xg_H2O_+xg_H2_+xg_H2S_)/Xg_t) - (xm_H2O_/Xm_t)))+(xm_H2O_/Xm_t))
1324
+ wt_O_ = M_O*((wt_g*(((2.0*xg_SO2_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t) - (3.0*wm_SO3_/M_SO3)))+(xm_H2O_/Xm_t) + (3.0*wm_SO3_/M_SO3) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1325
+ wt_S_ = M_S*((wt_g*(((xg_SO2_+2.0*xg_S2_+xg_H2S_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))) + (wm_S_/M_S) + (wm_SO3_/M_SO3))
1326
+ return wt_g, wt_O_, wt_S_, wt_H_
1327
+
1328
+ def f_SHOFe(xg_O2_,xg_S2_):
1329
+ xg_SO2_, xg_H2O_, xg_H2_, xg_H2S_, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_ = mg_SHOFe(xg_O2_, xg_S2_)
1330
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))
1331
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - (3.0*wm_SO3_/M_SO3) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_SO2_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t) - (3.0*wm_SO3_/M_SO3))
1332
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t))/(((xg_H2O_+xg_H2_+xg_H2S_)/Xg_t) - (xm_H2O_/Xm_t))
1333
+ mbSO = (wt_g_S - wt_g_O)
1334
+ mbSH = (wt_g_S - wt_g_H)
1335
+ return mbSO, mbSH, wt_g_O, wt_g_S, wt_g_H
1336
+
1337
+ def df_SHOFe(xg_O2_,xg_S2_,constants):
1338
+ dmbSO_O = de.SHOFe_SO_O2(xg_O2_,xg_S2_,constants)
1339
+ dmbSO_S = de.SHOFe_SO_S2(xg_O2_,xg_S2_,constants)
1340
+ dmbSH_O = de.SHOFe_SH_O2(xg_O2_,xg_S2_,constants)
1341
+ dmbSH_S = de.SHOFe_SH_S2(xg_O2_,xg_S2_,constants)
1342
+ return dmbSO_O, dmbSO_S, dmbSH_O, dmbSH_S
1343
+
1344
+ xg_O2_, xg_S2_ = jac_newton(guessx,guessy,constants,f_SHOFe,df_SHOFe,nr_step,nr_tol)
1345
+ results1 = mg_SHOFe(xg_O2_,xg_S2_)
1346
+ results2 = f_SHOFe(xg_O2_,xg_S2_)
1347
+ results3 = mb_SHOFe(xg_O2_,xg_S2_)
1348
+ #print(wt_O, wt_S, wt_H, xg_O2, xg_S2, results1, results2, results3)
1349
+ return xg_O2_, xg_S2_, results1, results2, results3
1350
+
1351
+ # includes H2S and H2
1352
+ def eq_SHOFe_2(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1353
+ P = PT["P"]
1354
+ wt_O = bulk_wf['O']
1355
+ wt_S = bulk_wf['S']
1356
+ wt_H = bulk_wf['H']
1357
+ wt_Fe = bulk_wf['Fe']
1358
+ guessx = guesses["guessx"]
1359
+ guessy = guesses["guessy"]
1360
+
1361
+ # equilibrium constants
1362
+ K1_ = mdv.KHOg(PT,models)
1363
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
1364
+ K6_ = mdv.KOSg(PT,models)
1365
+ K7_ = mdv.KHOSg(PT,models)
1366
+ K8_ = mdv.C_S(PT,melt_wf,species,models)/1000000.0
1367
+ K9_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000.0
1368
+ K13_ = mdv.C_H2(PT,melt_wf,species,models)/1000000.0
1369
+ K14_ = mdv.C_H2S(PT,melt_wf,species,models)/1000000.0
1370
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1371
+
1372
+ # fugacity coefficients
1373
+ y_O2_ = mdv.y_O2(PT,species,models)
1374
+ y_H2O_ = mdv.y_H2O(PT,species,models)
1375
+ y_H2_ = mdv.y_H2(PT,species,models)
1376
+ y_S2_ = mdv.y_S2(PT,species,models)
1377
+ y_SO2_ = mdv.y_SO2(PT,species,models)
1378
+ y_H2S_ = mdv.y_H2S(PT,species,models)
1379
+
1380
+ # molecular masses
1381
+ M_H = species.loc['H','M']
1382
+ M_O = species.loc['O','M']
1383
+ M_S = species.loc['S','M']
1384
+ M_Fe = species.loc['Fe','M']
1385
+ M_O2 = species.loc['O2','M']
1386
+ M_OH = species.loc['OH','M']
1387
+ M_H2O = species.loc['H2O','M']
1388
+ M_H2 = species.loc['H2','M']
1389
+ M_S2 = species.loc['S2','M']
1390
+ M_SO2 = species.loc['SO2','M']
1391
+ M_SO3 = species.loc['SO3','M']
1392
+ M_H2S = species.loc['H2S','M']
1393
+ M_FeO = species.loc['FeO','M']
1394
+ M_FeO15 = species.loc['FeO1.5','M']
1395
+ M_m_ = mg.M_m_SO(melt_wf,species)
1396
+ M_m_ox = mg.M_m_ox(melt_wf,species,models)
1397
+
1398
+ constants = [P, wt_O, wt_H, wt_S, wt_Fe, K1_, K4_, K6_, K7_, K8_, K9_, K13_, K14_, KD1_, KD2, y, y_H2_, y_O2_, y_H2O_, y_SO2_, y_S2_, y_H2S_, M_H, M_O, M_S, M_Fe, M_O2, M_OH, M_H2, M_H2O, M_S2, M_SO2, M_SO3, M_H2S, M_FeO, M_FeO15, M_m_, M_m_ox]
1399
+
1400
+ def mg_SHOFe(xg_O2_,xg_S2_):
1401
+ xg_O2__ = xg_O2_
1402
+ xg_S2__ = xg_S2_
1403
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
1404
+ xg_H2O_ = (1. - xg_O2_ - xg_S2_ - xg_SO2_)/(1. + ((K7_*(y_S2_*xg_S2_)**0.5*y_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)) + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)))
1405
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
1406
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
1407
+ Xg_t = xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_H2S_*M_H2S
1408
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
1409
+ Xm_t = xm_H2O_*M_H2O + (1.0-xm_H2O_)*M_m_
1410
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
1411
+ wm_H2_ = K13_*y_H2_*xg_H2_*P
1412
+ wm_H2S_ = K14_*y_H2S_*xg_H2S_*P
1413
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
1414
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
1415
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3) + ((M_S*wm_H2S_)/M_H2S)
1416
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1417
+ Fe3T = Fe32/(1.0+Fe32)
1418
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
1419
+ S6T = S62/(1.0+S62)
1420
+ Xm_t_ox = ""
1421
+ return xg_O2__, xg_H2_, xg_S2__, xg_H2O_, xg_SO2_, xg_H2S_, Xg_t, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_, wm_H2S_, wm_H2_
1422
+
1423
+ def mb_SHOFe(xg_O2_,xg_S2_):
1424
+ xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_SO2_, xg_H2S_, Xg_t, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_, wm_H2S_, wm_H2_ = mg_SHOFe(xg_O2_, xg_S2_)
1425
+ mba, mbc, wt_g_O, wt_g_H, wt_g_S = f_SHOFe(xg_O2_,xg_S2_)
1426
+ wt_g = (wt_g_O+wt_g_H+wt_g_S)/3.
1427
+ wt_H_ = 2.*M_H*((wt_g*(((xg_H2O_+xg_H2_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (wm_H2S_/M_H2S))) + (wm_H2O_/M_H2O) + (wm_H2_/M_H2) + (wm_H2S_/M_H2S))
1428
+ wt_O_ = M_O*((wt_g*(((2.*xg_O2_ + xg_H2O_ + 2.*xg_SO2_)/Xg_t) - (wm_H2O_/M_H2O) - (3.*wm_SO3_/M_SO3))) + (wm_H2O_/M_H2O) + (3.*wm_SO3_/M_SO3) + ((wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0))))
1429
+ wt_S_ = M_S*((wt_g*(((xg_SO2_+2.0*xg_S2_+xg_H2S_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))) + (wm_S_/M_S) + (wm_SO3_/M_SO3) + (wm_H2S_/M_H2S))
1430
+ return wt_g, wt_O_, wt_H_, wt_S_
1431
+
1432
+ def f_SHOFe(xg_O2_,xg_S2_):
1433
+ xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_SO2_, xg_H2S_, Xg_t, xm_H2O_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_ST_, wm_H2S_, wm_H2_ = mg_SHOFe(xg_O2_, xg_S2_)
1434
+ wt_g_O = ((wt_O/M_O) - (wm_H2O_/M_H2O) - (3.*wm_SO3_/M_SO3) - (wt_Fe/M_Fe)*((1.5*Fe32+1.)/(Fe32+1.)))/(((2.*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_)/Xg_t) - (wm_H2O_/M_H2O) - (3.0*wm_SO3_/M_SO3))
1435
+ wt_g_H = ((wt_H/(2.*M_H)) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (wm_H2S_/M_H2S))/(((xg_H2O_+xg_H2_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (wm_H2S_/M_H2S))
1436
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))
1437
+ mba = (wt_g_H - wt_g_O) # mbHO
1438
+ mbc = (wt_g_H - wt_g_S) # mbHS
1439
+ return mba, mbc, wt_g_O, wt_g_H, wt_g_S
1440
+
1441
+ def df_SHOFe(xg_O2_,xg_S2_,constants):
1442
+ dmba_O = de.SHOFe2_HO_O2(xg_O2_,xg_S2_,constants) # dmbHO_O
1443
+ dmba_S = de.SHOFe2_HO_S2(xg_O2_,xg_S2_,constants) # dmbHO_S
1444
+ dmbc_O = de.SHOFe2_HS_O2(xg_O2_,xg_S2_,constants) # dmbHS_O
1445
+ dmbc_S = de.SHOFe2_HS_S2(xg_O2_,xg_S2_,constants) # dmbHS_S
1446
+ return dmba_O, dmba_S, dmbc_O, dmbc_S
1447
+
1448
+ xg_O2_, xg_S2_ = jac_newton(guessx,guessy,constants,f_SHOFe,df_SHOFe,nr_step,nr_tol)
1449
+ results1 = xg_O2_, xg_S2_
1450
+ results2 = mg_SHOFe(xg_O2_,xg_S2_)
1451
+ results3 = f_SHOFe(xg_O2_,xg_S2_)
1452
+ results4 = mb_SHOFe(xg_O2_,xg_S2_)
1453
+ return results1, results2, results3, results4
1454
+
1455
+ #############
1456
+ ### SCOFe ###
1457
+ #############
1458
+
1459
+ ### not finished ###
1460
+ def eq_SCOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1461
+ P = PT["P"]
1462
+ wt_O = bulk_wf['O']
1463
+ wt_S = bulk_wf['S']
1464
+ wt_C = bulk_wf['C']
1465
+ wt_Fe = bulk_wf['Fe']
1466
+ guessx = guesses["guessx"]
1467
+ guessy = guesses["guessy"]
1468
+
1469
+ # fugacity coefficients
1470
+ y_S2_ = mdv.y_S2(PT,species,models)
1471
+ y_O2_ = mdv.y_O2(PT,species,models)
1472
+ y_SO2_ = mdv.y_SO2(PT,species,models)
1473
+ y_CO_ = mdv.y_CO(PT,species,models)
1474
+ y_CO2_ = mdv.y_CO2(PT,species,models)
1475
+ y_OCS_ = mdv.y_OCS(PT,species,models)
1476
+
1477
+ # molecular masses
1478
+ M_C = species.loc['C','M']
1479
+ M_S = species.loc['S','M']
1480
+ M_O = species.loc['O','M']
1481
+ M_Fe = species.loc['Fe','M']
1482
+ M_O2 = species.loc['O2','M']
1483
+ M_CO = species.loc['CO','M']
1484
+ M_CO2 = species.loc['CO2','M']
1485
+ M_S2 = species.loc['S2','M']
1486
+ M_SO2 = species.loc['SO2','M']
1487
+ M_SO3 = species.loc['SO3','M']
1488
+ M_OCS = species.loc['OCS','M']
1489
+ M_FeO = species.loc['FeO','M']
1490
+ M_FeO15 = species.loc['FeO1.5','M']
1491
+ M_m_ = mg.M_m_SO(melt_wf,species)
1492
+
1493
+ # equilibrium constants
1494
+ K1_ = mdv.KCOg(PT,models)
1495
+ K2_ = mdv.KOSg(PT,models)
1496
+ K3_ = mdv.KOCSg(PT,models)
1497
+ K4_ = mdv.C_CO3(PT,melt_wf,species,models)
1498
+ K5_ = mdv.C_S(PT,melt_wf,species,models)/1000000.0
1499
+ K6_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000.0
1500
+ K7_ = (mdv.C_CO(PT,melt_wf,species,models)/1000000.0)
1501
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1502
+
1503
+ constants = [P, wt_O, wt_S, wt_C, wt_Fe, K1_, K2_, K3_, K4_, K5_, K6_, K7_, KD1_, KD2, y, y_S2_, y_O2_, y_SO2_, y_CO_, y_CO2_, y_OCS_, M_C, M_S, M_O, M_Fe, M_O2, M_CO, M_CO2, M_S2, M_SO2, M_SO3, M_OCS, M_FeO, M_FeO15, M_m_]
1504
+
1505
+ def mg_SCOFe(xg_O2_,xg_S2_):
1506
+ xg_SO2_ = (K2_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
1507
+ xg_CO2_ = (1.-xg_O2_-xg_S2_-xg_SO2_)/(1.+(y_CO2_/(K1_*y_CO_*(y_O2_*xg_O2_*P)**0.5)+((y_SO2_*xg_SO2_*y_CO2_)/(K1_**3.*K3_*y_OCS_*(y_O2_*xg_O2_)**1.5*P**0.5))))
1508
+ xg_CO_ = (y_CO2_*xg_CO2_)/(y_CO_*K1_*(y_O2_*xg_O2_*P)**0.5)
1509
+ xg_OCS_ = ((y_CO_*xg_CO_)**3.*y_SO2_*xg_SO2_*P)/(K3_*(y_CO2_*xg_CO2_)**2.*y_OCS_)
1510
+ wm_S_ = K5_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
1511
+ wm_SO3_ = ((K6_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.)/M_S)*M_SO3
1512
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3)
1513
+ xm_CO2_ = K4_*y_CO2_*xg_CO2_*P
1514
+ Xm_t = xm_CO2_*M_CO2 + (1.-xm_CO2_)*M_m_
1515
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_OCS_*M_OCS
1516
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1517
+ Fe3T = Fe32/(1.0+Fe32)
1518
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
1519
+ S6T = S62/(1.0+S62)
1520
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
1521
+ if models.loc["insolubles","option"] == "no":
1522
+ wm_CO_ = 0.
1523
+ elif models.loc["insolubles","option"] == "yes":
1524
+ wm_CO_ = K7_*y_CO_*xg_CO_*P
1525
+ return xg_SO2_, xg_CO2_, xg_CO_, xg_OCS_, xg_S2_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_CO2_, wm_ST_, wm_CO_
1526
+
1527
+ def mb_SCOFe(xg_O2_, xg_S2_):
1528
+ xg_SO2_, xg_CO2_, xg_CO_, xg_OCS_, xg_S2_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_CO2_, wm_ST_, wm_CO_ = mg_SCOFe(xg_O2_, xg_S2_)
1529
+ mbSO, mbSH, wt_g_O, wt_g_S, wt_g_C = f_SCOFe(xg_O2_,xg_S2_)
1530
+ wt_g = (wt_g_O+wt_g_C+wt_g_S)/3.
1531
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_+xg_OCS_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO)))+(xm_CO2_/Xm_t) + (wm_CO_/M_CO))
1532
+ wt_O_ = M_O*((wt_g*(((2.*xg_SO2_ + 2.*xg_O2_ + 2.*xg_CO2_ + xg_OCS_ + xg_CO_)/Xg_t) - 2.*(xm_CO2_/Xm_t) - (3.*wm_SO3_/M_SO3) - (wm_CO_/M_CO)))+(2.*xm_CO2_/Xm_t) + (3.*wm_SO3_/M_SO3) + (wm_CO_/M_CO) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1533
+ wt_S_ = M_S*((wt_g*(((xg_SO2_+2.*xg_S2_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))) + (wm_S_/M_S) + (wm_SO3_/M_SO3))
1534
+ return wt_g, wt_O_, wt_S_, wt_C_
1535
+
1536
+ def f_SCOFe(xg_O2_,xg_S2_):
1537
+ xg_SO2_, xg_CO2_, xg_CO_, xg_OCS_, xg_S2_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xg_t, Fe32, Fe3T, S62, S6T, wm_CO2_, wm_ST_, wm_CO_ = mg_SCOFe(xg_O2_, xg_S2_)
1538
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3))/(((xg_SO2_+2.*xg_S2_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))
1539
+ wt_g_O = ((wt_O/M_O) - 2.*(xm_CO2_/Xm_t) - (3.*wm_SO3_/M_SO3) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.*xg_SO2_ + 2.*xg_O2_ + 2.*xg_CO2_ + xg_CO_ + xg_OCS_)/Xg_t) - 2.*(xm_CO2_/Xm_t) - (3.*wm_SO3_/M_SO3) - (wm_CO_/M_CO))
1540
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_+xg_OCS_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO))
1541
+ mbSO = (wt_g_S - wt_g_O)
1542
+ mbSC = (wt_g_S - wt_g_C)
1543
+ return mbSO, mbSC, wt_g_O, wt_g_S, wt_g_C
1544
+
1545
+ def df_SCOFe(xg_O2_,xg_S2_,constants):
1546
+ dmbSO_O = de.SCOFe_SO_O2(xg_O2_,xg_S2_,constants)
1547
+ dmbSO_S = de.SCOFe_SO_S2(xg_O2_,xg_S2_,constants)
1548
+ dmbSC_O = de.SCOFe_SC_O2(xg_O2_,xg_S2_,constants)
1549
+ dmbSC_S = de.SCOFe_SC_S2(xg_O2_,xg_S2_,constants)
1550
+ return dmbSO_O, dmbSO_S, dmbSC_O, dmbSC_S
1551
+
1552
+ xg_O2_, xg_S2_ = jac_newton(guessx,guessy,constants,f_SCOFe,df_SCOFe,nr_step,nr_tol)
1553
+ results1 = mg_SCOFe(xg_O2_,xg_S2_)
1554
+ results2 = f_SCOFe(xg_O2_,xg_S2_)
1555
+ results3 = mb_SCOFe(xg_O2_,xg_S2_)
1556
+ return xg_O2_, xg_S2_, results1, results2, results3
1557
+
1558
+ #############
1559
+ ### COXFe ###
1560
+ #############
1561
+
1562
+ def eq_COXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1563
+ species_X = models.loc["species X","option"]
1564
+ P = PT["P"]
1565
+ wt_O = bulk_wf['O']
1566
+ wt_X = bulk_wf['X']
1567
+ wt_C = bulk_wf['C']
1568
+ wt_Fe = bulk_wf['Fe']
1569
+ guessx = guesses["guessx"]
1570
+ guessy = guesses["guessy"]
1571
+
1572
+ # fugacity coefficients
1573
+ y_X_ = mdv.y_X(PT,species,models)
1574
+ y_O2_ = mdv.y_O2(PT,species,models)
1575
+ y_CO_ = mdv.y_CO(PT,species,models)
1576
+ y_CO2_ = mdv.y_CO2(PT,species,models)
1577
+
1578
+ # molecular masses
1579
+ M_C = species.loc['C','M']
1580
+ M_X = species.loc[species_X,'M']
1581
+ M_O = species.loc['O','M']
1582
+ M_Fe = species.loc['Fe','M']
1583
+ M_O2 = species.loc['O2','M']
1584
+ M_CO = species.loc['CO','M']
1585
+ M_CO2 = species.loc['CO2','M']
1586
+ M_FeO = species.loc['FeO','M']
1587
+ M_FeO15 = species.loc['FeO1.5','M']
1588
+ M_m_ = mg.M_m_SO(melt_wf,species)
1589
+
1590
+ # equilibrium constants
1591
+ K1_ = mdv.KCOg(PT,models)
1592
+ K2_ = mdv.C_CO3(PT,melt_wf,species,models) # was 4
1593
+ K3_ = (mdv.C_CO(PT,melt_wf,species,models)/1000000.0) # was 7
1594
+ K4_ = (mdv.C_X(PT,melt_wf,species,models)/1000000.0)
1595
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1596
+
1597
+ constants = [P, wt_O, wt_X, wt_C, wt_Fe, K1_, K2_, K3_, K4_, KD1_, KD2, y, y_X_, y_O2_, y_CO_, y_CO2_, M_C, M_X, M_O, M_Fe, M_O2, M_CO, M_CO2, M_FeO, M_FeO15, M_m_]
1598
+
1599
+ def mg_COXFe(xg_O2_,xg_CO_):
1600
+ xg_CO2_ = (K1_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
1601
+ xg_X_ = 1. - xg_O2_ - xg_CO_ - xg_CO2_
1602
+ wm_X_ = K4_*xg_X_*y_X_*P
1603
+ xm_CO2_ = K2_*y_CO2_*xg_CO2_*P
1604
+ Xm_t = xm_CO2_*M_CO2 + (1.-xm_CO2_)*M_m_
1605
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_X_*M_X
1606
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1607
+ Fe3T = Fe32/(1.0+Fe32)
1608
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
1609
+ if models.loc["insolubles","option"] == "no":
1610
+ wm_CO_ = 0.
1611
+ elif models.loc["insolubles","option"] == "yes":
1612
+ wm_CO_ = K3_*y_CO_*xg_CO_*P
1613
+ return xg_X_, xg_CO2_, xg_CO_, xm_CO2_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_
1614
+
1615
+ def mb_COXFe(xg_O2_, xg_CO_):
1616
+ xg_X_, xg_CO2_, xg_CO_, xm_CO2_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_ = mg_COXFe(xg_O2_, xg_CO_)
1617
+ mbXO, mbXC, wt_g_O, wt_g_X, wt_g_C = f_COXFe(xg_O2_,xg_CO_)
1618
+ wt_g = (wt_g_O+wt_g_C+wt_g_X)/3.
1619
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO)))+(xm_CO2_/Xm_t) + (wm_CO_/M_CO))
1620
+ wt_O_ = M_O*((wt_g*(((2.*xg_O2_ + 2.*xg_CO2_ + xg_CO_)/Xg_t) - 2.*(xm_CO2_/Xm_t) - (wm_CO_/M_CO)))+(2.*xm_CO2_/Xm_t) + (wm_CO_/M_CO) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1621
+ wt_X_ = M_X*((wt_g*(((xg_X_)/Xg_t) - (wm_X_/M_X))) + (wm_X_/M_X))
1622
+ return wt_g, wt_O_, wt_X_, wt_C_
1623
+
1624
+ def f_COXFe(xg_O2_,xg_CO_):
1625
+ xg_X_, xg_CO2_, xg_CO_, xm_CO2_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_CO2_, wm_CO_ = mg_COXFe(xg_O2_, xg_CO_)
1626
+ wt_g_X = ((wt_X/M_X) - (wm_X_/M_X))/(((xg_X_)/Xg_t) - (wm_X_/M_X))
1627
+ wt_g_O = ((wt_O/M_O) - 2.*(xm_CO2_/Xm_t) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.*xg_O2_ + 2.*xg_CO2_ + xg_CO_)/Xg_t) - 2.*(xm_CO2_/Xm_t) - (wm_CO_/M_CO))
1628
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO))
1629
+ mbXO = (wt_g_X - wt_g_O)
1630
+ mbXC = (wt_g_X - wt_g_C)
1631
+ return mbXO, mbXC, wt_g_O, wt_g_X, wt_g_C
1632
+
1633
+ def df_COXFe(xg_O2_,xg_CO_,constants):
1634
+ dmbXO_O = de.COXFe_XO_O2(xg_O2_,xg_CO_,constants)
1635
+ dmbXO_C = de.COXFe_XO_CO(xg_O2_,xg_CO_,constants)
1636
+ dmbXC_O = de.COXFe_XC_O2(xg_O2_,xg_CO_,constants)
1637
+ dmbXC_C = de.COXFe_XC_CO(xg_O2_,xg_CO_,constants)
1638
+ return dmbXO_O, dmbXO_C, dmbXC_O, dmbXC_C
1639
+
1640
+ xg_O2_, xg_CO_ = jac_newton(guessx,guessy,constants,f_COXFe,df_COXFe,nr_step,nr_tol)
1641
+ results1 = mg_COXFe(xg_O2_,xg_CO_)
1642
+ results2 = f_COXFe(xg_O2_,xg_CO_)
1643
+ results3 = mb_COXFe(xg_O2_,xg_CO_)
1644
+ return xg_O2_, xg_CO_, results1, results2, results3
1645
+
1646
+ #############
1647
+ ### HOXFe ###
1648
+ #############
1649
+
1650
+ def eq_HOXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1651
+ species_X = models.loc["species X","option"]
1652
+ P = PT["P"]
1653
+ wt_O = bulk_wf['O']
1654
+ wt_X = bulk_wf['X']
1655
+ wt_H = bulk_wf['H']
1656
+ wt_Fe = bulk_wf['Fe']
1657
+ guessx = guesses["guessx"]
1658
+ guessy = guesses["guessy"]
1659
+
1660
+ # fugacity coefficients
1661
+ y_X_ = mdv.y_X(PT,species,models)
1662
+ y_O2_ = mdv.y_O2(PT,species,models)
1663
+ y_H2_ = mdv.y_H2(PT,species,models)
1664
+ y_H2O_ = mdv.y_H2O(PT,species,models)
1665
+
1666
+ # molecular masses
1667
+ M_H = species.loc['H','M']
1668
+ M_X = species.loc[species_X,'M']
1669
+ M_O = species.loc['O','M']
1670
+ M_Fe = species.loc['Fe','M']
1671
+ M_O2 = species.loc['O2','M']
1672
+ M_H2 = species.loc['H2','M']
1673
+ M_H2O = species.loc['H2O','M']
1674
+ M_FeO = species.loc['FeO','M']
1675
+ M_FeO15 = species.loc['FeO1.5','M']
1676
+ M_m_ = mg.M_m_SO(melt_wf,species)
1677
+
1678
+ # equilibrium constants
1679
+ K1_ = mdv.KHOg(PT,models)
1680
+ K2_ = mdv.C_H2O(PT,melt_wf,species,models)
1681
+ K3_ = (mdv.C_H2(PT,melt_wf,species,models)/1000000.0)
1682
+ K4_ = (mdv.C_X(PT,melt_wf,species,models)/1000000.0)
1683
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1684
+
1685
+ constants = [P, wt_O, wt_X, wt_H, wt_Fe, K1_, K2_, K3_, K4_, KD1_, KD2, y, y_X_, y_O2_, y_H2_, y_H2O_, M_H, M_X, M_O, M_Fe, M_O2, M_H2, M_H2O, M_FeO, M_FeO15, M_m_]
1686
+
1687
+ def mg_HOXFe(xg_O2_,xg_H2_):
1688
+ xg_H2O_ = (K1_*y_H2_*xg_H2_*(y_O2_*xg_O2_*P)**0.5)/y_H2O_
1689
+ xg_X_ = 1. - xg_O2_ - xg_H2_ - xg_H2O_
1690
+ wm_X_ = K4_*xg_X_*y_X_*P
1691
+ xm_H2O_ = (K2_*y_H2O_*xg_H2O_*P)**0.5
1692
+ Xm_t = xm_H2O_*M_H2O + (1.-xm_H2O_)*M_m_
1693
+ Xg_t = xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_O2_*M_O2 + xg_X_*M_X
1694
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1695
+ Fe3T = Fe32/(1.0+Fe32)
1696
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
1697
+ if models.loc["insolubles","option"] == "no":
1698
+ wm_H2_ = 0.
1699
+ elif models.loc["insolubles","option"] == "yes":
1700
+ wm_H2_ = K3_*y_H2_*xg_H2_*P
1701
+ return xg_X_, xg_H2O_, xg_H2_, xm_H2O_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_
1702
+
1703
+ def mb_HOXFe(xg_O2_, xg_H2_):
1704
+ xg_X_, xg_H2O_, xg_H2_, xm_H2O_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_ = mg_HOXFe(xg_O2_, xg_H2_)
1705
+ mbXO, mbXH, wt_g_O, wt_g_X, wt_g_H = f_HOXFe(xg_O2_,xg_H2_)
1706
+ wt_g = (wt_g_O+wt_g_H+wt_g_X)/3.
1707
+ wt_H_ = 2.0*M_H*((wt_g*(((xg_H2O_+xg_H2_)/Xg_t) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2)))+(xm_H2O_/Xm_t) + (wm_H2_/M_H2))
1708
+ wt_O_ = M_O*((wt_g*(((2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t)))+(xm_H2O_/Xm_t) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1709
+ wt_X_ = M_X*((wt_g*(((xg_X_)/Xg_t) - (wm_X_/M_X))) + (wm_X_/M_X))
1710
+ return wt_g, wt_O_, wt_X_, wt_H_
1711
+
1712
+ def f_HOXFe(xg_O2_,xg_H2_):
1713
+ xg_X_, xg_H2O_, xg_H2_, xm_H2O_, wm_X_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_H2_ = mg_HOXFe(xg_O2_, xg_H2_)
1714
+ wt_g_X = ((wt_X/M_X) - (wm_X_/M_X))/(((xg_X_)/Xg_t) - (wm_X_/M_X))
1715
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t))
1716
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2))/(((xg_H2O_+xg_H2_)/Xg_t) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2))
1717
+ mbXO = (wt_g_X - wt_g_O)
1718
+ mbXH = (wt_g_X - wt_g_H)
1719
+ return mbXO, mbXH, wt_g_O, wt_g_X, wt_g_H
1720
+
1721
+ def df_HOXFe(xg_O2_,xg_H2_,constants):
1722
+ dmbXO_O = de.HOXFe_XO_O2(xg_O2_,xg_H2_,constants)
1723
+ dmbXO_H = de.HOXFe_XO_H2(xg_O2_,xg_H2_,constants)
1724
+ dmbXH_O = de.HOXFe_XH_O2(xg_O2_,xg_H2_,constants)
1725
+ dmbXH_H = de.HOXFe_XH_H2(xg_O2_,xg_H2_,constants)
1726
+ return dmbXO_O, dmbXO_H, dmbXH_O, dmbXH_H
1727
+
1728
+ xg_O2_, xg_H2_ = jac_newton(guessx,guessy,constants,f_HOXFe,df_HOXFe,nr_step,nr_tol)
1729
+ results1 = mg_HOXFe(xg_O2_,xg_H2_)
1730
+ results2 = f_HOXFe(xg_O2_,xg_H2_)
1731
+ results3 = mb_HOXFe(xg_O2_,xg_H2_)
1732
+ return xg_O2_, xg_H2_, results1, results2, results3
1733
+
1734
+ #############
1735
+ ### CHOFe ###
1736
+ #############
1737
+
1738
+ ### insolubles not included
1739
+
1740
+ def eq_CHOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1741
+ P = PT["P"]
1742
+ wt_O = bulk_wf['O']
1743
+ wt_C = bulk_wf['C']
1744
+ wt_H = bulk_wf['H']
1745
+ wt_Fe = bulk_wf['Fe']
1746
+ guessx = guesses["guessx"]
1747
+ guessy = guesses["guessy"]
1748
+
1749
+ # equilibrium constants
1750
+ K1_ = mdv.KHOg(PT,models)
1751
+ K2_ = mdv.KCOg(PT,models)
1752
+ K3_ = mdv.KCOHg(PT,models)
1753
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
1754
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
1755
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1756
+
1757
+ # fugacity coefficients
1758
+ y_CO_ = mdv.y_CO(PT,species,models)
1759
+ y_O2_ = mdv.y_O2(PT,species,models)
1760
+ y_CO2_ = mdv.y_CO2(PT,species,models)
1761
+ y_CH4_ = mdv.y_CH4(PT,species,models)
1762
+ y_H2O_ = mdv.y_H2O(PT,species,models)
1763
+ y_H2_ = mdv.y_H2(PT,species,models)
1764
+
1765
+ # molecular masses
1766
+ M_H = species.loc['H','M']
1767
+ M_C = species.loc['C','M']
1768
+ M_O = species.loc['O','M']
1769
+ M_Fe = species.loc['Fe','M']
1770
+ M_O2 = species.loc['O2','M']
1771
+ M_CO = species.loc['CO','M']
1772
+ M_H2O = species.loc['H2O','M']
1773
+ M_H2 = species.loc['H2','M']
1774
+ M_CO2 = species.loc['CO2','M']
1775
+ M_CH4 = species.loc['CH4','M']
1776
+ M_FeO = species.loc['FeO','M']
1777
+ M_FeO15 = species.loc['FeO1.5','M']
1778
+ M_m_ = mg.M_m_SO(melt_wf,species)
1779
+
1780
+ constants = [P, wt_O, wt_C, wt_H, wt_Fe, K1_, K2_, K3_, K4_, K5_, KD1_, KD2, y, y_H2_, y_O2_, y_H2O_, y_CO_, y_CO2_, y_CH4_, M_C, M_H, M_O, M_Fe, M_O2, M_CO, M_CO2, M_H2, M_H2O, M_CH4, M_FeO, M_FeO15, M_m_]
1781
+
1782
+ def mg_CHOFe(xg_O2_,xg_CO_):
1783
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
1784
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
1785
+ b = 1.0 + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5))
1786
+ c = xg_CO2_ + xg_CO_ + xg_O2_ - 1.0
1787
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
1788
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
1789
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
1790
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
1791
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
1792
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
1793
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4
1794
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1795
+ Fe3T = Fe32/(1.0+Fe32)
1796
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
1797
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
1798
+ return xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_
1799
+
1800
+ def mb_CHOFe(xg_O2_, xg_CO_):
1801
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_ = mg_CHOFe(xg_O2_, xg_CO_)
1802
+ mbCO, mbCH, wt_g_O, wt_g_C, wt_g_H = f_CHOFe(xg_O2_,xg_CO_)
1803
+ wt_g = (wt_g_O+wt_g_H+wt_g_C)/3.0
1804
+ wt_H_ = 2.0*M_H*((wt_g*(((xg_H2O_+xg_H2_+2.0*xg_CH4_)/Xg_t) - (xm_H2O_/Xm_t)))+(xm_H2O_/Xm_t))
1805
+ wt_O_ = M_O*((wt_g*(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t)))+(xm_H2O_/Xm_t) + ((2.0*xm_CO2_)/Xm_t) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1806
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_+xg_CH4_)/Xg_t) - (xm_CO2_/Xm_t))) + (xm_CO2_/Xm_t))
1807
+ return wt_g, wt_O_, wt_C_, wt_H_
1808
+
1809
+ def f_CHOFe(xg_O2_,xg_CO_):
1810
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_ = mg_CHOFe(xg_O2_, xg_CO_)
1811
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t))/(((xg_CO2_+xg_CO_+xg_CH4_)/Xg_t) - (xm_CO2_/Xm_t))
1812
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t))
1813
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_)/Xg_t) - (xm_H2O_/Xm_t))
1814
+ mbCO = (wt_g_C - wt_g_O)
1815
+ mbCH = (wt_g_C - wt_g_H)
1816
+ return mbCO, mbCH, wt_g_O, wt_g_C, wt_g_H
1817
+
1818
+ def df_CHOFe(xg_O2_,xg_CO_,constants):
1819
+ dmbCO_O = de.CHOFe_CO_O2(xg_O2_,xg_CO_,constants)
1820
+ dmbCO_C = de.CHOFe_CO_CO(xg_O2_,xg_CO_,constants)
1821
+ dmbCH_O = de.CHOFe_CH_O2(xg_O2_,xg_CO_,constants)
1822
+ dmbCH_C = de.CHOFe_CH_CO(xg_O2_,xg_CO_,constants)
1823
+ return dmbCO_O, dmbCO_C, dmbCH_O, dmbCH_C
1824
+
1825
+ xg_O2_, xg_CO_ = jac_newton(guessx,guessy,constants,f_CHOFe,df_CHOFe,nr_step,nr_tol)
1826
+ results1 = mg_CHOFe(xg_O2_,xg_CO_)
1827
+ results2 = f_CHOFe(xg_O2_,xg_CO_)
1828
+ results3 = mb_CHOFe(xg_O2_,xg_CO_)
1829
+ return xg_O2_, xg_CO_, results1, results2, results3
1830
+
1831
+ ### insolubles included
1832
+ def eq_CHOFe_2(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses):
1833
+ P = PT["P"]
1834
+ wt_O = bulk_wf['O']
1835
+ wt_C = bulk_wf['C']
1836
+ wt_H = bulk_wf['H']
1837
+ wt_Fe = bulk_wf['Fe']
1838
+ guessx = guesses["guessx"]
1839
+ guessy = guesses["guessy"]
1840
+
1841
+ # equilibrium constants
1842
+ K1_ = mdv.KHOg(PT,models)
1843
+ K2_ = mdv.KCOg(PT,models)
1844
+ K3_ = mdv.KCOHg(PT,models)
1845
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
1846
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
1847
+ K6_ = mdv.C_H2(PT,melt_wf,species,models)/1000000.
1848
+ K7_ = mdv.C_CO(PT,melt_wf,species,models)/1000000.
1849
+ K8_ = mdv.C_CH4(PT,melt_wf,species,models)/1000000.
1850
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
1851
+
1852
+ # fugacity coefficients
1853
+ y_CO_ = mdv.y_CO(PT,species,models)
1854
+ y_O2_ = mdv.y_O2(PT,species,models)
1855
+ y_CO2_ = mdv.y_CO2(PT,species,models)
1856
+ y_CH4_ = mdv.y_CH4(PT,species,models)
1857
+ y_H2O_ = mdv.y_H2O(PT,species,models)
1858
+ y_H2_ = mdv.y_H2(PT,species,models)
1859
+
1860
+ # molecular masses
1861
+ M_H = species.loc['H','M']
1862
+ M_C = species.loc['C','M']
1863
+ M_O = species.loc['O','M']
1864
+ M_Fe = species.loc['Fe','M']
1865
+ M_O2 = species.loc['O2','M']
1866
+ M_CO = species.loc['CO','M']
1867
+ M_H2O = species.loc['H2O','M']
1868
+ M_H2 = species.loc['H2','M']
1869
+ M_CO2 = species.loc['CO2','M']
1870
+ M_CH4 = species.loc['CH4','M']
1871
+ M_FeO = species.loc['FeO','M']
1872
+ M_FeO15 = species.loc['FeO1.5','M']
1873
+ M_m_ = mg.M_m_SO(melt_wf,species)
1874
+
1875
+ constants = [P, wt_O, wt_C, wt_H, wt_Fe, K1_, K2_, K3_, K4_, K5_, K6_, K7_, K8_, KD1_, KD2, y, y_H2_, y_O2_, y_H2O_, y_CO_, y_CO2_, y_CH4_, M_C, M_H, M_O, M_Fe, M_O2, M_CO, M_CO2, M_H2, M_H2O, M_CH4, M_FeO, M_FeO15, M_m_]
1876
+
1877
+ def mg_CHOFe(xg_O2_,xg_CO_):
1878
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
1879
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
1880
+ b = 1.0 + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5))
1881
+ c = xg_CO2_ + xg_CO_ + xg_O2_ - 1.0
1882
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
1883
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
1884
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
1885
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
1886
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
1887
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
1888
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4
1889
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
1890
+ Fe3T = Fe32/(1.0+Fe32)
1891
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
1892
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
1893
+ wm_H2_ = K6_*y_H2_*xg_H2_*P
1894
+ wm_CO_ = K7_*y_CO_*xg_CO_*P
1895
+ wm_CH4_ = K8_*y_CH4_*xg_CH4_*P
1896
+ return xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CO_, wm_CH4_
1897
+
1898
+ def mb_CHOFe(xg_O2_, xg_CO_):
1899
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CO_, wm_CH4_ = mg_CHOFe(xg_O2_, xg_CO_)
1900
+ mbCO, mbCH, wt_g_O, wt_g_C, wt_g_H = f_CHOFe(xg_O2_,xg_CO_)
1901
+ wt_g = (wt_g_O+wt_g_H+wt_g_C)/3.0
1902
+ wt_H_ = 2.0*M_H*((wt_g*(((xg_H2O_+xg_H2_+2.0*xg_CH4_)/Xg_t) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2) - ((2.*wm_CH4_)/M_CH4)))+(xm_H2O_/Xm_t) + (wm_H2_/M_H2) + ((2.*wm_CH4_)/M_CH4))
1903
+ wt_O_ = M_O*((wt_g*(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (wm_CO_/M_CO)))+(xm_H2O_/Xm_t) + ((2.0*xm_CO2_)/Xm_t) + (wm_CO_/M_CO) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
1904
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_+xg_CH4_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO) - (wm_CH4_/M_CH4))) + (xm_CO2_/Xm_t) + (wm_CO_/M_CO) + (wm_CH4_/M_CH4))
1905
+ return wt_g, wt_O_, wt_C_, wt_H_
1906
+
1907
+ def f_CHOFe(xg_O2_,xg_CO_):
1908
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CO_, wm_CH4_ = mg_CHOFe(xg_O2_, xg_CO_)
1909
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO) - (wm_CH4_/M_CH4))/(((xg_CO2_+xg_CO_+xg_CH4_)/Xg_t) - (xm_CO2_/Xm_t) - (wm_CO_/M_CO) - (wm_CH4_/M_CH4))
1910
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) -(wm_CO_/M_CO))
1911
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2) - ((2.*wm_CH4_)/M_CH4))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_)/Xg_t) - (xm_H2O_/Xm_t) - (wm_H2_/M_H2) - ((2.*wm_CH4_)/M_CH4))
1912
+ mbCO = (wt_g_C - wt_g_O)
1913
+ mbCH = (wt_g_C - wt_g_H)
1914
+ return mbCO, mbCH, wt_g_O, wt_g_C, wt_g_H
1915
+
1916
+ def df_CHOFe(xg_O2_,xg_CO_,constants):
1917
+ dmbCO_O = de.CHOFe_CO_O2_2(xg_O2_,xg_CO_,constants)
1918
+ dmbCO_C = de.CHOFe_CO_CO_2(xg_O2_,xg_CO_,constants)
1919
+ dmbCH_O = de.CHOFe_CH_O2_2(xg_O2_,xg_CO_,constants)
1920
+ dmbCH_C = de.CHOFe_CH_CO_2(xg_O2_,xg_CO_,constants)
1921
+ return dmbCO_O, dmbCO_C, dmbCH_O, dmbCH_C
1922
+
1923
+ xg_O2_, xg_CO_ = jac_newton(guessx,guessy,constants,f_CHOFe,df_CHOFe,nr_step,nr_tol)
1924
+ results1 = mg_CHOFe(xg_O2_,xg_CO_)
1925
+ results2 = f_CHOFe(xg_O2_,xg_CO_)
1926
+ results3 = mb_CHOFe(xg_O2_,xg_CO_)
1927
+ return xg_O2_, xg_CO_, results1, results2, results3
1928
+
1929
+
1930
+ #########################
1931
+ ### CH - H2O-CO2 only ###
1932
+ #########################
1933
+
1934
+ def eq_CH(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses): # H2O
1935
+ P = PT["P"]
1936
+ wt_C = bulk_wf['C']
1937
+ wt_H = bulk_wf['H']
1938
+ guessx = guesses["guessx"]
1939
+
1940
+ # equilibrium constants
1941
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
1942
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
1943
+
1944
+ # fugacity coefficients
1945
+ y_CO2_ = mdv.y_CO2(PT,species,models)
1946
+ y_H2O_ = mdv.y_H2O(PT,species,models)
1947
+
1948
+ # molecular masses
1949
+ M_H = species.loc['H','M']
1950
+ M_C = species.loc['C','M']
1951
+ M_H2O = species.loc['H2O','M']
1952
+ M_CO2 = species.loc['CO2','M']
1953
+ M_m_ = mg.M_m_SO(melt_wf,species)
1954
+
1955
+ constants = [P, wt_C, wt_H, K4_, K5_, y_H2O_, y_CO2_, M_H, M_C, M_CO2, M_H2O, M_m_]
1956
+
1957
+ def mg_CH(xg_CO2_):
1958
+ xg_H2O_ = 1. - xg_CO2_
1959
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
1960
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
1961
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
1962
+ Xg_t = xg_CO2_*M_CO2 + xg_H2O_*M_H2O
1963
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
1964
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
1965
+ return xg_CO2_, xg_H2O_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, wm_H2O_, wm_CO2_
1966
+
1967
+ def mb_CH(xg_CO2_):
1968
+ xg_CO2_, xg_H2O_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, wm_H2O_, wm_CO2_ = mg_CH(xg_CO2_)
1969
+ mbCH, wt_g_C, wt_g_H = f_CH(xg_CO2_)
1970
+ wt_g = (wt_g_H+wt_g_C)/2.
1971
+ wt_H_ = 2.0*M_H*((wt_g*((xg_H2O_/Xg_t) - (xm_H2O_/Xm_t)))+(xm_H2O_/Xm_t))
1972
+ wt_C_ = M_C*((wt_g*((xg_CO2_/Xg_t) - (xm_CO2_/Xm_t))) + (xm_CO2_/Xm_t))
1973
+ return wt_g, "", wt_C_, wt_H_
1974
+
1975
+ def f_CH(xg_CO2_):
1976
+ xg_CO2_, xg_H2O_, xm_H2O_, xm_CO2_, Xm_t, Xg_t, wm_H2O_, wm_CO2_ = mg_CH(xg_CO2_)
1977
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t))/((xg_CO2_/Xg_t) - (xm_CO2_/Xm_t))
1978
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t))/((xg_H2O_/Xg_t) - (xm_H2O_/Xm_t))
1979
+ mbCH = (wt_g_C - wt_g_H)
1980
+ return mbCH, wt_g_C, wt_g_H
1981
+
1982
+ def df_CH(xg_CO2_,constants):
1983
+ dmbCH_C = de.CH_CO2(xg_CO2_,constants)
1984
+ return dmbCH_C
1985
+
1986
+ xg_CO2_ = newton_raphson(guessx,constants,nr_tol,nr_step,f_CH,df_CH)
1987
+ result1 = mg_CH(xg_CO2_)
1988
+ result2 = f_CH(xg_CO2_)
1989
+ result3 = mb_CH(xg_CO2_)
1990
+ return xg_CO2_, result1, result2, result3
1991
+
1992
+ ##############
1993
+ ### CHOXFe ###
1994
+ ##############
1995
+
1996
+ def eq_CHOXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species):
1997
+ species_X = models.loc["species X","option"]
1998
+ P = PT["P"]
1999
+ wt_O = bulk_wf['O']
2000
+ wt_X = bulk_wf['X']
2001
+ wt_H = bulk_wf['H']
2002
+ wt_C = bulk_wf['C']
2003
+ wt_Fe = bulk_wf['Fe']
2004
+ guessx = guesses["guessx"]
2005
+ guessy = guesses["guessy"]
2006
+ guessz = guesses["guessz"]
2007
+
2008
+ # equilibrium constants
2009
+ K1_ = mdv.KHOg(PT,models)
2010
+ K2_ = mdv.KCOg(PT,models)
2011
+ K3_ = mdv.KCOHg(PT,models)
2012
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
2013
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
2014
+ K6_ = mdv.C_X(PT,melt_wf,species,models)/1000000.0
2015
+ K11_ = mdv.C_CO(PT,melt_wf,species,models)/1000000.0
2016
+ K12_ = mdv.C_CH4(PT,melt_wf,species,models)/1000000.0
2017
+ K13_ = mdv.C_H2(PT,melt_wf,species,models)/1000000.0
2018
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
2019
+
2020
+ # fugacity coefficients
2021
+ y_CO_ = mdv.y_CO(PT,species,models)
2022
+ y_O2_ = mdv.y_O2(PT,species,models)
2023
+ y_CO2_ = mdv.y_CO2(PT,species,models)
2024
+ y_CH4_ = mdv.y_CH4(PT,species,models)
2025
+ y_H2O_ = mdv.y_H2O(PT,species,models)
2026
+ y_H2_ = mdv.y_H2(PT,species,models)
2027
+ y_X_ = mdv.y_X(PT,species,models)
2028
+
2029
+ # molecular masses
2030
+ M_H = species.loc['H','M']
2031
+ M_C = species.loc['C','M']
2032
+ M_O = species.loc['O','M']
2033
+ M_Fe = species.loc['Fe','M']
2034
+ M_O2 = species.loc['O2','M']
2035
+ M_CO = species.loc['CO','M']
2036
+ M_OH = species.loc['OH','M']
2037
+ M_H2O = species.loc['H2O','M']
2038
+ M_H2 = species.loc['H2','M']
2039
+ M_CO2 = species.loc['CO2','M']
2040
+ M_CH4 = species.loc['CH4','M']
2041
+ M_FeO = species.loc['FeO','M']
2042
+ M_FeO15 = species.loc['FeO1.5','M']
2043
+ M_X = species.loc[species_X,'M']
2044
+ M_m_ = mg.M_m_SO(melt_wf,species)
2045
+ M_m_ox = mg.M_m_ox(melt_wf,species,models)
2046
+
2047
+ constants = [P, wt_O, wt_C, wt_H, wt_X, wt_Fe, K1_, K2_, K3_, K4_, K5_, K6_, K11_, K12_, K13_, KD1_, KD2, y, y_H2_, y_O2_, y_H2O_, y_CO_, y_CO2_, y_CH4_, y_X_, M_C, M_H, M_O, M_X, M_Fe, M_O2, M_CO, M_CO2, M_OH, M_H2, M_H2O, M_CH4, M_FeO, M_FeO15, M_m_, M_m_ox]
2048
+
2049
+ def mg_CHOXFe(xg_O2_,xg_CO_,xg_X_):
2050
+ xg_O2__ = xg_O2_
2051
+ xg_CO__ = xg_CO_
2052
+ xg_X__ = xg_X_
2053
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2054
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.)
2055
+ b = 1. + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5))
2056
+ c = xg_CO2_ + xg_CO_ + xg_O2_ + xg_X_ - 1.
2057
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
2058
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
2059
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2060
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_X_*M_X
2061
+ # melt composition
2062
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
2063
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
2064
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
2065
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
2066
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
2067
+ wm_CO_ = K11_*y_CO_*xg_CO_*P
2068
+ wm_CH4_ = K12_*y_CH4_*xg_CH4_*P
2069
+ wm_H2_ = K13_*y_H2_*xg_H2_*P
2070
+ wm_X_ = K6_*y_X_*xg_X_*P
2071
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
2072
+ Fe3T = Fe32/(1.0+Fe32)
2073
+ Xm_t_ox = ""
2074
+ return xg_O2__, xg_H2_, xg_X__, xg_H2O_, xg_CO__, xg_CO2_, xg_CH4_, Xg_t, xm_H2O_, xm_CO2_, wm_X_, Xm_t, Xm_t_ox, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CH4_, wm_CO_
2075
+
2076
+ def mb_CHOXFe(xg_O2_,xg_CO_,xg_X_):
2077
+ xg_O2__, xg_H2_, xg_X__, xg_H2O_, xg_CO__, xg_CO2_, xg_CH4_, Xg_t, xm_H2O_, xm_CO2_, wm_X_, Xm_t, Xm_t_ox, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CH4_, wm_CO_ = mg_CHOXFe(xg_O2_, xg_CO_, xg_X_)
2078
+ mba, mbb, mbc, wt_g_O, wt_g_C, wt_g_H, wt_g_X = f_CHOXFe(xg_O2_, xg_CO_, xg_X_)
2079
+ wt_g = (wt_g_O+wt_g_H+wt_g_C+wt_g_X)/4.
2080
+ wt_H_ = 2.*M_H*((wt_g*(((xg_H2O_+xg_H2_+2.*xg_CH4_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4))) + (wm_H2O_/M_H2O) + (wm_H2_/M_H2) + (2.*wm_CH4_/M_CH4))
2081
+ wt_O_ = M_O*((wt_g*(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (wm_CO_/M_CO))) + (wm_H2O_/M_H2O) + ((2.0*wm_CO2_)/M_CO2) + (wm_CO_/M_CO) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
2082
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_+xg_CH4_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))) + (wm_CO2_/M_CO2) + (wm_CH4_/M_CH4) + (wm_CO_/M_CO))
2083
+ wt_X_ = M_X*((wt_g*(((xg_X_)/Xg_t) - (wm_X_/M_X))) + (wm_X_/M_X))
2084
+ return wt_g, wt_O_, wt_C_, wt_H_, wt_X_
2085
+
2086
+ def f_CHOXFe(xg_O2_,xg_CO_,xg_X_):
2087
+ xg_O2__, xg_H2_, xg_X__, xg_H2O_, xg_CO__, xg_CO2_, xg_CH4_, Xg_t, xm_H2O_, xm_CO2_, wm_X_, Xm_t, Xm_t_ox, Fe32, Fe3T, wm_H2O_, wm_CO2_, wm_H2_, wm_CH4_, wm_CO_ = mg_CHOXFe(xg_O2_,xg_CO_,xg_X_)
2088
+ wt_g_C = ((wt_C/M_C) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_+xg_CH4_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))
2089
+ wt_g_O = ((wt_O/M_O) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_)/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (wm_CO_/M_CO))
2090
+ wt_g_H = ((wt_H/(2.0*M_H)) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4))
2091
+ wt_g_X = ((wt_X/M_X) - (wm_X_/M_X))/(((xg_X_)/Xg_t) - (wm_X_/M_X))
2092
+ mba = (wt_g_C - wt_g_O) # mbCO
2093
+ mbb = (wt_g_C - wt_g_H) # mbCH
2094
+ mbc = (wt_g_C - wt_g_X) # mbCS
2095
+ return mba, mbb, mbc, wt_g_O, wt_g_C, wt_g_H, wt_g_X
2096
+
2097
+ def df_CHOXFe(xg_O2_,xg_CO_,xg_X_,constants):
2098
+ dmba_O = de.CHOXFe_CO_O2(xg_O2_,xg_CO_,xg_X_,constants) # dmbCO_O
2099
+ dmba_A = de.CHOXFe_CO_CO(xg_O2_,xg_CO_,xg_X_,constants) # dmbCO_CO
2100
+ dmba_B = de.CHOXFe_CO_X(xg_O2_,xg_CO_,xg_X_,constants) # dmbCO_S
2101
+ dmbb_O = de.CHOXFe_CH_O2(xg_O2_,xg_CO_,xg_X_,constants) # dmbCH_O
2102
+ dmbb_A = de.CHOXFe_CH_CO(xg_O2_,xg_CO_,xg_X_,constants) # dmbCH_CO
2103
+ dmbb_B = de.CHOXFe_CH_X(xg_O2_,xg_CO_,xg_X_,constants) # dmbCH_S
2104
+ dmbc_O = de.CHOXFe_CX_O2(xg_O2_,xg_CO_,xg_X_,constants) # dmbCS_O
2105
+ dmbc_A = de.CHOXFe_CX_CO(xg_O2_,xg_CO_,xg_X_,constants) # dmbCS_CO
2106
+ dmbc_B = de.CHOXFe_CX_X(xg_O2_,xg_CO_,xg_X_,constants) # dmbCS_S
2107
+ return dmba_O, dmba_A, dmba_B, dmbb_O, dmbb_A, dmbb_B, dmbc_O, dmbc_A, dmbc_B
2108
+
2109
+ xg_O2_, xg_CO_, xg_X_ = jac_newton3(guessx,guessy,guessz,constants,f_CHOXFe,df_CHOXFe,nr_step,nr_tol)
2110
+ results1 = xg_O2_, xg_CO_, xg_X_
2111
+ results2 = mg_CHOXFe(xg_O2_,xg_CO_,xg_X_)
2112
+ results3 = f_CHOXFe(xg_O2_,xg_CO_,xg_X_)
2113
+ results4 = mb_CHOXFe(xg_O2_,xg_CO_,xg_X_)
2114
+ return results1, results2, results3, results4
2115
+
2116
+
2117
+ ##############
2118
+ ### SCHOFe ###
2119
+ ##############
2120
+
2121
+ # all gas species - only oxidised melt species - no H2S #
2122
+
2123
+ def eq_SCHOFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species):
2124
+ P = PT["P"]
2125
+ wt_O = bulk_wf['O']
2126
+ wt_S = bulk_wf['S']
2127
+ wt_H = bulk_wf['H']
2128
+ wt_C = bulk_wf['C']
2129
+ wt_Fe = bulk_wf['Fe']
2130
+ guessx = guesses["guessx"]
2131
+ guessy = guesses["guessy"]
2132
+ guessz = guesses["guessz"]
2133
+
2134
+ # equilibrium constants
2135
+ K1_ = mdv.KHOg(PT,models)
2136
+ K2_ = mdv.KCOg(PT,models)
2137
+ K3_ = mdv.KCOHg(PT,models)
2138
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
2139
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
2140
+ K6_ = mdv.KOSg(PT,models)
2141
+ K7_ = mdv.KHOSg(PT,models)
2142
+ K8_ = mdv.C_S(PT,melt_wf,species,models)/1000000.0
2143
+ K9_ = (mdv.C_SO4(PT,melt_wf,species,models)/1000000.0)
2144
+ K10_ = mdv.KOCSg(PT,models)
2145
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
2146
+
2147
+ # fugacity coefficients
2148
+ y_CO_ = mdv.y_CO(PT,species,models)
2149
+ y_O2_ = mdv.y_O2(PT,species,models)
2150
+ y_CO2_ = mdv.y_CO2(PT,species,models)
2151
+ y_CH4_ = mdv.y_CH4(PT,species,models)
2152
+ y_H2O_ = mdv.y_H2O(PT,species,models)
2153
+ y_H2_ = mdv.y_H2(PT,species,models)
2154
+ y_S2_ = mdv.y_S2(PT,species,models)
2155
+ y_SO2_ = mdv.y_SO2(PT,species,models)
2156
+ y_H2S_ = mdv.y_H2S(PT,species,models)
2157
+ y_OCS_ = mdv.y_OCS(PT,species,models)
2158
+
2159
+ # molecular masses
2160
+ M_H = species.loc['H','M']
2161
+ M_C = species.loc['C','M']
2162
+ M_O = species.loc['O','M']
2163
+ M_S = species.loc['S','M']
2164
+ M_Fe = species.loc['Fe','M']
2165
+ M_O2 = species.loc['O2','M']
2166
+ M_CO = species.loc['CO','M']
2167
+ M_H2O = species.loc['H2O','M']
2168
+ M_H2 = species.loc['H2','M']
2169
+ M_CO2 = species.loc['CO2','M']
2170
+ M_CH4 = species.loc['CH4','M']
2171
+ M_S2 = species.loc['S2','M']
2172
+ M_SO2 = species.loc['SO2','M']
2173
+ M_SO3 = species.loc['SO3','M']
2174
+ M_H2S = species.loc['H2S','M']
2175
+ M_FeO = species.loc['FeO','M']
2176
+ M_FeO15 = species.loc['FeO1.5','M']
2177
+ M_OCS = species.loc['OCS','M']
2178
+ M_m_ = mg.M_m_SO(melt_wf,species)
2179
+
2180
+ constants = [P, wt_O, wt_C, wt_H, wt_S, wt_Fe, K1_, K2_, K3_, K4_, K5_, K6_, K7_, K8_, K9_, K10_, KD1_, KD2, y, y_H2_, y_O2_, y_H2O_, y_CO_, y_CO2_, y_CH4_, y_SO2_, y_S2_, y_H2S_, y_OCS_, M_C, M_H, M_O, M_S, M_Fe, M_O2, M_CO, M_CO2, M_H2, M_H2O, M_CH4, M_S2, M_SO2, M_SO3, M_H2S, M_OCS, M_FeO, M_FeO15, M_m_]
2181
+
2182
+ def mg_SCHOFe_OCS(xg_O2_,xg_CO_,xg_S2_):
2183
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2184
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2185
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2186
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2187
+ b = 1.0 + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)) + ((K7_*(y_S2_*xg_S2_)**0.5*y_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5))
2188
+ c = xg_CO2_ + xg_CO_ + xg_O2_ + xg_S2_ + xg_SO2_ + xg_OCS_ - 1.0
2189
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
2190
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
2191
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2192
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2193
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_H2S_*M_H2S + xg_OCS_*M_OCS
2194
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
2195
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
2196
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
2197
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
2198
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3)
2199
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
2200
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
2201
+ Fe3T = Fe32/(1.0+Fe32)
2202
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
2203
+ S6T = S62/(1.0+S62)
2204
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
2205
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
2206
+ return xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_
2207
+
2208
+ def mg_SCHOFe_OHS(xg_O2_,xg_H2_,xg_S2_):
2209
+ xg_H2O_ = (xg_H2_*K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)/y_H2O_
2210
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2211
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2212
+ xg_CO2_ = (1.0 - xg_S2_ - xg_O2_ - xg_H2_ - xg_H2O_ - xg_H2S_ - xg_SO2_)/(1.0 + (y_CO2_/(K2_*y_CO_*(y_O2_*xg_O2_*P)**0.5)) + ((y_CO2_*y_SO2_*xg_SO2_)/(K2_**3.0*K10_*y_OCS_*(y_O2_*xg_O2_)**1.5*P**0.5)) + ((y_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)))
2213
+ xg_CO_ = (y_CO2_*xg_CO2_)/(K2_*y_CO_*(y_O2_*xg_O2_*P)**0.5)
2214
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2215
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2216
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_H2S_*M_H2S + xg_OCS_*M_OCS
2217
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
2218
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
2219
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
2220
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
2221
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3)
2222
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
2223
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
2224
+ Fe3T = Fe32/(1.0+Fe32)
2225
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
2226
+ S6T = S62/(1.0+S62)
2227
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
2228
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
2229
+ return xg_CO_, xg_CO2_, xg_H2O_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_
2230
+
2231
+ def mg_SCHOFe_OCH(xg_O2_,xg_CO_,xg_H2_):
2232
+ xg_H2O_ = (xg_H2_*K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)/y_H2O_
2233
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2234
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2235
+ a = 1.0
2236
+ b = ((K6_*(y_S2_*P)**0.5*y_O2_*xg_O2_)/y_SO2_) + (((K7_*y_H2O_*xg_H2O_)/y_H2S_)*(y_S2_/(y_O2_*xg_O2_))**0.5) + (((y_CO_*xg_CO_)**3.0*P**1.5*K6_*y_S2_**0.5*y_O2_*xg_O2_)/(K10_*y_OCS_*(y_CO2_*xg_CO2_)**2.0))
2237
+ c = xg_O2_ + xg_CO_ + xg_CO2_ + xg_H2_ + xg_H2O_ + xg_CH4_ - 1.0
2238
+ xg_S2_ = ((-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a))**2.0
2239
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2240
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2241
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2242
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_H2S_*M_H2S + xg_OCS_*M_OCS
2243
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
2244
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
2245
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
2246
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
2247
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3)
2248
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
2249
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
2250
+ Fe3T = Fe32/(1.0+Fe32)
2251
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
2252
+ S6T = S62/(1.0+S62)
2253
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
2254
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
2255
+ return xg_CO2_, xg_H2O_, xg_CH4_, xg_S2_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_
2256
+
2257
+ def mb_SCHOFe(xg_O2_,xg_CO_,xg_H2_,xg_S2_):
2258
+ if solve_species == "OCS":
2259
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = mg_SCHOFe_OCS(xg_O2_, xg_CO_, xg_S2_)
2260
+ mbCO, mbCH, mbCS, wt_g_O, wt_g_C, wt_g_H, wt_g_S = f_SCHOFe_OCS(xg_O2_,xg_CO_,xg_S2_)
2261
+ elif solve_species == "OHS":
2262
+ xg_CO_, xg_CO2_, xg_H2O_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = mg_SCHOFe_OHS(xg_O2_, xg_H2_, xg_S2_)
2263
+ mbHO, mbHC, mbHS, wt_g_O, wt_g_C, wt_g_H, wt_g_S = f_SCHOFe_OHS(xg_O2_,xg_H2_,xg_S2_)
2264
+ elif solve_species == "OCH":
2265
+ xg_CO2_, xg_H2O_, xg_CH4_, xg_S2_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = mg_SCHOFe_OCH(xg_O2_, xg_CO_, xg_H2_)
2266
+ mbCO, mbCH, mbCS, wt_g_O, wt_g_C, wt_g_H, wt_g_S = f_SCHOFe_OCH(xg_O2_,xg_CO_,xg_H2_)
2267
+ wt_g = (wt_g_O+wt_g_H+wt_g_C+wt_g_S)/4.0
2268
+ wt_H_ = 2.0*M_H*((wt_g*(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (xm_H2O_/Xm_t)))+(xm_H2O_/Xm_t))
2269
+ wt_O_ = M_O*((wt_g*(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (3.0*wm_SO3_/M_SO3)))+(xm_H2O_/Xm_t) + ((2.0*xm_CO2_)/Xm_t) + (3.0*wm_SO3_/M_SO3) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
2270
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (xm_CO2_/Xm_t))) + (xm_CO2_/Xm_t))
2271
+ wt_S_ = M_S*((wt_g*(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))) + (wm_S_/M_S) + (wm_SO3_/M_SO3))
2272
+ return wt_g, wt_O_, wt_C_, wt_H_, wt_S_
2273
+
2274
+ def f_SCHOFe_OCS(xg_O2_,xg_CO_,xg_S2_):
2275
+ xg_CO2_, xg_H2O_, xg_H2_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = mg_SCHOFe_OCS(xg_O2_, xg_CO_, xg_S2_)
2276
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t))/(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (xm_CO2_/Xm_t))
2277
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (3.0*wm_SO3_/M_SO3) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (3.0*wm_SO3_/M_SO3))
2278
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (xm_H2O_/Xm_t))
2279
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))
2280
+ mbCO = (wt_g_C - wt_g_O)
2281
+ mbCH = (wt_g_C - wt_g_H)
2282
+ mbCS = (wt_g_C - wt_g_S)
2283
+ return mbCO, mbCH, mbCS, wt_g_O, wt_g_C, wt_g_H, wt_g_S
2284
+
2285
+ def f_SCHOFe_OHS(xg_O2_,xg_H2_,xg_S2_):
2286
+ xg_CO_, xg_CO2_, xg_H2O_, xg_CH4_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = mg_SCHOFe_OHS(xg_O2_, xg_H2_, xg_S2_)
2287
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t))/(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (xm_CO2_/Xm_t))
2288
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (3.0*wm_SO3_/M_SO3) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (3.0*wm_SO3_/M_SO3))
2289
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (xm_H2O_/Xm_t))
2290
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))
2291
+ mbHO = (wt_g_H - wt_g_O)
2292
+ mbHC = (wt_g_H - wt_g_C)
2293
+ mbHS = (wt_g_H - wt_g_S)
2294
+ return mbHO, mbHC, mbHS, wt_g_O, wt_g_C, wt_g_H, wt_g_S
2295
+
2296
+ def f_SCHOFe_OCH(xg_O2_,xg_CO_,xg_H2_):
2297
+ xg_CO2_, xg_H2O_, xg_CH4_, xg_S2_, xg_SO2_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_ = mg_SCHOFe_OCH(xg_O2_, xg_CO_, xg_H2_)
2298
+ wt_g_C = ((wt_C/M_C) - (xm_CO2_/Xm_t))/(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (xm_CO2_/Xm_t))
2299
+ wt_g_O = ((wt_O/M_O) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (3.0*wm_SO3_/M_SO3) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_)/Xg_t) - (xm_H2O_/Xm_t) - ((2.0*xm_CO2_)/Xm_t) - (3.0*wm_SO3_/M_SO3))
2300
+ wt_g_H = ((wt_H/(2.0*M_H)) - (xm_H2O_/Xm_t))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (xm_H2O_/Xm_t))
2301
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3))
2302
+ mbCO = (wt_g_C - wt_g_O)
2303
+ mbCH = (wt_g_C - wt_g_H)
2304
+ mbCS = (wt_g_C - wt_g_S)
2305
+ return mbCO, mbCH, mbCS, wt_g_O, wt_g_C, wt_g_H, wt_g_S
2306
+
2307
+ def df_SCHOFe_OCS(xg_O2_,xg_CO_,xg_S2_,constants):
2308
+ dmbCO_O = de.SCHOFe_OCS_CO_O2(xg_O2_,xg_CO_,xg_S2_,constants)
2309
+ dmbCO_CO = de.SCHOFe_OCS_CO_CO(xg_O2_,xg_CO_,xg_S2_,constants)
2310
+ dmbCO_S = de.SCHOFe_OCS_CO_S2(xg_O2_,xg_CO_,xg_S2_,constants)
2311
+ dmbCH_O = de.SCHOFe_OCS_CH_O2(xg_O2_,xg_CO_,xg_S2_,constants)
2312
+ dmbCH_CO = de.SCHOFe_OCS_CH_CO(xg_O2_,xg_CO_,xg_S2_,constants)
2313
+ dmbCH_S = de.SCHOFe_OCS_CH_S2(xg_O2_,xg_CO_,xg_S2_,constants)
2314
+ dmbCS_O = de.SCHOFe_OCS_CS_O2(xg_O2_,xg_CO_,xg_S2_,constants)
2315
+ dmbCS_CO = de.SCHOFe_OCS_CS_CO(xg_O2_,xg_CO_,xg_S2_,constants)
2316
+ dmbCS_S = de.SCHOFe_OCS_CS_S2(xg_O2_,xg_CO_,xg_S2_,constants)
2317
+ return dmbCO_O, dmbCO_CO, dmbCO_S, dmbCH_O, dmbCH_CO, dmbCH_S, dmbCS_O, dmbCS_CO, dmbCS_S
2318
+
2319
+ def df_SCHOFe_OHS(xg_O2_,xg_H2_,xg_S2_,constants):
2320
+ dmbHO_O = de.SCHOFe_OHS_HO_O2(xg_O2_,xg_H2_,xg_S2_,constants)
2321
+ dmbHO_H = de.SCHOFe_OHS_HO_H2(xg_O2_,xg_H2_,xg_S2_,constants)
2322
+ dmbHO_S = de.SCHOFe_OHS_HO_S2(xg_O2_,xg_H2_,xg_S2_,constants)
2323
+ dmbHC_O = de.SCHOFe_OHS_HC_O2(xg_O2_,xg_H2_,xg_S2_,constants)
2324
+ dmbHC_H = de.SCHOFe_OHS_HC_H2(xg_O2_,xg_H2_,xg_S2_,constants)
2325
+ dmbHC_S = de.SCHOFe_OHS_HC_S2(xg_O2_,xg_H2_,xg_S2_,constants)
2326
+ dmbHS_O = de.SCHOFe_OHS_HS_O2(xg_O2_,xg_H2_,xg_S2_,constants)
2327
+ dmbHS_H = de.SCHOFe_OHS_HS_H2(xg_O2_,xg_H2_,xg_S2_,constants)
2328
+ dmbHS_S = de.SCHOFe_OHS_HS_S2(xg_O2_,xg_H2_,xg_S2_,constants)
2329
+ return dmbHO_O, dmbHO_H, dmbHO_S, dmbHC_O, dmbHC_H, dmbHC_S, dmbHS_O, dmbHS_H, dmbHS_S
2330
+
2331
+ def df_SCHOFe_OCH(xg_O2_,xg_CO_,xg_H2_,constants):
2332
+ dmbCO_O = de.SCHOFe_OCH_CO_O2(xg_O2_,xg_CO_,xg_H2_,constants)
2333
+ dmbCO_CO = de.SCHOFe_OCH_CO_CO(xg_O2_,xg_CO_,xg_H2_,constants)
2334
+ dmbCO_H = de.SCHOFe_OCH_CO_H2(xg_O2_,xg_CO_,xg_H2_,constants)
2335
+ dmbCH_O = de.SCHOFe_OCH_CH_O2(xg_O2_,xg_CO_,xg_H2_,constants)
2336
+ dmbCH_CO = de.SCHOFe_OCH_CH_CO(xg_O2_,xg_CO_,xg_H2_,constants)
2337
+ dmbCH_H = de.SCHOFe_OCH_CH_H2(xg_O2_,xg_CO_,xg_H2_,constants)
2338
+ dmbCS_O = de.SCHOFe_OCH_CS_O2(xg_O2_,xg_CO_,xg_H2_,constants)
2339
+ dmbCS_CO = de.SCHOFe_OCH_CS_CO(xg_O2_,xg_CO_,xg_H2_,constants)
2340
+ dmbCS_H = de.SCHOFe_OCH_CS_H2(xg_O2_,xg_CO_,xg_H2_,constants)
2341
+ return dmbCO_O, dmbCO_CO, dmbCO_H, dmbCH_O, dmbCH_CO, dmbCH_H, dmbCS_O, dmbCS_CO, dmbCS_H
2342
+
2343
+ if solve_species == "OCS":
2344
+ xg_O2_, xg_CO_, xg_S2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe_OCS,df_SCHOFe_OCS,nr_step,nr_tol)
2345
+ results1 = xg_O2_, xg_CO_, xg_S2_
2346
+ results2 = mg_SCHOFe_OCS(xg_O2_,xg_CO_,xg_S2_)
2347
+ results3 = f_SCHOFe_OCS(xg_O2_,xg_CO_,xg_S2_)
2348
+ xg_H2_ = results2[2]
2349
+ elif solve_species == "OHS":
2350
+ xg_O2_, xg_H2_, xg_S2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe_OHS,df_SCHOFe_OHS,nr_step,nr_tol)
2351
+ results1 = xg_O2_, xg_H2_, xg_S2_
2352
+ results2 = mg_SCHOFe_OHS(xg_O2_,xg_H2_,xg_S2_)
2353
+ results3 = f_SCHOFe_OHS(xg_O2_,xg_H2_,xg_S2_)
2354
+ xg_CO_ = results2[0]
2355
+ elif solve_species == "OCH":
2356
+ xg_O2_, xg_CO_, xg_H2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe_OCH,df_SCHOFe_OCH,nr_step,nr_tol)
2357
+ results1 = xg_O2_, xg_CO_, xg_H2_
2358
+ results2 = mg_SCHOFe_OCH(xg_O2_,xg_CO_,xg_H2_)
2359
+ results3 = f_SCHOFe_OCH(xg_O2_,xg_CO_,xg_H2_)
2360
+ xg_S2_ = results2[3]
2361
+ results4 = mb_SCHOFe(xg_O2_,xg_CO_,xg_H2_,xg_S2_)
2362
+ return results1, results2, results3, results4
2363
+
2364
+
2365
+ # all gas species - oxidised and reduced melt species - H2S #
2366
+
2367
+ def eq_SCHOFe_2(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species):
2368
+ P = PT["P"]
2369
+ wt_O = bulk_wf['O']
2370
+ wt_S = bulk_wf['S']
2371
+ wt_H = bulk_wf['H']
2372
+ wt_C = bulk_wf['C']
2373
+ wt_Fe = bulk_wf['Fe']
2374
+ guessx = guesses["guessx"]
2375
+ guessy = guesses["guessy"]
2376
+ guessz = guesses["guessz"]
2377
+
2378
+ # equilibrium constants
2379
+ K1_ = mdv.KHOg(PT,models)
2380
+ K2_ = mdv.KCOg(PT,models)
2381
+ K3_ = mdv.KCOHg(PT,models)
2382
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
2383
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
2384
+ K6_ = mdv.KOSg(PT,models)
2385
+ K7_ = mdv.KHOSg(PT,models)
2386
+ K8_ = mdv.C_S(PT,melt_wf,species,models)/1000000.0
2387
+ K9_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000.0
2388
+ K10_ = mdv.KOCSg(PT,models)
2389
+ K11_ = mdv.C_CO(PT,melt_wf,species,models)/1000000.0
2390
+ K12_ = mdv.C_CH4(PT,melt_wf,species,models)/1000000.0
2391
+ K13_ = mdv.C_H2(PT,melt_wf,species,models)/1000000.0
2392
+ K14_ = mdv.C_H2S(PT,melt_wf,species,models)/1000000.0
2393
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
2394
+
2395
+ # fugacity coefficients
2396
+ y_CO_ = mdv.y_CO(PT,species,models)
2397
+ y_O2_ = mdv.y_O2(PT,species,models)
2398
+ y_CO2_ = mdv.y_CO2(PT,species,models)
2399
+ y_CH4_ = mdv.y_CH4(PT,species,models)
2400
+ y_H2O_ = mdv.y_H2O(PT,species,models)
2401
+ y_H2_ = mdv.y_H2(PT,species,models)
2402
+ y_S2_ = mdv.y_S2(PT,species,models)
2403
+ y_SO2_ = mdv.y_SO2(PT,species,models)
2404
+ y_H2S_ = mdv.y_H2S(PT,species,models)
2405
+ y_OCS_ = mdv.y_OCS(PT,species,models)
2406
+
2407
+ # molecular masses
2408
+ M_H = species.loc['H','M']
2409
+ M_C = species.loc['C','M']
2410
+ M_O = species.loc['O','M']
2411
+ M_S = species.loc['S','M']
2412
+ M_Fe = species.loc['Fe','M']
2413
+ M_O2 = species.loc['O2','M']
2414
+ M_CO = species.loc['CO','M']
2415
+ M_OH = species.loc['OH','M']
2416
+ M_H2O = species.loc['H2O','M']
2417
+ M_H2 = species.loc['H2','M']
2418
+ M_CO2 = species.loc['CO2','M']
2419
+ M_CH4 = species.loc['CH4','M']
2420
+ M_S2 = species.loc['S2','M']
2421
+ M_SO2 = species.loc['SO2','M']
2422
+ M_SO3 = species.loc['SO3','M']
2423
+ M_H2S = species.loc['H2S','M']
2424
+ M_FeO = species.loc['FeO','M']
2425
+ M_FeO15 = species.loc['FeO1.5','M']
2426
+ M_OCS = species.loc['OCS','M']
2427
+ M_m_ = mg.M_m_SO(melt_wf,species)
2428
+ M_m_ox = mg.M_m_ox(melt_wf,species,models)
2429
+
2430
+ constants = [P, wt_O, wt_C, wt_H, wt_S, wt_Fe, K1_, K2_, K3_, K4_, K5_, K6_, K7_, K8_, K9_, K10_, K11_, K12_, K13_, K14_, KD1_, KD2, y, y_H2_, y_O2_, y_H2O_, y_CO_, y_CO2_, y_CH4_, y_SO2_, y_S2_, y_H2S_, y_OCS_, M_C, M_H, M_O, M_S, M_Fe, M_O2, M_CO, M_CO2, M_OH, M_H2, M_H2O, M_CH4, M_S2, M_SO2, M_SO3, M_H2S, M_OCS, M_FeO, M_FeO15, M_m_, M_m_ox]
2431
+
2432
+ def mg_SCHOFe(xg_O2_,xg_A,xg_B):
2433
+ xg_O2__ = xg_O2_
2434
+ if solve_species == "OCS": # A = CO, B = S2
2435
+ xg_CO_ = xg_A # mole fractions in the gas
2436
+ xg_S2_ = xg_B
2437
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2438
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2439
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2440
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2441
+ b = 1.0 + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)) + ((K7_*(y_S2_*xg_S2_)**0.5*y_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5))
2442
+ c = xg_CO2_ + xg_CO_ + xg_O2_ + xg_S2_ + xg_SO2_ + xg_OCS_ - 1.0
2443
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
2444
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
2445
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2446
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2447
+ elif solve_species == "OHS": # A = H2, B = S2
2448
+ xg_H2_ = xg_A # mole fractions in the gas
2449
+ xg_S2_ = xg_B
2450
+ xg_H2O_ = (xg_H2_*K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)/y_H2O_
2451
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2452
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2453
+ xg_CO2_ = (1.0 - xg_S2_ - xg_O2_ - xg_H2_ - xg_H2O_ - xg_H2S_ - xg_SO2_)/(1.0 + (y_CO2_/(K2_*y_CO_*(y_O2_*xg_O2_*P)**0.5)) + ((y_CO2_*y_SO2_*xg_SO2_)/(K2_**3.0*K10_*y_OCS_*(y_O2_*xg_O2_)**1.5*P**0.5)) + ((y_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)))
2454
+ xg_CO_ = (y_CO2_*xg_CO2_)/(K2_*y_CO_*(y_O2_*xg_O2_*P)**0.5)
2455
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2456
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2457
+ elif solve_species == "OCH": # A = CO, B = H2
2458
+ xg_CO_ = xg_A # mole fractions in the gas
2459
+ xg_H2_ = xg_B
2460
+ xg_H2O_ = (xg_H2_*K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)/y_H2O_
2461
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2462
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2463
+ a = 1.0
2464
+ b = ((K6_*(y_S2_*P)**0.5*y_O2_*xg_O2_)/y_SO2_) + (((K7_*y_H2O_*xg_H2O_)/y_H2S_)*(y_S2_/(y_O2_*xg_O2_))**0.5) + (((y_CO_*xg_CO_)**3.0*P**1.5*K6_*y_S2_**0.5*y_O2_*xg_O2_)/(K10_*y_OCS_*(y_CO2_*xg_CO2_)**2.0))
2465
+ c = xg_O2_ + xg_CO_ + xg_CO2_ + xg_H2_ + xg_H2O_ + xg_CH4_ - 1.0
2466
+ xg_S2_ = ((-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a))**2.0
2467
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2468
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2469
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2470
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_H2S_*M_H2S + xg_OCS_*M_OCS
2471
+ # melt composition
2472
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
2473
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
2474
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
2475
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
2476
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
2477
+ wm_CO_ = K11_*y_CO_*xg_CO_*P
2478
+ wm_CH4_ = K12_*y_CH4_*xg_CH4_*P
2479
+ wm_H2_ = K13_*y_H2_*xg_H2_*P
2480
+ wm_H2S_ = K14_*y_H2S_*xg_H2S_*P
2481
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
2482
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
2483
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3) + ((M_S*wm_H2S_)/M_H2S)
2484
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
2485
+ Fe3T = Fe32/(1.0+Fe32)
2486
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
2487
+ S6T = S62/(1.0+S62)
2488
+ Xm_t_ox = ""
2489
+ return xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_
2490
+
2491
+ def mb_SCHOFe(xg_O2_,xg_CO_,xg_H2_,xg_S2_): # A = CO, B = H2, C = S2
2492
+ if solve_species == "OCS":
2493
+ xg_A = xg_CO_
2494
+ xg_B = xg_S2_
2495
+ elif solve_species == "OHS":
2496
+ xg_A = xg_H2_
2497
+ xg_B = xg_S2_
2498
+ elif solve_species == "OCH":
2499
+ xg_A = xg_CO_
2500
+ xg_B = xg_H2_
2501
+ xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_ = mg_SCHOFe(xg_O2_, xg_A, xg_B)
2502
+ mba, mbb, mbc, wt_g_O, wt_g_C, wt_g_H, wt_g_S = f_SCHOFe(xg_O2_,xg_A,xg_B)
2503
+ wt_g = (wt_g_O+wt_g_H+wt_g_C+wt_g_S)/4.
2504
+ wt_H_ = 2.*M_H*((wt_g*(((xg_H2O_+xg_H2_+2.*xg_CH4_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (wm_H2S_/M_H2S) - (2.*wm_CH4_/M_CH4))) + (wm_H2O_/M_H2O) + (wm_H2_/M_H2) + (wm_H2S_/M_H2S) + (2.*wm_CH4_/M_CH4))
2505
+ wt_O_ = M_O*((wt_g*(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_)/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO))) + (wm_H2O_/M_H2O) + ((2.0*wm_CO2_)/M_CO2) + (3.0*wm_SO3_/M_SO3) + (wm_CO_/M_CO) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
2506
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))) + (wm_CO2_/M_CO2) + (wm_CH4_/M_CH4) + (wm_CO_/M_CO))
2507
+ wt_S_ = M_S*((wt_g*(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))) + (wm_S_/M_S) + (wm_SO3_/M_SO3) + (wm_H2S_/M_H2S))
2508
+ return wt_g, wt_O_, wt_C_, wt_H_, wt_S_
2509
+
2510
+ def f_SCHOFe(xg_O2_,xg_A,xg_B):
2511
+ xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_ = mg_SCHOFe(xg_O2_, xg_A, xg_B)
2512
+ wt_g_C = ((wt_C/M_C) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))
2513
+ wt_g_O = ((wt_O/M_O) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_ )/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO))
2514
+ wt_g_H = ((wt_H/(2.0*M_H)) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))
2515
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))
2516
+ if solve_species == "OCS":
2517
+ mba = (wt_g_C - wt_g_O) # mbCO
2518
+ mbb = (wt_g_C - wt_g_H) # mbCH
2519
+ mbc = (wt_g_C - wt_g_S) # mbCS
2520
+ elif solve_species == "OHS":
2521
+ mba = (wt_g_H - wt_g_O) # mbHO
2522
+ mbb = (wt_g_H - wt_g_C) # mbHC
2523
+ mbc = (wt_g_H - wt_g_S) # mbHS
2524
+ elif solve_species == "OCH":
2525
+ mba = (wt_g_C - wt_g_O) # mbCO
2526
+ mbb = (wt_g_C - wt_g_H) # mbCH
2527
+ mbc = (wt_g_C - wt_g_S) # mbCS
2528
+ return mba, mbb, mbc, wt_g_O, wt_g_C, wt_g_H, wt_g_S
2529
+
2530
+ def df_SCHOFe(xg_O2_,xg_A,xg_B,constants):
2531
+ if solve_species == "OCS": # A = CO, B = S2 and a = C-O, b = C-H, c = C-S
2532
+ dmba_O = de.SCHOFe2_OCS_CO_O2(xg_O2_,xg_A,xg_B,constants) # dmbCO_O
2533
+ dmba_A = de.SCHOFe2_OCS_CO_CO(xg_O2_,xg_A,xg_B,constants) # dmbCO_CO
2534
+ dmba_B = de.SCHOFe2_OCS_CO_S2(xg_O2_,xg_A,xg_B,constants) # dmbCO_S
2535
+ dmbb_O = de.SCHOFe2_OCS_CH_O2(xg_O2_,xg_A,xg_B,constants) # dmbCH_O
2536
+ dmbb_A = de.SCHOFe2_OCS_CH_CO(xg_O2_,xg_A,xg_B,constants) # dmbCH_CO
2537
+ dmbb_B = de.SCHOFe2_OCS_CH_S2(xg_O2_,xg_A,xg_B,constants) # dmbCH_S
2538
+ dmbc_O = de.SCHOFe2_OCS_CS_O2(xg_O2_,xg_A,xg_B,constants) # dmbCS_O
2539
+ dmbc_A = de.SCHOFe2_OCS_CS_CO(xg_O2_,xg_A,xg_B,constants) # dmbCS_CO
2540
+ dmbc_B = de.SCHOFe2_OCS_CS_S2(xg_O2_,xg_A,xg_B,constants) # dmbCS_S
2541
+ elif solve_species == "OHS": # A = H2, B = S2 and a = H-O, b = H-C, c = H-S TO DO
2542
+ dmba_O = de.SCHOFe2_OHS_HO_O2(xg_O2_,xg_A,xg_B,constants) # dmbHO_O
2543
+ dmba_A = de.SCHOFe2_OHS_HO_H2(xg_O2_,xg_A,xg_B,constants) # dmbHO_H
2544
+ dmba_B = de.SCHOFe2_OHS_HO_S2(xg_O2_,xg_A,xg_B,constants) # dmbHO_S
2545
+ dmbb_O = de.SCHOFe2_OHS_HC_O2(xg_O2_,xg_A,xg_B,constants) # dmbHC_O
2546
+ dmbb_A = de.SCHOFe2_OHS_HC_H2(xg_O2_,xg_A,xg_B,constants) # dmbHC_H
2547
+ dmbb_B = de.SCHOFe2_OHS_HC_S2(xg_O2_,xg_A,xg_B,constants) # dmbHC_S
2548
+ dmbc_O = de.SCHOFe2_OHS_HS_O2(xg_O2_,xg_A,xg_B,constants) # dmbHS_O
2549
+ dmbc_A = de.SCHOFe2_OHS_HS_H2(xg_O2_,xg_A,xg_B,constants) # dmbHS_H
2550
+ dmbc_B = de.SCHOFe2_OHS_HS_S2(xg_O2_,xg_A,xg_B,constants) # dmbHS_S
2551
+ elif solve_species == "OCH": # A = CO, B = H2 and a = C-O, b = C-H, c = C-S TO DO
2552
+ dmba_O = de.SCHOFe2_OCH_CO_O2(xg_O2_,xg_A,xg_B,constants) # dmbCO_O
2553
+ dmba_A = de.SCHOFe2_OCH_CO_CO(xg_O2_,xg_A,xg_B,constants) # dmbCO_CO
2554
+ dmba_B = de.SCHOFe2_OCH_CO_H2(xg_O2_,xg_A,xg_B,constants) # dmbCO_H
2555
+ dmbb_O = de.SCHOFe2_OCH_CH_O2(xg_O2_,xg_A,xg_B,constants) # dmbCH_O
2556
+ dmbb_A = de.SCHOFe2_OCH_CH_CO(xg_O2_,xg_A,xg_B,constants) # dmbCH_CO
2557
+ dmbb_B = de.SCHOFe2_OCH_CH_H2(xg_O2_,xg_A,xg_B,constants) # dmbCH_H
2558
+ dmbc_O = de.SCHOFe2_OCH_CS_O2(xg_O2_,xg_A,xg_B,constants) # dmbCS_O
2559
+ dmbc_A = de.SCHOFe2_OCH_CS_CO(xg_O2_,xg_A,xg_B,constants) # dmbCS_CO
2560
+ dmbc_B = de.SCHOFe2_OCH_CS_H2(xg_O2_,xg_A,xg_B,constants) # dmbCS_H
2561
+ return dmba_O, dmba_A, dmba_B, dmbb_O, dmbb_A, dmbb_B, dmbc_O, dmbc_A, dmbc_B
2562
+
2563
+ if solve_species == "OCS":
2564
+ xg_O2_, xg_CO_, xg_S2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe,df_SCHOFe,nr_step,nr_tol)
2565
+ results1 = xg_O2_, xg_CO_, xg_S2_
2566
+ results2 = mg_SCHOFe(xg_O2_,xg_CO_,xg_S2_)
2567
+ results3 = f_SCHOFe(xg_O2_,xg_CO_,xg_S2_)
2568
+ xg_H2_ = results2[2]
2569
+ elif solve_species == "OHS":
2570
+ xg_O2_, xg_H2_, xg_S2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe,df_SCHOFe,nr_step,nr_tol)
2571
+ results1 = xg_O2_, xg_H2_, xg_S2_
2572
+ results2 = mg_SCHOFe(xg_O2_,xg_H2_,xg_S2_)
2573
+ results3 = f_SCHOFe(xg_O2_,xg_H2_,xg_S2_)
2574
+ xg_CO_ = results2[0]
2575
+ elif solve_species == "OCH":
2576
+ xg_O2_, xg_CO_, xg_H2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe,df_SCHOFe,nr_step,nr_tol)
2577
+ results1 = xg_O2_, xg_CO_, xg_H2_
2578
+ results2 = mg_SCHOFe(xg_O2_,xg_CO_,xg_H2_)
2579
+ results3 = f_SCHOFe(xg_O2_,xg_CO_,xg_H2_)
2580
+ xg_S2_ = results2[3]
2581
+ results4 = mb_SCHOFe(xg_O2_,xg_CO_,xg_H2_,xg_S2_)
2582
+ return results1, results2, results3, results4
2583
+
2584
+ # all gas species - oxidised and reduced melt species - H2S - H2O is linear with xmH2O #
2585
+ def eq_SCHOFe_3(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species):
2586
+ P = PT["P"]
2587
+ wt_O = bulk_wf['O']
2588
+ wt_S = bulk_wf['S']
2589
+ wt_H = bulk_wf['H']
2590
+ wt_C = bulk_wf['C']
2591
+ wt_Fe = bulk_wf['Fe']
2592
+ guessx = guesses["guessx"]
2593
+ guessy = guesses["guessy"]
2594
+ guessz = guesses["guessz"]
2595
+
2596
+ # equilibrium constants
2597
+ K1_ = mdv.KHOg(PT,models)
2598
+ K2_ = mdv.KCOg(PT,models)
2599
+ K3_ = mdv.KCOHg(PT,models)
2600
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
2601
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
2602
+ K6_ = mdv.KOSg(PT,models)
2603
+ K7_ = mdv.KHOSg(PT,models)
2604
+ K8_ = mdv.C_S(PT,melt_wf,species,models)/1000000.0
2605
+ K9_ = mdv.C_SO4(PT,melt_wf,species,models)/1000000.0
2606
+ K10_ = mdv.KOCSg(PT,models)
2607
+ K11_ = mdv.C_CO(PT,melt_wf,species,models)/1000000.0
2608
+ K12_ = mdv.C_CH4(PT,melt_wf,species,models)/1000000.0
2609
+ K13_ = mdv.C_H2(PT,melt_wf,species,models)/1000000.0
2610
+ K14_ = mdv.C_H2S(PT,melt_wf,species,models)/1000000.0
2611
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
2612
+
2613
+ # fugacity coefficients
2614
+ y_CO_ = mdv.y_CO(PT,species,models)
2615
+ y_O2_ = mdv.y_O2(PT,species,models)
2616
+ y_CO2_ = mdv.y_CO2(PT,species,models)
2617
+ y_CH4_ = mdv.y_CH4(PT,species,models)
2618
+ y_H2O_ = mdv.y_H2O(PT,species,models)
2619
+ y_H2_ = mdv.y_H2(PT,species,models)
2620
+ y_S2_ = mdv.y_S2(PT,species,models)
2621
+ y_SO2_ = mdv.y_SO2(PT,species,models)
2622
+ y_H2S_ = mdv.y_H2S(PT,species,models)
2623
+ y_OCS_ = mdv.y_OCS(PT,species,models)
2624
+
2625
+ # molecular masses
2626
+ M_H = species.loc['H','M']
2627
+ M_C = species.loc['C','M']
2628
+ M_O = species.loc['O','M']
2629
+ M_S = species.loc['S','M']
2630
+ M_Fe = species.loc['Fe','M']
2631
+ M_O2 = species.loc['O2','M']
2632
+ M_CO = species.loc['CO','M']
2633
+ M_OH = species.loc['OH','M']
2634
+ M_H2O = species.loc['H2O','M']
2635
+ M_H2 = species.loc['H2','M']
2636
+ M_CO2 = species.loc['CO2','M']
2637
+ M_CH4 = species.loc['CH4','M']
2638
+ M_S2 = species.loc['S2','M']
2639
+ M_SO2 = species.loc['SO2','M']
2640
+ M_SO3 = species.loc['SO3','M']
2641
+ M_H2S = species.loc['H2S','M']
2642
+ M_FeO = species.loc['FeO','M']
2643
+ M_FeO15 = species.loc['FeO1.5','M']
2644
+ M_OCS = species.loc['OCS','M']
2645
+ M_m_ = mg.M_m_SO(melt_wf,species)
2646
+ M_m_ox = mg.M_m_ox(melt_wf,species,models)
2647
+
2648
+ constants = [P, wt_O, wt_C, wt_H, wt_S, wt_Fe, K1_, K2_, K3_, K4_, K5_, K6_, K7_, K8_, K9_, K10_, K11_, K12_, K13_, K14_, KD1_, KD2, y, y_H2_, y_O2_, y_H2O_, y_CO_, y_CO2_, y_CH4_, y_SO2_, y_S2_, y_H2S_, y_OCS_, M_C, M_H, M_O, M_S, M_Fe, M_O2, M_CO, M_CO2, M_OH, M_H2, M_H2O, M_CH4, M_S2, M_SO2, M_SO3, M_H2S, M_OCS, M_FeO, M_FeO15, M_m_, M_m_ox]
2649
+
2650
+ def mg_SCHOFe(xg_O2_,xg_A,xg_B):
2651
+ xg_O2__ = xg_O2_
2652
+ if solve_species == "OCS": # A = CO, B = S2
2653
+ xg_CO_ = xg_A # mole fractions in the gas
2654
+ xg_S2_ = xg_B
2655
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2656
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2657
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2658
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2659
+ b = 1.0 + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)) + ((K7_*(y_S2_*xg_S2_)**0.5*y_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5))
2660
+ c = xg_CO2_ + xg_CO_ + xg_O2_ + xg_S2_ + xg_SO2_ + xg_OCS_ - 1.0
2661
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
2662
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
2663
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2664
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2665
+ #elif solve_species == "OHS": # A = H2, B = S2
2666
+ #xg_H2_ = xg_A # mole fractions in the gas
2667
+ #xg_S2_ = xg_B
2668
+ #xg_H2O_ = (xg_H2_*K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)/y_H2O_
2669
+ #xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2670
+ #xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2671
+ #xg_CO2_ = (1.0 - xg_S2_ - xg_O2_ - xg_H2_ - xg_H2O_ - xg_H2S_ - xg_SO2_)/(1.0 + (y_CO2_/(K2_*y_CO_*(y_O2_*xg_O2_*P)**0.5)) + ((y_CO2_*y_SO2_*xg_SO2_)/(K2_**3.0*K10_*y_OCS_*(y_O2_*xg_O2_)**1.5*P**0.5)) + ((y_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)))
2672
+ #xg_CO_ = (y_CO2_*xg_CO2_)/(K2_*y_CO_*(y_O2_*xg_O2_*P)**0.5)
2673
+ #xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2674
+ #xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2675
+ #elif solve_species == "OCH": # A = CO, B = H2
2676
+ #xg_CO_ = xg_A # mole fractions in the gas
2677
+ #xg_H2_ = xg_B
2678
+ #xg_H2O_ = (xg_H2_*K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)/y_H2O_
2679
+ #xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2680
+ #xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2681
+ #a = 1.0
2682
+ #b = ((K6_*(y_S2_*P)**0.5*y_O2_*xg_O2_)/y_SO2_) + (((K7_*y_H2O_*xg_H2O_)/y_H2S_)*(y_S2_/(y_O2_*xg_O2_))**0.5) + (((y_CO_*xg_CO_)**3.0*P**1.5*K6_*y_S2_**0.5*y_O2_*xg_O2_)/(K10_*y_OCS_*(y_CO2_*xg_CO2_)**2.0))
2683
+ #c = xg_O2_ + xg_CO_ + xg_CO2_ + xg_H2_ + xg_H2O_ + xg_CH4_ - 1.0
2684
+ #xg_S2_ = ((-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a))**2.0
2685
+ #xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2686
+ #xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2687
+ #xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2688
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_H2S_*M_H2S + xg_OCS_*M_OCS
2689
+ # melt composition
2690
+ xm_H2O_ = K4_*y_H2O_*xg_H2O_*P
2691
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
2692
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
2693
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
2694
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
2695
+ wm_CO_ = K11_*y_CO_*xg_CO_*P
2696
+ wm_CH4_ = K12_*y_CH4_*xg_CH4_*P
2697
+ wm_H2_ = K13_*y_H2_*xg_H2_*P
2698
+ wm_H2S_ = K14_*y_H2S_*xg_H2S_*P
2699
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
2700
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
2701
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3) + ((M_S*wm_H2S_)/M_H2S)
2702
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
2703
+ Fe3T = Fe32/(1.0+Fe32)
2704
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
2705
+ S6T = S62/(1.0+S62)
2706
+ Xm_t_ox = ""
2707
+ return xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_
2708
+
2709
+ def mb_SCHOFe(xg_O2_,xg_CO_,xg_H2_,xg_S2_): # A = CO, B = H2, C = S2
2710
+ if solve_species == "OCS":
2711
+ xg_A = xg_CO_
2712
+ xg_B = xg_S2_
2713
+ #elif solve_species == "OHS":
2714
+ #xg_A = xg_H2_
2715
+ #xg_B = xg_S2_
2716
+ #elif solve_species == "OCH":
2717
+ #xg_A = xg_CO_
2718
+ #ßxg_B = xg_H2_
2719
+ xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_ = mg_SCHOFe(xg_O2_, xg_A, xg_B)
2720
+ mba, mbb, mbc, wt_g_O, wt_g_C, wt_g_H, wt_g_S = f_SCHOFe(xg_O2_,xg_A,xg_B)
2721
+ wt_g = (wt_g_O+wt_g_H+wt_g_C+wt_g_S)/4.
2722
+ wt_H_ = 2.*M_H*((wt_g*(((xg_H2O_+xg_H2_+2.*xg_CH4_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (wm_H2S_/M_H2S) - (2.*wm_CH4_/M_CH4))) + (wm_H2O_/M_H2O) + (wm_H2_/M_H2) + (wm_H2S_/M_H2S) + (2.*wm_CH4_/M_CH4))
2723
+ wt_O_ = M_O*((wt_g*(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_)/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO))) + (wm_H2O_/M_H2O) + ((2.0*wm_CO2_)/M_CO2) + (3.0*wm_SO3_/M_SO3) + (wm_CO_/M_CO) + (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))
2724
+ wt_C_ = M_C*((wt_g*(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))) + (wm_CO2_/M_CO2) + (wm_CH4_/M_CH4) + (wm_CO_/M_CO))
2725
+ wt_S_ = M_S*((wt_g*(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))) + (wm_S_/M_S) + (wm_SO3_/M_SO3) + (wm_H2S_/M_H2S))
2726
+ return wt_g, wt_O_, wt_C_, wt_H_, wt_S_
2727
+
2728
+ def f_SCHOFe(xg_O2_,xg_A,xg_B):
2729
+ xg_O2__, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_ = mg_SCHOFe(xg_O2_, xg_A, xg_B)
2730
+ wt_g_C = ((wt_C/M_C) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))
2731
+ wt_g_O = ((wt_O/M_O) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_ )/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO))
2732
+ wt_g_H = ((wt_H/(2.0*M_H)) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))
2733
+ wt_g_S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))
2734
+ if solve_species == "OCS":
2735
+ mba = (wt_g_C - wt_g_O) # mbCO
2736
+ mbb = (wt_g_C - wt_g_H) # mbCH
2737
+ mbc = (wt_g_C - wt_g_S) # mbCS
2738
+ #elif solve_species == "OHS":
2739
+ #mba = (wt_g_H - wt_g_O) # mbHO
2740
+ #mbb = (wt_g_H - wt_g_C) # mbHC
2741
+ #mbc = (wt_g_H - wt_g_S) # mbHS
2742
+ #elif solve_species == "OCH":
2743
+ #mba = (wt_g_C - wt_g_O) # mbCO
2744
+ #mbb = (wt_g_C - wt_g_H) # mbCH
2745
+ #mbc = (wt_g_C - wt_g_S) # mbCS
2746
+ return mba, mbb, mbc, wt_g_O, wt_g_C, wt_g_H, wt_g_S
2747
+
2748
+ def df_SCHOFe(xg_O2_,xg_A,xg_B,constants):
2749
+ if solve_species == "OCS": # A = CO, B = S2 and a = C-O, b = C-H, c = C-S
2750
+ dmba_O = de.SCHOFe3_OCS_CO_O2(xg_O2_,xg_A,xg_B,constants) # dmbCO_O
2751
+ dmba_A = de.SCHOFe3_OCS_CO_CO(xg_O2_,xg_A,xg_B,constants) # dmbCO_CO
2752
+ dmba_B = de.SCHOFe3_OCS_CO_S2(xg_O2_,xg_A,xg_B,constants) # dmbCO_S
2753
+ dmbb_O = de.SCHOFe3_OCS_CH_O2(xg_O2_,xg_A,xg_B,constants) # dmbCH_O
2754
+ dmbb_A = de.SCHOFe3_OCS_CH_CO(xg_O2_,xg_A,xg_B,constants) # dmbCH_CO
2755
+ dmbb_B = de.SCHOFe3_OCS_CH_S2(xg_O2_,xg_A,xg_B,constants) # dmbCH_S
2756
+ dmbc_O = de.SCHOFe3_OCS_CS_O2(xg_O2_,xg_A,xg_B,constants) # dmbCS_O
2757
+ dmbc_A = de.SCHOFe3_OCS_CS_CO(xg_O2_,xg_A,xg_B,constants) # dmbCS_CO
2758
+ dmbc_B = de.SCHOFe3_OCS_CS_S2(xg_O2_,xg_A,xg_B,constants) # dmbCS_S
2759
+ #elif solve_species == "OHS": # A = H2, B = S2 and a = H-O, b = H-C, c = H-S TO DO
2760
+ #dmba_O = de.SCHOFe3_OHS_HO_O2(xg_O2_,xg_A,xg_B,constants) # dmbHO_O
2761
+ #dmba_A = de.SCHOFe3_OHS_HO_H2(xg_O2_,xg_A,xg_B,constants) # dmbHO_H
2762
+ #dmba_B = de.SCHOFe3_OHS_HO_S2(xg_O2_,xg_A,xg_B,constants) # dmbHO_S
2763
+ #dmbb_O = de.SCHOFe3_OHS_HC_O2(xg_O2_,xg_A,xg_B,constants) # dmbHC_O
2764
+ #dmbb_A = de.SCHOFe3_OHS_HC_H2(xg_O2_,xg_A,xg_B,constants) # dmbHC_H
2765
+ #dmbb_B = de.SCHOFe3_OHS_HC_S2(xg_O2_,xg_A,xg_B,constants) # dmbHC_S
2766
+ #dmbc_O = de.SCHOFe3_OHS_HS_O2(xg_O2_,xg_A,xg_B,constants) # dmbHS_O
2767
+ #dmbc_A = de.SCHOFe3_OHS_HS_H2(xg_O2_,xg_A,xg_B,constants) # dmbHS_H
2768
+ #dmbc_B = de.SCHOFe3_OHS_HS_S2(xg_O2_,xg_A,xg_B,constants) # dmbHS_S
2769
+ #elif solve_species == "OCH": # A = CO, B = H2 and a = C-O, b = C-H, c = C-S TO DO
2770
+ #dmba_O = de.SCHOFe3_OCH_CO_O2(xg_O2_,xg_A,xg_B,constants) # dmbCO_O
2771
+ #dmba_A = de.SCHOFe3_OCH_CO_CO(xg_O2_,xg_A,xg_B,constants) # dmbCO_CO
2772
+ #dmba_B = de.SCHOFe3_OCH_CO_H2(xg_O2_,xg_A,xg_B,constants) # dmbCO_H
2773
+ #dmbb_O = de.SCHOFe3_OCH_CH_O2(xg_O2_,xg_A,xg_B,constants) # dmbCH_O
2774
+ #dmbb_A = de.SCHOFe3_OCH_CH_CO(xg_O2_,xg_A,xg_B,constants) # dmbCH_CO
2775
+ #dmbb_B = de.SCHOFe3_OCH_CH_H2(xg_O2_,xg_A,xg_B,constants) # dmbCH_H
2776
+ #dmbc_O = de.SCHOFe3_OCH_CS_O2(xg_O2_,xg_A,xg_B,constants) # dmbCS_O
2777
+ #dmbc_A = de.SCHOFe3_OCH_CS_CO(xg_O2_,xg_A,xg_B,constants) # dmbCS_CO
2778
+ #dmbc_B = de.SCHOFe3_OCH_CS_H2(xg_O2_,xg_A,xg_B,constants) # dmbCS_H
2779
+ return dmba_O, dmba_A, dmba_B, dmbb_O, dmbb_A, dmbb_B, dmbc_O, dmbc_A, dmbc_B
2780
+
2781
+ if solve_species == "OCS":
2782
+ xg_O2_, xg_CO_, xg_S2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe,df_SCHOFe,nr_step,nr_tol)
2783
+ results1 = xg_O2_, xg_CO_, xg_S2_
2784
+ results2 = mg_SCHOFe(xg_O2_,xg_CO_,xg_S2_)
2785
+ results3 = f_SCHOFe(xg_O2_,xg_CO_,xg_S2_)
2786
+ xg_H2_ = results2[2]
2787
+ #elif solve_species == "OHS":
2788
+ #xg_O2_, xg_H2_, xg_S2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe,df_SCHOFe,nr_step,nr_tol)
2789
+ #results1 = xg_O2_, xg_H2_, xg_S2_
2790
+ #results2 = mg_SCHOFe(xg_O2_,xg_H2_,xg_S2_)
2791
+ #results3 = f_SCHOFe(xg_O2_,xg_H2_,xg_S2_)
2792
+ #xg_CO_ = results2[0]
2793
+ #elif solve_species == "OCH":
2794
+ #xg_O2_, xg_CO_, xg_H2_ = jac_newton3(guessx,guessy,guessz,constants,f_SCHOFe,df_SCHOFe,nr_step,nr_tol)
2795
+ #results1 = xg_O2_, xg_CO_, xg_H2_
2796
+ #results2 = mg_SCHOFe(xg_O2_,xg_CO_,xg_H2_)
2797
+ #results3 = f_SCHOFe(xg_O2_,xg_CO_,xg_H2_)
2798
+ #xg_S2_ = results2[3]
2799
+ results4 = mb_SCHOFe(xg_O2_,xg_CO_,xg_H2_,xg_S2_)
2800
+ return results1, results2, results3, results4
2801
+
2802
+
2803
+ def eq_SCHOFe_test(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species):
2804
+
2805
+ P = float(PT["P"])
2806
+ wt_O = float(bulk_wf['O'])
2807
+ wt_S = float(bulk_wf['S'])
2808
+ wt_H = float(bulk_wf['H'])
2809
+ wt_C = float(bulk_wf['C'])
2810
+ wt_Fe = float(bulk_wf['Fe'])
2811
+ guessx = guesses["guessx"]
2812
+ guessy = guesses["guessy"]
2813
+ guessz = guesses["guessz"]
2814
+
2815
+ # equilibrium constants
2816
+ K1_ = float(mdv.KHOg(PT,models))
2817
+ K2_ = float(mdv.KCOg(PT,models))
2818
+ K3_ = float(mdv.KCOHg(PT,models))
2819
+ K4_ = float(mdv.C_H2O(PT,melt_wf,species,models))
2820
+ K5_ = float(mdv.C_CO3(PT,melt_wf,species,models))
2821
+ K6_ = float(mdv.KOSg(PT,models))
2822
+ K7_ = float(mdv.KHOSg(PT,models))
2823
+ K8_ = float(mdv.C_S(PT,melt_wf,species,models)/1000000.0)
2824
+ K9_ = float(mdv.C_SO4(PT,melt_wf,species,models)/1000000.0)
2825
+ K10_ = float(mdv.KOCSg(PT,models))
2826
+ K11_ = float(mdv.C_CO(PT,melt_wf,species,models)/1000000.0)
2827
+ K12_ = float(mdv.C_CH4(PT,melt_wf,species,models)/1000000.0)
2828
+ K13_ = float(mdv.C_H2(PT,melt_wf,species,models)/1000000.0)
2829
+ K14_ = float(mdv.C_H2S(PT,melt_wf,species,models)/1000000.0)
2830
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
2831
+ KD1_=float(KD1_)
2832
+ KD2=float(KD2)
2833
+ y=float(y)
2834
+
2835
+ # fugacity coefficients
2836
+ y_CO_ = float(mdv.y_CO(PT,species,models))
2837
+ y_O2_ = float(mdv.y_O2(PT,species,models))
2838
+ y_CO2_ = float(mdv.y_CO2(PT,species,models))
2839
+ y_CH4_ = float(mdv.y_CH4(PT,species,models))
2840
+ y_H2O_ = float(mdv.y_H2O(PT,species,models))
2841
+ y_H2_ = float(mdv.y_H2(PT,species,models))
2842
+ y_S2_ = float(mdv.y_S2(PT,species,models))
2843
+ y_SO2_ = float(mdv.y_SO2(PT,species,models))
2844
+ y_H2S_ = float(mdv.y_H2S(PT,species,models))
2845
+ y_OCS_ = float(mdv.y_OCS(PT,species,models))
2846
+
2847
+ # molecular masses
2848
+ M_H = float(species.loc['H','M'])
2849
+ M_C = float(species.loc['C','M'])
2850
+ M_O = float(species.loc['O','M'])
2851
+ M_S = float(species.loc['S','M'])
2852
+ M_Fe = float(species.loc['Fe','M'])
2853
+ M_O2 = float(species.loc['O2','M'])
2854
+ M_CO = float(species.loc['CO','M'])
2855
+ M_OH = float(species.loc['OH','M'])
2856
+ M_H2O = float(species.loc['H2O','M'])
2857
+ M_H2 = float(species.loc['H2','M'])
2858
+ M_CO2 = float(species.loc['CO2','M'])
2859
+ M_CH4 = float(species.loc['CH4','M'])
2860
+ M_S2 = float(species.loc['S2','M'])
2861
+ M_SO2 = float(species.loc['SO2','M'])
2862
+ M_SO3 = float(species.loc['SO3','M'])
2863
+ M_H2S = float(species.loc['H2S','M'])
2864
+ M_FeO = float(species.loc['FeO','M'])
2865
+ M_FeO15 = float(species.loc['FeO1.5','M'])
2866
+ M_OCS = float(species.loc['OCS','M'])
2867
+ M_m_ = float(mg.M_m_SO(melt_wf,species))
2868
+ M_m_ox = float(mg.M_m_ox(melt_wf,species,models))
2869
+
2870
+ def system(guesses):
2871
+ xg_O2_ = guesses[0]
2872
+ xg_CO_ = guesses[1]
2873
+ xg_S2_ = guesses[2]
2874
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
2875
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
2876
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
2877
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2878
+ b = 1.0 + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)) + ((K7_*(y_S2_*xg_S2_)**0.5*y_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5))
2879
+ c = xg_CO2_ + xg_CO_ + xg_O2_ + xg_S2_ + xg_SO2_ + xg_OCS_ - 1.0
2880
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
2881
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
2882
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
2883
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
2884
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_H2S_*M_H2S + xg_OCS_*M_OCS
2885
+ # melt composition
2886
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
2887
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
2888
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
2889
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
2890
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
2891
+ wm_CO_ = K11_*y_CO_*xg_CO_*P
2892
+ wm_CH4_ = K12_*y_CH4_*xg_CH4_*P
2893
+ wm_H2_ = K13_*y_H2_*xg_H2_*P
2894
+ wm_H2S_ = K14_*y_H2S_*xg_H2S_*P
2895
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
2896
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
2897
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3) + ((M_S*wm_H2S_)/M_H2S)
2898
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
2899
+ Fe3T = Fe32/(1.0+Fe32)
2900
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
2901
+ S6T = S62/(1.0+S62)
2902
+ return xg_O2_,xg_CO_,xg_S2_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T
2903
+
2904
+ def solvers(guesses):
2905
+ xg_O2_,xg_CO_,xg_S2_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T = system(guesses)
2906
+ C = ((wt_C/M_C) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))
2907
+ O = ((wt_O/M_O) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_ )/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO))
2908
+ H = ((wt_H/(2.0*M_H)) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))
2909
+ S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))
2910
+ return C-O,C-H,C-S,C
2911
+
2912
+
2913
+ def solve_system(guesses):
2914
+ CO,CH,CS,C = solvers(guesses)
2915
+ return [float(CO),float(CH),float(CS)]
2916
+
2917
+ newguess = optimize.fsolve(solve_system, [float(guessx),float(guessy),float(guessz)])
2918
+ xg_O2_,xg_CO_,xg_S2_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T = system(newguess)
2919
+ CO,CH,CS,CX,wt_g = solvers(newguess)
2920
+
2921
+ A = xg_O2_, xg_CO_, xg_S2_
2922
+ B = xg_O2_, xg_H2_, xg_S2_, xg_H2O_, xg_CO_, xg_CO2_, xg_SO2_, xg_CH4_, xg_H2S_, xg_OCS_, Xg_t, xm_H2O_, xm_CO2_, wm_S_, wm_SO3_, Xm_t, Xm_t_ox, Fe32, Fe3T, S62, S6T, wm_H2O_, wm_CO2_, wm_ST_, wm_H2S_, wm_H2_, wm_CH4_, wm_CO_
2923
+ C = "", "", "", "", "", "", ""
2924
+ D = wt_g, "","","",""
2925
+ return A, B, C, D
2926
+
2927
+ ###############
2928
+ ### EDITING ###
2929
+ ###############
2930
+
2931
+ def eq_SCHOXFe(PT,bulk_wf,melt_wf,species,models,nr_step,nr_tol,guesses,solve_species):
2932
+ species_X = models.loc["species X","option"]
2933
+
2934
+ P = float(PT["P"])
2935
+ wt_O = float(bulk_wf['O'])
2936
+ wt_S = float(bulk_wf['S'])
2937
+ wt_H = float(bulk_wf['H'])
2938
+ wt_C = float(bulk_wf['C'])
2939
+ wt_X = float(bulk_wf['X'])
2940
+ wt_Fe = float(bulk_wf['Fe'])
2941
+ guessx = guesses["guessx"]
2942
+ guessy = guesses["guessy"]
2943
+ guessz = guesses["guessz"]
2944
+ guessz = guesses["guessz"]
2945
+
2946
+ # equilibrium constants
2947
+ K1_ = float(mdv.KHOg(PT,models))
2948
+ K2_ = float(mdv.KCOg(PT,models))
2949
+ K3_ = float(mdv.KCOHg(PT,models))
2950
+ K4_ = float(mdv.C_H2O(rT,melt_wf,species,models))
2951
+ K5_ = float(mdv.C_CO3(PT,melt_wf,species,models))
2952
+ K6_ = float(mdv.KOSg(PT,models))
2953
+ K7_ = float(mdv.KHOSg(PT,models))
2954
+ K8_ = float(mdv.C_S(PT,melt_wf,species,models)/1000000.0)
2955
+ K9_ = float(mdv.C_SO4(PT,melt_wf,species,models)/1000000.0)
2956
+ K10_ = float(mdv.KOCSg(PT,models))
2957
+ K11_ = float(mdv.C_CO(PT,melt_wf,species,models)/1000000.0)
2958
+ K12_ = float(mdv.C_CH4(PT,melt_wf,species,models)/1000000.0)
2959
+ K13_ = float(mdv.C_H2(PT,melt_wf,species,models)/1000000.0)
2960
+ K14_ = float(mdv.C_H2S(PT,melt_wf,species,models)/1000000.0)
2961
+ K15_ = float(mdv.C_X(PT,melt_wf,species,models)/1000000.0)
2962
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
2963
+ KD1_=float(KD1_)
2964
+ KD2=float(KD2)
2965
+ y=float(y)
2966
+
2967
+ # fugacity coefficients
2968
+ y_CO_ = float(mdv.y_CO(PT,species,models))
2969
+ y_O2_ = float(mdv.y_O2(PT,species,models))
2970
+ y_CO2_ = float(mdv.y_CO2(PT,species,models))
2971
+ y_CH4_ = float(mdv.y_CH4(PT,species,models))
2972
+ y_H2O_ = float(mdv.y_H2O(PT,species,models))
2973
+ y_H2_ = float(mdv.y_H2(PT,species,models))
2974
+ y_S2_ = float(mdv.y_S2(PT,species,models))
2975
+ y_SO2_ = float(mdv.y_SO2(PT,species,models))
2976
+ y_H2S_ = float(mdv.y_H2S(PT,species,models))
2977
+ y_OCS_ = float(mdv.y_OCS(PT,species,models))
2978
+ y_X_ = float(mdv.y_X(PT,species,models))
2979
+
2980
+ # molecular masses
2981
+ M_H = float(species.loc['H','M'])
2982
+ M_C = float(species.loc['C','M'])
2983
+ M_O = float(species.loc['O','M'])
2984
+ M_S = float(species.loc['S','M'])
2985
+ M_Fe = float(species.loc['Fe','M'])
2986
+ M_O2 = float(species.loc['O2','M'])
2987
+ M_CO = float(species.loc['CO','M'])
2988
+ M_OH = float(species.loc['OH','M'])
2989
+ M_H2O = float(species.loc['H2O','M'])
2990
+ M_H2 = float(species.loc['H2','M'])
2991
+ M_CO2 = float(species.loc['CO2','M'])
2992
+ M_CH4 = float(species.loc['CH4','M'])
2993
+ M_S2 = float(species.loc['S2','M'])
2994
+ M_SO2 = float(species.loc['SO2','M'])
2995
+ M_SO3 = float(species.loc['SO3','M'])
2996
+ M_H2S = float(species.loc['H2S','M'])
2997
+ M_FeO = float(species.loc['FeO','M'])
2998
+ M_FeO15 = float(species.loc['FeO1.5','M'])
2999
+ M_OCS = float(species.loc['OCS','M'])
3000
+ M_X = float(species.loc[species_X,'M'])
3001
+ M_m_ = float(mg.M_m_SO(melt_wf,species))
3002
+ M_m_ox = float(mg.M_m_ox(melt_wf,species,models))
3003
+
3004
+ def system(guesses):
3005
+ xg_O2_ = guesses[0]
3006
+ xg_CO_ = guesses[1]
3007
+ xg_S2_ = guesses[2]
3008
+ xg_X_ = guesses[3]
3009
+ xg_CO2_ = (K2_*y_CO_*xg_CO_*(y_O2_*xg_O2_*P)**0.5)/y_CO2_
3010
+ xg_SO2_ = (K6_*y_O2_*xg_O2_*(y_S2_*xg_S2_*P)**0.5)/y_SO2_
3011
+ xg_OCS_ = ((xg_CO_*y_CO_)**3.0*xg_SO2_*y_SO2_*P)/(y_OCS_*(xg_CO2_*y_CO2_)**2.0*K10_)
3012
+ a = (y_CO2_*xg_CO2_*y_H2O_**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
3013
+ b = 1.0 + (y_H2O_/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)) + ((K7_*(y_S2_*xg_S2_)**0.5*y_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5))
3014
+ c = xg_CO2_ + xg_CO_ + xg_O2_ + xg_S2_ + xg_SO2_ + xg_OCS_ - 1.0
3015
+ xg_H2O_ = (-b + (b**2.0-(4.0*a*c))**0.5)/(2.0*a)
3016
+ xg_H2_ = (y_H2O_*xg_H2O_)/(K1_*y_H2_*(y_O2_*xg_O2_*P)**0.5)
3017
+ xg_CH4_ = (y_CO2_*xg_CO2_*(y_H2O_*xg_H2O_)**2.0)/(K3_*y_CH4_*(y_O2_*xg_O2_)**2.0)
3018
+ xg_H2S_ = (K7_*(y_S2_*xg_S2_)**0.5*y_H2O_*xg_H2O_)/(y_H2S_*(y_O2_*xg_O2_)**0.5)
3019
+ Xg_t = xg_CO2_*M_CO2 + xg_CO_*M_CO + xg_O2_*M_O2 + xg_H2O_*M_H2O + xg_H2_*M_H2 + xg_CH4_*M_CH4 + xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_H2S_*M_H2S + xg_OCS_*M_OCS + xg_X_*M_X
3020
+ # melt composition
3021
+ xm_H2O_ = (K4_*y_H2O_*xg_H2O_*P)**0.5
3022
+ xm_CO2_ = K5_*y_CO2_*xg_CO2_*P
3023
+ Xm_t = xm_CO2_*M_CO2 + xm_H2O_*M_H2O + (1.0-xm_CO2_-xm_H2O_)*M_m_
3024
+ wm_H2O_ = (xm_H2O_*M_H2O)/Xm_t
3025
+ wm_CO2_ = (xm_CO2_*M_CO2)/Xm_t
3026
+ wm_CO_ = K11_*y_CO_*xg_CO_*P
3027
+ wm_CH4_ = K12_*y_CH4_*xg_CH4_*P
3028
+ wm_H2_ = K13_*y_H2_*xg_H2_*P
3029
+ wm_H2S_ = K14_*y_H2S_*xg_H2S_*P
3030
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
3031
+ wm_SO3_ = ((K9_*(y_S2_*xg_S2_)**0.5*(y_O2_*xg_O2_)**1.5*P**2.0)/M_S)*M_SO3
3032
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3) + ((M_S*wm_H2S_)/M_H2S)
3033
+ wm_X_ = K15_*y_X_*xg_X_*P
3034
+ Fe32 = ((KD1_*(y_O2_*xg_O2_*P)**0.25)+(2.0*y*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y))))/(1.0 + (1.0 - 2.0*y)*KD2*(KD1_**(2.0*y))*((y_O2_*xg_O2_*P)**(0.5*y)))
3035
+ Fe3T = Fe32/(1.0+Fe32)
3036
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
3037
+ S6T = S62/(1.0+S62)
3038
+ return xg_O2_,xg_CO_,xg_S2_,xg_X_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,wm_X_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T
3039
+
3040
+ def solvers(guesses):
3041
+ xg_O2_,xg_CO_,xg_S2_,xg_X_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,wm_X_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T = system(guesses)
3042
+ C = ((wt_C/M_C) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))/(((xg_CO2_+xg_CO_+xg_CH4_+xg_OCS_)/Xg_t) - (wm_CO2_/M_CO2) - (wm_CH4_/M_CH4) - (wm_CO_/M_CO))
3043
+ O = ((wt_O/M_O) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO) - (wt_Fe/M_Fe)*((1.5*Fe32+1.0)/(Fe32+1.0)))/(((2.0*xg_CO2_ + xg_CO_ + 2.0*xg_O2_ + xg_H2O_ + 2.0*xg_SO2_ + xg_OCS_ )/Xg_t) - (wm_H2O_/M_H2O) - ((2.0*wm_CO2_)/M_CO2) - (3.0*wm_SO3_/M_SO3) - (wm_CO_/M_CO))
3044
+ H = ((wt_H/(2.0*M_H)) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))/(((xg_H2O_+xg_H2_+2.0*xg_CH4_+xg_H2S_)/Xg_t) - (wm_H2O_/M_H2O) - (wm_H2_/M_H2) - (2.*wm_CH4_/M_CH4) - (wm_H2S_/M_H2S))
3045
+ S = ((wt_S/M_S) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))/(((xg_SO2_+2.0*xg_S2_+xg_H2S_+xg_OCS_)/Xg_t) - (wm_S_/M_S) - (wm_SO3_/M_SO3) - (wm_H2S_/M_H2S))
3046
+ X = ((wt_X/M_X) - (wm_X_/M_X))/(((xg_X_)/Xg_t) - (wm_X_/M_X))
3047
+ return C-O,C-H,C-S,C-X,C
3048
+
3049
+
3050
+ def solve_system(guesses):
3051
+ CO,CH,CS,CX,C = solvers(guesses)
3052
+ return [float(CO),float(CH),float(CS),float(CX)]
3053
+
3054
+ newguess = optimize.fsolve(solve_system, [float(guessx),float(guessy),float(guessz),float(guessw)])
3055
+ xg_O2_,xg_CO_,xg_S2_,xg_X_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,wm_X_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T = system(newguess)
3056
+ CO,CH,CS,CX,wt_g = solvers(newguess)
3057
+ return xg_O2_,xg_CO_,xg_S2_,xg_X_,xg_H2_,xg_H2O_,xg_CO2_,xg_OCS_,xg_SO2_,xg_H2S_,xg_CH4_,Xg_t,wm_CO2_,wm_CH4_,wm_CO_,wm_H2O_,wm_H2_,wm_SO3_,wm_S_,wm_H2S_,wm_ST_,wm_X_,xm_H2O_,xm_CO2_,Xm_t,Fe32,Fe3T,S62,S6T,wt_g
3058
+
3059
+
3060
+
3061
+ #################################
3062
+ ### sulfur solubility minimum ###
3063
+ #################################
3064
+
3065
+ # pressure of vapour saturation and melt S content for a given fO2 and fS2
3066
+ def p_tot_fO2_fS2(run,PT,melt_wf,setup,species,models):
3067
+ melt_wf["Fe3FeT"] = mg.Fe3FeT_i(PT,melt_wf,species,models)
3068
+ fO2 = mdv.f_O2(PT,melt_wf,species,models)
3069
+ fS2 = setup.loc[run,"fS2"]
3070
+ K1 = mdv.KOSg(PT,models)
3071
+ K2 = mdv.C_S(PT,melt_wf,species,models)/1000000.
3072
+ K3 = mdv.C_SO4(PT,melt_wf,species,models)/1000000.
3073
+ yO2 = mdv.y_O2(PT,species,models)
3074
+ yS2 = mdv.y_S2(PT,species,models)
3075
+ ySO2 = mdv.y_SO2(PT,species,models)
3076
+
3077
+ fSO2 = K1*fS2**0.5*fO2
3078
+ wm_S2 = ((fS2/fO2)**0.5)*K2 # wf S2- in the melt
3079
+ wm_S6 = ((fS2*fO2**3)**0.5)*K3 # wf S6+ in the melt
3080
+ wm_ST = wm_S2 + wm_S6 # wf ST in the melt
3081
+
3082
+ pS2 = fS2/yS2
3083
+ pO2 = fO2/yO2
3084
+ pSO2 = fSO2/ySO2
3085
+
3086
+ P_tot = pS2 + pO2 + pSO2
3087
+
3088
+ xgS2 = pS2/P_tot
3089
+ xgO2 = pO2/P_tot
3090
+ xgSO2 = pSO2/P_tot
3091
+
3092
+ result = {"P_tot":P_tot, "wm_ST":wm_ST, "fSO2":fSO2, "wm_S2":wm_S2, "wm_S6":wm_S6, "pS2":pS2, "pO2":pO2, "pSO2":pSO2, "xgS2":xgS2, "xgO2":xgO2, "xgSO2":xgSO2}
3093
+
3094
+ return result
3095
+
3096
+ # S content of the melt and fS2 for a given fO2 and P (and fH2O)
3097
+ def S_P_fO2(PT,fO2,melt_wf,species,models):
3098
+ P = PT["P"]
3099
+
3100
+ # equilibrium constants
3101
+ K1_ = mdv.KHOg(PT,models)
3102
+ K2_ = mdv.KCOg(PT,models)
3103
+ K3_ = mdv.KCOHg(PT,models)
3104
+ K4_ = mdv.C_H2O(PT,melt_wf,species,models)
3105
+ K5_ = mdv.C_CO3(PT,melt_wf,species,models)
3106
+ K6_ = mdv.KOSg(PT,models)
3107
+ K7_ = mdv.KHOSg(PT,models)
3108
+ K8_ = mdv.C_S(PT,melt_wf,species,models)/1000000.0
3109
+ K9_ = (mdv.C_SO4(PT,melt_wf,species,models)/1000000.0)
3110
+ K10_ = mdv.KOCSg(PT,models)
3111
+ K11_ = mdv.KOSg2(PT,models)
3112
+ K12_ = mdv.KHOm(PT,melt_wf,species,models)
3113
+ K13_ = mdv.C_H2(PT,melt_wf,species,models)
3114
+ KD1_, KD2, y = mdv.FefO2_KC91_EqA_terms(PT,melt_wf,species,models)
3115
+
3116
+ # fugacity coefficients
3117
+ y_CO_ = mdv.y_CO(PT,species,models)
3118
+ y_O2_ = mdv.y_O2(PT,species,models)
3119
+ y_CO2_ = mdv.y_CO2(PT,species,models)
3120
+ y_CH4_ = mdv.y_CH4(PT,species,models)
3121
+ y_H2O_ = mdv.y_H2O(PT,species,models)
3122
+ y_H2_ = mdv.y_H2(PT,species,models)
3123
+ y_S2_ = mdv.y_S2(PT,species,models)
3124
+ y_SO2_ = mdv.y_SO2(PT,species,models)
3125
+ y_H2S_ = mdv.y_H2S(PT,species,models)
3126
+ y_OCS_ = mdv.y_OCS(PT,species,models)
3127
+ y_SO3_ = mdv.y_SO3(PT,species,models)
3128
+
3129
+ # molecular masses
3130
+ M_H = species.loc['H','M']
3131
+ M_C = species.loc['C','M']
3132
+ M_O = species.loc['O','M']
3133
+ M_S = species.loc['S','M']
3134
+ M_Fe = species.loc['Fe','M']
3135
+ M_O2 = species.loc['O2','M']
3136
+ M_CO = species.loc['CO','M']
3137
+ M_OH = species.loc['OH','M']
3138
+ M_H2O = species.loc['H2O','M']
3139
+ M_H2 = species.loc['H2','M']
3140
+ M_CO2 = species.loc['CO2','M']
3141
+ M_CH4 = species.loc['CH4','M']
3142
+ M_S2 = species.loc['S2','M']
3143
+ M_SO2 = species.loc['SO2','M']
3144
+ M_SO3 = species.loc['SO3','M']
3145
+ M_H2S = species.loc['H2S','M']
3146
+ M_FeO = species.loc['FeO','M']
3147
+ M_FeO15 = species.loc['FeO1.5','M']
3148
+ M_OCS = species.loc['OCS','M']
3149
+ M_m_ = mg.M_m_SO(melt_wf,species)
3150
+ M_m_ox = mg.M_m_ox(melt_wf,species,models)
3151
+
3152
+ xg_O2_ = fO2/(P*y_O2_)
3153
+
3154
+ if melt_wf["H2OT"] > 0.:
3155
+ wm_H2O_ = melt_wf["H2OT"]
3156
+ xm_H2O_ = mg.xm_H2OT_so(melt_wf,species)
3157
+ wm_H2_, xm_H2_, wm_H2Omol_, xm_H2Omol_, wm_OH_, xm_OH_ = 0., 0., 0., 0., 0., 0.
3158
+ fH2O = mg.f_H2O(PT,melt_wf,species,models)
3159
+ xg_H2O_ = fH2O/(y_H2O_*P)
3160
+ xg_H2_ = fH2O/(K1_*fO2**0.5*y_H2_*P)
3161
+ a = 1.
3162
+ b = (K6_*fO2)/(y_SO2_*P*(y_S2_*P)**0.5) + (K7_*fH2O)/(y_H2S_*P*fO2**0.5*(y_S2_*P)**0.5)
3163
+ c = xg_O2_ + xg_H2O_ + xg_H2_ - 1.
3164
+ else:
3165
+ wm_H2O_, xm_H2O_, wm_H2_, xm_H2_, wm_H2Omol_, xm_H2Omol_, wm_OH_, xm_OH_, xg_H2_, xg_H2O_, xg_H2S_ = 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
3166
+ a = 1.
3167
+ b = (K6_*(y_S2_*P)**0.5*xg_O2_*y_O2_)/y_SO2_
3168
+ c = xg_O2_ - 1.
3169
+
3170
+ x = (-b + (b**2 - 4.*a*c)**0.5)/(2.*a)
3171
+ xg_S2_ = x**2
3172
+ xg_SO2_ = (K6_*(xg_S2_*P*y_S2_)**0.5*(xg_O2_*P*y_O2_))/(y_SO2_*P)
3173
+ wm_S_ = K8_*((y_S2_*xg_S2_)/(y_O2_*xg_O2_))**0.5
3174
+ wm_SO3_ = (K9_*(y_S2_*xg_S2_*P)**0.5*(y_O2_*xg_O2_*P)**1.5)*(M_SO3/M_S)
3175
+ wm_ST_ = wm_S_ + ((M_S*wm_SO3_)/M_SO3)
3176
+ S62 = (wm_SO3_/M_SO3)/(wm_S_/M_S)
3177
+ S6T = S62/(1+S62)
3178
+ Xg_t = xg_SO2_*M_SO2 + xg_S2_*M_S2 + xg_O2_*M_O2
3179
+ xg_SO3_ = (K11_*(y_O2_*xg_O2_)**1.5*(y_S2_*xg_S2_)**0.5*P)/y_SO3_
3180
+ if melt_wf["H2OT"] > 0.:
3181
+ xg_H2S_ = (K7_*fH2O*(xg_S2_*y_S2_*P)**0.5)/(fO2**0.5*y_H2S_*P)
3182
+
3183
+ wm_CO2_, xm_CO2_, xg_CO_, xg_CO2_, xg_CH4_, xg_OCS_, Xm_t, Xm_t_ox = 0., 0., 0., 0., 0., 0., 0., 0.
3184
+ wt_H_, wt_C_, wt_S_, wt_g = "na", "na", "na", "na"
3185
+
3186
+ gas = {"xg_O2":xg_O2_, "xg_S2":xg_S2_, "xg_SO2":xg_SO2_, "xg_SO3":xg_SO3_, "xg_H2":xg_H2_, "xg_H2O":xg_H2O_, "xg_H2S":xg_H2S_, "xg_CO":xg_CO_, "xg_CO2":xg_CO2_, "xg_CH4":xg_CH4_, "xg_OCS":xg_OCS_,"wt_g":wt_g, "Xg_t":Xg_t}
3187
+
3188
+ melt = {"wm_S":wm_S_, "wm_SO3":wm_SO3_, "wm_ST":wm_ST_, "S6T":S6T, "wm_H2O":wm_H2O_, "xm_H2O":xm_H2O_, "wm_H2":wm_H2_, "xm_H2":xm_H2_, "wm_H2Omol":wm_H2Omol_, "xm_H2Omol":xm_H2Omol_, "wm_OH":wm_OH_, "xm_OH":xm_OH_, "wm_CO2":wm_CO2_, "xm_CO2":xm_CO2_, "Xm_t":Xm_t, "Xm_t_ox":Xm_t_ox, "wt_C":wt_C_, "wt_H":wt_H_, "wt_S":wt_S_}
3189
+
3190
+ return gas, melt