diff --git a/bfps/test.py b/bfps/test.py index 5d893e2868d03aa6576e73fbb8120a24ee4178bc..42809f958d35628950c4d07e13a66f99fe8a8299 100644 --- a/bfps/test.py +++ b/bfps/test.py @@ -160,10 +160,10 @@ class convergence_test(bfps.code): def execute( self, rseed = 7547, + spectra_slope = 1., ncpu = 2, tracer_rseed = 3281, tracer_state = None): - assert(self.parameters['nx'] == self.parameters['ny'] == self.parameters['nz']) if (type(tracer_state) == type(None)): np.random.seed(tracer_rseed) tracer_state = np.random.random(self.parameters['nparticles']*3)*2*np.pi @@ -172,16 +172,32 @@ class convergence_test(bfps.code): tracer_state.tofile('test1_tracers_state_i00000') tracer_state.tofile('test2_tracers_state_i00000') np.random.seed(rseed) - Kdata00 = bfps.tools.generate_data_3D(self.parameters['nx']/2, p = 1.).astype(np.complex64) - Kdata01 = bfps.tools.generate_data_3D(self.parameters['nx']/2, p = 1.).astype(np.complex64) - Kdata02 = bfps.tools.generate_data_3D(self.parameters['nx']/2, p = 1.).astype(np.complex64) + Kdata00 = bfps.tools.generate_data_3D( + self.parameters['nz']/2, + self.parameters['ny']/2, + self.parameters['nx']/2, + p = spectra_slope).astype(np.complex64) + Kdata01 = bfps.tools.generate_data_3D( + self.parameters['nz']/2, + self.parameters['ny']/2, + self.parameters['nx']/2, + p = spectra_slope).astype(np.complex64) + Kdata02 = bfps.tools.generate_data_3D( + self.parameters['nz']/2, + self.parameters['ny']/2, + self.parameters['nx']/2, + p = spectra_slope).astype(np.complex64) Kdata0 = np.zeros( Kdata00.shape + (3,), Kdata00.dtype) Kdata0[..., 0] = Kdata00 Kdata0[..., 1] = Kdata01 Kdata0[..., 2] = Kdata02 - Kdata1 = bfps.tools.padd_with_zeros(Kdata0, self.parameters['nx']) + Kdata1 = bfps.tools.padd_with_zeros( + Kdata0, + self.parameters['nz'], + self.parameters['ny'], + self.parameters['nx']) Kdata1.tofile("test1_cvorticity_i00000") self.write_src() self.write_par(simname = 'test1') @@ -199,7 +215,11 @@ class convergence_test(bfps.code): self.parameters['ny'] *= 2 self.parameters['nz'] *= 2 self.write_par(simname = 'test2') - Kdata2 = bfps.tools.padd_with_zeros(Kdata0, self.parameters['nx']) + Kdata2 = bfps.tools.padd_with_zeros( + Kdata0, + self.parameters['nz'], + self.parameters['ny'], + self.parameters['nx']) Kdata2.tofile("test2_cvorticity_i00000") self.run(ncpu = ncpu, simname = 'test2') self.parameters['dt'] *= 2 diff --git a/bfps/tools.py b/bfps/tools.py index 1f22dac46c13ef6edd9aec6553ece3ad1c222a5f..0031ec30960671a0676bca220155f99e9ccbd59c 100644 --- a/bfps/tools.py +++ b/bfps/tools.py @@ -23,42 +23,46 @@ import numpy as np def generate_data_3D( - n, + n0, n1, n2, dtype = np.complex128, p = 1.5): """ generate something that has the proper shape """ - assert(n % 2 == 0) - a = np.zeros((n, n, n/2+1), dtype = dtype) + assert(n0 % 2 == 0 and n1 % 2 == 0 and n2 % 2 == 0) + a = np.zeros((n0, n1, n2/2+1), dtype = dtype) a[:] = np.random.randn(*a.shape) + 1j*np.random.randn(*a.shape) - k, j, i = np.mgrid[-n/2+1:n/2+1, -n/2+1:n/2+1, 0:n/2+1] + k, j, i = np.mgrid[-n0/2+1:n0/2+1, -n1/2+1:n1/2+1, 0:n2/2+1] k = (k**2 + j**2 + i**2)**.5 - k = np.roll(k, n//2+1, axis = 0) - k = np.roll(k, n//2+1, axis = 1) + k = np.roll(k, n0//2+1, axis = 0) + k = np.roll(k, n1//2+1, axis = 1) a /= k**p a[0, :, :] = 0 a[:, 0, :] = 0 a[:, :, 0] = 0 ii = np.where(k == 0) a[ii] = 0 - ii = np.where(k > n/3) + ii = np.where(k > min(n0, n1, n2)/3) a[ii] = 0 return a def padd_with_zeros( a, - n, + n0, n1, n2, odtype = None): if (type(odtype) == type(None)): odtype = a.dtype - assert(a.shape[0] <= n) - b = np.zeros((n, n, n/2 + 1) + a.shape[3:], dtype = odtype) - m = a.shape[0] - b[ :m/2, :m/2, :m/2+1] = a[ :m/2, :m/2, :m/2+1] - b[ :m/2, n-m/2: , :m/2+1] = a[ :m/2, m-m/2: , :m/2+1] - b[n-m/2: , :m/2, :m/2+1] = a[m-m/2: , :m/2, :m/2+1] - b[n-m/2: , n-m/2: , :m/2+1] = a[m-m/2: , m-m/2: , :m/2+1] + assert(a.shape[0] <= n0 and + a.shape[1] <= n1 and + a.shape[2] <= n2) + b = np.zeros((n0, n1, n2/2 + 1) + a.shape[3:], dtype = odtype) + m0 = a.shape[0] + m1 = a.shape[1] + m2 = a.shape[2] + b[ :m0/2, :m1/2, :m2/2+1] = a[ :m0/2, :m1/2, :m2/2+1] + b[ :m0/2, n1-m1/2: , :m2/2+1] = a[ :m0/2, m1-m1/2: , :m2/2+1] + b[n0-m0/2: , :m1/2, :m2/2+1] = a[m0-m0/2: , :m1/2, :m2/2+1] + b[n0-m0/2: , n1-m1/2: , :m2/2+1] = a[m0-m0/2: , m1-m1/2: , :m2/2+1] return b diff --git a/src/field_descriptor.cpp b/src/field_descriptor.cpp index 5bfdfc3caa786b64d9ea6d89d3cbfc57d973c948..23e681a37ab43b21de856b844cfb1c18be7a600b 100644 --- a/src/field_descriptor.cpp +++ b/src/field_descriptor.cpp @@ -152,11 +152,19 @@ field_descriptor<rnumber>::field_descriptor( DEBUG_MSG_WAIT( this->comm, "inside field_descriptor constructor, about to call " - "MPI_Type_create_subarray\n" + "MPI_Type_create_subarray " "%d %d %d\n", this->sizes[0], this->subsizes[0], this->starts[0]); + for (int i=0; i<this->ndims; i++) + DEBUG_MSG_WAIT( + this->comm, + "tsizes " + "%d %d %d\n", + tsizes[i], + tsubsizes[i], + tstarts[i]); if (this->subsizes[0] > 0) { DEBUG_MSG("creating subarray\n"); @@ -184,6 +192,7 @@ field_descriptor<rnumber>::field_descriptor( MPI_SUM, this->comm); delete[] local_rank; + DEBUG_MSG("exiting field_descriptor constructor\n"); } template <class rnumber> diff --git a/src/tracers.cpp b/src/tracers.cpp index 00b47ac9168190a1459e3a731220d21a9fa0c4ea..03d83c0380821349f068d67fe4523dfd0b28cbda 100644 --- a/src/tracers.cpp +++ b/src/tracers.cpp @@ -131,7 +131,7 @@ TRACERS_DEFINITIONS( float, fftwf_complex, MPI_FLOAT, - MPI_C_FLOAT_COMPLEX) + MPI_COMPLEX) /*****************************************************************************/ diff --git a/test.py b/test.py index 1e8791ce6710dc7be2fca37d17d8cf12d3867b12..d66e370eba8fc1f7ce5ffa2810fdb7c205e9551c 100755 --- a/test.py +++ b/test.py @@ -40,8 +40,8 @@ def main(opt): subprocess.call(['make', 'clean']) return None c = convergence_test() - c.parameters['nx'] = opt.n - c.parameters['ny'] = opt.n + c.parameters['nx'] = opt.n*4 + c.parameters['ny'] = opt.n*2 c.parameters['nz'] = opt.n c.parameters['nu'] = 1e-1 c.parameters['dt'] = 2e-3