Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Category:

Трассировщик лучей для моделирования "кривого зеркала"

Итак, сегодня я более-менее доделал трассировщик (правда, пока только на CUDA — надо будет еще с OpenMP для CPU написать, чтобы работало, если GPU будет недоступен или не справится).
Для сохранения результатов подключил cfitsio, еще планирую сделать сохранение в png/tiff.
13.01.23_21:12:22
Изображение точечного объекта с точностью поверхности зеркала 30 нм. Размер пикселя: 10мкм
Выше — пример изображения, которое получилось у меня на «матрице» 1000×1000 пикселей с пикселем 10×10 мкм при наложении на поверхность зеркала сглаженную матрицу 10×10 со случайными значениями (от 0 до 30 нм) отклонений. Вроде бы не так уж и много: 30 нм — это всего-то порядка λ/16, а уже получаем гауссиану с полушириной порядка 1'' (а весь разброс пикселей доходит до трех секунд).
Для примера вот что получается, если поднять точность поверхности зеркала до десяти нанометров (правда, здесь уже сильно сказывается ограниченность float):
13.01.23_21:12:59
Точечный объект с десятимикронной точностью поверхности.
Получаем полуширину в четверть секунды, а полную — в полторы!
Ладно, на «точечки» посмотрели, надо бы проверить, получится ли кома. Для начала я «наклонил» зеркало на 1°, а чтобы изображение оставалось в той же точке, объект «наклонил» в противоположную сторону на 2°. В итоге получилась вот такая прелесть (количество «фотонов» увеличил до ста миллионов):
Кома при отклонении объекта от оптической оси на 1°.
Отклонения (все те же 0..30 нм):
Поверхность зеркала для предыдущей картинки, отклонения: 0..30 нм.
А вот такая кома получается при наклоне на полградуса:
Кома при наклоне на 0.5°
Тоже сказывается нехватка «фотонов», несмотря на то, что их количество было повышено до пятиста миллионов.
Ну и напоследок — кома для идеального зеркала:
Кома «идеального» зеркала.
И она же посимпатишней:
Кома «идеального» зеркала.
Слабовато, но заметно, что какой-то дальний край комы получился неправильный: вместо положительной кривизны он имеет отрицательную. То ли это связано с моей криворукостью, то ли опять фотонов не хватает — не знаю. Надо проверять.
Итак, нужно еще дописать CPU-версию того же самого, чтобы сравнить производительность, а еще — сделать наконец маскирование. И можно будет строить гартманнограммы для проверки своих теорий. А то версия на Octave была уж слишком медленной и неточной.
Subscribe

  • А что, в С так нельзя?

    Пытаюсь передать в функцию цвет как массив. Функция такая: void Pattern_draw3(Img3 *img, Pattern *p, int xul, int yul, uint8_t colr[3]); И…

  • Ардуиноподход

    Вот как ни гляну, большинство народу для считывания данных калибровки в BMP/BME280 использует типичный ардуиноподход, как, например, здесь: зачем-то…

  • Темы-2

    Некоторые испугались, прочитав предыдущие темы. Повторяю: темы для работы в течение всей школы (три года). А вот — их части, которые можно осилить за…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 0 comments