Мой первый софт и астрономия

Здравствуйте, уважаемые хабрчане! Расскажу о своём небольшом опыте работы в проекте, который был посвящён астрономии, и о математике, с которой пришлось повозиться.

Дело было так — учился я в универе, изучал электронику, и после окончания курса по азам С++ , мне предложили подработку в одном проекте, где нужно было написать небольшую программу для моделирования рассеивания света звёздной пылью. Пришёл я на собеседование, которое проводили два доктора астрофизика, поспрашивали про математику и астрономию, поняли что не математик и уж тем более не астроном, но на работу взяли.

Первым моим заданием было подтянуть математику и боль-мень освоить фортран, так как на фортране был софт одного известного учёного М.И. Мищенко (Michael I. Mishchenko). Этот софт определял оптические свойства пыли в зависимости от её концентрации, формы пыли, длины волны и индекса преломления света.

Далее мне нужно было написать свою программу, которая моделирует рассеивание света. Модель простая — звезда, вокруг неё пылевое облако (параметры оптических свойств пылевого облака можно было рассчитать программой М.И. Мищенко), вдали от облака находится оптический телескоп. Моя программа моделирует полученное изображение на CCD матрице телескопа, а именно значение четырёх векторов Стокса, для каждого пикселя CCD матрицы. Метод, который использовался для моделирования рассеивания света — Монте-Карло. Я уговорил начальника — доктора астрофизики использовать C++, т.к. я не хотел писать её на фортране.

Задача была не сложной, начальник выводил формулы и уравнения, я решал их численными методами и ваял программу.

Упрощённая блок-схема программы, к которой я пришёл интуитивно, а после сравнил с одной публикацией (Three Monte Carlo programs of polarized light transport into scattering media: part I (Jessica C. Ramella-Roman, Scott A. Prahl, and Steve L. Jacques)) о разных методах Монте-Карло для рассеивания света. И понял что моя совпадает с классическим методом Монте-Карло для поляризованного излучения.

Блок-схема моей программы

Блок-схема моей программы

Из звезды вылетают пакеты фотонов (каждый пакет фотонов состоит из 1000 фотонов), которые летят в случайном направлении, после часть энергии рассеивается, в зависимости от направления пакета фотонов и оптических свойств пыли рассчитывается дальнейшее направление пакета фотонов. Каждое рассеивание фиксируется на CCD матрицу телескопа. И так много миллионов раз. Чем больше пакетов фотонов рассеяно, тем точнее изображение.

Часть математики я вывел сам — это моделирование излучения пакетов фотонов из сферического источника света и моделирование проекции пылевого облака на плоскость телескопа.

  1. Моделирование сферического источника света:

Звезда и испускание пакета фотонов из точки её поверхности

Звезда и испускание пакета фотонов из точки её поверхности

\left ( x_{cent};y_{cent};z_{cent} \right )— Декартовы координаты центра звезды.

\left ( r_{s};\vartheta_{s};\varphi_{s} \right ) — сферические координаты точки, на поверхности звезды, из которой будет испускаться пакет фотонов.

\Delta\vartheta— угол между нормалью к поверхности звезды и вектором эмиссии (испускания) пакета фотонов.

\left (\vartheta_{e};\varphi_{e} \right )— полярный и азимутальный углы эмиссии пакета фотонов.

Программа генерирует углы \varphi_{s}\in \left [ 0;2\pi  \right ) и \cos \left ( \vartheta_{s} \right ) \in \left [ -1;1 \right ], радиус звезды r_{s} — константа. Декартовы координаты точки эмиссии пакета фотонов рассчитываются по формуле (1.1)

80447c36be784e50ce6c8f5ba25c9555.png

Единичный вектор \mathbf{n}=\left (x_{n};y_{n};z_{n} \right ) рассчитывается по формуле (1.2)

87e9ded01fc2d5399bea1a19ac0fdc66.png

Угол между нормалью к поверхности звезды и вектором эмиссии \cos \left (\Delta\vartheta \right ) \in \left [ 0;1 \right ] .

Программа рассчитывает вектор эмиссии \mathbf{e_{0}}=\left (x_{e0};y_{e0};z_{e0} \right ) по формуле (1.3).

6986a62c1c96df59e7f7ee49059ed36c.png

Поворачиваем вектор эмиссии вокруг вектора нормали к поверхности звезды \mathbf{n} на угол \alpha \in \left [ 0;2\pi  \right ) .

Используем матрицу поворота , чтобы рассчитать вектор эмиссии \mathbf{e_{1}} после поворота.

2657df44066be39028f985a70574c0dc.png22fc54968e35857b6d6db2590ee43ade.png2d4cc2cdb4f99b067d881104b3a3bc47.png

