Multiphase Precipitation
On this page
Kawin supports the usage of multiple phases. Nucleation and growth rate are handled for each precipitate phase independently. Coupling comes from the mass balance where all precipitates contribute to the overall mass changes in the system.
In the Al-Mg-Si system, several phases can form including: $ \beta' $, $ \beta" $, B', U1 and U2. To model precipitation of these phases, they must be defined in the .tdb file, the Thermodynamics module and the PrecipitateModel module.
When defining the thermodynamics module, the first phase in the list of phases will be the parent phase.
1 from kawin.thermo import MulticomponentThermodynamics
2
3 phases = ['FCC_A1', 'MGSI_B_P', 'MG5SI6_B_DP', 'B_PRIME_L', 'U1_PHASE', 'U2_PHASE']
4 therm = MulticomponentThermodynamics('AlMgSi.tdb', ['AL', 'MG', 'SI'], phases)
Model inputs
Setting up parameters for the parent phase and overall system is the same as for single phase systems. Here, it is just the composition (Al-0.72Mg-0.57Si in mol. %), molar volume ($1e$-$5\text{ }m^3/mol$).
The temperature will be divided into two stages: a 16 hour temper at $175\text{ }^oC$, followed by a 1 hour ramp up to $250 ^oC$. To do this, there needs to be three time designations: $175\text{ }^oC$ at 0 hours, $175\text{ }^oC$ at 16 hours and $250\text{ }^oC$ at 17 hours. The temperature can be plotted to show the profile over time.
5 import numpy as np
6 import matplotlib.pyplot as plt
7
8 from kawin.precipitation.PrecipitationParameters import TemperatureParameters
9
10 lowTemp = 175+273.15
11 highTemp = 250+273.15
12 temperature = TemperatureParameters([0, 16, 17], [lowTemp, lowTemp, highTemp])
13
14 time = np.linspace(0, 25*3600, 1000)
15 plt.plot(time/3600, temperature(time))
16 plt.xlim([0, 25])
17 plt.ylim([400, 550])
18 plt.xlabel('Time (hr)')
19 plt.ylabel('Temperature (K)')
20 plt.show()

21 from kawin.precipitation import MatrixParameters, PrecipitateParameters
22
23 matrix = MatrixParameters(['MG', 'SI'])
24 matrix.initComposition = [0.0072, 0.0057]
25 matrix.volume.setVolume(1e-5, 'VM', 4)
26
27 gamma = {
28 'MGSI_B_P': 0.18,
29 'MG5SI6_B_DP': 0.084,
30 'B_PRIME_L': 0.18,
31 'U1_PHASE': 0.18,
32 'U2_PHASE': 0.18
33 }
34
35 precipitates = []
36 for p in phases[1:]:
37 params = PrecipitateParameters(p)
38 params.gamma = gamma[p]
39 params.volume.setVolume(1e-5, 'VM', 4)
40 params.nucleation.setNucleationType('bulk')
41 precipitates.append(params)
Solving the model
As with single precipitate phase systems, running the model is exactly the same.
kawin currently implements two iterative methods for solving a model: Explicit euler and 4th order Runga Kutta. The Runga Kutta method is used by default, but we can input a different iterative method when solving. Here, we’ll use explicit euler to have the model solve a bit faster.
42 from kawin.precipitation import PrecipitateModel
43 from kawin.solver import explicitEulerIterator
44
45 model = PrecipitateModel(matrix, precipitates, therm, temperature)
46 model.solve(25*3600, iterator=explicitEulerIterator, verbose=True, vIt=10000)
N Time (s) Sim Time (s) Temperature (K) MG SI
0 0.0e+00 0.0 448 0.7200 0.5700
Phase Prec Density (#/m3) Volume Frac Avg Radius (m) Driving Force (J/mol)
MGSI_B_P 0.000e+00 0.0000 0.0000e+00 1.2936e+04
MG5SI6_B_DP 0.000e+00 0.0000 0.0000e+00 6.4822e+03
B_PRIME_L 0.000e+00 0.0000 0.0000e+00 8.0257e+03
U1_PHASE 0.000e+00 0.0000 0.0000e+00 7.5301e+03
U2_PHASE 0.000e+00 0.0000 0.0000e+00 7.1719e+03
N Time (s) Sim Time (s) Temperature (K) MG SI
10000 6.1e+04 191.8 523 0.0619 0.2062
Phase Prec Density (#/m3) Volume Frac Avg Radius (m) Driving Force (J/mol)
MGSI_B_P 2.057e+22 1.0247 4.8778e-09 7.3752e+02
MG5SI6_B_DP 0.000e+00 0.0000 0.0000e+00 -4.5912e+03
B_PRIME_L 1.455e+10 0.0000 1.1925e-09 -1.8925e+03
U1_PHASE 0.000e+00 0.0000 0.0000e+00 1.2771e+03
U2_PHASE 0.000e+00 0.0000 0.0000e+00 -3.9105e+02
N Time (s) Sim Time (s) Temperature (K) MG SI
16265 9.0e+04 286.3 523 0.0566 0.2032
Phase Prec Density (#/m3) Volume Frac Avg Radius (m) Driving Force (J/mol)
MGSI_B_P 4.577e+21 1.0328 7.6641e-09 4.6486e+02
MG5SI6_B_DP 0.000e+00 0.0000 0.0000e+00 -4.8022e+03
B_PRIME_L 0.000e+00 0.0000 0.0000e+00 -2.0999e+03
U1_PHASE 0.000e+00 0.0000 0.0000e+00 1.1744e+03
U2_PHASE 0.000e+00 0.0000 0.0000e+00 -5.4154e+02
Plotting
Plotting is also the same as with single phase systems. The major difference is each phase will be plotted for the radius, volume fraction, precipitate density, nucleation rate and particle size distribution. In addition, the total amount of some variables, such as the precipitate density and volume fraction, can be plotted.
47 %matplotlib inline
48 import matplotlib.pyplot as plt
49 from kawin.precipitation.Plot import plotPrecipitateDensity, plotVolumeFraction, plotAverageRadius, plotComposition
50
51 fig, axes = plt.subplots(2, 2, figsize=(10, 8))
52
53 phasesPlusTotal = list(model.phases) + ['Total']
54
55 plotPrecipitateDensity(model, ax=axes[0,0], timeUnits='h', phases=phasesPlusTotal, label={'Total': 'Total'}, color={'Total': 'k'}, linestyle={'Total': (0,(5,5))})
56 axes[0,0].set_ylim([1e5, 1e25])
57 axes[0,0].set_xscale('linear')
58 axes[0,0].set_yscale('log')
59
60 plotVolumeFraction(model, ax=axes[0,1], timeUnits='h', phases=phasesPlusTotal, label={'Total': 'Total'}, color={'Total': 'k'}, linestyle={'Total': (0,(5,5))})
61 axes[0,1].set_xscale('linear')
62
63 plotAverageRadius(model, ax=axes[1,0], timeUnits='h')
64 axes[1,0].set_xscale('linear')
65
66 plotVolumeFraction(model, ax=axes[1,1], timeUnits='h')
67 axes[1,1].set_xscale('linear')
68
69 fig.tight_layout()

References
- E. Povoden-Karadeniz et al, “Calphad modeling of metastable phases in the Al-Mg-Si system” Calphad 43 (2013) p. 94
- Q. Du et al, “Modeling over-ageing in Al-Mg-Si alloys by a multi-phase Calphad-coupled Kampmann-Wagner Numerical model” Acta Materialia 122 (2017) p. 178