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