This repository has been archived by the owner on Aug 9, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmakefile.dist
124 lines (95 loc) · 4.89 KB
/
makefile.dist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# Makefile for Flatiron Institute (FI) NUFFT libraries.
# Barnett Jan-Feb 2017
# Users should copy this file (makefile.dist) to makefile before you edit.
# There are no makefiles in subdirectories.
# ============= system-specific settings ===============================
CC=g++
FC=gfortran
# choose EITHER single threaded...
#CFLAGS=-fPIC -Ofast -funroll-loops -march=native -std=c++11
#CLIBSFFT = -lfftw3 -lm
#FFLAGS=-fPIC -O3 -funroll-loops
#MFLAGS=
# ...OR multi-threaded:
CFLAGS=-fPIC -Ofast -funroll-loops -march=native -std=c++11 -fopenmp
LIBSFFT = -lfftw3_omp -lfftw3 -lm
FFLAGS=-fPIC -O3 -funroll-loops -fopenmp
FLINK=-lgfortran
MFLAGS=-lgomp
# MAC OSX to do...
# MATLAB stuff..
MEX=mex
MEXFLAGS = -largeArrayDims -lgfortran -lm $(MFLAGS)
# Mac users should use something like this:
#MEX = /Applications/MATLAB_R2014a.app/bin/mex
#MEXFLAGS = -largeArrayDims -L/usr/local/gfortran/lib -lgfortran -lm
# ======================================================================
# objects to compile: spreader...
SOBJS = src/cnufftspread.o src/utils.o
# for NUFFT library and its testers...
OBJS1 = $(SOBJS) src/finufft1d.o src/dirft1d.o src/common.o contrib/legendre_rule_fast.o src/twopispread.o
OBJS2 = $(SOBJS) src/finufft2d.o src/dirft2d.o src/common.o contrib/legendre_rule_fast.o src/twopispread.o
OBJS3 = $(SOBJS) src/finufft3d.o src/dirft3d.o src/common.o contrib/legendre_rule_fast.o src/twopispread.o
OBJS = $(SOBJS) src/finufft1d.o src/finufft2d.o src/finufft3d.o src/dirft1d.o src/dirft2d.o src/dirft3d.o src/common.o contrib/legendre_rule_fast.o src/twopispread.o
# for Fortran interface...
FOBJS = fortran/finufft_f.o fortran/dirft1d.o fortran/dirft2d.o fortran/dirft3d.o fortran/prini.o
HEADERS = src/cnufftspread.h src/finufft.h src/twopispread.h src/dirft.h src/common.h src/utils.h
default: testnd
.PHONY: nufft spreadtestnd testnd fortran
# implicit rules for libs (note -o ensures writes to correct dir)
.cpp.o:
$(CC) -c $(CFLAGS) $< -o $@
.c.o:
$(CC) -c $(CFLAGS) $< -o $@
.f.o:
$(FC) -c $(FFLAGS) $< -o $@
# the main libs...
nufft: $(OBJS)
# test drivers and scripts...
examples/spreadtestnd: examples/spreadtestnd.cpp $(SOBJS) $(HEADERS)
$(CC) $(CFLAGS) examples/spreadtestnd.cpp $(SOBJS) -o examples/spreadtestnd
examples/finufft1d_test: examples/finufft1d_test.cpp $(OBJS1) $(HEADERS)
$(CC) $(CFLAGS) examples/finufft1d_test.cpp $(OBJS1) $(LIBSFFT) -o examples/finufft1d_test
examples/finufft2d_test: examples/finufft2d_test.cpp $(OBJS2) $(HEADERS)
$(CC) $(CFLAGS) examples/finufft2d_test.cpp $(OBJS2) $(LIBSFFT) -o examples/finufft2d_test
examples/finufft3d_test: examples/finufft3d_test.cpp $(OBJS3) $(HEADERS)
$(CC) $(CFLAGS) examples/finufft3d_test.cpp $(OBJS3) $(LIBSFFT) -o examples/finufft3d_test
spreadtestnd: examples/spreadtestnd
# here the tee cmd copies output to screen. 2>&1 grabs both stdout and stderr...
(cd examples; ./spreadtestnd.sh 2>&1 | tee results/spreadtestnd_results.txt)
test1d: examples/finufft1d_test
examples/finufft1d_test 1e4 1e3 1e-6 1 # small prob for accuracy
test2d: examples/finufft2d_test
examples/finufft2d_test 200 50 1e3 1e-6 1 # small
test3d: examples/finufft3d_test
examples/finufft3d_test 20 100 50 1e2 1e-6 1 # small
testnd: examples/finufft1d_test examples/finufft2d_test examples/finufft3d_test
(cd examples; ./nuffttestnd.sh 2>&1 | tee results/nuffttestnd_results.txt)
fortran: $(FOBJS) $(OBJS) $(HEADERS)
# note that linking opts seem to need to go at the end of the compile cmd:
$(CC) $(FFLAGS) fortran/nufft1d_demof90.f $(FOBJS) $(OBJS) $(LIBSFFT) -o fortran/nufft1d_demof90 $(FLINK)
$(CC) $(FFLAGS) fortran/nufft2d_demof90.f $(FOBJS) $(OBJS) $(LIBSFFT) -o fortran/nufft2d_demof90 $(FLINK)
$(CC) $(FFLAGS) fortran/nufft3d_demof90.f $(FOBJS) $(OBJS) $(LIBSFFT) -o fortran/nufft3d_demof90 $(FLINK)
time fortran/nufft1d_demof90
time fortran/nufft2d_demof90
time fortran/nufft3d_demof90
# todo: make mex interfaces...
#mex: src/cnufftspread.h src/_mcwrap/mcwrap_cnufftspread_dir1.cpp $(SPREADOBJS)
# make new interface in matlab: from src/, do mcwrap('cnufftspread.h')
# which fails for omp.
# mv src/cnufftspread_type1.mexa64 matlab/
# (cd src; $(MEX) _mcwrap/mcwrap_cnufftspread_type1.cpp cnufftspread.o ../contrib/besseli.o -output cnufftspread_type1 $(MEXFLAGS))
# todo: python wrapper...
# various obscure testers (experts only)...
examples/testutils: examples/testutils.cpp src/utils.o src/utils.h
$(CC) $(CFLAGS) examples/testutils.cpp src/utils.o -o examples/testutils
(cd examples; ./testutils)
devel/plotkernels: $(SOBJS) $(HEADERS) devel/plotkernels.cpp
$(CC) $(CFLAGS) devel/plotkernels.cpp -o devel/plotkernels $(SOBJS)
(cd devel; ./plotkernels > plotkernels.dat)
contrib/testi0: contrib/testi0.cpp contrib/besseli.o src/utils.o
$(CC) $(CFLAGS) contrib/testi0.cpp $(OBJS) -o contrib/testi0
(cd contrib; ./testi0)
clean:
rm -f $(OBJS1) $(OBJS2) $(OBJS3) $(FOBJS) $(SOBJS)
rm -f exmaples/spreadtestnd examples/finufft?d_test fortran/nufft?d_demof90