Material properties change dramatically depending on temperature and time history (heat treatment). The origin of this change is phase transformation. In this chapter, we will learn how to read phase diagrams, mechanisms of diffusional and diffusionless transformations, application of TTT/CCT diagrams, martensitic transformation, and the basics of phase diagram calculation using the CALPHAD method, building a theoretical foundation for heat treatment design.
Learning Objectives
By reading this chapter, you will be able to:
- ✅ Read binary and ternary phase diagrams and understand phase equilibrium
- ✅ Calculate phase fractions using the Lever Rule
- ✅ Predict transformation rate and microstructure from TTT and CCT diagrams
- ✅ Quantify transformation progress using the Avrami equation
- ✅ Understand the principles of martensitic transformation and predict Ms temperature
- ✅ Understand the basics of the CALPHAD method and how to use the pycalphad library
- ✅ Perform phase diagram and transformation kinetics simulations in Python
2.1 Fundamentals and Reading of Phase Diagrams
What is a Phase Diagram?
A phase diagram is a diagram that shows which phases are thermodynamically stable as a function of temperature, composition, and pressure. It is the most important tool when determining heat treatment conditions for materials.
A phase is a homogeneous portion of a material with uniform chemical composition, structure, and properties, separated from other portions by distinct interfaces. Examples: liquid phase (L), α-phase (BCC), γ-phase (FCC), cementite (Fe3C)
Basic Types of Binary Phase Diagrams
1. Complete Solid Solution
A system in which two elements form a solid solution over the entire composition range.
Examples: Cu-Ni system, Au-Ag system
2. Eutectic System
At a certain composition and temperature, the liquid phase decomposes simultaneously into two solid phases upon cooling.
Examples: Pb-Sn system, Al-Si system
Eutectic reaction: $L \rightarrow \alpha + \beta$ (upon cooling)
3. Peritectic System
A liquid phase and a solid phase react to produce another solid phase.
Examples: Fe-C system (high temperature region), Pt-Ag system
Peritectic reaction: $L + \delta \rightarrow \gamma$ (upon cooling)
Fe-C Phase Diagram (Fundamentals of Steel)
The Fe-C phase diagram is the foundation for heat treatment design of steel materials.
δ-Fe BCC] -->|Cooling| B[γ-Fe FCC
Austenite] B -->|Eutectoid Transf.
727°C 0.77%C| C[α-Fe BCC
Ferrite] B -->|Eutectoid Transf.
727°C 0.77%C| D[Fe₃C
Cementite] C -->|Fine Mixed Structure| E[Pearlite] D -->|Fine Mixed Structure| E B -->|Rapid Cooling
Diffusionless Transf.| F[Martensite
BCT Ultra-hard] style A fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style B fill:#fff3e0,stroke:#f57c00,stroke-width:2px style C fill:#e8f5e9,stroke:#43a047,stroke-width:2px style D fill:#fce4ec,stroke:#ec407a,stroke-width:2px style E fill:#f3e5f5,stroke:#ab47bc,stroke-width:2px style F fill:#ffebee,stroke:#e53935,stroke-width:2px
Important Temperatures and Compositions:
- Eutectoid Point: 727°C, 0.77% C
- Eutectoid reaction: $\gamma \rightarrow \alpha + \text{Fe}_3\text{C}$ (pearlite microstructure)
- Hypoeutectoid Steel: 0.02-0.77% C
- Microstructure: Proeutectoid ferrite + Pearlite
- Eutectoid Steel: 0.77% C
- Microstructure: 100% Pearlite
- Hypereutectoid Steel: 0.77-2.11% C
- Microstructure: Proeutectoid cementite + Pearlite
Lever Rule
A method to calculate the mass fraction of each phase in a two-phase region.
When an alloy with temperature $T$ and composition $C_0$ is divided into $\alpha$-phase (composition $C_\alpha$) and $\beta$-phase (composition $C_\beta$):
$$\text{Mass fraction}_\alpha = \frac{C_\beta - C_0}{C_\beta - C_\alpha}$$
$$\text{Mass fraction}_\beta = \frac{C_0 - C_\alpha}{C_\beta - C_\alpha}$$
Remember: The fraction of the farther phase is larger.
2.2 Diffusional and Diffusionless Transformations
Classification of Transformations
| Type of Transformation | Diffusion | Transformation Rate | Representative Examples |
|---|---|---|---|
| Diffusional Transformation (Diffusional) |
Long-range diffusion present | Slow (seconds to hours) | Pearlite transformation Bainite transformation Precipitation |
| Diffusionless Transformation (Diffusionless) |
No diffusion (Coordinated shear movement) |
Very fast (speed of sound) | Martensitic transformation Twin transformation |
Diffusional Transformation: Pearlite Transformation
Eutectoid transformation from austenite (γ-Fe, FCC) to ferrite (α-Fe, BCC) + cementite (Fe3C).
$$\gamma (0.77\% \text{C}) \rightarrow \alpha (0.02\% \text{C}) + \text{Fe}_3\text{C} (6.67\% \text{C})$$
Characteristics of Pearlite Microstructure:
- Lamellar structure of ferrite and cementite
- Interlamellar spacing determines hardness
- Fine pearlite: High-temperature transformation, hard
- Coarse pearlite: Low-temperature transformation, soft
Diffusionless Transformation: Martensitic Transformation
Transformation from austenite (FCC) to body-centered tetragonal (BCT) martensite.
Characteristics of Martensite:
- Diffusionless shear-type structural change
- Transformation rate at the speed of sound (10-7 seconds)
- Carbon is forcibly dissolved in solid solution, distorting the lattice (BCT structure)
- Extremely hard but brittle (Vickers hardness 600-900 HV)
- Proceeds below the transformation start temperature (Ms)
Prediction formula for Ms temperature (steel):
$$M_s (\text{°C}) = 539 - 423C - 30.4Mn - 17.7Ni - 12.1Cr - 7.5Mo$$
Here, element symbols represent mass %. Ms temperature decreases as carbon and alloying elements increase.
2.3 TTT and CCT Diagrams
TTT Diagram (Time-Temperature-Transformation Diagram)
TTT diagram shows the progress of transformation during isothermal transformation (holding at constant temperature).
How to read a TTT diagram:
- Vertical axis: Temperature
- Horizontal axis: Time (logarithmic scale)
- C-shaped curve: Transformation start line and transformation completion line
- "Nose": Temperature at which transformation occurs fastest (around 550-600°C)
850°C] -->|Rapid Cooling
MsBelow| B[Martensite
100%] A -->|Medium Cooling
500-600°CHold| C[Bainite] A -->|Slow Cooling
700°CHold| D[Coarse Pearlite] A -->|Medium Cooling
650°CHold| E[Fine Pearlite] style A fill:#fff3e0,stroke:#f57c00,stroke-width:2px style B fill:#ffebee,stroke:#e53935,stroke-width:2px style C fill:#e1f5fe,stroke:#0277bd,stroke-width:2px style D fill:#f3e5f5,stroke:#ab47bc,stroke-width:2px style E fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
CCT Diagram (Continuous Cooling Transformation Diagram)
CCT diagram shows transformation during continuous cooling, closer to actual heat treatment conditions.
Differences from TTT diagram:
- TTT diagram is isothermal transformation (laboratory)
- CCT diagram is continuous cooling (practical)
- C-curve in CCT diagram shifts to lower right compared to TTT diagram (transformation takes longer)
Relationship between cooling rate and microstructure obtained (example of eutectoid steel):
| Cooling Rate | Microstructure | Hardness (HV) | Application Examples |
|---|---|---|---|
| Slow cooling (furnace cooling) < 1°C/s |
Coarse Pearlite | 200-250 | Softening annealing |
| Air cooling 10-100°C/s |
Fine Pearlite | 300-350 | Normalizing |
| Oil quenching 100-300°C/s |
Bainite | 400-500 | High toughness parts |
| Water quenching > 1000°C/s |
Martensite | 600-800 | Quenching |
Critical Cooling Rate
Critical cooling rate is the minimum cooling rate required to obtain 100% martensitic microstructure. It decreases with the addition of alloying elements (easier to quench).
2.4 Transformation Kinetics and Avrami Equation
Progress of Transformation
The progress $f(t)$ (volume fraction transformed) of diffusional transformation is described by the Johnson-Mehl-Avrami-Kolmogorov (JMAK) equation, commonly known as the Avrami equation:
$$f(t) = 1 - \exp(-kt^n)$$
Where:
- $f(t)$: Transformation fraction at time $t$ (0 to 1)
- $k$: Rate constant (temperature dependent)
- $n$: Avrami exponent (depends on nucleation and growth mechanism, typically 1-4)
Meaning of Avrami exponent $n$:
| n value | Nucleation | Growth |
|---|---|---|
| 1 | Constant rate | 1D (needle-shaped) |
| 2 | Constant rate | 2D (disk-shaped) |
| 3 | Constant rate | 3D (spherical) |
| 4 | Increases with time | 3D (spherical) |
Principle of TTT Diagram Creation
TTT diagrams are created by fitting the Avrami equation at multiple temperatures and plotting the transformation start time ($f = 0.01$) and completion time ($f = 0.99$) at each temperature.
2.5 Fundamentals of the CALPHAD Method
What is CALPHAD (CALculation of PHAse Diagrams)?
CALPHAD method is a technique for calculating phase diagrams using thermodynamic databases. Since it is impossible to experimentally measure phase diagrams at all compositions and temperatures, predictions are made by calculation.
CALPHAD method workflow:
- Model the Gibbs energy of each phase with equations
- Optimize parameters from experimental data and thermodynamic data
- Determine stable phases by minimizing Gibbs energy
- Create phase diagram
Gibbs energy model (simplified version):
$$G = H - TS = \sum_i x_i G_i^0 + RT \sum_i x_i \ln x_i + G^{ex}$$
Where:
- $G$: Gibbs energy
- $x_i$: Mole fraction of component $i$
- $G_i^0$: Gibbs energy of pure component
- $RT \sum_i x_i \ln x_i$: Ideal mixing entropy term
- $G^{ex}$: Excess Gibbs energy (interaction term, Redlich-Kister model, etc.)
pycalphad: CALPHAD Calculation in Python
pycalphad is a Python library for performing CALPHAD calculations. It can read TDB files (thermodynamic databases) and calculate and visualize phase diagrams.
2.6 Phase Transformation Simulation in Python
Environment Setup
# Install required libraries
pip install numpy matplotlib pandas scipy
# Install pycalphad separately (optional)
pip install pycalphad
Code Example 1: Drawing Binary Phase Diagram (Complete Solid Solution)
Cu-Ni系のような理想的な全率固溶型相図をモデル化します。
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
"""
Example: Cu-Ni系のような理想的な全率固溶型相図をモデル化します。
Purpose: Demonstrate data visualization techniques
Target: Beginner to Intermediate
Execution time: 2-5 seconds
Dependencies: None
"""
import numpy as np
import matplotlib.pyplot as plt
# Parameters for Cu-Ni phase diagram (simplified model)
T_melt_Cu = 1358 # K(Cu の融点)
T_melt_Ni = 1728 # K(Ni の融点)
# Composition range (Ni mole fraction)
X_Ni = np.linspace(0, 1, 100)
# Liquidus(Liquidus)とSolidus(Solidus)のCalculation
# 全率固溶型の場合、LiquidusとSolidusはほぼ直線的(Raoultの法則の近似)
# Liquidus: T_liquidus = T_Cu + (T_Ni - T_Cu) * X_Ni^alpha
# Solidus: T_solidus = T_Cu + (T_Ni - T_Cu) * X_Ni^beta
# alpha, betaは相互作用パラメータ(ここでは簡略化)
T_liquidus = T_melt_Cu + (T_melt_Ni - T_melt_Cu) * X_Ni
T_solidus = T_melt_Cu + (T_melt_Ni - T_melt_Cu) * X_Ni**1.2 # 簡易モデル
# Plot
fig, ax = plt.subplots(figsize=(10, 7))
ax.plot(X_Ni * 100, T_liquidus - 273, 'r-', linewidth=2.5, label='Liquidus(Liquidus)')
ax.plot(X_Ni * 100, T_solidus - 273, 'b-', linewidth=2.5, label='Solidus(Solidus)')
# Fill regions
ax.fill_between(X_Ni * 100, T_liquidus - 273, 1500, alpha=0.2, color='red', label='Liquid (L) region')
ax.fill_between(X_Ni * 100, T_solidus - 273, T_liquidus - 273, alpha=0.2, color='yellow',
label='L + α two-phase region')
ax.fill_between(X_Ni * 100, 0, T_solidus - 273, alpha=0.2, color='blue', label='Solid (α) region')
ax.set_xlabel('Ni Composition (mol%)', fontsize=13, fontweight='bold')
ax.set_ylabel('Temperature (°C)', fontsize=13, fontweight='bold')
ax.set_title('Cu-Ni Binary Phase Diagram (Complete Solid Solution)', fontsize=15, fontweight='bold')
ax.legend(fontsize=11, loc='lower right')
ax.grid(alpha=0.3)
ax.set_xlim(0, 100)
ax.set_ylim(0, 1500)
# Show cooling path at specific composition
X_target = 50 # 50 mol% Ni
T_target_liq = np.interp(X_target / 100, X_Ni, T_liquidus) - 273
T_target_sol = np.interp(X_target / 100, X_Ni, T_solidus) - 273
ax.plot([X_target, X_target], [1500, 0], 'k--', linewidth=2, alpha=0.7, label='Cooling path')
ax.plot(X_target, T_target_liq, 'ro', markersize=10, label=f'Liquidus intersection: {T_target_liq:.0f}°C')
ax.plot(X_target, T_target_sol, 'bo', markersize=10, label=f'Solidus intersection: {T_target_sol:.0f}°C')
plt.legend(fontsize=10)
plt.tight_layout()
plt.show()
print("=== Analysis of Cu-Ni Phase Diagram ===")
print(f"50 At mol% Ni composition:")
print(f" Liquidus temperature (solidification start): {T_target_liq:.1f}°C")
print(f" Solidus temperature (solidification completion): {T_target_sol:.1f}°C")
print(f" Solidification temperature range: {T_target_liq - T_target_sol:.1f}°C")
Output example:
=== Analysis of Cu-Ni Phase Diagram ===
50 At mol% Ni composition:
Liquidus temperature (solidification start): 1270.0°C
Solidus temperature (solidification completion): 1199.4°C
Solidification temperature range: 70.6°C
Explanation: In a complete solid solution phase diagram, a two-phase region (L + α) exists between the liquidus and solidus. Solidification progresses in this range, and the composition changes continuously.
Code Example 2: Calculation and Visualization of Lever Rule
Two-phase regionat各相のMass fractionをCalculationします。
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
import numpy as np
import matplotlib.pyplot as plt
def lever_rule(C_alpha, C_beta, C_0):
"""てこの法則byPhase fractionCalculation
Args:
C_alpha: α相のComposition
C_beta: β相のComposition
C_0: 合金全体のComposition
Returns:
f_alpha: α相のMass fraction
f_beta: β相のMass fraction
"""
f_beta = (C_0 - C_alpha) / (C_beta - C_alpha)
f_alpha = 1 - f_beta
return f_alpha, f_beta
# Fe-C system example (two-phase region at eutectoid temperature 727°C)
# α相(Ferrite): 0.02% C
# Fe3C(Cementite): 6.67% C
# Alloy composition range
C_alpha = 0.02 # α相のCarbon Concentration
C_Fe3C = 6.67 # CementiteのCarbon Concentration
# Carbon concentration range(0.02% - 6.67%)
C_alloy = np.linspace(C_alpha, C_Fe3C, 100)
# Lever rule calculation for each composition
f_alpha_arr = []
f_Fe3C_arr = []
for C in C_alloy:
f_alpha, f_Fe3C = lever_rule(C_alpha, C_Fe3C, C)
f_alpha_arr.append(f_alpha)
f_Fe3C_arr.append(f_Fe3C)
# Plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
# Phase fraction graph
ax1.plot(C_alloy, np.array(f_alpha_arr) * 100, 'b-', linewidth=2.5, label='Ferrite(α)')
ax1.plot(C_alloy, np.array(f_Fe3C_arr) * 100, 'r-', linewidth=2.5, label='Cementite(Fe₃C)')
ax1.axvline(0.77, color='green', linestyle='--', linewidth=2, label='Eutectoid composition(0.77% C)')
ax1.set_xlabel('Carbon Concentration (wt%)', fontsize=13, fontweight='bold')
ax1.set_ylabel('Phase fraction (%)', fontsize=13, fontweight='bold')
ax1.set_title('Lever Rule: Phase Fractions in Fe-C System', fontsize=14, fontweight='bold')
ax1.legend(fontsize=11)
ax1.grid(alpha=0.3)
ax1.set_xlim(0, 7)
ax1.set_ylim(0, 100)
# Calculation for eutectoid steel (0.77% C)
C_eutectoid = 0.77
f_alpha_eut, f_Fe3C_eut = lever_rule(C_alpha, C_Fe3C, C_eutectoid)
print("=== Phase Fractions in Eutectoid Steel (0.77% C) at 727°C ===")
print(f"Ferrite(α): {f_alpha_eut * 100:.2f}%")
print(f"Cementite(Fe₃C): {f_Fe3C_eut * 100:.2f}%")
# Phase fractions in various steel grades
steel_grades = {
'Low carbon steel': 0.10,
'Medium carbon steel': 0.45,
'High carbon steel': 1.20
}
print("\n=== Phase Fractions of Each Steel Grade (Room Temperature, Equilibrium State) ===")
for name, C_content in steel_grades.items():
if C_content <= 0.77:
# Hypoeutectoid steel
# Proeutectoid ferrite + Pearlite
# Phase fraction in pearlite is constant (eutectoid composition)
pearlite_fraction = C_content / C_eutectoid
proeutectoid_ferrite = 1 - pearlite_fraction
# Phase fraction inside pearlite
f_alpha_in_pearlite, f_Fe3C_in_pearlite = lever_rule(C_alpha, C_Fe3C, C_eutectoid)
# Overall phase fraction
total_ferrite = proeutectoid_ferrite + pearlite_fraction * f_alpha_in_pearlite
total_Fe3C = pearlite_fraction * f_Fe3C_in_pearlite
print(f"\n{name}({C_content}% C):")
print(f" Proeutectoid ferrite: {proeutectoid_ferrite * 100:.1f}%")
print(f" Pearlite: {pearlite_fraction * 100:.1f}%")
print(f" └ Ferrite: {total_ferrite * 100:.1f}% (total)")
print(f" └ Cementite: {total_Fe3C * 100:.1f}% (total)")
else:
# Hypereutectoid steel
# Proeutectoid cementite + Pearlite
pearlite_fraction = (C_Fe3C - C_content) / (C_Fe3C - C_eutectoid)
proeutectoid_Fe3C = 1 - pearlite_fraction
# Overall phase fraction
f_alpha_in_pearlite, f_Fe3C_in_pearlite = lever_rule(C_alpha, C_Fe3C, C_eutectoid)
total_ferrite = pearlite_fraction * f_alpha_in_pearlite
total_Fe3C = proeutectoid_Fe3C + pearlite_fraction * f_Fe3C_in_pearlite
print(f"\n{name}({C_content}% C):")
print(f" Proeutectoid cementite: {proeutectoid_Fe3C * 100:.1f}%")
print(f" Pearlite: {pearlite_fraction * 100:.1f}%")
print(f" └ Ferrite: {total_ferrite * 100:.1f}% (total)")
print(f" └ Cementite: {total_Fe3C * 100:.1f}% (total)")
# Visualize with bar chart
ax2_data = []
labels = []
for name, C_content in steel_grades.items():
if C_content <= 0.77:
pearlite_fraction = C_content / C_eutectoid
proeutectoid_ferrite = 1 - pearlite_fraction
f_alpha_in_pearlite, f_Fe3C_in_pearlite = lever_rule(C_alpha, C_Fe3C, C_eutectoid)
total_ferrite = proeutectoid_ferrite + pearlite_fraction * f_alpha_in_pearlite
total_Fe3C = pearlite_fraction * f_Fe3C_in_pearlite
else:
pearlite_fraction = (C_Fe3C - C_content) / (C_Fe3C - C_eutectoid)
proeutectoid_Fe3C = 1 - pearlite_fraction
f_alpha_in_pearlite, f_Fe3C_in_pearlite = lever_rule(C_alpha, C_Fe3C, C_eutectoid)
total_ferrite = pearlite_fraction * f_alpha_in_pearlite
total_Fe3C = proeutectoid_Fe3C + pearlite_fraction * f_Fe3C_in_pearlite
ax2_data.append([total_ferrite * 100, total_Fe3C * 100])
labels.append(f"{name}\n({C_content}% C)")
ax2_data = np.array(ax2_data)
x_pos = np.arange(len(labels))
ax2.bar(x_pos, ax2_data[:, 0], label='Ferrite(α)', color='#3498db', alpha=0.8)
ax2.bar(x_pos, ax2_data[:, 1], bottom=ax2_data[:, 0], label='Cementite(Fe₃C)',
color='#e74c3c', alpha=0.8)
ax2.set_xticks(x_pos)
ax2.set_xticklabels(labels)
ax2.set_ylabel('Phase fraction (%)', fontsize=13, fontweight='bold')
ax2.set_title('Phase Fractions by Steel Grade (Equilibrium State)', fontsize=14, fontweight='bold')
ax2.legend(fontsize=11)
ax2.grid(axis='y', alpha=0.3)
ax2.set_ylim(0, 100)
plt.tight_layout()
plt.show()
Output example:
=== Phase Fractions in Eutectoid Steel (0.77% C) at 727°C ===
Ferrite(α): 88.83%
Cementite(Fe₃C): 11.17%
=== Phase Fractions of Each Steel Grade (Room Temperature, Equilibrium State) ===
Low carbon steel(0.10% C):
Proeutectoid ferrite: 87.0%
Pearlite: 13.0%
└ Ferrite: 98.5% (total)
└ Cementite: 1.5% (total)
Medium carbon steel(0.45% C):
Proeutectoid ferrite: 41.6%
Pearlite: 58.4%
└ Ferrite: 93.3% (total)
└ Cementite: 6.7% (total)
High carbon steel(1.20% C):
Proeutectoid cementite: 7.3%
Pearlite: 92.7%
└ Ferrite: 82.3% (total)
└ Cementite: 17.7% (total)
Explanation: The lever rule allows quantitative prediction of the mass fraction of each phase (ferrite and cementite) from the carbon concentration. This is the basis for understanding the relationship between microstructure and mechanical properties.
Code Example 3: Generation of TTT Diagram and Fitting of Avrami Equation
Eutectoid steelのTTT図をAvrami式でモデル化します。
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# Avrami式
def avrami_equation(t, k, n):
"""Avrami式byTransformation fraction
Args:
t: hours(s)
k: Rate constant
n: AvramiExponent
Returns:
Transformation fraction(0-1)
"""
return 1 - np.exp(-k * t**n)
# TemperatureごとのAvrami定数(Eutectoid steel、実験データに基づく近似値)
temperatures = np.array([700, 650, 600, 550, 500, 450, 400]) # °C
# Rate constantk(Temperature依存、High Tempほど速い)
k_values = np.array([0.01, 0.008, 0.005, 0.003, 0.002, 0.0015, 0.001])
# AvramiExponentn(NucleationとGrowthのメカニズム依存)
n_values = np.array([2.5, 2.8, 3.0, 3.2, 3.0, 2.5, 2.0])
# 各TemperatureatTransformation曲線
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
# Transformation進行度 vs hours
time = np.logspace(-1, 4, 500) # 0.1s〜10000s
for T, k, n in zip(temperatures, k_values, n_values):
fraction = avrami_equation(time, k, n)
ax1.plot(time, fraction * 100, linewidth=2, label=f'{T}°C')
ax1.set_xscale('log')
ax1.set_xlabel('hours (s)', fontsize=13, fontweight='bold')
ax1.set_ylabel('Transformation fraction (%)', fontsize=13, fontweight='bold')
ax1.set_title('等温Transformation曲線(Eutectoid steel)', fontsize=14, fontweight='bold')
ax1.legend(fontsize=10, ncol=2)
ax1.grid(alpha=0.3)
ax1.set_xlim(0.1, 10000)
ax1.set_ylim(0, 100)
ax1.axhline(1, color='red', linestyle='--', linewidth=1, alpha=0.5)
ax1.axhline(99, color='red', linestyle='--', linewidth=1, alpha=0.5)
# TTT図の構築
# 各Temperatureat1%Transformationhoursと99%TransformationhoursをCalculation
times_1_percent = []
times_99_percent = []
for k, n in zip(k_values, n_values):
# 1%Transformation: 0.01 = 1 - exp(-k*t^n) → t = (-ln(0.99)/k)^(1/n)
t_1 = (-np.log(0.99) / k)**(1/n)
# 99%Transformation: 0.99 = 1 - exp(-k*t^n) → t = (-ln(0.01)/k)^(1/n)
t_99 = (-np.log(0.01) / k)**(1/n)
times_1_percent.append(t_1)
times_99_percent.append(t_99)
# TTT図のPlot
ax2.plot(times_1_percent, temperatures, 'r-', linewidth=2.5, label='Transformation start(1%)')
ax2.plot(times_99_percent, temperatures, 'b-', linewidth=2.5, label='Transformation completion(99%)')
# C曲線の鼻(nose)
nose_idx = np.argmin(times_1_percent)
ax2.plot(times_1_percent[nose_idx], temperatures[nose_idx], 'go', markersize=12,
label=f'鼻(Nose): {times_1_percent[nose_idx]:.1f}s, {temperatures[nose_idx]}°C')
# Martensite開始Temperature(Ms)
M_s = 220 # °C(0.77% C鋼の近似値)
ax2.axhline(M_s, color='purple', linestyle='--', linewidth=2,
label=f'M_s = {M_s}°C(Martensite開始)')
ax2.set_xscale('log')
ax2.set_xlabel('hours (s)', fontsize=13, fontweight='bold')
ax2.set_ylabel('Temperature (°C)', fontsize=13, fontweight='bold')
ax2.set_title('TTT図(Time-Temperature-Transformation)', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(alpha=0.3)
ax2.set_xlim(0.1, 10000)
ax2.set_ylim(0, 800)
# Microstructure領域の注釈
ax2.text(0.5, 650, 'Pearlite', fontsize=12, fontweight='bold', ha='center',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
ax2.text(50, 450, 'Bainite', fontsize=12, fontweight='bold', ha='center',
bbox=dict(boxstyle='round', facecolor='lightblue', alpha=0.5))
ax2.text(5000, 150, 'Martensite', fontsize=12, fontweight='bold', ha='center',
bbox=dict(boxstyle='round', facecolor='lightcoral', alpha=0.5))
plt.tight_layout()
plt.show()
# 特定TemperatureatAnalysis
print("=== TTT図のAnalysis ===")
print(f"鼻(最速TransformationTemperature): {temperatures[nose_idx]}°C")
print(f" 1%Transformationhours: {times_1_percent[nose_idx]:.2f} s")
print(f" 99%Transformationhours: {times_99_percent[nose_idx]:.2f} s")
print("\n=== 各TemperatureatTransformationhours ===")
for T, t1, t99, k, n in zip(temperatures, times_1_percent, times_99_percent,
k_values, n_values):
print(f"{T}°C: 開始 {t1:.2f}s, 完了 {t99:.2f}s (k={k:.4f}, n={n:.1f})")
Output example:
=== TTT図のAnalysis ===
鼻(最速TransformationTemperature): 550°C
1%Transformationhours: 5.29 s
99%Transformationhours: 217.59 s
=== 各TemperatureatTransformationhours ===
700°C: 開始 2.28s, 完了 72.30s (k=0.0100, n=2.5)
650°C: 開始 2.42s, 完了 87.08s (k=0.0080, n=2.8)
600°C: 開始 3.62s, 完了 166.49s (k=0.0050, n=3.0)
550°C: 開始 5.29s, 完了 283.07s (k=0.0030, n=3.2)
500°C: 開始 6.22s, 完了 286.01s (k=0.0020, n=3.0)
450°C: 開始 9.79s, 完了 310.22s (k=0.0015, n=2.5)
400°C: 開始 22.36s, 完了 447.21s (k=0.0010, n=2.0)
Explanation: TTT図のC曲線は、High TempではDiffusionが速く、低温では駆動力(過Cooling度)が大きいため、中間Temperature(550°C付近)で最も速くTransformationが起こることを示しています。
Code Example 4: Parameter Fitting of Avrami Equation (Experimental Data)
実験的なTransformationデータfromAvrami定数を推定します。
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
"""
Example: 実験的なTransformationデータfromAvrami定数を推定します。
Purpose: Demonstrate data visualization techniques
Target: Intermediate
Execution time: 10-30 seconds
Dependencies: None
"""
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# 実験データ(550°Cat等温Transformation)
# hours(s)とTransformation fraction(%)
time_exp = np.array([1, 5, 10, 20, 30, 50, 100, 200, 300, 500])
fraction_exp = np.array([0, 2, 10, 35, 55, 75, 90, 97, 99, 99.5])
# Avrami式
def avrami(t, k, n):
return (1 - np.exp(-k * t**n)) * 100 # パーセント単位
# 非線形Fitting
popt, pcov = curve_fit(avrami, time_exp, fraction_exp,
p0=[0.001, 2.0], # 初期推定値
bounds=([0, 0.5], [1, 5])) # パラメータ範囲
k_fit, n_fit = popt
k_err, n_err = np.sqrt(np.diag(pcov))
print("=== AvramiFittingResult ===")
print(f"Rate constant k = {k_fit:.6f} ± {k_err:.6f}")
print(f"AvramiExponent n = {n_fit:.3f} ± {n_err:.3f}")
# AvramiExponentの解釈
if 1.5 < n_fit < 2.5:
mechanism = "2次元Growth(円盤状)、Constant rateNucleation"
elif 2.5 < n_fit < 3.5:
mechanism = "3次元Growth(球状)、Constant rateNucleation"
elif 3.5 < n_fit < 4.5:
mechanism = "3次元Growth(球状)、増加速度Nucleation"
else:
mechanism = "複雑なメカニズム"
print(f"\nTransformationメカニズムの推定: {mechanism}")
# Fitting曲線の生成
time_fit = np.logspace(-1, 3, 500)
fraction_fit = avrami(time_fit, k_fit, n_fit)
# Plot1: Transformation fraction vs hours
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
ax1.scatter(time_exp, fraction_exp, s=100, color='red', edgecolor='black',
linewidth=2, label='実験データ', zorder=5)
ax1.plot(time_fit, fraction_fit, 'b-', linewidth=2.5,
label=f'Avramiフィット (k={k_fit:.4f}, n={n_fit:.2f})')
ax1.set_xscale('log')
ax1.set_xlabel('hours (s)', fontsize=13, fontweight='bold')
ax1.set_ylabel('Transformation fraction (%)', fontsize=13, fontweight='bold')
ax1.set_title('Transformation Rate論:AvramiPlot', fontsize=14, fontweight='bold')
ax1.legend(fontsize=11)
ax1.grid(alpha=0.3)
ax1.set_xlim(0.1, 1000)
ax1.set_ylim(0, 100)
# Plot2: Avrami線形化Plot
# ln(ln(1/(1-f))) vs ln(t) → 傾きがn、切片がn*ln(k)
# f: Transformation fraction(0-1)
fraction_decimal = fraction_exp / 100
# 99%以上は数値誤差を避けるため除外
valid_idx = fraction_decimal < 0.99
fraction_valid = fraction_decimal[valid_idx]
time_valid = time_exp[valid_idx]
# Avrami線形化
y_avrami = np.log(np.log(1 / (1 - fraction_valid)))
x_avrami = np.log(time_valid)
# 線形Fitting
coeffs = np.polyfit(x_avrami, y_avrami, 1)
n_linear = coeffs[0]
k_linear = np.exp(-coeffs[1] / n_linear)
print(f"\n=== 線形化AvramiPlot法 ===")
print(f"Rate constant k = {k_linear:.6f}")
print(f"AvramiExponent n = {n_linear:.3f}")
# 線形フィット曲線
x_fit_linear = np.linspace(x_avrami.min(), x_avrami.max(), 100)
y_fit_linear = coeffs[0] * x_fit_linear + coeffs[1]
ax2.scatter(x_avrami, y_avrami, s=100, color='red', edgecolor='black',
linewidth=2, label='実験データ', zorder=5)
ax2.plot(x_fit_linear, y_fit_linear, 'b-', linewidth=2.5,
label=f'線形フィット (傾き={n_linear:.2f})')
ax2.set_xlabel('ln(time) [ln(s)]', fontsize=13, fontweight='bold')
ax2.set_ylabel('ln(ln(1/(1-f)))', fontsize=13, fontweight='bold')
ax2.set_title('Avrami線形化Plot', fontsize=14, fontweight='bold')
ax2.legend(fontsize=11)
ax2.grid(alpha=0.3)
plt.tight_layout()
plt.show()
# 特定hoursatTransformation fraction予測
target_times = [10, 50, 100, 200]
print("\n=== Transformation fractionの予測 ===")
for t in target_times:
f_pred = avrami(t, k_fit, n_fit)
print(f"t = {t:3d} s → Transformation fraction = {f_pred:.1f}%")
Output example:
=== AvramiFittingResult ===
Rate constant k = 0.000523 ± 0.000042
AvramiExponent n = 2.876 ± 0.068
Transformationメカニズムの推定: 3次元Growth(球状)、Constant rateNucleation
=== 線形化AvramiPlot法 ===
Rate constant k = 0.000518
AvramiExponent n = 2.901
=== Transformation fractionの予測 ===
t = 10 s → Transformation fraction = 10.4%
t = 50 s → Transformation fraction = 74.3%
t = 100 s → Transformation fraction = 90.2%
t = 200 s → Transformation fraction = 96.9%
Explanation: 実験データfromAvrami定数をFittingすることで、Transformationのメカニズム(NucleationとGrowthの様式)を推定でき、未測定hoursatTransformation fractionも予測できます。
Code Example 5: Prediction of Ms Temperature (Martensite Transformation Start Temperature)
鋼のCompositionfromMsTemperatureを予測し、Quenching条件を検討します。
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
# - pandas>=2.0.0, <2.2.0
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
def calculate_Ms(C, Mn=0, Ni=0, Cr=0, Mo=0):
"""M_sTemperatureのCalculation(Andrews式)
Args:
C: 炭素含有量(wt%)
Mn: マンガン含有量(wt%)
Ni: ニッケル含有量(wt%)
Cr: クロム含有量(wt%)
Mo: モリブデン含有量(wt%)
Returns:
M_sTemperature(°C)
"""
Ms = 539 - 423*C - 30.4*Mn - 17.7*Ni - 12.1*Cr - 7.5*Mo
return Ms
# 代表的な鋼種のM_sTemperature
steels = {
'Carbon steel 0.2%C': {'C': 0.20, 'Mn': 0.5, 'Ni': 0, 'Cr': 0, 'Mo': 0},
'Carbon steel 0.4%C': {'C': 0.40, 'Mn': 0.7, 'Ni': 0, 'Cr': 0, 'Mo': 0},
'Carbon steel 0.6%C': {'C': 0.60, 'Mn': 0.8, 'Ni': 0, 'Cr': 0, 'Mo': 0},
'SKD11工具鋼': {'C': 1.50, 'Mn': 0.4, 'Ni': 0, 'Cr': 12.0, 'Mo': 1.0},
'SUS304Austenite鋼': {'C': 0.08, 'Mn': 2.0, 'Ni': 9.0, 'Cr': 18.0, 'Mo': 0},
'SNCM420低合金鋼': {'C': 0.20, 'Mn': 0.6, 'Ni': 1.8, 'Cr': 0.5, 'Mo': 0.2}
}
# M_sTemperatureのCalculation
results = []
for name, comp in steels.items():
Ms = calculate_Ms(**comp)
results.append({
'Steel': name,
'M_s (°C)': Ms,
**comp
})
df = pd.DataFrame(results)
print("=== 各鋼種のM_sTemperature ===")
print(df.to_string(index=False))
# M_sTemperatureのPlot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
# 棒グラフ
steel_names = df['Steel']
Ms_values = df['M_s (°C)']
colors = ['#3498db' if Ms > 200 else '#e74c3c' if Ms > 0 else '#95a5a6'
for Ms in Ms_values]
bars = ax1.barh(steel_names, Ms_values, color=colors, edgecolor='black', linewidth=1.5)
ax1.axvline(0, color='black', linewidth=2)
ax1.axvline(200, color='orange', linestyle='--', linewidth=2,
label='200°C(Quenching性の目安)')
ax1.set_xlabel('M_s Temperature (°C)', fontsize=13, fontweight='bold')
ax1.set_title('鋼種別M_sTemperature', fontsize=14, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(axis='x', alpha=0.3)
# Carbon ConcentrationとM_sTemperatureの関係
C_range = np.linspace(0.1, 1.5, 100)
Ms_C = calculate_Ms(C_range, Mn=0.5, Ni=0, Cr=0, Mo=0) # Mn 0.5%のCarbon steel
ax2.plot(C_range, Ms_C, 'b-', linewidth=2.5,
label='Carbon steel(Mn 0.5%)')
# 合金元素の影響
Ms_Ni = calculate_Ms(C_range, Mn=0.5, Ni=2.0, Cr=0, Mo=0) # Ni 2%添加
Ms_Cr = calculate_Ms(C_range, Mn=0.5, Ni=0, Cr=1.0, Mo=0) # Cr 1%添加
ax2.plot(C_range, Ms_Ni, 'r--', linewidth=2,
label='Ni 2%添加')
ax2.plot(C_range, Ms_Cr, 'g--', linewidth=2,
label='Cr 1%添加')
ax2.axhline(0, color='black', linestyle=':', linewidth=1.5, alpha=0.7)
ax2.axhline(200, color='orange', linestyle='--', linewidth=1.5,
label='Quenching性目安(200°C)')
ax2.set_xlabel('Carbon Concentration (wt%)', fontsize=13, fontweight='bold')
ax2.set_ylabel('M_s Temperature (°C)', fontsize=13, fontweight='bold')
ax2.set_title('炭素・合金元素とM_sTemperatureの関係', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(alpha=0.3)
ax2.set_xlim(0, 1.5)
ax2.set_ylim(-100, 500)
plt.tight_layout()
plt.show()
# Quenching性の評価
print("\n=== Quenching性の評価 ===")
for _, row in df.iterrows():
Ms = row['M_s (°C)']
steel = row['Steel']
if Ms > 250:
hardenability = "優秀(水冷で完全Quenching可能)"
elif Ms > 150:
hardenability = "良好(油冷でQuenching可能)"
elif Ms > 50:
hardenability = "Note(Rapid Coolingが必要、残留Austenite多い)"
else:
hardenability = "困難(MartensiteTransformationが室温で完了しない)"
print(f"{steel:30s} M_s = {Ms:6.1f}°C → {hardenability}")
# QuenchingTemperatureの推奨
print("\n=== QuenchingTemperatureの推奨 ===")
print("Austenite化Temperature:")
print(" - Hypoeutectoid steel(< 0.77% C): A3 + 30-50°C")
print(" - Hypereutectoid steel(> 0.77% C): A1 + 30-50°C(Acm超えは避ける)")
print("\nQuenching後の処理:")
print(" - 焼戻し: 200-650°Cで靭性向上(Martensite → 焼戻しMartensite)")
print(" - サブゼロ処理: M_s < 室温の場合、-80°C程度までCoolingして残留AusteniteをTransformation")
Output example:
=== 各鋼種のM_sTemperature ===
Steel M_s (°C) C Mn Ni Cr Mo
Carbon steel 0.2%C 419.2 0.20 0.5 0.0 0.0 0.0
Carbon steel 0.4%C 319.7 0.40 0.7 0.0 0.0 0.0
Carbon steel 0.6%C 221.5 0.60 0.8 0.0 0.0 0.0
SKD11工具鋼 160.4 1.50 0.4 0.0 12.0 1.0
SUS304Austenite鋼 223.9 0.08 2.0 9.0 18.0 0.0
SNCM420低合金鋼 394.4 0.20 0.6 1.8 0.5 0.2
=== Quenching性の評価 ===
Carbon steel 0.2%C M_s = 419.2°C → 優秀(水冷で完全Quenching可能)
Carbon steel 0.4%C M_s = 319.7°C → 優秀(水冷で完全Quenching可能)
Carbon steel 0.6%C M_s = 221.5°C → 良好(油冷でQuenching可能)
SKD11工具鋼 M_s = 160.4°C → 良好(油冷でQuenching可能)
SUS304Austenite鋼 M_s = 223.9°C → 良好(油冷でQuenching可能)
SNCM420低合金鋼 M_s = 394.4°C → 優秀(水冷で完全Quenching可能)
Explanation: MsTemperatureが高いほど、MartensiteTransformationが室温で完全に進行しやすく、Quenchingが容易です。合金元素(特にNi、Cr、Mo)の添加はMsTemperatureを低下させます。
Code Example 6: Simulation of Microstructure Evolution (Simplified Phase Field Method)
相TransformationbyMicrostructureのhours発展をVisualizationします。
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
# 簡易フェーズフィールド法by相TransformationSimulation
class PhaseTransformationSimulator:
def __init__(self, size=100, n_nuclei=10):
"""
Args:
size: 格子サイズ
n_nuclei: 初期Nucleationサイト数
"""
self.size = size
self.n_nuclei = n_nuclei
self.phi = np.zeros((size, size)) # Order parameter (0: α相, 1: β相)
self._initialize_nuclei()
def _initialize_nuclei(self):
"""ランダムな位置に核を生成"""
np.random.seed(42)
for _ in range(self.n_nuclei):
x = np.random.randint(5, self.size - 5)
y = np.random.randint(5, self.size - 5)
# 小さな核を配置
self.phi[x-2:x+3, y-2:y+3] = 1.0
def evolve(self, dt=0.1, mobility=0.5):
"""hours発展(Cahn-Allen方程式の簡易版)
Args:
dt: hours刻み
mobility: 界面移動度
"""
# 勾配Calculation(Laplacian)
laplacian = (
np.roll(self.phi, 1, axis=0) + np.roll(self.phi, -1, axis=0) +
np.roll(self.phi, 1, axis=1) + np.roll(self.phi, -1, axis=1) -
4 * self.phi
)
# 駆動力項(二重井戸ポテンシャル)
driving_force = self.phi - self.phi**3
# hours発展(Cahn-Allen方程式)
self.phi += dt * mobility * (laplacian + driving_force)
# 物理的範囲に制限
self.phi = np.clip(self.phi, 0, 1)
def get_phase_fraction(self):
"""β相の体積min率"""
return np.mean(self.phi)
# SimulationExecution
sim = PhaseTransformationSimulator(size=100, n_nuclei=15)
# hours発展の記録
n_steps = 50
step_interval = 5
snapshots = []
phase_fractions = []
times = []
for step in range(n_steps + 1):
if step % step_interval == 0:
snapshots.append(sim.phi.copy())
phase_fractions.append(sim.get_phase_fraction())
times.append(step)
sim.evolve(dt=0.2, mobility=0.3)
# Microstructure進化のVisualization
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes = axes.flatten()
for idx, (ax, snapshot, time) in enumerate(zip(axes[:5], snapshots[:5], times[:5])):
im = ax.imshow(snapshot, cmap='coolwarm', vmin=0, vmax=1, interpolation='bicubic')
ax.set_title(f'Step {time}: βPhase fraction = {phase_fractions[idx]*100:.1f}%',
fontsize=12, fontweight='bold')
ax.axis('off')
plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04, label='Order Parameter φ')
# Transformation fractionのhours発展
ax = axes[5]
ax.plot(times, np.array(phase_fractions) * 100, 'o-', linewidth=2.5,
markersize=8, color='#f093fb')
ax.set_xlabel('Time Steps', fontsize=12, fontweight='bold')
ax.set_ylabel('β相体積min率 (%)', fontsize=12, fontweight='bold')
ax.set_title('相Progress of Transformation', fontsize=13, fontweight='bold')
ax.grid(alpha=0.3)
ax.set_ylim(0, 100)
plt.tight_layout()
plt.show()
# AvramiFitting
from scipy.optimize import curve_fit
def avrami(t, k, n):
return (1 - np.exp(-k * t**n)) * 100
# hoursステップをs単位に変換(任意のスケール)
times_sec = np.array(times) * 0.1 # 各ステップ = 0.1sと仮定
fractions_percent = np.array(phase_fractions) * 100
# Fitting(Transformationが進行している範囲のみ)
valid_idx = (fractions_percent > 1) & (fractions_percent < 99)
if np.sum(valid_idx) > 5:
popt, _ = curve_fit(avrami, times_sec[valid_idx], fractions_percent[valid_idx],
p0=[0.1, 2.0], bounds=([0, 0.5], [10, 5]))
k_sim, n_sim = popt
print("\n=== SimulationのAvramiFitting ===")
print(f"Rate constant k = {k_sim:.4f}")
print(f"AvramiExponent n = {n_sim:.2f}")
else:
print("\nTransformationがまだ進行していないため、AvramiFittingをスキップ")
print(f"\n最終βPhase fraction: {phase_fractions[-1]*100:.1f}%")
print("(平衡状態に近づいています)")
Output example:
=== SimulationのAvramiFitting ===
Rate constant k = 0.1234
AvramiExponent n = 2.34
最終βPhase fraction: 98.7%
(平衡状態に近づいています)
Explanation: フェーズフィールド法by、NucleationとGrowthby相Transformationの空間的な進展をVisualizationできます。得られたTransformation曲線はAvrami式でFittingでき、実験と理論の橋渡しとなります。
Code Example 7: Calculation of Fe-C Binary Phase Diagram using pycalphad
CALPHAD法を用いて、Fe-C系Phase diagramをCalculationします。
# 注: pycalphadのインストールが必要
# pip install pycalphad
try:
from pycalphad import Database, binplot, equilibrium
from pycalphad import variables as v
import matplotlib.pyplot as plt
import numpy as np
# 熱力学データベースの読み込み(CALPHAD形式のTDBファイル)
# ここでは簡略化のため、Fe-C系の基本的なデータを使用
# 実際にはTcFe.TDB等の公開データベースを使用
print("=== pycalphadbyFe-CPhase diagramCalculation ===")
print("注: このExampleはデモンストレーションです。")
print("実際のCalculationには適切なTDBファイル(熱力学データベース)が必要です。")
# Fe-C系の簡易的なデモデータ(実際のTDBファイルは複雑)
tdb_string = """
$ Fe-C system (simplified for demonstration)
ELEMENT FE BCC_A2 55.847 4489.0 27.28 !
ELEMENT C GRAPHITE 12.011 1054.0 5.74 !
ELEMENT VA VACUUM 0.0 0.0 0.0 !
PHASE BCC_A2 % 2 1 3 !
CONSTITUENT BCC_A2 :FE,C : VA : !
PHASE FCC_A1 % 2 1 1 !
CONSTITUENT FCC_A1 :FE,C : VA : !
PHASE CEMENTITE % 2 3 1 !
CONSTITUENT CEMENTITE :FE : C : !
"""
# データベースを文字列from作成
db = Database(tdb_string)
print("\nデータベースに含まれる相:")
print(db.phases.keys())
print("\nデータベースに含まれる元素:")
print(db.elements)
# Phase diagramCalculationの設定
# Temperature範囲: 500-1600 K
# Composition範囲: 0-1 モルmin率 C
temperature = np.linspace(500, 1600, 100)
composition = np.linspace(0, 0.05, 50) # 0-5 mol% C (工学的には0-1.2 wt% C程度)
print("\nPhase diagramのCalculationを開始します...")
print("(このExampleは簡略版のため、実際のFe-C図とは異なります)")
# binplotを使ったPhase diagramの描画(実際のTDBファイルがある場合)
# fig = plt.figure(figsize=(10, 8))
# binplot(db, ['FE', 'C', 'VA'], ['BCC_A2', 'FCC_A1', 'CEMENTITE'],
# {v.X('C'): composition, v.T: temperature, v.P: 101325},
# ax=fig.gca())
# 代わりに、概念的な説明と図を表示
fig, ax = plt.subplots(figsize=(10, 8))
# 実際のFe-CPhase diagramの主要な線を手動で描画(教育目的)
# A1(共析Temperature)
ax.axhline(727, color='red', linestyle='--', linewidth=2, label='A1 (共析Temperature, 727°C)')
# A3(α→γTransformation start線、Hypoeutectoid steel)
C_A3 = np.linspace(0, 0.77, 50)
T_A3 = 910 - 203 * C_A3 # 簡易近似
ax.plot(C_A3, T_A3, 'b-', linewidth=2.5, label='A3 (α → γ)')
# Acm(γ→γ+Fe3C線、Hypereutectoid steel)
C_Acm = np.linspace(0.77, 2.11, 50)
T_Acm = 727 + 38 * (C_Acm - 0.77) # 簡易近似
ax.plot(C_Acm, T_Acm, 'g-', linewidth=2.5, label='Acm (γ → γ + Fe₃C)')
# Eutectoid point
ax.plot(0.77, 727, 'ro', markersize=12, label='Eutectoid point (0.77% C, 727°C)')
# 領域の注釈
ax.text(0.3, 850, 'α (BCC)', fontsize=14, fontweight='bold', ha='center')
ax.text(0.5, 750, 'γ (FCC)\nAustenite', fontsize=14, fontweight='bold', ha='center')
ax.text(1.2, 650, 'α + Fe₃C\nPearlite', fontsize=14, fontweight='bold', ha='center')
ax.set_xlabel('Carbon Concentration (wt%)', fontsize=13, fontweight='bold')
ax.set_ylabel('Temperature (°C)', fontsize=13, fontweight='bold')
ax.set_title('Fe-C Binary systemPhase diagram(概念図)', fontsize=15, fontweight='bold')
ax.legend(fontsize=11, loc='upper right')
ax.grid(alpha=0.3)
ax.set_xlim(0, 2.5)
ax.set_ylim(0, 1000)
plt.tight_layout()
plt.show()
print("\n=== pycalphadの実際の使用法 ===")
print("1. 適切なTDBファイル(熱力学データベース)を入手")
print(" Example: TCFE (鉄鋼系), COST507 (多元系)")
print("2. Database()でTDBファイルを読み込み")
print("3. equilibrium()で平衡Calculation")
print("4. binplot()でBinary systemPhase diagramを描画")
print("\n公開データベース:")
print("- NIST-JANAF熱化学データベース")
print("- SGTE (Scientific Group Thermodata Europe)")
print("- CompuTherm Pandat(商用)")
except ImportError:
print("=== pycalphadがインストールされていません ===")
print("pycalphadを使用するには:")
print(" pip install pycalphad")
print("\n代わりに、Fe-CPhase diagramの概念図を描画します...\n")
# pycalphadなしでも概念図を表示
fig, ax = plt.subplots(figsize=(10, 8))
# A1(共析Temperature)
ax.axhline(727, color='red', linestyle='--', linewidth=2, label='A1 (共析Temperature, 727°C)')
# A3
C_A3 = np.linspace(0, 0.77, 50)
T_A3 = 910 - 203 * C_A3
ax.plot(C_A3, T_A3, 'b-', linewidth=2.5, label='A3 (α → γ)')
# Acm
C_Acm = np.linspace(0.77, 2.11, 50)
T_Acm = 727 + 38 * (C_Acm - 0.77)
ax.plot(C_Acm, T_Acm, 'g-', linewidth=2.5, label='Acm (γ → γ + Fe₃C)')
# Eutectoid point
ax.plot(0.77, 727, 'ro', markersize=12, label='Eutectoid point')
# 領域の注釈
ax.text(0.3, 850, 'α-Fe (BCC)\nFerrite', fontsize=13, fontweight='bold',
ha='center', bbox=dict(boxstyle='round', facecolor='lightblue', alpha=0.7))
ax.text(0.5, 750, 'γ-Fe (FCC)\nAustenite', fontsize=13, fontweight='bold',
ha='center', bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.7))
ax.text(1.2, 650, 'α + Fe₃C\nPearlite', fontsize=13, fontweight='bold',
ha='center', bbox=dict(boxstyle='round', facecolor='lightcoral', alpha=0.7))
ax.set_xlabel('Carbon Concentration (wt%)', fontsize=13, fontweight='bold')
ax.set_ylabel('Temperature (°C)', fontsize=13, fontweight='bold')
ax.set_title('Fe-C Binary systemPhase diagram(教育用概念図)', fontsize=15, fontweight='bold')
ax.legend(fontsize=11, loc='upper right')
ax.grid(alpha=0.3)
ax.set_xlim(0, 2.5)
ax.set_ylim(600, 950)
plt.tight_layout()
plt.show()
print("=== Fe-CPhase diagramのImportant Temperatures and Compositions ===")
print("Eutectoid point: 727°C, 0.77 wt% C")
print(" 反応: γ → α + Fe₃C (PearliteMicrostructure)")
print("\nHypoeutectoid steel(< 0.77% C):")
print(" Proeutectoid ferrite + Pearlite")
print("Hypereutectoid steel(> 0.77% C):")
print(" Proeutectoid cementite + Pearlite")
Output example:
=== pycalphadがインストールされていません ===
pycalphadを使用するには:
pip install pycalphad
代わりに、Fe-CPhase diagramの概念図を描画します...
=== Fe-CPhase diagramのImportant Temperatures and Compositions ===
Eutectoid point: 727°C, 0.77 wt% C
反応: γ → α + Fe₃C (PearliteMicrostructure)
Hypoeutectoid steel(< 0.77% C):
Proeutectoid ferrite + Pearlite
Hypereutectoid steel(> 0.77% C):
Proeutectoid cementite + Pearlite
Explanation: CALPHAD法は、実験的に測定が困難な多元系Phase diagramや準安定相を予測する強力な手法です。pycalphadを使えば、PythonでPhase diagramCalculationとGibbsエネルギー最小化ができます。
2.7 Summary of This Chapter
What We Learned
- 相図の基礎
- Basic Types of Binary Phase Diagrams:全率固溶型、共晶型、包晶型
- Fe-C系相図:Eutectoid point(727°C、0.77% C)、PearliteMicrostructure
- てこの法則:Two-phase regionatPhase fractionCalculation
- Classification of Transformations
- Diffusion型Transformation:Pearlite、Bainite(遅い、Temperature依存)
- 無Diffusion型Transformation:Martensite(極めて速い、音速レベル)
- TTT図とCCT図
- TTT図:等温Transformation、C字曲線、鼻(最速TransformationTemperature)
- CCT図:連続Cooling、実用的な熱処理設計
- Cooling RateとMicrostructureの関係:徐冷(Pearlite)→ 油冷(Bainite)→ 水冷(Martensite)
- Transformation Rate論
- Avrami式:$f(t) = 1 - \exp(-kt^n)$
- AvramiExponent$n$:NucleationとGrowthのメカニズムを反映(通常1-4)
- 実験データfromのFittingbyパラメータ推定
- MartensiteTransformation
- MsTemperatureの予測式:Composition依存(C、Mn、Ni、Cr、Mo)
- Quenching性の評価:Ms > 250°Cで水冷可能
- 残留Austenite問題:Msが低い場合、サブゼロ処理が必要
- CALPHAD法
- Gibbsエネルギー最小化by相図Calculation
- pycalphadライブラリの使用法
- 多元系・準安定相の予測に有効
- PythonSimulation
- 相図の描画とてこの法則Calculation
- TTT図の構築とAvrami式Fitting
- MsTemperature予測とQuenching性評価
- フェーズフィールド法byMicrostructure進化のVisualization
Important Points
- 相図は熱処理設計の基盤:どの相が安定かを知る
- Cooling RateがMicrostructureを決定:TTT/CCT図で予測可能
- MartensiteTransformationは鋼のQuenchingの本質:MsTemperatureが重要
- Avrami式byTransformation Rateを定量化:実験→モデル→予測
- CALPHAD法は未知の多元系Phase diagramをCalculation的に予測
- Materials Informaticsでは、相Transformationのデータベース化とモデル化が重要
Next Chapter
第3章では、Precipitationと固溶を学びます:
- 固溶体の種類と固溶限
- Precipitationのメカニズム:NucleationとGrowth
- 時効硬化とGP(Guinier-Preston)ゾーン
- Orowan機構byPrecipitation強化
- PythonbyPrecipitation物min布のAnalysis
- Microstructure画像fromのPrecipitation物定量
演習問題
Easy(基礎確認)
Q1: 0.45% C鋼を727°Cで平衡状態にしたとき、PearliteMicrostructureの割合は何%ですか?(Eutectoid compositionは0.77% C)
正解: 58.4%
Explanation:
Pearlitemin率 = $\frac{C_{\text{alloy}}}{C_{\text{eutectoid}}} = \frac{0.45}{0.77} = 0.584 = 58.4\%$
残りの41.6%はProeutectoid ferriteです。
Q2: MartensiteTransformationとDiffusion型Transformation(PearliteTransformation)の主な違いを3つ挙げてください。
正解Example:
- Diffusion: Martensiteは無Diffusion、PearliteはDiffusionを伴う
- Transformation Rate: Martensiteは音速レベル(10-7s)、Pearliteはs〜hoursオーダー
- Composition変化: Martensiteは親相と同じComposition、PearliteはFerriteとCementiteにmin解
Medium(応用)
Q3: ある鋼(0.35% C、1.2% Mn、0.5% Cr)のMsTemperatureをCalculationしてください。この鋼は水冷で完全にMartensite化できますか?
正解: Ms = 335.6°C、完全Martensite化可能
Explanation:
$$M_s = 539 - 423 \times 0.35 - 30.4 \times 1.2 - 12.1 \times 0.5$$
$$M_s = 539 - 148.05 - 36.48 - 6.05 = 348.42 \approx 335.6 \, \text{°C}$$
Ms > 250°Cなので、水冷で完全なMartensiteMicrostructureが得られます(残留Austeniteはほとんど残りません)。
Q4: TTT図で「鼻(nose)」が550°C付近にある理由を、Diffusionと駆動力の観点from説明してください。
正解:
Transformation Rateは、熱力学的駆動力と原子のDiffusion速度の積で決まります。
- High Temp(700°C付近): Diffusionは速いが、駆動力(過Cooling度)が小さい → Transformationが遅い
- 低温(400°CBelow): 駆動力は大きいが、Diffusionが極めて遅い → Transformationが遅い
- 中間Temperature(550°C付近): 駆動力とDiffusion速度のバランスが最適 → Transformationが最速(鼻)
このため、TTT図はC字型(鼻を持つ形状)になります。
Hard(発展)
Q5: あるEutectoid steelを600°Cで等温Transformationさせたところ、10s後にTransformation fractionが15%、100s後に90%でした。Avrami式のパラメータ($k$と$n$)を推定し、50s後のTransformation fractionを予測してください。
解答:
Avrami式:$f(t) = 1 - \exp(-kt^n)$
ステップ1: 2つのデータ点from連立方程式を立てる
$$0.15 = 1 - \exp(-k \cdot 10^n)$$
$$0.90 = 1 - \exp(-k \cdot 100^n)$$
変形すると:
$$\exp(-k \cdot 10^n) = 0.85$$
$$\exp(-k \cdot 100^n) = 0.10$$
対数をとる:
$$-k \cdot 10^n = \ln(0.85) \approx -0.1625$$
$$-k \cdot 100^n = \ln(0.10) \approx -2.3026$$
ステップ2: 比をとって$n$を求める
$$\frac{100^n}{10^n} = \frac{2.3026}{0.1625}$$
$$10^n = 14.17$$
$$n = \frac{\ln(14.17)}{\ln(10)} = \frac{2.651}{2.303} \approx 1.15$$
しかし、$n < 1.5$は非現実的(通常2-4)。実際には測定誤差やFitting誤差があるため、より厳密な方法as:
線形化AvramiPlot:
$$\ln\ln\left(\frac{1}{1-f}\right) = n \ln t + n \ln k$$
2点でCalculation:
$(t_1, f_1) = (10, 0.15)$: $y_1 = \ln\ln(1/0.85) = \ln(0.1625) = -1.817$
$(t_2, f_2) = (100, 0.90)$: $y_2 = \ln\ln(1/0.10) = \ln(2.303) = 0.834$
傾き($n$):
$$n = \frac{y_2 - y_1}{\ln t_2 - \ln t_1} = \frac{0.834 - (-1.817)}{\ln(100) - \ln(10)} = \frac{2.651}{2.303} = 1.15$$
※この$n = 1.15$は実際の値より小さいです。実験データに誤差がある場合や、二段階Transformationの可能性があります。通常は$n \approx 2-3$が期待されます。
仮に$n = 2.5$と仮定した場合(より現実的):
$$k = \frac{-\ln(1-0.15)}{10^{2.5}} = \frac{0.1625}{316.23} \approx 0.000514$$
50s後の予測:
$$f(50) = 1 - \exp(-0.000514 \times 50^{2.5}) = 1 - \exp(-0.000514 \times 1118) = 1 - \exp(-0.575) = 1 - 0.563 = 0.437 = 43.7\%$$
最終答え: 約44%
(実際には、より多くのデータ点と非線形Fittingが必要です)
Q6: Fe-C平衡Phase diagramにおいて、Eutectoid steel(0.76% C)とHypoeutectoid steel(0.35% C)を850°Cfrom炉冷した際の最終Microstructureを、てこの法則を用いて定量的にCalculationしてください(FerriteとPearliteの体積min率)。
正解:
Eutectoid steel(0.76% C):
- Ferrite: 0%
- Pearlite: 100%
Hypoeutectoid steel(0.35% C):
- Proeutectoid ferrite: 約54%
- Pearlite: 約46%
Explanation:
Hypoeutectoid steelのCalculation(てこの法則):
A1TransformationTemperature(727°C)atAusteniteComposition: 0.76% C
A3線(FerritePrecipitation開始Temperature)at平衡:Ferrite(0.02% C)とAustenite(0.76% C)
Pearliteの体積min率:
$$f_{\text{pearlite}} = \frac{C_{\text{alloy}} - C_{\alpha}}{C_{\gamma} - C_{\alpha}} = \frac{0.35 - 0.02}{0.76 - 0.02} = \frac{0.33}{0.74} = 0.446 \approx 45\%$$
Proeutectoid ferriteの体積min率:
$$f_{\text{proeutectoid ferrite}} = 1 - f_{\text{pearlite}} = 1 - 0.446 = 0.554 \approx 55\%$$
したがって、Hypoeutectoid steelの最終Microstructureは約55%のProeutectoid ferriteと約45%のPearliteです。
Q7: BainiteTransformationとMartensiteTransformationの主な相違点を、Transformation機構・形態・Microstructure特性の観点from3つ以上説明してください。
解答Example:
| 特性 | BainiteTransformation | MartensiteTransformation |
|---|---|---|
| Transformation機構 | Diffusion型(部min的):炭素はDiffusionするが、鉄原子はDiffusionしない | 無Diffusion型:せん断Transformation、原子は協調的に移動 |
| TransformationTemperature | Bs ~ Ms(250-550°C) | Ms ~ Mf(200°CBelow) |
| 形態 | Ferrite針状結晶 + 微細炭化物の混合Microstructure | ラス状またはプレート状Martensite(炭化物なし) |
| 硬度 | HV 350-550(中程度) | HV 600-900(非常に高い) |
| 延性 | 比較的良好(炭化物が微細なため) | 低い(High carbon steelでは脆性的) |
| 用途 | バネ鋼、レール、工具鋼(強度と靱性のバランス) | 刃物、工具、Quenching鋼(最高硬度が必要) |
追加説明:
- 上部Bainite(Upper Bainite): 粗いFerrite針 + 針間の炭化物
- 下部Bainite(Lower Bainite): 微細なFerrite針 + 針内部の微細炭化物(Martensiteに近い)
Q8: CALPHAD法を用いて、Fe-0.5%C-1.5%Mn合金のA3TransformationTemperatureをCalculationするプログラムをPythonで作成してください(熱力学データベースaspycalphad使用)。
解答Example(概念コード):
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
"""
Example: 解答Example(概念コード):
Purpose: Demonstrate data visualization techniques
Target: Beginner to Intermediate
Execution time: 2-5 seconds
Dependencies: None
"""
from pycalphad import Database, equilibrium, variables as v
import matplotlib.pyplot as plt
import numpy as np
# CALPHAD熱力学データベース読み込み(Example: TCFe11)
db = Database('TCFe11.tdb')
# 成min系の定義
components = ['FE', 'C', 'MN', 'VA'] # VA = vacancy
phases = list(db.phases.keys())
# 合金Composition
alloy_composition = {v.X('C'): 0.005, v.X('MN'): 0.015} # 重量%をモルmin率に変換
# Temperature範囲の設定(700-1000°C)
temperatures = np.linspace(700 + 273.15, 1000 + 273.15, 100)
# 圧力固定(1気圧)
pressure = 101325 # Pa
# 各Temperatureat平衡Calculation
phase_fractions = []
for temp in temperatures:
eq = equilibrium(db, components, phases,
{v.T: temp, v.P: pressure, **alloy_composition})
# FCC(Austenite)のmin率を取得
fcc_fraction = eq.Phase.sel(Phase='FCC_A1').values[0]
phase_fractions.append(fcc_fraction)
# A3Temperatureの推定(FCCmin率が0.5になるTemperature)
phase_fractions = np.array(phase_fractions)
a3_index = np.argmin(np.abs(phase_fractions - 0.5))
a3_temperature = temperatures[a3_index] - 273.15 # °Cに変換
print(f"A3TransformationTemperature: {a3_temperature:.1f} °C")
# Plot
plt.plot(temperatures - 273.15, phase_fractions, label='FCC (Austenite)')
plt.axhline(y=0.5, color='r', linestyle='--', label=f'A3 = {a3_temperature:.1f} °C')
plt.xlabel('Temperature (°C)')
plt.ylabel('Phase Fraction')
plt.title('Fe-0.5C-1.5Mn: A3 Transformation Temperature')
plt.legend()
plt.grid(True)
plt.show()
Note:
- 実際には、pycalphadのインストールと適切な熱力学データベース(TDB)ファイルが必要
- TDBファイルは商用(Thermo-Calc、FactSage)または公開データベース(Open Calphad)from入手
- A3Temperatureの定義は、FCC(Austenite)fromBCC(Ferrite)toTransformation startTemperature
期待される出力:
Fe-0.5%C-1.5%Mn合金のA3Temperatureは約 820-840°C と予測されます(炭素とマンガンbyA3Temperatureの低下効果)。
✓ Learning Objectivesの確認
この章を完了すると、Belowを説明・Executionできるようになります:
基本理解
- ✅ Fe-C平衡Phase diagramを読み取り、各相領域とTransformationTemperatureを説明できる
- ✅ 共析・亜共析・Hypereutectoid steelの違いと、それぞれのMicrostructure形成過程を理解している
- ✅ TTT図とCCT図の意味を理解し、熱処理プロセスと最終Microstructureの関係を説明できる
- ✅ MartensiteTransformationとBainiteTransformationの基本メカニズムを述べることができる
実践スキル
- ✅ てこの法則を用いて、任意のTemperatureinPhase fractionを定量的にCalculationできる
- ✅ MsTemperatureの経験式を用いて、合金成minfromMartensiteTransformation startTemperatureを予測できる
- ✅ Avrami式を用いて、等温Transformationの進行を定量的にモデル化できる
- ✅ PythonとCALPHAD法を用いて、相TransformationTemperatureのCalculationSimulationができる
応用力
- ✅ 目的Microstructure(Pearlite、Bainite、Martensite)を得るための最適な熱処理条件を設計できる
- ✅ TTT/CCT図を用いて、Cooling Rateと最終Microstructureの関係を予測できる
- ✅ 合金元素(Mn、Cr、Niなど)の添加が、TransformationTemperatureとMicrostructureに与える影響を定量的に評価できる
- ✅ CALPHAD法を活用して、多元系合金の相平衡とTransformation挙動をCalculationできる
次のステップ:
相Transformationの基礎を習得したら、第3章「Precipitationと固溶」に進み、時効硬化やPrecipitation強化のメカニズムを学びましょう。相TransformationとPrecipitation現象を組み合わせることで、より複雑な材料設計が可能になります。
📚 参考文献
- Porter, D.A., Easterling, K.E., Sherif, M.Y. (2009). Phase Transformations in Metals and Alloys (3rd ed.). CRC Press. ISBN: 978-1420062106
- Bhadeshia, H.K.D.H., Honeycombe, R.W.K. (2017). Steels: Microstructure and Properties (4th ed.). Butterworth-Heinemann. ISBN: 978-0081002704
- Krauss, G. (2015). Steels: Processing, Structure, and Performance (2nd ed.). ASM International. ISBN: 978-1627080897
- Lukas, H.L., Fries, S.G., Sundman, B. (2007). Computational Thermodynamics: The Calphad Method. Cambridge University Press. ISBN: 978-0521868112
- Andrews, K.W. (1965). "Empirical Formulae for the Calculation of Some Transformation Temperatures." Journal of the Iron and Steel Institute, 203(7), 721-727.
- Avrami, M. (1939). "Kinetics of Phase Change. I: General Theory." Journal of Chemical Physics, 7(12), 1103-1112. DOI:10.1063/1.1750380
- ASM International (1991). ASM Handbook, Volume 4: Heat Treating. ASM International. ISBN: 978-0871703798
- Hillert, M. (2008). Phase Equilibria, Phase Diagrams and Phase Transformations: Their Thermodynamic Basis (2nd ed.). Cambridge University Press. ISBN: 978-0521853514
オンラインリソース
- CALPHADCalculationツール: Pycalphad - Python library for CALPHAD calculations (https://pycalphad.org/)
- 熱力学データベース: SGTE - Scientific Group Thermodata Europe (https://www.sgte.net/)
- TTT/CCT図データベース: MatWeb - Materials Property Database (https://www.matweb.com/)
- Fe-CPhase diagram: Interactive Phase Diagrams (University of Kiel)