{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "556562f3-8ece-4517-8c93-ee5e2fc29131", "metadata": {}, "source": [ "# Example-12: Alignment errors (curved layout)" ] }, { "cell_type": "markdown", "id": "f5024b54-8cfc-41a9-926a-43dba9bc1ae7", "metadata": {}, "source": [ "In this example alignment errors for curven planar layout are illustrated.\n", "\n", "Alignment errors (translations and rotations) are defined with respect to the element entrance frame.\n", "\n", "The full transformations sequence:\n", "\n", "```python\n", "# forward translations and rotations\n", "qsps = tx(qsps, +dx)\n", "qsps = ty(qsps, +dy)\n", "qsps = tz(qsps, +dz, beta, constant)\n", "qsps = rx(qsps, +wx, beta, constant)\n", "qsps = ry(qsps, +wy, beta, constant)\n", "qsps = rz(qsps, +wz)\n", "\n", "# element body transformation\n", "qsps = element(qsps, length, angle, ...)\n", "\n", "# finite lenght correction\n", "qsps = ry(qsps, +angle/2, beta, constant)\n", "qsps = tz(qsps, -2.0*length/angle*jax.numpy.sin(angle/2.0), beta, constant)\n", "qsps = ry(qsps, +angle/2, beta, constant)\n", "\n", "# inverse translation and rotations\n", "qsps = rz(qsps, -wz)\n", "qsps = ry(qsps, -wy, beta, constant)\n", "qsps = rx(qsps, -wx, beta, constant)\n", "qsps = tz(qsps, -dz, beta, constant)\n", "qsps = ty(qsps, -dy)\n", "qsps = tx(qsps, -dx)\n", "\n", "# finite lenght correction\n", "qsps = ry(qsps, -angle/2, beta, constant)\n", "qsps = tz(qsps, +2.0*length/angle*jax.numpy.sin(angle/2.0), beta, constant)\n", "qsps = ry(qsps, -angle/2, beta, constant)\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "id": "39ad6e2f-2eea-448c-8af2-68af81d4fbc7", "metadata": {}, "outputs": [], "source": [ "import jax\n", "from jax import jit\n", "from jax import jacrev\n", "\n", "from elementary.util import ptc\n", "from elementary.util import beta\n", "from elementary.dipole import dipole_factory\n", "from elementary.alignment import alignment_factory\n", "\n", "jax.numpy.set_printoptions(linewidth=256, precision=12)" ] }, { "cell_type": "code", "execution_count": 2, "id": "2e08aca6-8d14-40b9-a2e5-3b9d10fcee66", "metadata": {}, "outputs": [], "source": [ "# Set data type\n", "\n", "jax.config.update(\"jax_enable_x64\", True)" ] }, { "cell_type": "code", "execution_count": 3, "id": "1a065640-8a26-45ca-b367-24aa56338b43", "metadata": {}, "outputs": [], "source": [ "# Set device\n", "\n", "device, *_ = jax.devices('cpu')\n", "jax.config.update('jax_default_device', device)" ] }, { "cell_type": "code", "execution_count": 4, "id": "5afddade-3c03-4bc2-b991-0b8f5c5a94e5", "metadata": {}, "outputs": [], "source": [ "# Set initial condition\n", "\n", "(q_x, q_y, q_s) = qs = jax.numpy.array([-0.01, 0.005, 0.001])\n", "(p_x, p_y, p_s) = ps = jax.numpy.array([0.001, 0.001, -0.0001])\n", "qsps = jax.numpy.hstack([qs, ps])" ] }, { "cell_type": "code", "execution_count": 5, "id": "e74a5e30-ffb2-4d1c-b4d4-df8365cadafa", "metadata": {}, "outputs": [], "source": [ "# Define generic dipole element with alignment errors\n", "\n", "gamma = 10**3\n", "\n", "length = jax.numpy.float64(1.0)\n", "angle = jax.numpy.float64(0.05)\n", "\n", "kq_n = jax.numpy.float64(-2.0)\n", "kq_s = jax.numpy.float64(+1.5)\n", "ks_n = jax.numpy.float64(-50.0)\n", "ks_s = jax.numpy.float64(+75.0)\n", "ko_n = jax.numpy.float64(-100.0)\n", "ko_s = jax.numpy.float64(+500.0)\n", "\n", "body = dipole_factory(exact=False, multipole=True, beta=beta(gamma), gamma=gamma, order=2**1, iterations=1E3)\n", "xyz_entrance, xyz_exit = alignment_factory(beta=beta(gamma), gamma=gamma, flag=True)\n", "\n", "@jit\n", "def element(x, length, angle, kq_n, kq_s, ks_n, ks_s, ko_n, ko_s, dx, dy, dz, wx, wy, wz):\n", " x = xyz_entrance(x, dx, dy, dz, wx, wy, wz)\n", " x = body(x, length, angle, kq_n, kq_s, ks_n, ks_s, ko_n, ko_s)\n", " x = xyz_exit(x, dx, dy, dz, wx, wy, wz, length, angle)\n", " return x" ] }, { "cell_type": "code", "execution_count": 6, "id": "f830379c-e1c0-4df8-8882-961ce1e25e38", "metadata": {}, "outputs": [], "source": [ "# Set alignment errors\n", "\n", "dx, dy, dz = jax.numpy.array([0.05, -0.02, 0.05])\n", "wx, wy, wz = jax.numpy.array([0.005, -0.005, 0.1])" ] }, { "cell_type": "code", "execution_count": 7, "id": "554d5e56-93ea-438d-9c18-73b2170513dd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-6.489404977601e-02 2.078529965405e-02 -2.211224419908e-04 -1.450307156643e-01 8.291770017251e-02 -1.000000000000e-04]\n", "[-6.489404978720e-02 2.078529965695e-02 -2.211225001033e-04 -1.450307157164e-01 8.291770017969e-02 -1.000000000000e-04]\n", "True\n" ] } ], "source": [ "# Compare with PTC\n", "\n", "print(res := element(qsps, length, angle, kq_n, kq_s, ks_n, ks_s, ko_n, ko_s, dx, dy, dz, wx, wy, wz))\n", "print(ref := ptc(qsps, 'sbend', {'l': float(length), 'angle': float(angle), 'knl': f'{{0.0,{float(kq_n*length)}, {float(ks_n*length)}, {float(ko_n*length)}}}', 'ksl': f'{{0.0,{float(kq_s*length)}, {float(ks_s*length)}, {float(ko_s*length)}}}', 'kill_ent_fringe': 'true', 'kill_exi_fringe': 'true'}, gamma=gamma, tx=float(dx), ty=float(dy), tz=float(dz), rx=float(wx), ry=float(wy), rz=float(wz)))\n", "print(jax.numpy.allclose(res, ref))" ] } ], "metadata": { "colab": { "collapsed_sections": [ "myt0_gMIOq7b", "5d97819c" ], "name": "03_frequency.ipynb", "provenance": [] }, "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.12.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 5 }