NEML2 2.0.0
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
Reactive Infiltration

The reactive infiltration physics module is a collection of objects serving as building blocks for composing model's describing reactive infiltration kinetics as a solid (S) material is infiltrated by a liquid (L) to create a product (P). The framework and usage of the model is explained below, with both mathematical formulations and example input files.

Framework

Representative Volume Element

The infiltration process for a material considers a cylindrical Representative Volume Element (RVE) with radius R and span H, depicting a solid capillary of radius ro, corresponding to the initial porosity of φ0. The mathematical description of the model uses cylindrical coordinates and assumes axisymmetry around r=0.

As the liquid enters the cylinder, it reacts with a solid to form a product with thickness δP, as shown schematically in the figure below.

The (a) top and (b) cross-section view of the Representative Volume Element (RVE) of a given state of the reactive infiltration process, depicting the outer solid walls, the infiltrated liquid and the product from the chemical reaction

Throughout this process, the solid radius, ro, decreases while the product thickness, δP, increases. Let ri denote the inner radius of the product. In addition, define αi (in units of mole per volume) as the amount of substance in the RVE, and Ωi=Miρi as the molar volume of a material with molar mass Mi (in units of amu, or gram per mole) and density ρi (mass per volume), with subscripts taking L, S, and P, respectively.

The volume fraction, φi of each material is then

φi=αiΩi

and the RVE porosity (void) is

φv=1φLφPφS

Key assumptions made throughout the derivation are:

  • Liquid remains liquid over the entire course of reaction, i.e., no phase change.
  • The reaction is irreversible.
  • Formation of the initial product layer is immediate once liquid comes into contact with solid.
  • Once product is formed, reaction rate is primarily limited by the diffusion of liquid through product to the product-solid interface, with a diffusion coefficient D.
  • The product wall thickness remains uniform during the infiltration.
  • The only reaction is between the liquid and the solid.

The following nondimensionalization is applied to the constitutive model for the reactive infiltration process.

 δ¯P=δPR,r¯o=roR=1φS,r¯i=riR=1φSφP.

The complete state of the RVE is denoted by the tuple (φL,φS,φP), with αL as the prescribed force.

Mathematically, it is possible that φL+φP+φS1. Physically, this implies "overflow", aka the prescribed αL is larger than the available voids. Care must be taken at the macroscopic model to avoid or resolve this issue.

Governing Equations

The initial-value problem (IVP) corresponding to the constitutive model is

r={rφPrφS}=0,

where rφi is the residual corresponding to the volume fraction of the liquid, solid and product. The residuals are defined below. Note an implicit backward-Euler time intergration scheme is used.

  • Production rate of the product, dictates by the diffusion of the liquid through the product to react with the solid at the product-solid interface

    rφP=αP,n+1αP,ntn+1tn2ΩLDlc2r¯o+r¯ir¯or¯iRLRS

    Here RL(φL),RS(φS)[0,1] are the reactivity of liquid and solid, represented by a step function of the void fraction, φi.
  • Reaction rate of the solid, with a (solid, product) reaction coefficient, (kS,kP) respectively

    rφS=αS,n+1αS,ntn+1tn+kPkSαP,n+1αP,ntn+1tn

Implementation Details

The above governing equations are fairly general for a wide range of reactive infiltration systems within this framework given the chemical reaction kinetics with appropriate reaction coefficient ( ki) and the corresponding molar volume Ωi of the materials.

Example for determining ki and Ωi: Consider a reactive infiltration process of liquid (chemical formula Lx) and solid ( Sy), with the molar mass ML and MS. The chemical reaction creates a product with chemical formula LmSn, with reaction coefficients kS and kP.

Lx+kSSykPLmSn

For stoichiometric balance, the reaction coefficients are:

kS=xnym,kP=xm

The densities of the liquid, solid, and product are respectively ρL,ρS,ρP.

Then, the molar volume is:

ΩL=xMLρL.ΩS=yMSρS,ΩP=mML+nMSρP.

The instantaneous balance also implies that

