Jump to content
Geochemist's Workbench Support Forum
Abdulaziz

Carbonate acidizing -(Matching ICP result ) - Help to setup initial rock sample and fluid constrains on the system

Recommended Posts

Greetings all,

I conducted  HCl ( acid ) core flooding experiments at room temperature on cylindrical limestone rock samples (2.5 cm in diameter 5 cm long) which are mainly composed of ( ~ 97 % calcite from XRD analysis ) and the produced water (effluent) was chemically analyzed for cations using Inductively Coupled Plasma (ICP) spectroscopy to assess the dissolution reaction phenomena.

the chemical equation is as follows : CaCO3 + 2HCl ---> CaCl2 + CO2 + H2O                                                        

My aim is to get the dissolution reaction rate constant and the diffusion coefficient for the conducted experiment by matching laboratory ICP result (Ca++)  with the model (X1t).

I have read transport reactive and other documentation but I am missing something. 

I used X1t app to simulate the acidized core flooding experiments and match the laboratory ICP result.

my concerns are the followings : 

How precisely can I put the constraints on the initial system for the rock sample and the injected acid solution? I am a little bit confused about the input units ( mg/kg, free kg, mmol/kg, ..etc). I am only aware of the limestone rock sample weight ( 50 g) , porosity (22%) and the concentration of the injected acid (pH, wt% ).  how would I put the value of the followings with their units:

  • H2O .... free kg
  • H+ ..... 4 (pH) .. for example !
  • Cl- ...  
  • Ca++ ( mineral ) ...
  • HCO3- ....
  • do I need to equilibrate the fluid and the rock in the initial pane in constraints on the initial system, and if so, how would I equilibrate them?
  • injection rate was 10 cm3/min. how would I mimic the laboratory injection rate within the X1t  the discharge ( injection rate) unit (cm/s, cm3/cm2/s, ..etc)?
  • The laboratory domain was a cylindrical core sample (2.5 cm in diameter 5 cm long) , how would I simulate that domain in the model, I used a spherical domain with r1: 1.25 cm, r2: 1.26 cm and nodes (Nx) = 5, please advise the appropriate way.

 

Your support in this matter is highly appreciated.

 

regards

Abdulaziz

Share this post


Link to post
Share on other sites

Hi Abdulaziz,

The main purpose of The Geochemist’s Workbench® software package is geochemical reaction modeling and reactive transport modeling using parameters like rate constants and diffusion constants. You may estimate their optimum values by trial and error, though. For example, the Microbial Populations lesson on the GWB Online Academy describes how to adjust the rate constant to visually match experimental data. 

You can set most basis entries as bulk or free constraints. For a bulk constraint, the value you set refers to the entire thermodynamic component, whereas for a free constraint, it refers to the particular species only. The Ca++ component, for example, might include the Ca++ species, as well as Ca(OH)2(aq), CaHCO3(aq), etc. If you set 10 “mg/kg” Ca++, the concentration is for the sum of those species. If you set 10 “free mg/kg” Ca++, though, the concentration refers only to the individual Ca++ species.

If you are looking at the reaction between the fluid, and the rock, as the fluid traverse through it, you don't probably need to equilibrate the fluid and rock. For more information, please read section 3.10 in the GWB Reaction Modeling Guide.

In a spherical domain, the length of the domain is r2-r1. Please read section 3.1 in the GWB Reactive Transport Modeling Guide.

In future, please don't post your question in different topics. If you need further help, please attach your script.

Thanks,

Melika Sharifi

Aqueous Solutions LLC

Share this post


Link to post
Share on other sites

Hi Melika,

Thanks for your reply. when I  submitted my case in the forum, an error message appeared and I ended up submitting the question 4 times without knowing it was posted at the first attempt. sorry about that.

I used X1t app to simulate the acidized core flooding experiments and match the laboratory ICP result.

the chemical equation is as follows : CaCO3 + 2HCl ---> CaCl2 + CO2 + H2O   

