[docs]defmult_fk_2D(fgrid:np.ndarray,boxsize:Union[float,list],k:np.ndarray,fk:np.ndarray)->np.ndarray:""" Multiply 2D grid in Fourier space by k dependent function. Parameters ---------- fgrid : 2darray 2D grid data. boxsize : float Size of the box the grid is defined on. k : array K values for k-dependent function f(k). fk : array Function values at k. """# Creating f(k) interpolatorxngrid=len(fgrid)yngrid=len(fgrid[0])ngrid=[xngrid,yngrid]fk_interpolator=interp1d(k,fk,kind="cubic")# Build K-gridkx2d,ky2d=kgrid.kgrid2D(boxsize,ngrid)kmag=np.sqrt(kx2d**2.0+ky2d**2.0)kmag=kmag.flatten()# Check interpolation rangeifkmag[1:].min()>k.min():interpcheck1=Trueelse:interpcheck1=Falseifkmag[1:].max()<k.max():interpcheck2=Trueelse:interpcheck2=Falseassert(interpcheck1andinterpcheck2),"ERROR! : Grid k goes beyond interpolation range"# Forward FFTfkgrid=fft.fft2D(fgrid,boxsize)fkgrid=fkgrid.flatten()# Multiply in k-spaceifk.min()!=0.0:fkgrid[1:]*=fk_interpolator(kmag[1:])else:fkgrid*=fk_interpolator(kmag)# Backward FFTfgrid=fft.ifft2D(fkgrid.reshape(xngrid,yngrid),boxsize).realreturnfgrid
[docs]defmult_fk_3D(fgrid:np.ndarray,boxsize:Union[float,list],k:np.ndarray,fk:np.ndarray)->np.ndarray:""" Multiply 3D grid in Fourier space by k dependent function. Parameters ---------- fgrid : ndarray 3D grid data. boxsize : float Size of the box the grid is defined on. k : array K values for k-dependent function f(k). fk : array Function values at k. """# Creating f(k) interpolatorxngrid=len(fgrid)yngrid=len(fgrid[0])zngrid=len(fgrid[0][0])ngrid=[xngrid,yngrid,zngrid]fk_interpolator=interp1d(k,fk,kind="cubic")# Build K-gridkx3d,ky3d,kz3d=kgrid.kgrid3D(boxsize,ngrid)kmag=np.sqrt(kx3d**2.0+ky3d**2.0+kz3d**2.0)kmag=kmag.flatten()# Check interpolation rangeifkmag[1:].min()>k.min():interpcheck1=Trueelse:interpcheck1=Falseifkmag[1:].max()<k.max():interpcheck2=Trueelse:interpcheck2=Falseassert(interpcheck1andinterpcheck2),"ERROR! : Grid k goes beyond interpolation range"# Forward FFTfkgrid=fft.fft3D(fgrid,boxsize)fkgrid=fkgrid.flatten()# Multiply in k-spaceifk.min()!=0.0:fkgrid[1:]*=fk_interpolator(kmag[1:])else:fkgrid*=fk_interpolator(kmag)# Backward FFTfgrid=fft.ifft3D(fkgrid.reshape(xngrid,yngrid,zngrid),boxsize).realreturnfgrid