Source code for fdtd.waveforms

"""This module implements waveforms to be attached to sources."""
from abc import ABC, abstractmethod
from typing import Union

import matplotlib.pyplot as plt
import numpy as np


class Waveform(ABC):
    """Base Waveform."""

    @abstractmethod
    def func(self):
        """Waveform function."""

        def wrap(time):
            """Wrap function."""
            return 0 * time

        return wrap

    def __call__(self, time: Union[float,
                                   np.ndarray]) -> Union[float, np.ndarray]:
        """Call a waveform function."""
        return self.func()(time)

    def plot(self, time: np.ndarray):
        """Plot waveform for a given time array."""
        y = self.func()(time)
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.plot(time, y)
        plt.show()


[docs]class GaussianWaveform(Waveform): """ Model of a gaussian waveform. Represent a function ``A*exp(-(t-t0)^2/tau^2)``. This model should be attached to a source. Parameters ---------- t_0 : float Initial time. tau : float Tau parameter. amplitude : float Amplitude. """ def __init__(self, t_0: float, tau: float, amplitude: float = 1): """Initialize waveform.""" super().__init__() self.tau = tau self.t_0 = t_0 self.amp = amplitude def func(self): """Return a gaussian waveform function.""" def wrap(time: Union[float, np.ndarray]) -> Union[float, np.ndarray]: return self.amp * np.exp(-(((time - self.t_0) / self.tau)**2)) return wrap
[docs]class SineWaveform(Waveform): """ Model of a sine waveform. Represent a function ``A*sin(2*pi*freq*t-offset)`` This model should be attached to a source. Parameters ---------- frequency : float Frequency [Hz]. offset : float Phase offset. amplitude : float Amplitude. """ def __init__(self, frequency: float, offset: float = 0, amplitude: float = 1): """Initialize waveform.""" super().__init__() self.freq = frequency self.offset = offset self.amp = amplitude def func(self): """Return a gaussian waveform function.""" def wrap(time: Union[float, np.ndarray]) -> Union[float, np.ndarray]: """Wrap function.""" return self.amp * \ np.sin(2 * np.pi * self.freq * time - self.offset) return wrap
[docs]class StepWaveform(Waveform): """ Model of a step waveform. Represent a function ``A*step(t-t0)``. This model should be attached to a source. Parameters ---------- t_0 : float Initial time. amplitude : float Amplitude. """ def __init__(self, t_0: float = 0, amplitude: float = 1): """Initialize waveform.""" super().__init__() self.t_0 = t_0 self.amp = amplitude def func(self): """Return a step waveform function.""" def wrap(time: Union[float, np.ndarray]) -> Union[float, np.ndarray]: return self.amp * np.heaviside(time - self.t_0, 1) return wrap