[ Previous ] [ Home ] [ Next ]

Numerical Analysis and Innovative Simulation
Techniques for Designing Advanced MRAM

\(\newcommand{\footnotename}{footnote}\) \(\def \LWRfootnote {1}\) \(\newcommand {\footnote }[2][\LWRfootnote ]{{}^{\mathrm {#1}}}\) \(\newcommand {\footnotemark }[1][\LWRfootnote ]{{}^{\mathrm {#1}}}\) \(\let \LWRorighspace \hspace \) \(\renewcommand {\hspace }{\ifstar \LWRorighspace \LWRorighspace }\) \(\newcommand {\TextOrMath }[2]{#2}\) \(\newcommand {\mathnormal }[1]{{#1}}\) \(\newcommand \ensuremath [1]{#1}\) \(\newcommand {\LWRframebox }[2][]{\fbox {#2}} \newcommand {\framebox }[1][]{\LWRframebox } \) \(\newcommand {\setlength }[2]{}\) \(\newcommand {\addtolength }[2]{}\) \(\newcommand {\setcounter }[2]{}\) \(\newcommand {\addtocounter }[2]{}\) \(\newcommand {\arabic }[1]{}\) \(\newcommand {\number }[1]{}\) \(\newcommand {\noalign }[1]{\text {#1}\notag \\}\) \(\newcommand {\cline }[1]{}\) \(\newcommand {\directlua }[1]{\text {(directlua)}}\) \(\newcommand {\luatexdirectlua }[1]{\text {(directlua)}}\) \(\newcommand {\protect }{}\) \(\def \LWRabsorbnumber #1 {}\) \(\def \LWRabsorbquotenumber "#1 {}\) \(\newcommand {\LWRabsorboption }[1][]{}\) \(\newcommand {\LWRabsorbtwooptions }[1][]{\LWRabsorboption }\) \(\def \mathchar {\ifnextchar "\LWRabsorbquotenumber \LWRabsorbnumber }\) \(\def \mathcode #1={\mathchar }\) \(\let \delcode \mathcode \) \(\let \delimiter \mathchar \) \(\def \oe {\unicode {x0153}}\) \(\def \OE {\unicode {x0152}}\) \(\def \ae {\unicode {x00E6}}\) \(\def \AE {\unicode {x00C6}}\) \(\def \aa {\unicode {x00E5}}\) \(\def \AA {\unicode {x00C5}}\) \(\def \o {\unicode {x00F8}}\) \(\def \O {\unicode {x00D8}}\) \(\def \l {\unicode {x0142}}\) \(\def \L {\unicode {x0141}}\) \(\def \ss {\unicode {x00DF}}\) \(\def \SS {\unicode {x1E9E}}\) \(\def \dag {\unicode {x2020}}\) \(\def \ddag {\unicode {x2021}}\) \(\def \P {\unicode {x00B6}}\) \(\def \copyright {\unicode {x00A9}}\) \(\def \pounds {\unicode {x00A3}}\) \(\let \LWRref \ref \) \(\renewcommand {\ref }{\ifstar \LWRref \LWRref }\) \( \newcommand {\multicolumn }[3]{#3}\) \(\require {textcomp}\) \(\newcommand {\mathlarger }[1]{#1}\) \(\newcommand {\mathsmaller }[1]{#1}\) \(\newcommand {\intertext }[1]{\text {#1}\notag \\}\) \(\let \Hat \hat \) \(\let \Check \check \) \(\let \Tilde \tilde \) \(\let \Acute \acute \) \(\let \Grave \grave \) \(\let \Dot \dot \) \(\let \Ddot \ddot \) \(\let \Breve \breve \) \(\let \Bar \bar \) \(\let \Vec \vec \) \(\newcommand {\toprule }[1][]{\hline }\) \(\let \midrule \toprule \) \(\let \bottomrule \toprule \) \(\def \LWRbooktabscmidruleparen (#1)#2{}\) \(\newcommand {\LWRbooktabscmidrulenoparen }[1]{}\) \(\newcommand {\cmidrule }[1][]{\ifnextchar (\LWRbooktabscmidruleparen \LWRbooktabscmidrulenoparen }\) \(\newcommand {\morecmidrules }{}\) \(\newcommand {\specialrule }[3]{\hline }\) \(\newcommand {\addlinespace }[1][]{}\) \(\newcommand {\bm }[1]{\boldsymbol {#1}}\) \(\newcommand {\LWRsubmultirow }[2][]{#2}\) \(\newcommand {\LWRmultirow }[2][]{\LWRsubmultirow }\) \(\newcommand {\multirow }[2][]{\LWRmultirow }\) \(\newcommand {\mrowcell }{}\) \(\newcommand {\mcolrowcell }{}\) \(\newcommand {\STneed }[1]{}\) \(\newcommand {\tothe }[1]{^{#1}}\) \(\newcommand {\raiseto }[2]{{#2}^{#1}}\) \(\newcommand {\LWRsiunitxEND }{}\) \(\def \LWRsiunitxang #1;#2;#3;#4\LWRsiunitxEND {\ifblank {#1}{}{\num {#1}\degree }\ifblank {#2}{}{\num {#2}^{\unicode {x2032}}}\ifblank {#3}{}{\num {#3}^{\unicode {x2033}}}}\) \(\newcommand {\ang }[2][]{\LWRsiunitxang #2;;;\LWRsiunitxEND }\) \(\def \LWRsiunitxdistribunit {}\) \(\newcommand {\LWRsiunitxENDTWO }{}\) \(\def \LWRsiunitxprintdecimalsubtwo #1,#2,#3\LWRsiunitxENDTWO {\ifblank {#1}{0}{\mathrm {#1}}\ifblank {#2}{}{{\LWRsiunitxdecimal }\mathrm {#2}}}\) \(\def \LWRsiunitxprintdecimalsub #1.#2.#3\LWRsiunitxEND {\LWRsiunitxprintdecimalsubtwo #1,,\LWRsiunitxENDTWO \ifblank {#2}{}{{\LWRsiunitxdecimal }\LWRsiunitxprintdecimalsubtwo #2,,\LWRsiunitxENDTWO }}\) \(\newcommand {\LWRsiunitxprintdecimal }[1]{\LWRsiunitxprintdecimalsub #1...\LWRsiunitxEND }\) \(\def \LWRsiunitxnumplus #1+#2+#3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxprintdecimal {#1}}{\ifblank {#1}{\LWRsiunitxprintdecimal {#2}}{\LWRsiunitxprintdecimal {#1}\unicode {x02B}\LWRsiunitxprintdecimal {#2}}}\LWRsiunitxdistribunit }\) \(\def \LWRsiunitxnumminus #1-#2-#3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnumplus #1+++\LWRsiunitxEND }{\ifblank {#1}{}{\LWRsiunitxprintdecimal {#1}}\unicode {x02212}\LWRsiunitxprintdecimal {#2}\LWRsiunitxdistribunit }}\) \(\def \LWRsiunitxnumpmmacro #1\pm #2\pm #3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnumminus #1---\LWRsiunitxEND }{\LWRsiunitxprintdecimal {#1}\unicode {x0B1}\LWRsiunitxprintdecimal {#2}\LWRsiunitxdistribunit }}\) \(\def \LWRsiunitxnumpm #1+-#2+-#3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnumpmmacro #1\pm \pm \pm \LWRsiunitxEND }{\LWRsiunitxprintdecimal {#1}\unicode {x0B1}\LWRsiunitxprintdecimal {#2}\LWRsiunitxdistribunit }}\) \(\newcommand {\LWRsiunitxnumscientific }[2]{\ifblank {#1}{}{\ifstrequal {#1}{-}{-}{\LWRsiunitxprintdecimal {#1}\times }}10^{\LWRsiunitxprintdecimal {#2}}\LWRsiunitxdistribunit }\) \(\def \LWRsiunitxnumD #1D#2D#3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnumpm #1+-+-\LWRsiunitxEND }{\mathrm {\LWRsiunitxnumscientific {#1}{#2}}}}\) \(\def \LWRsiunitxnumd #1d#2d#3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnumD #1DDD\LWRsiunitxEND }{\mathrm {\LWRsiunitxnumscientific {#1}{#2}}}}\) \(\def \LWRsiunitxnumE #1E#2E#3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnumd #1ddd\LWRsiunitxEND }{\mathrm {\LWRsiunitxnumscientific {#1}{#2}}}}\) \(\def \LWRsiunitxnume #1e#2e#3\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnumE #1EEE\LWRsiunitxEND }{\mathrm {\LWRsiunitxnumscientific {#1}{#2}}}}\) \(\def \LWRsiunitxnumx #1x#2x#3x#4\LWRsiunitxEND {\ifblank {#2}{\LWRsiunitxnume #1eee\LWRsiunitxEND }{\ifblank {#3}{\LWRsiunitxnume #1eee\LWRsiunitxEND \times \LWRsiunitxnume #2eee\LWRsiunitxEND }{\LWRsiunitxnume #1eee\LWRsiunitxEND \times \LWRsiunitxnume #2eee\LWRsiunitxEND \times \LWRsiunitxnume #3eee\LWRsiunitxEND }}}\) \(\newcommand {\num }[2][]{\LWRsiunitxnumx #2xxxxx\LWRsiunitxEND }\) \(\newcommand {\si }[2][]{\mathrm {\gsubstitute {#2}{~}{\,}}}\) \(\def \LWRsiunitxSIopt #1[#2]#3{\def \LWRsiunitxdistribunit {\,\si {#3}}{#2}\num {#1}\def \LWRsiunitxdistribunit {}}\) \(\newcommand {\LWRsiunitxSI }[2]{\def \LWRsiunitxdistribunit {\,\si {#2}}\num {#1}\def \LWRsiunitxdistribunit {}}\) \(\newcommand {\SI }[2][]{\ifnextchar [{\LWRsiunitxSIopt {#2}}{\LWRsiunitxSI {#2}}}\) \(\newcommand {\numlist }[2][]{\text {#2}}\) \(\newcommand {\numrange }[3][]{\num {#2}\ \LWRsiunitxrangephrase \ \num {#3}}\) \(\newcommand {\SIlist }[3][]{\text {#2}\,\si {#3}}\) \(\newcommand {\SIrange }[4][]{\num {#2}\,#4\ \LWRsiunitxrangephrase \ \num {#3}\,#4}\) \(\newcommand {\tablenum }[2][]{\mathrm {#2}}\) \(\newcommand {\ampere }{\mathrm {A}}\) \(\newcommand {\candela }{\mathrm {cd}}\) \(\newcommand {\kelvin }{\mathrm {K}}\) \(\newcommand {\kilogram }{\mathrm {kg}}\) \(\newcommand {\metre }{\mathrm {m}}\) \(\newcommand {\mole }{\mathrm {mol}}\) \(\newcommand {\second }{\mathrm {s}}\) \(\newcommand {\becquerel }{\mathrm {Bq}}\) \(\newcommand {\degreeCelsius }{\unicode {x2103}}\) \(\newcommand {\coulomb }{\mathrm {C}}\) \(\newcommand {\farad }{\mathrm {F}}\) \(\newcommand {\gray }{\mathrm {Gy}}\) \(\newcommand {\hertz }{\mathrm {Hz}}\) \(\newcommand {\henry }{\mathrm {H}}\) \(\newcommand {\joule }{\mathrm {J}}\) \(\newcommand {\katal }{\mathrm {kat}}\) \(\newcommand {\lumen }{\mathrm {lm}}\) \(\newcommand {\lux }{\mathrm {lx}}\) \(\newcommand {\newton }{\mathrm {N}}\) \(\newcommand {\ohm }{\mathrm {\Omega }}\) \(\newcommand {\pascal }{\mathrm {Pa}}\) \(\newcommand {\radian }{\mathrm {rad}}\) \(\newcommand {\siemens }{\mathrm {S}}\) \(\newcommand {\sievert }{\mathrm {Sv}}\) \(\newcommand {\steradian }{\mathrm {sr}}\) \(\newcommand {\tesla }{\mathrm {T}}\) \(\newcommand {\volt }{\mathrm {V}}\) \(\newcommand {\watt }{\mathrm {W}}\) \(\newcommand {\weber }{\mathrm {Wb}}\) \(\newcommand {\day }{\mathrm {d}}\) \(\newcommand {\degree }{\mathrm {^\circ }}\) \(\newcommand {\hectare }{\mathrm {ha}}\) \(\newcommand {\hour }{\mathrm {h}}\) \(\newcommand {\litre }{\mathrm {l}}\) \(\newcommand {\liter }{\mathrm {L}}\) \(\newcommand {\arcminute }{^\prime }\) \(\newcommand {\minute }{\mathrm {min}}\) \(\newcommand {\arcsecond }{^{\prime \prime }}\) \(\newcommand {\tonne }{\mathrm {t}}\) \(\newcommand {\astronomicalunit }{au}\) \(\newcommand {\atomicmassunit }{u}\) \(\newcommand {\bohr }{\mathit {a}_0}\) \(\newcommand {\clight }{\mathit {c}_0}\) \(\newcommand {\dalton }{\mathrm {D}_\mathrm {a}}\) \(\newcommand {\electronmass }{\mathit {m}_{\mathrm {e}}}\) \(\newcommand {\electronvolt }{\mathrm {eV}}\) \(\newcommand {\elementarycharge }{\mathit {e}}\) \(\newcommand {\hartree }{\mathit {E}_{\mathrm {h}}}\) \(\newcommand {\planckbar }{\mathit {\unicode {x210F}}}\) \(\newcommand {\angstrom }{\mathrm {\unicode {x212B}}}\) \(\let \LWRorigbar \bar \) \(\newcommand {\bar }{\mathrm {bar}}\) \(\newcommand {\barn }{\mathrm {b}}\) \(\newcommand {\bel }{\mathrm {B}}\) \(\newcommand {\decibel }{\mathrm {dB}}\) \(\newcommand {\knot }{\mathrm {kn}}\) \(\newcommand {\mmHg }{\mathrm {mmHg}}\) \(\newcommand {\nauticalmile }{\mathrm {M}}\) \(\newcommand {\neper }{\mathrm {Np}}\) \(\newcommand {\yocto }{\mathrm {y}}\) \(\newcommand {\zepto }{\mathrm {z}}\) \(\newcommand {\atto }{\mathrm {a}}\) \(\newcommand {\femto }{\mathrm {f}}\) \(\newcommand {\pico }{\mathrm {p}}\) \(\newcommand {\nano }{\mathrm {n}}\) \(\newcommand {\micro }{\mathrm {\unicode {x00B5}}}\) \(\newcommand {\milli }{\mathrm {m}}\) \(\newcommand {\centi }{\mathrm {c}}\) \(\newcommand {\deci }{\mathrm {d}}\) \(\newcommand {\deca }{\mathrm {da}}\) \(\newcommand {\hecto }{\mathrm {h}}\) \(\newcommand {\kilo }{\mathrm {k}}\) \(\newcommand {\mega }{\mathrm {M}}\) \(\newcommand {\giga }{\mathrm {G}}\) \(\newcommand {\tera }{\mathrm {T}}\) \(\newcommand {\peta }{\mathrm {P}}\) \(\newcommand {\exa }{\mathrm {E}}\) \(\newcommand {\zetta }{\mathrm {Z}}\) \(\newcommand {\yotta }{\mathrm {Y}}\) \(\newcommand {\percent }{\mathrm {\%}}\) \(\newcommand {\meter }{\mathrm {m}}\) \(\newcommand {\metre }{\mathrm {m}}\) \(\newcommand {\gram }{\mathrm {g}}\) \(\newcommand {\kg }{\kilo \gram }\) \(\newcommand {\of }[1]{_{\mathrm {#1}}}\) \(\newcommand {\squared }{^2}\) \(\newcommand {\square }[1]{\mathrm {#1}^2}\) \(\newcommand {\cubed }{^3}\) \(\newcommand {\cubic }[1]{\mathrm {#1}^3}\) \(\newcommand {\per }{\,\mathrm {/}}\) \(\newcommand {\celsius }{\unicode {x2103}}\) \(\newcommand {\fg }{\femto \gram }\) \(\newcommand {\pg }{\pico \gram }\) \(\newcommand {\ng }{\nano \gram }\) \(\newcommand {\ug }{\micro \gram }\) \(\newcommand {\mg }{\milli \gram }\) \(\newcommand {\g }{\gram }\) \(\newcommand {\kg }{\kilo \gram }\) \(\newcommand {\amu }{\mathrm {u}}\) \(\newcommand {\pm }{\pico \metre }\) \(\newcommand {\nm }{\nano \metre }\) \(\newcommand {\um }{\micro \metre }\) \(\newcommand {\mm }{\milli \metre }\) \(\newcommand {\cm }{\centi \metre }\) \(\newcommand {\dm }{\deci \metre }\) \(\newcommand {\m }{\metre }\) \(\newcommand {\km }{\kilo \metre }\) \(\newcommand {\as }{\atto \second }\) \(\newcommand {\fs }{\femto \second }\) \(\newcommand {\ps }{\pico \second }\) \(\newcommand {\ns }{\nano \second }\) \(\newcommand {\us }{\micro \second }\) \(\newcommand {\ms }{\milli \second }\) \(\newcommand {\s }{\second }\) \(\newcommand {\fmol }{\femto \mol }\) \(\newcommand {\pmol }{\pico \mol }\) \(\newcommand {\nmol }{\nano \mol }\) \(\newcommand {\umol }{\micro \mol }\) \(\newcommand {\mmol }{\milli \mol }\) \(\newcommand {\mol }{\mol }\) \(\newcommand {\kmol }{\kilo \mol }\) \(\newcommand {\pA }{\pico \ampere }\) \(\newcommand {\nA }{\nano \ampere }\) \(\newcommand {\uA }{\micro \ampere }\) \(\newcommand {\mA }{\milli \ampere }\) \(\newcommand {\A }{\ampere }\) \(\newcommand {\kA }{\kilo \ampere }\) \(\newcommand {\ul }{\micro \litre }\) \(\newcommand {\ml }{\milli \litre }\) \(\newcommand {\l }{\litre }\) \(\newcommand {\hl }{\hecto \litre }\) \(\newcommand {\uL }{\micro \liter }\) \(\newcommand {\mL }{\milli \liter }\) \(\newcommand {\L }{\liter }\) \(\newcommand {\hL }{\hecto \liter }\) \(\newcommand {\mHz }{\milli \hertz }\) \(\newcommand {\Hz }{\hertz }\) \(\newcommand {\kHz }{\kilo \hertz }\) \(\newcommand {\MHz }{\mega \hertz }\) \(\newcommand {\GHz }{\giga \hertz }\) \(\newcommand {\THz }{\tera \hertz }\) \(\newcommand {\mN }{\milli \newton }\) \(\newcommand {\N }{\newton }\) \(\newcommand {\kN }{\kilo \newton }\) \(\newcommand {\MN }{\mega \newton }\) \(\newcommand {\Pa }{\pascal }\) \(\newcommand {\kPa }{\kilo \pascal }\) \(\newcommand {\MPa }{\mega \pascal }\) \(\newcommand {\GPa }{\giga \pascal }\) \(\newcommand {\mohm }{\milli \ohm }\) \(\newcommand {\kohm }{\kilo \ohm }\) \(\newcommand {\Mohm }{\mega \ohm }\) \(\newcommand {\pV }{\pico \volt }\) \(\newcommand {\nV }{\nano \volt }\) \(\newcommand {\uV }{\micro \volt }\) \(\newcommand {\mV }{\milli \volt }\) \(\newcommand {\V }{\volt }\) \(\newcommand {\kV }{\kilo \volt }\) \(\newcommand {\W }{\watt }\) \(\newcommand {\uW }{\micro \watt }\) \(\newcommand {\mW }{\milli \watt }\) \(\newcommand {\kW }{\kilo \watt }\) \(\newcommand {\MW }{\mega \watt }\) \(\newcommand {\GW }{\giga \watt }\) \(\newcommand {\J }{\joule }\) \(\newcommand {\uJ }{\micro \joule }\) \(\newcommand {\mJ }{\milli \joule }\) \(\newcommand {\kJ }{\kilo \joule }\) \(\newcommand {\eV }{\electronvolt }\) \(\newcommand {\meV }{\milli \electronvolt }\) \(\newcommand {\keV }{\kilo \electronvolt }\) \(\newcommand {\MeV }{\mega \electronvolt }\) \(\newcommand {\GeV }{\giga \electronvolt }\) \(\newcommand {\TeV }{\tera \electronvolt }\) \(\newcommand {\kWh }{\kilo \watt \hour }\) \(\newcommand {\F }{\farad }\) \(\newcommand {\fF }{\femto \farad }\) \(\newcommand {\pF }{\pico \farad }\) \(\newcommand {\K }{\mathrm {K}}\) \(\newcommand {\dB }{\mathrm {dB}}\) \(\newcommand {\kibi }{\mathrm {Ki}}\) \(\newcommand {\mebi }{\mathrm {Mi}}\) \(\newcommand {\gibi }{\mathrm {Gi}}\) \(\newcommand {\tebi }{\mathrm {Ti}}\) \(\newcommand {\pebi }{\mathrm {Pi}}\) \(\newcommand {\exbi }{\mathrm {Ei}}\) \(\newcommand {\zebi }{\mathrm {Zi}}\) \(\newcommand {\yobi }{\mathrm {Yi}}\) \(\let \unit \si \) \(\let \qty \SI \) \(\let \qtylist \SIlist \) \(\let \qtyrange \SIrange \) \(\let \numproduct \num \) \(\let \qtyproduct \SI \) \(\let \complexnum \num \) \(\newcommand {\complexqty }[3][]{(\complexnum {#2})\si {#3}}\) \(\require {mathtools}\) \(\newcommand {\vcentcolon }{\mathrel {\unicode {x2236}}}\) \(\newcommand {\approxcolon }{\approx \vcentcolon }\) \(\newcommand {\Approxcolon }{\approx \dblcolon }\) \(\newcommand {\simcolon }{\sim \vcentcolon }\) \(\newcommand {\Simcolon }{\sim \dblcolon }\) \(\newcommand {\dashcolon }{\mathrel {-}\vcentcolon }\) \(\newcommand {\Dashcolon }{\mathrel {-}\dblcolon }\) \(\newcommand {\colondash }{\vcentcolon \mathrel {-}}\) \(\newcommand {\Colondash }{\dblcolon \mathrel {-}}\) \(\newenvironment {crampedsubarray}[1]{}{}\) \(\newcommand {\smashoperator }[2][]{#2\limits }\) \(\newcommand {\SwapAboveDisplaySkip }{}\) \(\newcommand {\LaTeXunderbrace }[1]{\underbrace {#1}}\) \(\newcommand {\LaTeXoverbrace }[1]{\overbrace {#1}}\) \(\Newextarrow \xLongleftarrow {10,10}{0x21D0}\) \(\Newextarrow \xLongrightarrow {10,10}{0x21D2}\) \(\let \xlongleftarrow \xleftarrow \) \(\let \xlongrightarrow \xrightarrow \) \(\newcommand {\LWRmultlined }[1][]{\begin {multline*}}\) \(\newenvironment {multlined}[1][]{\LWRmultlined }{\end {multline*}}\) \(\let \LWRorigshoveleft \shoveleft \) \(\renewcommand {\shoveleft }[1][]{\LWRorigshoveleft }\) \(\let \LWRorigshoveright \shoveright \) \(\renewcommand {\shoveright }[1][]{\LWRorigshoveright }\) \(\newcommand {\shortintertext }[1]{\text {#1}\notag \\}\) \(\def \LWRsiunitxrangephrase {\TextOrMath { }{\ }\protect \mbox {to}\TextOrMath { }{\ }}\) \(\def \LWRsiunitxdecimal {.}\)

4.3 Finite Element Micromagnetic Solver

Figure 4.4b illustrates the general workflow of the micromagnetic simulation software ViennaMag  [143], a finite element (FE)-based tool for the simulation of MRAM devices. Written in C++, the software is built on the open-source FE library MFEM  [144, 145], which provides essential components for finite element simulations, including mesh handling, solvers, data structures, and result visualization. On top of this foundation, ViennaMag adds features specific to micromagnetics, such as the computation of the demagnetizing field, spin-accumulation, IEC, and the solution of the LLG equation.

The simulation begins by loading input parameters, including the computational mesh that describes the device geometry. Data structures are initialized to represent the magnetization in the ferromagnetic layers, and a method for computing the demagnetizing field is selected. Once setup is complete, the main simulation loop is executed.

In each iteration, the demagnetizing field is computed from the current magnetization.

(image)

Figure 4.4: Flowcharts of the micromagnetic simulation implementations.

The spin-accumulation is calculated in two steps: first, the electric potential is solved for to determine the charge-current distribution, this result is then used to solve the spin-accumulation equations. These quantities serve as inputs to the LLG equation, which is assembled and solved to update the magnetization. The system evolves over discrete time steps until the final simulation time.

The LLG equation, when coupled with the spin and charge drift-diffusion formalism, enables the modeling of magnetization dynamics in multilayer structures of arbitrary complexity. Since analytical solutions to this system of PDEs are limited to idealized cases, numerical approaches are essential. Section 4.1 presents an FDM-based implementation of the LLG equation, suitable only for thin FL layers with simple elliptical geometries. In contrast, the FEM naturally supports complex geometries and multiple material domains  [146, 147], making it the preferred method for implementing a unified solver that models charge transport, spin-accumulation, and magnetization dynamics. This functionality is realized using the C++ library MFEM. The weak formulations and discretization strategies for these coupled systems are presented in Section 4.2.

4.3.1 Efficient Algorithms for
Demagnetizing Field Computation

As discussed in Section 3.2.4, the demagnetizing field potential satisfies Poisson’s equation with open boundary conditions, requiring the problem to be solved over the entire space \(\mathbb {R}^3\). This presents a significant computational challenge, as standard FEM methods are restricted to finite domains and cannot directly handle open-boundary problems. In practice, calculating the demagnetizing field is the most computationally demanding task in micromagnetic simulations because it must account for long-range dipole interactions among magnetic moments.

Various numerical approaches have been developed to address this challenge. The truncation approach is a common technique in which a sufficiently large finite region replaces the infinite exterior domain. Alternatively, the hybrid FE-BEM allows accurate treatment of open boundaries by combining FEM in the magnetized region with boundary element method (BEM) in the exterior domain, significantly reducing computational effort while maintaining accuracy.

In the following, we present and compare these methods for computing the demagnetizing field, focusing on their accuracy, efficiency, and their ability to account for the long-range nature of magnetostatic interactions.

4.3.1.1 Truncation Approach

The most straightforward method for approximating the open boundary condition is the truncation approach. Here, the magnetized region \(\Omega _m\) is embedded in a larger, finite, non-magnetic external region \(\Omega _e\), such that the total computational domain is \(\Omega = \Omega _m \cup \Omega _e\). Since the magnetic scalar potential decays with distance outside the magnetized region, the open boundary conditions can be approximated by applying homogeneous Dirichlet boundary conditions (i.e., \(u = 0\)) on the outer surface \(\partial \Omega _e\), thereby mimicking the decay to zero at infinity.

In this setting, the demagnetizing field is computed as:

\begin{equation} \mathbf {H}_{\mathrm {dem}} = -\nabla u, \label {eq::truncation_Hdem} \end{equation}

where \(u\) is the scalar magnetic potential, obtained by solving the Poisson equation derived from Equation (3.43):

\begin{equation} \nabla \cdot (\nabla u - \mathbf {M}_s) = 0 \quad \text {in } \Omega , \end{equation}

subject to the boundary condition:

\begin{equation} u = 0 \quad \text {on } \partial \Omega _e. \end{equation}

Multiplying the equation by a test function \(v \in V_0\) and integrating over the computational domain \(\Omega = \Omega _m \cup \Omega _e\), we obtain the weak form:

\begin{equation} \int _{\Omega } \left ( \nabla u - \mathbf {M}_s \right ) \cdot \nabla v \, \mathrm {d}x = 0 \quad \forall v \in V_0. \label {eq::weak_preibp} \end{equation}

Applying integration by parts to the first term (and using the fact that \(v = 0\) on \(\partial \Omega _e\)) yields:

\begin{equation} \int _{\Omega } \nabla u \cdot \nabla v \, \mathrm {d}x = \int _{\Omega } \mathbf {M}_s \cdot \nabla v \, \mathrm {d}x \quad \forall v \in V_0. \label {eq::weak_truncation} \end{equation}

To accurately account for the discontinuity of the magnetization \(\mathbf {m}\) at the boundary \(\partial \Omega _m\), the right-hand side of Equation (4.63) is typically restricted to integration over the magnetic region \(\Omega _m\):

\begin{equation} \int _{\Omega } \nabla u \cdot \nabla v \, \mathrm {d}x = \int _{\Omega _m} \mathbf {M}_s \cdot \nabla v \, \mathrm {d}x \quad \forall v \in V_0. \end{equation}

This restriction is significant when the magnetization \(\mathbf {m}\) is discretized using piecewise-affine, globally continuous finite-element functions, as it enables a consistent treatment of the discontinuity at \(\partial \Omega _m\). The function space \(V_0\) is defined as:

\begin{equation} V_0 = \{ v \in V : v(x) = 0 \ \forall x \in \partial \Omega _e \}. \end{equation}

(-tikz- diagram)

Figure 4.5: Finite-element mesh used for computing the demagnetization field with the truncation approach. (a) The magnetic region is shown in blue, while the surrounding external region is shown in light blue. The external domain is chosen to be approximately five times larger than the magnetic region in each spatial direction. (b) The magnetic region represents the area of interest and is embedded within the larger external domain used to model open boundary conditions.

Imposing a zero potential at a finite boundary is inherently approximate, since the true potential vanishes only in the limit \(r \to \infty \). Thus, the size of the external domain \(\Omega _e\) significantly influences the accuracy of the solution. In practice, choosing \(\Omega _e\) to be approximately five times larger than \(\Omega _m\) in each spatial direction offers a good compromise between computational efficiency and accuracy  [148] (see Figure 4.5). To further reduce computational effort without sacrificing precision, the mesh in \(\Omega _e\) can be progressively coarsened toward the boundary \(\partial \Omega _e\).

4.3.1.2 Hybrid Finite Element–Boundary Element Method

To reduce the number of DOFs in the computation of the demagnetizing field, it is advantageous to restrict spatial discretization to the magnetic domain \(\Omega _m\).
This is achieved by a hybrid FE-BEM, initially proposed by Fredkin and Koehler  [149]. Within this hybrid approach, the Poisson equation is solved in the magnetic domain using FEM, while the behavior of the potential at infinity is guaranteed by a double-layer potential placed on the boundary of the domain. Similar to the truncation method, the FE-BEM approach uses the scalar magnetic potential \(u\) as an intermediate quantity, from which the demagnetizing field is obtained via:

\begin{equation} \mathbf {H}_{\mathrm {dem}} = -\nabla u. \end{equation}

The potential is split as:

\begin{equation} u = u_1 + u_2, \end{equation}

where \(u_1\) is defined as the solution of Poisson’s equation inside the magnetic domain:

\begin{align} \nabla ^2 u_1(\mathbf {r}) & = \nabla \cdot \mathbf {M} & & \text {for } \mathbf {r} \in \Omega _m, \\ u_1 & = 0 & & \text {for } \mathbf {r} \notin \Omega _m, \end{align} with the Neumann boundary condition on \(\partial \Omega _m\):

\begin{equation} \frac {\partial u_1}{\partial n} = \mathbf {M} \cdot \mathbf {n}. \end{equation}

While \(u_1\) satisfies the correct normal jump condition at the boundary, it does not ensure continuity of the potential. Therefore, a correction term \(u_2\) is introduced such that:

\begin{align} \nabla ^2 u_2 & = 0 & & \text {in } \mathbb {R}^3, \\ \left [ \nabla u_2 \cdot \mathbf {n} \right ] & = 0 & & \text {on } \partial \Omega _m, \\ \left [ u_2 \right ] & = u_1 & & \text {on } \partial \Omega _m, \end{align} where \([f] = f_{\mathrm {in}} - f_{\mathrm {out}}\) denotes the jump of \(f\) across the boundary.

A double-layer potential of the form fulfils these conditions:

\begin{equation} u_2(\mathbf {r}) = \frac {1}{4\pi } \oint _{\partial \Omega _m} \frac {\partial u_1(\mathbf {r}')}{\partial n'} \cdot \frac {1}{|\mathbf {r} - \mathbf {r}'|} \, \mathrm {d}S'. \end{equation}

Although \(u_2\) could theoretically be evaluated in the entire domain via this integral, doing so is computationally expensive due to its \(\mathcal {O}(n^2)\) complexity. Instead, the integral is only evaluated on the boundary \(\partial \Omega _m\) using the BEM, yielding the boundary values of \(u_2\) through a matrix-vector product:

\begin{equation} \mathbf {u}_{2}\big |_{\partial \Omega _m} = \mathbf {B} \, \mathbf {u}_{1}\big |_{\partial \Omega _m}. \end{equation}

These boundary values then serve as Dirichlet boundary conditions for solving the Laplace equation \(\nabla ^2 u_2 = 0\) inside \(\Omega _m\) via the FEM, which provides \(u_2\) throughout the magnetic domain. The total potential \(u = u_1 + u_2\) is then used to compute the demagnetizing field.

The resulting matrix \(\mathbf {B}\) is dense and scales quadratically with the number of boundary nodes \(n_B\). Hierarchical matrix compression techniques  [150, 151] are often employed to mitigate the associated memory and computational costs, reducing complexity to \(\mathcal {O}(n_B \log n_B)\).

This hybrid approach significantly reduces the computational domain by discretizing only the magnetic region \(\Omega _m\). It remains effective even for disconnected or complex magnetic geometries. The trade-off, however, is the use of dense BEM operators, which differ from the sparse matrices typically encountered in FEM.

4.3.1.3 Verification and Benchmarking

The Micromagnetic Modeling Activity Group2 at the NIST Center for Theoretical and Computational Materials Science has defined a set of standard problems to enable consistent comparison between micromagnetic simulation codes and published results. Following these recommendations, we assess the correctness and accuracy of our demagnetizing-field solvers using magnetization states from the \(\mu \)MAG Standard Problem 3  [152] together with geometries that admit analytical solutions.

The benchmark consists of three test cases:

  • (i) Single-domain tests: A unit cube with three magnetization states (uniform, flower, vortex) to isolate solver accuracy for single-domain ferromagnets.

  • (ii) External-field test: A two-disc configuration to evaluate the field outside the magnetized body.

  • (iii) Device application: A realistic STT-MRAM cell with disconnected magnetic domains.

(image)

Figure 4.6: Comparison of demagnetizing energy for three distinct magnetization states: (a) uniform, (b) flower, and (c) vortex. For each case, the top subfigures show the corresponding magnetic potential, and the bottom subfigures show the magnetization distribution.

For a uniformly magnetized cube, the demagnetizing field and thus the demagnetizing energy can be obtained in closed form. The energy is given by:

\begin{equation} \mathcal {E}_d = -\frac {\mu _0 M_S}{2} \int _\Omega \mathbf {m}(\mathbf {r}) \cdot \mathbf {H}_d(\mathbf {r}) \,\mathrm {d}\mathbf {r}. \end{equation}

The scalar magnetic potential reaches its maximum near the cube surfaces, where the divergence of \(\mathbf {M}\) is largest.

The flower and vortex initializations follow  [153]. The flower state is defined as:

\begin{align} m_x(\mathbf {r}) & = \tfrac {1}{a}\,xz, \\ m_y(\mathbf {r}) & = \tfrac {1}{c}\,yz + \tfrac {1}{b^3}\,y^3 z^3, \\ m_z(\mathbf {r}) & = 1, \end{align} with parameters \(a = c = 1\) and \(b = 2\), and the cube centered at \((0,0,0)\).

(image)

Figure 4.7: Comparison of demagnetizing energy for unit cubes with different magnetization configurations (uniform, flower, vortex), calculated using the truncation approach and the hybrid FE-BEM approach against analytical reference values  [153]. The hybrid FE-BEM shows excellent agreement with analytical results, while the truncation approach significantly underestimates the energy. Based on the figure originally published in  [154].

The vortex state is defined as:

\begin{align} m_x(\mathbf {r}) & = -\frac {y}{r}\sqrt {1 - \exp \left (-\frac {4r^2}{r_C^2}\right )}, \\ m_y(\mathbf {r}) & = \frac {x}{r}\sqrt {1 - \exp \left (-\frac {4r^2}{r_C^2}\right )}, \\ m_z(\mathbf {r}) & = \exp \left (-\frac {2r^2}{r_C^2}\right ), \end{align} where \(r = \sqrt {x^2 + y^2}\) and \(r_C = 0.14\) as defined in  [153].

Figure 4.6 illustrates the three magnetization configurations, uniform, flower, and vortex, together with their corresponding magnetic scalar potentials. Figure 4.7 presents the demagnetizing energies computed using both the truncation and hybrid FE-BEM approaches, compared against the analytical reference values from  [153]. For quantitative comparison, we define the relative error as:

\begin{equation} \mathrm {err}_{\mathcal {E}}\,[\%] = 100 \,\frac {|\mathcal {E}_d^{\mathrm {ref}} - \mathcal {E}_d^{\mathrm {num}}|}{\max (\mathcal {E}_d^{\mathrm {ref}}) + |\min (\mathcal {E}_d^{\mathrm {ref}})|}. \label {eq::relerr_energy} \end{equation}

The hybrid FE-BEM agrees within \(<1\%\) for the uniform and flower states and approximately \(5\%\) for the vortex case at identical mesh resolution, whereas the truncation approach consistently exhibits errors greater than \(10\%\). These results confirm that, for a similar mesh in the magnetic domain, the hybrid FE-BEM approach is superior to the truncation approach in both accuracy and computational cost.

(image)

Figure 4.8: Two-disc configuration with parallel magnetizations. Left: demagnetizing field \(H_{d,x}\) along the symmetry axis. Right: relative error with respect to the analytical reference (4.84). The FE-BEM maintains accuracy across the axis, while the truncation approach shows significant deviations.

(image)

Figure 4.9: Two-disc configuration with anti-parallel magnetizations. Left: demagnetizing field \(H_{d,x}\) along the symmetry axis. Right: relative error with respect to the analytical reference. The FE-BEM reproduces the analytical field within a few percent, while the truncation approach yields larger errors.

To evaluate the demagnetizing field outside the magnetized body, we consider a two-disc configuration with known analytical solution  [155]. The on-axis field of a single uniformly magnetized disc of radius \(R\) and thickness \(L\), magnetized along its symmetry axis, is given by:

\begin{equation} H_{d,x}^{\mathrm {disc}}(x) = \frac {M_S}{2}\left ( \frac {x}{\sqrt {x^2 + R^2}} - \frac {x - L}{\sqrt {(x - L)^2 + R^2}} \right ), \label {eq::disc_analytic} \end{equation}

which follows from the surface-charge representation \(\sigma _m = \mathbf {M} \cdot \mathbf {n}\).

The analytical reference for two identical discs is assembled pointwise from Equation (4.84) by mirroring about the center plane. For axial sampling points \(\{x_j\}_{j=0}^{N-1}\):

\begin{align} H_{d,x}^{\mathrm {P}}[j] & = H_1[j] + H_1[N-1-j], \\ H_{d,x}^{\mathrm {AP}}[j] & = H_1[j] - H_1[N-1-j], \end{align} where \(H_1[j] \equiv H_{d,x}^{\mathrm {disc}}(x_j)\), and P/AP denote parallel and anti-parallel magnetizations, respectively.

To quantify accuracy along the axis, we report the pointwise relative error:

\begin{equation} \mathrm {err}_H[j]\,[\%] = 100\,\frac {\bigl |H_{d,x}^{\mathrm {num}}(x_j) - H_{d,x}^{\mathrm {ref}}(x_j)\bigr |} {\max _k \bigl |H_{d,x}^{\mathrm {ref}}(x_k)\bigr |}, \label {eq::relerr_field} \end{equation}

which avoids divisions by small numbers near zero crossings (relevant in the anti-parallel case).

For the numerical setup we use discs of thickness \(L = 0.1\,\si {\nano \meter }\) and radius \(R = 1\,\si {\nano \meter }\). To obtain field values between the discs with the hybrid FE-BEM (which solves only on the magnetic domain), we insert a thin probe disc between them with negligible saturation magnetization so as not to perturb the solution. Figure 4.8 and Figure 4.9 show the field profiles and relative errors for both configurations. In both cases, the FE-BEM solution tracks the analytical reference within a few percent across the axis. At the same time, the truncation approach shows larger deviations of up to \(10\)–\(15\%\), especially near the disc faces, where gradients are strongest.

Having established accuracy on canonical test cases, we evaluate the demagnetizing field in a realistic STT-MRAM cell. The device has a diameter of \(40\,\si {\nano \meter }\) and consists of two non-magnetic contacts of length \(50\,\si {\nano \meter }\), a ferromagnetic RL of thickness \(1\,\si {\nano \meter }\), a tunnel barrier of thickness \(1\,\si {\nano \meter }\), and a free ferromagnetic layer of thickness \(1.7\,\si {\nano \meter }\).

The magnetic domain is disconnected, consisting of two ferromagnetic layers separated by the tunnel barrier. This geometry provides a thorough test for the solver. Figure 4.10 and Figure 4.11 compare the hybrid FE-BEM and truncation solutions for the P and AP magnetization configurations, respectively. For visualization, the contacts and barrier are hidden, arrows indicate the direction of the demagnetizing field, and the color map encodes the magnetic potential.

Both methods produce very similar fields and potentials, confirming that the FE-BEM implementation remains accurate for disconnected magnetic domains. Given its superior accuracy at comparable mesh resolutions and reduced computational effort relative to large truncated domains, the hybrid FE-BEM is adopted for the complex geometries considered in subsequent chapters, including synthetic antiferromagnets.

(-tikz- diagram)

Figure 4.10: Demagnetizing field in an STT-MRAM cell with P magnetization configuration. Arrows indicate the demagnetization field direction, while color-coding represents the magnetic scalar potential \(u\). Left: hybrid FE-BEM. Right: truncation approach. Both methods yield similar results, validating the implementation for disconnected magnetic domains. Figure originally published in  [154].

(-tikz- diagram)

Figure 4.11: Demagnetizing field in an STT-MRAM cell with AP magnetization configuration. Arrows indicate the demagnetization field direction, while color-coding represents the magnetic scalar potential \(u\). Left: hybrid FE-BEM. Right: truncation approach. Both methods yield similar results, validating the implementation for disconnected magnetic domains. Figure originally published in  [154].