|
|
|
|
|
import numpy as np |
|
|
import matplotlib.pyplot as plt |
|
|
from bpm.refractive_index import generate_waveguide_n_r2 |
|
|
from bpm.mode_solver import slab_mode_source |
|
|
from bpm.core import run_bpm |
|
|
from bpm.pml import generate_sigma_x |
|
|
|
|
|
|
|
|
domain_size = 50.0 |
|
|
z_total = 500.0 |
|
|
Nx = 256 |
|
|
Nz = 2000 |
|
|
x = np.linspace(-domain_size/2, domain_size/2, Nx) |
|
|
z = np.linspace(0, z_total, Nz) |
|
|
|
|
|
|
|
|
l = 5.0 |
|
|
L = 200.0 |
|
|
w = 1.0 |
|
|
n0 = 1.0 |
|
|
n_WG = 1.1 |
|
|
|
|
|
n_r2 = generate_waveguide_n_r2(x, z, l, L, w, n_WG, n0) |
|
|
|
|
|
|
|
|
E0 = slab_mode_source(x, w, n_WG, n0, wavelength=0.532, ind_m=0, x0=0) |
|
|
E = np.zeros((Nx, Nz), dtype=np.complex128) |
|
|
E[:, 0] = E0 |
|
|
|
|
|
dx = domain_size / Nx |
|
|
sigma_x = generate_sigma_x(x, dx, 0.532, domain_size, sigma_max=0.5, pml_factor=5) |
|
|
|
|
|
E_out = run_bpm(E, n_r2, x, z, dx, z[1]-z[0], n0, sigma_x, 0.532) |
|
|
|
|
|
plt.figure(figsize=(8,6)) |
|
|
plt.imshow((np.abs(E_out)**2).T, extent=[x[0], x[-1], z[0], z[-1]], |
|
|
origin='lower', aspect='auto', cmap='inferno', |
|
|
vmin=0, vmax=0.6) |
|
|
plt.xlabel("x (um)") |
|
|
plt.ylabel("z (um)") |
|
|
plt.title("Waveguide BPM Propagation") |
|
|
plt.colorbar(label="Intensity") |
|
|
plt.show() |
|
|
|
|
|
|
|
|
|