Волновые фронты
Класс Wavefront представляет комплексную амплитуду электромагнитного поля . Это основной объект, с которым работают все оптические элементы.
Наследование от torch.Tensor
Wavefront наследует torch.Tensor, поэтому поддерживает все тензорные операции:
from svetlanna import Wavefront
# Арифметика
wf_sum = wf1 + wf2 # Интерференция
wf_scaled = wf * 0.5 # Ослабление
wf_conj = wf.conj() # Комплексное сопряжение
# Перенос на GPU
wf_gpu = wf.to("cuda")
# Индексация
wf_slice = wf[100:400, 100:400]Фабричные методы
Плоская волна
wf = Wavefront.plane_wave(params)Создаёт волну с единичной амплитудой и нулевой фазой:
Гауссов пучок
Базовый
from svetlanna import Wavefront
from svetlanna.units import ureg
wf = Wavefront.gaussian_beam(params, waist_radius=0.5*ureg.mm)Гауссово распределение интенсивности:
Параметры:
| Параметр | Описание | По умолчанию |
|---|---|---|
waist_radius | Радиус перетяжки | — |
distance | Расстояние от перетяжки | 0.0 |
dx, dy | Смещение центра | 0.0 |
Сферическая волна
wf = Wavefront.spherical_wave(params, distance=50*ureg.mm)Сходящаяся (distance > 0) или расходящаяся (distance < 0) сферическая волна:
где — радиус кривизны (distance).
Создание из тензора
import torch
# Пользовательское распределение
amplitude = torch.ones(512, 512)
phase = torch.zeros(512, 512)
complex_field = amplitude * torch.exp(1j * phase)
wf = Wavefront(complex_field)При создании из тензора Wavefront автоматически приводит тип к complex64.
Свойства
| Свойство | Описание | Формула |
|---|---|---|
wf.intensity | Интенсивность | |
wf.phase | Фаза (радианы) | |
wf.max_intensity | Максимум интенсивности |
Интенсивность
I = wf.intensity # |E|²Возвращает квадрат модуля комплексной амплитуды.
Фаза
phi = wf.phase # arg(E)Возвращает фазу в радианах от до .
Максимальная интенсивность
I_max = wf.max_intensityЭквивалентно wf.intensity.max().
FWHM
fwhm_x, fwhm_y = wf.fwhm(params)Полная ширина на полувысоте (Full Width at Half Maximum) по осям X и Y.
# Перевод в микрометры
print(f"FWHM: {fwhm_x*1e6:.2f} × {fwhm_y*1e6:.2f} мкм")Операции над волновыми фронтами
Интерференция
# Сложение двух волн — интерференция
wf_interference = wf1 + wf2
# Интерференционная картина
I_interference = wf_interference.intensityМодуляция амплитуды
# Ослабление
wf_attenuated = wf * 0.5
# Усиление
wf_amplified = wf * 2.0
# Маска пропускания (0 или 1)
X, Y = params.meshgrid(x_axis='W', y_axis='H')
radius = 0.5e-3
mask = (X**2 + Y**2 < radius**2).float()
wf_masked = wf * maskМодуляция фазы
import torch
# Добавление фазы
phase_shift = torch.pi / 4
wf_shifted = wf * torch.exp(1j * phase_shift)
# Пространственная фазовая модуляция
phase_mask = create_phase_mask(params) # ваша функция
wf_modulated = wf * torch.exp(1j * phase_mask)Визуализация
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# Extent для правильных осей
extent = [
params.axes.W[0].item()*1e3, params.axes.W[-1].item()*1e3,
params.axes.H[0].item()*1e3, params.axes.H[-1].item()*1e3
]
# Интенсивность
im0 = axes[0].imshow(wf.intensity.cpu(), cmap='hot', extent=extent, origin='lower')
axes[0].set_title('Интенсивность')
axes[0].set_xlabel('x, мм')
axes[0].set_ylabel('y, мм')
plt.colorbar(im0, ax=axes[0])
# Фаза
im1 = axes[1].imshow(wf.phase.cpu(), cmap='twilight', extent=extent, origin='lower')
axes[1].set_title('Фаза')
axes[1].set_xlabel('x, мм')
axes[1].set_ylabel('y, мм')
plt.colorbar(im1, ax=axes[1])
plt.tight_layout()
plt.show()Многомерные волновые фронты
При использовании нескольких длин волн волновой фронт автоматически становится многомерным:
import torch
from svetlanna import SimulationParameters, Wavefront
# Три длины волны (RGB)
params = SimulationParameters(
W=torch.linspace(-1e-3, 1e-3, 256),
H=torch.linspace(-1e-3, 1e-3, 256),
wavelength=torch.tensor([630, 532, 465]) * 1e-9
)
wf = Wavefront.gaussian_beam(params, waist_radius=0.3e-3)
print(wf.shape) # torch.Size([3, 256, 256])
# Доступ к отдельным длинам волн
wf_red = wf[0] # 630 нм
wf_green = wf[1] # 532 нм
wf_blue = wf[2] # 465 нмПри многомерных расчётах все оптические элементы автоматически применяются к каждой длине волны с учётом дисперсии.
Пример: суперпозиция мод
import torch
from svetlanna import SimulationParameters, Wavefront
from svetlanna.units import ureg
params = SimulationParameters.from_ranges(
w_range=(-2*ureg.mm, 2*ureg.mm), w_points=512,
h_range=(-2*ureg.mm, 2*ureg.mm), h_points=512,
wavelength=632.8*ureg.nm
)
# Суперпозиция двух гауссовых пучков
wf1 = Wavefront.gaussian_beam(params, waist_radius=0.5*ureg.mm)
wf2 = Wavefront.gaussian_beam(params, waist_radius=0.3*ureg.mm)
# Сдвиг по фазе
wf2 = wf2 * torch.exp(1j * torch.pi / 2)
# Интерференция
wf_super = wf1 + wf2
# Интерференционная картина
I = wf_super.intensity
print(f"Максимальная интенсивность: {I.max():.4f}")GPU-ускорение
# Перенос на GPU
wf_gpu = wf.to('cuda')
# Или при создании через params
params.to('cuda')
wf = Wavefront.gaussian_beam(params, waist_radius=0.5e-3) # Автоматически на GPUСм. также
- SimulationParameters — настройка координат
- Оптические элементы — преобразование волновых фронтов
- Transforms — преобразование изображений в волновые фронты