Когда вектор получен,

рассчитываются полярный и азимутальный углы эмиссии \left (\vartheta_{e};\varphi_{e} \right )

bd649ccce7de11658c52a5ffa5ddf74e.png

В результате мы получили пакет фотонов, который испускается из точки поверхности звезды с координатами \left ( x_{s};y_{s};z_{s} \right ) и летит в направлении которое задают полярный и азимутальный углы \left (\vartheta_{e};\varphi_{e} \right ) .

  1. Моделирование проекции пылевого облака на плоскость телескопа:

    Сферическое облако и позиция телескопа до поворотов в программно заданную точку.

    Сферическое облако и позиция телескопа до поворотов в программно заданную точку.

Центр системы координат , центр сферического облака \left (x_{sph0};y_{sph0};z_{sph0} \right ) = \left (40;40;40 \right ), радиус сферического облака 39. (Это описание математической модели, в программе соответственно используются астрономические расстояния).

Координаты телескопа до поворотов:

7caf12aab725c5d242bc96d247f26f0c.png

Первый поворот осуществляется вокруг оси которая параллельна Y оси (X=40;Z=40),

Телескоп поворачивается на угол \vartheta_{tel.pos.} (полярный угол позиции телескопа):

bd87cf20c5658ecc081d84e8c4848fd8.png6bf00544448998d4823522ff19608970.png3a5a0691da17beff58eee26dda2032a3.png

Первый поворот телескопа на угол \vartheta_{tel.pos.} совершён.

Позиция телескопа после первого поворота

Позиция телескопа после первого поворота

Далее будет произведён поворот вокруг оси параллельной Z оси (X=40;Y=40), на угол \varphi_{tel.pos.} (азимутальный угол позиции телескопа).

72e50b74621a2a099792fd9a1fce66e0.png646ee2baafb3762d0803e6ef50cabb97.pnge0bf3a6ca046fe6fe38ae8d10102de93.png

Второй поворот телескопа на угол \varphi_{tel.pos.} совершён.

Позиция телескопа после второго поворота

Позиция телескопа после второго поворота

Далее необходимо рассчитать единичный вектор для плоскости телескопа (для проекции облака на плоскость телескопа):

0d56d8f2f3c04ef7a2375f8e9510a2dc.png

Необходимо рассчитать константу для уравнения плоскости телескопа:

56c809517e91db41d372821b71aed498.png

Уравнение плоскости телескопа:

e5a4e9362ed0251646be23f83ae4f6e6.png

Необходимо рассчитать рассчитать расстояния от точки облака до плоскости телескопа, \left (x_{sph};y_{sph};z_{sph} \right ) — точки облака

5be64eef411b375c99c83798e7cb116a.png

Далее получаем точки проекции облака на плоскость телескопа:

447aa7d1eb48eb72c339bfa3ab5ebec0.png

Для того чтобы правильно отобразить все точки облака и векторы Стокса на CCD матрице телескопе, необходимо выполнить обратные повороты.

38cdcb1080d5b12fafb2357bcfb6e0de.png1808f5cb3d67cfeacf41c3a3b2e05649.png009efd6888a3921da9796a6d4fe9623c.png2e622b4431ae7b2ce90afc93e9b336a8.pngc142f35492d3e51db57edb10f3abaef5.png23a01a4ffdb86f6c6853c2fd9fbb8b01.png

С математикой, которую выводил самостоятельно усё.

Написал я программу , которая рассчитана  под линукс, используется C++11 concurency, распараллеливание на ядра процессора (сколько ядер, столько одновременно пакетов фотонов рассеиваются), запускал на кластере суперкомпьютера, у которого было 24 ядра. Получил результаты, но нужно было их как-то проверить.

Начальник принял решение — написать другую программу, которая решит систему интегральных уравнений Фредгольма для простой модели со звездой, сферическим облаком вокруг неё и Рэлеевским рассеиванием света. Для этой задачи я решил использовать питон, из-за удобства библиотек (да и интересно было что-то на питоне написать).

Далее была необходима нормализация параметров, т.к. разные программы давали результаты в разных величинах измерения. Результаты совпали, но для большей убедительности результаты сравнили также с программой известного учёного Cornelis Dullemond RADMC3D. Там результаты тоже совпали.

Были конференции, прикладываю презентацию одной.

А также видео другой (выступает мой бывший начальник) :

И также написана научная публикация (это уже после окончания моей работы, её к сожалению выложить не могу).

Ну вот — как-то так, поработал, написал свой первый софт, подтянул математику, мне понравилось :)

© Habrahabr.ru