{ "cells": [ { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "# Choosing runner\n", "\n", "In this tutorial, we show how to choose different “runners” to run your simulations. This is helpful if you want to change OOMMF installation you want to use. This is in particular helpful if you want to run OOMMF inside Docker, which allows us to run simulations on a “small linux machine”, which is automatically pulled from the cloud, simulations are run inside, and in the end it is destroyed automatically. This all happens in the background and requires no special assistance from the user. In order to use Docker, we need to have it installed on our machine - you can download it here: https://www.docker.com/products/docker-desktop.\n", "\n", "For that example, we simulate a skyrmion in a sample with periodic boundary conditions." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import oommfc as mc\n", "import discretisedfield as df\n", "import micromagneticmodel as mm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define mesh in cuboid through corner points `p1` and `p2`, and discretisation cell size `cell`. To define periodic boundary conditions, we pass an additional argument `bc`. Let us assume we want the periodic boundary conditions in $x$ and $y$ directions." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "region = df.Region(p1=(-50e-9, -50e-9, 0), p2=(50e-9, 50e-9, 10e-9))\n", "mesh = df.Mesh(region=region, cell=(5e-9, 5e-9, 5e-9), bc='xy')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can define the system object:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "system = mm.System(name='skyrmion')\n", "\n", "system.energy = (mm.Exchange(A=1.6e-11)\n", " + mm.DMI(D=4e-3, crystalclass='Cnv_z') \n", " + mm.UniaxialAnisotropy(K=0.51e6, u=(0, 0, 1)) \n", " + mm.Zeeman(H=(0, 0, 0.2e5)))\n", "\n", "Ms = 1.1e6\n", "\n", "def m_init(pos):\n", " x, y, z = pos\n", " if (x**2 + y**2)**0.5 < 10e-9:\n", " return (0, 0, -1)\n", " else:\n", " return (0, 0, 1)\n", " \n", "\n", "# create system with above geometry and initial magnetisation\n", "system.m = df.Field(mesh, nvdim=3, value=m_init, norm=Ms)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we can define the runner object. There are three main runners you can use:\n", "\n", "- Tcl runner: if we want to point ubermag to the particular `oommf.tcl` file\n", "- Exe runner: if we have OOMMF executable\n", "- Docker runner: if we want to run simulations inside Docker container" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "nbval-ignore-output" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "couldn't read file \"path/to/my/oommf.tcl\": no such file or directory\n" ] } ], "source": [ "tcl_runner = mc.oommf.TclOOMMFRunner(oommf_tcl='path/to/my/oommf.tcl')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "exe_runner = mc.oommf.ExeOOMMFRunner(oommf_exe='oommf')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "docker_runner = mc.oommf.DockerOOMMFRunner(image='ubermag/oommf')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**IMPORTANT:** On Windows, if OOMMF does not support some energy terms, choosing runner happens automatically in the background and requires no assistance from the user. However, you can still be explicit and tell ubermag how you want to run the simulation.\n", "\n", "Now, when we drive the system, we can pass the runner to the `drive` method:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running OOMMF (ExeOOMMFRunner)[2023/10/23 16:07]... (0.5 s)\n" ] }, { "data": { "image/png": "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r76CggIFBAQoLi7utMcvWLBAL7zwgh566CHdfvvt9Y5xu91yu91eCWLtknNtVdJMVAQBAIAtGIZ1H19cd9112rZtm44dO+Zpq6io0ObNmzV48GCFhITUe1xubq6WLl2qe++997RJYGFhoS677DLNmzevTrvL5VJubq7atWun2NhY3yZ6FqgIAgAA+GDKlCl64403lJ6ermnTpikgIEDPPvusTp06pYyMDElSfn6+7rjjDs2cOVM33XSTampqNGvWLEVHR+vKK6/Uzp07veL26NFDl1xyiYYNG6bVq1erVatWGjRokCoqKrRu3Trt3btXWVlZdZ5DaBYSwQuUy3BbFrvC8L5R1iyfVXa1LPbRz6Isiy1JMTvLrAteVGxZaNePJy2LLbfLutgWcjlrLIvd0rLIUsTOhm9Ub6yv46378/PZJZdYFluSYgP2WhY7yLDur9GWDhbtfqmpXzEXFRWldevWac6cOcrIyJBhGOrbt6+ef/55T7XOMAy5XC653T/9PXzkyBEdOHBAkjR27Nh64+bl5Sk6OlqzZ89Wz5499eKLL+q5555TQECAevbsqSVLluiaa66x5DuRCAIAAHto4kRQkmJiYrR06dLT9l955ZV17iOMjo6u977C+gQGBuquu+7SXXfddc7z9BX/3AAAAPBTVAQBAIAt+LqpA76jIggAAOCnqAgCAAB7oCJoOiqCAAAAfoqKIAAAsIWmfnzMhYiKIAAAgJ+iIggAAOyBewRNRyIIAABsgaVh87E0DAAA4KeoCAIAAHtgadh0VAQBAAD8FBVBAABgE9wjaDYqggAAAH6KiiAAALAH7hE0HRVBAAAAP0VFEAAA2AMVQdORCAIAAHvggdKma1QiWFlZqXfeeUc7duzQwYMHVVpaqrKyMl100UWKiIhQdHS0BgwYoKFDhyo4ONjsOQMAAMAEZ5UI/vDDD1q6dKlefPFFVVRUyDBOX6Ndu3at2rRpo//5n/9Renq6wsLCznmyAADAf50h7UAj+ZwIbt68WY888oh++OEHde7cWb/97W911VVXqVu3bgoPD9dFF12ksrIylZaW6ttvv9X777+vDz74QM8995xycnL02GOPadiwYVZ+FwAAAJwFnxLBp59+WkuWLFGPHj00e/ZsDRkypN5xERERioiIUGxsrCfpe/fddzV//nxNnz5dkydP1vTp082bPZpEpYX/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b1Rubm6jjgcAAGjKXcMXKp8Swb/97W86ceKEbr75ZqWlpSk/P7/O2nd93G63tm/frrvuuku33HKLysvL9be//c2USQMAAP/jMKz7+CufNov07NlT//jHP5SVlaV//OMfev/99xUSEqIrr7xSXbt2Vfv27RUaGqoff/xRJSUl+vbbb7V9+3adPHlShmHo+uuv14MPPqiwsDCrvw8AAAB85POu4YsuukhPPvmkJkyYoDVr1uj9999XXl6ep/+Xj5Np3769hg0bpttuu009e/Y0d9YAAMD/GI6mnsEF56wfH9OrVy/NmjVLkrRnzx59++23Ki0tVXl5udq2bauIiAh17drV8yBEAAAANE+Neo5grfj4eBI+AABwfvjxvXxWsedDigAAAHDOzqkiCAAAcL748+5eq1ARBAAA8FNUBAEAgD1QETRdoyqChYWFZs8DAADgjHigtPkalQgmJSXpjjvu0GuvvSan02n2nAAAAHAeNGppuG/fvvroo4+0fft2hYWF6YYbbtDYsWMVExNj9vwAAAB+4seVO6s0KhHcsGGDvv/+e73yyiv65z//qVWrVmn16tXq27evbrrpJg0fPlzBwcFmzxXNRLDDuie7xwQftSz23ztb+xPEFRFqWewWJUGWxXY5ayyLLbfLuthWatHSutBBFv6/tPD34EkL//xY+edesvZnFmB3jd413LlzZ6Wnp+uVV17Rpk2bNHHiRBUVFemBBx7Q1VdfrUcffVS7d+82c64AAMCfGRZ+/JQpj4/p0aOH7rvvPm3ZskWrV69WbGys1q9frzFjxmj8+PF69913zTgNAAAATGTa42OKioo8S8W1lcC+ffvq66+/Vnp6ukaPHq3HH39cAQEBZp0SAAD4EX/e3WuVc0oE3W63tmzZopdeeklbt25VTU2NLrroIt122226+eabFRMTo1OnTmnhwoV67rnnFBERoQceeMCsuQMAAOAcNCoR/O677/TSSy8pJydHJSUlMgxDl112mW6++WaNGjVKQT+7Gbp169b64x//qJKSEm3atIlEEAAAoJloVCJ43XXXyeFwqHXr1ho7dqxuueUWJSQknPGYq6++Wq+88kqjJgkAAODPmzqs0qhEsEePHrr55pv13//93woJCfHpmH79+mnu3LmNOR0AAAAs0KhEcNOmTWd9THR0tKKjoxtzOgAAADaLWMCUx8cAAADA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p0gEAQAA/BSJIIBm58svv1S/fv30hz/8oUnO/95776lnz55asGBBk5wfAM4XXjEHoFk5ceKErr/+erVt21YvvfSSgoKCmmQeixcv1tNPP62nn35aw4cPb5I5AIDVSAQBNCv333+/Nm3apPXr1+vyyy9vsnm4XC4lJyerqKhIr7/+uiIiIppsLgBgFZaGATQbu3bt0qZNm3TVVVc1aRIoSS1bttS9996rH374QUuXLm3SuQCAVUgEAZyzHTt2KCEhQbfccot+ucjw0ksvqUePHvrjH//YYJw1a9ZIklJTU+u0v/zyy+rRo4dWrVqljz/+WLfddpv69++vyy67TDfffLPy8/PrjL/tttvUo0cPlZaWavbs2br66qt12WWXafTo0crLy5MkvfLKK7r++uvVp08fXXPNNcrKypLT6awTZ/DgwercubNefPFFVVRUnPV1AYDmjkQQwDkbMGCAJk6cqH/9619at26dp724uFhPPvmkOnfurD//+c9njGEYht577z2FhIToiiuuqHfM559/runTpysxMVF//vOfdfPNN2vnzp2aNGmSiouLvcZnZWVp//79mjFjhiZOnOj577/+9a/Kzs7WmDFj9Kc//UlBQUFas2aNVq9eXed4h8Ohq666ShUVFXrnnXfO/sIAQDPXqqknAODCMH36dG3dulXz58/Xtddeq06dOikrK0vl5eVavHixQkNDz3j8nj17VFJSomuuuUatWtX/o+mNN95QTk6O4uPjJUk33HCDTpw4ob///e967733NGbMmDrjy8rKtGLFCs+vS0pK9MILLyg7O1tvvfWWOnToIEnq0aOHbr75Zr399tte1cirrrpKL7zwgnbs2KGRI0ee9XUBgOaMiiAAUwQGBmrOnDlyOp363//9X23ZskWvv/660tLSNGDAgAaP//bbbyVJXbt2Pe2YgQMHepLAWn369JEkFRUVeY0fO3ZsnV8nJCRIkq655hpPEihJPXv2lCQdO3bMK0a3bt0kSQcPHmzwOwCA3VARBGCa7t27695779UTTzyh7du3q1evXpo6dapPxx4/flyS1L59+9OO6dKli1dbcHCwJKmmpsarr3PnznV+XfsomtO11xejdrdwaWnpaecFAHZFRRCAqW644QYFBQWpoqJCycnJCggI8Om4srIySVLbtm1PO+ZsnykYGBhYb7uvc/r5fMrLy8/q3ABgBySCAEz16KOPqqamRjExMVq4cKEOHz7s03EXXXSRpOaXcNXO50wJKgDYFYkgANO89tprevXVVzVx4kRlZ2ersrJS999/v9xud4PHhoeHS/ppQ0dzUjsfHigN4EJEIgjAFEVFRcrMzFRMTIymTZummJgYTZ06Vfn5+Vq5cmWDx9duEqndNNJc1M4nOjq6iWcCAOYjEQRwzgzD0IMPPqiysjI98cQTnnvzJk6cqF69eunpp5/W7t27zxgjPj5e7du31/bt2+vdtNFUtm7dKkk+7XwGALshEQRwztatW6etW7fqjjvuUN++fT3trVq10hNPPCFJuu+++1RVVXXaGA6HQ4MHD9bJkyf18ccfWz1lnxiGoa1bt6pNmzYaOnRoU08HAEznMH75PigAaCK7du3SmDFjdNVVV/m0nGy1d999V2lpabrjjjv0pz/9qamnAwCmoyIIoNno1auXrr/+em3dulX/+te/mnQuLpdL8+fPV7t27ZSent6kcwEAq5AIAmhWHnzwQf3Hf/yHZs6cecalZKstW7ZMe/bsUWZmpmdHMwBcaEgEATQr7dq10+LFi3Xw4EE9/PDDTTKH999/X88884zS09M1fPjwJpkDAJwP3CMIAADgp6gIAgAA+CkSQQAAAD9FIggAAOCnSAQBAAD8FIkgAACAnyIRBAAA8FMkggAAAH6KRBAAAMBP/b96vR2xTh6txQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "md = mc.MinDriver()\n", "md.drive(system, runner=exe_runner)\n", "\n", "# Plot relaxed configuration: vectors in z-plane\n", "system.m.sel('z').z.mpl()" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "The first time we run the simulation, it is going to take some time for docker to pull an image from the cloud, but after that, the image will be known by docker, so there will be no delays for any further runs." ] } ], "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.8.17" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "8ff66df849444027a09f2505c160d8e7": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "9ca076dd2f624d909f5ad3c00f9dba15": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "b103e5927d7040488e3e9c641e449e37": { "model_module": "k3d", "model_module_version": "2.8.2", "model_name": "PlotModel", "state": { "_backend_version": "2.7.4", "_dom_classes": [], "_view_count": null, "antialias": 3, "auto_rendering": true, "axes": [ "x (nm)", "y (nm)", "z (nm)" ], "axes_helper": 1, "background_color": 16777215, "camera": [ 141.0506683940143, -212.2010025072024, 18.880066776443996, -0.2499999664723873, -0.2499999664723873, 4.749999940395355, 0, 0, 1 ], "camera_animation": [], "camera_auto_fit": true, "camera_fov": 60, "camera_no_pan": false, "camera_no_rotate": false, "camera_no_zoom": false, "clipping_planes": [], "colorbar_object_id": -1, "fps": 25, "fps_meter": false, "grid": [ -1, -1, -1, 1, 1, 1 ], "grid_auto_fit": true, "grid_visible": true, "height": 512, "layout": "IPY_MODEL_9ca076dd2f624d909f5ad3c00f9dba15", "lighting": 1.5, "menu_visibility": true, "mode": "view", "name": null, "object_ids": [ 140045066807504 ], "rendering_steps": 1, "screenshot": "", "screenshot_scale": 2, "snapshot": "", "time": 0, "voxel_paint_color": 0 } }, "b93f42b8060d44bb87e6ede0ba464673": { "model_module": "k3d", "model_module_version": "2.8.2", "model_name": "ObjectModel", "state": { "_view_count": null, "_view_module": null, "_view_module_version": "", "_view_name": null, "colorLegend": false, "color_map": { "compressed_buffer": {}, "dtype": "uint32", "shape": [ 256 ] }, "compression_level": 0, "id": 140045066807504, "model_matrix": { "compressed_buffer": {}, "dtype": "float32", "shape": [ 4, 4 ] }, "name": "Voxels #1", "opacity": 1, "outlines": false, "outlines_color": 0, "type": "Voxels", "visible": true, "voxels": { "compressed_buffer": {}, "dtype": "uint8", "shape": [ 2, 20, 20 ] }, "wireframe": false } }, "f92e416a943b432c8141e3f65c0959d1": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "layout": "IPY_MODEL_8ff66df849444027a09f2505c160d8e7", "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b103e5927d7040488e3e9c641e449e37", "version_major": 2, "version_minor": 0 }, "text/plain": "Plot(antialias=3, axes=['x', 'y', 'z'], axes_helper=1.0, background_color=16777215, camera=[2, -3, 0.2, 0.0, 0…" }, "metadata": {}, "output_type": "display_data" } ] } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 }