summaryrefslogtreecommitdiff
path: root/graphics/asymptote/fftw++.cc
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/fftw++.cc')
-rw-r--r--graphics/asymptote/fftw++.cc55
1 files changed, 32 insertions, 23 deletions
diff --git a/graphics/asymptote/fftw++.cc b/graphics/asymptote/fftw++.cc
index 18071492e3..69a54934bb 100644
--- a/graphics/asymptote/fftw++.cc
+++ b/graphics/asymptote/fftw++.cc
@@ -1,18 +1,21 @@
#include <cstring>
#include <sstream>
+
#include "fftw++.h"
using namespace std;
+using namespace utils;
namespace fftwpp {
const double fftw::twopi=2.0*acos(-1.0);
+bool fftw::wiser=false;
// 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
+size_t fftw::effort=FFTW_MEASURE;
+string wisdomName="wisdom3.txt";
+ostringstream wisdomTemp;
+size_t fftw::maxthreads=1;
fftw_plan (*fftw::planner)(fftw *f, Complex *in, Complex *out)=Planner;
@@ -20,20 +23,17 @@ 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;
-crfft1d::Table crfft1d::threadtable;
-mrcfft1d::Table mrcfft1d::threadtable;
-mcrfft1d::Table mcrfft1d::threadtable;
-fft2d::Table fft2d::threadtable;
+Mfft1d::Table Mfft1d::threadtable;
+Mrcfft1d::Table Mrcfft1d::threadtable;
+Mcrfft1d::Table Mcrfft1d::threadtable;
-void LoadWisdom()
+void loadWisdom()
{
static bool Wise=false;
if(!Wise) {
+ wisdomTemp << wisdomName << "_" << getpid();
ifstream ifWisdom;
- ifWisdom.open(fftw::WisdomName);
+ ifWisdom.open(wisdomName);
ostringstream wisdom;
wisdom << ifWisdom.rdbuf();
ifWisdom.close();
@@ -43,25 +43,34 @@ void LoadWisdom()
}
}
-void SaveWisdom()
+void saveWisdom()
{
- ofstream ofWisdom;
- ofWisdom.open(fftw::WisdomName);
- char *wisdom=fftw_export_wisdom_to_string();
- ofWisdom << wisdom;
- fftw_free(wisdom);
- ofWisdom.close();
+ if(fftw::wiser) {
+ char *wisdom=fftw_export_wisdom_to_string();
+ ofstream ofWisdom;
+ ofWisdom.open(wisdomTemp.str().c_str());
+ ofWisdom << wisdom;
+ fftw_free(wisdom);
+ ofWisdom.close();
+ rename(wisdomTemp.str().c_str(),wisdomName.c_str());
+ fftw::wiser=false;
+ }
}
fftw_plan Planner(fftw *F, Complex *in, Complex *out)
{
- LoadWisdom();
+ 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();
+ static bool first=true;
+ if(first) {
+ atexit(saveWisdom);
+ first=false;
+ }
+ fftw::wiser=true;
}
return plan;
}
@@ -71,5 +80,5 @@ ThreadBase::ThreadBase() {threads=fftw::maxthreads;}
}
namespace utils {
-unsigned int defaultmpithreads=1;
+size_t defaultmpithreads=1;
}