---
title: "Ouro DFT on known magnets: Ms and MAE vs experiment"
description: "ABACUS DFT (PBE/DZP) benchmark of five small-cell magnets: saturation magnetization and TB2J MAE against literature values."
url: "https://ouro.foundation/posts/mmoderwell/ouro-dft-on-known-magnets-ms-and-mae-vs-experiment"
id: "019f5b99-c226-71ad-b7b9-1228c72921a3"
type: "post"
---

# Ouro DFT on known magnets: Ms and MAE vs experiment

Post by @mmoderwell in #permanent-magnets (all) · 2026-07-13

- Asset id: `019f5b99-c226-71ad-b7b9-1228c72921a3`
- Page: https://ouro.foundation/posts/mmoderwell/ouro-dft-on-known-magnets-ms-and-mae-vs-experiment

We shipped [Ouro DFT (ABACUS)](https://ouro.foundation/services/mmoderwell/ouro-dft-abacus), a general-purpose DFT property API with structure-keyed SCF caching. Electronic and magnetic endpoints share the same ground-state charge density, so SCF runs once and moments, MAE, DOS, and related properties reuse it.

This is a first sanity check for permanent-magnet screening: run the API on known magnets with ≤6 atoms/cell, compare predicted \(M_s\) and MAE to literature, and see where the ranking holds.

## Setup

|  |  |
| --- | --- |
| Engine | ABACUS LCAO (PBE, DZP, \(E_{\mathrm{cut}}=50\) Ry, \(k\)-spacing \(0.3\,\mathrm{Å}^{-1}\)) |
| Moments | [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments) (collinear SCF + Mulliken) |
| MAE | [Magnetic anisotropy energy](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy) (TB2J, warm-started from collinear charge) |
| Exchange / \(T_C\) | TB2J Jij from collinear SCF + mean-field \(T_C = 2 J_{0,\max}/(3 k_B)\) (upper bound) |
| Cells | All ≤ 6 atoms (primitive Fe is 1) |

Structures on this team:

- [Fe bcc](https://ouro.foundation/files/mmoderwell/fe-bcc-benchmark) (2 → 1 prim)
- [Co hcp](https://ouro.foundation/files/mmoderwell/co-hcp-benchmark) (2)
- [FeCo B2](https://ouro.foundation/files/mmoderwell/feco-b2-benchmark) (2)
- [FePt L1₀](https://ouro.foundation/files/mmoderwell/fept-l10-benchmark) (2)
- [MnBi](https://ouro.foundation/files/mmoderwell/mnbi-benchmark) (4)
- [SmCo₅](https://ouro.foundation/files/mmoderwell/smco5-benchmark) (6), failed: no Sm Dojo NC-FR pseudopotential yet

## Saturation magnetization

\(\mu_0 M_s\) from the moments route vs typical experimental room-temperature values:

| Material | Atoms | Exp. \(\mu_0 M_s\) (T) | DFT \(\mu_0 M_s\) (T) | Δ |
| -------- | ----- | ---------------------- | --------------------- | --- |
| Fe bcc | 1 | 2.15 | **2.32** | +8% |
| Co hcp | 2 | 1.82 | **1.63** | −11% |
| FeCo B2 | 2 | ~2.4 | **2.22** | −7% |
| FePt L1₀ | 2 | ~1.4 | **1.40** | ~0% |
| MnBi | 4 | 0.78-0.90 | **0.91** | within range |

Ranking matches experiment: FeCo and Fe highest, MnBi lowest, FePt in between. Absolute \(M_s\) is already usable for screening at these defaults.

## Magnetic anisotropy energy

TB2J MAE (hard − easy over `{001,100,010}`) vs literature uniaxial \(K_u\) (cubic \(K_1\) for Fe):

| Material | Exp. \(K_u\) (MJ/m³) | DFT MAE (MJ/m³) | Easy axis (DFT) | Exp. easy |
| -------- | -------------------- | --------------- | --------------- | --------- |
| Fe bcc | ~0.05 (\(K_1\)) | **0.0002** | ~isotropic | cubic soft |
| FeCo B2 | ~0 | **0.003** | ~isotropic | cubic soft |
| Co hcp | ~0.45 | **0.44** | ⟨100⟩ | ⟨001⟩ |
| MnBi | 1.2-1.8 (RT) | **0.71** | ⟨100⟩ | ⟨001⟩ (RT) |
| FePt L1₀ | 6-10 | **18.0** | ⟨001⟩ ✓ | ⟨001⟩ |

What holds:

1. Soft vs hard separation works. Fe / FeCo sit near zero; Co / MnBi / FePt are clearly anisotropic.
2. Co magnitude matches experiment (0.44 vs 0.45 MJ/m³), but the predicted easy axis is basal rather than \(c\).
3. FePt is correctly uniaxial along \(c\), with MAE about 2× experimental. Fine for ranking, not for absolute \(K_u\).
4. MnBi is in the right order of magnitude but prefers the basal plane here.

Hardness \(\kappa = \sqrt{K_u / (\mu_0 M_s^2 / 2)}\) from the MAE route ranks the same way: Fe/FeCo soft (\(\kappa \ll 1\)), Co borderline, MnBi and FePt hard.

## Curie temperature (mean-field)

TB2J exchange on the same collinear SCF, with mean-field \(T_C = 2 J_{0,\max}/(3 k_B)\). This is an upper bound and usually overestimates experiment; the ranking is what matters for screening.

| Material | Exp. \(T_C\) (K) | MF \(T_C\) (K) | \(J_{0,\max}\) (meV) | MF / exp |
| -------- | ---------------- | -------------- | -------------------- | -------- |
| Fe bcc | 1043 | **2151** | 278 | 2.1× |
| Co hcp | 1388 | **1558** | 201 | 1.1× |
| FeCo B2 | ~1250-1400 | **2253** | 291 | ~1.7× |
| FePt L1₀ | ~750 | **868** | 112 | 1.2× |
| MnBi | 630 | **892** | 115 | 1.4× |

Ranking matches the known magnets: FeCo and Fe highest, then Co, then MnBi / FePt. Absolute MF \(T_C\) is high (especially Fe and FeCo), as expected for Heisenberg mean-field. Co and FePt are surprisingly close to experiment at these defaults.

### Why the easy axis is sometimes wrong

This does not look like a simple reporting bug. Easy axis is \(\arg\min E\), hard axis is \(\arg\max E\), and MAE is hard − easy. FePt landing on ⟨001⟩ is a useful control: the direction labels and \(\theta,\phi\) mapping are not systematically flipped.

The two mismatches have different explanations.

**MnBi is expected at 0 K.** Experiment is easy-plane below ~90 K and only becomes \(c\)-axis after the spin reorientation (~90-140 K), driven largely by thermal expansion of \(a\). Fixed-cell DFT (and low-\(T\) experiment) routinely prefer the basal plane. Comparing a 0 K MAE sign to room-temperature \(K_u\) is the wrong comparison for MnBi, not evidence that the calculator inverted axes.

**Co is the more interesting case.** PBE/GGA usually gets \(c\)-easy for hcp Co; LDA often flips the sign. We got the right magnitude with the wrong sign. That usually means the energy difference is tiny and sitting near a sign change (~60 µeV total here), not that min/max is backwards. Plausible contributors at these defaults:

- coarse \(k\)-mesh relative to how small the MAE is
- DZP + modest cutoff vs denser PAW setups in the literature
- fixed experimental \(c/a\) (Co MAE sign is lattice-sensitive)
- TB2J magnetic force theorem vs full SOC total-energy differences

So for screening: trust soft vs hard and FePt-like uniaxial ranking; treat absolute MJ/m³ and easy-axis sign as directional, especially for Mn-pnictides and for Co until we converge \(k\), cutoff, and (if needed) a total-energy SOC cross-check.

## Live actions

Moments:

> Embedded route: [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments)

> Embedded route: [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments)

> Embedded route: [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments)

> Embedded route: [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments)

> Embedded route: [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments)

MAE:

> Embedded route: [Magnetic anisotropy energy](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy)

> Embedded route: [Magnetic anisotropy energy](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy)

> Embedded route: [Magnetic anisotropy energy](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy)

> Embedded route: [Magnetic anisotropy energy](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy)

> Embedded route: [Magnetic anisotropy energy](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy)

## Takeaways

- Moments for \(M_s\): already good enough to rank candidates.
- MAE for soft vs hard, and for confirming uniaxial \(c\)-axis cases like FePt. Treat absolute MJ/m³ and easy-axis sign carefully (MnBi: 0 K vs RT; Co: converge before trusting the sign).
- Exchange / mean-field \(T_C\) for ranking ordering temperatures. Use the rank, not the absolute kelvin (MF overestimates, especially Fe / FeCo).
- SCF cache works: MAE warm-started from moments charge; exchange reused the same collinear SCF where available.
- Rare earths: SmCo₅ needs Sm pseudopotentials/orbitals in the Dojo set before RE magnets join this loop.

To try it: run a small CIF on [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments), then [MAE](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy) on the same structure. The second call should reuse SCF.

## Assets in this post

- [Magnetic moments](https://ouro.foundation/routes/mmoderwell/magnetic-moments) (route, id `0a23817e-af47-485a-9c56-5f2df0178b80`)
- [Magnetic anisotropy energy](https://ouro.foundation/routes/mmoderwell/magnetic-anisotropy-energy) (route, id `331d9faf-4b44-4679-a958-5a9a816036e1`)
- [Ouro DFT (ABACUS)](https://ouro.foundation/services/mmoderwell/ouro-dft-abacus) (service, id `accd2d6f-baa1-4094-86ef-76057444b0a3`)
- [Fe bcc (benchmark)](https://ouro.foundation/files/mmoderwell/fe-bcc-benchmark) (file, id `79a3f076-42f0-4db8-8335-5d26528f6cc5`)
- [Co hcp (benchmark)](https://ouro.foundation/files/mmoderwell/co-hcp-benchmark) (file, id `5a8cc78c-5f28-4497-8992-006f58aa450c`)
- [FeCo B2 (benchmark)](https://ouro.foundation/files/mmoderwell/feco-b2-benchmark) (file, id `4d9c26b7-a5ad-4376-85f4-16ccef77353c`)
- [FePt L10 (benchmark)](https://ouro.foundation/files/mmoderwell/fept-l10-benchmark) (file, id `c2fce3d4-f408-48f9-958f-1c1879a853f3`)
- [MnBi (benchmark)](https://ouro.foundation/files/mmoderwell/mnbi-benchmark) (file, id `f0bf1577-4826-41c8-88cc-c6e73a088492`)
- [SmCo5 (benchmark)](https://ouro.foundation/files/mmoderwell/smco5-benchmark) (file, id `803d4df2-163d-44a0-a3c5-d64407a91d85`)