α˙S=kPkSα˙P,

Since this constitutive model considers αL as the forcing function for the IVP problem, α˙LkPα˙P.

The following tables summarize the relationship between the mathematical expressions and NEML2 models.

Expression Model building block Syntax
r¯i=1φSφP;r¯o=1φS Product and solid's inner radius ProductGeometry
2ΩLDlc2r¯o+r¯ir¯or¯iRLRS Product reaction rate DiffusionLimitedReaction
RL;RS Step Function HermiteSmoothStep
φi=αiΩi Linear Combination
Residual Expression Syntax
rφP=αP,n+1αP,ntn+1tn2ΩLDlc2r¯o+r¯ir¯or¯iRLRS Linear Combination, Variable Rate
rφS=αS,n+1αS,ntn+1tn+kPkSαP,n+1αP,ntn+1tn Linear Combination, Variable Rate

Model Building Blocks

The RVE keeps track of the volume fraction of the liquid, solid and product, φL,φS,φP. φL directly corresponds to the prescribed liquid substance αL where φSandφP are obtained from solving the IVP problem with ImplicitUpdate.

Product and solid's inner radius

Model object ProductGeometry

This modelcalculates the product and solid's inner radius, ri,ro. Note that, when there are presence of the product, the solid' inner radius is the outer radius of the product.

r¯o=1φSr¯i=1φSφP

Example input file that defines the product and solid's inner radius

[Models]
[model]
type = ProductGeometry
solid_fraction = 'state/phi_s'
product_fraction = 'state/phi_p'
inner_radius = 'state/ri'
outer_radius = 'state/ro'
[]
[]

Product reaction rate

Model object DiffusionLimitedReaction

The reaction rates dictates the creation of the product. Within our assumptions, the growth of the product is controlled by the diffusion of the liquid through the product to react with the solid at the product-solid interface. Considered the same RVE as in figure above, with cP (units of moles) as the concentration of the product in the RVE. Diffusion equation yields

c˙P=DcP

D is the diffusion coeficient (untis of area per time) of liquid through the product. Integrating through the product's volume and applying Green's theorem,

C˙=DCliquidproductCproductsolidδPAenclosed

Here,

 C˙=α˙PVRVECproductsolid=0Cliquidproduct=α˙LVRVEφLVRVE=1ΩL Aenclosed=2π(ro+ri)HδP=rori

The step function RL(αL), RS(αS) as reactivity is introduced to supressed the production rate when either the solid or the liquid is fully consumed. Finally, in normalized variables, and let the R=lc as the characterisitc length scales of the pores features. The product reaction rate is then,

α˙P=2ΩLDlc2r¯o+r¯ir¯or¯iRLRS

Example input file that defines the product reaction rate

[Models]
[model]
type = DiffusionLimitedReaction
diffusion_coefficient = 1e-3
molar_volume = 1
product_inner_radius = 'state/ri'
solid_inner_radius = 'state/ro'
liquid_reactivity = 'state/R_l'
solid_reactivity = 'state/R_s'
reaction_rate = 'state/alpha_rate'
[]
[]

Hermite Smooth Step Function

Model object HermiteSmoothStep

A cubic Hermite interpolation after clamping is used as a smooth step function:

