A Geothermal simulation involving 2D flow
This page describes a reactive-transport simulation of a hypothetical geothermal system at the FORGE site. The transport is handled using the PorousFlow module, while the Geochemistry module is used to simulate the geochemistry. The simulations are coupled together in an operator-splitting approach using MultiApps. If the input files appear confusing, the reader could consult the simpler models listed on the Geochemistry examples page.
The simulation involves pumping cold fluid into a thin, hot subsurface confined aquifer, and recording the resulting geochemical changes. Before getting to the reactive-transport simulation, however, a lot of exploratory geochemical modelling is needed.
Although the geochemistry module can accept input in the form of various convenient units such as mg/kg, g, etc, this page uses mole-based units exclusively.
Representative water composition
Water composition has been measured at Roosevelt Hot Springs, which is close to the FORGE site, and this may be representative of the type of water found in the FORGE fractured granite. The other type of water used in this presentation is a low TDS potable water, which is the injectate. The composition of both waters is shown in Table 1 (after Patel and Simmons (2020)). Note that there is no iron composition in either of the waters, so no iron-bearing minerals will be considered in this presentation.
Table 1: Waters compositions used in this presentation. Concentrations of chemical species are measured in mg/kg.
Water1 | Water3 | |
---|---|---|
Roosevelt | Low TDS | |
Temperature | 60C | 20C |
pH | 7.5 | 6.2 |
Na+ | 2710 | 3.03 |
K+ | 612 | 1.1 |
Ca++ | 27 | 3.11 |
Mg++ | 0.02 | 0.7 |
SiO2(aq) | 220 | 16.4 |
Al+++ | 0.1 | 0.1 |
Cl- | 4935 | 0.5 |
SO4– | 53 | 1 |
HCO3- | 87 | 20 |
Mineralogy
X-ray diffraction suggests the composition of the FORGE granite is as shown in Table 2.
Table 2: Mineralogy of the FORGE site as suggested by X-ray diffraction
Mineral | Weight % |
---|---|
Plagioclase | 47 |
K-feldspar | 29 |
Quartz | 18 |
Illite | 2 |
Chlorite | trace |
Chlorite-Smectite | trace |
Biotite | trace |
Hornblende | 1 |
Augite | trace |
Titanite | trace |
Apatite | trace |
Epidote | trace |
Calcite | trace |
Patel and Simmons (2020) interpret Plagioclase as a 9:1 mix of Albite and Anorthite, while Stuart Simmons suggests that Biotite could be Phlogopite. Further correspondence with Stuart Simmons has identified a set of representative minerals to be used in the simulations, and they are shown in Table 3
Table 3: Mineralogy used in the simulations
Mineral | Weight % |
---|---|
Albite | 44 |
Anorthite | 5 |
K-feldspar | 29 |
Quartz | 18 |
Illite | 2 |
Phlogopite | 2 |
Anhydrite | trace |
Calcite | trace |
Paragonite | trace |
Chalcedony | trace |
Kaolinite | trace |
Clinochl-7A | trace |
Laumontite | trace |
Ziosite | trace |
Water1 at equilibrium
A geochemistry
input file that finds the equilibrium solution for Water1 is
# Equilibrium model "Water 1" from "Subtask 2C.4.7 Geochemical Modeling SSimmons-VPatil.pdf"
# At 60degC K-feldspar and Quartz both precipitate
[UserObjects<<<{"href": "../../../syntax/UserObjects/index.html"}>>>]
[definition]
type = GeochemicalModelDefinition<<<{"description": "User object that parses a geochemical database file, and only retains information relevant to the current geochemical model", "href": "../../../source/userobjects/GeochemicalModelDefinition.html"}>>>
database_file<<<{"description": "The name of the geochemical database file"}>>> = '../../../../geochemistry/database/moose_geochemdb.json'
basis_species<<<{"description": "A list of basis components relevant to the aqueous-equilibrium problem. H2O must appear first in this list. These components must be chosen from the 'basis species' in the database, the sorbing sites (if any) and the decoupled redox states that are in disequilibrium (if any)."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
remove_all_extrapolated_secondary_species<<<{"description": "After reading the database file, immediately remove all secondary species that have extrapolated equilibrium constants. Sometimes these extrapolations are completely crazy and those secondary species greatly impact the results"}>>> = true
equilibrium_minerals<<<{"description": "A list of minerals that are in equilibrium with the aqueous solution. All members of this list must be in the 'minerals' section of the database file"}>>> = 'Albite Anhydrite Anorthite Calcite Chalcedony Clinochl-7A Illite K-feldspar Kaolinite Quartz Paragonite Phlogopite Zoisite Laumontite'
[]
[]
[TimeIndependentReactionSolver<<<{"href": "../../../syntax/TimeIndependentReactionSolver/index.html"}>>>]
model_definition<<<{"description": "The name of the GeochemicalModelDefinition user object (you must create this UserObject yourself)"}>>> = definition
geochemistry_reactor_name<<<{"description": "The name that will be given to the GeochemistryReactor UserObject built by this action"}>>> = reactor
charge_balance_species<<<{"description": "Charge balance will be enforced on this basis species. This means that its bulk mole number may be changed from the initial value you provide in order to ensure charge neutrality. After the initial swaps have been performed, this must be in the basis, and it must be provided with a bulk_composition constraint_meaning."}>>> = 'Cl-'
constraint_species<<<{"description": "Names of the species that have their values fixed to constraint_value with meaning constraint_meaning. All basis species (after swap_into_basis and swap_out_of_basis) must be provided with exactly one constraint. These constraints are used to compute the configuration during the initial problem setup, and in time-dependent simulations they may be modified as time progresses."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
constraint_value<<<{"description": "Numerical value of the containts on constraint_species"}>>> = ' 1.0 3.16E-8 0.12 0.016 0.68E-3 0.0008E-3 3.7E-3 0.004E-3 0.15 0.5E-3 1.4E-3'
constraint_meaning<<<{"description": "Meanings of the numerical values given in constraint_value. kg_solvent_water: can only be applied to H2O and units must be kg. bulk_composition: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species but not in kinetic species, and units must be moles or mass (kg, g, etc). bulk_composition_with_kinetic: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species and in kinetic species, and units must be moles or mass (kg, g, etc). free_concentration: can be applied to all basis species that are not gas and not H2O and not mineral, and represents the total amount of the basis species existing freely (not as secondary species) within the solution, and units must be molal or mass_per_kg_solvent. free_mineral: can be applied to all mineral basis species, and represents the total amount of the mineral existing freely (precipitated) within the solution, and units must be moles, mass or cm3. activity and log10activity: can be applied to basis species that are not gas and not mineral and not sorbing sites, and represents the activity of the basis species (recall pH = -log10activity), and units must be dimensionless. fugacity and log10fugacity: can be applied to gases, and units must be dimensionless"}>>> = 'kg_solvent_water activity bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition'
constraint_unit<<<{"description": "Units of the numerical values given in constraint_value. Dimensionless: should only be used for activity or fugacity constraints. Moles: mole number. Molal: moles per kg solvent water. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. kg_per_kg_solvent: kilograms per kg solvent water. g_per_kg_solvent: grams per kg solvent water. mg_per_kg_solvent: milligrams per kg solvent water. ug_per_kg_solvent: micrograms per kg solvent water. cm3: cubic centimeters"}>>> = 'kg dimensionless moles moles moles moles moles moles moles moles moles'
temperature<<<{"description": "The temperature (degC) of the aqueous solution"}>>> = 60
ramp_max_ionic_strength_initial<<<{"description": "The number of iterations over which to progressively increase the maximum ionic strength (from zero to max_ionic_strength) during the initial equilibration. Increasing this can help in convergence of the Newton process, at the cost of spending more time finding the aqueous configuration."}>>> = 0 # max_ionic_strength in such a simple problem does not need ramping
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[bulk_H+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0 0 0'
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'bulk_moles_H+'
[]
[]
[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/combined/examples/geochem-porous_flow/forge/water_60degC.i)Note use of the flag
remove_all_extrapolated_secondary_species = true
This flag removes the odd secondary species whose equilibrium constants have only been measured for a small range of temperatures. By default, the geochemistry
module extrapolates the equilibrium constants for such species, and frequently this means the equilibrium constants are unrealistically high or low (such as or ) at high temperatures. This leads to convergence problems, or the simulation converges to an unrealistic solution. Therefore, this flag is used for all input files in this presentation.
If minerals are allowed to precipitate from Water1, small amounts of K-feldspar and Quartz form.
Estimating the in-situ reservoir water
When performing reactive-transport simulations, it is necessary to start with a fluid-filled reservoir. For most purposes, the fluid composition is not critical, since the injectate will rapidly displace it. However, it is convenient to fill the initial reservoir with fluid that is at equilibrium with the reservoir rocks. This makes the interpretation of the reactive-transport simulations easier, for any changes in mineralogy can be attributed to the injectate, and not the in-situ reservoir water. Therefore, this section attempts to find a water composition that is at equilibrium with the reservoir.
In this section, all the minerals present in Table 3 are used, with the exception of Laumontite and Zoisite. These two are present only in trace quantities (if at all), but if they exist in the model, the rock mineralogy of Table 3 is unstable, so it is impossible to find an equilibrium. For instance, Anorthite will decompose into Laumontite. This suggests that the rock mineralogy is controlled by kinetics, which is only considered in later sections (where Laumontite and Zoisite are included). It also reveals that the modelling results could be significantly impacted by the choice of minerals.
The following method is used to estimate a water composition that is at equilibrium with the reservoir mineralogy.
Water1 is equilibrated at 60C, with pH fixed to 7.5, allowing any precipitates to form. Only Quartz and K-feldspar precipitate, as mentioned in the previous section.
The system is closed (at ), i.e. the pH is no longer fixed. The small amount of Quartz and K-feldspar precipitates are retained.
The temperature is raised to 220C (during ), allowing any precipitates to form or dissolve. Quartz dissolves entirely, K-feldspar precipitate remains, and Calcite and Phlogopite precipitate. The pH becomes 7.078. Note the use of
remove_all_extrapolated_secondary_species = true
in the GeochemicalModelDefinition. If the extrapolated secondary species are retained instead, the results are significantly different (and probably incorrect).The following minerals are added (during ): Albite (16.8mol = 44% by weight), Anorthite (1.8mol = 5% by weight), K-feldspar (10.4mol = 29% by weight), Quartz (30.0mol = 18% by weight), Phlogopite (0.48mol = 2% by weight) and Illite (0.52mol = 2% by weight). The mol numbers are approximately what has been measured by X-ray diffraction as in Table 3.
# Minerals suggested by Stuart Simmons, but I do not include Laumontite and Zoisite as they are more stable than Anorthite so all Anorthite becomes one of these minerals which contradicts the XRD observations. All minerals are considered in the kinetic models.
# Model of "Water 1" from "Subtask 2C.4.7 Geochemical Modeling SSimmons-VPatil.pdf" subjected to the following:
# (1) The system is equilibrated at 60deg, with pH fixed to 7.5, allowing any precipitates to form. Note that the only minerals present in the system are those mentioned in "Subtask 2C.4.7 Geochemical Modeling SSimmons-VPatil.pdf". If other minerals are present, the results change significantly. Only Quartz and K-feldspar precipitate.
# (2) The system is closed (at time=0), ie the pH is no longer fixed. The Quartz and K-feldspar precipitates are retained
# (3) The temperature is raised to 220degC (during 0<time<=1), allowing any precipitates to form or dissolve. Quartz dissolves entirely, K-feldspar precipitate remains, and Calcite and Phlogopite precipitate. The pH becomes 7.078. Note the use of remove_all_extrapolated_secondary_species = true in the GeochemicalModelDefinition. If the extrapolated secondary species are retained instead, the results are significantly different.
# (4) The following minerals are added (during 1<time<=2): Albite (16.8mol = 44% by weight), Anorthite (1.8mol = 5% by weight), K-feldspar (10.4mol = 29% by weight), Quartz (30.0mol = 18% by weight), Phlogopite (0.48mol = 2% by weight) and Illite (0.52mol = 2% by weight). The mol numbers are approximately what has been measured by XRD, but it is not important to specify the exact composition of the rock (that will be done in the kinetic simulations): what is important here is that there is *some* precipitate.
# (5) The free moles precipitated are Albite 16.38, Anorthite 1.785, K-feldspar 10.68, Quartz 30.82, Phlogopite 0.52, Paragonite 0.44, Calcite 0.0004, Anhydrite 0.0004, Chalcedony 0, Illite 0, Kaolinite 0, Clinochl-7A 0. Calcite is constrained by the initial HCO3- concentration and Anhydrite by the initial SO4-- concentration, and both have only been observed in trace quantities in agreement with this simulation
# (6) The free mole numbers of the basis species that are now in equilibrium with the minerals are extracted, which is the key output of this simulation. Note that the original composition of "Water 1" is largely irrelevant. As mentioned, the HCO3- and SO4-- concentrations constrain Calcite and Anhydrite. Also, adding the minerals causes the pH to change to 6.16.
[UserObjects<<<{"href": "../../../syntax/UserObjects/index.html"}>>>]
[definition]
type = GeochemicalModelDefinition<<<{"description": "User object that parses a geochemical database file, and only retains information relevant to the current geochemical model", "href": "../../../source/userobjects/GeochemicalModelDefinition.html"}>>>
database_file<<<{"description": "The name of the geochemical database file"}>>> = '../../../../geochemistry/database/moose_geochemdb.json'
basis_species<<<{"description": "A list of basis components relevant to the aqueous-equilibrium problem. H2O must appear first in this list. These components must be chosen from the 'basis species' in the database, the sorbing sites (if any) and the decoupled redox states that are in disequilibrium (if any)."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
equilibrium_minerals<<<{"description": "A list of minerals that are in equilibrium with the aqueous solution. All members of this list must be in the 'minerals' section of the database file"}>>> = 'Albite Anhydrite Anorthite Calcite Chalcedony Clinochl-7A Illite K-feldspar Kaolinite Quartz Paragonite Phlogopite'
remove_all_extrapolated_secondary_species<<<{"description": "After reading the database file, immediately remove all secondary species that have extrapolated equilibrium constants. Sometimes these extrapolations are completely crazy and those secondary species greatly impact the results"}>>> = true
[]
[]
[TimeDependentReactionSolver<<<{"href": "../../../syntax/TimeDependentReactionSolver/index.html"}>>>]
model_definition<<<{"description": "The name of the GeochemicalModelDefinition user object (you must create this UserObject yourself)"}>>> = definition
geochemistry_reactor_name<<<{"description": "The name that will be given to the GeochemistryReactor UserObject built by this action"}>>> = reactor
charge_balance_species<<<{"description": "Charge balance will be enforced on this basis species. This means that its bulk mole number may be changed from the initial value you provide in order to ensure charge neutrality. After the initial swaps have been performed, this must be in the basis, and it must be provided with a bulk_composition constraint_meaning."}>>> = 'Cl-'
constraint_species<<<{"description": "Names of the species that have their values fixed to constraint_value with meaning constraint_meaning. All basis species (after swap_into_basis and swap_out_of_basis) must be provided with exactly one constraint. These constraints are used to compute the configuration during the initial problem setup, and in time-dependent simulations they may be modified as time progresses."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
constraint_value<<<{"description": "Numerical value of the containts on constraint_species"}>>> = ' 1.0 3.16E-8 0.12 0.016 0.68E-3 0.0008E-3 3.7E-3 0.004E-3 0.15 0.5E-3 1.4E-3'
constraint_meaning<<<{"description": "Meanings of the numerical values given in constraint_value. kg_solvent_water: can only be applied to H2O and units must be kg. bulk_composition: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species but not in kinetic species, and units must be moles or mass (kg, g, etc). bulk_composition_with_kinetic: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species and in kinetic species, and units must be moles or mass (kg, g, etc). free_concentration: can be applied to all basis species that are not gas and not H2O and not mineral, and represents the total amount of the basis species existing freely (not as secondary species) within the solution, and units must be molal or mass_per_kg_solvent. free_mineral: can be applied to all mineral basis species, and represents the total amount of the mineral existing freely (precipitated) within the solution, and units must be moles, mass or cm3. activity and log10activity: can be applied to basis species that are not gas and not mineral and not sorbing sites, and represents the activity of the basis species (recall pH = -log10activity), and units must be dimensionless. fugacity and log10fugacity: can be applied to gases, and units must be dimensionless"}>>> = 'kg_solvent_water activity bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition'
constraint_unit<<<{"description": "Units of the numerical values given in constraint_value. Dimensionless: should only be used for activity or fugacity constraints. Moles: mole number. Molal: moles per kg solvent water. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. kg_per_kg_solvent: kilograms per kg solvent water. g_per_kg_solvent: grams per kg solvent water. mg_per_kg_solvent: milligrams per kg solvent water. ug_per_kg_solvent: micrograms per kg solvent water. cm3: cubic centimeters"}>>> = 'kg dimensionless moles moles moles moles moles moles moles moles moles'
initial_temperature<<<{"description": "The initial aqueous solution is equilibrated at this system before adding reactants, changing temperature, etc."}>>> = 60
remove_fixed_activity_name<<<{"description": "The name of the species that should have their activity or fugacity constraint removed at time given in remove_fixed_activity_time. There should be an equal number of these names as times given in remove_fixed_activity_time. Each of these must be in the basis and have an activity or fugacity constraint"}>>> = 'H+'
remove_fixed_activity_time<<<{"description": "The times at which the species in remove_fixed_activity_name should have their activity or fugacity constraint removed."}>>> = 0
temperature<<<{"description": "Temperature. This has two different meanings if mode!=4. (1) If no species are being added to the solution (no source_species_rates are positive) then this is the temperature of the aqueous solution. (2) If species are being added, this is the temperature of the species being added. In case (2), the final aqueous-solution temperature is computed assuming the species are added, temperature is equilibrated and then, if species are also being removed, they are removed. If you wish to add species and simultaneously alter the temperature, you will have to use a sequence of heat-add-heat-add, etc steps. In the case that mode=4, temperature is the final temperature of the aqueous solution"}>>> = 220
source_species_names<<<{"description": "The name of the species that are added at rates given in source_species_rates. There must be an equal number of these as source_species_rates."}>>> = 'Albite Anorthite K-feldspar Quartz Phlogopite Illite'
source_species_rates<<<{"description": "Rates, in mols/time_unit, of addition of the species with names given in source_species_names. A negative value corresponds to removing a species: be careful that you don't cause negative mass problems!"}>>> = 'Albite_rate Anorthite_rate K-feldspar_rate Quartz_rate Phlogopite_rate Illite_rate'
ramp_max_ionic_strength_initial<<<{"description": "The number of iterations over which to progressively increase the maximum ionic strength (from zero to max_ionic_strength) during the initial equilibration. Increasing this can help in convergence of the Newton process, at the cost of spending more time finding the aqueous configuration."}>>> = 0 # max_ionic_strength in such a simple problem does not need ramping
mol_cutoff<<<{"description": "Information regarding species with molalities less than this amount will not be outputted"}>>> = 1E-100
execute_console_output_on<<<{"description": "When to execute the geochemistry console output"}>>> = 'timestep_end' # only CSV output
solver_info<<<{"description": "Print information (to the console) from the solver including residuals, swaps, etc"}>>> = true
[]
[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
type = Transient
[TimeStepper<<<{"href": "../../../syntax/Executioner/TimeStepper/index.html"}>>>]
type = FunctionDT
function = 'if(t<1, 1, if(t<1.01, 0.01, 1))'
[]
end_time = 2
[]
[AuxVariables<<<{"href": "../../../syntax/AuxVariables/index.html"}>>>]
[Albite_rate]
[]
[Anorthite_rate]
[]
[K-feldspar_rate]
[]
[Quartz_rate]
[]
[Phlogopite_rate]
[]
[Illite_rate]
[]
[transported_H2O]
[]
[transported_H+]
[]
[transported_Na+]
[]
[transported_K+]
[]
[transported_Ca++]
[]
[transported_Mg++]
[]
[transported_SiO2]
[]
[transported_Al+++]
[]
[transported_Cl-]
[]
[transported_SO4--]
[]
[transported_HCO3-]
[]
[]
[AuxKernels<<<{"href": "../../../syntax/AuxKernels/index.html"}>>>]
[Albite_rate]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = Albite_rate
function<<<{"description": "The function to use as the value"}>>> = 'if(t>1, 16.8, 0)'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_begin
[]
[Anorthite_rate]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = Anorthite_rate
function<<<{"description": "The function to use as the value"}>>> = 'if(t>1, 1.8, 0)'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_begin
[]
[K-feldspar_rate]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = K-feldspar_rate
function<<<{"description": "The function to use as the value"}>>> = 'if(t>1, 10.4, 0)'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_begin
[]
[Quartz_rate]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = Quartz_rate
function<<<{"description": "The function to use as the value"}>>> = 'if(t>1, 30.0, 0)'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_begin
[]
[Phlogopite_rate]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = Phlogopite_rate
function<<<{"description": "The function to use as the value"}>>> = 'if(t>1, 0.48, 0)'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_begin
[]
[Illite_rate]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = Illite_rate
function<<<{"description": "The function to use as the value"}>>> = 'if(t>1, 0.52, 0)'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_begin
[]
[transported_H2O]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'H2O'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_H2O
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_H+]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'H+'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_H+
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Na+]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Na+'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Na+
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_K+]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'K+'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_K+
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Ca++]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Ca++'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Ca++
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Mg++]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Mg++'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Mg++
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_SiO2]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'SiO2(aq)'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_SiO2
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Al+++]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Al+++'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Al+++
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Cl-]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Cl-'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Cl-
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_SO4--]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'SO4--'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_SO4--
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_HCO3-]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'HCO3-'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_HCO3-
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[]
[GlobalParams<<<{"href": "../../../syntax/GlobalParams/index.html"}>>>]
point = '0 0 0'
reactor = reactor
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[kg_solvent_water]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = kg_solvent_H2O
[]
[free_cm3_Albite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Albite
[]
[free_cm3_Anhydrite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Anhydrite
[]
[free_cm3_Anorthite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Anorthite
[]
[free_cm3_Calcite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Calcite
[]
[free_cm3_Chalcedony]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Chalcedony
[]
[free_cm3_Clinochl-7A]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Clinochl-7A
[]
[free_cm3_Illite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Illite
[]
[free_cm3_K-feldspar]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_K-feldspar
[]
[free_cm3_Kaolinite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Kaolinite
[]
[free_cm3_Quartz]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Quartz
[]
[free_cm3_Paragonite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Paragonite
[]
[free_cm3_Phlogopite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = free_cm3_Phlogopite
[]
[molal_H+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_H+
[]
[molal_Na+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_Na+
[]
[molal_K+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_K+
[]
[molal_Ca++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_Ca++
[]
[molal_Mg++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_Mg++
[]
[molal_SiO2]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_SiO2(aq)
[]
[molal_Al+++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_Al+++
[]
[molal_SO4--]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_SO4--
[]
[molal_HCO3-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = molal_HCO3-
[]
[bulk_moles_Cl-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = bulk_moles_Cl-
[]
[transported_H2O]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_H2O
[]
[transported_H+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_H+
[]
[transported_Na+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Na+
[]
[transported_K+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_K+
[]
[transported_Ca++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Ca++
[]
[transported_Mg++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Mg++
[]
[transported_SiO2]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_SiO2
[]
[transported_Al+++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Al+++
[]
[transported_Cl-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Cl-
[]
[transported_SO4--]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_SO4--
[]
[transported_HCO3-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_HCO3-
[]
[pH]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = pH
[]
[]
[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/combined/examples/geochem-porous_flow/forge/water_60_to_220degC.i)The free moles precipitated are Albite 16.38, Anorthite 1.785, K-feldspar 10.68, Quartz 30.82, Phlogopite 0.52, Paragonite 0.44, Calcite 0.0004, Anhydrite 0.0004, while the rest of the minerals do not precipitate. Notice:
The added Illite has dissolved in favor of Paragonite. This is important in interpreting reactive-transport results because if the reactive-transport's initial mineralogy is given by Table 3, Illite could dissolve regardless of the injectate.
Calcite is constrained by the initial HCO3- concentration
Anhydrite by the initial SO4– concentration
Table 4: Water that is in equilibrium with the mineralogy at 220C. The pH is 6.16.
Species | Concentration (molal) | Concentration (mg/kg) |
---|---|---|
Na+ | 0.1001 | 2300 |
K+ | 0.005949 | 233 |
Ca++ | 0.01465 | 587 |
Mg++ | 6.39e-06 | 0.16 |
SiO2(aq) | 0.00452 | 272 |
Al+++ | 1.667e-06 | 0.05 |
Cl- | 0.135 | 4790 |
SO4– | 9.995e-05 | 9.6 |
HCO3- | 0.0009765 | 60 |
In-situ kinetics
The analysis of the previous section produced a water that is in equilibrium with the rock mineralogy, as well as a stable mineral assemblage. However:
The analysis revealed that Table 3 may not be in equilibrium because Illite dissolves. Perhaps this does not matter greatly as Illite's mass fraction is only about 2%.
The model did not include Laumontite and Zoisite since they are more stable than Anorthite, which appears in appreciable fractions in the X-ray analysis.
Presumably all these minerals are controlled by kinetic reactions, and using kinetics may result in quite different results. Therefore, this section performs an analysis of the in-situ reservoir kinetics to act as a baseline for the reactive-transport simulations.
In this presentation, kinetic rates are modelled using the formula (1) where
[mol.s] is the reaction rate
[g] is the mass of the mineral. This is the number of moles multiplied by the molar weight.
[cm.g] is the specific surface area of the mineral
[mol.s.m] is the reaction's intrinsic rate constant
[J.mol] is the reaction's activation area
J.K.mol is the gas constant
[K] is the temperature
Palandri and Kharaka (2004) list parameters for a wide number of minerals. In many cases these are based on limited experimental data, so may be subject to large errors.
Table 5: Rates of the mineral species used in this presentation. [cm.g] is the specific surface area of the mineral, [mol.s.m] is the reaction's intrinsic rate constant and [J.mol] is the reaction's activation area
Species | Palandri reference | Assumed S | k | E |
---|---|---|---|---|
Albite | page8, neutral mechanism | 10 | 69800 | |
Anhydrite | page43, neutral mechanism | 10 | 14300 | |
Anorthite | page24, neutral mechanism | 10 | 17800 | |
Calcite | page42, neutral mechanism | 10 | 23500 | |
Chalcedony | Assumed same as Quartz | 10 | 90100 | |
Clinochl-7A | page40, neutral Chlinochlor-14A | 10 | 88000 | |
Illite | Assumed same as Phlogopite | 10 | 29000 | |
K-feldspar | page26, neutral mechanism | 10 | 38000 | |
Kaolinite | page39, neutral mechanism | 10 | 22200 | |
Laumontite | No data | 10 | 17800 | |
Quartz | page18, neutral mechanism f | 10 | 90100 | |
Paragonite | page38, neutral mechanism | 10 | 22000 | |
Phlogopite | page38, neutral mechanism | 10 | 29000 | |
Zoisite | page35, average of others | 10 | 66100 |
It is useful to analyse the rate of Illite and Anorthite conversion in order to act as a reference to the reactive-transport simulations
The in-situ reservoir water from the previous section is used
Minerals with ratios given in Table 3 are introduced
Trace minerals are assumed to exist at a 0.1% volume fraction. It is necessary to have some mineral present in the simulation for the rate of precipitation and dissolution, Eq. (1), depends on the mineral mass: with zero mineral there can be no precipitation of that mineral!
The quantities of the trace minerals Calcite and Anhydrite are constrained by the initial HCO3- and SO4– concentration, respectively
For every litre of in-situ reservoir water, 99 litres of rock mineral is used, representing a porosity of 0.01
After the minerals are introduced, the system is closed (no further water is allowed to enter the system) and its evolution is followed
The following input file models this situation
# Simulation to assess natural changes in the reservoir. Recall that water_60_to_220degC has provided a stable mineral assemblage that is in agreement with XRD observations, and a water at equilibrium with that assemblage. However, Stuart Simmons suggested including Laumontite and Zoisite into the simulation, and they were not included in water_60_to_220degC since they are more stable than Anorthite, so Anorthite completely dissolves when equilibrium is assumed. Here, all minerals suggested by Stuart Simmons are added to the system and kinetics are used to determine the time scales of the mineral changes. The initial water composition is the reservoir water from water_60_to_220degC.
# The initial mole numbers of the kinetic species are chosen to be such that:
# - the mass fractions are: Albite 0.44; Anorthite 0.05; K-feldspar 0.29; Quartz 0.18, Phlgoptite 0.02 and Illite 0.02 with trace amounts of the remaining minerals. These are similar to that measured in bulk X-ray diffraction results of 10 samples from well 58-32, assuming that "plagioclase feldspar" consists of Albite and Anorthite in the ratio 9:1, and that Biotite is Phlogoptite. The trace amounts of each mineral are necessary because of the way the kinetics works: precipitation rate is proportional to mineral-species mass, so without any mass, no precipitation is possible. Precisely:
# - it is assumed that water_60_to_220degC consists of 1 litre of water (there is 1kg of solvent water) and that the porosity is 0.01, so the amount of rock should be 99000cm^3
# - the cm^3 of the trace minerals Calcite and Anhydrite is exactly given by water_60_to_220degC (0.016 and 0.018 respectively)
# - see initial_kinetic_moles.xlsx for the remaining mole numbers
# The results depend on the kinetic rates used and these are recognised to be poorly constrained by experiment
[UserObjects<<<{"href": "../../../syntax/UserObjects/index.html"}>>>]
[rate_Albite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Albite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 69.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Anhydrite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Anhydrite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-7
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 14.3E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Anorthite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Anorthite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-13
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 17.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Calcite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Calcite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-10
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 23.5E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Chalcedony]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Chalcedony
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 90.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Clinochl-7A]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Clinochl-7A
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 88.0E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Illite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Illite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 29E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_K-feldspar]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = K-feldspar
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 38E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Kaolinite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Kaolinite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22.2E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Quartz]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Quartz
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 90.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Paragonite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Paragonite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Phlogopite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Phlogopite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Laumontite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Laumontite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-15
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 17.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Zoisite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Zoisite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-16
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 66.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[definition]
type = GeochemicalModelDefinition<<<{"description": "User object that parses a geochemical database file, and only retains information relevant to the current geochemical model", "href": "../../../source/userobjects/GeochemicalModelDefinition.html"}>>>
database_file<<<{"description": "The name of the geochemical database file"}>>> = '../../../../geochemistry/database/moose_geochemdb.json'
basis_species<<<{"description": "A list of basis components relevant to the aqueous-equilibrium problem. H2O must appear first in this list. These components must be chosen from the 'basis species' in the database, the sorbing sites (if any) and the decoupled redox states that are in disequilibrium (if any)."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
remove_all_extrapolated_secondary_species<<<{"description": "After reading the database file, immediately remove all secondary species that have extrapolated equilibrium constants. Sometimes these extrapolations are completely crazy and those secondary species greatly impact the results"}>>> = true
kinetic_minerals<<<{"description": "A list of minerals whose dynamics are governed by a rate law. These are not in equilibrium with the aqueous solution. All members of this list must be in the 'minerals' section of the database file."}>>> = 'Albite Anhydrite Anorthite Calcite Chalcedony Clinochl-7A Illite K-feldspar Kaolinite Quartz Paragonite Phlogopite Zoisite Laumontite'
kinetic_rate_descriptions<<<{"description": "A list of GeochemistryKineticRate UserObject names that define the kinetic rates. If a kinetic species has no rate prescribed to it, its reaction rate will be zero"}>>> = 'rate_Albite rate_Anhydrite rate_Anorthite rate_Calcite rate_Chalcedony rate_Clinochl-7A rate_Illite rate_K-feldspar rate_Kaolinite rate_Quartz rate_Paragonite rate_Phlogopite rate_Zoisite rate_Laumontite'
[]
[]
[TimeDependentReactionSolver<<<{"href": "../../../syntax/TimeDependentReactionSolver/index.html"}>>>]
model_definition<<<{"description": "The name of the GeochemicalModelDefinition user object (you must create this UserObject yourself)"}>>> = definition
geochemistry_reactor_name<<<{"description": "The name that will be given to the GeochemistryReactor UserObject built by this action"}>>> = reactor
charge_balance_species<<<{"description": "Charge balance will be enforced on this basis species. This means that its bulk mole number may be changed from the initial value you provide in order to ensure charge neutrality. After the initial swaps have been performed, this must be in the basis, and it must be provided with a bulk_composition constraint_meaning."}>>> = 'Cl-'
constraint_species<<<{"description": "Names of the species that have their values fixed to constraint_value with meaning constraint_meaning. All basis species (after swap_into_basis and swap_out_of_basis) must be provided with exactly one constraint. These constraints are used to compute the configuration during the initial problem setup, and in time-dependent simulations they may be modified as time progresses."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
# Following numbers are from water_60_to_220degC_out.csv
constraint_value<<<{"description": "Numerical value of the containts on constraint_species"}>>> = ' 1.0006383866109 9.5165072498215e-07 0.100020379171 0.0059389061065 0.011570884507621 4.6626763057447e-06 0.0045110404925255 5.8096968688789e-17 0.13500708594394 6.6523540147676e-05 7.7361407898089e-05'
constraint_meaning<<<{"description": "Meanings of the numerical values given in constraint_value. kg_solvent_water: can only be applied to H2O and units must be kg. bulk_composition: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species but not in kinetic species, and units must be moles or mass (kg, g, etc). bulk_composition_with_kinetic: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species and in kinetic species, and units must be moles or mass (kg, g, etc). free_concentration: can be applied to all basis species that are not gas and not H2O and not mineral, and represents the total amount of the basis species existing freely (not as secondary species) within the solution, and units must be molal or mass_per_kg_solvent. free_mineral: can be applied to all mineral basis species, and represents the total amount of the mineral existing freely (precipitated) within the solution, and units must be moles, mass or cm3. activity and log10activity: can be applied to basis species that are not gas and not mineral and not sorbing sites, and represents the activity of the basis species (recall pH = -log10activity), and units must be dimensionless. fugacity and log10fugacity: can be applied to gases, and units must be dimensionless"}>>> = 'kg_solvent_water free_concentration free_concentration free_concentration free_concentration free_concentration free_concentration free_concentration bulk_composition free_concentration free_concentration'
constraint_unit<<<{"description": "Units of the numerical values given in constraint_value. Dimensionless: should only be used for activity or fugacity constraints. Moles: mole number. Molal: moles per kg solvent water. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. kg_per_kg_solvent: kilograms per kg solvent water. g_per_kg_solvent: grams per kg solvent water. mg_per_kg_solvent: milligrams per kg solvent water. ug_per_kg_solvent: micrograms per kg solvent water. cm3: cubic centimeters"}>>> = ' kg molal molal molal molal molal molal molal moles molal molal'
initial_temperature<<<{"description": "The initial aqueous solution is equilibrated at this system before adding reactants, changing temperature, etc."}>>> = 220
temperature<<<{"description": "Temperature. This has two different meanings if mode!=4. (1) If no species are being added to the solution (no source_species_rates are positive) then this is the temperature of the aqueous solution. (2) If species are being added, this is the temperature of the species being added. In case (2), the final aqueous-solution temperature is computed assuming the species are added, temperature is equilibrated and then, if species are also being removed, they are removed. If you wish to add species and simultaneously alter the temperature, you will have to use a sequence of heat-add-heat-add, etc steps. In the case that mode=4, temperature is the final temperature of the aqueous solution"}>>> = 220
kinetic_species_name<<<{"description": "Names of the kinetic species given initial values in kinetic_species_initial_value"}>>> = ' Albite Anorthite K-feldspar Quartz Phlogopite Paragonite Calcite Anhydrite Chalcedony Illite Kaolinite Clinochl-7A Zoisite Laumontite'
kinetic_species_initial_value<<<{"description": "Initial number of moles, mass or volume (depending on kinetic_species_unit) for each of the species named in kinetic_species_name"}>>> = '4.324073236492E+02 4.631370307325E+01 2.685015418378E+02 7.720095013956E+02 1.235192062541E+01 7.545461404965E-01 4.234651808835E-04 4.000485907930E-04 4.407616361072E+00 1.342524904876E+01 1.004823151125E+00 4.728132387707E-01 7.326007326007E-01 4.818116116598E-01'
kinetic_species_unit<<<{"description": "Units of the numerical values given in kinetic_species_initial_value. Moles: mole number. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. cm3: cubic centimeters"}>>> = ' moles moles moles moles moles moles moles moles moles moles moles moles moles moles'
evaluate_kinetic_rates_always<<<{"description": "If true, then, evaluate the kinetic rates at every Newton step during the solve using the current values of molality, activity, etc (ie, implement an implicit solve). If false, then evaluate the kinetic rates using the values of molality, activity, etc, at the start of the current time step (ie, implement an explicit solve)"}>>> = true # otherwise will easily "run out" of dissolving species
ramp_max_ionic_strength_initial<<<{"description": "The number of iterations over which to progressively increase the maximum ionic strength (from zero to max_ionic_strength) during the initial equilibration. Increasing this can help in convergence of the Newton process, at the cost of spending more time finding the aqueous configuration."}>>> = 0 # max_ionic_strength in such a simple problem does not need ramping
execute_console_output_on<<<{"description": "When to execute the geochemistry console output"}>>> = ''
[]
[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
type = Transient
[TimeStepper<<<{"href": "../../../syntax/Executioner/TimeStepper/index.html"}>>>]
type = FunctionDT
function = 'max(1E2, 0.1 * t)'
[]
end_time = 4E11
[]
[GlobalParams<<<{"href": "../../../syntax/GlobalParams/index.html"}>>>]
point = '0 0 0'
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[cm3_Albite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Albite'
[]
[cm3_Anhydrite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Anhydrite'
[]
[cm3_Anorthite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Anorthite'
[]
[cm3_Calcite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Calcite'
[]
[cm3_Chalcedony]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Chalcedony'
[]
[cm3_Clinochl-7A]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Clinochl-7A'
[]
[cm3_Illite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Illite'
[]
[cm3_K-feldspar]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_K-feldspar'
[]
[cm3_Kaolinite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Kaolinite'
[]
[cm3_Quartz]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Quartz'
[]
[cm3_Paragonite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Paragonite'
[]
[cm3_Phlogopite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Phlogopite'
[]
[cm3_Zoisite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Zoisite'
[]
[cm3_Laumontite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Laumontite'
[]
[cm3_mineral]
type = LinearCombinationPostprocessor<<<{"description": "Computes a linear combination between an arbitrary number of post-processors", "href": "../../../source/postprocessors/LinearCombinationPostprocessor.html"}>>>
pp_names<<<{"description": "List of post-processors"}>>> = 'cm3_Albite cm3_Anhydrite cm3_Anorthite cm3_Calcite cm3_Chalcedony cm3_Clinochl-7A cm3_Illite cm3_K-feldspar cm3_Kaolinite cm3_Quartz cm3_Paragonite cm3_Phlogopite cm3_Zoisite cm3_Laumontite'
pp_coefs<<<{"description": "List of linear combination coefficients for each post-processor"}>>> = '1 1 1 1 1 1 1 1 1 1 1 1 1 1'
[]
[pH]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'pH'
[]
[kg_solvent_H2O]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'kg_solvent_H2O'
[]
[]
[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/combined/examples/geochem-porous_flow/forge/natural_reservoir.i)Results are shown in Figure 1, Figure 2 and Figure 3 The figures reveal that:
The small amount of Calcite dissolves entirely within years
About 25% of the small amount of Anhydrite dissolves rapidly, but after 100 years it returns to its original volume
Between 1 and 100 years after the simulation commences, all Anorthite, Chalcedony and Clinochl-7A dissolve
Between 1 and 100 years after the simulation commences, Zoisite, Illite, Paragony and Quartz increase in volume. Laumontite increases slightly too, before returning to its original small value.
The pH drops to around 4.8 during the course of the first 100 years before rebounding to 5.8.
The solvent water mass roughly halves during the first 100 years, corresponding to small porosity decreases.
The results depend quite crucially on the kinetic rate constants, which are poorly constrained by experiment. For instance, increasing Laumontite's rate constant by a factor of 10 means that all the water gets absorbed into minerals as they precipitate, resulting in geothermal reservoir with zero porosity.
This concludes the study on the in-situ dynamics of the reservoir. Attention is now turned to the injectate and, finally, reactive-transport modelling.

Figure 1: Change in mineral volume when the in-situ reservoir water is in contact with the minerals of Table 3.

Figure 2: Percentage change in mineral volume when the in-situ reservoir water is in contact with the minerals of Table 3.

Figure 3: Changes in the water volume and chemistry when the in-situ reservoir water is in contact with the minerals of Table 3.
Water3 at 70C
The reactive-transport simulation involves injecting Water3 at 70C and it is useful to determine the free molalities of species in this water. To find these:
The initial equilibrium is found at 20degC. This is the temperature at which the bulk composition was measured, and at this temperature most species are supersaturated. However, since measurements were performed in the absence of free minerals, their precipitation must be retarded in some way, so all minerals are prevented from precipitating in the model
The pH constraint is removed and the system is raised to 70degC, which is the injection temperature. This causes the pH to drop from 6.2 to 6.1, and only Kaolinite and Illite are supersaturated
An input file that performs this simulation is
# Equilibrium model "Water 3" from "Subtask 2C.4.7 Geochemical Modeling SSimmons-VPatil.pdf". The steps followed in this input file are:
# 1. The initial equilibrium is found at 20degC. This is the temperature at which the bulk composition was measured, and at this temperature most species are supersaturated. However, since measurements were performed in the absence of free minerals, their precipitation must be retarded in some way, so all minerals are prevented from precipitating in the model
# 2. The pH constraint is removed and the system is raised to 70degC, which is the injection temperature. This causes the pH to drop from 6.2 to 6.1, and only Kaolinite and Illite are supersaturated
# 3. The free molality of the species is measured for use in other models
[UserObjects<<<{"href": "../../../syntax/UserObjects/index.html"}>>>]
[definition]
type = GeochemicalModelDefinition<<<{"description": "User object that parses a geochemical database file, and only retains information relevant to the current geochemical model", "href": "../../../source/userobjects/GeochemicalModelDefinition.html"}>>>
database_file<<<{"description": "The name of the geochemical database file"}>>> = '../../../../geochemistry/database/moose_geochemdb.json'
basis_species<<<{"description": "A list of basis components relevant to the aqueous-equilibrium problem. H2O must appear first in this list. These components must be chosen from the 'basis species' in the database, the sorbing sites (if any) and the decoupled redox states that are in disequilibrium (if any)."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
equilibrium_minerals<<<{"description": "A list of minerals that are in equilibrium with the aqueous solution. All members of this list must be in the 'minerals' section of the database file"}>>> = 'Albite Anhydrite Anorthite Calcite Chalcedony Clinochl-7A Illite K-feldspar Kaolinite Quartz Paragonite Phlogopite Zoisite Laumontite'
remove_all_extrapolated_secondary_species<<<{"description": "After reading the database file, immediately remove all secondary species that have extrapolated equilibrium constants. Sometimes these extrapolations are completely crazy and those secondary species greatly impact the results"}>>> = true
[]
[]
[TimeDependentReactionSolver<<<{"href": "../../../syntax/TimeDependentReactionSolver/index.html"}>>>]
model_definition<<<{"description": "The name of the GeochemicalModelDefinition user object (you must create this UserObject yourself)"}>>> = definition
geochemistry_reactor_name<<<{"description": "The name that will be given to the GeochemistryReactor UserObject built by this action"}>>> = reactor
charge_balance_species<<<{"description": "Charge balance will be enforced on this basis species. This means that its bulk mole number may be changed from the initial value you provide in order to ensure charge neutrality. After the initial swaps have been performed, this must be in the basis, and it must be provided with a bulk_composition constraint_meaning."}>>> = 'Cl-'
constraint_species<<<{"description": "Names of the species that have their values fixed to constraint_value with meaning constraint_meaning. All basis species (after swap_into_basis and swap_out_of_basis) must be provided with exactly one constraint. These constraints are used to compute the configuration during the initial problem setup, and in time-dependent simulations they may be modified as time progresses."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
constraint_value<<<{"description": "Numerical value of the containts on constraint_species"}>>> = ' 1.0 6.31E-7 1.32E-4 2.81E-5 7.76E-5 2.88E-5 2.73E-4 3.71E-6 1.41E-5 1.04E-5 3.28E-4'
constraint_meaning<<<{"description": "Meanings of the numerical values given in constraint_value. kg_solvent_water: can only be applied to H2O and units must be kg. bulk_composition: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species but not in kinetic species, and units must be moles or mass (kg, g, etc). bulk_composition_with_kinetic: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species and in kinetic species, and units must be moles or mass (kg, g, etc). free_concentration: can be applied to all basis species that are not gas and not H2O and not mineral, and represents the total amount of the basis species existing freely (not as secondary species) within the solution, and units must be molal or mass_per_kg_solvent. free_mineral: can be applied to all mineral basis species, and represents the total amount of the mineral existing freely (precipitated) within the solution, and units must be moles, mass or cm3. activity and log10activity: can be applied to basis species that are not gas and not mineral and not sorbing sites, and represents the activity of the basis species (recall pH = -log10activity), and units must be dimensionless. fugacity and log10fugacity: can be applied to gases, and units must be dimensionless"}>>> = 'kg_solvent_water activity bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition bulk_composition'
constraint_unit<<<{"description": "Units of the numerical values given in constraint_value. Dimensionless: should only be used for activity or fugacity constraints. Moles: mole number. Molal: moles per kg solvent water. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. kg_per_kg_solvent: kilograms per kg solvent water. g_per_kg_solvent: grams per kg solvent water. mg_per_kg_solvent: milligrams per kg solvent water. ug_per_kg_solvent: micrograms per kg solvent water. cm3: cubic centimeters"}>>> = ' kg dimensionless moles moles moles moles moles moles moles moles moles'
prevent_precipitation<<<{"description": "Mineral species in this list will be prevented from precipitating, irrespective of their saturation index (unless they are initially in the basis)"}>>> = 'Albite Anhydrite Anorthite Calcite Chalcedony Clinochl-7A Illite K-feldspar Kaolinite Quartz Paragonite Phlogopite Zoisite Laumontite'
initial_temperature<<<{"description": "The initial aqueous solution is equilibrated at this system before adding reactants, changing temperature, etc."}>>> = 20
remove_fixed_activity_name<<<{"description": "The name of the species that should have their activity or fugacity constraint removed at time given in remove_fixed_activity_time. There should be an equal number of these names as times given in remove_fixed_activity_time. Each of these must be in the basis and have an activity or fugacity constraint"}>>> = 'H+'
remove_fixed_activity_time<<<{"description": "The times at which the species in remove_fixed_activity_name should have their activity or fugacity constraint removed."}>>> = 0
temperature<<<{"description": "Temperature. This has two different meanings if mode!=4. (1) If no species are being added to the solution (no source_species_rates are positive) then this is the temperature of the aqueous solution. (2) If species are being added, this is the temperature of the species being added. In case (2), the final aqueous-solution temperature is computed assuming the species are added, temperature is equilibrated and then, if species are also being removed, they are removed. If you wish to add species and simultaneously alter the temperature, you will have to use a sequence of heat-add-heat-add, etc steps. In the case that mode=4, temperature is the final temperature of the aqueous solution"}>>> = 70
ramp_max_ionic_strength_initial<<<{"description": "The number of iterations over which to progressively increase the maximum ionic strength (from zero to max_ionic_strength) during the initial equilibration. Increasing this can help in convergence of the Newton process, at the cost of spending more time finding the aqueous configuration."}>>> = 0 # max_ionic_strength in such a simple problem does not need ramping
execute_console_output_on<<<{"description": "When to execute the geochemistry console output"}>>> = 'final' # only CSV output needed
[]
[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
type = Transient
dt = 1
end_time = 1
[]
[GlobalParams<<<{"href": "../../../syntax/GlobalParams/index.html"}>>>]
point = '0 0 0'
reactor = reactor
[]
[AuxVariables<<<{"href": "../../../syntax/AuxVariables/index.html"}>>>]
[transported_H2O]
[]
[transported_H+]
[]
[transported_Na+]
[]
[transported_K+]
[]
[transported_Ca++]
[]
[transported_Mg++]
[]
[transported_SiO2]
[]
[transported_Al+++]
[]
[transported_Cl-]
[]
[transported_SO4--]
[]
[transported_HCO3-]
[]
[]
[AuxKernels<<<{"href": "../../../syntax/AuxKernels/index.html"}>>>]
[transported_H2O]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'H2O'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_H2O
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_H+]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'H+'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_H+
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Na+]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Na+'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Na+
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_K+]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'K+'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_K+
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Ca++]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Ca++'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Ca++
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Mg++]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Mg++'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Mg++
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_SiO2]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'SiO2(aq)'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_SiO2
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Al+++]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Al+++'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Al+++
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_Cl-]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'Cl-'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Cl-
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_SO4--]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'SO4--'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_SO4--
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[transported_HCO3-]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
species<<<{"description": "Species name"}>>> = 'HCO3-'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_HCO3-
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
[]
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[temperature]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'solution_temperature'
[]
[bulk_Cl]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'bulk_moles_Cl-'
[]
[kg_solvent_H2O]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'kg_solvent_H2O'
[]
[molal_H+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_H+'
[]
[molal_Na+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_Na+'
[]
[molal_K+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_K+'
[]
[molal_Ca++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_Ca++'
[]
[molal_Mg++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_Mg++'
[]
[molal_SiO2aq]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_SiO2(aq)'
[]
[molal_Al+++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_Al+++'
[]
[molal_Cl-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_Cl-'
[]
[molal_SO4--]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_SO4--'
[]
[molal_HCO3-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'molal_HCO3-'
[]
[transported_H2O]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_H2O
[]
[transported_H+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_H+
[]
[transported_Na+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Na+
[]
[transported_K+]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_K+
[]
[transported_Ca++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Ca++
[]
[transported_Mg++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Mg++
[]
[transported_SiO2]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_SiO2
[]
[transported_Al+++]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Al+++
[]
[transported_Cl-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_Cl-
[]
[transported_SO4--]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_SO4--
[]
[transported_HCO3-]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = transported_HCO3-
[]
[]
[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/combined/examples/geochem-porous_flow/forge/water_3.i)Note that in the TimeDependentReactionSolver:
The pH is initially set to 6.2 by setting the activity of H+ to
All minerals are prevented from precipitating
The initial temperature is 20C
After the system has equilibrated during the initial setup phase, the activity constraint on H+ is removed at
The temperature after the initial setup phase is set to 70C
Injectate impacts on the reservoir mineralogy
Water3 at 70C (from the previous section) is mixed with rock with composition of Table 3 in order to assess the possible changes in the reservoir. This is not a reactive transport simulation: it is simply flushing Water3 repeatedly through the rock mineral assemblage. That is, as soon as a mineral dissolves, the aqueous components are swept away and replaced by a new batch of Water3. Or, as soon as a precipitate forms from Water3, it is retained and a new batch of Water3 is introduced, ready to potentially form more precipitate. The rate constants of Table 5 are used.
An input file that performs this simulation is
# Simulation to assess possible changes in the reservoir. The rock composition from natural_reservoir.i is mixed with the water from water_3.i Note that the free_concentration values are used from water_3.i and that composition is held fixed throughout this entire simulation. This models water_3 continually flushing through the rock mineral assemblage: as soon as a mineral dissolves the aqueous components are swept away and replaced by a new batch of water_3; as soon as mineral precipitates more water_3 sweeps into the system providing a limitless source of aqueous components (in set ratios) at 70degC
# The results depend on the kinetic rates used and these are recognised to be poorly constrained by experiment
[UserObjects<<<{"href": "../../../syntax/UserObjects/index.html"}>>>]
[rate_Albite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Albite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 69.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Anhydrite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Anhydrite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-7
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 14.3E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Anorthite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Anorthite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-13
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 17.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Calcite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Calcite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-10
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 23.5E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Chalcedony]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Chalcedony
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 90.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Clinochl-7A]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Clinochl-7A
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 88.0E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Illite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Illite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 29E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_K-feldspar]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = K-feldspar
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 38E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Kaolinite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Kaolinite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22.2E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Quartz]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Quartz
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 90.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Paragonite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Paragonite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Phlogopite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Phlogopite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Laumontite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Laumontite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-15
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 17.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Zoisite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Zoisite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-16
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 66.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[definition]
type = GeochemicalModelDefinition<<<{"description": "User object that parses a geochemical database file, and only retains information relevant to the current geochemical model", "href": "../../../source/userobjects/GeochemicalModelDefinition.html"}>>>
database_file<<<{"description": "The name of the geochemical database file"}>>> = '../../../../geochemistry/database/moose_geochemdb.json'
basis_species<<<{"description": "A list of basis components relevant to the aqueous-equilibrium problem. H2O must appear first in this list. These components must be chosen from the 'basis species' in the database, the sorbing sites (if any) and the decoupled redox states that are in disequilibrium (if any)."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
remove_all_extrapolated_secondary_species<<<{"description": "After reading the database file, immediately remove all secondary species that have extrapolated equilibrium constants. Sometimes these extrapolations are completely crazy and those secondary species greatly impact the results"}>>> = true
kinetic_minerals<<<{"description": "A list of minerals whose dynamics are governed by a rate law. These are not in equilibrium with the aqueous solution. All members of this list must be in the 'minerals' section of the database file."}>>> = 'Albite Anhydrite Anorthite Calcite Chalcedony Clinochl-7A Illite K-feldspar Kaolinite Quartz Paragonite Phlogopite Zoisite Laumontite'
kinetic_rate_descriptions<<<{"description": "A list of GeochemistryKineticRate UserObject names that define the kinetic rates. If a kinetic species has no rate prescribed to it, its reaction rate will be zero"}>>> = 'rate_Albite rate_Anhydrite rate_Anorthite rate_Calcite rate_Chalcedony rate_Clinochl-7A rate_Illite rate_K-feldspar rate_Kaolinite rate_Quartz rate_Paragonite rate_Phlogopite rate_Zoisite rate_Laumontite'
[]
[]
[TimeDependentReactionSolver<<<{"href": "../../../syntax/TimeDependentReactionSolver/index.html"}>>>]
model_definition<<<{"description": "The name of the GeochemicalModelDefinition user object (you must create this UserObject yourself)"}>>> = definition
geochemistry_reactor_name<<<{"description": "The name that will be given to the GeochemistryReactor UserObject built by this action"}>>> = reactor
charge_balance_species<<<{"description": "Charge balance will be enforced on this basis species. This means that its bulk mole number may be changed from the initial value you provide in order to ensure charge neutrality. After the initial swaps have been performed, this must be in the basis, and it must be provided with a bulk_composition constraint_meaning."}>>> = 'Cl-'
constraint_species<<<{"description": "Names of the species that have their values fixed to constraint_value with meaning constraint_meaning. All basis species (after swap_into_basis and swap_out_of_basis) must be provided with exactly one constraint. These constraints are used to compute the configuration during the initial problem setup, and in time-dependent simulations they may be modified as time progresses."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
# Following numbers are from water_3_out.csv
constraint_value<<<{"description": "Numerical value of the containts on constraint_species"}>>> = ' 0.99999999549877 8.0204734722945e-07 0.0001319920398478 2.8097346859027e-05 7.7328020546464e-05 2.874602030221e-05 0.00027284654762868 4.4715524787497e-12 0.0002253530818877 1.0385772502298e-05 0.00012427759434288'
constraint_meaning<<<{"description": "Meanings of the numerical values given in constraint_value. kg_solvent_water: can only be applied to H2O and units must be kg. bulk_composition: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species but not in kinetic species, and units must be moles or mass (kg, g, etc). bulk_composition_with_kinetic: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species and in kinetic species, and units must be moles or mass (kg, g, etc). free_concentration: can be applied to all basis species that are not gas and not H2O and not mineral, and represents the total amount of the basis species existing freely (not as secondary species) within the solution, and units must be molal or mass_per_kg_solvent. free_mineral: can be applied to all mineral basis species, and represents the total amount of the mineral existing freely (precipitated) within the solution, and units must be moles, mass or cm3. activity and log10activity: can be applied to basis species that are not gas and not mineral and not sorbing sites, and represents the activity of the basis species (recall pH = -log10activity), and units must be dimensionless. fugacity and log10fugacity: can be applied to gases, and units must be dimensionless"}>>> = 'kg_solvent_water free_concentration free_concentration free_concentration free_concentration free_concentration free_concentration free_concentration bulk_composition free_concentration free_concentration'
constraint_unit<<<{"description": "Units of the numerical values given in constraint_value. Dimensionless: should only be used for activity or fugacity constraints. Moles: mole number. Molal: moles per kg solvent water. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. kg_per_kg_solvent: kilograms per kg solvent water. g_per_kg_solvent: grams per kg solvent water. mg_per_kg_solvent: milligrams per kg solvent water. ug_per_kg_solvent: micrograms per kg solvent water. cm3: cubic centimeters"}>>> = ' kg molal molal molal molal molal molal molal moles molal molal'
initial_temperature<<<{"description": "The initial aqueous solution is equilibrated at this system before adding reactants, changing temperature, etc."}>>> = 70
temperature<<<{"description": "Temperature. This has two different meanings if mode!=4. (1) If no species are being added to the solution (no source_species_rates are positive) then this is the temperature of the aqueous solution. (2) If species are being added, this is the temperature of the species being added. In case (2), the final aqueous-solution temperature is computed assuming the species are added, temperature is equilibrated and then, if species are also being removed, they are removed. If you wish to add species and simultaneously alter the temperature, you will have to use a sequence of heat-add-heat-add, etc steps. In the case that mode=4, temperature is the final temperature of the aqueous solution"}>>> = 70
close_system_at_time<<<{"description": "Time at which to 'close' the system, that is, change a kg_solvent_water constraint to moles_bulk_water, and all free_molality and free_moles_mineral_species to moles_bulk_species"}>>> = 1E20 # keep the free molalities specified above for all time
kinetic_species_name<<<{"description": "Names of the kinetic species given initial values in kinetic_species_initial_value"}>>> = ' Albite Anorthite K-feldspar Quartz Phlogopite Paragonite Calcite Anhydrite Chalcedony Illite Kaolinite Clinochl-7A Zoisite Laumontite'
kinetic_species_initial_value<<<{"description": "Initial number of moles, mass or volume (depending on kinetic_species_unit) for each of the species named in kinetic_species_name"}>>> = '4.324073236492E+02 4.631370307325E+01 2.685015418378E+02 7.720095013956E+02 1.235192062541E+01 7.545461404965E-01 4.234651808835E-04 4.000485907930E-04 4.407616361072E+00 1.342524904876E+01 1.004823151125E+00 4.728132387707E-01 7.326007326007E-01 4.818116116598E-01'
kinetic_species_unit<<<{"description": "Units of the numerical values given in kinetic_species_initial_value. Moles: mole number. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. cm3: cubic centimeters"}>>> = ' moles moles moles moles moles moles moles moles moles moles moles moles moles moles'
evaluate_kinetic_rates_always<<<{"description": "If true, then, evaluate the kinetic rates at every Newton step during the solve using the current values of molality, activity, etc (ie, implement an implicit solve). If false, then evaluate the kinetic rates using the values of molality, activity, etc, at the start of the current time step (ie, implement an explicit solve)"}>>> = true # otherwise will easily "run out" of dissolving species
ramp_max_ionic_strength_initial<<<{"description": "The number of iterations over which to progressively increase the maximum ionic strength (from zero to max_ionic_strength) during the initial equilibration. Increasing this can help in convergence of the Newton process, at the cost of spending more time finding the aqueous configuration."}>>> = 0 # max_ionic_strength in such a simple problem does not need ramping
execute_console_output_on<<<{"description": "When to execute the geochemistry console output"}>>> = ''
[]
[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
type = Transient
[TimeStepper<<<{"href": "../../../syntax/Executioner/TimeStepper/index.html"}>>>]
type = FunctionDT
function = 'max(1E6, 0.3 * t)'
[]
end_time = 4E11
[]
[GlobalParams<<<{"href": "../../../syntax/GlobalParams/index.html"}>>>]
point = '0 0 0'
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[temperature]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'solution_temperature'
[]
[cm3_Albite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Albite'
[]
[cm3_Anhydrite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Anhydrite'
[]
[cm3_Anorthite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Anorthite'
[]
[cm3_Calcite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Calcite'
[]
[cm3_Chalcedony]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Chalcedony'
[]
[cm3_Clinochl-7A]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Clinochl-7A'
[]
[cm3_Illite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Illite'
[]
[cm3_K-feldspar]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_K-feldspar'
[]
[cm3_Kaolinite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Kaolinite'
[]
[cm3_Quartz]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Quartz'
[]
[cm3_Paragonite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Paragonite'
[]
[cm3_Phlogopite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Phlogopite'
[]
[cm3_Zoisite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Zoisite'
[]
[cm3_Laumontite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Laumontite'
[]
[cm3_mineral]
type = LinearCombinationPostprocessor<<<{"description": "Computes a linear combination between an arbitrary number of post-processors", "href": "../../../source/postprocessors/LinearCombinationPostprocessor.html"}>>>
pp_names<<<{"description": "List of post-processors"}>>> = 'cm3_Albite cm3_Anhydrite cm3_Anorthite cm3_Calcite cm3_Chalcedony cm3_Clinochl-7A cm3_Illite cm3_K-feldspar cm3_Kaolinite cm3_Quartz cm3_Paragonite cm3_Phlogopite cm3_Zoisite cm3_Laumontite'
pp_coefs<<<{"description": "List of linear combination coefficients for each post-processor"}>>> = '1 1 1 1 1 1 1 1 1 1 1 1 1 1'
[]
[pH]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'pH'
[]
[]
[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/combined/examples/geochem-porous_flow/forge/reservoir_and_water_3.i)The results are shown in Figure 4 and Figure 5, which should be explored keeping the baseline of Figure 1 and Figure 2 in mind.
The cool injectate causes complete dissolution of the small quantities of Anhydrite
The large quantities of Anorthite and small quantities of Calcite completely dissolve, but this could also be due to natural reservoir processes
After 100 years, the cool injectate causes gradual and complete dissolution of the small quantities of Zoisite and Laumontite
After 100 years, the small quantities of Clinochl-7A gradually dissolve, but this could also be due to natural reservoir processes
After 100 years, large quantities of Albite begin to dissolve
After 1000 years, quantities of K-feldspar begin to dissolve
Small quantities of Kaolinite precipitate, but no other minerals precipitate
The key results are:
Flushing with Water3 at 70C prevents any appreciable precipitation
Hence, the dissolution of Anorthite commencing after about 1 year, and the dissolution of Albite and K-feldspar later on lead to significant loss of mineral, and a consequential increase in porosity or fracture aperture
Once again, the results depend quite crucially on the kinetic rate constants, which are poorly constrained by experiment.

Figure 4: Change in mineral volume when Water3 at 70C is flushed through the mineral assemblage of Table 3.

Figure 5: Percentage change in mineral volume when Water3 at 70C is flushed through the mineral assemblage of Table 3.
Injection simulation without geochemistry
The simulation involves injecting cold fluid into a thin, hot subsurface confined aquifer. The PorousFlow module is used to simulate the transport of solutes and temperature. The model parameters are displayed in Table 6.
Table 6: Parameters of the porous-flow simulation
Quantity | Value |
---|---|
Aquifer thickness | 1m |
Gravity | 0 |
Reservoir initial temperature | 220C |
Reservoir initial pressure | 20MPa |
Reservoir permeability | m |
Reservoir porosity | 0.01 |
Reservoir thermal conductivity | 2.5W.m.K |
Reservoir heat capacity | 2.475MJ.K |
Injection rate | 0.25kg.s |
Injectate temperature | 70C |
Production bottomhole pressure | 20MPa |
Separation between injection and production wells | 100m |
PorousFlow operates using mass-fractions and not mole numbers, so the species concentrations in the reservoir Table 4 and injectate Table 1 must be converted, as shown in Table 7.
Table 7: Mass fractions of waters (charge-balance on Cl-)
Species | In-situ (g/kg) | In-situ (mass frac) | Injectate (Water3) | Injectate (mass frac) |
---|---|---|---|---|
Al+++ | 4.50E-05 | 4.46E-08 | 1.00E-04 | 1.00E-07 |
Ca++ | 5.87E-01 | 5.82E-04 | 3.11E-03 | 3.11E-06 |
Cl- | 4.79E+00 | 4.74E-03 | 7.99E-03 | 7.99E-06 |
H+ | 8.27E-04 | 8.20E-07 | 1.92E-04 | 1.92E-07 |
H2O | 1.00E+03 | 9.92E-01 | 1.00E+03 | 1.00 |
HCO3- | 5.96E-02 | 5.91E-05 | 2.00E-02 | 2.00E-05 |
K+ | 2.33E-01 | 2.31E-04 | 1.10E-03 | 1.10E-06 |
Mg++ | 1.55E-04 | 1.54E-07 | 7.00E-04 | 7.00E-07 |
Na+ | 2.30E+00 | 2.28E-03 | 3.03E-03 | 3.03E-06 |
SO4– | 9.60E-03 | 9.52E-06 | 9.99E-04 | 9.99E-07 |
SiO2 | 2.72E-01 | 2.69E-04 | 1.64E-02 | 1.64E-05 |
The input file that simulates this situation is (ignore the MultiApps and Transfers for the time being):
# Input file modified from RobPodgorney version
# - 2D instead of 3D with different resolution. Effectively this means a 1m height of RobPodgorney aquifer is simulated. RobPodgorney total mass flux is 2.5kg/s meaning 0.25kg/s is appropriate here
# - Celsius instead of Kelvin
# - no use of PorousFlowPointEnthalpySourceFromPostprocessor since that is not yet merged into MOOSE: a DirichletBC is used instead
# - Use of PorousFlowFullySaturated instead of PorousFlowUnsaturated, and the save_component_rate_in feature to record the change in kg of each species at each node for passing to the Geochem simulation
# - MultiApps and Transfers to transfer information between this simulation and the aquifer_geochemistry.i simulation
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[gen]
type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
nx<<<{"description": "Number of elements in the X direction"}>>> = 225
ny<<<{"description": "Number of elements in the Y direction"}>>> = 200
xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = -400
xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 500
ymin<<<{"description": "Lower Y Coordinate of the generated mesh"}>>> = -400
ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 400
[]
[injection_node]
input<<<{"description": "The mesh we want to modify"}>>> = gen
type = ExtraNodesetGenerator<<<{"description": "Creates a new node set and a new boundary made with the nodes the user provides.", "href": "../../../source/meshgenerators/ExtraNodesetGenerator.html"}>>>
new_boundary<<<{"description": "The names of the boundaries to create"}>>> = injection_node
coord<<<{"description": "The nodes with coordinates you want to be in the nodeset. Separate multple coords with ';' (Either this parameter or \"nodes\" must be supplied)."}>>> = '0 0 0'
[]
[]
[GlobalParams<<<{"href": "../../../syntax/GlobalParams/index.html"}>>>]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables<<<{"href": "../../../syntax/Variables/index.html"}>>>]
[f_H]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 8.201229858451E-07
[]
[f_Na]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 2.281094143525E-03
[]
[f_K]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 2.305489507836E-04
[]
[f_Ca]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 5.818776782059E-04
[]
[f_Mg]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 1.539513498238E-07
[]
[f_SiO2]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 2.691822196469E-04
[]
[f_Al]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 4.457519474122E-08
[]
[f_Cl]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 4.744309776594E-03
[]
[f_SO4]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 9.516650880811E-06
[]
[f_HCO3]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 5.906126982324E-05
[]
[porepressure]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 20E6
[]
[temperature]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 220 # degC
scaling<<<{"description": "Specifies a scaling factor to apply to this variable"}>>> = 1E-6 # fluid enthalpy is roughly 1E6
[]
[]
[BCs<<<{"href": "../../../syntax/BCs/index.html"}>>>]
[source_temperature]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = injection_node
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
value<<<{"description": "Value of the BC"}>>> = 70 # degC
[]
[]
[DiracKernels<<<{"href": "../../../syntax/DiracKernels/index.html"}>>>]
[inject_H]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 4.790385871045E-08
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_H
[]
[inject_Na]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 7.586252963780E-07
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Na
[]
[inject_K]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 2.746517625125E-07
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_K
[]
[inject_Ca]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 7.775129478597E-07
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Ca
[]
[inject_Mg]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 1.749872109005E-07
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Mg
[]
[inject_SiO2]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 4.100547515915E-06
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_SiO2
[]
[inject_Al]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 2.502408592080E-08
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Al
[]
[inject_Cl]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 1.997260386272E-06
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Cl
[]
[inject_SO4]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 2.497372164191E-07
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_SO4
[]
[inject_HCO3]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 5.003150992902E-06
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_HCO3
[]
[inject_H2O]
type = PorousFlowPointSourceFromPostprocessor<<<{"description": "Point source (or sink) that adds (or removes) fluid at a mass flux rate specified by a postprocessor.", "href": "../../../source/dirackernels/PorousFlowPointSourceFromPostprocessor.html"}>>>
point<<<{"description": "The x,y,z coordinates of the point source (or sink)"}>>> = ' 0 0 0'
mass_flux<<<{"description": "The postprocessor name holding the mass flux at this point in kg/s (positive is flux in, negative is flux out)"}>>> = 2.499865905987E-01
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = porepressure
[]
[produce_H]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_H
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_H
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 0
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_Na]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Na
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_Na
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 1
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_K]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_K
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_K
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 2
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_Ca]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Ca
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_Ca
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 3
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_Mg]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Mg
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_Mg
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 4
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_SiO2]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_SiO2
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_SiO2
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 5
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_Al]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Al
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_Al
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 6
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_Cl]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_Cl
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_Cl
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 7
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_SO4]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_SO4
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_SO4
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 8
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_HCO3]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = f_HCO3
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_HCO3
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 9
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[produce_H2O]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = porepressure
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_mass_H2O
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the flux will be multiplied by the nodal mass fraction for the component"}>>> = 10
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[remove_heat_at_production_well]
type = PorousFlowPeacemanBorehole<<<{"description": "Approximates a borehole in the mesh using the Peaceman approach, ie using a number of point sinks with given radii whose positions are read from a file. NOTE: if you are using PorousFlowPorosity that depends on volumetric strain, you should set strain_at_nearest_qp=true in your GlobalParams, to ensure the nodal Porosity Material uses the volumetric strain at the Dirac quadpoints, and can therefore be computed", "href": "../../../source/dirackernels/PorousFlowPeacemanBorehole.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
SumQuantityUO<<<{"description": "User Object of type=PorousFlowSumQuantity in which to place the total outflow from the line sink for each time step."}>>> = produced_heat
point_file<<<{"description": "The file containing the coordinates of the points and their weightings that approximate the line sink. The physical meaning of the weightings depend on the scenario, eg, they may be borehole radii. Each line in the file must contain a space-separated weight and coordinate, viz r x y z. For boreholes, the last point in the file is defined as the borehole bottom, where the borehole pressure is bottom_pressure. If your file contains just one point, you must also specify the line_length and line_direction parameters. Note that you will get segementation faults if your points do not lie within your mesh!"}>>> = production.bh
line_length<<<{"description": "Line length. Note this is only used if there is only one point in the point_file."}>>> = 1
bottom_p_or_t<<<{"description": "For function_of=pressure, this function is the pressure at the bottom of the borehole, otherwise it is the temperature at the bottom of the borehole."}>>> = 20E6
unit_weight<<<{"description": "(fluid_density*gravitational_acceleration) as a vector pointing downwards. Note that the borehole pressure at a given z position is bottom_p_or_t + unit_weight*(q - q_bottom), where q=(x,y,z) and q_bottom=(x,y,z) of the bottom point of the borehole. The analogous formula holds for function_of=temperature. If you don't want bottomhole pressure (or temperature) to vary in the borehole just set unit_weight=0. Typical value is = (0,0,-1E4), for water"}>>> = '0 0 0'
use_mobility<<<{"description": "Multiply the flux by the fluid mobility"}>>> = true
use_enthalpy<<<{"description": "Multiply the flux by the fluid enthalpy"}>>> = true
character<<<{"description": "If zero then borehole does nothing. If positive the borehole acts as a sink (production well) for porepressure > borehole pressure, and does nothing otherwise. If negative the borehole acts as a source (injection well) for porepressure < borehole pressure, and does nothing otherwise. The flow rate to/from the borehole is multiplied by |character|, so usually character = +/- 1, but you can specify other quantities to provide an overall scaling to the flow if you like."}>>> = 1
[]
[]
[UserObjects<<<{"href": "../../../syntax/UserObjects/index.html"}>>>]
[produced_mass_H]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_Na]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_K]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_Ca]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_Mg]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_SiO2]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_Al]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_Cl]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_SO4]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_HCO3]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_mass_H2O]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[produced_heat]
type = PorousFlowSumQuantity<<<{"description": "Records total mass flowing into a borehole", "href": "../../../source/userobjects/PorousFlowSumQuantity.html"}>>>
[]
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[heat_extracted]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_heat
[]
[approx_production_temperature]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '100 0 0'
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = temperature
[]
[mass_extracted_H]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_H
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_Na]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_Na
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_K]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_K
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_Ca]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_Ca
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_Mg]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_Mg
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_SiO2]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_SiO2
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_Al]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_Al
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_Cl]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_Cl
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_SO4]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_SO4
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_HCO3]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_HCO3
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted_H2O]
type = PorousFlowPlotQuantity<<<{"description": "Extracts the value from the PorousFlowSumQuantity UserObject", "href": "../../../source/postprocessors/PorousFlowPlotQuantity.html"}>>>
uo<<<{"description": "PorousFlowSumQuantity user object name that holds the required information"}>>> = produced_mass_H2O
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[mass_extracted]
type = LinearCombinationPostprocessor<<<{"description": "Computes a linear combination between an arbitrary number of post-processors", "href": "../../../source/postprocessors/LinearCombinationPostprocessor.html"}>>>
pp_names<<<{"description": "List of post-processors"}>>> = 'mass_extracted_H mass_extracted_Na mass_extracted_K mass_extracted_Ca mass_extracted_Mg mass_extracted_SiO2 mass_extracted_Al mass_extracted_Cl mass_extracted_SO4 mass_extracted_HCO3 mass_extracted_H2O'
pp_coefs<<<{"description": "List of linear combination coefficients for each post-processor"}>>> = '1 1 1 1 1 1 1 1 1 1 1'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end'
[]
[dt]
type = TimestepSize<<<{"description": "Reports the timestep size", "href": "../../../source/postprocessors/TimestepSize.html"}>>>
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[]
[FluidProperties<<<{"href": "../../../syntax/FluidProperties/index.html"}>>>]
[the_simple_fluid]
type = SimpleFluidProperties<<<{"description": "Fluid properties for a simple fluid with a constant bulk density", "href": "../../../source/fluidproperties/SimpleFluidProperties.html"}>>>
thermal_expansion<<<{"description": "Constant coefficient of thermal expansion (1/K)"}>>> = 2E-4
bulk_modulus<<<{"description": "Constant bulk modulus (Pa)"}>>> = 2E9
viscosity<<<{"description": "Constant dynamic viscosity (Pa.s)"}>>> = 1E-3
density0<<<{"description": "Density at zero pressure and zero temperature"}>>> = 980
cv<<<{"description": "Constant specific heat capacity at constant volume (J/kg/K)"}>>> = 4000.0
cp<<<{"description": "Constant specific heat capacity at constant pressure (J/kg/K)"}>>> = 4000.0
porepressure_coefficient<<<{"description": "The enthalpy is internal_energy + P / density * porepressure_coefficient. Physically this should be 1.0, but analytic solutions are simplified when it is zero"}>>> = 0
[]
[]
[PorousFlowFullySaturated<<<{"href": "../../../syntax/PorousFlowFullySaturated/index.html"}>>>]
coupling_type<<<{"description": "The type of simulation. For simulations involving Mechanical deformations, you will need to supply the correct Biot coefficient. For simulations involving Thermal flows, you will need an associated ConstantThermalExpansionCoefficient Material"}>>> = ThermoHydro
porepressure<<<{"description": "The name of the porepressure variable"}>>> = porepressure
temperature<<<{"description": "For isothermal simulations, this is the temperature at which fluid properties (and stress-free strains) are evaluated at. Otherwise, this is the name of the temperature variable. Units = Kelvin"}>>> = temperature
mass_fraction_vars<<<{"description": "List of variables that represent the mass fractions. With only one fluid component, this may be left empty. With N fluid components, the format is 'f_0 f_1 f_2 ... f_(N-1)'. That is, the N^th component need not be specified because f_N = 1 - (f_0 + f_1 + ... + f_(N-1)). It is best numerically to choose the N-1 mass fraction variables so that they represent the fluid components with small concentrations. This Action will associated the i^th mass fraction variable to the equation for the i^th fluid component, and the pressure variable to the N^th fluid component."}>>> = 'f_H f_Na f_K f_Ca f_Mg f_SiO2 f_Al f_Cl f_SO4 f_HCO3'
save_component_rate_in<<<{"description": "List of AuxVariables into which the rate-of-change of each fluid component at each node will be saved. There must be exactly N of these to match the N fluid components. The result will be measured in kg/s, where the kg is the mass of the fluid component at the node (or m^3/s if multiply_by_density=false). Note that this saves the result from the MassTimeDerivative Kernels, but NOT from the MassVolumetricExpansion Kernels."}>>> = 'rate_H rate_Na rate_K rate_Ca rate_Mg rate_SiO2 rate_Al rate_Cl rate_SO4 rate_HCO3 rate_H2O' # change in kg at every node / dt
fp<<<{"description": "The name of the user object for fluid properties. Only needed if fluid_properties_type = PorousFlowSingleComponentFluid"}>>> = the_simple_fluid
temperature_unit<<<{"description": "The unit of the temperature variable"}>>> = Celsius
[]
[AuxVariables<<<{"href": "../../../syntax/AuxVariables/index.html"}>>>]
[rate_H]
[]
[rate_Na]
[]
[rate_K]
[]
[rate_Ca]
[]
[rate_Mg]
[]
[rate_SiO2]
[]
[rate_Al]
[]
[rate_Cl]
[]
[rate_SO4]
[]
[rate_HCO3]
[]
[rate_H2O]
[]
[]
[Materials<<<{"href": "../../../syntax/Materials/index.html"}>>>]
[porosity]
type = PorousFlowPorosityConst<<<{"description": "This Material calculates the porosity assuming it is constant", "href": "../../../source/materials/PorousFlowPorosityConst.html"}>>>
porosity<<<{"description": "The porosity (assumed indepenent of porepressure, temperature, strain, etc, for this material). This should be a real number, or a constant monomial variable (not a linear lagrange or other kind of variable)."}>>> = 0.01
[]
[permeability]
type = PorousFlowPermeabilityConst<<<{"description": "This Material calculates the permeability tensor assuming it is constant", "href": "../../../source/materials/PorousFlowPermeabilityConst.html"}>>>
permeability<<<{"description": "The permeability tensor (usually in m^2), which is assumed constant for this material"}>>> = '1E-14 0 0 0 1E-14 0 0 0 1E-14'
[]
[thermal_conductivity]
type = PorousFlowThermalConductivityIdeal<<<{"description": "This Material calculates rock-fluid combined thermal conductivity by using a weighted sum. Thermal conductivity = dry_thermal_conductivity + S^exponent * (wet_thermal_conductivity - dry_thermal_conductivity), where S is the aqueous saturation", "href": "../../../source/materials/PorousFlowThermalConductivityIdeal.html"}>>>
dry_thermal_conductivity<<<{"description": "The thermal conductivity of the rock matrix when the aqueous saturation is zero"}>>> = '2.5 0 0 0 2.5 0 0 0 2.5'
[]
[rock_heat]
type = PorousFlowMatrixInternalEnergy<<<{"description": "This Material calculates the internal energy of solid rock grains, which is specific_heat_capacity * density * temperature. Kernels multiply this by (1 - porosity) to find the energy density of the porous rock in a rock-fluid system", "href": "../../../source/materials/PorousFlowMatrixInternalEnergy.html"}>>>
density<<<{"description": "Density of the rock grains"}>>> = 2750.0
specific_heat_capacity<<<{"description": "Specific heat capacity of the rock grains (J/kg/K)."}>>> = 900.0
[]
[]
[Preconditioning<<<{"href": "../../../syntax/Preconditioning/index.html"}>>>]
active<<<{"description": "If specified only the blocks named will be visited and made active"}>>> = typically_efficient
[typically_efficient]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
petsc_options_iname<<<{"description": "Names of PETSc name/value pairs"}>>> = '-pc_type -pc_hypre_type'
petsc_options_value<<<{"description": "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\""}>>> = ' hypre boomeramg'
[]
[strong]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
petsc_options<<<{"description": "Singleton PETSc options"}>>> = '-ksp_diagonal_scale -ksp_diagonal_scale_fix'
petsc_options_iname<<<{"description": "Names of PETSc name/value pairs"}>>> = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value<<<{"description": "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\""}>>> = ' asm ilu NONZERO 2'
[]
[probably_too_strong]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
petsc_options_iname<<<{"description": "Names of PETSc name/value pairs"}>>> = '-pc_type -pc_factor_mat_solver_package'
petsc_options_value<<<{"description": "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\""}>>> = ' lu mumps'
[]
[]
[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = Newton
end_time = 31536000 #1 year
[TimeStepper<<<{"href": "../../../syntax/Executioner/TimeStepper/index.html"}>>>]
type = SolutionTimeAdaptiveDT
dt = 500
[]
[]
[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
exodus<<<{"description": "Output the results using the default settings for Exodus output."}>>> = true
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
[MultiApps<<<{"href": "../../../syntax/MultiApps/index.html"}>>>]
[react]
type = TransientMultiApp<<<{"description": "MultiApp for performing coupled simulations with the parent and sub-application both progressing in time.", "href": "../../../source/multiapps/TransientMultiApp.html"}>>>
input_files<<<{"description": "The input file for each App. If this parameter only contains one input file it will be used for all of the Apps. When using 'positions_from_file' it is also admissable to provide one input_file per file."}>>> = aquifer_geochemistry.i
clone_master_mesh<<<{"description": "True to clone parent app mesh and use it for this MultiApp."}>>> = true
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[]
[Transfers<<<{"href": "../../../syntax/Transfers/index.html"}>>>]
[changes_due_to_flow]
type = MultiAppCopyTransfer<<<{"description": "Copies variables (nonlinear and auxiliary) between multiapps that have identical meshes.", "href": "../../../source/transfers/MultiAppCopyTransfer.html"}>>>
source_variable<<<{"description": "The variable to transfer from."}>>> = 'rate_H rate_Na rate_K rate_Ca rate_Mg rate_SiO2 rate_Al rate_Cl rate_SO4 rate_HCO3 rate_H2O temperature'
variable<<<{"description": "The auxiliary variable to store the transferred values in."}>>> = 'pf_rate_H pf_rate_Na pf_rate_K pf_rate_Ca pf_rate_Mg pf_rate_SiO2 pf_rate_Al pf_rate_Cl pf_rate_SO4 pf_rate_HCO3 pf_rate_H2O temperature'
to_multi_app<<<{"description": "The name of the MultiApp to transfer the data to"}>>> = react
[]
[massfrac_from_geochem]
type = MultiAppCopyTransfer<<<{"description": "Copies variables (nonlinear and auxiliary) between multiapps that have identical meshes.", "href": "../../../source/transfers/MultiAppCopyTransfer.html"}>>>
source_variable<<<{"description": "The variable to transfer from."}>>> = 'massfrac_H massfrac_Na massfrac_K massfrac_Ca massfrac_Mg massfrac_SiO2 massfrac_Al massfrac_Cl massfrac_SO4 massfrac_HCO3'
variable<<<{"description": "The auxiliary variable to store the transferred values in."}>>> = 'f_H f_Na f_K f_Ca f_Mg f_SiO2 f_Al f_Cl f_SO4 f_HCO3'
from_multi_app<<<{"description": "The name of the MultiApp to receive data from"}>>> = react
[]
[]
(modules/combined/examples/geochem-porous_flow/forge/porous_flow.i)Some results concerning the produced fluid are shown in Figure 6, Figure 7 and Figure 8. These figures demonstrate that:
apart at the very beginning of the simulation, the production rate equals the injection rate;
fluid break-through occurs quite rapidly — certainly in less than a month after injection commences;
thermal break-through occurs after about 6 months of injection.

Figure 6: Production rate.

Figure 7: Production fraction of SiO2(aq).

Figure 8: Production temperature.
Some contour plots are shown in Figure 9 and Figure 10. The former demonstrates the injectate fluid-breakthrough after only 1 week of injecting.

Figure 9: Mass-fraction of SiO2(aq) contour after only 1 week of injection. The green dots show the injection and production wells.

Figure 10: Temperature contour after 1 year of injection. The green dots show the injection and production wells.
Reactive transport simulation
The sections above have prepared the ground for a reactive transport simulation. The geochemistry part of the reactive-transport simulation is:
# Simulates geochemistry in the aquifer. This input file may be run in standalone fashion, which will study the natural kinetically-controlled mineral changes in the same way as natural_reservoir.i. To simulate the FORGE injection scenario, run the porous_flow.i simulation which couples to this input file using MultiApps.
# This file receives pf_rate_H pf_rate_Na pf_rate_K pf_rate_Ca pf_rate_Mg pf_rate_SiO2 pf_rate_Al pf_rate_Cl pf_rate_SO4 pf_rate_HCO3 pf_rate_H2O and temperature as AuxVariables from porous_flow.i
# The pf_rate quantities are kg/s changes of fluid-component mass at each node, but the geochemistry module expects rates-of-changes of moles at every node. Secondly, since this input file considers just 1 litre of aqueous solution at every node, the nodal_void_volume is used to convert pf_rate_* into rate_*_per_1l, which is measured in mol/s/1_litre_of_aqueous_solution.
# This file sends massfrac_H massfrac_Na massfrac_K massfrac_Ca massfrac_Mg massfrac_SiO2 massfrac_Al massfrac_Cl massfrac_SO4 massfrac_HCO3 to porous_flow.i. These are computed from the corresponding transported_* quantities.
# The results depend on the kinetic rates used and these are recognised to be poorly constrained by experiment
[UserObjects<<<{"href": "../../../syntax/UserObjects/index.html"}>>>]
[rate_Albite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Albite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 69.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Anhydrite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Anhydrite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-7
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 14.3E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Anorthite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Anorthite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-13
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 17.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Calcite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Calcite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-10
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 23.5E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Chalcedony]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Chalcedony
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 90.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Clinochl-7A]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Clinochl-7A
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 88.0E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Illite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Illite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 29E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_K-feldspar]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = K-feldspar
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 38E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Kaolinite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Kaolinite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22.2E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Quartz]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Quartz
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-18
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 90.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Paragonite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Paragonite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Phlogopite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Phlogopite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-17
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 22E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Laumontite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Laumontite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1.0E-15
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 17.8E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[rate_Zoisite]
type = GeochemistryKineticRate<<<{"description": "User object that defines a kinetic rate. Note that more than one rate can be prescribed to a single kinetic_species: the sum the individual rates defines the overall rate. GeochemistryKineticRate simply specifies the algebraic form for a kinetic rate: to actually use it in a calculation, you must use it in the GeochemicalModelDefinition. The rate is intrinsic_rate_constant * area_quantity * (optionally, mass of kinetic_species in grams) * kinetic_molality^kinetic_molal_index / (kinetic_molality^kinetic_molal_index + kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index * (product_over_promoting_species m^promoting_index / (m^promoting_index + promoting_half_saturation^promiting_index)^promoting_monod_index) * |1 - (Q/K)^theta|^eta * exp(activation_energy / R * (1/T0 - 1/T)) * Direction(1 - (Q/K)). Please see the markdown documentation for examples", "href": "../../../source/userobjects/GeochemistryKineticRate.html"}>>>
kinetic_species_name<<<{"description": "The name of the kinetic species that will be controlled by this rate"}>>> = Zoisite
intrinsic_rate_constant<<<{"description": "The intrinsic rate constant for the reaction"}>>> = 1E-16
multiply_by_mass<<<{"description": "Whether the rate should be multiplied by the kinetic_species mass (in grams)"}>>> = true
area_quantity<<<{"description": "The surface area of the kinetic species in m^2 (if multiply_by_mass = false) or the specific surface area of the kinetic species in m^2/g (if multiply_by_mass = true)"}>>> = 10
activation_energy<<<{"description": "Activation energy, in J.mol^-1, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 66.1E3
one_over_T0<<<{"description": "1/T0, in 1/Kelvin, which appears in exp(activation_energy / R * (1/T0 - 1/T))"}>>> = 0.003354
[]
[definition]
type = GeochemicalModelDefinition<<<{"description": "User object that parses a geochemical database file, and only retains information relevant to the current geochemical model", "href": "../../../source/userobjects/GeochemicalModelDefinition.html"}>>>
database_file<<<{"description": "The name of the geochemical database file"}>>> = '../../../../geochemistry/database/moose_geochemdb.json'
basis_species<<<{"description": "A list of basis components relevant to the aqueous-equilibrium problem. H2O must appear first in this list. These components must be chosen from the 'basis species' in the database, the sorbing sites (if any) and the decoupled redox states that are in disequilibrium (if any)."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
remove_all_extrapolated_secondary_species<<<{"description": "After reading the database file, immediately remove all secondary species that have extrapolated equilibrium constants. Sometimes these extrapolations are completely crazy and those secondary species greatly impact the results"}>>> = true
kinetic_minerals<<<{"description": "A list of minerals whose dynamics are governed by a rate law. These are not in equilibrium with the aqueous solution. All members of this list must be in the 'minerals' section of the database file."}>>> = 'Albite Anhydrite Anorthite Calcite Chalcedony Clinochl-7A Illite K-feldspar Kaolinite Quartz Paragonite Phlogopite Zoisite Laumontite'
kinetic_rate_descriptions<<<{"description": "A list of GeochemistryKineticRate UserObject names that define the kinetic rates. If a kinetic species has no rate prescribed to it, its reaction rate will be zero"}>>> = 'rate_Albite rate_Anhydrite rate_Anorthite rate_Calcite rate_Chalcedony rate_Clinochl-7A rate_Illite rate_K-feldspar rate_Kaolinite rate_Quartz rate_Paragonite rate_Phlogopite rate_Zoisite rate_Laumontite'
[]
[nodal_void_volume_uo]
type = NodalVoidVolume<<<{"description": "UserObject to compute the nodal void volume. Take care if you block-restrict this UserObject, since the volumes of the nodes on the block's boundary will not include any contributions from outside the block.", "href": "../../../source/userobjects/NodalVoidVolume.html"}>>>
porosity<<<{"description": "Porosity"}>>> = porosity
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end' # "initial" means this is evaluated properly for the first timestep
[]
[]
[SpatialReactionSolver<<<{"href": "../../../syntax/SpatialReactionSolver/index.html"}>>>]
model_definition<<<{"description": "The name of the GeochemicalModelDefinition user object (you must create this UserObject yourself)"}>>> = definition
geochemistry_reactor_name<<<{"description": "The name that will be given to the GeochemistryReactor UserObject built by this action"}>>> = reactor
charge_balance_species<<<{"description": "Charge balance will be enforced on this basis species. This means that its bulk mole number may be changed from the initial value you provide in order to ensure charge neutrality. After the initial swaps have been performed, this must be in the basis, and it must be provided with a bulk_composition constraint_meaning."}>>> = 'Cl-'
constraint_species<<<{"description": "Names of the species that have their values fixed to constraint_value with meaning constraint_meaning. All basis species (after swap_into_basis and swap_out_of_basis) must be provided with exactly one constraint. These constraints are used to compute the configuration during the initial problem setup, and in time-dependent simulations they may be modified as time progresses."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
# Following numbers are from water_60_to_220degC_out.csv
constraint_value<<<{"description": "Numerical value of the containts on constraint_species"}>>> = ' 1.0006383866109 9.5165072498215e-07 0.100020379171 0.0059389061065 0.011570884507621 4.6626763057447e-06 0.0045110404925255 5.8096968688789e-17 0.13500708594394 6.6523540147676e-05 7.7361407898089e-05'
constraint_meaning<<<{"description": "Meanings of the numerical values given in constraint_value. kg_solvent_water: can only be applied to H2O and units must be kg. bulk_composition: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species but not in kinetic species, and units must be moles or mass (kg, g, etc). bulk_composition_with_kinetic: can be applied to all non-gas species, and represents the total amount of the basis species contained as free species as well as the amount found in secondary species and in kinetic species, and units must be moles or mass (kg, g, etc). free_concentration: can be applied to all basis species that are not gas and not H2O and not mineral, and represents the total amount of the basis species existing freely (not as secondary species) within the solution, and units must be molal or mass_per_kg_solvent. free_mineral: can be applied to all mineral basis species, and represents the total amount of the mineral existing freely (precipitated) within the solution, and units must be moles, mass or cm3. activity and log10activity: can be applied to basis species that are not gas and not mineral and not sorbing sites, and represents the activity of the basis species (recall pH = -log10activity), and units must be dimensionless. fugacity and log10fugacity: can be applied to gases, and units must be dimensionless"}>>> = 'kg_solvent_water free_concentration free_concentration free_concentration free_concentration free_concentration free_concentration free_concentration bulk_composition free_concentration free_concentration'
constraint_unit<<<{"description": "Units of the numerical values given in constraint_value. Dimensionless: should only be used for activity or fugacity constraints. Moles: mole number. Molal: moles per kg solvent water. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. kg_per_kg_solvent: kilograms per kg solvent water. g_per_kg_solvent: grams per kg solvent water. mg_per_kg_solvent: milligrams per kg solvent water. ug_per_kg_solvent: micrograms per kg solvent water. cm3: cubic centimeters"}>>> = ' kg molal molal molal molal molal molal molal moles molal molal'
initial_temperature<<<{"description": "Temperature at which the initial system is equilibrated. This is uniform over the entire mesh."}>>> = 220
temperature<<<{"description": "Temperature"}>>> = temperature
kinetic_species_name<<<{"description": "Names of the kinetic species given initial values in kinetic_species_initial_value"}>>> = ' Albite Anorthite K-feldspar Quartz Phlogopite Paragonite Calcite Anhydrite Chalcedony Illite Kaolinite Clinochl-7A Zoisite Laumontite'
kinetic_species_initial_value<<<{"description": "Initial number of moles, mass or volume (depending on kinetic_species_unit) for each of the species named in kinetic_species_name"}>>> = '4.324073236492E+02 4.631370307325E+01 2.685015418378E+02 7.720095013956E+02 1.235192062541E+01 7.545461404965E-01 4.234651808835E-04 4.000485907930E-04 4.407616361072E+00 1.342524904876E+01 1.004823151125E+00 4.728132387707E-01 7.326007326007E-01 4.818116116598E-01'
kinetic_species_unit<<<{"description": "Units of the numerical values given in kinetic_species_initial_value. Moles: mole number. kg: kilograms. g: grams. mg: milligrams. ug: micrograms. cm3: cubic centimeters"}>>> = ' moles moles moles moles moles moles moles moles moles moles moles moles moles moles'
evaluate_kinetic_rates_always<<<{"description": "If true, then, evaluate the kinetic rates at every Newton step during the solve using the current values of molality, activity, etc (ie, implement an implicit solve). If false, then evaluate the kinetic rates using the values of molality, activity, etc, at the start of the current time step (ie, implement an explicit solve)"}>>> = true # otherwise will easily "run out" of dissolving species
source_species_names<<<{"description": "The name of the species that are added at rates given in source_species_rates. There must be an equal number of these as source_species_rates."}>>> = 'H2O H+ Na+ K+ Ca++ Mg++ SiO2(aq) Al+++ Cl- SO4-- HCO3-'
source_species_rates<<<{"description": "Rates, in mols/time_unit, of addition of the species with names given in source_species_names. A negative value corresponds to removing a species: be careful that you don't cause negative mass problems!"}>>> = 'rate_H2O_per_1l rate_H_per_1l rate_Na_per_1l rate_K_per_1l rate_Ca_per_1l rate_Mg_per_1l rate_SiO2_per_1l rate_Al_per_1l rate_Cl_per_1l rate_SO4_per_1l rate_HCO3_per_1l'
ramp_max_ionic_strength_initial<<<{"description": "The number of iterations over which to progressively increase the maximum ionic strength (from zero to max_ionic_strength) during the initial equilibration. Increasing this can help in convergence of the Newton process, at the cost of spending more time finding the aqueous configuration."}>>> = 0 # max_ionic_strength in such a simple problem does not need ramping
execute_console_output_on<<<{"description": "When to execute the geochemistry console output"}>>> = ''
add_aux_molal<<<{"description": "Add AuxVariables measured in molal units (ie mol(species)/kg(solvent_water)). These are named molal_name, where 'name' is the species name. AuxVariables are added for all species except minerals"}>>> = false # save some memory and reduce variables in output exodus
add_aux_mg_per_kg<<<{"description": "Add AuxVariables measured in mg(species)/kg(solvent_water). These are named mg_per_kg_name, where 'name' is the species name. AuxVariables are added for all species except minerals"}>>> = false # save some memory and reduce variables in output exodus
add_aux_free_mg<<<{"description": "Add AuxVariables for all minerals measured in free mg. These are named free_mg_name, where 'name' is the species name"}>>> = false # save some memory and reduce variables in output exodus
add_aux_activity<<<{"description": "Add AuxVariables that record the activity for all species (for gas species this equals the gas fugacity). These are called activity_name where 'name' is the species name."}>>> = false # save some memory and reduce variables in output exodus
add_aux_bulk_moles<<<{"description": "Add AuxVariables that record the number of bulk-composition moles for all species. Note that these will be zero for any species not currently in the basis. These are called bulk_moles_name where 'name' is the species name."}>>> = false # save some memory and reduce variables in output exodus
adaptive_timestepping<<<{"description": "Use adaptive timestepping at each node in an attempt to ensure convergence of the solver. Setting this parameter to false saves some compute time because copying of datastructures is avoided"}>>> = true
[]
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[gen]
type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 2
nx<<<{"description": "Number of elements in the X direction"}>>> = 15
ny<<<{"description": "Number of elements in the Y direction"}>>> = 10
xmin<<<{"description": "Lower X Coordinate of the generated mesh"}>>> = -100
xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 200
ymin<<<{"description": "Lower Y Coordinate of the generated mesh"}>>> = -100
ymax<<<{"description": "Upper Y Coordinate of the generated mesh"}>>> = 100
[]
[injection_node]
input<<<{"description": "The mesh we want to modify"}>>> = gen
type = ExtraNodesetGenerator<<<{"description": "Creates a new node set and a new boundary made with the nodes the user provides.", "href": "../../../source/meshgenerators/ExtraNodesetGenerator.html"}>>>
new_boundary<<<{"description": "The names of the boundaries to create"}>>> = injection_node
coord<<<{"description": "The nodes with coordinates you want to be in the nodeset. Separate multple coords with ';' (Either this parameter or \"nodes\" must be supplied)."}>>> = '0 0 0'
[]
[]
[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
type = Transient
[TimeStepper<<<{"href": "../../../syntax/Executioner/TimeStepper/index.html"}>>>]
type = FunctionDT
function = 'max(1E6, 0.3 * t)'
[]
end_time = 4E12
[]
[AuxVariables<<<{"href": "../../../syntax/AuxVariables/index.html"}>>>]
[temperature]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 220.0
[]
[porosity]
initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 0.01
[]
[nodal_void_volume]
[]
[free_cm3_Kfeldspar] # necessary because of the minus sign in K-feldspar which does not parse correctly in the porosity AuxKernel
[]
[free_cm3_Clinochl7A] # necessary because of the minus sign in Clinochl-7A which does not parse correctly in the porosity AuxKernel
[]
[pf_rate_H] # change in H mass (kg/s) at each node provided by the porous-flow simulation
[]
[pf_rate_Na]
[]
[pf_rate_K]
[]
[pf_rate_Ca]
[]
[pf_rate_Mg]
[]
[pf_rate_SiO2]
[]
[pf_rate_Al]
[]
[pf_rate_Cl]
[]
[pf_rate_SO4]
[]
[pf_rate_HCO3]
[]
[pf_rate_H2O] # change in H2O mass (kg/s) at each node provided by the porous-flow simulation
[]
[rate_H_per_1l]
[]
[rate_Na_per_1l]
[]
[rate_K_per_1l]
[]
[rate_Ca_per_1l]
[]
[rate_Mg_per_1l]
[]
[rate_SiO2_per_1l]
[]
[rate_Al_per_1l]
[]
[rate_Cl_per_1l]
[]
[rate_SO4_per_1l]
[]
[rate_HCO3_per_1l]
[]
[rate_H2O_per_1l]
[]
[transported_H]
[]
[transported_Na]
[]
[transported_K]
[]
[transported_Ca]
[]
[transported_Mg]
[]
[transported_SiO2]
[]
[transported_Al]
[]
[transported_Cl]
[]
[transported_SO4]
[]
[transported_HCO3]
[]
[transported_H2O]
[]
[transported_mass]
[]
[massfrac_H]
[]
[massfrac_Na]
[]
[massfrac_K]
[]
[massfrac_Ca]
[]
[massfrac_Mg]
[]
[massfrac_SiO2]
[]
[massfrac_Al]
[]
[massfrac_Cl]
[]
[massfrac_SO4]
[]
[massfrac_HCO3]
[]
[massfrac_H2O]
[]
[]
[AuxKernels<<<{"href": "../../../syntax/AuxKernels/index.html"}>>>]
[free_cm3_Kfeldspar]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = free_cm3_Kfeldspar
species<<<{"description": "Species name"}>>> = 'K-feldspar'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = free_cm3
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin timestep_end'
[]
[free_cm3_Clinochl7A]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = free_cm3_Clinochl7A
species<<<{"description": "Species name"}>>> = 'Clinochl-7A'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = free_cm3
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin timestep_end'
[]
[porosity_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'free_cm3_Albite free_cm3_Anhydrite free_cm3_Anorthite free_cm3_Calcite free_cm3_Chalcedony free_cm3_Clinochl7A free_cm3_Illite free_cm3_Kfeldspar free_cm3_Kaolinite free_cm3_Quartz free_cm3_Paragonite free_cm3_Phlogopite free_cm3_Zoisite free_cm3_Laumontite'
expression<<<{"description": "Parsed function expression to compute"}>>> = '1000.0 / (1000.0 + free_cm3_Albite + free_cm3_Anhydrite + free_cm3_Anorthite + free_cm3_Calcite + free_cm3_Chalcedony + free_cm3_Clinochl7A + free_cm3_Illite + free_cm3_Kfeldspar + free_cm3_Kaolinite + free_cm3_Quartz + free_cm3_Paragonite + free_cm3_Phlogopite + free_cm3_Zoisite + free_cm3_Laumontite)'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = porosity
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[nodal_void_volume_auxk]
type = NodalVoidVolumeAux<<<{"description": "Extracts information from the NodalVoidVolume UserObject and records it in the AuxVariable", "href": "../../../source/auxkernels/NodalVoidVolumeAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = nodal_void_volume
nodal_void_volume_uo<<<{"description": "The name of the NodalVoidVolume UserObject."}>>> = nodal_void_volume_uo
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'initial timestep_end' # "initial" to ensure it is properly evaluated for the first timestep
[]
[rate_H_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_H nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_H_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_H / 1.0079 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_Na_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_Na nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_Na_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_Na / 22.9898 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_K_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_K nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_K_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_K / 39.0983 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_Ca_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_Ca nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_Ca_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_Ca / 40.08 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_Mg_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_Mg nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_Mg_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_Mg / 24.305 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_SiO2_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_SiO2 nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_SiO2_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_SiO2 / 60.0843 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_Al_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_Al nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_Al_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_Al / 26.9815 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_Cl_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_Cl nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_Cl_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_Cl / 35.453 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_SO4_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_SO4 nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_SO4_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_SO4 / 96.0576 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_HCO3_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_HCO3 nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_HCO3_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_HCO3 / 61.0171 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[rate_H2O_per_1l_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'pf_rate_H2O nodal_void_volume'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = rate_H2O_per_1l
expression<<<{"description": "Parsed function expression to compute"}>>> = 'pf_rate_H2O / 18.01801802 / nodal_void_volume'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_H_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_H
species<<<{"description": "Species name"}>>> = 'H+'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_Na_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Na
species<<<{"description": "Species name"}>>> = 'Na+'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_K_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_K
species<<<{"description": "Species name"}>>> = 'K+'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_Ca_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Ca
species<<<{"description": "Species name"}>>> = 'Ca++'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_Mg_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Mg
species<<<{"description": "Species name"}>>> = 'Mg++'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_SiO2_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_SiO2
species<<<{"description": "Species name"}>>> = 'SiO2(aq)'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_Al_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Al
species<<<{"description": "Species name"}>>> = 'Al+++'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_Cl_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_Cl
species<<<{"description": "Species name"}>>> = 'Cl-'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_SO4_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_SO4
species<<<{"description": "Species name"}>>> = 'SO4--'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_HCO3_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_HCO3
species<<<{"description": "Species name"}>>> = 'HCO3-'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_H2O_auxk]
type = GeochemistryQuantityAux<<<{"description": "Extracts information from the Reactor and records it in the AuxVariable", "href": "../../../source/auxkernels/GeochemistryQuantityAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_H2O
species<<<{"description": "Species name"}>>> = 'H2O'
quantity<<<{"description": "Type of quantity to output. These are available for non-kinetic species: activity (which equals fugacity for gases); bulk moles (this will be zero if the species is not in the basis); neglog10a = -log10(activity); transported_moles_in_original_basis (will throw an error if species is not in original basis). These are available only for non-kinetic non-minerals: molal = mol(species)/kg(solvent_water); mg_per_kg = mg(species)/kg(solvent_water). These are available only for minerals: free_mg = free mg; free_cm3 = free cubic-centimeters; moles_dumped = moles dumped when special dump and flow-through modes are active. These are available for minerals that host sorbing sites: surface_charge (C/m^2); surface_potential (V). These are available for kinetic species: kinetic_moles; kinetic_additions (-dt * rate = mole increment in kinetic species for this timestep). If quantity=temperature, then the 'species' is ignored and the AuxVariable will record the aqueous solution temperature in degC"}>>> = transported_moles_in_original_basis
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_begin'
[]
[transported_mass_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = ' transported_H transported_Na transported_K transported_Ca transported_Mg transported_SiO2 transported_Al transported_Cl transported_SO4 transported_HCO3 transported_H2O'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = transported_mass
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_H * 1.0079 + transported_Cl * 35.453 + transported_SO4 * 96.0576 + transported_HCO3 * 61.0171 + transported_SiO2 * 60.0843 + transported_Al * 26.9815 + transported_Ca * 40.08 + transported_Mg * 24.305 + transported_K * 39.0983 + transported_Na * 22.9898 + transported_H2O * 18.01801802'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_H_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_H transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_H
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_H * 1.0079 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_Na_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_Na transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_Na
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_Na * 22.9898 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_K_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_K transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_K
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_K * 39.0983 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_Ca_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_Ca transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_Ca
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_Ca * 40.08 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_Mg_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_Mg transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_Mg
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_Mg * 24.305 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_SiO2_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_SiO2 transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_SiO2
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_SiO2 * 60.0843 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_Al_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_Al transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_Al
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_Al * 26.9815 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_Cl_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_Cl transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_Cl
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_Cl * 35.453 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_SO4_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_SO4 transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_SO4
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_SO4 * 96.0576 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_HCO3_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_HCO3 transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_HCO3
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_HCO3 * 61.0171 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[massfrac_H2O_auxk]
type = ParsedAux<<<{"description": "Sets a field variable value to the evaluation of a parsed expression.", "href": "../../../source/auxkernels/ParsedAux.html"}>>>
coupled_variables<<<{"description": "Vector of coupled variable names"}>>> = 'transported_H2O transported_mass'
variable<<<{"description": "The name of the variable that this object applies to"}>>> = massfrac_H2O
expression<<<{"description": "Parsed function expression to compute"}>>> = 'transported_H2O * 18.01801802 / transported_mass'
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = 'timestep_end'
[]
[]
[GlobalParams<<<{"href": "../../../syntax/GlobalParams/index.html"}>>>]
point = '0 0 0'
reactor = reactor
[]
[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
[temperature]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'solution_temperature'
[]
[porosity]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = porosity
[]
[solution_temperature]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = solution_temperature
[]
[massfrac_H]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_H
[]
[massfrac_Na]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_Na
[]
[massfrac_K]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_K
[]
[massfrac_Ca]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_Ca
[]
[massfrac_Mg]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_Mg
[]
[massfrac_SiO2]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_SiO2
[]
[massfrac_Al]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_Al
[]
[massfrac_Cl]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_Cl
[]
[massfrac_SO4]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_SO4
[]
[massfrac_HCO3]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_HCO3
[]
[massfrac_H2O]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = massfrac_H2O
[]
[cm3_Albite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Albite'
[]
[cm3_Anhydrite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Anhydrite'
[]
[cm3_Anorthite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Anorthite'
[]
[cm3_Calcite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Calcite'
[]
[cm3_Chalcedony]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Chalcedony'
[]
[cm3_Clinochl-7A]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Clinochl-7A'
[]
[cm3_Illite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Illite'
[]
[cm3_K-feldspar]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_K-feldspar'
[]
[cm3_Kaolinite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Kaolinite'
[]
[cm3_Quartz]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Quartz'
[]
[cm3_Paragonite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Paragonite'
[]
[cm3_Phlogopite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Phlogopite'
[]
[cm3_Zoisite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Zoisite'
[]
[cm3_Laumontite]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'free_cm3_Laumontite'
[]
[cm3_mineral]
type = LinearCombinationPostprocessor<<<{"description": "Computes a linear combination between an arbitrary number of post-processors", "href": "../../../source/postprocessors/LinearCombinationPostprocessor.html"}>>>
pp_names<<<{"description": "List of post-processors"}>>> = 'cm3_Albite cm3_Anhydrite cm3_Anorthite cm3_Calcite cm3_Chalcedony cm3_Clinochl-7A cm3_Illite cm3_K-feldspar cm3_Kaolinite cm3_Quartz cm3_Paragonite cm3_Phlogopite cm3_Zoisite cm3_Laumontite'
pp_coefs<<<{"description": "List of linear combination coefficients for each post-processor"}>>> = '1 1 1 1 1 1 1 1 1 1 1 1 1 1'
[]
[pH]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../source/postprocessors/PointValue.html"}>>>
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = 'pH'
[]
[]
[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
[exo]
type = Exodus<<<{"description": "Object for output data in the Exodus format", "href": "../../../source/outputs/Exodus.html"}>>>
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = final
[]
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(modules/combined/examples/geochem-porous_flow/forge/aquifer_geochemistry.i)Exploring this input file reveals:
about half the file is virtually identical to the
natural_reservoir.i
simulation studied above that simulates the in-situ kinetics without the influence of an injectatethe other half of the input file involves the interface with the
porous_flow.i
simulation.
The PorousFlow simulation (listed in the previous section) controls the flow of aqueous species, and interfaces with the aquifer-geochemistry simulation.
The PorousFlow simulation provides the AuxVariables called
pf_rate_H
,pf_rate_Na
,pf_rate_K
, etc. These are the changes of mass of each species at each node.The PorousFlow simulation also provides an AuxVariable
temperature
that specifies the temperature at each node.Since the
pf_rate_*
variables have units kg.s but the Geochemistry module expects rates-of-changes of moles, a conversion must take place. Secondly, the aquifer-geochemistry simulation considers just 1 litre of aqueous solution at every node, so thenodal_void_volume
(amount of fluid at each node) is used in the conversion:
[rate_H_per_1l_auxk]
type = ParsedAux
coupled_variables = 'pf_rate_H nodal_void_volume'
variable = rate_H_per_1l
expression = 'pf_rate_H / 1.0079 / nodal_void_volume'
execute_on = 'timestep_begin'
[]
(modules/combined/examples/geochem-porous_flow/forge/aquifer_geochemistry.i)The
geochemistry
code solves the geochemical system at each node, which depends on the rates of source species (rate_*_per_1l
) and the kinetics.The mass-fraction of each species at each node is computed from the transported mole numbers, and sent back to the
porous_flow.i
simulation in order for the next step of transport:
[transported_mass_auxk]
type = ParsedAux
coupled_variables = ' transported_H transported_Na transported_K transported_Ca transported_Mg transported_SiO2 transported_Al transported_Cl transported_SO4 transported_HCO3 transported_H2O'
variable = transported_mass
expression = 'transported_H * 1.0079 + transported_Cl * 35.453 + transported_SO4 * 96.0576 + transported_HCO3 * 61.0171 + transported_SiO2 * 60.0843 + transported_Al * 26.9815 + transported_Ca * 40.08 + transported_Mg * 24.305 + transported_K * 39.0983 + transported_Na * 22.9898 + transported_H2O * 18.01801802'
execute_on = 'timestep_end'
[]
[massfrac_H_auxk]
type = ParsedAux
coupled_variables = 'transported_H transported_mass'
variable = massfrac_H
expression = 'transported_H * 1.0079 / transported_mass'
execute_on = 'timestep_end'
[]
(modules/combined/examples/geochem-porous_flow/forge/aquifer_geochemistry.i)Some results are shown in Figure 11 to Figure 16. The following may be surmised from these figures.
The regions 50m from the injection well, and between the two wells experience temperature changes.
The region with approximately 300m from the wells is impacted by the injectate fluid chemistry. The impacts are more obvious for some species than others.
The porosity decreases in response to the injectate, but it appears that porosity changes in response to cool injectate more than heated injectate.

Figure 11: Temperature contour after 1 year of injection in the reactive-transport simulation. The green dots show the injection and production wells and the black ring is the 100C contour.

Figure 12: Porosity contour after 1 year of injection in the reactive-transport simulation. The green dots show the injection and production wells and the black ring is the 100C contour.

Figure 13: Contour of free Albite volume after 1 year of injection in the reactive-transport simulation. The green dots show the injection and production wells and the black ring is the 100C contour.

Figure 14: Contour of pH after 1 year of injection in the reactive-transport simulation. The green dots show the injection and production wells and the black ring is the 100C contour.

Figure 15: Contour of SiO2(aq) mass fraction after 1 year of injection in the reactive-transport simulation. The green dots show the injection and production wells and the black ring is the 100C contour.

Figure 16: Contour of SO4– mass fraction after 1 year of injection in the reactive-transport simulation. The green dots show the injection and production wells and the black ring is the 100C contour.
References
- J. L. Palandri and Y. K. Kharaka.
A compilation of rate parameters of water-mineral interaction kinetics for application to geochemical modelling.
Technical Report OF 2004-1068, U.S. Geological Survey, 2004.
URL: https://pubs.usgs.gov/of/2004/1068/.[BibTeX]
- Vivek Patel and Stuart Simmons.
Subtask 2C.4.7 Geochemical Modeling of Water-Rock Interactions.
Technical Report, University of Utah, 2020.[BibTeX]