diff --git a/bfps/tools.py b/bfps/tools.py
index 431ce48263b104493cf6c163216d9476a74a34ce..9655fd1475e932b035d88e45e01265f46baf1ca2 100644
--- a/bfps/tools.py
+++ b/bfps/tools.py
@@ -34,19 +34,23 @@ def generate_data_3D(
     generate something that has the proper shape
     """
     assert(n0 % 2 == 0 and n1 % 2 == 0 and n2 % 2 == 0)
-    a = np.zeros((n0, n1, n2/2+1), dtype = dtype)
+    a = np.zeros((n1, n0, n2/2+1), dtype = dtype)
     a[:] = np.random.randn(*a.shape) + 1j*np.random.randn(*a.shape)
-    k, j, i = np.mgrid[-n0/2+1:n0/2+1, -n1/2+1:n1/2+1, 0:n2/2+1]
+    k, j, i = np.mgrid[-n1/2+1:n1/2+1, -n0/2+1:n0/2+1, 0:n2/2+1]
     k = (k**2 + j**2 + i**2)**.5
-    k = np.roll(k, n0//2+1, axis = 0)
-    k = np.roll(k, n1//2+1, axis = 1)
+    k = np.roll(k, n1//2+1, axis = 0)
+    k = np.roll(k, n0//2+1, axis = 1)
+    k[0, 0, 0] = 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 > min(n0, n1, n2)/3)
+    a[0, 0, 0] = 0
+    for ky in range(1, n1//2):
+        a[n1-ky, 0, 0] = np.conj(a[ky, 0, 0])
+    for kz in range(1, n0//2):
+        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])
+    ii = np.where(k > min(n0, n1, n2)/3.)
     a[ii] = 0
     return a