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