{ "cells": [ { "cell_type": "markdown", "id": "45d4c281-3990-4768-8981-567ff4bb6fbc", "metadata": {}, "source": [ "# Time dependent optimization (JAX version)\n", "In this example, we use the inverse computing capibilities of NeuralMag in order to optimize the direction of an external field in order to control the magnetization dynamics of a single-domain particle. Specifilly, the field is optimized such that the magnetization is pointing in a given direction $\\vec{m}_\\text{target}$ at time $T$. This example is taken from [1] and reads\n", "\n", "$$\n", "\\begin{align}\n", " \\vec{H}_\\text{ext}(\\theta, \\phi) &= H_c \\begin{pmatrix}\n", " \\sin(\\theta) \\cos(\\phi)\\\\\n", " \\sin(\\theta) \\sin(\\phi)\\\\\n", " \\cos(\\theta)\n", " \\end{pmatrix},\\\\\n", " \\vec{H}_\\text{eff} &= \\vec{H}_\\text{aniso} + \\vec{H}_\\text{exchange} + \\vec{H}_\\text{ext},\\\\\n", " \\mathcal{L}(\\theta, \\phi) &= \\int_{\\Omega} \\|\\vec{m}(T) - \\vec{m}_\\text{target}\\| \\,\\text{d}V.\n", "\\end{align}\n", "$$\n", "\n", "## Simulation\n", "For this example, we use the JAX backend together with the [Optax](https://optax.readthedocs.io/en/latest/) library for optimiz\n", "### Import libraries\n", "Import libraries, set backend to JAX and reduce FEM quadrature order for better performance." ] }, { "cell_type": "code", "execution_count": 1, "id": "132fae84-f7e7-4b11-abac-397c099cc349", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Version 0.9.1\u001b[0m\n", "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Backend set to 'jax'.\u001b[0m\n" ] } ], "source": [ "import equinox as eqx\n", "import jax.numpy as jnp\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import optax\n", "from scipy import constants\n", "from tqdm import tqdm\n", "\n", "import neuralmag as nm\n", "\n", "nm.config.backend = \"jax\"\n", "nm.config.fem[\"n_gauss\"] = 1" ] }, { "cell_type": "markdown", "id": "18c24f84-f43c-4e79-b23a-1e8dfead814a", "metadata": {}, "source": [ "### Setup mesh and state\n", "Setup mesh, state and material parameters and set initial magnetization in z-direction." ] }, { "cell_type": "code", "execution_count": 2, "id": "7d95c6e0-67fe-4401-b8d4-d8500c8fb580", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[Mesh] 3D, 2 x 2 x 2 (size = 5e-09 x 5e-09 x 5e-09)\u001b[0m\n", "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default device to 'TFRT_CPU_0'.\u001b[0m\n", "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[NeuralMag] Set default dtype to 'float32'.\u001b[0m\n", "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[State] Running on device: TFRT_CPU_0 (dtype = float32, backend = jax)\u001b[0m\n" ] } ], "source": [ "mesh = nm.Mesh((2, 2, 2), (5e-9, 5e-9, 5e-9))\n", "state = nm.State(mesh)\n", "\n", "state.material.Ms = 8e5\n", "state.material.A = 1.3e-11\n", "state.material.Ku = 1e5\n", "state.material.Ku_axis = [0, 0, 1]\n", "state.material.alpha = 0.1\n", "\n", "state.m = nm.VectorFunction(state).fill((0, 0, 1))" ] }, { "cell_type": "markdown", "id": "86dc9257-8ce0-4565-b53b-70fdea52c7d7", "metadata": {}, "source": [ "### Set up external-field function\n", "Next, we set up the external-field function as dynamic attribute depending and the spherical angles $\\phi$ and $\\theta$." ] }, { "cell_type": "code", "execution_count": 3, "id": "edc7a3ac-dff1-460b-bd4a-4a3e65750546", "metadata": {}, "outputs": [], "source": [ "H = 2 * 1e5 / (constants.mu_0 * 8e5)\n", "state.phi = lambda angles: angles[0]\n", "state.theta = lambda angles: angles[1]\n", "state.angles = [jnp.pi / 2, jnp.pi / 2]\n", "h_ext = lambda angles: jnp.stack(\n", " [\n", " H / 2 * jnp.sin(angles[0]) * jnp.cos(angles[1]),\n", " H / 2 * jnp.sin(angles[0]) * jnp.sin(angles[1]),\n", " H / 2 * jnp.cos(angles[0]),\n", " ]\n", ")" ] }, { "cell_type": "markdown", "id": "54944dc9-df78-49b1-813c-1c899e8d52f3", "metadata": {}, "source": [ "### Set up effective field" ] }, { "cell_type": "code", "execution_count": 4, "id": "2af95aa4-a9e1-4228-81d5-803bcbe1f99a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[ExchangeField] Register state methods (field: 'h_exchange', energy: 'E_exchange')\u001b[0m\n", "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[UniaxialAnisotropyField] Register state methods (field: 'h_aniso', energy: 'E_aniso')\u001b[0m\n", "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[ExternalField] Register state methods (field: 'h_external', energy: 'E_external')\u001b[0m\n", "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[TotalField] Register state methods (field: 'h', energy: 'E')\u001b[0m\n" ] } ], "source": [ "nm.ExchangeField().register(state, \"exchange\")\n", "nm.UniaxialAnisotropyField().register(state, \"aniso\")\n", "nm.ExternalField(h_ext).register(state, \"external\")\n", "nm.TotalField(\"exchange\", \"aniso\", \"external\").register(state)" ] }, { "cell_type": "markdown", "id": "11c08bf3-75ee-4252-b7bf-1ccb9af7bed7", "metadata": {}, "source": [ "### Set up LLGSolver\n", "Next, we set up the LLGSolver defining ```angles``` as parameters in order to allow for efficient gradient computation." ] }, { "cell_type": "code", "execution_count": 5, "id": "3c49686e-2d09-4b58-b04f-0ee7c973ae8a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2025-05-13 11:23:09 NeuralMag:INFO \u001b[1;37;32m[LLGSolverJAX] Initialize RHS function\u001b[0m\n" ] } ], "source": [ "llg = nm.LLGSolver(state, parameters=[\"angles\"])" ] }, { "cell_type": "markdown", "id": "8b21ecc5-4779-4c18-89dd-a85ed0c2c18a", "metadata": {}, "source": [ "### Define loss function\n", "We define the target magnetzation ```m_target``` and the loss function ```grad_loss```. Note the use of the ```filter_value_and_grad``` decorator that enriches the return value of the loss with its gradient." ] }, { "cell_type": "code", "execution_count": 6, "id": "02cc0a6a-4604-4311-b309-cc917974e9f5", "metadata": {}, "outputs": [], "source": [ "m_target = nm.VectorFunction(state).fill((0.5**0.5, 0, 0.5**0.5)).tensor\n", "\n", "\n", "@eqx.filter_value_and_grad\n", "def grad_loss(angles):\n", " m_pred = llg.solve(state.tensor([0.0, 0.05e-9]), angles).ys[-1]\n", " return jnp.mean((m_target - m_pred) ** 2)" ] }, { "cell_type": "markdown", "id": "cff0461b-978d-4f28-9dab-01b943d00a65", "metadata": {}, "source": [ "### Set up optimizer\n", "Now, we define a step function for the optimization and set up an AdaBelief optimizer with a learning rate of 0.05." ] }, { "cell_type": "code", "execution_count": 7, "id": "ae6e09c8-d89d-4df5-a69a-134e86733943", "metadata": {}, "outputs": [], "source": [ "@eqx.filter_jit\n", "def make_step(angles, opt_state):\n", " loss, grads = grad_loss(angles)\n", " updates, opt_state = optim.update(grads, opt_state)\n", " angles = eqx.apply_updates(angles, updates)\n", " return loss, angles, opt_state\n", "\n", "\n", "optim = optax.adabelief(0.05)\n", "opt_state = optim.init(state.angles)" ] }, { "cell_type": "markdown", "id": "12343f43-771e-443c-825d-41873702de9d", "metadata": {}, "source": [ "### Perform optimization loop" ] }, { "cell_type": "code", "execution_count": 8, "id": "2b91b860-fc61-4ad5-8b5d-64edff16d86e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 100/100 [00:49<00:00, 2.01it/s]\n" ] } ], "source": [ "logger = nm.ScalarLogger(\"time-dependent-optimization_jax/log.dat\", [\"step\", \"phi\", \"theta\", \"loss\"])\n", "for step in tqdm(range(100)):\n", " state.step = step\n", " state.loss, state.angles, opt_state = make_step(state.angles, opt_state)\n", " logger.log(state)" ] }, { "cell_type": "markdown", "id": "324924e9-3ca7-42a3-ae74-bd909bf4a6bb", "metadata": {}, "source": [ "### Plot the solution\n", "Finally, we plot the evolution of the field angles along with the loss function against the number of optimization steps." ] }, { "cell_type": "code", "execution_count": 18, "id": "72e66aaa-d3db-4024-bd6e-1cc6e3ea9ebd", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = np.loadtxt(\"time-dependent-optimization_jax/log.dat\")\n", "fig, ax1 = plt.subplots()\n", "(l1,) = ax1.plot(data[:, 0], data[:, 1], label=\"phi\")\n", "(l2,) = ax1.plot(data[:, 0], data[:, 2], label=\"theta\")\n", "ax1.set_xlabel(\"Step #\")\n", "ax1.set_ylabel(\"phi/theta\")\n", "\n", "ax2 = ax1.twinx()\n", "(l3,) = ax2.plot(data[:, 0], data[:, 3], label=\"L\", color=\"red\")\n", "ax2.set_ylabel(\"L\")\n", "\n", "lines = [l1, l2, l3]\n", "labels = [line.get_label() for line in lines]\n", "ax1.legend(lines, labels, loc=\"best\")\n", "\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 }