diff options
Diffstat (limited to 'Build/source/utils/asymptote/fftw++.cc')
-rw-r--r-- | Build/source/utils/asymptote/fftw++.cc | 74 |
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; } |