Source code for nannos.excitation

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Benjamin Vial
# This file is part of nannos
# License: GPLv3
# See the documentation at nannos.gitlab.io

from . import backend as bk
from . import get_types
from .constants import pi

FLOAT, COMPLEX = get_types()

__all__ = ["PlaneWave"]

_deg2rad = pi / 180


[docs] class PlaneWave: r"""A plane wave object Parameters ---------- wavelength : float Wavelength (the default is 1). angles : tuple Incidence angles :math:`(\theta,\phi,\psi)` in degrees (the default is (0, 0, 0)). :math:`\\theta`: polar angle, :math:`\phi`: azimuthal angle, :math:`\psi`: polarization angle. """ def __init__(self, wavelength=1, angles=(0, 0, 0)): self.wavelength = bk.array(wavelength, dtype=FLOAT) self.angles_deg = bk.array(angles, dtype=FLOAT) self.angles = self.angles_deg * _deg2rad self.theta, self.phi, self.psi = self.angles self.frequency_scaled = 1 / self.wavelength k0 = 2 * pi * self.frequency_scaled self.wavenumber = k0 self.wavevector = k0 * bk.array( [ bk.sin(self.theta) * bk.cos(self.phi), bk.sin(self.theta) * bk.sin(self.phi), bk.cos(self.theta), ] ) cpsi = bk.cos(self.psi) # p spsi = bk.sin(self.psi) # s # cx = cpsi * bk.cos(self.theta) * bk.cos(self.phi) - spsi * bk.sin(self.phi) # cy = cpsi * bk.cos(self.theta) * bk.sin(self.phi) + spsi * bk.cos(self.phi) # cz = cpsi * bk.sin(self.theta) cx = cpsi * bk.cos(self.theta) * bk.cos(self.phi) - spsi * bk.sin(self.phi) cy = cpsi * bk.cos(self.theta) * bk.sin(self.phi) + spsi * bk.cos(self.phi) cz = -cpsi * bk.sin(self.theta) self.amplitude = bk.array([cx, cy, cz]) kt = self.wavevector omega = k0 K = bk.array([[kt[1] ** 2, -kt[0] * kt[1]], [-kt[0] * kt[1], kt[0] ** 2]]) Q = omega**2 * bk.array(bk.eye(2)) - K q = (omega**2 - kt[0] ** 2 - kt[1] ** 2) ** 0.5 C = bk.linalg.inv(Q) * (omega * q) et = bk.array([-self.amplitude[1], self.amplitude[0]]) self.a0 = C @ et
# self.a0 = -self.amplitude[1], self.amplitude[0] # self.a0 = self.amplitude[0], self.amplitude[1]