https://github.com/i-a-morozov/twiss
Differentiable Wolski twiss matrices computation for arbitrary dimension stable symplectic matrices
https://github.com/i-a-morozov/twiss
accelerator-physics automatic-differentiation parameterization
Last synced: 4 months ago
JSON representation
Differentiable Wolski twiss matrices computation for arbitrary dimension stable symplectic matrices
- Host: GitHub
- URL: https://github.com/i-a-morozov/twiss
- Owner: i-a-morozov
- License: mit
- Created: 2023-05-20T17:27:18.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-10-04T17:30:41.000Z (8 months ago)
- Last Synced: 2025-01-19T19:54:33.876Z (4 months ago)
- Topics: accelerator-physics, automatic-differentiation, parameterization
- Language: Python
- Homepage:
- Size: 6.33 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.MD
- License: LICENSE
Awesome Lists containing this project
README
# twiss, 2022-2024
![]()
Coupled twiss parameters (Wolski twiss matrices) computation for arbitrary even dimension.
# Install & build
```
$ pip install git+https://github.com/i-a-morozov/twiss.git@main
```
or
```
$ pip install twiss -U
```# Documentation
[](https://colab.research.google.com/github/i-a-morozov/twiss/blob/main/docs/source/examples/twiss.ipynb)
[https://i-a-morozov.github.io/twiss/](https://i-a-morozov.github.io/twiss/)
# Twiss
Compute tunes, normalization matrix and twiss matrices.
```python
>>> from math import pi
>>> import torch
>>> from twiss.matrix import rotation
>>> from twiss.wolski import twiss
>>> m = rotation(2*pi*torch.tensor(0.88, dtype=torch.float64))
>>> t, n, w = twiss(m)
>>> t
tensor([0.8800], dtype=torch.float64)
>>> n
tensor([[1.0000, 0.0000],
[0.0000, 1.0000]], dtype=torch.float64)
>>> w
tensor([[[1.0000, 0.0000],
[0.0000, 1.0000]]], dtype=torch.float64)
```Input matrices can have arbitrary even dimension.
```python
>>> from math import pi
>>> import torch
>>> from twiss.matrix import rotation
>>> from twiss.wolski import twiss
>>> m = rotation(*(2*pi*torch.linspace(0.1, 0.9, 9, dtype=torch.float64)))
>>> t, n, w = twiss(m)
>>> t
tensor([0.1000, 0.2000, 0.3000, 0.4000, 0.5000, 0.6000, 0.7000, 0.8000, 0.9000],
dtype=torch.float64)
```Can be mapped over a batch of input matrices.
```python
>>> from math import pi
>>> import torch
>>> from twiss.matrix import rotation
>>> from twiss.wolski import twiss
>>> m = torch.func.vmap(rotation)(2*pi*torch.linspace(0.1, 0.9, 9, dtype=torch.float64))
>>> t, n, w = torch.func.vmap(twiss)(m)
>>> t
tensor([[0.1000],
[0.2000],
[0.3000],
[0.4000],
[0.5000],
[0.6000],
[0.7000],
[0.8000],
[0.9000]], dtype=torch.float64)
```Can be used to compute derivatives of observables.
```python
>>> from math import pi
>>> import torch
>>> from twiss.matrix import rotation
>>> from twiss.wolski import twiss
>>> def fn(k):
... m = rotation(2*pi*torch.tensor(0.88, dtype=torch.float64))
... i = torch.ones_like(k)
... o = torch.zeros_like(k)
... m = m @ torch.stack([i, k, o, i]).reshape(m.shape)
... t, *_ = twiss(m)
... return t
>>> k = torch.tensor(0.0, dtype=torch.float64)
>>> fn(k)
tensor([0.8800], dtype=torch.float64)
>>> torch.func.jacfwd(fn)(k)
tensor([0.0796], dtype=torch.float64)
```