camfr_mode_fields

ipkiss3.all.device_sim.camfr_mode_fields(material_stack, wavelengths, modes=None, components=None, sample_dist=0.01)

Calculates the fields for the modes for a material stack using the camfr mode solver.

This function can be useful to get insight in camfr_guided_modes, as the latter only returns the calculated neffs.

Parameters:
material_stack: MaterialStack object

The stack of ipkiss materials to calculate the modes for.

wavelengths: array_like

An array of wavelengths to calculate the modes for

modes: List[str]

A list of modenames to calculate the fields for. [‘TE0’, ‘TM1’] will select the zeroth order TE mode and the first order TM mode

components: List[str]

A list of field components to calculate. [‘E1’, ‘E2’, ‘Ez’] will calculate all E fields

sample_dist: float

Distance between the positions to sample the fields on.

Returns:
tuple

Tuple of fields and x_positions. fields is a numpy array of size (n_modes, n_wavelengths, n_components, n_x_positions) and of type np.complex128, while x_positions is an array of coordinates at which the field is sampled

Examples

import si_fab.all as pdk
from pysics.basics.material.material_stack import MaterialStack
import ipkiss3.all as i3
import numpy as np
import matplotlib.pyplot as plt

# we define a MaterialStack
mstack = MaterialStack(
    name="300nm Si",
    materials_heights=[
        (i3.TECH.MATERIALS.SILICON_OXIDE, 0.500),
        (i3.TECH.MATERIALS.SILICON, 0.300),
        (i3.TECH.MATERIALS.AIR, 1.070)
    ]
)

wavelengths = np.linspace(1.54, 1.56, 10)

# calculate the fields

fields, positions = i3.device_sim.camfr_mode_fields(
    mstack,
    wavelengths,
    modes=['TE0', 'TE1'],
    components=['E2', 'H2'],
    sample_dist=0.010
)

# we select the fields for a certain mode and
# a certain wavelength
TE0 = fields[0, 0, 0, :].real
TE1 = fields[1, 0, 0, :].real
max_fields = max(np.max(TE0), np.max(TE1))
min_fields = min(np.min(TE0), np.min(TE1))

fig = mstack.visualize(show=False, titlepad=35)
ax1 = fig.gca()
ax1.set_ylabel('x [um]')
ax1.set_xlabel('y [um]')
ax2 = ax1.twiny()

ax2.set_xlabel(r'$E_y$ [a.u.]')
ax2.plot(TE0, positions, label='$E_y$ - TE0')
ax2.plot(TE1, positions, label='$E_y$ - TE1')

# we add a legend
plt.legend(loc='lower right')
plt.tight_layout()
plt.show()
../../../../_images/ipkiss3-all-device_sim-camfr_mode_fields-1.png