From 2208be5a54d5de0902ef435be1191959cf5b5aa1 Mon Sep 17 00:00:00 2001 From: Ben Spencer Date: Wed, 5 May 2021 12:58:20 -0600 Subject: [PATCH] Remove species transport models ref #171 This functionality will need to be provided by the geochemistry module. --- .../actions/SetReactionNetworkAction.md | 14 - .../kernels/PrimaryAqueousSpeciesDiffusion.md | 18 - .../PrimaryAqueousSpeciesTimeIntegration.md | 18 - .../SecondaryAqueousSpeciesDiffusion.md | 18 - .../SecondaryAqueousSpeciesTimeIntegration.md | 18 - doc/content/syntax/ReactionNetwork/index.md | 10 - include/actions/SetReactionNetworkAction.h | 35 - .../kernels/MineralSolutionTimeIntegration.h | 63 -- .../kernels/PrimaryAqueousSpeciesDiffusion.h | 57 -- .../PrimaryAqueousSpeciesTimeIntegration.h | 63 -- .../SecondaryAqueousSpeciesDiffusion.h | 83 --- .../SecondaryAqueousSpeciesTimeIntegration.h | 78 --- include/materials/ConcreteThermalMoisture.h | 14 - src/actions/SetReactionNetworkAction.C | 621 ------------------ src/kernels/MineralSolutionTimeIntegration.C | 65 -- src/kernels/PrimaryAqueousSpeciesDiffusion.C | 64 -- .../PrimaryAqueousSpeciesTimeIntegration.C | 65 -- .../SecondaryAqueousSpeciesDiffusion.C | 190 ------ .../SecondaryAqueousSpeciesTimeIntegration.C | 116 ---- src/materials/ConcreteThermalMoisture.C | 56 -- src/parser/BlackBearSyntax.C | 53 +- .../gold/sulfide_attack_out.e | Bin 114584 -> 0 bytes .../concrete_sulfide_attack/sulfide_attack.i | 169 ----- test/tests/concrete_sulfide_attack/tests | 17 - 24 files changed, 1 insertion(+), 1904 deletions(-) delete mode 100644 doc/content/source/actions/SetReactionNetworkAction.md delete mode 100644 doc/content/source/kernels/PrimaryAqueousSpeciesDiffusion.md delete mode 100644 doc/content/source/kernels/PrimaryAqueousSpeciesTimeIntegration.md delete mode 100644 doc/content/source/kernels/SecondaryAqueousSpeciesDiffusion.md delete mode 100644 doc/content/source/kernels/SecondaryAqueousSpeciesTimeIntegration.md delete mode 100644 doc/content/syntax/ReactionNetwork/index.md delete mode 100644 include/actions/SetReactionNetworkAction.h delete mode 100644 include/kernels/MineralSolutionTimeIntegration.h delete mode 100644 include/kernels/PrimaryAqueousSpeciesDiffusion.h delete mode 100644 include/kernels/PrimaryAqueousSpeciesTimeIntegration.h delete mode 100644 include/kernels/SecondaryAqueousSpeciesDiffusion.h delete mode 100644 include/kernels/SecondaryAqueousSpeciesTimeIntegration.h delete mode 100644 src/actions/SetReactionNetworkAction.C delete mode 100644 src/kernels/MineralSolutionTimeIntegration.C delete mode 100644 src/kernels/PrimaryAqueousSpeciesDiffusion.C delete mode 100644 src/kernels/PrimaryAqueousSpeciesTimeIntegration.C delete mode 100644 src/kernels/SecondaryAqueousSpeciesDiffusion.C delete mode 100644 src/kernels/SecondaryAqueousSpeciesTimeIntegration.C delete mode 100644 test/tests/concrete_sulfide_attack/gold/sulfide_attack_out.e delete mode 100644 test/tests/concrete_sulfide_attack/sulfide_attack.i delete mode 100644 test/tests/concrete_sulfide_attack/tests diff --git a/doc/content/source/actions/SetReactionNetworkAction.md b/doc/content/source/actions/SetReactionNetworkAction.md deleted file mode 100644 index 3b6c8cba1..000000000 --- a/doc/content/source/actions/SetReactionNetworkAction.md +++ /dev/null @@ -1,14 +0,0 @@ - - -# SetReactionNetworkAction - -!alert construction title=Undocumented Class -The SetReactionNetworkAction has not been documented. The content contained on this page includes the -typical automatic documentation associated with an Action; however, what is contained is ultimately -determined by what is necessary to make the documentation clear for users. - -!syntax description /ReactionNetwork/SetReactionNetworkAction - -!syntax parameters /ReactionNetwork/SetReactionNetworkAction - -!bibtex bibliography diff --git a/doc/content/source/kernels/PrimaryAqueousSpeciesDiffusion.md b/doc/content/source/kernels/PrimaryAqueousSpeciesDiffusion.md deleted file mode 100644 index be5a006d5..000000000 --- a/doc/content/source/kernels/PrimaryAqueousSpeciesDiffusion.md +++ /dev/null @@ -1,18 +0,0 @@ - - -# PrimaryAqueousSpeciesDiffusion - -!alert construction title=Undocumented Class -The PrimaryAqueousSpeciesDiffusion has not been documented. The content contained on this page includes the -typical automatic documentation associated with a MooseObject; however, what is contained is -ultimately determined by what is necessary to make the documentation clear for users. - -!syntax description /Kernels/PrimaryAqueousSpeciesDiffusion - -!syntax parameters /Kernels/PrimaryAqueousSpeciesDiffusion - -!syntax inputs /Kernels/PrimaryAqueousSpeciesDiffusion - -!syntax children /Kernels/PrimaryAqueousSpeciesDiffusion - -!bibtex bibliography diff --git a/doc/content/source/kernels/PrimaryAqueousSpeciesTimeIntegration.md b/doc/content/source/kernels/PrimaryAqueousSpeciesTimeIntegration.md deleted file mode 100644 index 7ef682d7a..000000000 --- a/doc/content/source/kernels/PrimaryAqueousSpeciesTimeIntegration.md +++ /dev/null @@ -1,18 +0,0 @@ - - -# PrimaryAqueousSpeciesTimeIntegration - -!alert construction title=Undocumented Class -The PrimaryAqueousSpeciesTimeIntegration has not been documented. The content contained on this page includes the -typical automatic documentation associated with a MooseObject; however, what is contained is -ultimately determined by what is necessary to make the documentation clear for users. - -!syntax description /Kernels/PrimaryAqueousSpeciesTimeIntegration - -!syntax parameters /Kernels/PrimaryAqueousSpeciesTimeIntegration - -!syntax inputs /Kernels/PrimaryAqueousSpeciesTimeIntegration - -!syntax children /Kernels/PrimaryAqueousSpeciesTimeIntegration - -!bibtex bibliography diff --git a/doc/content/source/kernels/SecondaryAqueousSpeciesDiffusion.md b/doc/content/source/kernels/SecondaryAqueousSpeciesDiffusion.md deleted file mode 100644 index 491ab8cbc..000000000 --- a/doc/content/source/kernels/SecondaryAqueousSpeciesDiffusion.md +++ /dev/null @@ -1,18 +0,0 @@ - - -# SecondaryAqueousSpeciesDiffusion - -!alert construction title=Undocumented Class -The SecondaryAqueousSpeciesDiffusion has not been documented. The content contained on this page includes the -typical automatic documentation associated with a MooseObject; however, what is contained is -ultimately determined by what is necessary to make the documentation clear for users. - -!syntax description /Kernels/SecondaryAqueousSpeciesDiffusion - -!syntax parameters /Kernels/SecondaryAqueousSpeciesDiffusion - -!syntax inputs /Kernels/SecondaryAqueousSpeciesDiffusion - -!syntax children /Kernels/SecondaryAqueousSpeciesDiffusion - -!bibtex bibliography diff --git a/doc/content/source/kernels/SecondaryAqueousSpeciesTimeIntegration.md b/doc/content/source/kernels/SecondaryAqueousSpeciesTimeIntegration.md deleted file mode 100644 index 3fe503643..000000000 --- a/doc/content/source/kernels/SecondaryAqueousSpeciesTimeIntegration.md +++ /dev/null @@ -1,18 +0,0 @@ - - -# SecondaryAqueousSpeciesTimeIntegration - -!alert construction title=Undocumented Class -The SecondaryAqueousSpeciesTimeIntegration has not been documented. The content contained on this page includes the -typical automatic documentation associated with a MooseObject; however, what is contained is -ultimately determined by what is necessary to make the documentation clear for users. - -!syntax description /Kernels/SecondaryAqueousSpeciesTimeIntegration - -!syntax parameters /Kernels/SecondaryAqueousSpeciesTimeIntegration - -!syntax inputs /Kernels/SecondaryAqueousSpeciesTimeIntegration - -!syntax children /Kernels/SecondaryAqueousSpeciesTimeIntegration - -!bibtex bibliography diff --git a/doc/content/syntax/ReactionNetwork/index.md b/doc/content/syntax/ReactionNetwork/index.md deleted file mode 100644 index b7319d9c4..000000000 --- a/doc/content/syntax/ReactionNetwork/index.md +++ /dev/null @@ -1,10 +0,0 @@ - - -# ReactionNetwork System - -!syntax list /ReactionNetwork objects=True actions=False subsystems=False - -!syntax list /ReactionNetwork objects=False actions=False subsystems=True - -!syntax list /ReactionNetwork objects=False actions=True subsystems=False - diff --git a/include/actions/SetReactionNetworkAction.h b/include/actions/SetReactionNetworkAction.h deleted file mode 100644 index 036609f30..000000000 --- a/include/actions/SetReactionNetworkAction.h +++ /dev/null @@ -1,35 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#pragma once - -// MOOSE includes -#include "Action.h" - -// libMesh includes -#include "libmesh/fe_type.h" - - - -class SetReactionNetworkAction : public Action -{ -public: - static InputParameters validParams(); - SetReactionNetworkAction(InputParameters params); - - virtual void act(); - -protected: - const FEType _fe_type; -}; diff --git a/include/kernels/MineralSolutionTimeIntegration.h b/include/kernels/MineralSolutionTimeIntegration.h deleted file mode 100644 index 852bd1556..000000000 --- a/include/kernels/MineralSolutionTimeIntegration.h +++ /dev/null @@ -1,63 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#pragma once - -#include "TimeDerivative.h" - -/** - * Define the Kernel for a CoupledConvectionReactionSub operator that looks like: - * - * storage * delta pressure / delta t - * - * This first line is defining the name and inheriting from Kernel. - */ -class MineralSolutionTimeIntegration : public TimeDerivative -{ -public: - static InputParameters validParams(); - MineralSolutionTimeIntegration(const InputParameters & parameters); - -protected: - /** - * Responsible for computing the residual at one quadrature point - * - * This should always be defined in the .C - * @return The residual of mass accumulation of primary species concentration. - */ - virtual Real computeQpResidual(); - - /** - * Responsible for computing the diagonal block of the preconditioning matrix. - * This is essentially the partial derivative of the residual with respect to - * the variable this kernel operates on ("u"). - * - * Note that this can be an approximation or linearization. In this case it's - * not because the Jacobian of this operator is easy to calculate. - * - * This should always be defined in the .C - * @return The diagonal jacobian of mass accumulation of primary species concentration. - */ - virtual Real computeQpJacobian(); - virtual Real computeQpOffDiagJacobian(unsigned int jvar); - - /// Material property of porosity - const MaterialProperty & _porosity; - - /// coupling with the minerals subject to kinetic dissolution/precipitation - /// stochiometric weights for a reactive species in minerals - std::vector _sto_v; - /// Coupled time derivatives of mineral concentrations (stored and computed as Aux variables). - std::vector _dvals_dt; -}; diff --git a/include/kernels/PrimaryAqueousSpeciesDiffusion.h b/include/kernels/PrimaryAqueousSpeciesDiffusion.h deleted file mode 100644 index 2e3a846a5..000000000 --- a/include/kernels/PrimaryAqueousSpeciesDiffusion.h +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "Diffusion.h" - -#pragma once - -/** - * Define the Kernel for a CoupledConvectionReactionSub operator that looks like: - * - * grad (diff * grad_u) - * - * This first line is defining the name and inheriting from Kernel. - */ -class PrimaryAqueousSpeciesDiffusion : public Diffusion -{ -public: - static InputParameters validParams(); - PrimaryAqueousSpeciesDiffusion(const InputParameters & parameters); - -protected: - /** - * Responsible for computing the residual at one quadrature point - * - * This should always be defined in the .C - * @return The residual of dispersion-diffusion of primary species. - */ - virtual Real computeQpResidual(); - /** - * Responsible for computing the diagonal block of the preconditioning matrix. - * This is essentially the partial derivative of the residual with respect to - * the variable this kernel operates on ("u"). - * - * Note that this can be an approximation or linearization. In this case it's - * not because the Jacobian of this operator is easy to calculate. - * - * This should always be defined in the .C - * @return The diagonal jacobian of dispersion-diffusion of primary species. - */ - virtual Real computeQpJacobian(); - virtual Real computeQpOffDiagJacobian(unsigned int jvar); - - /// Material property of dispersion-diffusion coefficient. - const MaterialProperty & _porosity; - const MaterialProperty & _diffusivity; -}; diff --git a/include/kernels/PrimaryAqueousSpeciesTimeIntegration.h b/include/kernels/PrimaryAqueousSpeciesTimeIntegration.h deleted file mode 100644 index 3ad462f3d..000000000 --- a/include/kernels/PrimaryAqueousSpeciesTimeIntegration.h +++ /dev/null @@ -1,63 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#pragma once - -#include "TimeDerivative.h" - -/** - * Define the Kernel for a CoupledConvectionReactionSub operator that looks like: - * - * storage * delta pressure / delta t - * - * This first line is defining the name and inheriting from Kernel. - */ -class PrimaryAqueousSpeciesTimeIntegration : public TimeDerivative -{ -public: - static InputParameters validParams(); - PrimaryAqueousSpeciesTimeIntegration(const InputParameters & parameters); - -protected: - /** - * Responsible for computing the residual at one quadrature point - * - * This should always be defined in the .C - * @return The residual of mass accumulation of primary species concentration. - */ - virtual Real computeQpResidual(); - - /** - * Responsible for computing the diagonal block of the preconditioning matrix. - * This is essentially the partial derivative of the residual with respect to - * the variable this kernel operates on ("u"). - * - * Note that this can be an approximation or linearization. In this case it's - * not because the Jacobian of this operator is easy to calculate. - * - * This should always be defined in the .C - * @return The diagonal jacobian of mass accumulation of primary species concentration. - */ - virtual Real computeQpJacobian(); - virtual Real computeQpOffDiagJacobian(unsigned int jvar); - - /// Material property of porosity - const MaterialProperty & _porosity; - - // /// coupling with the minerals subject to kinetic dissolution/precipitation - // /// stochiometric weights for a reactive species in minerals - // std::vector _sto_v; - // /// Coupled time derivatives of mineral concentrations (stored and computed as Aux variables). - // std::vector _dvals_dt; -}; diff --git a/include/kernels/SecondaryAqueousSpeciesDiffusion.h b/include/kernels/SecondaryAqueousSpeciesDiffusion.h deleted file mode 100644 index 7212a9db3..000000000 --- a/include/kernels/SecondaryAqueousSpeciesDiffusion.h +++ /dev/null @@ -1,83 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "Kernel.h" - -#pragma once - -/** - * Define the Kernel for a CoupledBEEquilibriumSub operator that looks like: - * - * grad (diff * grad (weight * 10^log_k * u^sto_u * v^sto_v)). - */ -class SecondaryAqueousSpeciesDiffusion : public Kernel -{ -public: - static InputParameters validParams(); - /** - * This is the Constructor declaration AND definition. - * It is ok to have the definition in the .h if the function body - * is really small. Otherwise it should be in the .C - */ - SecondaryAqueousSpeciesDiffusion(const InputParameters & parameters); - -protected: - /** - * Responsible for computing the residual at one quadrature point - * This should always be defined in the .C - * @return The residual of dispersion-diffusion of the coupled equilibrium species. - */ - virtual Real computeQpResidual(); - - /** - * Responsible for computing the diagonal block of the preconditioning matrix. - * This is essentially the partial derivative of the residual with respect to - * the variable this kernel operates on ("u"). - * - * Note that this can be an approximation or linearization. In this case it's - * not because the Jacobian of this operator is easy to calculate. - * - * This should always be defined in the .C - * @return The diagonal jacobian of dispersion-diffusion of the coupled equilibrium species. - */ - virtual Real computeQpJacobian(); - - virtual Real computeQpOffDiagJacobian(unsigned int jvar); - -private: - /** - * Coupled things come through as std::vector _refernces_. - * - * Since this is a reference it MUST be set in the Initialization List of the - * constructor! - */ - - const MaterialProperty & _porosity; - const MaterialProperty & _diffusivity; - - /// Weight of the equilibrium species concentration in the total primary species concentration. - Real _weight; - /// Equilibrium constant for the equilibrium species in association form. - Real _log_k; - /// Stochiometric coefficient of the primary species. - Real _sto_u; - /// Stochiometric coefficiets of the coupled primary species. - std::vector _sto_v; - - std::vector _vars; - /// Coupled primary species concentrations. - std::vector _vals; - /// Coupled gradients of primary species concentrations. - std::vector _grad_vals; -}; diff --git a/include/kernels/SecondaryAqueousSpeciesTimeIntegration.h b/include/kernels/SecondaryAqueousSpeciesTimeIntegration.h deleted file mode 100644 index 69eb321ab..000000000 --- a/include/kernels/SecondaryAqueousSpeciesTimeIntegration.h +++ /dev/null @@ -1,78 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "Kernel.h" - -#pragma once - -/** - * Define the Kernel for a SecondaryAqueousSpeciesTimeIntegration operator that looks like: - * - * delta (weight * 10^log_k * u^sto_u * v^sto_v) / delta t. - */ -class SecondaryAqueousSpeciesTimeIntegration : public Kernel -{ -public: - static InputParameters validParams(); - /** - * This is the Constructor declaration AND definition. - * It is ok to have the definition in the .h if the function body - * is really small. Otherwise it should be in the .C - */ - SecondaryAqueousSpeciesTimeIntegration(const InputParameters & parameters); - -protected: - /** - * Responsible for computing the residual at one quadrature point - * This should always be defined in the .C - * @return The residual of mass accumulation of the coupled equilibrium species concentration. - */ - virtual Real computeQpResidual(); - - /** - * Responsible for computing the diagonal block of the preconditioning matrix. - * This is essentially the partial derivative of the residual with respect to - * the variable this kernel operates on ("u"). - * - * Note that this can be an approximation or linearization. In this case it's - * not because the Jacobian of this operator is easy to calculate. - * - * This should always be defined in the .C - * @return The diagonal jacobian of mass accumulation of the coupled equilibrium species - * concentration. - */ - virtual Real computeQpJacobian(); - virtual Real computeQpOffDiagJacobian(unsigned int jvar); - -private: - /// Weight of the equilibrium species concentration in the total primary species concentration. - Real _weight; - /// Equilibrium constant for the equilibrium species in association form. - Real _log_k; - /// Stochiometric coefficient of the primary species. - Real _sto_u; - /// Stochiometric coefficiets of the coupled primary species. - std::vector _sto_v; - - /// Material property of porosity. - const MaterialProperty & _porosity; - - std::vector _vars; - /// Coupled primary species concentrations. - std::vector _v_vals; - /// Coupled old values of primary species concentrations. - std::vector _v_vals_old; - /// The old values of the primary species concentration. - const VariableValue & _u_old; -}; diff --git a/include/materials/ConcreteThermalMoisture.h b/include/materials/ConcreteThermalMoisture.h index afbbbbf63..0da299c21 100644 --- a/include/materials/ConcreteThermalMoisture.h +++ b/include/materials/ConcreteThermalMoisture.h @@ -35,17 +35,6 @@ class ConcreteThermalMoisture : public Material MooseEnum _moisture_diffusivity_model; private: - Real _input_initial_diffusivity; - Real _input_initial_porosity; - Real _input_initial_permeability; - Real _input_initial_storativity; - - ///@{ minerals in matrix with potential dissolution/precipitation reactions - std::vector _mineral_molecular_weight; - std::vector _mineral_density; - std::vector _initial_mineral_conc; - ///@} - Real _water_to_cement; Real _cure_time; Real _cement_mass; @@ -97,7 +86,4 @@ class ConcreteThermalMoisture : public Material bool _has_temperature; const VariableValue & _temp; - - /// coupled to mineral concentrations(i.e., amount in porous matrix) - std::vector _vals; }; diff --git a/src/actions/SetReactionNetworkAction.C b/src/actions/SetReactionNetworkAction.C deleted file mode 100644 index 9215f2195..000000000 --- a/src/actions/SetReactionNetworkAction.C +++ /dev/null @@ -1,621 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "SetReactionNetworkAction.h" -#include "AddAuxVariableAction.h" -// #include "Parser.h" -#include "FEProblem.h" - -#include -#include -#include - -// libMesh includes -#include "libmesh/equation_systems.h" -#include "libmesh/nonlinear_implicit_system.h" -#include "libmesh/explicit_system.h" -#include "libmesh/string_to_enum.h" -#include "libmesh/fe.h" - -registerMooseAction("BlackBearApp", SetReactionNetworkAction, "add_primary_aqueous_species"); -registerMooseAction("BlackBearApp", SetReactionNetworkAction, "add_primary_species_kernels"); -registerMooseAction("BlackBearApp", SetReactionNetworkAction, "add_secondary_species_kernels"); -registerMooseAction("BlackBearApp", SetReactionNetworkAction, "add_minerals_aux_vars"); -registerMooseAction("BlackBearApp", SetReactionNetworkAction, "add_minerals_initial_conc"); -registerMooseAction("BlackBearApp", SetReactionNetworkAction, "add_minerals_kernels"); -registerMooseAction("BlackBearApp", SetReactionNetworkAction, "add_minerals_auxkernels"); - -InputParameters -SetReactionNetworkAction::validParams() -{ - InputParameters params = Action::validParams(); - params.addRequiredParam>( - "primary_aqueous_species", "The list of primary variables to add"); - params.addRequiredParam>("initial_condition", - "initial values for the primary aqueous sepcies"); - - params.addParam>("secondary_aqueous_species", - "The list of secondary aquesous species to add"); - params.addParam("aqueous_speciations", "The list of aqueous equilibrium reactions"); - - params.addParam>( - "minerals", "The list of minerals adding to the aux variables "); - params.addParam>("initial_mineral_conc", - "initial values for mineralsin mol/L of solution "); - - params.addParam>("mineral_solution_reactions", - "The list of mineral-solution reactions"); - params.addParam>("log_k", - "The list of equilibrium constants for all reactions"); - params.addParam>( - "specific_reactive_surface_area", - "The list of specific reactive surface area for all minerals, (m^2/L)"); - params.addParam>( - "kinetic_rate_constant", "The list of kinetic rate constant for all reactions, (mol/m^2/s)"); - params.addParam>( - "activation_energy", "The list of activation energy values for all reactions, (J/mol)"); - params.addParam("gas_constant", "Gas constant, 8.314 (J/mol/K)"); - params.addParam("reference_temperature", - "The list of reference temperatures for all reactions, (K)"); - params.addParam("system_temperature", - "The list of system temperatures for all reactions, (K)"); - - MooseEnum familyEnum = AddAuxVariableAction::getAuxVariableFamilies(); - params.addParam( - "family", - familyEnum, - "Specifies the family of FE shape functions to use for the q AuxVariables"); - MooseEnum orderEnum = AddAuxVariableAction::getAuxVariableOrders(); - params.addParam( - "order", - orderEnum, - "Specifies the order of the FE shape function to use for the q AuxVariables"); - - return params; -} - -SetReactionNetworkAction::SetReactionNetworkAction(InputParameters params) - : Action(params), - _fe_type(Utility::string_to_enum(getParam("order")), - Utility::string_to_enum(getParam("family"))) -{ -} - -void -SetReactionNetworkAction::act() -{ - // - // Setup primary aqeous species - // - - // add primary aqueous species - std::vector nl_vars = - getParam>("primary_aqueous_species"); - std::vector initial_vals = getParam>("initial_condition"); - std::vector aux_vars = - getParam>("secondary_aqueous_species"); - std::vector mineral_vars = getParam>("minerals"); - - if (_current_task == "add_primary_aqueous_species") - { - _console << std::endl; - _console << "*********************************************************************************" - << std::endl; - _console << "primary aqueous species: "; - - for (unsigned int i = 0; i < nl_vars.size(); i++) - { - auto params = _factory.getValidParams("MooseVariable"); - params.set("order") = - _problem->mesh().hasSecondOrderElements() ? "SECOND" : "FIRST"; - params.set("family") = "LAGRANGE"; - _problem->addVariable("MooseVariable", nl_vars[i], params); - _console << nl_vars[i] << "\t"; - } - _console << std::endl; - _console << "---------------------------------------------------------------------------------" - << std::endl; - } - // setup initial concentrations for the primary aqueous species: - else if (_current_task == "add_initial_primary_species_conc") - { - _console << std::endl; - _console << "*********************************************************************************" - << std::endl; - _console << "Initial primary species concs: "; - - for (unsigned int i = 0; i < nl_vars.size(); i++) - { - _console << initial_vals[i] << "\t"; - InputParameters params = _factory.getValidParams("ConstantIC"); - params.set("variable") = nl_vars[i]; - params.set("value") = initial_vals[i]; - _problem->addInitialCondition("ConstantIC", "ic_for" + nl_vars[i], params); - } - _console << std::endl; - _console << "---------------------------------------------------------------------------------" - << std::endl; - } - // add time integration & diffusion kernels for primary aqueous species - else if (_current_task == "add_primary_species_kernels") - { -#ifdef DEBUG - _console << std::endl; - _console << "*********************************************************************************" - << std::endl; - _console << "Adding kernels to primary aqueous species: "; -#endif - - for (unsigned int i = 0; i < nl_vars.size(); i++) - { - - InputParameters params_euler = - _factory.getValidParams("PrimaryAqueousSpeciesTimeIntegration"); - params_euler.set("variable") = nl_vars[i]; - params_euler.set("property_name") = "porosity"; - _problem->addKernel( - "PrimaryAqueousSpeciesTimeIntegration", nl_vars[i] + "_timeintegration", params_euler); - - InputParameters params_diff = _factory.getValidParams("PrimaryAqueousSpeciesDiffusion"); - params_diff.set("variable") = nl_vars[i]; - params_diff.set("property_name") = "diffusivity"; - _problem->addKernel("PrimaryAqueousSpeciesDiffusion", nl_vars[i] + "_diffusion", params_diff); - } - // _console<("first"), - // Utility::string_to_enum("lagrange")); - // _problem->addAuxVariable(aux_vars[i], fe_type); - // } - // - // _console << std::endl; - - // setup aqueous speciation reaction network - std::string reactions = getParam("aqueous_speciations"); - - // Getting ready for the parsing system - std::regex re_reactions( - "(.*?)" // the reaction network (any character until the equalibrium coefficient appears) - "\\s" // word boundary - "(" // start capture - "-?" // optional minus sign - "\\d+(?:\\.\\d*)?" // digits followed by optional decimal and more 0 or more digits - ")" // close capture - "\\b" // word boundary - "(?:\\s+|$)" // eat the whitespace - ); - std::regex re_terms("(\\S+)"); - std::regex re_coeff_and_species("(?:\\(?(.*?)\\)?)" // match the leading coefficent - "([A-Za-z].*)" // match the species - ); - - std::smatch reaction_matches; - std::smatch term_matches; - std::smatch coeff_and_species_matches; - - std::string input(reactions); - std::string single_reaction; - std::string term; - Real equal_coeff; - - std::vector> primary_participation(nl_vars.size()); - std::vector eq_species; - - std::vector eq_const; // log10K eq. constant for each aqueous reaction - std::vector> sto_u(nl_vars.size()); - std::vector> weight(nl_vars.size()); - std::vector>> sto_v(nl_vars.size()); - std::vector>> coupled_v(nl_vars.size()); - - std::vector> stos; // per aqueous speciation reaction - std::vector> - primary_aqueous_species_involved; // per aqueous speciation reaction - unsigned int n_reactions = 0; - - // Start parsing - // Going into every single reaction - _console << std::endl; - _console - << "*********************************************************************************" - << std::endl; - _console << "Aqueous sepciation reaction network:" << std::endl; - while (std::regex_search(input, reaction_matches, re_reactions)) - { - single_reaction = reaction_matches.str(1); - equal_coeff = std::stod(reaction_matches.str(2)); - n_reactions += 1; - eq_const.push_back(equal_coeff); - - // capture all of the terms - std::string species; - std::string coeff_str; - Real coeff; - int sign = 1; - bool secondary = false; - - std::vector local_stos; - std::vector local_species_list; - - // Going to find every single term in this reaction, sto_species combos and operators - while (std::regex_search(single_reaction, term_matches, re_terms)) - { - term = term_matches.str(1); - // Separating the sto from species - if (std::regex_search(term, coeff_and_species_matches, re_coeff_and_species)) - { - coeff_str = coeff_and_species_matches.str(1); - species = coeff_and_species_matches.str(2); - if (coeff_str.length()) - { - std::istringstream iss(coeff_str); - iss >> coeff; - } - else - coeff = 1.0; - - coeff *= sign; - - if (secondary) - eq_species.push_back(species); - else - { - local_stos.push_back(coeff); - local_species_list.push_back(species); - } - } - // Finding the operators and assign value of -1.0 to "-" sign - else if (term == "+" || term == "=" || term == "-") - { - if (term == "-") - { - sign = -1; - term = "+"; - } - else - sign = 1; - - if (term == "=") - secondary = true; - } - else - mooseError("Error parsing term: ", term); - - single_reaction = term_matches.suffix(); - } - - stos.push_back(local_stos); - primary_aqueous_species_involved.push_back(local_species_list); - // some useful screen out.... - // mooseAssert(stos[n_reactions-1].size() == - // primary_aqueous_species_involved[n_reactions-1], "aqueous parser not works "); - _console << n_reactions << "-th aqueous speciation reactions: "; - for (unsigned int i = 0; i < stos[n_reactions - 1].size(); ++i) - { - if (i < stos[n_reactions - 1].size() - 1) - _console << "(" << stos[n_reactions - 1][i] << ")" - << primary_aqueous_species_involved[n_reactions - 1][i] << " + "; - else - _console << "(" << stos[n_reactions - 1][i] << ")" - << primary_aqueous_species_involved[n_reactions - 1][i] << " "; - } - - _console << "<=> (1) " << eq_species[n_reactions - 1] - << " log10_K=" << eq_const[n_reactions - 1] << std::endl; - - input = reaction_matches.suffix(); - } // End parsing - - _console - << "---------------------------------------------------------------------------------" - << std::endl; - _console << std::endl; - - if (n_reactions == 0) - mooseWarning("No equilibrium aqueous speciation reaction provided!"); - else - { - // Start picking out primary species and coupled primary species and assigning corresponding - // stoichiomentric coefficients - for (unsigned int i = 0; i < nl_vars.size(); ++i) - { - sto_u[i].resize(n_reactions); - sto_v[i].resize(n_reactions); - coupled_v[i].resize(n_reactions); - weight[i].resize(n_reactions); - - primary_participation[i].resize(n_reactions, false); - for (unsigned int j = 0; j < n_reactions; ++j) - { - for (unsigned int k = 0; k < primary_aqueous_species_involved[j].size(); ++k) - if (primary_aqueous_species_involved[j][k] == nl_vars[i]) - primary_participation[i][j] = true; - - if (primary_participation[i][j]) - for (unsigned int k = 0; k < primary_aqueous_species_involved[j].size(); k++) - { - if (primary_aqueous_species_involved[j][k] == nl_vars[i]) - { - sto_u[i][j] = stos[j][k]; - weight[i][j] = stos[j][k]; // this term needs double check - } - else - { - sto_v[i][j].push_back(stos[j][k]); - coupled_v[i][j].push_back(primary_aqueous_species_involved[j][k]); - } - } - } - } - } - - for (unsigned int i = 0; i < nl_vars.size(); ++i) - { - // Adding the coupled kernels if the primary species participates in this equilibrium - // reaction - for (unsigned int j = 0; j < eq_const.size(); j++) - if (primary_participation[i][j]) - { - // Building kernels for equilbirium aqueous species - InputParameters params_sub = - _factory.getValidParams("SecondaryAqueousSpeciesTimeIntegration"); - params_sub.set("variable") = nl_vars[i]; - params_sub.set("weight") = weight[i][j]; - - params_sub.set("log_k") = eq_const[j]; - params_sub.set("sto_u") = sto_u[i][j]; - params_sub.set>("sto_v") = sto_v[i][j]; - params_sub.set>("v") = coupled_v[i][j]; - _problem->addKernel("SecondaryAqueousSpeciesTimeIntegration", - nl_vars[i] + "_" + eq_species[j] + "_sub", - params_sub); - - InputParameters params_cd = _factory.getValidParams("SecondaryAqueousSpeciesDiffusion"); - params_cd.set("variable") = nl_vars[i]; - params_cd.set("weight") = weight[i][j]; - params_cd.set("log_k") = eq_const[j]; - params_cd.set("sto_u") = sto_u[i][j]; - params_cd.set>("sto_v") = sto_v[i][j]; - params_cd.set>("v") = coupled_v[i][j]; - _problem->addKernel("SecondaryAqueousSpeciesDiffusion", - nl_vars[i] + "_" + eq_species[j] + "_cd", - params_cd); - } - } - } - } // End of setting up aqueous speciation reactions - - // - // Setup mineral-solution kinetical precipitation/dissolution reactions - // - else if (_current_task == "add_minerals_aux_vars") - { - if (_pars.isParamValid("minerals")) - { - _console << std::endl; - _console - << "*********************************************************************************" - << std::endl; - _console << "minerals reacting with aqueous solution: "; - - for (unsigned int i = 0; i < mineral_vars.size(); ++i) - { - auto params = _factory.getValidParams("MooseVariable"); - params.set("order") = - _problem->mesh().hasSecondOrderElements() ? "SECOND" : "FIRST"; - params.set("family") = "LAGRANGE"; - _problem->addAuxVariable("MooseVariable", mineral_vars[i], params); - _console << mineral_vars[i] << "\t"; - } - - _console << std::endl; - _console - << "---------------------------------------------------------------------------------" - << std::endl; - } - } - - else if (_current_task == "add_minerals_initial_conc") - { - std::vector initial_mineral_vals = getParam>("initial_mineral_conc"); - mooseAssert(initial_mineral_vals.size() == mineral_vars.size(), - "expected intitial values assigned to each mineral"); - _console << std::endl; - _console << "*********************************************************************************" - << std::endl; - _console << "Initial mineral concentrationss: "; - - for (unsigned int i = 0; i < mineral_vars.size(); ++i) - { - _console << mineral_vars[i] << "= " << initial_mineral_vals[i] << "\t"; - InputParameters params = _factory.getValidParams("ConstantIC"); - params.set("variable") = mineral_vars[i]; - params.set("value") = initial_mineral_vals[i]; - _problem->addInitialCondition("ConstantIC", "ic_for" + mineral_vars[i], params); - } - - _console << std::endl; - _console << "---------------------------------------------------------------------------------" - << std::endl; - } - - else if (_current_task == "add_minerals_kernels") - { - if (_pars.isParamValid("minerals")) - { - - std::vector mineral_reactions = - getParam>("mineral_solution_reactions"); - if (aux_vars.size() == 0) - mooseWarning("No equilibrium aqueous species provided!"); - - for (unsigned int i = 0; i < nl_vars.size(); ++i) - { - std::vector primary_participation(mineral_reactions.size(), false); - std::vector solid_kin_species(mineral_reactions.size()); - - for (unsigned int j = 0; j < mineral_reactions.size(); ++j) - { - std::vector tokens; - - // Parsing each reaction - MooseUtils::tokenize(mineral_reactions[j], tokens, 1, "+="); - - std::vector stos_coeff(tokens.size() - 1); - std::vector rxn_vars(tokens.size() - 1); - - for (unsigned int k = 0; k < tokens.size(); k++) - { - std::vector stos_vars; - MooseUtils::tokenize(tokens[k], stos_vars, 1, "()"); - if (stos_vars.size() == 2) - { - Real coef; - std::istringstream iss(stos_vars[0]); - iss >> coef; - stos_coeff[k] = coef; - rxn_vars[k] = stos_vars[1]; - // Check the participation of primary species - if (rxn_vars[k] == nl_vars[i]) - primary_participation[j] = true; - } - else - solid_kin_species[j] = stos_vars[0]; - } - // Done parsing, recorded stochiometric and variables into separate arrays - - if (primary_participation[j]) - { - std::vector mineral_weight(1); - - // Assigning the stochiometrics based on parsing - for (unsigned int m = 0; m < rxn_vars.size(); ++m) - if (rxn_vars[m] == nl_vars[i]) - mineral_weight[0] = stos_coeff[m]; - - std::vector coupled_var(1); - coupled_var[0] = solid_kin_species[j]; - _console << "Weight of mineral " << coupled_var[0] - << " to primary sepcies " + nl_vars[i] << " = " << mineral_weight[0] << "\n"; - - // Building kernels for mineral-dissolution/precipitation - InputParameters params_kin = _factory.getValidParams("MineralSolutionTimeIntegration"); - params_kin.set("variable") = nl_vars[i]; - params_kin.set>("mineral_compositions") = coupled_var; - params_kin.set>("sto_v") = mineral_weight; - - _problem->addKernel("MineralSolutionTimeIntegration", - nl_vars[i] + "_" + solid_kin_species[j] + "_kin", - params_kin); - } - } - } - } - } - else if (_current_task == "add_minerals_auxkernels") - { - if (_pars.isParamValid("minerals")) - { - std::vector mineral_reactions = - getParam>("mineral_solution_reactions"); - std::vector logk = getParam>("log_k"); - std::vector r_area = getParam>("specific_reactive_surface_area"); - std::vector ref_kconst = getParam>("kinetic_rate_constant"); - std::vector e_act = getParam>("activation_energy"); - Real gas_const = getParam("gas_constant"); - Real ref_temp = getParam("reference_temperature"); - Real sys_temp = getParam("system_temperature"); - - // NEED TO ADD AN ERROR MESSAGE IF THE SIZES OF ABOVE ARRAYS ARE NOT THE SAME // - _console << std::endl; - _console - << "*********************************************************************************" - << std::endl; - _console << "Mineral-solution interactions reaction network" << std::endl; - - for (unsigned int j = 0; j < mineral_reactions.size(); j++) - { - std::vector tokens; - std::vector solid_kin_species(mineral_reactions.size()); - - // Parsing each reaction - MooseUtils::tokenize(mineral_reactions[j], tokens, 1, "+="); - - std::vector stos_primary(tokens.size() - 1); - std::vector rxn_vars(tokens.size() - 1); - - for (unsigned int k = 0; k < tokens.size(); k++) - { - std::vector stos_vars; - MooseUtils::tokenize(tokens[k], stos_vars, 1, "()"); - if (stos_vars.size() == 2) - { - Real coef; - std::istringstream iss(stos_vars[0]); - iss >> coef; - stos_primary[k] = coef; - rxn_vars[k] = stos_vars[1]; - } - else - solid_kin_species[j] = stos_vars[0]; - } - - InputParameters params_kin = _factory.getValidParams("MineralDissolutionPrecipAux"); - params_kin.set("variable") = solid_kin_species[j]; - params_kin.set("log_k") = logk[j]; - params_kin.set("reactive_surface_area") = r_area[j]; - params_kin.set("ref_kconst") = ref_kconst[j]; - params_kin.set("e_act") = e_act[j]; - params_kin.set("gas_const") = gas_const; - params_kin.set("ref_temp") = ref_temp; - params_kin.set("sys_temp") = sys_temp; - params_kin.set>("sto_v") = stos_primary; - params_kin.set>("aqueous_species") = rxn_vars; - _problem->addAuxKernel( - "MineralDissolutionPrecipAux", "aux_" + solid_kin_species[j], params_kin); - - _console << solid_kin_species[j] << "<==>"; - - for (unsigned int k = 0; k < stos_primary.size(); k++) - { - if (k < stos_primary.size() - 1) - _console << "(" << stos_primary[k] << ")" << rxn_vars[k] << " + "; - else - _console << "(" << stos_primary[k] << ")" << rxn_vars[k] << " "; - } - - _console << " log10_K=" << logk[j] << " ref_k_const=" << ref_kconst[j] << std::endl; - } - - _console << std::endl; - _console - << "---------------------------------------------------------------------------------" - << std::endl; - } - } // End of setting up mineral precipitation & dissolution reactions -} diff --git a/src/kernels/MineralSolutionTimeIntegration.C b/src/kernels/MineralSolutionTimeIntegration.C deleted file mode 100644 index e1086576c..000000000 --- a/src/kernels/MineralSolutionTimeIntegration.C +++ /dev/null @@ -1,65 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "MineralSolutionTimeIntegration.h" -#include "Material.h" - -registerMooseObject("BlackBearApp", MineralSolutionTimeIntegration); - -InputParameters -MineralSolutionTimeIntegration::validParams() -{ - InputParameters params = TimeDerivative::validParams(); - params.addParam("property_name", "porosity", "Porosity material property"); - - params.addCoupledVar("mineral_compositions", "mineral Aux variable names involved"); - params.addParam>("sto_v", "stochiometric coefficients of reactant species"); - - return params; -} - -MineralSolutionTimeIntegration::MineralSolutionTimeIntegration(const InputParameters & parameters) - : TimeDerivative(parameters), - _porosity(getMaterialProperty(getParam("property_name"))), - _sto_v(getParam>("sto_v")) -{ - int n = coupledComponents("mineral_compositions"); - _dvals_dt.resize(n); - - for (unsigned int i = 0; i < _dvals_dt.size(); ++i) - _dvals_dt[i] = &coupledDot("mineral_compositions", i); -} - -Real -MineralSolutionTimeIntegration::computeQpResidual() -{ - Real re = 0.0; - - for (unsigned int i = 0; i < _dvals_dt.size(); ++i) - re += _porosity[_qp] * _sto_v[i] * (*_dvals_dt[i])[_qp] * _test[_i][_qp]; - - return re; -} - -Real -MineralSolutionTimeIntegration::computeQpJacobian() -{ - return 0.0; -} - -Real -MineralSolutionTimeIntegration::computeQpOffDiagJacobian(unsigned int /*jvar*/) -{ - return 0.0; -} diff --git a/src/kernels/PrimaryAqueousSpeciesDiffusion.C b/src/kernels/PrimaryAqueousSpeciesDiffusion.C deleted file mode 100644 index d2710cedb..000000000 --- a/src/kernels/PrimaryAqueousSpeciesDiffusion.C +++ /dev/null @@ -1,64 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "PrimaryAqueousSpeciesDiffusion.h" - -registerMooseObject("BlackBearApp", PrimaryAqueousSpeciesDiffusion); - -InputParameters -PrimaryAqueousSpeciesDiffusion::validParams() -{ - InputParameters params = Diffusion::validParams(); - params.addParam( - "property_name", "diffusivity", "Aqueous species diffusivity"); - return params; -} - -PrimaryAqueousSpeciesDiffusion::PrimaryAqueousSpeciesDiffusion(const InputParameters & parameters) - : Diffusion(parameters), - _porosity(getMaterialProperty("porosity")), - _diffusivity(getMaterialProperty("diffusivity")) -{ -} - -Real -PrimaryAqueousSpeciesDiffusion::computeQpResidual() -{ - // We're dereferencing the _diffusivity pointer to get to the - // material properties vector... which gives us one property - // value per quadrature point. - - // Also... we're reusing the Diffusion Kernel's residual - // so that we don't have to recode that. - // if (_u[_qp]>=0.0) - return _porosity[_qp] * _diffusivity[_qp] * Diffusion::computeQpResidual(); -} - -Real -PrimaryAqueousSpeciesDiffusion::computeQpJacobian() -{ - // We're dereferencing the _diffusivity pointer to get to the - // material properties vector... which gives us one property - // value per quadrature point. - - // Also... we're reusing the Diffusion Kernel's residual - // so that we don't have to recode that. - return _porosity[_qp] * _diffusivity[_qp] * Diffusion::computeQpJacobian(); -} - -Real -PrimaryAqueousSpeciesDiffusion::computeQpOffDiagJacobian(unsigned int /*jvar*/) -{ - return 0.0; -} diff --git a/src/kernels/PrimaryAqueousSpeciesTimeIntegration.C b/src/kernels/PrimaryAqueousSpeciesTimeIntegration.C deleted file mode 100644 index 2e84f5786..000000000 --- a/src/kernels/PrimaryAqueousSpeciesTimeIntegration.C +++ /dev/null @@ -1,65 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "PrimaryAqueousSpeciesTimeIntegration.h" -#include "Material.h" - -registerMooseObject("BlackBearApp", PrimaryAqueousSpeciesTimeIntegration); - -InputParameters -PrimaryAqueousSpeciesTimeIntegration::validParams() -{ - InputParameters params = TimeDerivative::validParams(); - params.addParam("property_name", "porosity", "Porosity material property"); - // params.addCoupledVar("mineral_compositions", "mineral Aux variable names involved"); - // params.addParam >("sto_v", "stochiometric coeff ofreactant species"); - - return params; -} - -PrimaryAqueousSpeciesTimeIntegration::PrimaryAqueousSpeciesTimeIntegration( - const InputParameters & parameters) - : TimeDerivative(parameters), _porosity(getMaterialProperty("property_name")) -// _sto_v(getParam >("sto_v")) -{ - // int n = coupledComponents("mineral_compositions"); - // _dvals_dt.resize(n); - // - // for (unsigned int i=0; i<_dvals_dt.size(); ++i) - // { - // _dvals_dt[i] = &coupledDot("mineral_compositions", i); - // } -} - -Real -PrimaryAqueousSpeciesTimeIntegration::computeQpResidual() -{ - Real re = _porosity[_qp] * TimeDerivative::computeQpResidual(); // self accumulation term - - // for (unsigned int i=0; i < _dvals_dt.size(); ++i) - // _re += _porosity[_qp] * _sto_v[i] * (*_dvals_dt[i])[_qp] * _test[_i][_qp]; - return re; -} - -Real -PrimaryAqueousSpeciesTimeIntegration::computeQpJacobian() -{ - return _porosity[_qp] * TimeDerivative::computeQpJacobian(); -} - -Real -PrimaryAqueousSpeciesTimeIntegration::computeQpOffDiagJacobian(unsigned int /*jvar*/) -{ - return 0.0; -} diff --git a/src/kernels/SecondaryAqueousSpeciesDiffusion.C b/src/kernels/SecondaryAqueousSpeciesDiffusion.C deleted file mode 100644 index 5771591e5..000000000 --- a/src/kernels/SecondaryAqueousSpeciesDiffusion.C +++ /dev/null @@ -1,190 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "SecondaryAqueousSpeciesDiffusion.h" - -registerMooseObject("BlackBearApp", SecondaryAqueousSpeciesDiffusion); - -InputParameters -SecondaryAqueousSpeciesDiffusion::validParams() -{ - InputParameters params = Kernel::validParams(); - - params.addParam( - "weight", - 1.0, - "Weight of equilibrium species concentration in the primary species concentration"); - params.addParam( - "log_k", 0.0, "Equilibrium constant of the equilbrium reaction in dissociation form"); - params.addParam("sto_u", - 1.0, - "Stochiometric coef of the primary species this kernel operates on in the " - "equilibrium reaction"); - - params.addParam>("sto_v", - "The stochiometric coefficients of coupled primary species"); - params.addCoupledVar("v", "List of coupled primary species in this equilibrium species"); - return params; -} - -SecondaryAqueousSpeciesDiffusion::SecondaryAqueousSpeciesDiffusion( - const InputParameters & parameters) - : Kernel(parameters), - _porosity(getMaterialProperty("porosity")), - _diffusivity(getMaterialProperty("diffusivity")), - _weight(getParam("weight")), - _log_k(getParam("log_k")), - _sto_u(getParam("sto_u")), - _sto_v(getParam>("sto_v")) -{ - int n = coupledComponents("v"); - _vars.resize(n); - _vals.resize(n); - _grad_vals.resize(n); - - for (unsigned int i = 0; i < _vals.size(); ++i) - { - _vars[i] = coupled("v", i); - _vals[i] = &coupledValue("v", i); - _grad_vals[i] = &coupledGradient("v", i); - } -} - -Real -SecondaryAqueousSpeciesDiffusion::computeQpResidual() -{ - RealGradient diff1 = _sto_u * std::pow(_u[_qp], _sto_u - 1.0) * _grad_u[_qp]; - if (_vals.size()) - for (unsigned int i = 0; i < _vals.size(); ++i) - diff1 *= std::pow((*_vals[i])[_qp], _sto_v[i]); - - RealGradient diff2_sum(0.0, 0.0, 0.0); - Real d_val = std::pow(_u[_qp], _sto_u); - - if (_vals.size()) - { - for (unsigned int i = 0; i < _vals.size(); ++i) - { - - RealGradient diff2 = - d_val * _sto_v[i] * std::pow((*_vals[i])[_qp], _sto_v[i] - 1.0) * (*_grad_vals[i])[_qp]; - - for (unsigned int j = 0; j < _vals.size(); ++j) - if (j != i) - diff2 *= std::pow((*_vals[j])[_qp], _sto_v[j]); - - diff2_sum += diff2; - } - } - - return _weight * std::pow(10.0, _log_k) * _porosity[_qp] * _diffusivity[_qp] * - _grad_test[_i][_qp] * (diff1 + diff2_sum); -} - -Real -SecondaryAqueousSpeciesDiffusion::computeQpJacobian() -{ - RealGradient diff1_1 = _sto_u * std::pow(_u[_qp], _sto_u - 1.0) * _grad_phi[_j][_qp]; - RealGradient diff1_2 = - _phi[_j][_qp] * _sto_u * (_sto_u - 1.0) * std::pow(_u[_qp], _sto_u - 2.0) * _grad_u[_qp]; - for (unsigned int i = 0; i < _vals.size(); ++i) - { - diff1_1 *= std::pow((*_vals[i])[_qp], _sto_v[i]); - diff1_2 *= std::pow((*_vals[i])[_qp], _sto_v[i]); - } - - const RealGradient diff1 = diff1_1 + diff1_2; - const Real d_val = _sto_u * std::pow(_u[_qp], _sto_u - 1.0) * _phi[_j][_qp]; - RealGradient diff2_sum(0.0, 0.0, 0.0); - - for (unsigned int i = 0; i < _vals.size(); ++i) - { - RealGradient diff2 = - d_val * _sto_v[i] * std::pow((*_vals[i])[_qp], _sto_v[i] - 1.0) * (*_grad_vals[i])[_qp]; - for (unsigned int j = 0; j < _vals.size(); ++j) - if (j != i) - diff2 *= std::pow((*_vals[j])[_qp], _sto_v[j]); - - diff2_sum += diff2; - } - - return _weight * std::pow(10.0, _log_k) * _porosity[_qp] * _diffusivity[_qp] * - _grad_test[_i][_qp] * (diff1 + diff2_sum); -} - -Real -SecondaryAqueousSpeciesDiffusion::computeQpOffDiagJacobian(unsigned int jvar) -{ - if (_vals.size() == 0) - return 0.0; - - RealGradient diff1 = _sto_u * std::pow(_u[_qp], _sto_u - 1.0) * _grad_u[_qp]; - for (unsigned int i = 0; i < _vals.size(); ++i) - { - if (jvar == _vars[i]) - diff1 *= _sto_v[i] * std::pow((*_vals[i])[_qp], _sto_v[i] - 1.0) * _phi[_j][_qp]; - else - diff1 *= std::pow((*_vals[i])[_qp], _sto_v[i]); - } - - Real val_u = std::pow(_u[_qp], _sto_u); - - RealGradient diff2_1(1.0, 1.0, 1.0); - RealGradient diff2_2(1.0, 1.0, 1.0); - - for (unsigned int i = 0; i < _vals.size(); ++i) - { - if (jvar == _vars[i]) - { - diff2_1 = _sto_v[i] * (_sto_v[i] - 1.0) * std::pow((*_vals[i])[_qp], _sto_v[i] - 2.0) * - _phi[_j][_qp] * (*_grad_vals[i])[_qp]; - diff2_2 = _sto_v[i] * std::pow((*_vals[i])[_qp], _sto_v[i] - 1.0) * _grad_phi[_j][_qp]; - } - } - - RealGradient diff2 = val_u * (diff2_1 + diff2_2); - for (unsigned int i = 0; i < _vals.size(); ++i) - if (jvar != _vars[i]) - diff2 *= std::pow((*_vals[i])[_qp], _sto_v[i]); - - RealGradient diff3; - RealGradient diff3_sum(0.0, 0.0, 0.0); - - Real val_jvar; - unsigned int var = libMesh::invalid_uint; - for (unsigned int i = 0; i < _vals.size(); ++i) - if (jvar == _vars[i]) - { - var = i; - val_jvar = val_u * _sto_v[i] * std::pow((*_vals[i])[_qp], _sto_v[i] - 1.0) * _phi[_j][_qp]; - } - - mooseAssert(var != libMesh::invalid_uint, "Internal error in off-diagonal coupling"); - - for (unsigned int i = 0; i < _vals.size(); ++i) - if (i != var) - { - diff3 = val_jvar * _sto_v[i] * std::pow((*_vals[i])[_qp], _sto_v[i] - 1.0) * - (*_grad_vals[i])[_qp]; - - for (unsigned int j = 0; j < _vals.size(); ++j) - if (j != var && j != i) - diff3 *= std::pow((*_vals[j])[_qp], _sto_v[j]); - - diff3_sum += diff3; - } - - return _weight * std::pow(10.0, _log_k) * _porosity[_qp] * _diffusivity[_qp] * - _grad_test[_i][_qp] * (diff1 + diff2 + diff3_sum); -} diff --git a/src/kernels/SecondaryAqueousSpeciesTimeIntegration.C b/src/kernels/SecondaryAqueousSpeciesTimeIntegration.C deleted file mode 100644 index fffd38c2e..000000000 --- a/src/kernels/SecondaryAqueousSpeciesTimeIntegration.C +++ /dev/null @@ -1,116 +0,0 @@ -/****************************************************************/ -/* DO NOT MODIFY THIS HEADER */ -/* BlackBear */ -/* */ -/* (c) 2017 Battelle Energy Alliance, LLC */ -/* ALL RIGHTS RESERVED */ -/* */ -/* Prepared by Battelle Energy Alliance, LLC */ -/* Under Contract No. DE-AC07-05ID14517 */ -/* With the U. S. Department of Energy */ -/* */ -/* See COPYRIGHT for full restrictions */ -/****************************************************************/ - -#include "SecondaryAqueousSpeciesTimeIntegration.h" -#include "Material.h" - -registerMooseObject("BlackBearApp", SecondaryAqueousSpeciesTimeIntegration); - -/** - * This function defines the valid parameters for - * this Kernel and their default values - */ -InputParameters -SecondaryAqueousSpeciesTimeIntegration::validParams() -{ - InputParameters params = Kernel::validParams(); - params.addParam("weight", 1.0, "The weight of the equilibrium species"); - params.addParam( - "log_k", - 0.0, - "The equilibrium constaant of this equilibrium species in dissociateion reaction"); - - params.addParam( - "sto_u", 1.0, "The stochiomentic coef of the primary variable this kernel operats on"); - - params.addParam>("sto_v", - "The stochiometric coefficients of coupled primary species"); - params.addCoupledVar("v", "Coupled primary species constituting the equalibrium species"); - - return params; -} - -SecondaryAqueousSpeciesTimeIntegration::SecondaryAqueousSpeciesTimeIntegration( - const InputParameters & parameters) - : Kernel(parameters), - _weight(getParam("weight")), - _log_k(getParam("log_k")), - _sto_u(getParam("sto_u")), - _sto_v(getParam>("sto_v")), - _porosity(getMaterialProperty("porosity")), - _u_old(valueOld()) -{ - unsigned int n = coupledComponents("v"); - _vars.resize(n); - _v_vals.resize(n); - _v_vals_old.resize(n); - - for (unsigned int i = 0; i < _v_vals.size(); ++i) - { - _vars[i] = coupled("v", i); - _v_vals[i] = &coupledValue("v", i); - _v_vals_old[i] = &coupledValueOld("v", i); - } -} - -Real -SecondaryAqueousSpeciesTimeIntegration::computeQpResidual() -{ - Real _val_new = std::pow(10.0, _log_k) * std::pow(_u[_qp], _sto_u); - Real _val_old = std::pow(10.0, _log_k) * std::pow(_u_old[_qp], _sto_u); - - if (_v_vals.size()) - { - for (unsigned int i = 0; i < _v_vals.size(); ++i) - { - _val_new *= std::pow((*_v_vals[i])[_qp], _sto_v[i]); - _val_old *= std::pow((*_v_vals_old[i])[_qp], _sto_v[i]); - } - } - - return _porosity[_qp] * _weight * _test[_i][_qp] * (_val_new - _val_old) / _dt; -} - -Real -SecondaryAqueousSpeciesTimeIntegration::computeQpJacobian() -{ - Real _val_new = std::pow(10.0, _log_k) * _sto_u * std::pow(_u[_qp], _sto_u - 1.0) * _phi[_j][_qp]; - - if (_v_vals.size()) - for (unsigned int i = 0; i < _v_vals.size(); ++i) - _val_new *= std::pow((*_v_vals[i])[_qp], _sto_v[i]); - - return _porosity[_qp] * _test[_i][_qp] * _weight * _val_new / _dt; -} - -Real -SecondaryAqueousSpeciesTimeIntegration::computeQpOffDiagJacobian(unsigned int jvar) -{ - Real _val_new = std::pow(10.0, _log_k) * std::pow(_u[_qp], _sto_u); - - if (_vars.size()) - { - for (unsigned int i = 0; i < _vars.size(); ++i) - { - if (jvar == _vars[i]) - _val_new *= _sto_v[i] * std::pow((*_v_vals[i])[_qp], _sto_v[i] - 1.0) * _phi[_j][_qp]; - else - _val_new *= std::pow((*_v_vals[i])[_qp], _sto_v[i]); - } - - return _porosity[_qp] * _test[_i][_qp] * _weight * _val_new / _dt; - } - else - return 0.0; -} diff --git a/src/materials/ConcreteThermalMoisture.C b/src/materials/ConcreteThermalMoisture.C index d49e0bce8..c7e0b3479 100644 --- a/src/materials/ConcreteThermalMoisture.C +++ b/src/materials/ConcreteThermalMoisture.C @@ -30,16 +30,6 @@ ConcreteThermalMoisture::validParams() InputParameters params = Material::validParams(); params.addRequiredParam( "type", "A string representing the Moose Object that is used to call this class"); - // parameters for ion diffusion through concrete & solution-mineral reactions - params.addParam("initial_diffusivity", 1.0e-9, "diffusivity of ions in medium, m^2/s"); - params.addParam("initial_porosity", 0.3, "Initial porosity of medium"); - params.addParam("initial_permeability", 1.0e-12, "Initial permeability of medium in m^2"); - params.addParam("initial_storativity", 1.0e-5, "The specific storage of porous media"); - - params.addCoupledVar("mineral_compositions", "minerals involved in reactions"); - params.addParam>("initial_mineral_conc", " mol/L of solution"); - params.addParam>("mineral_molecular_weight", "molecular weight, g/mol"); - params.addParam>("mineral_density", "The density of minerals, g/cm^3"); // parameters for thermal properties calculations MooseEnum thermal_conductivity_model("CONSTANT ASCE-1992 KODUR-2004 EUROCODE-2004", "CONSTANT"); @@ -108,15 +98,6 @@ ConcreteThermalMoisture::ConcreteThermalMoisture(const InputParameters & paramet _moisture_diffusivity_model(getParam("moisture_diffusivity_model")), - _input_initial_diffusivity(getParam("initial_diffusivity")), - _input_initial_porosity(getParam("initial_porosity")), - _input_initial_permeability(getParam("initial_permeability")), - _input_initial_storativity(getParam("initial_storativity")), - - _mineral_molecular_weight(getParam>("mineral_molecular_weight")), - _mineral_density(getParam>("mineral_density")), - _initial_mineral_conc(getParam>("initial_mineral_conc")), - _water_to_cement(getParam("water_to_cement_ratio")), _cure_time(getParam("concrete_cure_time")), @@ -165,11 +146,6 @@ ConcreteThermalMoisture::ConcreteThermalMoisture(const InputParameters & paramet _has_temperature(isCoupled("temperature")), _temp(_has_temperature ? coupledValue("temperature") : _zero) { - unsigned int n = coupledComponents("mineral_compositions"); - _vals.resize(n); - for (unsigned int i = 0; i < _vals.size(); ++i) - _vals[i] = &coupledValue("mineral_compositions", i); - if (getParam("type") == "PorousMediaBase") mooseWarning( "PorousMediaBase is being replaced by ConcreteThermalMosture. Note that in " @@ -192,38 +168,6 @@ ConcreteThermalMoisture::computeProperties() { for (unsigned int qp = 0; qp < _qrule->n_points(); ++qp) { - // Initialize the material properties from input - _porosity[qp] = _input_initial_porosity; - _permeability[qp] = _input_initial_permeability; - _diffusivity[qp] = _input_initial_diffusivity; - - if (_vals.size() > - 0) // porosity/permeability changes due to mineral precipitation or dissolution - { - Real _initial_mineral_vof = 0.0; - Real _current_mineral_vof = 0.0; - - for (unsigned int i = 0; i < _vals.size(); ++i) - { - _initial_mineral_vof += 1.0e-3 * _initial_mineral_conc[i] * _mineral_molecular_weight[i] / - _mineral_density[i] * _input_initial_porosity; - - _current_mineral_vof += 1.0e-3 * (*_vals[i])[qp] * _mineral_molecular_weight[i] / - _mineral_density[i] * _input_initial_porosity; - } - - _porosity[qp] = _input_initial_porosity - (_current_mineral_vof - _initial_mineral_vof); - - // minimum porosity allowed - if (_porosity[qp] < 1.0e-3) - _porosity[qp] = 1.0e-3; - - // Permeability changes calculated from porosity changes according to Power Law - // with an order of 5.2: k=ki* (n/ni)^5.2 - _permeability[qp] = - _input_initial_permeability * std::pow(_porosity[qp] / _input_initial_porosity, 5.2); - } - Real T = _temp[qp]; Real H = _rh[qp]; if (H < 0.0) diff --git a/src/parser/BlackBearSyntax.C b/src/parser/BlackBearSyntax.C index d8e5168ab..a56cf615a 100644 --- a/src/parser/BlackBearSyntax.C +++ b/src/parser/BlackBearSyntax.C @@ -18,58 +18,7 @@ namespace BlackBear { void -associateSyntax(Syntax & syntax, ActionFactory & /*action_factory*/) +associateSyntax(Syntax & /*syntax*/, ActionFactory & /*action_factory*/) { - registerTask("add_primary_aqueous_species", false); - addTaskDependency("add_primary_aqueous_species", "init_displaced_problem"); - addTaskDependency("setup_variable_complete", "add_primary_aqueous_species"); - - registerTask("add_initial_primary_species_conc", false); - addTaskDependency("add_initial_primary_species_conc", "set_adaptivity_options"); - addTaskDependency("add_preconditioning", "add_initial_primary_species_conc"); - - registerTask("add_primary_species_kernels", false); - addTaskDependency("add_primary_species_kernels", "add_vector_postprocessor"); - addTaskDependency("check_output", "add_primary_species_kernels"); - - registerTask("add_secondary_species_kernels", false); - addTaskDependency("add_secondary_species_kernels", "add_vector_postprocessor"); - addTaskDependency("check_output", "add_secondary_species_kernels"); - - registerTask("add_minerals_aux_vars", false); - addTaskDependency("add_minerals_aux_vars", "init_displaced_problem"); - addTaskDependency("setup_variable_complete", "add_minerals_aux_vars"); - - registerTask("add_minerals_initial_conc", false); - addTaskDependency("add_minerals_initial_conc", "set_adaptivity_options"); - addTaskDependency("add_preconditioning", "add_minerals_initial_conc"); - - registerTask("add_minerals_kernels", false); - addTaskDependency("add_minerals_kernels", "add_vector_postprocessor"); - addTaskDependency("check_output", "add_minerals_kernels"); - - registerTask("add_minerals_auxkernels", false); - addTaskDependency("add_minerals_auxkernels", "add_vector_postprocessor"); - addTaskDependency("check_output", "add_minerals_auxkernels"); - - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_primary_aqueous_species"); - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_initial_primary_species_conc"); - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_primary_species_kernels"); - - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_secondary_species_kernels"); - - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_minerals_aux_vars"); - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_minerals_initial_conc"); - - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_minerals_kernels"); - syntax.registerActionSyntax( - "SetReactionNetworkAction", "ReactionNetwork", "add_minerals_auxkernels"); } } // namespace BlackBear diff --git a/test/tests/concrete_sulfide_attack/gold/sulfide_attack_out.e b/test/tests/concrete_sulfide_attack/gold/sulfide_attack_out.e deleted file mode 100644 index fadd07ce3a48419d7fafbc0711147c0ee2c44f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114584 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 diff --git a/test/tests/concrete_sulfide_attack/sulfide_attack.i b/test/tests/concrete_sulfide_attack/sulfide_attack.i deleted file mode 100644 index 68c253657..000000000 --- a/test/tests/concrete_sulfide_attack/sulfide_attack.i +++ /dev/null @@ -1,169 +0,0 @@ -[Mesh] - type = GeneratedMesh - dim = 2 - xmin = 0.0 - ymin = 0.0 - xmax = 0.5 - ymax = 0.001 - nx = 100 - ny = 1 -[] - -[ReactionNetwork] - primary_aqueous_species = 'ca cl h na so4' - initial_condition = '1.0e-2 2.0e-2 1.0e-10 1.0e-5 1.0e-5' - - # aqueous speciations - secondary_aqueous_species = 'cacl cacl2_aq caoh caso4_aq h2so4_aq hcl_aq hso4 nacl_aq naoh_aq naso4 oh' - aqueous_speciations = '(1.0)ca + (1.0)cl = (1.0)cacl -0.7 - (1.0)ca + (2.0)cl = (1.0)cacl2_aq -0.653 - (1.0)ca + (-1.0)h = (1.0)caoh -12.85 - (1.0)ca + (1.0)so4 = (1.0)caso4_aq 2.1 - (2.0)h + (1.0)so4 = (1.0)h2so4_aq -1.021 - (1.0)h + (1.0)cl = (1.0)hcl_aq 0.7 - (1.0)h + (1.0)so4 = (1.0)hso4 1.976 - (1.0)na + (1.0)cl = (1.0)nacl_aq -0.782 - (1.0)na + (-1.0)h = (1.0)naoh_aq -14.799 - (1.0)na + (1.0)so4 = (1.0)naso4 0.82 - (-1.0)h = (1.0)oh -13.991' - # mineral-solution reactions - minerals = 'gypsum' - initial_mineral_conc = '0.0' - mineral_solution_reactions = '(1.0)ca+(1.0)so4=gypsum' - log_k = '-6' - specific_reactive_surface_area = '0.1' - kinetic_rate_constant = '6.456542e-6' - activation_energy = '1.5e4' - gas_constant = 8.314 - reference_temperature = 298.15 - system_temperature = 298.15 -[] - -[AuxVariables] - [./porosity] - order = CONSTANT - family = Monomial - [../] -[] - -[AuxKernels] - [./porosity_output] - type = MaterialRealAux - variable = porosity - property = porosity - [../] -[] - -[BCs] - [./ca_left] - type = DirichletBC - preset = false - variable = ca - boundary = 3 - value = 1.0e-2 - [../] - [./cl-_left] - type = DirichletBC - preset = false - variable = cl - boundary = 3 - value = 2.0e-2 - [../] - [./h+_left] - type = DirichletBC - preset = false - variable = h - boundary = 3 - value = 1.0e-10 - [../] - [./na+_left] - type = DirichletBC - preset = false - variable = na - boundary = 3 - value = 1.0e-5 - [../] - [./so42-_left] - type = DirichletBC - preset = false - variable = so4 - boundary = 3 - value = 1.0e-5 - [../] - -# [./ca_right] -# type = DirichletBC -# variable = ca -# boundary = 1 -# value = 1.0e-2 -# [../] - [./cl-_right] - type = DirichletBC - preset = false - variable = cl - boundary = 1 - value = 1.0e-5 - [../] -# [./h+_right] -# type = DirichletBC -# variable = h -# boundary = 1 -# value = 1.0e-10 -# [../] - [./na+_right] - type = DirichletBC - preset = false - variable = na - boundary = 1 - value = 2.0e-2 - [../] - [./so42-_right] - type = DirichletBC - preset = false - variable = so4 - boundary = 1 - value = 1.0e-2 - [../] -[] - -[Materials] - [./example] - type = ConcreteThermalMoisture - block = 0 - initial_diffusivity = 1.0e-9 - initial_porosity = 0.1 - initial_permeability = 1.0e-18 - initial_mineral_conc = 0.00 - mineral_compositions = gypsum - mineral_molecular_weight = 136.1406 - mineral_density = 2.308 - [../] -[] - -[Executioner] - type = Transient - - #Preconditioned JFNK (default) - solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_hypre_type' - petsc_options_value = 'hypre boomeramg' - - dt = 100.0 - num_steps = 5 -# dtmax = 864000.0 -# end_time = 157680000 # 5 years -# [./TimeStepper] -# type = SolutionTimeAdaptiveDT -# dt = 100.0 -# [../] - - l_max_its = 50 - l_tol = 1e-6 - nl_max_its = 10 - nl_rel_tol = 1e-6 - nl_abs_tol = 1e-15 -[] - -[Outputs] - exodus = true -[] diff --git a/test/tests/concrete_sulfide_attack/tests b/test/tests/concrete_sulfide_attack/tests deleted file mode 100644 index 4b95ff76c..000000000 --- a/test/tests/concrete_sulfide_attack/tests +++ /dev/null @@ -1,17 +0,0 @@ -[Tests] - issues = '#171' - design = 'ConcreteThermalMoisture.md ReactionNetwork/index.md' - [test] - type = 'Exodiff' - input = 'sulfide_attack.i' - exodiff = 'sulfide_attack_out.e' - requirement = 'Blackbear shall model the migration and reactions between chemical species involved in sulfide attack on concrete' - [] - [aqueous_speciations_syntax] - type = 'RunException' - input = 'sulfide_attack.i' - cli_args = 'ReactionNetwork/aqueous_speciations="(1.0)ca / (1.0)cl = (1.0)cacl -0.7"' - expect_err = 'Error parsing term: /' - requirement = 'The ReactionNetwork model shall generate an error if an incorrect form is provided for aqueous speciations' - [] -[]