my concerns are the followings : 

How precisely can I put the constraints on the initial system for the rock sample and the injected acid solution? I am a little bit confused about the input units ( mg/kg, free kg, mmol/kg, ..etc). 

I am only aware of the limestone rock sample weight ( 50 g) , porosity (22%) and the concentration of the injected acid (pH, wt% ).  how would I put the value of the followings with their units:

  • H2O .... free kg 
  • H+ ..... 4 (pH) .. for example !
  • Cl- ...  
  • Ca++ ( mineral or ... ) ...
  • HCO3- ....
  • do I need to equilibrate the fluid and the rock in the initial pane in constraints on the initial system, and if so, how would I equilibrate them?
  • injection rate was 10 cm3/min. how would I mimic the laboratory injection rate within the X1t  the discharge ( injection rate) unit (cm/s, cm3/cm2/s, ..etc)?
  • The laboratory domain was a cylindrical core sample (2.5 cm in diameter  5 cm long) , how would I simulate that domain in the model, I used a spherical domain with r1: 1.25 cm, r2: 1.26 cm and nodes (Nx) = 5, please advise the appropriate way.

 

I have attached 2 different files. please advise which one of them i should be simulating my lab work with. 

Carbonate acdizing.x1t

Aziz HCl.x1t

Share this post


Link to post
Share on other sites

Hi Abdulaziz,

As Melika stated in response to your question, you set the length of a spherical domain with the values of r1 and r2. For example, setting r1 to 1 cm and r2 to 6 cm will prescribe a spherical domain that’s 5 cm long. Such a configuration would not be appropriate for a cylindrical column, however, because the domain’s width is expanding, as you can see in the graphic in X1t’s Domain pane. You could "hack" the model by setting r1 and r2 so that they are very large, like 1001 cm and 1006 cm, thus defining a domain of the same length, but with a geometry much closer to a cylinder. This really defeats the purpose of using a spherical model, however. I'm only saying this so you get an understanding of how the two radius values are used to define the geometry of a spherical domain. For your model,  I recommend just using a linear 1D model. In that case, you set the length to 5cm, and you can choose values of deltay and deltaz that will give you the same cross-sectional area as your cylindrical column.

You have several options to set the flow field. You can set specific discharge directly. You can solve for the specific discharge by setting a hydraulic potential or hydraulic head drop across the domain, along with the permeability, in which case the program uses Darcy’s law to solve for specific discharge. Alternatively, you can tell the program how much of the initial pore water should be displaced in the time specific for the simulation (the pore volumes option).

The specific discharge is a volume flux, with units such as cm3/cm2/s. So, it’s the volume of water passing a cross-sectional area per unit time. You’ll notice that the discharge units can be simplified to velocity units, such as cm/s. The two sets of units can be used interchangeably here. It’s important to keep in mind that the specific discharge is not the groundwater velocity, because water molecules only move through pore space within the column. The velocity is the specific discharge divided by the porosity.  

You can divide your experimental flowrate by the cross-sectional area of the column to get the specific discharge. Alternatively, you can determine from your injection rate how many times the volume of fluid in your column (the total volume x the porosity) was displaced over the length of your experiment, then set that value for pore_volumes. 

It’s hard to say for sure, but I doubt you’ll be able to figure a diffusion coefficient from an experiment with such a high flowrate, and with data only at the outlet. When water flows at any appreciable rate, the effects of diffusion are insignificant compare to advection and hydrodynamic dispersion. As a result, changing the value of the diffusion coefficient won’t affect your results in any noticeable way. For that same reason, specifying a precise value for a diffusion coefficient is only useful in modeling systems with little or no flow. I think an experiment without reaction or flow, and with multiple sampling points at multiple times, would be ideal for determining a diffusion coefficient.

The rate constant, on the other hand, could possibly be calculated, but it really depends on your experimental setup. Most commonly rate constants are determined in simple batch systems. You’re adding complexity by trying to derive it from a column experiment.

