Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ift
NIFTy
Commits
d2675589
Commit
d2675589
authored
Jan 16, 2019
by
Martin Reinecke
Browse files
make FFTW optional
parent
0aa213dd
Changes
4
Hide whitespace changes
Inline
Side-by-side
Dockerfile
View file @
d2675589
...
...
@@ -12,8 +12,6 @@ RUN apt-get update && apt-get install -y \
python3-coverage python3-pytest python3-pytest-cov \
# Optional NIFTy dependencies
openmpi-bin libopenmpi-dev python3-mpi4py \
# Packages needed for NIFTy
&& pip3 install pyfftw \
# Optional NIFTy dependencies
&& pip3 install git+https://gitlab.mpcdf.mpg.de/ift/pyHealpix.git \
# Testing dependencies
...
...
README.md
View file @
d2675589
...
...
@@ -39,11 +39,11 @@ Installation
-
[
Python 3
](
https://www.python.org/
)
(
3.5.x
or later)
-
[
SciPy
](
https://www.scipy.org/
)
-
[
pyFFTW
](
https://pypi.python.org/pypi/pyFFTW
)
Optional dependencies:
-
[
pyHealpix
](
https://gitlab.mpcdf.mpg.de/ift/pyHealpix
)
(
for
harmonic
transforms involving domains on the sphere)
-
[
pyFFTW
](
https://pypi.python.org/pypi/pyFFTW
)
-
[
mpi4py
](
https://mpi4py.scipy.org
)
(
for
MPI-parallel execution)
-
[
matplotlib
](
https://matplotlib.org/
)
(
for
field plotting)
...
...
@@ -61,7 +61,7 @@ distributions, the "apt" lines will need slight changes.
NIFTy5 and its mandatory dependencies can be installed via:
sudo apt-get install git
libfftw3-dev
python3 python3-pip python3-dev
sudo apt-get install git python3 python3-pip python3-dev
pip3 install --user git+https://gitlab.mpcdf.mpg.de/ift/NIFTy.git@NIFTy_5
(Note: If you encounter problems related to
`pyFFTW`
, make sure that you are
...
...
@@ -73,6 +73,22 @@ Plotting support is added via:
pip3 install --user matplotlib
FFTW support is added via:
sudo apt-get install libfftw3-dev
pip3 install --user pyfftw
To actually use FFTW in your Nifty calculations, you need to call
`nifty5.fft.enable_fftw()`
at the beginning of your code.
(Note: If you encounter problems related to
`pyFFTW`
, make sure that you are
using a pip-installed
`pyFFTW`
package. Unfortunately, some distributions are
shipping an incorrectly configured
`pyFFTW`
package, which does not cooperate
with the installed
`FFTW3`
libraries.)
Support for spherical harmonic transforms is added via:
pip3 install --user git+https://gitlab.mpcdf.mpg.de/ift/pyHealpix.git
...
...
@@ -86,7 +102,7 @@ MPI support is added via:
To run the tests, additional packages are required:
sudo apt-get install python3-coverage
python3-parameterized
python3-pytest python3-pytest-cov
sudo apt-get install python3-coverage python3-pytest python3-pytest-cov
Afterwards the tests (including a coverage report) can be run using the
following command in the repository root:
...
...
nifty5/fft.py
View file @
d2675589
...
...
@@ -19,23 +19,57 @@ from .utilities import iscomplextype
import
numpy
as
np
_use_fftw
=
True
if
_use_fftw
:
import
pyfftw
from
pyfftw.interfaces.numpy_fft
import
fftn
,
rfftn
,
ifftn
pyfftw
.
interfaces
.
cache
.
enable
()
pyfftw
.
interfaces
.
cache
.
set_keepalive_time
(
1000.
)
# Optional extra arguments for the FFT calls
# if exact reproducibility is needed,
# set "planner_effort" to "FFTW_ESTIMATE"
import
os
nthreads
=
int
(
os
.
getenv
(
"OMP_NUM_THREADS"
,
"1"
))
_fft_extra_args
=
dict
(
planner_effort
=
'FFTW_ESTIMATE'
,
threads
=
nthreads
)
else
:
from
numpy.fft
import
fftn
,
rfftn
,
ifftn
_fft_extra_args
=
{}
_use_fftw
=
False
_fftw_prepped
=
False
_fft_extra_args
=
{}
def
enable_fftw
():
_use_fftw
=
True
def
_init_pyfftw
():
global
_fft_extra_args
,
_fftw_prepped
if
not
_fftw_prepped
:
import
pyfftw
from
pyfftw.interfaces.numpy_fft
import
fftn
,
rfftn
,
ifftn
pyfftw
.
interfaces
.
cache
.
enable
()
pyfftw
.
interfaces
.
cache
.
set_keepalive_time
(
1000.
)
# Optional extra arguments for the FFT calls
# if exact reproducibility is needed,
# set "planner_effort" to "FFTW_ESTIMATE"
import
os
nthreads
=
int
(
os
.
getenv
(
"OMP_NUM_THREADS"
,
"1"
))
_fft_extra_args
=
dict
(
planner_effort
=
'FFTW_ESTIMATE'
,
threads
=
nthreads
)
_fftw_prepped
=
True
def
fftn
(
a
,
axes
=
None
):
if
_use_fftw
:
from
pyfftw.interfaces.numpy_fft
import
fftn
_init_pyfftw
()
return
fftn
(
a
,
axes
=
axes
,
**
_fft_extra_args
)
else
:
return
np
.
fft
.
fftn
(
a
,
axes
=
axes
)
def
rfftn
(
a
,
axes
=
None
):
if
_use_fftw
:
from
pyfftw.interfaces.numpy_fft
import
rfftn
_init_pyfftw
()
return
rfftn
(
a
,
axes
=
axes
,
**
_fft_extra_args
)
else
:
return
np
.
fft
.
rfftn
(
a
,
axes
=
axes
)
def
ifftn
(
a
,
axes
=
None
):
if
_use_fftw
:
from
pyfftw.interfaces.numpy_fft
import
ifftn
_init_pyfftw
()
return
ifftn
(
a
,
axes
=
axes
,
**
_fft_extra_args
)
else
:
return
np
.
fft
.
ifftn
(
a
,
axes
=
axes
)
def
hartley
(
a
,
axes
=
None
):
...
...
@@ -46,7 +80,7 @@ def hartley(a, axes=None):
if
iscomplextype
(
a
.
dtype
):
raise
TypeError
(
"Hartley transform requires real-valued arrays."
)
tmp
=
rfftn
(
a
,
axes
=
axes
,
**
_fft_extra_args
)
tmp
=
rfftn
(
a
,
axes
=
axes
)
def
_fill_array
(
tmp
,
res
,
axes
):
if
axes
is
None
:
...
...
@@ -89,7 +123,7 @@ def my_fftn_r2c(a, axes=None):
if
iscomplextype
(
a
.
dtype
):
raise
TypeError
(
"Transform requires real-valued input arrays."
)
tmp
=
rfftn
(
a
,
axes
=
axes
,
**
_fft_extra_args
)
tmp
=
rfftn
(
a
,
axes
=
axes
)
def
_fill_complex_array
(
tmp
,
res
,
axes
):
if
axes
is
None
:
...
...
@@ -123,4 +157,4 @@ def my_fftn_r2c(a, axes=None):
def
my_fftn
(
a
,
axes
=
None
):
return
fftn
(
a
,
axes
=
axes
,
**
_fft_extra_args
)
return
fftn
(
a
,
axes
=
axes
)
setup.py
View file @
d2675589
...
...
@@ -39,8 +39,8 @@ setup(name="nifty5",
packages
=
find_packages
(
include
=
[
"nifty5"
,
"nifty5.*"
]),
zip_safe
=
True
,
license
=
"GPLv3"
,
setup_requires
=
[
'future'
,
'scipy'
],
install_requires
=
[
'
future'
,
'scipy'
,
'pyfftw>=0.10.4
'
],
setup_requires
=
[
'scipy'
],
install_requires
=
[
'
scipy
'
],
classifiers
=
[
"Development Status :: 4 - Beta"
,
"Topic :: Utilities"
,
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment