This repository contains the active multidomain Preisach hysteresis workflow for metal / interlayer / AlScN / metal stacks.
The current active model is:
- multidomain
- history-dependent
- electrostatically self-consistent
- quasistatic
- solved with a bisection-based fixed-point solver
The main output of the active workflow is a family of ferroelectric polarization--voltage hysteresis loops across interlayer thickness, interlayer material, electrode choice, and AlScN thickness.
The repository began from a mentor reference implementation.
Reference attribution:
- Zirun Han's reference implementation: danny1078/fed_multidomain_presaich
The active root no longer mirrors that older tree exactly. It has been trimmed and refocused around the current bisection-based multidomain hysteresis path.
The active source code now lives under src:
src/atomicunits.pysrc/material_types.pysrc/materials.pysrc/fed.pysrc/potential.pysrc/preisach.pysrc/self_consistent_solver.pysrc/plot_il_hysteresis.pysrc/plot_electrode_comparison.py
The active documentation is:
docs/ACTIVE_TREE_WALKTHROUGH.mddocs/multidomain_preisach_hysteresis_report.texdocs/multidomain_preisach_hysteresis_report.pdfdocs/mifm_first_principles_report.texdocs/mifm_first_principles_report.pdf
The active model couples three pieces of physics:
- A multidomain Preisach ferroelectric constitutive law.
- One-dimensional electrostatics for the stack.
- A self-consistent bisection solver that enforces agreement between domain switching and internal field.
At one voltage point, the model does the following:
- Guess the internal ferroelectric field.
- Update which domains would switch under that field.
- Average those domains to obtain the net ferroelectric polarization.
- Feed that polarization into the stack electrostatics.
- Recompute the field implied by that polarization.
- Adjust the field guess until the guessed field and the electrostatic field match.
The plotted quantity in the main hysteresis figures is the net ferroelectric polarization of the AlScN layer.
The active Preisach model samples a structural-disorder variable c/a for each
domain and maps it to local polarization and coercive field using
The net ferroelectric polarization is
The active electrostatic core computes screening charge as
The internal ferroelectric field is then
The active bisection solver searches for a field E satisfying the fixed-point
condition
The active figure workflow uses the baseline materials defined in
src/materials.py.
Important baseline values include:
- Ti work function:
4.33 eV - Al work function:
4.28 eV - Pd work function:
5.30 eV - baseline metal screening length:
0.1 bohr Testscreening length:1.0 bohrTest2screening length:1.0 bohrAl2O3dielectric constant:9.3HfOxdielectric constant:16.64AlScNdielectric constant:16
Test2 is especially useful because it keeps Ti's work function while changing
screening length, which isolates screening effects from built-in work-function
effects.
The main generated figure folders are:
These correspond to AlScN thickness.
Representative active figures include:
45nm_figures/Ti_Al2O3_AlScN_Ti_il_hysteresis.png20nm_figures/Ti_Al2O3_AlScN_Ti_il_hysteresis_12V.png10nm_figures/Ti_Al2O3_AlScN_Ti_il_hysteresis_6p5V.png45nm_figures/Ti_HfOx_AlScN_Ti_il_hysteresis_20V.png20nm_figures/Ti_HfOx_AlScN_Ti_il_hysteresis_12V.png10nm_figures/Ti_HfOx_AlScN_Ti_il_hysteresis_6p5V.png45nm_figures/all_electrodes_0nm_overlay.png45nm_figures/all_electrodes_0nm_deltaP_summary.png
The active figure set supports the following conclusions:
- Thicker interlayers suppress the hysteresis loop strongly.
- HfOx preserves much larger loops than Al2O3 at the same thickness because it is a better dielectric match to AlScN.
- Electrode work-function asymmetry can skew or shift the loop.
- Electrode screening length can matter strongly even when work function is held fixed.
- Thickness trends must always be interpreted together with the applied voltage window, because ease of driving and depolarization compete.
The main hysteresis script is
src/plot_il_hysteresis.py.
Example:
MPLCONFIGDIR=.cache/matplotlib \
UV_CACHE_DIR=.cache/uv \
PYTHONDONTWRITEBYTECODE=1 \
uv run --with matplotlib --with scipy python src/plot_il_hysteresis.py \
--insulator al2o3 \
--fe-thickness-nm 20 \
--top-electrode ti \
--bottom-electrode ti \
--vmax 12 \
--report-loop-summaryThe electrode comparison script is
src/plot_electrode_comparison.py.
Example:
MPLCONFIGDIR=.cache/matplotlib \
UV_CACHE_DIR=.cache/uv \
PYTHONDONTWRITEBYTECODE=1 \
uv run --with matplotlib --with scipy python src/plot_electrode_comparison.py \
--il-nm 0.0 \
--output-dir 45nm_figuresold: archived earlier code and figuressingle_domain: separate sandbox for the simpler single-domain study.tinytex: repo-local LaTeX toolchain used to compile the reports
If you are new to the project, the cleanest reading order is:
README.mddocs/ACTIVE_TREE_WALKTHROUGH.mddocs/multidomain_preisach_hysteresis_report.pdfdocs/mifm_first_principles_report.pdf
That path goes from orientation, to code understanding, to results, to formal physics.