For more information, please see sections 3.1 and 3.1 in the GWB Reactive Transport Modeling Guide.

Regards, 

Brian Farrell
Aqueous Solutions
 

Share this post


Link to post
Share on other sites

Hi Brain ,

 

Thanks for your feedback.

 

I have thoroughly read GWB documentations (Essentials, React and x1t  ) and forum questions, but I  must be missing something.

 

I am trying to reproduce acidic core flooding experiment of fresh water saturated carbonate rock using x1t to match the produced Ca++ ions (ICP ) and estimate diffusion coefficient and reaction rate constant.

 

the chemical equation is as follows : CaCO3 + 2HCl ---> CaCl2 + CO2 + H2O

 

Here are the summary info of the fluid -rock system and the core flooding experiments  :

  • Cylindrical Carbonate rock (97% Calcite (CaCo3), radius 2.5 cm ,length 5 cm, rock weight ( 58 g), Porosity ( 16% ) , Permeability (9 md) , Bulk volume ( 25 cm3)
  • Carbonate rock was saturated and flooded with Fresh Water
  • Then saturated carbonate rock was flooded with HCl as  intel fluid  ( pH=2) at injection rate ( 7 cm3/min) till wormhole channel was formed and pressure drop fall to near zero value.
  • I have tried to mimic the fluid-rock properties into the model, but I am not sure.

 

My concerns are the following :

  • How can I add the rock mineral ( carbonate calcite (CaCo3) ) and at what units (97 vol% or 58g , 58g/kg ) to the fluid system?I tried 2 methods.
    •  Method 1 (Aziz Model file) : I added calcite in the kinetic reactant pane (meaning calcite is not in equilibrium with the fresh water )  , but I couldn’t add calcite in 58 g unit as its weighted (97% of core sample weight ) which will be reflected in calcite specific surface area .
    •  Method 2 (Calcite swapped with Ca++ file) : I swapped calcite with Ca++ ( stating equilibrium condition with fluid) in the initial fluid pane plus adding the calcite in the kinetic reactant pane, but calcite concertation appeared to start producing from  350 mg/l instead from 0 mg/l . Do I need to equilibrate the fluid and the rock in the initial pane ?  I did try Calcite mineral swapped with Ca++ in the fluid pane with React script ( Ca++_3 file).
  •  Sometimes I get this Error:       -- Error: Porosity of node 0 is too small: -0.269011 . I can’t change much in the domain pane that semi-represents cylindrical core sample ( dimensions ) .

 

Any help with setting this up would be much appreciated.

  

Please see attached files.

Regards

Abdulaziz

Ca++_3.rea

Aziz Model.x1t

Calcite swapped with Ca++.x1t

Share this post


Link to post
Share on other sites

Hi Abdulaziz,

In a reactive transport model, it's best not to constrain the amount of a mineral using absolute units, like g or cm3, because changing your discretization will change the system. Relative units are much better. Since calcite is the only mineral, and you know the porosity (.16), set the mineral abundance to .84 vol. fract. 

You'll definitely need a lot more than three nodes to get an accurate solution. Start with 20 or 50, perhaps, to get a basic understanding of your system without costing too much in terms of computational effort, then increase the resolution to 100 or several hundred, perhaps. For a discussion, please see the Numerical Dispersion lesson in the GWB Online Academy.

It doesn't sounds like the limestone was in contact with the initial dilute fluid for very long, so I'm not sure it's appropriate to assume the initial pore fluid is in equilibrium with calcite. In other words, I wouldn't swap calcite into the basis on the Initial pane. Your Aziz model.x1t is ok in this regard, but I'd put smaller values than .1 mg/kg for the various solutes, unless those values are actually known. I would add Calcite as a reactant, specifying it's abundance as described above. I think that takes care of your questions. You should not set a value for "reactants times". 

Looking at your inlet fluid, I would set smaller, but nonzero, values for the Ca++ and HCO3- in solution. As for the Cl- component, I think it's correct to set it as the charge balancing ion, but the value you set doesn't actually matter because the program adjusts the Cl- component to balance out the other ions in solution. The "as HCl" setting is unnecessary here.

Finally, I think you'll want to double-check your width and height settings to ensure you have the same cross-section area as your cylindrical column. You also might want to double-check your flow rate.

Regards,

Brian

Share this post


Link to post
Share on other sites

Hi Brian ,

Thanks for your quick fruitful reply.

I have checked and updated Aziz Model_1(file). My main goal is to estimate Damköhler and Péclet numbers for each acidic core flooding experiment, where the diffusion coefficient and reaction rate constant are needed to be estimated. Yes, the carbonate rock sample was saturated with fresh water for a day at maximum, then flooded with freshwater to measure the brine permeability using Darcy’s law, then flooded with diluted HCl ( pH =2).  After the acidic flooding of HCl ( pH =2), pH value dropped from 7 to 6.4 through the whole experiment. 

Now, I hope my initial rock-fluid conditions are right. I have checked the specific discharge as advised in your previous comment ( flow rate (cm3/min) divided by cross-sectional area (cm2) , which is in my case : 7 (cm3/min ) / 5.22 (cm2) = 1.33 cm/min  ~ 0.022 cm/s).  also, I have adjusted the permeability to be 9 md , but it seems the permeability is constant along the whole interval time. 

In the reactants pane, calcite specific surface area is not provided in the database. I have looked in the literature (https://www.onepetro.org/conference-paper/SPE-21044-MS ) and found 0.49 m2/g is the specific surface for Indiana limestone using  BET method.  Shall I use this value for the calcite specific surface area or specific surface area should be estimated else way? 

I am trying to mimic the ICP Lab results of the produced Ca++ ions effluent (that (Ca++ ) concentration reaches a value of   120 mg/l in the first 5 minutes then stabilizes at 120 mg/l  afterwards ) using Ca++ vs time xtplot.  But it appears that the dissolution of  Ca++ ions is quite immediate from the first 2 minutes reaches and stabilizes at a concentration of  300 mg/l. how can I delay or elongate the production of Ca++ ions linearly and what are the parameters that would allow me to adjust the curve of the produced Ca++ ion ( e.g. specific surface area , diffusion coefficient  and reaction rate constant though both factors are competing in the dissolution process) .

please see attached Aziz Model_1 script.

Thank you for your help and support. 


Best Regards,
 

Abdulaziz 

Aziz Model_1.x1t

Share this post


Link to post
Share on other sites

Hi Abdulaziz,

You might want to check the cross-sectional area of your column. You said it has a radius of 2.5 cm, right? So, the area  of the inlet face should be 2.5 * 2.5 * 3.14 = 19.625 cm2. If that’s the case, I’d put the delta y and delta z values at sqrt 19.625, or 4.43 cm. After that, you might recheck your flowrate and the number of pore volumes displaced to see if they make sense. 

You’ve set the log permeability to be constant by setting A (the porosity multiplier) to 0. Please note, however, that the permeability isn’t even used when you set specific discharge directly. It’s only used when you set a head drop or potential drop across the domain.

There’s no guarantee that your mineral has the same specific surface area as the limestone in the study, but it’s probably a good estimate in the absence of your own measurements.

As I mentioned previously, your fluid is traveling extremely quickly, so the effects of diffusion are negligible. Since you wish to find a value for the rate constant that fits your data, try adjusting that value so you can match your Ca++ and pH measurements. 

Regards,
Brian
 

Share this post


Link to post
Share on other sites

Hi Brian,

thanks for your feedback. 

Sorry for the misundersatanding, the core daimater is 2.5 cm (Cylindrical Carbonate rock (97% Calcite (CaCo3), daimeter 2.5 cm ,length 5 cm, rock weight ( 58 g), Porosity ( 16% ) , Permeability (9 md) , Bulk volume ( 25 cm3)).

So, I adjusted the porosity multiplier A to be 0.3 in order to see changes in permeability ( not constant )throughout the core flooding test. As you mentioned earlier, permeability is not much effected since I am using a specific discharge. 

I am still trying to match Ca++ lab result (120 mg/l) and pH measurements, where I find it very difficult to match. 

please see attached Aziz Model_2 script.

Thank you for your help and support. 

Best Regards,
 

Abdulaziz 

Aziz Model_2.x1t

Share this post


Link to post
Share on other sites

Hi Abdulaziz,

Of the kinetic parameters, I’d focus on adjusting the rate constant. I’m not sure you have any reason to change the specific surface area so much from your original value. There’s no point in adjusting the diffusion constant in your model.

Perhaps you need to control the CO2 fugacity more tightly. If it’s possible that CO2 is in contact with the fluid in the column, you might need to set a fixed fugacity path, if exchange is rapid, or a kinetic gas transfer model if the exchange is slower. Or maybe there are other minerals that are present in small amounts yet are highly reactive?

Regards,
Brian
 

Share this post


Link to post
Share on other sites
On 5/24/2019 at 7:27 AM, Brian Farrell said:

e specific discharge is a volume flux, with units such as cm3/cm2/s. So, it’s the

Hi Brian,

thanks again for your feedback. 

I have fixed the specific surface area to be 50 cm2/g in the coming scripts. 

Also, I have changed the flow filed to potential drop miming the acidizing pressure drop instead of the specific discharge and set them into different intervals.

in regard to the diffusion constant, you are right I changed the value of the diffusion constant ( related to porous medium )  from 9e-11 to 9e-6 and there is no much of a difference was noted.  however, I have adjusted the mechanical dispersion and changed the dispersivity to 3 cm and I noted the ca++ curve was elongated a bit. please see Aziz Model_8  script. It matched CA++ concentration but not pH measurement. pH went from a value  7 to 3  and I count not control that. 

it's true during carbonate acidizing, the produced CO2  (bubbles ) will remain in solution. so I added CO2 fugacity in the initial pane and set a fixed fugacity path since the exchange is rapid in the Aziz Model_9 script. I am not sure if I need to add CO2 fugacity to the fluid pan as well. the result of  Aziz Model_9 script is pretty much similar to Aziz Model_8 script.  I have also set a kinetic gas transfer model in Aziz Model_12 script and the same result was observed as in Aziz Model_9 script. 

the limestone Carbonate is mainly composed of calcite (98.2%) and Montmorillonite (1.8 %). 

in summary, with and without adding CO2 fugacity effect, the below scripts are either matching Ca++ ion concentration ( Aziz Model_8 & Aziz Model_9 ) mainly when rate constant is around 5e-12 or pH measurement (Aziz Model_10 & 13) when the rate constant is around 5e-6 (where the lab pH measurement went from 7 to 6.4 ). I couldn’t match both Ca++ ion concentration and pH measurement in one script. Can you please advise how to !!!

Thank you for your help and support. 

Best Regards,
 

Abdulaziz 

Aziz Model_8.x1t

Aziz Model_9.x1t

Aziz Model_10.x1t

Aziz Model_12.x1t

Aziz Model_13.x1t

Share this post


Link to post
Share on other sites

Hi Abdulaziz,

Typically you would determine a dispersivity value by adding a non-reactive tracer and fitting your model to a breakthrough curve. A dispersivity of 3 cm in a 5 cm long column seems awfully big.

I think it’s possible that the montmorillonite is dissolving, too. If your objective is to create a model that fits your pH and Ca++ measurements at the outlet, you might need to include montmorillonite in addition to the calcite in your model. Please note it may be difficult to fit such a model with only pH and Ca++ concentrations.

Regards,

Brian

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×