[ 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.2 Finite Element Method

Similar to the FDM, the FEM is a numerical method for approximating solutions to partial differential equations (PDEs). However, the FEM offers significantly greater flexibility in handling complex computational domains. To solve a problem using the FEM, the simulation domain is discretized into a mesh composed of smaller, simpler subdomains known as finite elements. These elements are connected at nodes, which are points shared by two or more elements, along with boundary lines or surfaces. This discretization transforms the original PDE into a system of algebraic equations by formulating the problem locally for each element and assembling the local systems into a global system. The following sections will introduce the FEM by outlining the key steps involved in this process. To illustrate how the FEM works in practice, we consider the Poisson equation again:

\begin{align} - \nabla ^2 u(x) & = f(x), \quad x \in \Omega , \\ u(x) & = u_D(x), \quad x \in \Gamma _D, \\ \frac {\partial u}{\partial n}(x) & = g(x), \quad x \in \Gamma _N, \end{align}

\[ \partial \Omega = \Gamma _D \cup \Gamma _N, \quad \Gamma _D \cap \Gamma _N = \emptyset , \]

where \(u\) is the unknown scalar field, \(f\) is a known source term, \(u_D\) defines the Dirichlet boundary condition on \(\Gamma _D\), and \(g\) prescribes the Neumann condition on \(\Gamma _N\). This also serves as a blueprint for more complex equations, such as the LLG equation. For general background on the finite element method, see  [137, 138, 139, 140].

4.2.1 Weak Formulation and Variational Form

The first step in the FEM procedure is to rewrite the original PDE in its weak formulation. This approach relaxes the regularity requirements on the solution and test functions by integrating the governing equation with respect to a set of smooth test functions. We multiply both sides of the equation by a test function \(v\) and integrate over the domain \(\Omega \):

\begin{equation} \int _\Omega (-\nabla ^2 u)\, v \, \mathrm {d}x = \int _\Omega f\, v \, \mathrm {d}x. \end{equation}

Applying integration by parts, Gauss’s (divergence) theorem:

\[ \int _\Omega \nabla u \cdot \nabla v\, \mathrm {d}x = -\int _\Omega (\Delta u)\, v\, \mathrm {d}x + \int _{\partial \Omega } \frac {\partial u}{\partial n}\, v\, \mathrm {d}s \]

and using the product rule for differentiation, the second-order derivative term is expressed as a sum of first-order derivatives. Here, the left-hand side is a volume integral over the domain \(\Omega \), while the right-hand side represents a surface integral over the boundary \(\partial \Omega \).

This results in the following weak formulation:

\begin{equation} \int _\Omega \nabla u \cdot \nabla v \, \mathrm {d}x - \int _{\partial \Omega } \frac {\partial u}{\partial n} \, v \, \mathrm {d}s = \int _\Omega f\, v \, \mathrm {d}x, \end{equation}

where the term \(\frac {\partial u}{\partial n} = \nabla u \cdot \mathbf {n}\) represents the normal derivative of \(u\) on the boundary \(\partial \Omega \).

We consider the boundary \(\partial \Omega \) to be partitioned into two disjoint parts:

\[ \partial \Omega = \Gamma _D \cup \Gamma _N, \quad \Gamma _D \cap \Gamma _N = \emptyset , \]

where \(\Gamma _D\) is the portion where Dirichlet boundary conditions are prescribed, and \(\Gamma _N\) is the portion with Neumann boundary conditions. Before applying the Dirichlet condition strongly, the boundary integral over \(\Gamma _D\) remains part of the weak form. It reflects a general formulation suitable for alternative treatments (e.g., Nitsche’s method1). The resulting weak form is:

\begin{equation} \int _\Omega \nabla u \cdot \nabla v \, \mathrm {d}x - \int _{\Gamma _D} \frac {\partial u}{\partial n} \, v \, \mathrm {d}s = \int _\Omega f\, v \, \mathrm {d}x + \int _{\Gamma _N} g\, v \, \mathrm {d}s \end{equation}

Assuming the Dirichlet condition \(u = u_D\) is imposed strongly (i.e., incorporated directly into the trial function space), the test function \(v\) vanishes on \(\Gamma _D\). The weak form then simplifies to:

\begin{equation} \int _\Omega \nabla u \cdot \nabla v \, \mathrm {d}x = \int _\Omega f\, v \, \mathrm {d}x + \int _{\Gamma _N} g\, v \, \mathrm {d}s, \label {eq::weak_form} \end{equation}

where \(g\) denotes the prescribed Neumann boundary portion, such that \(\frac {\partial u}{\partial n} = g\) on \(\Gamma _N\).

This weak formulation is commonly expressed in an abstract variational form:

\begin{equation} a(u, v) = L(v) \quad \forall v \in V, \end{equation}

where the bilinear form \(a(u, v)\) and the linear form \(L(v)\) are defined as:

\begin{align} a(u, v) & = \int _\Omega \nabla u \cdot \nabla v \, \mathrm {d}x, \\ L(v) & = \int _\Omega f\, v \, \mathrm {d}x + \int _{\Gamma _N} g\, v \, \mathrm {d}s. \end{align}

We assume that \(f \in L^2(\Omega )\), \(g \in L^2(\Gamma _N)\), and \(u_D \in H^{1/2}(\Gamma _D)\) to ensure well-posedness of the weak formulation.

The test function and the solution are assumed to belong to Hilbert spaces. In the Galerkin method, employed for the results presented in this work, both are chosen from the same Hilbert space.

The space \(V\) of test functions is a subspace of the Sobolev space \(H^1(\Omega )\), defined as:

\begin{equation} V = \left \{ v \in H^1(\Omega ) \ \middle | \ v = 0 \text { on } \Gamma _D \right \}, \end{equation}

and the trial space is given by:

\begin{equation} U = \left \{ u \in H^1(\Omega ) \ \middle | \ u = u_D \text { on } \Gamma _D \right \}. \end{equation}

More explicitly, the Sobolev space \(H^1(\Omega )\) is defined as:

\begin{equation} H^1(\Omega ) := \left \{ v \in L^2(\Omega ) \ \middle | \ \nabla v \in [L^2(\Omega )]^d \right \}, \end{equation}

where \(d\) is the number of spatial dimensions. The Lebesgue space \(L^2(\Omega )\) is defined as:

\begin{equation} L^2(\Omega ) = \left \{ v : \Omega \to \mathbb {R} \ \middle | \ \int _\Omega v^2 \, \mathrm {d}x < \infty \right \}. \end{equation}

This formulation is referred to as weak because it only requires equality in an integral sense, whereas the strong form demands pointwise equality and more regularity.

In practical computations, both the solution and test functions are approximated in finite-dimensional subspaces \(U_h \subset U\) and \(V_h \subset V\), which typically consist of globally continuous, piecewise affine (i.e., linear on each mesh element) basis functions defined over the computational mesh.

With all components defined, the final variational problem is expressed as follows:

\begin{equation} \text {Find } u \in U \text { such that } a(u, v) = L(v) \quad \forall v \in V. \end{equation}

1 Nitsche’s method enforces Dirichlet boundary conditions weakly by modifying the bilinear form. For details, see [141].

4.2.2 Finite Element Discretization

To solve the weak form numerically, the domain \(\Omega \) is subdivided into a finite number of smaller subdomains forming a triangulation \(\mathcal {T}_h\). These are typically triangles or quadrilaterals in two dimensions, tetrahedra or hexahedra are common in three dimensions. The set of all mesh nodes is denoted by \(\mathcal {N} = \{ \mathbf {x}_i \}\), where \(\mathbf {x}_i\) are the coordinates of node \(i\).

Based on this triangulation, we define the finite element space \(V_h\), a finite-dimensional subspace of \(V\), consisting of globally continuous, piecewise affine functions:

\begin{equation} V_h := \left \{ v \in C^0(\Omega ) \ \middle | \ v|_T \text { is affine } \forall T \in \mathcal {T}_h \right \}. \end{equation}

Each function \(v_h \in V_h\) is uniquely determined by its nodal values. The set of nodes \(\mathcal {N}\) is partitioned into two disjoint subsets: \(\mathcal {N}_D\), consisting of nodes on the Dirichlet boundary \(\Gamma _D\), and \(\mathcal {N}_f\), the set of remaining (free) nodes. A nodal basis \(\{\phi _i\}\) is chosen such that:

\begin{equation} \phi _i(\mathbf {x}_j) = \delta _{ij}, \end{equation}

where \(\delta _{ij}\) is the Kronecker delta. The space \(V_h\) is then given by:

\begin{equation} V_h = \text {span} \{ \phi _1, \phi _2, \dots , \phi _N \}. \end{equation}

The finite element approximation \(u_h \in V_h\) is expressed as a linear combination of basis functions:

\begin{equation} u_h(x) = \sum _{i=1}^N U_i \phi _i(x), \end{equation}

here, \(U_i\) are the nodal coefficients (degrees of freedom) corresponding to basis functions \(\phi _i\), and they form the components of the global solution vector \(\mathbf {U} = (U_1, U_2, \dots , U_N)^\top \).

Substituting the basis expansion \(u_h\) and \(v_h = \phi _j\) into the weak form (4.38) and requiring it to hold for all basis functions leads to the component-wise system:

\begin{equation} \sum _i \left ( \int _\Omega \nabla \phi _i \cdot \nabla \phi _j \, \mathrm {d}x \right ) U_i = \int _\Omega f \phi _j \, \mathrm {d}x + \int _{\Gamma _N} g \phi _j \, \mathrm {d}s. \end{equation}

This can be written in matrix-vector form as:

\begin{equation} A \mathbf {U} = \mathbf {b}, \end{equation}

where the matrix and vector entries are defined by:

\begin{align} A_{ji} & = \int _\Omega \nabla \phi _i \cdot \nabla \phi _j \, \mathrm {d}x, \\ b_j & = \int _\Omega f \phi _j \, \mathrm {d}x + \int _{\Gamma _N} g \phi _j \, \mathrm {d}s. \end{align}

To enforce Dirichlet boundary conditions, described as:

\begin{equation} U_i = u_D(\mathbf {x}_i), \quad \forall \mathbf {x}_i \in \mathcal {N}_D. \end{equation}

The system is then partitioned into known (Dirichlet) and unknown (free) degrees of freedom (DOF). The free DOFs correspond to the nodes in \(\mathcal {N}_f\), for which the solution values \(\mathbf {u}_f\) are not prescribed and must be computed by solving the system. In contrast, the Dirichlet DOFs \(\mathbf {u}_D\), associated with nodes in \(\mathcal {N}_D\), are imposed directly according to the boundary conditions. Letting \(\mathbf {U} = (\mathbf {u}_D, \mathbf {u}_f)^\top \), and partitioning \(A\) and \(\mathbf {b}\) accordingly, written as:

\begin{equation} A = \begin{pmatrix} A_{DD} & A_{Df} \\ A_{fD} & A_{ff} \end {pmatrix}, \quad \mathbf {b} = \begin{pmatrix} b_D \\ b_f \end {pmatrix}. \end{equation}

Here:

  • (i) \(A_{DD}\) corresponds to interactions between Dirichlet nodes,

  • (ii) \(A_{Df}\) (and its transpose \(A_{fD}\)) captures the coupling between Dirichlet and free nodes,

  • (iii) \(A_{ff}\) includes contributions only from the free nodes and defines the part of the system to be solved numerically.

To incorporate the known Dirichlet values into the system, we substitute them directly into the global equation, which yields:

\begin{equation} \begin{pmatrix} I & 0 \\ A_{fD} & A_{ff} \end {pmatrix} \begin{pmatrix} \mathbf {u}_D \\ \mathbf {u}_f \end {pmatrix} = \begin{pmatrix} \mathbf {u}_D \\ \mathbf {b}_f \end {pmatrix}, \end{equation}

where \(I\) is the identity matrix used to enforce Dirichlet values.

(-tikz- diagram)

Figure 4.3: Representation of the original solution \(u\) and the finite element approximation \(u_h\) in one (a) and two (b) spatial dimensions. The basis functions for all nodes are shown at the bottom of the 1D plot. The highlighted basis function \(\varphi _2(x)\) and corresponding solution value \(u_2\) at node \(x_2\) are shown in orange. The 2D plot shows the smooth function \(u(x, y)\), its piecewise approximation \(u_h(x, y)\), and the basis function \(\varphi _{5,6}(x, y)\) centered at node \((x_5, y_6)\).

The final reduced symmetric system for the unknown values \(\mathbf {u}_f\) is then:

\begin{equation} A_{ff} \mathbf {u}_f = \mathbf {b}_f - A_{fD} \mathbf {u}_D. \end{equation}

This reduced system involves only the unknown free DOFs and forms the core of the numerical solution process. This system can be solved efficiently because of the sparsity of \(A\), which arises from the local support of the basis functions. Moreover, the framework naturally accommodates mixed boundary conditions. It can be extended using higher-order basis functions and adaptive mesh refinement to improve accuracy in regions where the solution varies rapidly.

Figure 4.3 illustrates the representations of the original solution and its finite element approximation in both the 1D and 2D settings. In the 1D case (Figure 4.3 (a)), the nodes are aligned along a single axis, and piecewise linear basis functions approximate the solution. In the 2D case (Figure 4.3 (b)), the domain is discretized into triangles, and the hat function associated with a single node is shown along with a smooth solution surface and projection. The label \(\varphi _{5,6}(x_5, y_6)\) denotes the basis function and nodal value associated with the corresponding node. This construction naturally extends to higher-order approximations by increasing the polynomial degree of the basis functions and adding more nodes per element. It also generalizes to 3D problems, where the domain is typically discretized using tetrahedral elements and basis functions are defined over a reference tetrahedron in a similar manner  [142].