From 2d3f070cc840334a03dda884121d9bdc54bb225b Mon Sep 17 00:00:00 2001
From: Reimar Leike <reimar@mpa-garching.mpg.de>
Date: Tue, 25 Sep 2018 12:13:59 +0200
Subject: [PATCH] changed LogRGSpace.get_k_length_array to something sensible.
 Slope operator and AMplitude model are now getting the structure of the space
 from the space

---
 nifty5/domains/log_rg_space.py     | 40 +++++++++++++++---------------
 nifty5/library/amplitude_model.py  |  7 +-----
 nifty5/operators/slope_operator.py |  8 +-----
 3 files changed, 22 insertions(+), 33 deletions(-)

diff --git a/nifty5/domains/log_rg_space.py b/nifty5/domains/log_rg_space.py
index 2d7f5d2db..bdcda4141 100644
--- a/nifty5/domains/log_rg_space.py
+++ b/nifty5/domains/log_rg_space.py
@@ -78,23 +78,23 @@ class LogRGSpace(StructuredDomain):
                           self._t_0, True)
 
     def get_k_length_array(self):
-        # FIXME This is simply wrong! Definitely not the final version.
-        ib = dobj.ibegin_from_shape(self._shape)
-        res = np.arange(self.local_shape[0], dtype=np.float64) + ib[0]
-        res = np.minimum(res, self.shape[0]-res)*self.bindistances[0]
-        if len(self.shape) == 1:
-            return Field.from_local_data(self, res)
-        res *= res
-        for i in range(1, len(self.shape)):
-            tmp = np.arange(self.local_shape[i], dtype=np.float64) + ib[i]
-            tmp = np.minimum(tmp, self.shape[i]-tmp)*self.bindistances[i]
-            tmp *= tmp
-            res = np.add.outer(res, tmp)
-        return Field.from_local_data(self, np.sqrt(res))
-
-    def get_expk_length_array(self):
-        # FIXME This is a hack! Only for plotting. Seems not to be the final version.
-        out = exp(self.get_k_length_array()).to_global_data_rw()
-        out[1:] = out[:-1]
-        out[0] = 0
-        return Field.from_global_data(self, out)
+        if not self.harmonic:
+            raise NotImplementedError
+        ks = self.get_k_array()
+        return Field.from_global_data(self, np.linalg.norm(ks, axis=0))
+
+    def get_k_array(self):
+        ndim = len(self.shape)
+        k_array = np.zeros((ndim,) + self.shape)
+        dist = self.bindistances
+        for i in range(ndim):
+            ks = np.zeros(self.shape[i])
+            ks[1:] = np.minimum(self.shape[i] - 1 - np.arange(self.shape[i]-1), np.arange(self.shape[i]-1)) * dist[i]
+            if self.harmonic:
+                ks[0] = np.nan
+            else:
+                ks[0] = -np.inf
+                ks[1:] += self.t_0[i]
+            k_array[i] += ks.reshape((1,)*i + (self.shape[i],) + (1,)*(ndim-i-1))
+        return k_array
+
diff --git a/nifty5/library/amplitude_model.py b/nifty5/library/amplitude_model.py
index 8d964b090..73eea3987 100644
--- a/nifty5/library/amplitude_model.py
+++ b/nifty5/library/amplitude_model.py
@@ -48,12 +48,7 @@ def create_cepstrum_amplitude_field(domain, cepstrum):
     dist = domain.bindistances
     shape = domain.shape
 
-    # Prepare q_array
-    q_array = np.zeros((dim,) + shape)
-    for i in range(dim):
-        ks = np.zeros(shape[i])
-        ks[1:] = np.minimum(shape[i] - 1 - np.arange(shape[i]-1), np.arange(shape[i]-1)) * dist[i]
-        q_array[i] += ks.reshape((1,)*i + (shape[i],) + (1,)*(dim-i-1))
+    q_array = domain.get_k_array()
 
     # Fill cepstrum field (all non-zero modes)
     no_zero_modes = (slice(1, None),) * dim
diff --git a/nifty5/operators/slope_operator.py b/nifty5/operators/slope_operator.py
index 570b932fe..d5cf6fabd 100644
--- a/nifty5/operators/slope_operator.py
+++ b/nifty5/operators/slope_operator.py
@@ -60,13 +60,7 @@ class SlopeOperator(LinearOperator):
             raise ValueError("Slope Operator only works for ndim == 1")
         
         # Prepare pos
-        self.pos = np.zeros((self.ndim,) + self.target[0].shape)
-        shape = self.target.shape
-        dist = self.target[0].bindistances
-        for i in range(self.ndim):
-            ks = np.zeros(shape[i])
-            ks[1:] = np.minimum(shape[i] - 1 - np.arange(shape[i]-1), np.arange(shape[i]-1)) * dist[i]
-            self.pos[i] += ks.reshape((1,)*i + (shape[i],) + (1,)*(self.ndim-i-1))
+        self.pos = self.target[0].get_k_array()-self.target[0].t_0[0]
         
         
 
-- 
GitLab