Source code for PackLab.analytical.grid

"""Utilities for constructing reciprocal-space grids."""

from typing import Any

import numpy as np

from PackLab.units import ureg


[docs] def make_wavenumber_grid( radial_resolution: Any, maximum_distance: Any, samples_per_oscillation: int = 12, ) -> Any: """Create a reciprocal-space grid for the radial inverse transform. Parameters ---------- radial_resolution : pint.Quantity Smallest real-space feature to resolve. It determines the maximum wavenumber through ``pi / radial_resolution``. maximum_distance : pint.Quantity Largest real-space distance at which the correlation function will be evaluated. It determines the wavenumber spacing. samples_per_oscillation : int, default=12 Samples used for one period of the sinc kernel at ``maximum_distance``. Values below 8 are not recommended. Returns ------- pint.Quantity A uniformly spaced, zero-inclusive wavenumber grid with units of inverse length. """ if samples_per_oscillation < 2: raise ValueError("samples_per_oscillation must be at least 2.") resolution_m = radial_resolution.to("meter") maximum_distance_m = maximum_distance.to("meter") if resolution_m.magnitude <= 0: raise ValueError("radial_resolution must be positive.") if maximum_distance_m.magnitude <= 0: raise ValueError("maximum_distance must be positive.") maximum_wavenumber = np.pi / resolution_m wavenumber_step = 2 * np.pi / (samples_per_oscillation * maximum_distance_m) number_of_points = int( np.ceil((maximum_wavenumber / wavenumber_step).to_base_units().magnitude) ) + 1 return np.linspace( 0.0, maximum_wavenumber.to("1 / meter").magnitude, number_of_points, ) / ureg.meter