initial scalar generator commit
This commit is contained in:
commit
8839533900
1 changed files with 137 additions and 0 deletions
137
gen_scalar_field.py
Normal file
137
gen_scalar_field.py
Normal file
|
|
@ -0,0 +1,137 @@
|
||||||
|
# coding: utf-8
|
||||||
|
class TopHat :
|
||||||
|
def __init__ (self, ks ,k0) :
|
||||||
|
self.ks = ks
|
||||||
|
self.k0 = k0
|
||||||
|
|
||||||
|
def __call__ (self, k) :
|
||||||
|
import numpy as np
|
||||||
|
f = np.ones (k.shape)
|
||||||
|
f[k < self.ks - self.k0/2] = 0
|
||||||
|
f[k > self.ks + self.k0/2] = 0
|
||||||
|
return f
|
||||||
|
|
||||||
|
class CutOff :
|
||||||
|
def __init__ (self, kc) :
|
||||||
|
self.kc = kc
|
||||||
|
|
||||||
|
def __call__ (self, k) :
|
||||||
|
import numpy as np
|
||||||
|
f = np.ones (k.shape)
|
||||||
|
f[k > self.kc] = self.kc**2 / k[k > self.kc]**2
|
||||||
|
return f
|
||||||
|
|
||||||
|
class RandomScalarField2D:
|
||||||
|
def __init__ (self, nx, lx, ny, ly, scalar_max, scalar_min, ksk0, kcks) :
|
||||||
|
import numpy as np
|
||||||
|
dx = lx / nx
|
||||||
|
dy = ly / ny
|
||||||
|
self.X, self.Y = np.meshgrid(np.arange(0,nx*dx,dx), np.arange(0,ny*dy,dy))
|
||||||
|
self.KX, self.KY = np.meshgrid(2*np.pi*np.fft.fftfreq(nx, dx), 2*np.pi*np.fft.fftfreq(ny, dy))
|
||||||
|
print (np.arange(0,nx*dx,dx), np.arange(0,ny*dy,dy))
|
||||||
|
print (2*np.pi*np.fft.fftfreq(nx, dx), 2*np.pi*np.fft.fftfreq(ny, dy))
|
||||||
|
self.k = np.sqrt(self.KX**2 + self.KY**2) + 1e-15
|
||||||
|
self.smax = scalar_max
|
||||||
|
self.smin = scalar_min
|
||||||
|
|
||||||
|
self.Nmax = max(nx, ny)
|
||||||
|
# self.k0 = self.k.max() / self.Nmax
|
||||||
|
self.k0 = 2 * np.pi / lx
|
||||||
|
print self.k0
|
||||||
|
# self.k0 = min (np.fft.fftfreq(nx, dx)[1], np.fft.fftfreq(ny, dy)[1])
|
||||||
|
# print self.k0
|
||||||
|
self.ks = ksk0 * self.k0
|
||||||
|
self.kc = kcks * self.ks
|
||||||
|
|
||||||
|
print self.ks, self.kc
|
||||||
|
print self.k
|
||||||
|
|
||||||
|
self.f = TopHat(self.ks, self.k0)
|
||||||
|
self.F = CutOff(self.kc)
|
||||||
|
|
||||||
|
self.Phi = np.sqrt(self.f(self.k)/(4*np.pi*self.k**2)) * np.exp(2*np.pi*(1j)*np.random.uniform(0, 1, self.k.shape))
|
||||||
|
|
||||||
|
print np.count_nonzero(self.Phi)
|
||||||
|
print np.nonzero(self.Phi)
|
||||||
|
print self.Phi[np.nonzero(self.Phi)]
|
||||||
|
|
||||||
|
self.iPhi = np.fft.ifft2 (self.Phi)
|
||||||
|
print self.iPhi
|
||||||
|
print np.angle(self.iPhi)
|
||||||
|
print np.angle(self.iPhi).min()
|
||||||
|
print np.angle(self.iPhi).max()
|
||||||
|
self.phi = np.zeros(self.iPhi.shape)
|
||||||
|
self.phi[np.angle(self.iPhi) >= 0 ] = self.smax
|
||||||
|
self.phi[np.angle(self.iPhi) < 0 ] = self.smin
|
||||||
|
|
||||||
|
self.Phi_ = self.F(self.k) * np.fft.fft2(self.phi)
|
||||||
|
self.phi_ = np.fft.ifft2(self.Phi_)
|
||||||
|
|
||||||
|
def energy_spectrum (self) :
|
||||||
|
import numpy as np
|
||||||
|
E = np.zeros (self.Nmax + 1)
|
||||||
|
for i in np.arange(self.Nmax + 1):
|
||||||
|
k = self.k[np.logical_and(
|
||||||
|
self.k >= (i-0.5)*self.k0 , self.k < (i+0.5)*self.k0 )]
|
||||||
|
Phi_n = self.f(k)/(4*np.pi*k**2)
|
||||||
|
E[i] = Phi_n.sum()
|
||||||
|
E /= E.sum()
|
||||||
|
E += 10e-8
|
||||||
|
|
||||||
|
E_ = np.zeros (self.Nmax + 1)
|
||||||
|
Phi_ = np.fft.fft2(self.phi)
|
||||||
|
for i in np.arange(self.Nmax + 1):
|
||||||
|
Phi_n = Phi_[np.logical_and(
|
||||||
|
self.k >= (i-0.5)*self.k0 , self.k < (i+0.5)*self.k0 )]
|
||||||
|
E_[i] = (np.abs(Phi_n)**2).sum()
|
||||||
|
E_ /= E_.sum()
|
||||||
|
E_ += 10e-8
|
||||||
|
|
||||||
|
E__ = np.zeros (self.Nmax + 1)
|
||||||
|
for i in np.arange(self.Nmax + 1):
|
||||||
|
Phi_n = self.Phi_[np.logical_and(
|
||||||
|
self.k >= (i-0.5)*self.k0 , self.k < (i+0.5)*self.k0 )]
|
||||||
|
E__[i] = (np.abs(Phi_n)**2).sum()
|
||||||
|
E__ /= E__.sum()
|
||||||
|
E__ += 10e-8
|
||||||
|
|
||||||
|
return E, E_, E__
|
||||||
|
|
||||||
|
|
||||||
|
class RandomScalarField3D:
|
||||||
|
def __init__ (self, nx, dx, scalar_max, scalar_min, ksk0, kcks) :
|
||||||
|
import numpy as np
|
||||||
|
self.X, self.Y, self.Z = np.meshgrid(np.arange(0,nx*dx,dx), np.arange(0,nx*dx,dx), np.arange(0,nx*dx,dx))
|
||||||
|
self.KX, self.KY, self.KZ = np.meshgrid(np.fft.fftfreq(nx, dx), np.fft.fftfreq(nx, dx), np.fft.fftfreq(nx, dx))
|
||||||
|
|
||||||
|
print (np.arange(0,nx*dx,dx))
|
||||||
|
|
||||||
|
print (np.fft.fftfreq(nx, dx))
|
||||||
|
|
||||||
|
self.k = np.sqrt(self.KX**2 + self.KY**2 + self.KZ**2) + 1e-15
|
||||||
|
|
||||||
|
self.smax = scalar_max
|
||||||
|
|
||||||
|
self.smin = scalar_min
|
||||||
|
|
||||||
|
self.Nmax = nx
|
||||||
|
|
||||||
|
self.k0 = self.k.max() / self.Nmax
|
||||||
|
self.ks = ksk0 * self.k0
|
||||||
|
self.kc = kcks * self.ks
|
||||||
|
|
||||||
|
self.f = TopHat(self.ks, self.k0)
|
||||||
|
self.F = CutOff(self.kc)
|
||||||
|
|
||||||
|
self.Phi = np.sqrt(self.f(self.k)/(4*np.pi*self.k**2)) * np.exp(2*np.pi*(1j)*np.random.uniform(0, 1, self.k.shape))
|
||||||
|
|
||||||
|
self.iPhi = np.fft.ifftn (self.Phi)
|
||||||
|
self.phi = np.zeros(self.iPhi.shape)
|
||||||
|
self.phi[self.iPhi >= 0 ] = self.smax
|
||||||
|
self.phi[self.iPhi < 0 ] = self.smin
|
||||||
|
|
||||||
|
self.Phi_ = self.F(self.k) * np.fft.fftn(self.phi)
|
||||||
|
self.phi_ = np.fft.ifftn(self.Phi_)
|
||||||
|
'''
|
||||||
|
'''
|
||||||
|
|
||||||
Loading…
Add table
Reference in a new issue