示例#1
0
def test_downsample():
    f = AntialiasFilter()

    sampling = (.1, .1)
    gpts = (228, 229)

    mask = f.get_mask(gpts, sampling, np)
    n = np.sum(mask > 0.)

    array = np.fft.ifft2(mask)

    waves = Waves(array, sampling=sampling, energy=80e3, antialias_aperture=(2 / 3.,) * 2)

    assert np.allclose(waves.downsample('valid', return_fourier_space=True).array.real, 1.)
示例#2
0
    def generate_transmission_functions(self,
                                        energy,
                                        first_slice=0,
                                        last_slice=None,
                                        max_batch=1):
        """
        Generate the transmission functions one slice at a time.

        Parameters
        ----------
        energy: float
            Electron energy [eV].
        first_slice: int
            First potential slice to generate.
        last_slice: int, optional
            Last potential slice generate.
        max_batch: int
            Maximum number of potential slices calculated in parallel.

        Returns
        -------
        generator of PotentialArray objects
        """
        antialias_filter = AntialiasFilter()

        for start, end, potential_slice in self.generate_slices(
                first_slice, last_slice, max_batch=max_batch):
            yield start, end, potential_slice.as_transmission_function(
                energy,
                in_place=True,
                max_batch=max_batch,
                antialias_filter=antialias_filter)
示例#3
0
    def as_transmission_function(self,
                                 energy: float,
                                 in_place: bool = True,
                                 max_batch: int = 1,
                                 antialias_filter: AntialiasFilter = None):
        """
        Calculate the transmission functions for a specific energy.

        Parameters
        ----------
        energy: float
            Electron energy [eV].

        Returns
        -------
        TransmissionFunction object
        """

        xp = get_array_module(self.array)
        complex_exponential = get_device_function(xp, 'complex_exponential')

        array = self._array
        if not in_place:
            array = array.copy()

        array = complex_exponential(energy2sigma(energy) * array)

        t = TransmissionFunction(
            array,
            slice_thicknesses=self._slice_thicknesses.copy(),
            extent=self.extent,
            energy=energy)

        if antialias_filter is None:
            antialias_filter = AntialiasFilter()

        for start, end, potential_slices in t.generate_slices(
                max_batch=max_batch):
            antialias_filter.bandlimit(potential_slices)

        return t