{ "cells": [ { "cell_type": "markdown", "id": "d32945b0-c028-453d-8da8-1ef5ba7e792c", "metadata": {}, "source": [ "# DMI benchmark problem in 1D\n", "Implementation of the 1D problem proposed in David Cortés-Ortuño et al 2018 New J. Phys. 20 113015.\n", "\n", "## Simulation\n", "### Import libraries\n", "Import libraries and set default precision to double to guarantee convergence." ] }, { "cell_type": "code", "execution_count": 1, "id": "f62daf00-652c-4e7c-9f18-625bab334135", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 07:16:03 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Version 0.9.1\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Backend set to 'jax'.\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default dtype to 'float64'.\u001b[0m\n" ] } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "import neuralmag as nm\n", "\n", "nm.config.dtype = \"float64\"" ] }, { "cell_type": "markdown", "id": "adbed98e-906d-4f5f-9f1d-fcc4fcd29b34", "metadata": {}, "source": [ "### Create mesh and state\n", "Next we set up a state with a 1D mesh object (a mesh with nodes only in the x-direction)." ] }, { "cell_type": "code", "execution_count": 2, "id": "409d1502-5a58-42be-8c93-3cbf0cedff83", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[Mesh] 1D, 100 (size = 1e-09 x 1e-09 x 1e-09)\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default device to 'TFRT_CPU_0'.\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[State] Running on device: TFRT_CPU_0 (dtype = float64, backend = jax)\u001b[0m\n" ] } ], "source": [ "mesh = nm.Mesh((100,), (1e-9, 1e-9, 1e-9))\n", "state = nm.State(mesh)" ] }, { "cell_type": "markdown", "id": "ee8ef5c8-baff-4fce-b0ad-f4cbd7a2d33f", "metadata": {}, "source": [ "### Material parameters and initial magnetization\n", "The material parameters are set up according to the proposed problem and set an initial magnetization in the z-direction.\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "68037a59-00f7-4024-a1ba-26e38d11379c", "metadata": {}, "outputs": [], "source": [ "state.material.Ms = 0.86e6\n", "state.material.A = 1.3e-11\n", "state.material.Ku = 0.4e6\n", "state.material.Ku_axis = [0, 0, 1]\n", "state.material.Di = 3e-3\n", "state.material.Di_axis = [0, 0, 1]\n", "state.material.alpha = 1.0\n", "\n", "state.m = nm.VectorFunction(state).fill((0, 0, 1))" ] }, { "cell_type": "markdown", "id": "b6651d88-9ddc-4d8e-8461-da91f50756ad", "metadata": {}, "source": [ "### Effective field\n", "\n", "Next, we set up the effective field which is comprised of contributions from interface DMI, exchange and uniaxial anisotropy. For this example, we do no explicitly account for the demgnetization field, but rather use an effective anisotropy that also accounts for the shape anisotropy.\n", "\n", "After initializing the effective field, we relax the system into an energetic equilibrium." ] }, { "cell_type": "code", "execution_count": 4, "id": "c96d4f39-82f5-4dd7-aec6-1cff6630719a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[InterfaceDMIField] Register state methods (field: 'h_dmi', energy: 'E_dmi')\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[ExchangeField] Register state methods (field: 'h_exchange', energy: 'E_exchange')\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[UniaxialAnisotropyField] Register state methods (field: 'h_aniso', energy: 'E_aniso')\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[TotalField] Register state methods (field: 'h', energy: 'E')\u001b[0m\n", "2025-05-13 07:16:04 NeuralMag:INFO \u001b[1;37;32m[LLGSolverJAX] Initialize RHS function\u001b[0m\n", "2025-05-13 07:16:05 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Relaxation started, initial energy E = -4e-20 J\u001b[0m\n", "2025-05-13 07:16:05 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Relaxation step (max dm/dt = 8.68685e+11) 1/s\u001b[0m\n", "2025-05-13 07:16:07 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Relaxation step (max dm/dt = 2.02508e+10) 1/s\u001b[0m\n", "2025-05-13 07:16:07 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Relaxation step (max dm/dt = 6.25609e+09) 1/s\u001b[0m\n", "2025-05-13 07:16:07 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Relaxation step (max dm/dt = 2.41831e+09) 1/s\u001b[0m\n", "2025-05-13 07:16:07 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Relaxation step (max dm/dt = 1.11389e+09) 1/s\u001b[0m\n", "2025-05-13 07:16:07 NeuralMag:INFO \u001b[1;37;34m[LLGSolverJAX] Relaxation finished, final energy E = -4.20461e-20 J\u001b[0m\n" ] } ], "source": [ "# initialize effective field\n", "nm.InterfaceDMIField().register(state, \"dmi\")\n", "nm.ExchangeField().register(state, \"exchange\")\n", "nm.UniaxialAnisotropyField().register(state, \"aniso\")\n", "nm.TotalField(\"aniso\", \"dmi\", \"exchange\").register(state)\n", "\n", "# relax to energetic minimum\n", "llg = nm.LLGSolver(state)\n", "llg.relax(1e9)" ] }, { "cell_type": "markdown", "id": "5e021c54-2b36-4c8e-8535-05cdad1ddac1", "metadata": {}, "source": [ "## Visualization\n", "We extract the magnetization data from the discretized magnetization field stored in ```state.m.tensor``` and compare it with the analytical solution presented in the original work by Cortés-Ortuño et al." ] }, { "cell_type": "code", "execution_count": 5, "id": "15fb67c5-7f4a-4c94-b95a-1de0c995396b", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = np.zeros((state.m.tensor.shape[0], 4))\n", "data[:, 0] = np.arange(data.shape[0])\n", "data[:, (1, 2, 3)] = state.m.tensor[:, :]\n", "\n", "ref = np.array(\n", " [\n", " -7.17885457e-01,\n", " -3.68028209e-01,\n", " -1.84133801e-01,\n", " -9.15314286e-02,\n", " -4.54233302e-02,\n", " -2.25310767e-02,\n", " -1.11735402e-02,\n", " -5.53930074e-03,\n", " -2.74312482e-03,\n", " -1.35264383e-03,\n", " -6.55428327e-04,\n", " -2.94184151e-04,\n", " -8.37557859e-05,\n", " 8.37314816e-05,\n", " 2.94160582e-04,\n", " 6.55405003e-04,\n", " 1.35262473e-03,\n", " 2.74309370e-03,\n", " 5.53925965e-03,\n", " 1.11734897e-02,\n", " 2.25310031e-02,\n", " 4.54232225e-02,\n", " 9.15313263e-02,\n", " 1.84133572e-01,\n", " 3.68027672e-01,\n", " 7.17884296e-01,\n", " ]\n", ")\n", "\n", "\n", "plt.plot(data[:, 0], data[:, 1], label=\"NeuralMag\")\n", "plt.plot(data[::4, 0], ref, label=\"Reference\")\n", "plt.legend()\n", "plt.xlabel(\"x [nm]\")\n", "plt.ylabel(\"m_x\")\n", "plt.show()" ] } ], "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 }