R(xr)={0,xr<03xr22xr3,0xr11,xr>1

where

xr=xxlxuxl

Here, xl,xu denote the lower and upper bound of the smoothen transition regime.

The Hermite Function is used in the reactive infiltration for the liquid and solid reactivity Ri

Example input file that use the smooth step function

[Models]
[model]
type = HermiteSmoothStep
argument = 'state/foo'
value = 'state/bar'
lower_bound = '0'
upper_bound = '0.05'
[]
[]

Complete Input File

A complete example input file for the reactive infiltration is shown below with the appropriate model composition.

ntime = 200
D = 1e-6
omega_Si = 12.0
omega_C = 5.3
omega_SiC = 12.5
chem_ratio = 1.0
oCm1 = 0.18867924528 # 1/Omega_C
oSiCm1 = 0.08 # 1/Omega_SiC
[Tensors]
[times]
type = LinspaceScalar
start = 0
end = 1e4
nstep = ${ntime}
[]
[alpha]
type = FullScalar
batch_shape = '(${ntime})'
value = 0.01
[]
[]
[Drivers]
[driver]
type = InfiltrationDriver
model = 'model'
prescribed_time = 'times'
time = 'forces/t'
prescribed_liquid_species_concentration = 'alpha'
liquid_species_concentration = 'forces/alpha'
ic_Scalar_names = 'state/phi_P state/phi_S state/alpha_P state/alpha_S'
ic_Scalar_values = '0 0.3 0 0.05660377358'
save_as = 'result.pt'
verbose = true
show_input_axis = true
show_output_axis = true
[]
[regression]
type = TransientRegression
driver = 'driver'
reference = 'gold/result.pt'
[]
[]
[Solvers]
[newton]
type = Newton
verbose = true
[]
[]
[Models]
[liquid_volume_fraction]
type = ScalarLinearCombination
from_var = 'forces/alpha'
to_var = 'state/phi_L'
coefficients = '${omega_Si}'
[]
[outer_radius]
type = ProductGeometry
solid_fraction = 'state/phi_S'
product_fraction = 'state/phi_P'
inner_radius = 'state/ri'
outer_radius = 'state/ro'
[]
[liquid_reactivity]
type = HermiteSmoothStep
argument = 'state/phi_L'
value = 'state/R_L'
lower_bound = 0
upper_bound = 0.1
[]
[solid_reactivity]
type = HermiteSmoothStep
argument = 'state/phi_S'
value = 'state/R_S'
lower_bound = 0
upper_bound = 0.1
[]
[reaction_rate]
type = DiffusionLimitedReaction
diffusion_coefficient = '${D}'
molar_volume = '${omega_Si}'
product_inner_radius = 'state/ri'
solid_inner_radius = 'state/ro'
liquid_reactivity = 'state/R_L'
solid_reactivity = 'state/R_S'
reaction_rate = 'state/react'
[]
[substance_product]
type = ScalarLinearCombination
from_var = 'state/phi_P'
to_var = 'state/alpha_P'
coefficients = '${oSiCm1}'
[]
[product_rate]
type = ScalarVariableRate
variable = 'state/alpha_P'
rate = 'state/adot_P'
time = 'forces/t'
[]
[substance_solid]
type = ScalarLinearCombination
from_var = 'state/phi_S'
to_var = 'state/alpha_S'
coefficients = '${oCm1}'
[]
[solid_rate]
type = ScalarVariableRate
variable = 'state/alpha_S'
rate = 'state/adot_S'
time = 'forces/t'
[]
##############################################
### IVP
##############################################
[residual_phiP]
type = ScalarLinearCombination
from_var = 'state/adot_P state/react'
to_var = 'residual/phi_P'
coefficients = '1.0 -1.0'
[]
[residual_phiL]
type = ScalarLinearCombination
from_var = 'state/adot_P state/adot_S'
to_var = 'residual/phi_S'
coefficients = '1.0 ${chem_ratio}'
[]
[model_residual]
type = ComposedModel
models = "residual_phiP residual_phiL
liquid_volume_fraction outer_radius liquid_reactivity solid_reactivity
reaction_rate substance_product product_rate substance_solid solid_rate"
[]
[model_update]
type = ImplicitUpdate
implicit_model = 'model_residual'
solver = 'newton'
[]
[substance_product_new]
type = ScalarLinearCombination
from_var = 'state/phi_P'
to_var = 'state/alpha_P'
coefficients = '${oSiCm1}'
[]
[substance_solid_new]
type = ScalarLinearCombination
from_var = 'state/phi_S'
to_var = 'state/alpha_S'
coefficients = '${oCm1}'
[]
[model]
type = ComposedModel
models = 'model_update liquid_volume_fraction substance_solid_new substance_product_new'
additional_outputs = 'state/phi_P state/phi_S'
[]
[]