The Ni-Cr-Al system
In the Ni-Cr-Al system, $Ni_3(Al,Cr)$ can precipitate into an $\gamma$-Ni (FCC) matrix. As with binary precipitatation, the Thermodynamics module provides some functions to interface with pyCalphad in defining the driving force, growth rate and interfacial composition. Similarly, it is also possible to use user-defined functions for the driving force and nucleation as long as the function parameters and return values are consistent with the ones provides by the Thermodynamics module. Calphad models for the Ni-Cr-Al system was obtained from the STGE database and Dupin et al [1,2]. Mobility data for the Ni-Cr-Al system was obtained from Engstrom and Agren .
from kawin.Thermodynamics import MulticomponentThermodynamics from kawin.KWNEuler import PrecipitateModel import numpy as np elements = ['NI', 'AL', 'CR', 'VA'] phases = ['FCC_A1', 'FCC_L12'] therm = MulticomponentThermodynamics('NiCrAl.tdb', elements, phases) t0, tf, steps = 1e-1, 1e6, 2e4 model = PrecipitateModel(t0, tf, steps, elements=['Al', 'Cr'])
Setting up model parameters is the same as for binary systems. The only difference is that the initial composition needs to be set as an array where the elements in the array will correspond to the same order of elements when the model was defined. In this case, [0.10, 0.085] corresponds to Ni-10Al-8.5Cr (at.%).
model.setInitialComposition([0.10, 0.085]) model.setInterfacialEnergy(0.023) T = 1073 model.setTemperature(T) a = 0.352e-9 #Lattice parameter Va = a**3 #Atomic volume of FCC-Ni Vb = Va #Assume Ni3Al has same unit volume as FCC-Ni atomsPerCell = 4 #Atoms in an FCC unit cell model.setVaAlpha(Va, atomsPerCell) model.setVaBeta(Vb, atomsPerCell) #Set nucleation sites to dislocations and use defualt value of 5e12 m/m3 model.setNucleationSite('dislocations') model.setNucleationDensity(dislocationDensity=5e12)
For efficiency, a surrogate model can be made on the driving force and interfacial composition. The surrogate models uses radial-basis function (RBF) interpolation and the scale and basis function can be defined (using RBF interpolation from Scipy).
For multicomponent systems, a surrogate on the driving force and the various terms derived from the curvature of the free energy surface to calculate growth rate and interfacial composition (which will be referred to as “curvature factors”) can be made. Both surrogates will need a set of compositions and temperatures to be trained on.
from kawin.Surrogate import MulticomponentSurrogate, generateTrainingPoints surr = MulticomponentSurrogate(therm) #Train driving force surrogate xAl = np.linspace(0.05, 0.11, 8) xCr = np.linspace(0.05, 0.1, 8) xTrain = generateTrainingPoints(xAl, xCr) surr.trainDrivingForce(xTrain, T) #Train curvature factors surrogate xAl = np.linspace(0.1, 0.23, 16) xCr = np.linspace(0, 0.1, 16) xTrain = generateTrainingPoints(xAl, xCr) surr.trainCurvature(xTrain, T) model.setSurrogate(surr)
Solving the Model
Solving the model is the same as for binary precipitation.
model.solve(verbose=True, vIt = 5000)
N Time (s) Temperature (K)Al Cr 5000 5.6e+00 1073 9.9932 8.5016 Phase Prec Density (#/m3) Volume Frac Avg Radius (m) beta 1.888e+21 0.0938 4.8541e-09 N Time (s) Temperature (K)Al Cr 10000 3.2e+02 1073 8.7199 8.8756 Phase Prec Density (#/m3) Volume Frac Avg Radius (m) beta 1.889e+21 15.0704 2.6600e-08 N Time (s) Temperature (K)Al Cr 15000 1.8e+04 1073 8.7111 8.8775 Phase Prec Density (#/m3) Volume Frac Avg Radius (m) beta 6.607e+20 15.1921 3.5948e-08 N Time (s) Temperature (K)Al Cr 20000 9.9e+05 1073 8.6933 8.8822 Phase Prec Density (#/m3) Volume Frac Avg Radius (m) beta 1.181e+19 15.4082 1.3802e-07 Finished in 34.489 seconds.
Plotting is also the same as with binary precipitation. Note that plotting composition will plot all components.
%matplotlib inline import matplotlib.pyplot as plt fig, axes = plt.subplots(2, 2, figsize=(12, 10)) model.plot(axes[0,0], 'Precipitate Density') model.plot(axes[0,1], 'Composition') model.plot(axes[1,0], 'Average Radius', color='C0', label='Avg. R') model.plot(axes[1,0], 'Critical Radius', color='C1', label='R*') axes[1,0].legend(loc='upper left') model.plot(axes[1,1], 'Size Distribution Density', color='C0') fig.tight_layout()
- A. T. Dinsdale, “SGTE Data for Pure Elements” Calphad 15 (1991) p. 317
- N. Dupin, I. Ansara and B. Sundman, “Thermodynamic Re-assessment of the Ternary System Al-Cr-Ni” Calphad 25 (2001) p. 279
- A. Engstrom and J. Agren, “Assessment of Diffusional Mobilities in Face-centered Cubic Ni-Cr-Al Alloys” Z. Metallkd. 87 (1996) p. 92