Point-Defect Formation Energy (DFT)
SkillDev toolsCalculate charged defect formation energies and transition level diagrams using pymatgen-analysis-defects and atomate2 VASP workflows.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Point-Defect Formation Energy (DFT) skill
What this skill tells your AI
The instructions your AI receives, as published by learningmatter-mit/atomisticskills in .agents/skills/mat-defect-energy-dft/SKILL.md and read by ahel’s review.
Goal
To calculate the formation energy of point defects (vacancies, substitutions, interstitials) including charged defect states and finite-size corrections using DFT (VASP) via atomate2 workflows. This produces formation energy diagrams showing defect charge transition levels as a function of Fermi energy.
$$E_f[D^q] = E[D^q] - E[\text{bulk}] + \sum_i \Delta n_i \mu_i + q(E_\text{VBM} + \Delta E_F) + E_\text{corr}$$
where $q$ is the charge state, $E_\text{VBM}$ is the valence band maximum, $\Delta E_F$ is the Fermi energy relative to VBM, and $E_\text{corr}$ is the finite-size correction (Freysoldt/FNV).
Instructions
1. Obtain Bulk Structure
Start with a relaxed primitive cell:
mcp_base_search_materials_project_by_formula(formula="MgO", save_to_file="MgO.cif")
2. Generate Defect Structures
Use pymatgen-analysis-defects to generate all symmetry-unique defect supercells with charge states:
# Env: base-agent
python .agents/skills/mat-defect-energy-dft/scripts/generate_defect_structures.py \
--bulk MgO.cif \
--supercell_size 3 3 3 \
--defect_type vacancy \
--charge_range -2 2 \
--output dft_defects/
This generates:
- POSCAR files for each defect × charge state
- A
defect_index.jsonmapping defect names to charge states and structures - Pristine supercell for the bulk reference
3. Run DFT Calculations (atomate2)
Submit calculations via the atomate2 MCP tool:
# Bulk supercell reference
mcp_atomate2_run_atomate2_vasp_calculation(
structures_path="dft_defects/pristine_supercell.cif",
output_dir="./dft_bulk/",
calculation_type="static",
preset_type="matpes-pbe",
execution_mode="remote"
)
# All defect structures
mcp_atomate2_run_atomate2_vasp_calculation(
structures_path="dft_defects/",
output_dir="./dft_defect_calcs/",
calculation_type="relaxation",
preset_type="matpes-pbe",
execution_mode="remote"
)
Alternative: atomate2 FormationEnergyMaker
For fully automated defect workflows with built-in corrections:
# Env: atomate2-agent (Python API)
from atomate2.vasp.flows.defect import FormationEnergyMaker
from pymatgen.analysis.defects.generators import VacancyGenerator
from pymatgen.core import Structure
bulk = Structure.from_file("MgO.cif")
vac_gen = VacancyGenerator()
defects = vac_gen.generate(bulk)
maker = FormationEnergyMaker()
# Submit via jobflow-remote for each defect
4. Parse Results and Compute Formation Energies
After DFT calculations complete:
# Env: base-agent
python .agents/skills/mat-defect-energy-dft/scripts/parse_defect_results.py \
--bulk_dir dft_bulk/ \
--defect_dir dft_defect_calcs/ \
--defect_index dft_defects/defect_index.json \
--dielectric 9.8 \
--output formation_energies.json \
--plot formation_energy_diagram.png
The script:
- Parses VASP outputs for total energies
- Applies Freysoldt (FNV) finite-size corrections for charged defects
- Determines VBM and band gap from bulk calculation
- Constructs the formation energy diagram
5. Interpret Results
The formation energy diagram shows:
- Slopes: Each line segment has slope = charge state $q$
- Transition levels: Intersections where the stable charge state changes ($\epsilon(q/q')$)
- Low formation energy → high concentration: Defects with low $E_f$ at the Fermi level are most abundant
Examples
Oxygen Vacancy in MgO
# 1. Get MgO
mcp_base_search_materials_project_by_formula(formula="MgO")
# 2. Generate defects with charges -2 to +2
python .agents/skills/mat-defect-energy-dft/scripts/generate_defect_structures.py \
--bulk MgO.cif --supercell_size 3 3 3 --defect_type vacancy --charge_range -2 2 --output mgo_defects/
# 3. Run DFT (remote)
mcp_atomate2_run_atomate2_vasp_calculation(
structures_path="mgo_defects/", output_dir="./mgo_dft/",
calculation_type="relaxation", preset_type="matpes-pbe", execution_mode="remote"
)
# 4. Parse and plot (after DFT completes)
python .agents/skills/mat-defect-energy-dft/scripts/parse_defect_results.py \
--bulk_dir mgo_dft/pristine_supercell/ --defect_dir mgo_dft/ \
--defect_index mgo_defects/defect_index.json --dielectric 9.8 --output mgo_fe.json
Constraints
- VASP required: Actual DFT calculations require a valid VASP setup (
PMG_VASP_PSP_DIR, atomate2/jobflow-remote configured). - Supercell size: Use at least 3×3×3 for cubic systems. Charged defect corrections are less reliable for small cells.
- Dielectric constant: The Freysoldt correction requires the static dielectric constant of the host material. Use experimental or computed values.
- Functional: PBE underestimates band gaps → transition levels may be shifted. For accurate results, use HSE06 hybrid functional (requires custom INCAR settings).
- Environments:
- Structure generation:
base-agent(pymatgen-analysis-defects) - DFT submission:
atomate2-agent(via MCP tool) - Post-processing:
base-agent
- Structure generation:
- For neutral defects only (no DFT): See mat-defect-energy for MLIP-based approach.
Author: Bowen Deng Contact: GitHub @learningmatter-mit
Signals
- GitHub stars
- 164
- Forks
- 24
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
mat-defect-energy-dft- Source
- github.com/learningmatter-mit/atomisticskills