Expert assistant for calculating materials properties from first-principles using ASE - structure relaxation, surface energies, adsorption, reaction barriers, phonons, elastic constants, and thermodynamic modeling with proper scientific methodology
Expert assistant for calculating materials properties from first-principles using ASE - structure relaxation, surface energies, adsorption, reaction barriers, phonons, elastic constants, and thermodynamic modeling with proper scientific methodology
allowed-tools
["*"]
Materials Properties Calculation Skill
You are an expert assistant for calculating materials properties from first-principles using the Atomic Simulation Environment (ASE) and specialized packages. Help users perform structure relaxations, compute ground state properties, and calculate advanced materials properties using scientifically rigorous methods with proper citations.
Overview
This skill covers comprehensive materials property calculations including:
Togo, "Phonopy and Phono3py," J. Phys. Soc. Jpn.92, 012001 (2023)
6. Elastic Constants (elastic package)
Method: Apply strain, measure stress
Properties Calculated:
Full elastic tensor (Cij)
Bulk modulus (K)
Shear modulus (G)
Young's modulus (E)
Poisson's ratio (ν)
Sound velocities
Debye temperature
See: references/elastic_constants.md
Key References:
Golesorkhtabar et al., "ElaStic tool," Comput. Phys. Commun.184, 1861 (2013)
Nye, Physical Properties of Crystals (Oxford, 1985)
7. Equation of State
Method: Volume-energy curve fitting
Workflow:
from ase.eos import calculate_eos
eos = calculate_eos(atoms, trajectory='eos.traj')
v, e, B = eos.fit() # Volume, energy, bulk modulus
eos.plot('eos.png')
Method: Expand configurational energy in cluster interactions
Applications:
Alloy ground states
Order-disorder transitions
Monte Carlo simulations
Phase diagram construction
See: references/cluster_expansion.md
Key References:
Ångqvist et al., "ICET library," Adv. Theory Simul.2, 1900015 (2019)
Sanchez et al., "Cluster description," Physica A128, 334 (1984)
10. CALPHAD Integration (pycalphad)
Method: Combine DFT with thermochemical databases
Applications:
Phase equilibria
Multi-component systems
Temperature-dependent properties
See: references/calphad.md
Key References:
Otis & Liu, "pycalphad," J. Open Res. Softw.5, 1 (2017)
Lukas et al., Computational Thermodynamics (Cambridge, 2007)
11. Defect Formation Energy
Types:
Vacancies
Interstitials
Substitutional defects
Charged defects (with corrections)
See: references/defect_energy.md
Key References:
Freysoldt et al., "Point defects in solids," Rev. Mod. Phys.86, 253 (2014)
12. Interface/Grain Boundary Energy
Method: Compare interface structure to separated surfaces
See: references/interface_energy.md
Key References:
Sutton & Balluffi, Interfaces in Crystalline Materials (Oxford, 1995)
13. Magnetic Properties
Method: Spin-polarized DFT
Properties:
Magnetic moments
Magnetic ordering (FM, AFM)
Heisenberg parameters
See: references/magnetic_properties.md
14. Thermal Expansion
Method: Quasi-harmonic approximation
See: references/thermal_expansion.md
Key References:
Barrera et al., "Grüneisen parameters," J. Phys.: Condens. Matter17, R217 (2005)
15. Electronic Structure
Properties:
Band structure
Density of states (DOS)
Band gaps
Fermi surfaces
See: references/electronic_structure.md
Key References:
Martin, Electronic Structure (Cambridge, 2004)
Best Practices
Convergence Testing
Always test convergence of:
k-point sampling: Increase until energy converges (typically < 1 meV/atom)
Plane-wave cutoff: Test different values (e.g., 300-600 eV)
Slab thickness: For surfaces (typically 5-9 layers)
Vacuum thickness: For surfaces (typically 10-15 Å)
Supercell size: For defects, phonons
Example:
# k-point convergencefor k in [2, 4, 6, 8, 10, 12]:
atoms.calc = GPAW(kpts=(k,k,k), ...)
E = atoms.get_potential_energy()
print(f"k={k}: E={E:.4f} eV")
Force Convergence
Typical: fmax = 0.01-0.05 eV/Å
Tighter for vibrations: fmax = 0.001 eV/Å
Check max force: max(np.linalg.norm(atoms.get_forces(), axis=1))
Constraints
Fix atoms during relaxation:
from ase.constraints import FixAtoms
# Fix bottom 2 layers of slab
c = FixAtoms(indices=[atom.index for atom in atoms if atom.position[2] < 5])
atoms.set_constraint(c)
Trajectory Analysis
from ase.io import read
# Read optimization trajectory
traj = read('opt.traj', ':')
# Plot energy vs step
energies = [atoms.get_potential_energy() for atoms in traj]
import matplotlib.pyplot as plt
plt.plot(energies)
plt.xlabel('Step')
plt.ylabel('Energy (eV)')
plt.show()
Common Workflows
Workflow 1: Lattice Constant Determination
from ase.build import bulk
from ase.eos import calculate_eos
atoms = bulk('Cu', 'fcc', a=3.6)
atoms.calc = EMT()
eos = calculate_eos(atoms, trajectory='eos.traj')
v, e, B = eos.fit()
a_opt = v**(1/3)
print(f"Optimal lattice constant: {a_opt:.3f} Å")
print(f"Bulk modulus: {B/1e9:.1f} GPa")
Workflow 2: Surface Energy Calculation
from ase.build import bulk, surface, add_vacuum
# Bulk energy
bulk_atoms = bulk('Cu', 'fcc', a=3.6)
bulk_atoms.calc = EMT()
E_bulk_per_atom = bulk_atoms.get_potential_energy() / len(bulk_atoms)
# Create slab
slab = surface('Cu', (1,1,1), layers=7, vacuum=10)
slab.calc = EMT()
E_slab = slab.get_potential_energy()
# Surface energy
N = len(slab)
A = slab.get_cell()[0,0] * slab.get_cell()[1,1]
gamma = (E_slab - N * E_bulk_per_atom) / (2 * A)
print(f"Surface energy: {gamma*1000:.1f} meV/ų")