Skip to content

Commit a366351

Browse files
committed
Adding possibility to eliminate Nyquist frequency
1 parent 5a40b03 commit a366351

File tree

4 files changed

+43
-12
lines changed

4 files changed

+43
-12
lines changed

conf/conda/meta.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ source:
66
git_url: ../../
77

88
build:
9-
number: 24
9+
number: 25
1010

1111
requirements:
1212
build:

mpiFFT4py/line.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,16 +109,23 @@ def get_local_mesh(self):
109109
X[1] *= self.L[1]/self.N[1]
110110
return X
111111

112-
def get_local_wavenumbermesh(self, scaled=True):
112+
def get_local_wavenumbermesh(self, scaled=True, broadcast=False,
113+
eliminate_highest_freq=False):
113114
kx = fftfreq(self.N[0], 1./self.N[0])
114-
ky = fftfreq(self.N[1], 1./self.N[1])[:self.Nf]
115-
ky[-1] *= -1
115+
ky = rfftfreq(self.N[1], 1./self.N[1])
116+
if eliminate_highest_freq:
117+
for i, k in enumerate((kx, ky)):
118+
if self.N[i] % 2 == 0:
119+
k[self.N[i]//2] = 0
120+
116121
Ks = np.meshgrid(kx, ky[self.rank*self.Np[1]//2:(self.rank*self.Np[1]//2+self.Npf)], indexing='ij', sparse=True)
117122
if scaled is True:
118123
Lp = 2*np.pi/self.L
119124
Ks[0] *= Lp[0]
120125
Ks[1] *= Lp[1]
121-
K = [np.broadcast_to(k, self.complex_shape()) for k in Ks]
126+
K = Ks
127+
if broadcast is True:
128+
K = [np.broadcast_to(k, self.complex_shape()) for k in Ks]
122129
return K
123130

124131
def get_dealias_filter(self):

mpiFFT4py/pencil.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,20 +309,34 @@ def get_local_mesh(self):
309309
X = [np.broadcast_to(x, self.real_shape()) for x in X]
310310
return X
311311

312-
def get_local_wavenumbermesh(self, scaled=False):
312+
def get_local_wavenumbermesh(self, scaled=False, broadcast=False,
313+
eliminate_highest_freq=False):
313314
"""Returns (scaled) local decomposed wavenumbermesh
314315
315316
If scaled is True, then the wavenumbermesh is scaled with physical mesh
316317
size. This takes care of mapping the physical domain to a computational
317318
cube of size (2pi)**3
319+
320+
318321
"""
319-
kx, ky, kz = self.complex_local_wavenumbers()
322+
s = self.complex_local_slice()
323+
kx = fftfreq(self.N[0], 1./self.N[0]).astype(int)
324+
ky = fftfreq(self.N[1], 1./self.N[1]).astype(int)
325+
kz = rfftfreq(self.N[2], 1./self.N[2]).astype(int)
326+
if eliminate_highest_freq:
327+
for i, k in enumerate((kx, ky, kz)):
328+
if self.N[i] % 2 == 0:
329+
k[self.N[i]//2] = 0
330+
kx = kx[s[0]]
331+
kz = kz[s[2]]
320332
Ks = np.meshgrid(kx, ky, kz, indexing='ij', sparse=True)
321333
if scaled is True:
322334
Lp = 2*np.pi/self.L
323335
for i in range(3):
324336
Ks[i] = (Ks[i]*Lp[i]).astype(self.float)
325-
K = [np.broadcast_to(k, self.complex_shape()) for k in Ks]
337+
K = Ks
338+
if broadcast is True:
339+
K = [np.broadcast_to(k, self.complex_shape()) for k in Ks]
326340
return K
327341

328342
def get_dealias_filter(self):

mpiFFT4py/slab.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,21 +159,31 @@ def get_local_mesh(self):
159159
X = [np.broadcast_to(x, self.real_shape()) for x in X]
160160
return X
161161

162-
def get_local_wavenumbermesh(self, scaled=False):
162+
def get_local_wavenumbermesh(self, scaled=False, broadcast=False, eliminate_highest_freq=False):
163163
"""Returns (scaled) local decomposed wavenumbermesh
164164
165165
If scaled is True, then the wavenumbermesh is scaled with physical mesh
166166
size. This takes care of mapping the physical domain to a computational
167-
cube of size (2pi)**3
167+
cube of size (2pi)**3.
168+
169+
If eliminate_highest_freq is True, then the Nyquist frequency is set to zero.
168170
"""
169171
kx, ky, kz = self.complex_local_wavenumbers()
172+
if eliminate_highest_freq:
173+
ky = fftfreq(self.N[1], 1./self.N[1])
174+
for i, k in enumerate((kx, ky, kz)):
175+
if self.N[i] % 2 == 0:
176+
k[self.N[i]//2] = 0
177+
ky = ky[self.complex_local_slice()[1]]
178+
170179
Ks = np.meshgrid(kx, ky, kz, indexing='ij', sparse=True)
171180
if scaled:
172181
Lp = 2*np.pi/self.L
173182
for i in range(3):
174183
Ks[i] *= Lp[i]
175-
K = [np.broadcast_to(k, self.complex_shape()) for k in Ks]
176-
#K = np.array(np.meshgrid(kx, ky, kz, indexing='ij')).astype(self.float)
184+
K = Ks
185+
if broadcast is True:
186+
K = [np.broadcast_to(k, self.complex_shape()) for k in Ks]
177187
return K
178188

179189
def get_dealias_filter(self):

0 commit comments

Comments
 (0)