Jump to content
Geochemist's Workbench Support Forum

Calculating pH and CO2 partial pressure in brines

Recommended Posts

Warning – long post!

My question concerns how to determine the pH and partial pressure of CO2 (PCO2) in brine samples. I tried two different methods: 1) swapping a carbonate mineral in in place of H+; and, 2) titrating in CO2(g) till I get a saturation index (SI) of 1. I am wondering which is the most appropriate method (and some other questions).

Background: I have a number of samples from a brine. The water is an Na-Cl type brine: Na+ ~70,000 mg/L (~3.2 molal) and Cl- ~115,000 mg/L (~3.5 molal) (there is ~ a few % charge imbalance). The pH was measured in the lab. The formation T is 120C. The formation contains dolomite, but no calcite or other carbonate minerals. The samples are oversaturated with respect to dolomite at the formation T. I believe that the samples may have degassed CO2 during sampling and that this accounts for the oversaturation.  

Method 1: Swap out H+ for most abundant carbonate mineral

I have seen in a number of places in the Geochemical and Biogeochemical textbook that pH measurements of brines are typically erroneous and that a common method to determine the actual pH is to swap out H+ for the most abundant carbonate mineral. In my case it is dolomite. At the formation temperature of 120C dolomite is very oversaturated (saturation index of ~1200).

I swapped in dolomite in place of H+ using React and the thermo.tdat database, and raised the T to 120C. The resultant PCO2 was 0.2632 bar and the pH was 5.632.

Question: What is React doing?

My thought on what is happening when I swap dolomite in for pH is that the program essentially looks at the reaction:

CaMg(CO3)2 + 2 H(+)= Ca(++) + Mg(++) + 2 HCO3(-)

and says I know the Ca(++) and Mg(++) activity from the input, and I know the HCO3(-) activity from the alkalinity, and FUTHERMORE I know that the solution is in equilibrium with dolomite. That means that the only unknown is the H(+) activity, and it solves for it. However, when I compared the starting and final amounts of Ca++, Mg++ and HCO3- (as given in the text file under “Original basis, In fluid) there was a slight difference (starting / ending mg/kg): Ca++ 7,704 /  7,990; Mg++ 265.8 / 275; HCO3- 157.4 / 163 (the same relative differences are seen with the moles unit).   

What is going on? It would appear that some amount of dolomite is dissolving to account for the increase in Ca++, Mg++, and HCO3-. Or does it have something to do with how React calculates fluid density (and this then carries over into concentration units)? Or is it something else?

Method 2: Titrate in CO2(g) till a SI of 1 is reached for dolomite

I believe another way to try and determine the pH and in situ PCO2 is to titrate in CO2 until the solution is in equilibrium with dolomite (i.e. SI = 1). So, I tried this with the same sample using the React program, again raising the T to 120C. The only difference being that I started with the lab-measured pH of 6.41 and that I reacted 25.0 mmol of CO2(g) (which I settled on after trying different amounts). This amount results in an SI for dolomite of pretty close to 1 after the full amount has been added. The resultant pH is 5.053 and the PCO2 is 2.759 bar. There is no change in the amount of Ca++, or Mg++, although the final concentration of these is slightly greater than the starting one, but I figure this is likely due to a change in density of the fluid (as I think this effects concentration values).

React is obviously doing something different than in the first scenario.

Question: What is React doing?

My thought on what is happening when I add CO2(g) is:

CaMg(CO3)2 + 2H20 + 2CO2 =  Ca(++) + Mg(++) +   4 HCO3(-)

Since Ca++ and Mg++ are fixed, the only thing that can change is the amount of HCO3-. I find the carbonate system complex but my take on the overall effect of adding CO2 is that the effect of creating acidity (and increasing the solubility of carbonates) is greater than the effect of generating HCO3- (which would serve to increase the reaction quotient, Q). [This has to be the case as when I add CO2 the SI of dolomite becomes ~1 and the pH goes down.]

Is my understanding correct?

Question: Which approach is more appropriate - swapping in dolomite for pH, or titrating in CO2 till I get an SI of 1 for dolomite?

Question: Is there a way to do this for multiple samples at the same time? For example: Suppose you had 230 samples, all of which were in equilibrium with dolomite at 70 bars CO2 pressure but that through some exchange reaction they had quite different alkalinities. It would be very onerous to have to do the titration exercise individually on each sample.

