diff --git a/bfps/fluid_base.py b/bfps/fluid_base.py index 999e7e372e3385f53a491384972e07e4f78ca5fb..8a8bc169846312fd31bce1f60dbea23bc8101a05 100644 --- a/bfps/fluid_base.py +++ b/bfps/fluid_base.py @@ -50,15 +50,15 @@ class fluid_particle_base(bfps.code): self.dtype = dtype elif dtype in ['single', 'double']: if dtype == 'single': - self.dtype = np.float32 + self.dtype = np.dtype(np.float32) elif dtype == 'double': - self.dtype = np.float64 + self.dtype = np.dtype(np.float64) self.rtype = self.dtype if self.rtype == np.float32: - self.ctype = np.complex64 + self.ctype = np.dtype(np.complex64) self.C_dtype = 'float' elif self.rtype == np.float64: - self.ctype = np.complex128 + self.ctype = np.dtype(np.complex128) self.C_dtype = 'double' self.parameters['dkx'] = 1.0 self.parameters['dky'] = 1.0 @@ -275,19 +275,19 @@ class fluid_particle_base(bfps.code): write_to_file = False): np.random.seed(rseed) Kdata00 = bfps.tools.generate_data_3D( - self.parameters['nz']/2, - self.parameters['ny']/2, - self.parameters['nx']/2, + self.parameters['nz']//2, + self.parameters['ny']//2, + self.parameters['nx']//2, p = spectra_slope).astype(self.ctype) Kdata01 = bfps.tools.generate_data_3D( - self.parameters['nz']/2, - self.parameters['ny']/2, - self.parameters['nx']/2, + self.parameters['nz']//2, + self.parameters['ny']//2, + self.parameters['nx']//2, p = spectra_slope).astype(self.ctype) Kdata02 = bfps.tools.generate_data_3D( - self.parameters['nz']/2, - self.parameters['ny']/2, - self.parameters['nx']/2, + self.parameters['nz']//2, + self.parameters['ny']//2, + self.parameters['nx']//2, p = spectra_slope).astype(self.ctype) Kdata0 = np.zeros( Kdata00.shape + (3,), @@ -376,6 +376,8 @@ class fluid_particle_base(bfps.code): kspace['kz'] = np.arange(-self.parameters['nz']//2 + 1, self.parameters['nz']//2 + 1).astype(np.float64)*self.parameters['dkz'] kspace['kz'] = np.roll(kspace['kz'], self.parameters['nz']//2+1) + kspace['ksample_indices'] = bfps.tools.get_kindices(n = self.parameters['nx']) + print kspace['ksample_indices'].shape[0] return kspace def write_par(self, iter0 = 0): assert (self.parameters['niter_todo'] % self.parameters['niter_stat'] == 0) @@ -390,6 +392,14 @@ class fluid_particle_base(bfps.code): for k in kspace.keys(): ofile['kspace/' + k] = kspace[k] nshells = kspace['nshell'].shape[0] + time_chunk = 2**20//(self.ctype.itemsize*3*kspace['ksample_indices'].shape[0]) + time_chunk = max(time_chunk, 1) + ofile.create_dataset('statistics/ksamples/velocity', + (1, kspace['ksample_indices'].shape[0], 3), + chunks = (time_chunk, kspace['ksample_indices'].shape[0], 3), + maxshape = (None, kspace['ksample_indices'].shape[0], 3), + dtype = self.ctype, + compression = 'gzip') for k in ['velocity', 'vorticity']: time_chunk = 2**20//(8*3*self.parameters['nx']) time_chunk = max(time_chunk, 1) diff --git a/bfps/tools.py b/bfps/tools.py index 9655fd1475e932b035d88e45e01265f46baf1ca2..54e5b6823d85e6c1326434a1eba31dfefc808fe8 100644 --- a/bfps/tools.py +++ b/bfps/tools.py @@ -24,6 +24,7 @@ +import math import numpy as np def generate_data_3D( @@ -49,7 +50,7 @@ def generate_data_3D( a[0, n0-kz, 0] = np.conj(a[0, kz, 0]) for ky in range(1, n1//2): for kz in range(1, n0): - a[n-ky, n-kz, 0] = np.conj(a[ky, kz, 0]) + a[n1-ky, n0-kz, 0] = np.conj(a[ky, kz, 0]) ii = np.where(k > min(n0, n1, n2)/3.) a[ii] = 0 return a @@ -73,6 +74,45 @@ def padd_with_zeros( b[n0-m0/2: , n1-m1/2: , :m2/2+1] = a[m0-m0/2: , m1-m1/2: , :m2/2+1] return b +def get_kindices( + n = 64): + nx = n + nz = n + kx = np.arange(0, nx//2+1, 1).astype(np.float) + kvals = [] + radii = set([]) + index = [] + for iz in range(kx.shape[0]): + for ix in range(0, kx.shape[0]): + kval = (kx[iz]**2+kx[ix]**2)**.5 + tmp = math.modf(kval) + if (tmp[0] == 0 and tmp[1] <= nx//2): + kvals.append([kx[iz], kx[ix]]) + radii.add(math.floor(kval)) + index.append([ix, iz]) + + kvals = np.array(kvals) + index = np.array(index) + new_kvals = [] + ordered_kvals = [] + radius_vals = [] + ii = [] + for r in radii: + ncircle = np.count_nonzero((kvals[:, 0]**2 + kvals[:, 1]**2)**.5 == r) + indices = np.where((kvals[:, 0]**2 + kvals[:, 1]**2)**.5 == r)[0] + if ncircle > 2: + ordered_kvals.append(kvals[indices]) + new_kvals += list(kvals[indices]) + radius_vals.append(r) + ii += list(index[indices]) + ii = np.array(ii) + good_indices = np.where(ii[:, 1] > 0)[0] + i1 = (kx.shape[0] - 1)*2 - ii[good_indices, 1] + i0 = ii[good_indices, 0] + i1 = np.concatenate((ii[:, 1], i1)), + i0 = np.concatenate((ii[:, 0], i0)), + return np.vstack((i0, i1)).T.copy() + try: import sympy as sp rational0 = sp.Rational(0)