Example #1
0
    def wdm_linearity(self, domain):
        # Calculate dispersive terms:
        if self.beta is None:
            self.factor = (0.0, 0.0)
        else:
            if self.centre_omega is None:
                self.Domega = (domain.omega - domain.centre_omega,
                               domain.omega - domain.centre_omega)
            else:
                self.Domega = (domain.omega - self.centre_omega[0],
                               domain.omega - self.centre_omega[1])

            terms = [0.0, 0.0]
            for n, beta in enumerate(self.beta[0]):
                terms[0] += beta * np.power(self.Domega[0], n) / factorial(n)
            for n, beta in enumerate(self.beta[1]):
                terms[1] += beta * np.power(self.Domega[1], n) / factorial(n)
            self.factor = (1j * fftshift(terms[0]), 1j * fftshift(terms[1]))

        # Include attenuation terms if available:
        if self.alpha is None:
            return self.factor
        else:
            self.factor[0] -= 0.5 * self.alpha[0]
            self.factor[1] -= 0.5 * self.alpha[1]
            return self.factor
Example #2
0
    def wdm_linearity(self, domain):
        # Calculate dispersive terms:
        if self.beta is None:
            self.factor = (0.0, 0.0)
        else:
            if self.centre_omega is None:
                self.Domega = (domain.omega - domain.centre_omega,
                               domain.omega - domain.centre_omega)
            else:
                self.Domega = (domain.omega - self.centre_omega[0],
                               domain.omega - self.centre_omega[1])

            terms = [0.0, 0.0]
            for n, beta in enumerate(self.beta[0]):
                terms[0] += beta * np.power(self.Domega[0], n) / factorial(n)
            for n, beta in enumerate(self.beta[1]):
                terms[1] += beta * np.power(self.Domega[1], n) / factorial(n)
            self.factor = (1j * fftshift(terms[0]), 1j * fftshift(terms[1]))

        # Include attenuation terms if available:
        if self.alpha is None:
            return self.factor
        else:
            self.factor[0] -= 0.5 * self.alpha[0]
            self.factor[1] -= 0.5 * self.alpha[1]
            return factor
Example #3
0
    def __call__(self, domain, field):

        if self.ind is None:
            self.ind = max(np.where(domain.nu < self.cutoff_nu)[0])

            if self.field_pump is not None:
                self.field_pump = ifftshift(fft(self.field_pump))
                if self.dir_to_up is True:
                    self.field_pump[self.ind:] = 0.0
                else:
                    self.field_pump[:self.ind] = 0.0
            else:
                self.field_pump = np.zeros(field.size, dtype=field.dtype)

        if not (len(self.field_pump) == len(field)):
            raise DiffArraysError(
                "arrays of fields is different lengths")

        self.field = ifftshift(fft(field))

        if self.dir_to_up is True:
            self.field[:self.ind] = 0.0
        else:
            self.field[self.ind:] = 0.0

        return ifft(fftshift(self.field + self.field_pump))
Example #4
0
    def __call__(self, domain):
        self.centre_omega = domain.centre_omega
        self.omega = fftshift(domain.omega - domain.centre_omega)

        if self.self_steepening:
            self.ss_factor = 1.0 / self.centre_omega
        else:
            self.ss_factor = 0.0

        if self.use_all:
            # Require h_R in spectral domain, so take FFT of returned value:
            self.h_R = fft(calculate_raman_term(domain, self.tau_1,
                                                self.tau_2))
        else:
            self.h_R = 0.0

        self.generate_nonlinearity()
Example #5
0
    def __call__(self, domain):
        self.centre_omega = domain.centre_omega
        self.omega = fftshift(domain.omega - domain.centre_omega)

        if self.self_steepening:
            self.ss_factor = 1.0 / self.centre_omega
        else:
            self.ss_factor = 0.0

        if self.use_all:
            # Require h_R in spectral domain, so take FFT of returned value:
            self.h_R = fft(calculate_raman_term(
                domain, self.tau_1, self.tau_2))
        else:
            self.h_R = 0.0

        self.generate_nonlinearity()
Example #6
0
    def default_linearity(self, domain):
        # Calculate dispersive terms:
        if self.beta is None:
            self.factor = 0.0
        else:
            if self.centre_omega is None:
                self.Domega = domain.omega - domain.centre_omega
            else:
                self.Domega = domain.omega - self.centre_omega

            # Allow general dispersion:
            terms = 0.0
            for n, beta in enumerate(self.beta):
                terms += beta * np.power(self.Domega, n) / factorial(n)
            self.factor = 1j * fftshift(terms)

        # Include attenuation term if available:
        if self.alpha is None:
            return self.factor
        else:
            self.factor -= 0.5 * self.alpha
            return self.factor
Example #7
0
    def default_linearity(self, domain):
        # Calculate dispersive terms:
        if self.beta is None:
            self.factor = 0.0
        else:
            if self.centre_omega is None:
                self.Domega = domain.omega - domain.centre_omega
            else:
                self.Domega = domain.omega - self.centre_omega

            # Allow general dispersion:
            terms = 0.0
            for n, beta in enumerate(self.beta):
                terms += beta * np.power(self.Domega, n) / factorial(n)
            self.factor = 1j * fftshift(terms)

        # Include attenuation term if available:
        if self.alpha is None:
            return self.factor
        else:
            self.factor -= 0.5 * self.alpha
            return self.factor
Example #8
0
    def __call__(self, domain, field):

        self.Domega = domain.omega - domain.centre_omega
        self.factor = 1j * fftshift(self.time * self.Domega)

        return ifft(np.exp(self.factor) * fft(field))