I have attached two files - one for each approach.

Thanks in advance for you help.

B4 DST 8W Dw_as is_dol for H+_120C.rea B4 DST 8W Dw_as is_+25 mmol CO2_120C.rea

Link to post
Share on other sites

Hello Andrew,

Thanks for attaching your file and the explanation. In this case, I believe the first method is what you should use. If you know that dolomite is in equilibrium with your system, then the best approach is to swap mineral for pH and then allow the program to calculate speciation (and pH and pCO2).

You input file for the first method specified the constraints in the basis pane and React calculates the aqueous species distribution, gas fugacity, and mineral saturation by solving a set of matrix equations. The exact details of how React does this can be found in chapter 4, Solving for the equilibrium state, of the Geochemical and Biogeochemical Reaction Modeling text.

In the output.txt file, the concentration reported under “Original basis”, “In fluid” is the concentration of the initial input concentration from the basis page converted from mg/l to mg/kg by the density of the solution. To check, I divided the concentrations (in mg/l) from the basis pane by the density (given in the text block in the beginning of the text file) and see if they are the same as “Original basis, in fluid”. Here is an example using Ca++

Ca++ concentration in Basis pane: 8658.0 mg/l

Fluid density: 1.084 g/cm3

8658 / 1.084 = 7,987 mg/kg

This matches closely to the value reported in the Original basis section, 7.99e+03 for Ca++. I am not seeing the value 7,704 mg/kg reported anywhere in the file. Is this from a different calculation elsewhere?

You can also check that React honors the amount of mineral you constrained in basis pane under the “Minerals in system” section. The program reports 0.01234 moles in a total solution mass of 1.234 kg, based on the constraint you provided in the basis pane (Dolomite = 10 free mmol/kg).

There are a few options in The GWB to run a large batch of samples within the GWB. If you have your samples stored in a GSS spreadsheet, you can launch React for each sample. For more information on Launch, please refer to section 3.5 Launching SpecE8 and React in the GWB Essentials User Guide.

Other options include using the Plugin feature and control scripts if you would like more control over what the program outputs and to store the results in specified documents. For more information regarding Plugin and Control scripts, please refer to section 7 and 6 in the GWB Reference manual.

Hope this helps,
Jia Wang

Link to post
Share on other sites

Hi Jia, I have a follow up question.  I ran the same water as above and did the same swap (dolomite for H+) but this time I raised the temperature from 25C-120C. The amount of dolomite at 120C in the system (0.012976 moles, as specified in the "Minerals in system" portion of the output file) is more than the initial amount (0.01222 moles).

The solution  mass is only slightly different (1.2224 vs. 1.2222 kg).

I was under the impression that when I swap dolomite for H+ that no dolomite precipitates or dissolves. Can you shed some light on what is going on?



B4 DST8WDw_as is_dol for H+_25-120C.rea

Link to post
Share on other sites

Hi Andrew,

I am glad you found the previous post helpful.

I took a quick look at your script and see that you are using a sliding temperature path to heat your system. In the examples previously, you were just setting up React to calculate aqueous speciation for a set of initial condition but no reaction path was set to change your system. Therefore, the mineral mass you prescribed in the basis pane should be the same before and after aqueous speciation. However, with a polythermal reaction path, you are changing the system with increasing temperature, which also changes the log ks used to calculate the system's equilibrium state. As the system temperature increases, the minerals you swapped into the system may dissolve or precipitate in order to maintain the equilibrium between the mineral and the fluid. If you check mineral saturation for dolomite (Variable type --> Mineral saturation), you can see that dolomite remains in equilibrium with respect to the fluid in your system, the swapping of dolomite in your basis pane ensures this unless the dolomite completely dissolves.
Perhaps a simplified example would be helpful to see how this works. Try opening a React instance and enter the following commands in the command pane:
data = thermo.tdat verify
conductivity = conductivity-USGS.dat
temperature initial = 25 C, final = 60 C
H2O          = 1 free kg
swap Quartz for SiO2(aq)
Quartz       = 1 free mmol
precip = off


This example is a simple system where the fluid is set in equilibrium with 1 free mmol of Quartz. This example, you can see that the concentration of SiO2(aq) increases with temperature since Quartz is more soluble at higher temperature. If you go to File --> View --> thermo.tdat, you can navigate to the Quartz entry to see the log Ks at 25C and 60C.
Hope this helps,
Jia Wang
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...