{ "cells": [ { "cell_type": "markdown", "id": "c6a82e84-f253-4cff-b51c-31bde4cc6304", "metadata": {}, "source": [ "# Domain-wall pinning at material interface\n", "This example implements the benchmark problem proposed in [1] where a domain wall is pinned at the material interface of a magnetic wire.\n", "\n", "## Simulation\n", "### Import libraries\n", "Import libraries and set global config options." ] }, { "cell_type": "code", "execution_count": 1, "id": "bfc8f403-cf20-4f7f-a8d7-29d3f4b2fd78", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 22:47:19 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Version 0.9.1\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Backend set to 'jax'.\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default dtype to 'float64'.\u001b[0m\n" ] } ], "source": [ "import numpy as np\n", "from scipy import constants\n", "\n", "import neuralmag as nm\n", "\n", "nm.config.fem[\"n_gauss\"] = 1\n", "nm.config.dtype = \"float64\"" ] }, { "cell_type": "markdown", "id": "eafa9481-583b-464b-a145-2fe621e315b5", "metadata": {}, "source": [ "### Set up mesh and state" ] }, { "cell_type": "code", "execution_count": 2, "id": "b1e98776-507f-4e76-821e-1c90687bcec0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[Mesh] 1D, 80 (size = 1e-09 x 1e-09 x 1e-09)\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default device to 'TFRT_CPU_0'.\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[State] Running on device: TFRT_CPU_0 (dtype = float64, backend = jax)\u001b[0m\n" ] } ], "source": [ "mesh = nm.Mesh((80,), (1e-9, 1e-9, 1e-9))\n", "state = nm.State(mesh)" ] }, { "cell_type": "markdown", "id": "32be089e-3877-4270-9030-7ee3d8a2e811", "metadata": {}, "source": [ "### Set up material parameters\n", "Set up material parameters in the wire with optional material jumps in the satureation magnetization $M_s$, the exchange constant $A$ and or the anisotropy constant $K$. The material parameters are prepared in a NumPy array and then copied to the respective material functions. The ```mode``` string indicates the parameters with jump (\"m\"/\"a\"/\"k\" leads to a jump in $M_s$, $A$ or $K$ respectively and \"ak\" lead to a jump in both $K$ and $A$." ] }, { "cell_type": "code", "execution_count": 3, "id": "5e156440-0209-43c9-8896-406e49273d7e", "metadata": {}, "outputs": [], "source": [ "MODE = \"a\"\n", "\n", "Ms = np.ones(80) * (1.0 / constants.mu_0)\n", "A = np.ones(80) * (1e-11)\n", "Ku = np.ones(80) * (1e6)\n", "\n", "if \"m\" in MODE:\n", " Ms[:40] = 0.25 / constants.mu_0\n", "if \"a\" in MODE:\n", " A[:40] = 0.25e-11\n", "if \"k\" in MODE:\n", " Ku[:40] = 1e5\n", "\n", "state.material.Ms = nm.CellFunction(state, tensor=state.tensor(Ms))\n", "state.material.A = nm.CellFunction(state, tensor=state.tensor(A))\n", "state.material.Ku = nm.CellFunction(state, tensor=state.tensor(Ku))\n", "state.material.Ku_axis = [0, 1, 0]\n", "state.material.alpha = 1.0" ] }, { "cell_type": "markdown", "id": "2db9a956-668a-4ffd-bdea-bd5c56f139b0", "metadata": {}, "source": [ "### Initialize the magnetization\n", "Now, we initialize the magnetization with a parametrized domain wall next to the material boundary." ] }, { "cell_type": "code", "execution_count": 4, "id": "0844ab6d-1cc9-4ea0-854f-37c7c130d68d", "metadata": {}, "outputs": [], "source": [ "m = np.zeros((81, 3))\n", "m[:35, 1] = np.cos(0.3)\n", "m[:35, 0] = np.sin(0.3)\n", "m[35:, 1] = -1.0\n", "state.m = nm.VectorFunction(state, tensor=state.tensor(m))" ] }, { "cell_type": "markdown", "id": "0015cce9-c48a-42ec-9e15-75e78214a7a2", "metadata": {}, "source": [ "### Register effective field\n", "We register an effective field comprised by uniaxial anisotropy, exchange and an external field in y-direction that linearly increases in time." ] }, { "cell_type": "code", "execution_count": 5, "id": "64ae5ae7-d162-4f0c-a93f-f0eb139d4055", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[UniaxialAnisotropyField] Register state methods (field: 'h_aniso', energy: 'E_aniso')\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[ExchangeField] Register state methods (field: 'h_exchange', energy: 'E_exchange')\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[ExternalField] Register state methods (field: 'h_external', energy: 'E_external')\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[TotalField] Register state methods (field: 'h', energy: 'E')\u001b[0m\n" ] } ], "source": [ "nm.UniaxialAnisotropyField().register(state, \"aniso\")\n", "nm.ExchangeField().register(state, \"exchange\")\n", "hrate = state.tensor([0, 1.6 / constants.mu_0 / 100e-9, 0])\n", "nm.ExternalField(lambda t: t * hrate).register(state, \"external\")\n", "nm.TotalField(\"aniso\", \"exchange\", \"external\").register(state)" ] }, { "cell_type": "markdown", "id": "870e5d31-c06b-4282-81cc-f0398016686c", "metadata": {}, "source": [ "### Perform time integration\n", "Finally we perform time integration observing the y-component of the averaged magnetization as an indicator for depinning. Once the value exceeds 0.55, we assume that the domain-wall has depinned and we print the strength of the depinning field." ] }, { "cell_type": "code", "execution_count": 6, "id": "cbb42e09-5856-4424-8979-5d615df05847", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;32m[LLGSolverJAX] Initialize RHS function\u001b[0m\n", "2025-05-13 22:47:20 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2e-08s\u001b[0m\n", "2025-05-13 22:47:22 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.1e-08s\u001b[0m\n", "2025-05-13 22:47:22 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.2e-08s\u001b[0m\n", "2025-05-13 22:47:22 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.3e-08s\u001b[0m\n", "2025-05-13 22:47:22 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.4e-08s\u001b[0m\n", "2025-05-13 22:47:23 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.5e-08s\u001b[0m\n", "2025-05-13 22:47:23 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.6e-08s\u001b[0m\n", "2025-05-13 22:47:23 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.7e-08s\u001b[0m\n", "2025-05-13 22:47:23 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.8e-08s\u001b[0m\n", "2025-05-13 22:47:23 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 2.9e-08s\u001b[0m\n", "2025-05-13 22:47:23 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3e-08s\u001b[0m\n", "2025-05-13 22:47:24 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.1e-08s\u001b[0m\n", "2025-05-13 22:47:24 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.2e-08s\u001b[0m\n", "2025-05-13 22:47:24 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.3e-08s\u001b[0m\n", "2025-05-13 22:47:24 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.4e-08s\u001b[0m\n", "2025-05-13 22:47:24 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.5e-08s\u001b[0m\n", "2025-05-13 22:47:24 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.6e-08s\u001b[0m\n", "2025-05-13 22:47:24 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.7e-08s\u001b[0m\n", "2025-05-13 22:47:25 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.8e-08s\u001b[0m\n", "2025-05-13 22:47:25 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 3.9e-08s\u001b[0m\n", "2025-05-13 22:47:25 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4e-08s\u001b[0m\n", "2025-05-13 22:47:25 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.1e-08s\u001b[0m\n", "2025-05-13 22:47:25 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.2e-08s\u001b[0m\n", "2025-05-13 22:47:25 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.3e-08s\u001b[0m\n", "2025-05-13 22:47:25 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.4e-08s\u001b[0m\n", "2025-05-13 22:47:26 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.5e-08s\u001b[0m\n", "2025-05-13 22:47:26 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.6e-08s\u001b[0m\n", "2025-05-13 22:47:26 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.7e-08s\u001b[0m\n", "2025-05-13 22:47:26 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.8e-08s\u001b[0m\n", "2025-05-13 22:47:26 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 4.9e-08s\u001b[0m\n", "2025-05-13 22:47:26 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 5e-08s\u001b[0m\n", "2025-05-13 22:47:26 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 5.1e-08s\u001b[0m\n", "2025-05-13 22:47:27 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 5.2e-08s\u001b[0m\n", "2025-05-13 22:47:27 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 5.3e-08s\u001b[0m\n", "2025-05-13 22:47:27 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Step: dt = 1e-09s, t = 5.4e-08s\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Depinning Field H = 0.8800000000000008 A/m\n" ] } ], "source": [ "llg = nm.LLGSolver(state, max_steps=None)\n", "state.t = 20e-9\n", "while state.t < 100e-9:\n", " llg.step(1e-9)\n", " if state.m.avg()[1] > 0.55:\n", " print(f\"Depinning Field H = {state.h_external.avg()[1] * constants.mu_0} A/m\")\n", " break" ] }, { "cell_type": "markdown", "id": "4e2eef3c-f282-4a0e-8615-3a3e7f6b8570", "metadata": {}, "source": [ "## References\n", "[1] Heistracher, P., Abert, C., Bruckner, F., Schrefl, T., & Suess, D. (2022). Proposal for a micromagnetic standard problem: domain wall pinning at phase boundaries. Journal of Magnetism and Magnetic Materials, 548, 168875." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.17" } }, "nbformat": 4, "nbformat_minor": 5 }