summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/fftw++.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/fftw++.cc')
-rw-r--r--Build/source/utils/asymptote/fftw++.cc74
1 files changed, 54 insertions, 20 deletions
diff --git a/Build/source/utils/asymptote/fftw++.cc b/Build/source/utils/asymptote/fftw++.cc
index bd3a8c26438..25db1ce3d0f 100644
--- a/Build/source/utils/asymptote/fftw++.cc
+++ b/Build/source/utils/asymptote/fftw++.cc
@@ -1,9 +1,25 @@
+#include <cstring>
+#include <sstream>
#include "fftw++.h"
+using namespace std;
+
namespace fftwpp {
const double fftw::twopi=2.0*acos(-1.0);
+// User settings:
+unsigned int fftw::effort=FFTW_MEASURE;
+const char *fftw::WisdomName=".wisdom";
+unsigned int fftw::maxthreads=1;
+double fftw::testseconds=0.2; // Time limit for threading efficiency tests
+
+fftw_plan (*fftw::planner)(fftw *f, Complex *in, Complex *out)=Planner;
+
+const char *fftw::oddshift="Shift is not implemented for odd nx";
+const char *inout=
+ "constructor and call must be both in place or both out of place";
+
fft1d::Table fft1d::threadtable;
mfft1d::Table mfft1d::threadtable;
rcfft1d::Table rcfft1d::threadtable;
@@ -12,29 +28,47 @@ mrcfft1d::Table mrcfft1d::threadtable;
mcrfft1d::Table mcrfft1d::threadtable;
fft2d::Table fft2d::threadtable;
-// User settings:
-unsigned int fftw::effort=FFTW_MEASURE;
-const char *fftw::WisdomName=".wisdom";
-unsigned int fftw::maxthreads=1;
-double fftw::testseconds=1.0; // Time limit for threading efficiency tests
-unsigned int fftw::Wise=0;
-bool fftw::mpi=false;
+void LoadWisdom()
+{
+ static bool Wise=false;
+ if(!Wise) {
+ ifstream ifWisdom;
+ ifWisdom.open(fftw::WisdomName);
+ ostringstream wisdom;
+ wisdom << ifWisdom.rdbuf();
+ ifWisdom.close();
+ fftw_import_wisdom_from_string(wisdom.str().c_str());
+ Wise=true;
+ }
+}
-const char *fftw::oddshift="Shift is not implemented for odd nx";
-const char *inout="constructor and call must be both in place or both out of place";
+void SaveWisdom()
+{
+ ofstream ofWisdom;
+ ofWisdom.open(fftw::WisdomName);
+ char *wisdom=fftw_export_wisdom_to_string();
+ ofWisdom << wisdom;
+ fftw_free(wisdom);
+ ofWisdom.close();
+}
-void fftw::LoadWisdom() {
- std::ifstream ifWisdom;
- ifWisdom.open(WisdomName);
- fftwpp_import_wisdom(GetWisdom,ifWisdom);
- ifWisdom.close();
+fftw_plan Planner(fftw *F, Complex *in, Complex *out)
+{
+ LoadWisdom();
+ fftw::effort |= FFTW_WISDOM_ONLY;
+ fftw_plan plan=F->Plan(in,out);
+ fftw::effort &= !FFTW_WISDOM_ONLY;
+ if(!plan) {
+ plan=F->Plan(in,out);
+ SaveWisdom();
+ }
+ return plan;
}
-void fftw::SaveWisdom() {
- std::ofstream ofWisdom;
- ofWisdom.open(WisdomName);
- fftwpp_export_wisdom(PutWisdom,ofWisdom);
- ofWisdom.close();
+ThreadBase::ThreadBase() {threads=fftw::maxthreads;}
+
}
-
+
+namespace utils {
+ unsigned int defaultmpithreads=1;
}