Моделювання в ASTRA. Частина 1. Генератор

A Space Charge Tracking Algorithm (ASTRA) прокладає рух заряджених частинок під впливом зовнішніх електричних і магнітних полів. Код написаний на Fortan 90 і призначений для моделювання, оптимізації роботи прискорювачів. Як і всякий код написаний фізиками є важким по старті. Тут я хотів би описати певні особливості, аби полегшити роботу з ним.

Спершу фізика. Зрозуміло, щоб щось описати у мікросвіті, треба розв'язати рівняння Шредінгера:

i\hbar\frac{\partial}{\partial t}\left|\Psi(t)\right>=H\left|\Psi(t)\right>

Жартую =) Все набагато простіше. Загальні рівняння руху частинки в електромагнітному полі:

\frac{d\vec{r}}{dt}=\frac{\vec{p}}{m_0\gamma};\ \ \frac{d\vec{p}}{dt}=q(\vec{E}+\frac{\vec{p}}{m_0\gamma}\times\vec{B})

ASTRA виконує інтегрування цих рівнянь за допомогою методу Рунге-Кутта четвертого порядку зі фіксованим кроком. Поля \vec{E} та \vec{B} включають зовнішні внески від прискорювальних і фокусуючих полів та внутрішні поля (space charge). Space charge -- це, по суті, врахування того, що частинки, які ми прискорюємо всі одного знаку і тому вони розштовхуються. Цей ефект можна вмикати і вимикати за вимогою, без нього рахується швидше і якщо ви промоделювали прискорювач без нього, то з ним результат відрізнятиметься мало (але відрізнятиметься!).

До речі, програму, приклади, мануал можна скачати тут.

Перед тим як промоделювати проходження частинок в прискорювачі, потрібно спершу згенерувати початковий розподіл. Для цього в комплекті з основним кодом дається допоміжна програма generator. Аргументом при запуску її слугує назва скрипту, де ви описуєте який розподіл хочете згенерувати. Розширення для всіх скриптів має бути ".in". Давайте розберемо стандартний приклад, що можна знайти на тому ж сайті.

&INPUT
FNAME = 'Example.ini'
Add=FALSE,    N_add=0,
IPart=500,    Species='electrons'
Probe=True,    Noise_reduc=T,        Cathode=F
Q_total=1.0E0

Ref_zpos=0.0E0,    Ref_Ekin=2.0E0

Dist_z='gauss',        sig_z=1.0E0,    C_sig_z=2.0
Dist_pz='g',              sig_Ekin=1.5,    cor_Ekin=0.0E0

Dist_x='gauss',      sig_x=0.75E0,
Dist_px='g',         Nemit_x=1.0E0,    cor_px=0.0E0
Dist_y='g',          sig_y=0.75E0,
Dist_py='g',         Nemit_y=1.0E0,    cor_py=0.0E0
/

Він складається лише з одного поля імен INPUT (при роботі з ASTRA їх буде більше). Список і описів усіх параметрів можна знайти у тому ж мануалі.

Отож, FNAME = 'Example.ini' -- задаєте назву файлу з вихідним розподілом. Формат виведення можна знайти на 2 сторінці мануалу. Ця програма генерує прості розподіли (рівномірний, плато, парабола ріжками вниз, Гаусіан). Щоб згенерувати складніший розподіл, можна скомбінувати з існуючих, шляхом додавання до файлу нових розподілів аргументами   Add,    N_add. Add є булеан і в принципі зрозуміло, що значить, а N_add значить скільки разів додати цей розподіл. В принципі можна написати і свій власний генератор. Це не рокет саєнс.   IPart=500,    Species='electrons' -- 500 електронів.   Probe=True, -- якась хуйня,    Noise_reduc=T,  -- це значить, що частинки будуть розподілені не рандомно, а квазірандомно. Тобто, коли побудуєте наприклад ху розподіл, то побачите візерунок. Автор стверджує,  що зменшить статистичні флюктуації.   

Cathode=F -- це вказівник на те, чи у вас випромінювання з катоду, чи ні. Якщо у вас ваше джерело типу лампочки (з катодом), то електроди у вас випромінюються з одного і того самого місця, але з часовою затримкою. Тобто у вас буде розподіл радше у часі, ніж в координаті. Це треба при генеруванні поздовжнього розподілу.  

Q_total -- заряд пучка. Не обов'язково генерувати стільки частинок, щоб набрати цей заряд. Я так розумію він враховується при обрахунку поля space charge.

Ref_zpos=0.0E0,    Ref_Ekin=2.0E0 -- позиція та кінетична енергія референсної частинки. Це ще одна особливість. Позиції, імпульси, час всіх інших частинок дається відносно цієї частинки. Якщо ця частинка загубилась, що ви отримаєте помилку про це і програма перестане далі рахувати. Референсна частинка розраховується першою. І в усіх файлах також перша. Та, частинки можуть губитись, або ще щось ставатись. Ця інформація закодована в status flag (ст. 3 мануалу). Коли будете потім працювати зі згенерованими розподілами, то спершу перевіряйте статус, накладайте кати і тд.

Але не про це.   Dist_z='gauss',   -- розподіл по z (по інших координатах те саме).     sig_z=1.0E0,   -- сигма гауса. В інших розподілів інші параметри. C_sig_z=2.0 -- хз. По імпульсу те саме.

Коли запустите генератор, то окрім файлу з частинками буде також згенерований NORRAN файл, що містить початкове число (seed value) для генератора і буде щоразу оновлятись, коли генератор запускається.

На цьому поки що все. Продовження і буде в наступній частині.

Моделювання в ASTRA. Частина 1. Генератор

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.

Догори